udpassembler.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package packetconn
  2. import (
  3. "golang.org/x/net/context"
  4. "github.com/v2fly/v2ray-core/v5/common"
  5. "github.com/v2fly/v2ray-core/v5/common/environment"
  6. "github.com/v2fly/v2ray-core/v5/common/net"
  7. "github.com/v2fly/v2ray-core/v5/common/serial"
  8. "github.com/v2fly/v2ray-core/v5/transport/internet"
  9. )
  10. type wrappedTransportEnvironment struct {
  11. environment.TransportEnvironment
  12. client *requestToPacketConnClient
  13. server *requestToPacketConnServer
  14. }
  15. func (w *wrappedTransportEnvironment) Listen(ctx context.Context, addr net.Addr, sockopt *internet.SocketConfig) (net.Listener, error) {
  16. return nil, newError("not implemented")
  17. }
  18. func (w *wrappedTransportEnvironment) ListenPacket(ctx context.Context, addr net.Addr, sockopt *internet.SocketConfig) (net.PacketConn, error) {
  19. packetConn := newWrappedPacketConn(ctx)
  20. w.server.onSessionReceiverReady(packetConn)
  21. return packetConn, nil
  22. }
  23. func (w *wrappedTransportEnvironment) Dial(ctx context.Context, source net.Address, destination net.Destination, sockopt *internet.SocketConfig) (net.Conn, error) {
  24. session, err := w.client.Dial()
  25. if err != nil {
  26. return nil, err
  27. }
  28. return newWrappedConn(session), nil
  29. }
  30. func (w *wrappedTransportEnvironment) Dialer() internet.SystemDialer {
  31. return w
  32. }
  33. func (w *wrappedTransportEnvironment) Listener() internet.SystemListener {
  34. return w
  35. }
  36. func newUDPAssemblerServerFromConfig(ctx context.Context, config *ServerConfig) (*udpAssemblerServer, error) {
  37. instance, err := serial.GetInstanceOf(config.UnderlyingTransportSetting)
  38. if err != nil {
  39. return nil, newError("failed to get instance of underlying transport").Base(err).AtError()
  40. }
  41. memcfg := &internet.MemoryStreamConfig{ProtocolName: config.UnderlyingTransportName, ProtocolSettings: instance}
  42. return newUDPAssemblerServer(ctx, config, memcfg), nil
  43. }
  44. func newUDPAssemblerClientFromConfig(ctx context.Context, config *ClientConfig) (*udpAssemblerClient, error) {
  45. instance, err := serial.GetInstanceOf(config.UnderlyingTransportSetting)
  46. if err != nil {
  47. return nil, newError("failed to get instance of underlying transport").Base(err).AtError()
  48. }
  49. memcfg := &internet.MemoryStreamConfig{ProtocolName: config.UnderlyingTransportName, ProtocolSettings: instance}
  50. return newUDPAssemblerClient(ctx, config, memcfg), nil
  51. }
  52. func init() {
  53. common.Must(common.RegisterConfig((*ServerConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
  54. serverConfig, ok := config.(*ServerConfig)
  55. if !ok {
  56. return nil, newError("not a ServerConfig")
  57. }
  58. return newUDPAssemblerServerFromConfig(ctx, serverConfig)
  59. }))
  60. common.Must(common.RegisterConfig((*ClientConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
  61. clientConfig, ok := config.(*ClientConfig)
  62. if !ok {
  63. return nil, newError("not a ClientConfig")
  64. }
  65. return newUDPAssemblerClientFromConfig(ctx, clientConfig)
  66. }))
  67. }