mirror of
https://github.com/v2fly/v2ray-core.git
synced 2024-10-19 18:23:38 -04:00
79 lines
2.8 KiB
Go
79 lines
2.8 KiB
Go
|
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)
|
||
|
}))
|
||
|
}
|