@@ -28,6 +28,7 @@ type Conn struct {
2828 destination netip.Addr
2929 source common.TypedValue [netip.Addr ]
3030 closed atomic.Bool
31+ readMsg func (b , oob []byte ) (n , oobn int , addr netip.Addr , err error )
3132}
3233
3334func Connect (ctx context.Context , privileged bool , controlFunc control.Func , destination netip.Addr ) (* Conn , error ) {
@@ -49,6 +50,32 @@ func (c *Conn) connect(controlFunc control.Func) (err error) {
4950 } else {
5051 c .conn , err = connect (c .privileged , controlFunc , c .destination )
5152 }
53+ if err != nil {
54+ return err
55+ }
56+ if ipConn , isIPConn := common.Cast [* net.IPConn ](c .conn ); isIPConn {
57+ c .readMsg = func (b , oob []byte ) (n , oobn int , addr netip.Addr , err error ) {
58+ var ipAddr * net.IPAddr
59+ n , oobn , _ , ipAddr , err = ipConn .ReadMsgIP (b , oob )
60+ if err == nil {
61+ addr = M .AddrFromNet (ipAddr )
62+ }
63+ return
64+ }
65+ } else if udpConn , isUDPConn := common.Cast [* net.UDPConn ](c .conn ); isUDPConn {
66+ c .readMsg = func (b , oob []byte ) (n , oobn int , addr netip.Addr , err error ) {
67+ var addrPort netip.AddrPort
68+ n , oobn , _ , addrPort , err = udpConn .ReadMsgUDPAddrPort (b , oob )
69+ if err == nil {
70+ addr = addrPort .Addr ()
71+ }
72+ return
73+ }
74+ } else if unprivilegedConn , isUnprivilegedConn := c .conn .(* UnprivilegedConn ); isUnprivilegedConn {
75+ c .readMsg = unprivilegedConn .ReadMsg
76+ } else {
77+ return E .New ("unsupported conn type: " , reflect .TypeOf (c .conn ))
78+ }
5279 return
5380}
5481
@@ -58,39 +85,12 @@ func (c *Conn) isLinuxUnprivileged() bool {
5885
5986func (c * Conn ) ReadIP (buffer * buf.Buffer ) error {
6087 if c .destination .Is6 () || c .isLinuxUnprivileged () {
61- var readMsg func (b , oob []byte ) (n , oobn int , addr netip.Addr , err error )
62- if ipConn , isIPConn := common.Cast [* net.IPConn ](c .conn ); isIPConn {
63- readMsg = func (b , oob []byte ) (n , oobn int , addr netip.Addr , err error ) {
64- var ipAddr * net.IPAddr
65- n , oobn , _ , ipAddr , err = ipConn .ReadMsgIP (b , oob )
66- if err == nil {
67- addr = M .AddrFromNet (ipAddr )
68- }
69- return
70- }
71- } else if udpConn , isUDPConn := common.Cast [* net.UDPConn ](c .conn ); isUDPConn {
72- readMsg = func (b , oob []byte ) (n , oobn int , addr netip.Addr , err error ) {
73- var addrPort netip.AddrPort
74- n , oobn , _ , addrPort , err = udpConn .ReadMsgUDPAddrPort (b , oob )
75- if err == nil {
76- addr = addrPort .Addr ()
77- }
78- return
79- }
80- } else if unprivilegedConn , isUnprivilegedConn := c .conn .(* UnprivilegedConn ); isUnprivilegedConn {
81- readMsg = unprivilegedConn .ReadMsg
82- } else {
83- return E .New ("unsupported conn type: " , reflect .TypeOf (c .conn ))
84- }
8588 if ! c .destination .Is6 () {
8689 oob := ipv4 .NewControlMessage (ipv4 .FlagTTL )
8790 buffer .Advance (header .IPv4MinimumSize )
8891 var ttl int
8992 // tos int
90- n , oobn , addr , err := readMsg (buffer .FreeBytes (), oob )
91- if err != nil {
92- return err
93- }
93+ n , oobn , addr , err := c .readMsg (buffer .FreeBytes (), oob )
9494 if err != nil {
9595 return err
9696 }
@@ -126,7 +126,7 @@ func (c *Conn) ReadIP(buffer *buf.Buffer) error {
126126 hopLimit int
127127 trafficClass int
128128 )
129- n , oobn , addr , err := readMsg (buffer .FreeBytes (), oob )
129+ n , oobn , addr , err := c . readMsg (buffer .FreeBytes (), oob )
130130 if err != nil {
131131 return err
132132 }
0 commit comments