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  }