github.com/inazumav/sing-box@v0.0.0-20230926072359-ab51429a14f1/transport/fakeip/packet_wait.go (about)

     1  package fakeip
     2  
     3  import (
     4  	"github.com/sagernet/sing/common/buf"
     5  	"github.com/sagernet/sing/common/bufio"
     6  	M "github.com/sagernet/sing/common/metadata"
     7  	N "github.com/sagernet/sing/common/network"
     8  )
     9  
    10  func (c *NATPacketConn) CreatePacketReadWaiter() (N.PacketReadWaiter, bool) {
    11  	waiter, created := bufio.CreatePacketReadWaiter(c.PacketConn)
    12  	if !created {
    13  		return nil, false
    14  	}
    15  	return &waitNATPacketConn{c, waiter}, true
    16  }
    17  
    18  type waitNATPacketConn struct {
    19  	*NATPacketConn
    20  	waiter N.PacketReadWaiter
    21  }
    22  
    23  func (c *waitNATPacketConn) InitializeReadWaiter(newBuffer func() *buf.Buffer) {
    24  	c.waiter.InitializeReadWaiter(newBuffer)
    25  }
    26  
    27  func (c *waitNATPacketConn) WaitReadPacket() (destination M.Socksaddr, err error) {
    28  	destination, err = c.waiter.WaitReadPacket()
    29  	if socksaddrWithoutPort(destination) == c.origin {
    30  		destination = M.Socksaddr{
    31  			Addr: c.destination.Addr,
    32  			Fqdn: c.destination.Fqdn,
    33  			Port: destination.Port,
    34  		}
    35  	}
    36  	return
    37  }