mirror of
https://github.com/tailscale/tailscale.git
synced 2025-08-11 21:27:31 +00:00
net/netcheck, wgengine/magicsock: make netmon.Monitor required
This has been a TODO for ages. Time to do it. The goal is to move more network state accessors to netmon.Monitor where they can be cheaper/cached. Updates tailscale/corp#10910 Updates tailscale/corp#18960 Updates #7967 Updates #3299 Change-Id: I60fc6508cd2d8d079260bda371fc08b6318bcaf1 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:

committed by
Brad Fitzpatrick

parent
4dece0c359
commit
7a62dddeac
@@ -159,6 +159,11 @@ func cloneDurationMap(m map[int]time.Duration) map[int]time.Duration {
|
||||
// active probes, and must receive STUN packet replies via ReceiveSTUNPacket.
|
||||
// Client can be used in a standalone fashion via the Standalone method.
|
||||
type Client struct {
|
||||
// NetMon is the netmon.Monitor to use to get the current
|
||||
// (cached) network interface.
|
||||
// It must be non-nil.
|
||||
NetMon *netmon.Monitor
|
||||
|
||||
// Verbose enables verbose logging.
|
||||
Verbose bool
|
||||
|
||||
@@ -166,13 +171,6 @@ type Client struct {
|
||||
// If nil, log.Printf is used.
|
||||
Logf logger.Logf
|
||||
|
||||
// NetMon optionally provides a netmon.Monitor to use to get the current
|
||||
// (cached) network interface.
|
||||
// If nil, the interface will be looked up dynamically.
|
||||
// TODO(bradfitz): make NetMon required. As of 2023-08-01, it basically always is
|
||||
// present anyway.
|
||||
NetMon *netmon.Monitor
|
||||
|
||||
// TimeNow, if non-nil, is used instead of time.Now.
|
||||
TimeNow func() time.Time
|
||||
|
||||
@@ -781,6 +779,9 @@ func (c *Client) GetReport(ctx context.Context, dm *tailcfg.DERPMap, opts *GetRe
|
||||
if dm == nil {
|
||||
return nil, errors.New("netcheck: GetReport: DERP map is nil")
|
||||
}
|
||||
if c.NetMon == nil {
|
||||
return nil, errors.New("netcheck: GetReport: Client.NetMon is nil")
|
||||
}
|
||||
|
||||
c.mu.Lock()
|
||||
if c.curState != nil {
|
||||
@@ -844,18 +845,7 @@ func (c *Client) GetReport(ctx context.Context, dm *tailcfg.DERPMap, opts *GetRe
|
||||
return c.finishAndStoreReport(rs, dm), nil
|
||||
}
|
||||
|
||||
var ifState *interfaces.State
|
||||
if c.NetMon == nil {
|
||||
directState, err := interfaces.GetState()
|
||||
if err != nil {
|
||||
c.logf("[v1] interfaces: %v", err)
|
||||
return nil, err
|
||||
} else {
|
||||
ifState = directState
|
||||
}
|
||||
} else {
|
||||
ifState = c.NetMon.InterfaceState()
|
||||
}
|
||||
ifState := c.NetMon.InterfaceState()
|
||||
|
||||
// See if IPv6 works at all, or if it's been hard disabled at the
|
||||
// OS level.
|
||||
|
@@ -19,10 +19,12 @@ import (
|
||||
"time"
|
||||
|
||||
"tailscale.com/net/interfaces"
|
||||
"tailscale.com/net/netmon"
|
||||
"tailscale.com/net/stun"
|
||||
"tailscale.com/net/stun/stuntest"
|
||||
"tailscale.com/tailcfg"
|
||||
"tailscale.com/tstest"
|
||||
"tailscale.com/types/logger"
|
||||
)
|
||||
|
||||
func TestHairpinSTUN(t *testing.T) {
|
||||
@@ -154,13 +156,25 @@ func TestHairpinWait(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func newTestClient(t testing.TB) *Client {
|
||||
netMon, err := netmon.New(logger.WithPrefix(t.Logf, "... netmon: "))
|
||||
if err != nil {
|
||||
t.Fatalf("netmon.New: %v", err)
|
||||
}
|
||||
t.Cleanup(func() { netMon.Close() })
|
||||
|
||||
c := &Client{
|
||||
NetMon: netMon,
|
||||
Logf: t.Logf,
|
||||
}
|
||||
return c
|
||||
}
|
||||
|
||||
func TestBasic(t *testing.T) {
|
||||
stunAddr, cleanup := stuntest.Serve(t)
|
||||
defer cleanup()
|
||||
|
||||
c := &Client{
|
||||
Logf: t.Logf,
|
||||
}
|
||||
c := newTestClient(t)
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
|
||||
defer cancel()
|
||||
@@ -202,9 +216,8 @@ func TestWorksWhenUDPBlocked(t *testing.T) {
|
||||
dm := stuntest.DERPMapOf(stunAddr)
|
||||
dm.Regions[1].Nodes[0].STUNOnly = true
|
||||
|
||||
c := &Client{
|
||||
Logf: t.Logf,
|
||||
}
|
||||
c := newTestClient(t)
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 250*time.Millisecond)
|
||||
defer cancel()
|
||||
|
||||
@@ -895,14 +908,11 @@ func TestNoCaptivePortalWhenUDP(t *testing.T) {
|
||||
stunAddr, cleanup := stuntest.Serve(t)
|
||||
defer cleanup()
|
||||
|
||||
c := &Client{
|
||||
Logf: t.Logf,
|
||||
testEnoughRegions: 1,
|
||||
|
||||
// Set the delay long enough that we have time to cancel it
|
||||
// when our STUN probe succeeds.
|
||||
testCaptivePortalDelay: 10 * time.Second,
|
||||
}
|
||||
c := newTestClient(t)
|
||||
c.testEnoughRegions = 1
|
||||
// Set the delay long enough that we have time to cancel it
|
||||
// when our STUN probe succeeds.
|
||||
c.testCaptivePortalDelay = 10 * time.Second
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
|
||||
defer cancel()
|
||||
|
Reference in New Issue
Block a user