github.com/database64128/shadowsocks-go@v1.7.0/direct/udp.go (about) 1 package direct 2 3 import ( 4 "net/netip" 5 6 "github.com/database64128/shadowsocks-go/conn" 7 "github.com/database64128/shadowsocks-go/zerocopy" 8 "github.com/database64128/tfo-go/v2" 9 ) 10 11 func NewUDPClient(name string, mtu int, listenConfig tfo.ListenConfig) *zerocopy.SimpleUDPClient { 12 p := NewDirectPacketClientPackUnpacker(mtu) 13 maxPacketSize := zerocopy.MaxPacketSizeForAddr(mtu, netip.IPv4Unspecified()) 14 return zerocopy.NewSimpleUDPClient(name, maxPacketSize, listenConfig, p, p) 15 } 16 17 func NewShadowsocksNoneUDPClient(addrPort netip.AddrPort, name string, mtu int, listenConfig tfo.ListenConfig) *zerocopy.SimpleUDPClient { 18 maxPacketSize := zerocopy.MaxPacketSizeForAddr(mtu, addrPort.Addr()) 19 packer := NewShadowsocksNonePacketClientPacker(addrPort, maxPacketSize) 20 unpacker := NewShadowsocksNonePacketClientUnpacker(addrPort) 21 return zerocopy.NewSimpleUDPClient(name, maxPacketSize, listenConfig, packer, unpacker) 22 } 23 24 // NewSocks5UDPClient creates a SOCKS5 UDP client. 25 // 26 // Technically, each UDP session should be preceded by a UDP ASSOCIATE request. 27 // But most censorship circumvention programs do not require this. 28 // So we just skip this little ritual. 29 func NewSocks5UDPClient(addrPort netip.AddrPort, name string, mtu int, listenConfig tfo.ListenConfig) *zerocopy.SimpleUDPClient { 30 maxPacketSize := zerocopy.MaxPacketSizeForAddr(mtu, addrPort.Addr()) 31 packer := NewSocks5PacketClientPacker(addrPort, maxPacketSize) 32 unpacker := NewSocks5PacketClientUnpacker(addrPort) 33 return zerocopy.NewSimpleUDPClient(name, maxPacketSize, listenConfig, packer, unpacker) 34 } 35 36 // DirectUDPNATServer implements the zerocopy UDPNATServer interface. 37 type DirectUDPNATServer struct { 38 p *DirectPacketServerPackUnpacker 39 } 40 41 func NewDirectUDPNATServer(targetAddr conn.Addr, targetAddrOnly bool) *DirectUDPNATServer { 42 return &DirectUDPNATServer{ 43 p: NewDirectPacketServerPackUnpacker(targetAddr, targetAddrOnly), 44 } 45 } 46 47 // Info implements the zerocopy.UDPNATServer Info method. 48 func (s *DirectUDPNATServer) Info() zerocopy.UDPNATServerInfo { 49 return zerocopy.UDPNATServerInfo{} 50 } 51 52 // NewSession implements the zerocopy.UDPNATServer NewSession method. 53 func (s *DirectUDPNATServer) NewSession() (zerocopy.ServerPacker, zerocopy.ServerUnpacker, error) { 54 return s.p, s.p, nil 55 } 56 57 // ShadowsocksNoneUDPNATServer implements the zerocopy UDPNATServer interface. 58 type ShadowsocksNoneUDPNATServer struct{} 59 60 // Info implements the zerocopy.UDPNATServer Info method. 61 func (ShadowsocksNoneUDPNATServer) Info() zerocopy.UDPNATServerInfo { 62 return zerocopy.UDPNATServerInfo{ 63 UnpackerHeadroom: ShadowsocksNonePacketClientMessageHeadroom, 64 } 65 } 66 67 // NewSession implements the zerocopy.UDPNATServer NewSession method. 68 func (ShadowsocksNoneUDPNATServer) NewSession() (zerocopy.ServerPacker, zerocopy.ServerUnpacker, error) { 69 return ShadowsocksNonePacketServerPacker{}, &ShadowsocksNonePacketServerUnpacker{}, nil 70 } 71 72 // Socks5UDPNATServer implements the zerocopy UDPNATServer interface. 73 type Socks5UDPNATServer struct{} 74 75 // Info implements the zerocopy.UDPNATServer Info method. 76 func (Socks5UDPNATServer) Info() zerocopy.UDPNATServerInfo { 77 return zerocopy.UDPNATServerInfo{ 78 UnpackerHeadroom: Socks5PacketClientMessageHeadroom, 79 } 80 } 81 82 // NewSession implements the zerocopy.UDPNATServer NewSession method. 83 func (Socks5UDPNATServer) NewSession() (zerocopy.ServerPacker, zerocopy.ServerUnpacker, error) { 84 return Socks5PacketServerPacker{}, &Socks5PacketServerUnpacker{}, nil 85 }