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 }