Skip to content

Commit f9bbb15

Browse files
committed
ping: Reduce the cost of readMsg
1 parent 4c43f4a commit f9bbb15

File tree

1 file changed

+29
-29
lines changed

1 file changed

+29
-29
lines changed

ping/ping.go

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3334
func 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

5986
func (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

Comments
 (0)