github.com/sagernet/sing@v0.2.6/protocol/socks/packet_vectorised.go (about) 1 package socks 2 3 import ( 4 "net" 5 6 "github.com/sagernet/sing/common" 7 "github.com/sagernet/sing/common/buf" 8 "github.com/sagernet/sing/common/bufio" 9 M "github.com/sagernet/sing/common/metadata" 10 N "github.com/sagernet/sing/common/network" 11 ) 12 13 var _ N.VectorisedPacketWriter = (*VectorisedAssociatePacketConn)(nil) 14 15 type VectorisedAssociatePacketConn struct { 16 AssociatePacketConn 17 N.VectorisedPacketWriter 18 } 19 20 func NewVectorisedAssociatePacketConn(conn net.PacketConn, writer N.VectorisedPacketWriter, remoteAddr M.Socksaddr, underlying net.Conn) *VectorisedAssociatePacketConn { 21 return &VectorisedAssociatePacketConn{ 22 AssociatePacketConn{ 23 NetPacketConn: bufio.NewPacketConn(conn), 24 remoteAddr: remoteAddr, 25 underlying: underlying, 26 }, 27 writer, 28 } 29 } 30 31 func NewVectorisedAssociateConn(conn net.Conn, writer N.VectorisedWriter, remoteAddr M.Socksaddr, underlying net.Conn) *VectorisedAssociatePacketConn { 32 return &VectorisedAssociatePacketConn{ 33 AssociatePacketConn{ 34 NetPacketConn: bufio.NewUnbindPacketConn(conn), 35 remoteAddr: remoteAddr, 36 underlying: underlying, 37 }, 38 &bufio.UnbindVectorisedPacketWriter{VectorisedWriter: writer}, 39 } 40 } 41 42 func (v *VectorisedAssociatePacketConn) WriteVectorisedPacket(buffers []*buf.Buffer, destination M.Socksaddr) error { 43 _header := buf.StackNewSize(3 + M.SocksaddrSerializer.AddrPortLen(destination)) 44 defer common.KeepAlive(_header) 45 header := common.Dup(_header) 46 defer header.Release() 47 common.Must(header.WriteZeroN(3)) 48 common.Must(M.SocksaddrSerializer.WriteAddrPort(header, destination)) 49 return v.VectorisedPacketWriter.WriteVectorisedPacket(append([]*buf.Buffer{header}, buffers...), destination) 50 } 51 52 func (c *VectorisedAssociatePacketConn) FrontHeadroom() int { 53 return 0 54 }