Skip to content

Commit 2bd0422

Browse files
committed
pinger uses only SO_TIMESTAMPING to calculate RTT
1 parent 21d3efc commit 2bd0422

File tree

1 file changed

+16
-22
lines changed

1 file changed

+16
-22
lines changed

pinger/pinger.go

+16-22
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/vishvananda/netns"
1010
"golang.org/x/net/icmp"
1111
"golang.org/x/net/ipv4"
12+
"golang.org/x/sys/unix"
1213
"inet.af/netaddr"
1314
"k8s.io/klog/v2"
1415
"net"
@@ -19,11 +20,8 @@ import (
1920
)
2021

2122
const (
22-
pingReplyPollTimeout = 10 * time.Millisecond
23-
protocolICMP = 1 // Internet Control Message
24-
SOF_TIMESTAMPING_TX_SOFTWARE = 1 << 1
25-
SOF_TIMESTAMPING_TX_SCHED = 1 << 8
26-
SOF_TIMESTAMPING_RX_SOFTWARE = 1 << 3
23+
pingReplyPollTimeout = 10 * time.Millisecond
24+
protocolICMP = 1 // Internet Control Message
2725
)
2826

2927
var (
@@ -72,7 +70,7 @@ func Ping(ns netns.NsHandle, originNs netns.NsHandle, targets []netaddr.IP, time
7270
if strings.HasPrefix(err.Error(), "resource temporarily unavailable") {
7371
continue
7472
}
75-
return nil, fmt.Errorf("failed to get RX timestamp: %s", err)
73+
return nil, fmt.Errorf("failed to get TX timestamp: %s", err)
7674
}
7775
ids[ip] = pkt
7876
}
@@ -134,21 +132,20 @@ func send(conn *net.IPConn, seq int, ip net.Addr) error {
134132
}
135133

136134
func getTimestampFromOutOfBandData(oob []byte, oobn int) (time.Time, error) {
137-
var t time.Time
138135
cms, err := syscall.ParseSocketControlMessage(oob[:oobn])
139136
if err != nil {
140-
return t, err
137+
return time.Time{}, err
141138
}
142139
for _, cm := range cms {
143-
if cm.Header.Level == syscall.SOL_SOCKET && cm.Header.Type == syscall.SO_TIMESTAMP {
144-
var tv syscall.Timeval
145-
if err := binary.Read(bytes.NewBuffer(cm.Data), binary.LittleEndian, &tv); err != nil {
146-
return t, err
140+
if cm.Header.Level == syscall.SOL_SOCKET || cm.Header.Type == syscall.SO_TIMESTAMPING {
141+
var t unix.ScmTimestamping
142+
if err := binary.Read(bytes.NewBuffer(cm.Data), binary.LittleEndian, &t); err != nil {
143+
return time.Time{}, err
147144
}
148-
return time.Unix(tv.Unix()), nil
145+
return time.Unix(t.Ts[0].Unix()), nil
149146
}
150147
}
151-
return t, errors.New("no timestamp found")
148+
return time.Time{}, fmt.Errorf("no timestamp found")
152149
}
153150

154151
func getTxTimestamp(socketFd int) (time.Time, error) {
@@ -222,19 +219,16 @@ func openConn() (*net.IPConn, error) {
222219
}
223220
defer f.Close()
224221
fd := int(f.Fd())
225-
226-
flags := SOF_TIMESTAMPING_TX_SOFTWARE | SOF_TIMESTAMPING_TX_SCHED | SOF_TIMESTAMPING_RX_SOFTWARE
227-
if err := syscall.SetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_TIMESTAMPING, flags); err != nil {
228-
return nil, err
229-
}
230-
if err := syscall.SetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_TIMESTAMP, 1); err != nil {
222+
flags := unix.SOF_TIMESTAMPING_SOFTWARE | unix.SOF_TIMESTAMPING_RX_SOFTWARE | unix.SOF_TIMESTAMPING_TX_SCHED |
223+
unix.SOF_TIMESTAMPING_OPT_CMSG | unix.SOF_TIMESTAMPING_OPT_TSONLY
224+
if err := syscall.SetsockoptInt(fd, unix.SOL_SOCKET, unix.SO_TIMESTAMPING, flags); err != nil {
231225
return nil, err
232226
}
233227
timeout := syscall.Timeval{Sec: 0, Usec: 1000}
234-
if err := syscall.SetsockoptTimeval(fd, syscall.SOL_SOCKET, syscall.SO_RCVTIMEO, &timeout); err != nil {
228+
if err := syscall.SetsockoptTimeval(fd, unix.SOL_SOCKET, unix.SO_RCVTIMEO, &timeout); err != nil {
235229
return nil, err
236230
}
237-
if err := syscall.SetsockoptTimeval(fd, syscall.SOL_SOCKET, syscall.SO_SNDTIMEO, &timeout); err != nil {
231+
if err := syscall.SetsockoptTimeval(fd, unix.SOL_SOCKET, unix.SO_SNDTIMEO, &timeout); err != nil {
238232
return nil, err
239233
}
240234
return ipconn, nil

0 commit comments

Comments
 (0)