net/netcheck: add a Now field to the netcheck Report

This allows us to print the time that a netcheck was run, which is
useful in debugging.

Updates #10972

Signed-off-by: Andrew Dunham <andrew@du.nham.ca>
Change-Id: Id48d30d4eb6d5208efb2b1526a71d83fe7f9320b
andrew/wgengine-router-debug
Andrew Dunham 1 month ago
parent ae5bc88ebe
commit b2665d9b89

@ -136,6 +136,7 @@ func printReport(dm *tailcfg.DERPMap, report *netcheck.Report) error {
} }
printf("\nReport:\n") printf("\nReport:\n")
printf("\t* Time: %v\n", report.Now.Format(time.RFC3339Nano))
printf("\t* UDP: %v\n", report.UDP) printf("\t* UDP: %v\n", report.UDP)
if report.GlobalV4.IsValid() { if report.GlobalV4.IsValid() {
printf("\t* IPv4: yes, %s\n", report.GlobalV4) printf("\t* IPv4: yes, %s\n", report.GlobalV4)

@ -85,13 +85,14 @@ const (
// Report contains the result of a single netcheck. // Report contains the result of a single netcheck.
type Report struct { type Report struct {
UDP bool // a UDP STUN round trip completed Now time.Time // the time the report was run
IPv6 bool // an IPv6 STUN round trip completed UDP bool // a UDP STUN round trip completed
IPv4 bool // an IPv4 STUN round trip completed IPv6 bool // an IPv6 STUN round trip completed
IPv6CanSend bool // an IPv6 packet was able to be sent IPv4 bool // an IPv4 STUN round trip completed
IPv4CanSend bool // an IPv4 packet was able to be sent IPv6CanSend bool // an IPv6 packet was able to be sent
OSHasIPv6 bool // could bind a socket to ::1 IPv4CanSend bool // an IPv4 packet was able to be sent
ICMPv4 bool // an ICMPv4 round trip completed OSHasIPv6 bool // could bind a socket to ::1
ICMPv4 bool // an ICMPv4 round trip completed
// MappingVariesByDestIP is whether STUN results depend which // MappingVariesByDestIP is whether STUN results depend which
// STUN server you're talking to (on IPv4). // STUN server you're talking to (on IPv4).
@ -1297,6 +1298,7 @@ func (c *Client) addReportHistoryAndSetPreferredDERP(rs *reportState, r *Report,
c.prev = map[time.Time]*Report{} c.prev = map[time.Time]*Report{}
} }
now := c.timeNow() now := c.timeNow()
r.Now = now.UTC()
c.prev[now] = r c.prev[now] = r
c.last = r c.last = r

@ -28,6 +28,9 @@ func newTestClient(t testing.TB) *Client {
c := &Client{ c := &Client{
NetMon: netmon.NewStatic(), NetMon: netmon.NewStatic(),
Logf: t.Logf, Logf: t.Logf,
TimeNow: func() time.Time {
return time.Unix(1729624521, 0)
},
} }
return c return c
} }
@ -52,6 +55,9 @@ func TestBasic(t *testing.T) {
if !r.UDP { if !r.UDP {
t.Error("want UDP") t.Error("want UDP")
} }
if r.Now.IsZero() {
t.Error("Now is zero")
}
if len(r.RegionLatency) != 1 { if len(r.RegionLatency) != 1 {
t.Errorf("expected 1 key in DERPLatency; got %+v", r.RegionLatency) t.Errorf("expected 1 key in DERPLatency; got %+v", r.RegionLatency)
} }
@ -130,6 +136,14 @@ func TestWorksWhenUDPBlocked(t *testing.T) {
want := newReport() want := newReport()
// The Now field can't be compared with reflect.DeepEqual; check using
// the Equal method and then overwrite it so that the comparison below
// succeeds.
if !r.Now.Equal(c.TimeNow()) {
t.Errorf("Now = %v; want %v", r.Now, c.TimeNow())
}
want.Now = r.Now
// The IPv4CanSend flag gets set differently across platforms. // The IPv4CanSend flag gets set differently across platforms.
// On Windows this test detects false, while on Linux detects true. // On Windows this test detects false, while on Linux detects true.
// That's not relevant to this test, so just accept what we're // That's not relevant to this test, so just accept what we're

Loading…
Cancel
Save