1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-10-19 10:13:37 -04:00
v2fly/transport/internet/request/assembler/packetconn/udpassembler.go

79 lines
2.8 KiB
Go
Raw Normal View History

package packetconn
import (
"golang.org/x/net/context"
"github.com/v2fly/v2ray-core/v5/common"
"github.com/v2fly/v2ray-core/v5/common/environment"
"github.com/v2fly/v2ray-core/v5/common/net"
"github.com/v2fly/v2ray-core/v5/common/serial"
"github.com/v2fly/v2ray-core/v5/transport/internet"
)
type wrappedTransportEnvironment struct {
environment.TransportEnvironment
client *requestToPacketConnClient
server *requestToPacketConnServer
}
func (w *wrappedTransportEnvironment) Listen(ctx context.Context, addr net.Addr, sockopt *internet.SocketConfig) (net.Listener, error) {
return nil, newError("not implemented")
}
func (w *wrappedTransportEnvironment) ListenPacket(ctx context.Context, addr net.Addr, sockopt *internet.SocketConfig) (net.PacketConn, error) {
packetConn := newWrappedPacketConn(ctx)
w.server.onSessionReceiverReady(packetConn)
return packetConn, nil
}
func (w *wrappedTransportEnvironment) Dial(ctx context.Context, source net.Address, destination net.Destination, sockopt *internet.SocketConfig) (net.Conn, error) {
session, err := w.client.Dial()
if err != nil {
return nil, err
}
return newWrappedConn(session), nil
}
func (w *wrappedTransportEnvironment) Dialer() internet.SystemDialer {
return w
}
func (w *wrappedTransportEnvironment) Listener() internet.SystemListener {
return w
}
func newUDPAssemblerServerFromConfig(ctx context.Context, config *ServerConfig) (*udpAssemblerServer, error) {
instance, err := serial.GetInstanceOf(config.UnderlyingTransportSetting)
if err != nil {
return nil, newError("failed to get instance of underlying transport").Base(err).AtError()
}
memcfg := &internet.MemoryStreamConfig{ProtocolName: config.UnderlyingTransportName, ProtocolSettings: instance}
return newUDPAssemblerServer(ctx, config, memcfg), nil
}
func newUDPAssemblerClientFromConfig(ctx context.Context, config *ClientConfig) (*udpAssemblerClient, error) {
instance, err := serial.GetInstanceOf(config.UnderlyingTransportSetting)
if err != nil {
return nil, newError("failed to get instance of underlying transport").Base(err).AtError()
}
memcfg := &internet.MemoryStreamConfig{ProtocolName: config.UnderlyingTransportName, ProtocolSettings: instance}
return newUDPAssemblerClient(ctx, config, memcfg), nil
}
func init() {
common.Must(common.RegisterConfig((*ServerConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
serverConfig, ok := config.(*ServerConfig)
if !ok {
return nil, newError("not a ServerConfig")
}
return newUDPAssemblerServerFromConfig(ctx, serverConfig)
}))
common.Must(common.RegisterConfig((*ClientConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
clientConfig, ok := config.(*ClientConfig)
if !ok {
return nil, newError("not a ClientConfig")
}
return newUDPAssemblerClientFromConfig(ctx, clientConfig)
}))
}