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  }