diff --git a/net/netcheck/netcheck.go b/net/netcheck/netcheck.go index 32b73512b..408d92780 100644 --- a/net/netcheck/netcheck.go +++ b/net/netcheck/netcheck.go @@ -340,6 +340,18 @@ func (c *Client) ReceiveSTUNPacket(pkt []byte, src netip.AddrPort) { probeHTTPS // HTTPS ) +func (p probeProto) String() string { + switch p { + case probeIPv4: + return "v4" + case probeIPv6: + return "v4" + case probeHTTPS: + return "https" + } + return "?" +} + type probe struct { // delay is when the probe is started, relative to the time // that GetReport is called. One probe in each probePlan @@ -1229,7 +1241,7 @@ func (c *Client) measureICMPLatency(ctx context.Context, reg *tailcfg.DERPRegion // TODO(andrew-d): this is a bit ugly nodeAddr := c.nodeAddr(ctx, node, probeIPv4) if !nodeAddr.IsValid() { - return 0, false, fmt.Errorf("no address for node %v", node.Name) + return 0, false, fmt.Errorf("no address for node %v (v4-for-icmp)", node.Name) } addr := &net.IPAddr{ IP: net.IP(nodeAddr.Addr().AsSlice()), @@ -1481,7 +1493,7 @@ func (rs *reportState) runProbe(ctx context.Context, dm *tailcfg.DERPMap, probe addr := c.nodeAddr(ctx, node, probe.proto) if !addr.IsValid() { - c.logf("netcheck.runProbe: named node %q has no address", probe.node) + c.logf("netcheck.runProbe: named node %q has no %v address", probe.node, probe.proto) return } @@ -1607,12 +1619,15 @@ func (c *Client) nodeAddr(ctx context.Context, n *tailcfg.DERPNode, proto probeP c.mu.Unlock() probeIsV4 := proto == probeIPv4 - addrs, _ := lookupIPAddr(ctx, n.HostName) + addrs, err := lookupIPAddr(ctx, n.HostName) for _, a := range addrs { if (a.Is4() && probeIsV4) || (a.Is6() && !probeIsV4) { return netip.AddrPortFrom(a, uint16(port)) } } + if err != nil { + c.logf("netcheck: DNS lookup error for %q (node %q region %v): %v", n.HostName, n.Name, n.RegionID, err) + } return } diff --git a/net/netcheck/netcheck_test.go b/net/netcheck/netcheck_test.go index 1e27ba12c..8b7124744 100644 --- a/net/netcheck/netcheck_test.go +++ b/net/netcheck/netcheck_test.go @@ -624,18 +624,6 @@ func (p probe) String() string { return fmt.Sprintf("%s-%s%s%s", p.node, p.proto, delay, wait) } -func (p probeProto) String() string { - switch p { - case probeIPv4: - return "v4" - case probeIPv6: - return "v4" - case probeHTTPS: - return "https" - } - return "?" -} - func TestLogConciseReport(t *testing.T) { dm := &tailcfg.DERPMap{ Regions: map[int]*tailcfg.DERPRegion{