diff --git a/cmd/derper/depaware.txt b/cmd/derper/depaware.txt index 6b1aba2c7..5ee7a81ca 100644 --- a/cmd/derper/depaware.txt +++ b/cmd/derper/depaware.txt @@ -118,6 +118,7 @@ tailscale.com/cmd/derper dependencies: (generated by github.com/tailscale/depawa tailscale.com/net/packet from tailscale.com/wgengine/filter tailscale.com/net/sockstats from tailscale.com/derp/derphttp tailscale.com/net/stun from tailscale.com/cmd/derper + L tailscale.com/net/tcpinfo from tailscale.com/derp tailscale.com/net/tlsdial from tailscale.com/derp/derphttp tailscale.com/net/tsaddr from tailscale.com/ipn+ 💣 tailscale.com/net/tshttpproxy from tailscale.com/derp/derphttp+ diff --git a/cmd/tailscale/depaware.txt b/cmd/tailscale/depaware.txt index 720e129a6..9a443042c 100644 --- a/cmd/tailscale/depaware.txt +++ b/cmd/tailscale/depaware.txt @@ -109,6 +109,7 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep tailscale.com/net/portmapper from tailscale.com/net/netcheck+ tailscale.com/net/sockstats from tailscale.com/control/controlhttp+ tailscale.com/net/stun from tailscale.com/net/netcheck + L tailscale.com/net/tcpinfo from tailscale.com/derp tailscale.com/net/tlsdial from tailscale.com/derp/derphttp+ tailscale.com/net/tsaddr from tailscale.com/net/interfaces+ 💣 tailscale.com/net/tshttpproxy from tailscale.com/derp/derphttp+ diff --git a/cmd/tailscaled/depaware.txt b/cmd/tailscaled/depaware.txt index 8219faa21..f16a8c555 100644 --- a/cmd/tailscaled/depaware.txt +++ b/cmd/tailscaled/depaware.txt @@ -276,6 +276,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de tailscale.com/net/socks5 from tailscale.com/cmd/tailscaled tailscale.com/net/sockstats from tailscale.com/control/controlclient+ tailscale.com/net/stun from tailscale.com/net/netcheck+ + L tailscale.com/net/tcpinfo from tailscale.com/derp tailscale.com/net/tlsdial from tailscale.com/control/controlclient+ tailscale.com/net/tsaddr from tailscale.com/ipn+ tailscale.com/net/tsdial from tailscale.com/control/controlclient+ diff --git a/derp/derp_server_linux.go b/derp/derp_server_linux.go index 1029226a6..03bb204ca 100644 --- a/derp/derp_server_linux.go +++ b/derp/derp_server_linux.go @@ -9,19 +9,18 @@ import ( "net" "time" - "golang.org/x/sys/unix" + "tailscale.com/net/tcpinfo" ) func (c *sclient) statsLoop(ctx context.Context) error { - // If we can't get a TCP socket, then we can't send stats. - tcpConn := c.tcpConn() - if tcpConn == nil { + // Get the RTT initially to verify it's supported. + conn := c.tcpConn() + if conn == nil { c.s.tcpRtt.Add("non-tcp", 1) return nil } - rawConn, err := tcpConn.SyscallConn() - if err != nil { - c.logf("error getting SyscallConn: %v", err) + if _, err := tcpinfo.RTT(conn); err != nil { + c.logf("error fetching initial RTT: %v", err) c.s.tcpRtt.Add("error", 1) return nil } @@ -31,23 +30,16 @@ func (c *sclient) statsLoop(ctx context.Context) error { ticker := time.NewTicker(statsInterval) defer ticker.Stop() - var ( - tcpInfo *unix.TCPInfo - sysErr error - ) statsLoop: for { select { case <-ticker.C: - err = rawConn.Control(func(fd uintptr) { - tcpInfo, sysErr = unix.GetsockoptTCPInfo(int(fd), unix.IPPROTO_TCP, unix.TCP_INFO) - }) - if err != nil || sysErr != nil { + rtt, err := tcpinfo.RTT(conn) + if err != nil { continue statsLoop } // TODO(andrew): more metrics? - rtt := time.Duration(tcpInfo.Rtt) * time.Microsecond c.s.tcpRtt.Add(durationToLabel(rtt), 1) case <-ctx.Done():