9
9
"github.com/vishvananda/netns"
10
10
"golang.org/x/net/icmp"
11
11
"golang.org/x/net/ipv4"
12
+ "golang.org/x/sys/unix"
12
13
"inet.af/netaddr"
13
14
"k8s.io/klog/v2"
14
15
"net"
@@ -19,11 +20,8 @@ import (
19
20
)
20
21
21
22
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
27
25
)
28
26
29
27
var (
@@ -72,7 +70,7 @@ func Ping(ns netns.NsHandle, originNs netns.NsHandle, targets []netaddr.IP, time
72
70
if strings .HasPrefix (err .Error (), "resource temporarily unavailable" ) {
73
71
continue
74
72
}
75
- return nil , fmt .Errorf ("failed to get RX timestamp: %s" , err )
73
+ return nil , fmt .Errorf ("failed to get TX timestamp: %s" , err )
76
74
}
77
75
ids [ip ] = pkt
78
76
}
@@ -134,21 +132,20 @@ func send(conn *net.IPConn, seq int, ip net.Addr) error {
134
132
}
135
133
136
134
func getTimestampFromOutOfBandData (oob []byte , oobn int ) (time.Time , error ) {
137
- var t time.Time
138
135
cms , err := syscall .ParseSocketControlMessage (oob [:oobn ])
139
136
if err != nil {
140
- return t , err
137
+ return time. Time {} , err
141
138
}
142
139
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
147
144
}
148
- return time .Unix (tv .Unix ()), nil
145
+ return time .Unix (t . Ts [ 0 ] .Unix ()), nil
149
146
}
150
147
}
151
- return t , errors . New ("no timestamp found" )
148
+ return time. Time {}, fmt . Errorf ("no timestamp found" )
152
149
}
153
150
154
151
func getTxTimestamp (socketFd int ) (time.Time , error ) {
@@ -222,19 +219,16 @@ func openConn() (*net.IPConn, error) {
222
219
}
223
220
defer f .Close ()
224
221
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 {
231
225
return nil , err
232
226
}
233
227
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 {
235
229
return nil , err
236
230
}
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 {
238
232
return nil , err
239
233
}
240
234
return ipconn , nil
0 commit comments