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
2122const (
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
2927var (
@@ -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
136134func 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
154151func 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