From 1e7a35b2250242d4a50a4d55f4568145d9426602 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Fri, 5 Feb 2021 15:44:46 -0800 Subject: [PATCH] types/netmap: split controlclient.NetworkMap off into its own leaf package Updates #1278 Signed-off-by: Brad Fitzpatrick --- cmd/tailscale/depaware.txt | 41 +++++++--------- cmd/tailscaled/depaware.txt | 3 +- control/controlclient/auto.go | 11 +++-- control/controlclient/direct.go | 7 +-- control/controlclient/direct_test.go | 13 +++++ ipn/backend.go | 22 ++++----- ipn/fake_test.go | 6 +-- ipn/handle.go | 6 +-- ipn/ipnlocal/local.go | 27 ++++++----- ipn/ipnlocal/local_test.go | 48 +++++++++---------- .../controlclient => types/netmap}/netmap.go | 3 +- .../netmap}/netmap_test.go | 15 +----- wgengine/magicsock/magicsock.go | 7 +-- wgengine/magicsock/magicsock_test.go | 18 +++---- wgengine/netstack/netstack.go | 4 +- wgengine/userspace.go | 3 +- wgengine/watchdog.go | 4 +- wgengine/wgcfg/nmcfg/nmcfg.go | 7 +-- wgengine/wgengine.go | 6 +-- 19 files changed, 127 insertions(+), 124 deletions(-) rename {control/controlclient => types/netmap}/netmap.go (99%) rename {control/controlclient => types/netmap}/netmap_test.go (96%) diff --git a/cmd/tailscale/depaware.txt b/cmd/tailscale/depaware.txt index ba092e496..07ea30a8a 100644 --- a/cmd/tailscale/depaware.txt +++ b/cmd/tailscale/depaware.txt @@ -4,60 +4,56 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep W 💣 github.com/alexbrainman/sspi/negotiate from tailscale.com/net/tshttpproxy github.com/apenwarr/fixconsole from tailscale.com/cmd/tailscale W 💣 github.com/apenwarr/w32 from github.com/apenwarr/fixconsole - L github.com/mdlayher/sdnotify from tailscale.com/util/systemd github.com/peterbourgon/ff/v2 from github.com/peterbourgon/ff/v2/ffcli github.com/peterbourgon/ff/v2/ffcli from tailscale.com/cmd/tailscale/cli github.com/tcnksm/go-httpstat from tailscale.com/net/netcheck github.com/toqueteos/webbrowser from tailscale.com/cmd/tailscale/cli 💣 go4.org/intern from inet.af/netaddr - 💣 go4.org/mem from tailscale.com/control/controlclient+ + 💣 go4.org/mem from tailscale.com/derp+ go4.org/unsafe/assume-no-moving-gc from go4.org/intern W 💣 golang.zx2c4.com/wireguard/windows/tunnel/winipcfg from tailscale.com/net/interfaces+ inet.af/netaddr from tailscale.com/cmd/tailscale/cli+ rsc.io/goversion/version from tailscale.com/version tailscale.com/atomicfile from tailscale.com/ipn tailscale.com/cmd/tailscale/cli from tailscale.com/cmd/tailscale - tailscale.com/control/controlclient from tailscale.com/ipn tailscale.com/derp from tailscale.com/derp/derphttp tailscale.com/derp/derphttp from tailscale.com/net/netcheck tailscale.com/derp/derpmap from tailscale.com/cmd/tailscale/cli tailscale.com/disco from tailscale.com/derp tailscale.com/ipn from tailscale.com/cmd/tailscale/cli tailscale.com/ipn/ipnstate from tailscale.com/cmd/tailscale/cli+ - tailscale.com/log/logheap from tailscale.com/control/controlclient - tailscale.com/logtail/backoff from tailscale.com/control/controlclient tailscale.com/metrics from tailscale.com/derp - tailscale.com/net/dnscache from tailscale.com/control/controlclient+ + tailscale.com/net/dnscache from tailscale.com/derp/derphttp tailscale.com/net/flowtrack from tailscale.com/wgengine/filter+ 💣 tailscale.com/net/interfaces from tailscale.com/cmd/tailscale/cli+ tailscale.com/net/netcheck from tailscale.com/cmd/tailscale/cli - tailscale.com/net/netns from tailscale.com/control/controlclient+ + tailscale.com/net/netns from tailscale.com/derp/derphttp+ tailscale.com/net/packet from tailscale.com/wgengine/filter tailscale.com/net/stun from tailscale.com/net/netcheck - tailscale.com/net/tlsdial from tailscale.com/control/controlclient+ + 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/control/controlclient+ + 💣 tailscale.com/net/tshttpproxy from tailscale.com/derp/derphttp+ tailscale.com/paths from tailscale.com/cmd/tailscale/cli tailscale.com/safesocket from tailscale.com/cmd/tailscale/cli 💣 tailscale.com/syncs from tailscale.com/net/interfaces+ tailscale.com/tailcfg from tailscale.com/cmd/tailscale/cli+ W tailscale.com/tsconst from tailscale.com/net/interfaces - tailscale.com/types/empty from tailscale.com/control/controlclient+ + tailscale.com/types/empty from tailscale.com/ipn tailscale.com/types/key from tailscale.com/derp+ tailscale.com/types/logger from tailscale.com/cmd/tailscale/cli+ - tailscale.com/types/opt from tailscale.com/control/controlclient+ - tailscale.com/types/persist from tailscale.com/control/controlclient+ + tailscale.com/types/netmap from tailscale.com/ipn + tailscale.com/types/opt from tailscale.com/net/netcheck+ + tailscale.com/types/persist from tailscale.com/ipn tailscale.com/types/preftype from tailscale.com/cmd/tailscale/cli+ tailscale.com/types/strbuilder from tailscale.com/net/packet - tailscale.com/types/structs from tailscale.com/control/controlclient+ - tailscale.com/types/wgkey from tailscale.com/control/controlclient+ + tailscale.com/types/structs from tailscale.com/ipn+ + tailscale.com/types/wgkey from tailscale.com/types/netmap+ tailscale.com/util/dnsname from tailscale.com/cmd/tailscale/cli+ W tailscale.com/util/endian from tailscale.com/net/netns - tailscale.com/util/lineread from tailscale.com/control/controlclient+ - tailscale.com/util/systemd from tailscale.com/control/controlclient + tailscale.com/util/lineread from tailscale.com/net/interfaces tailscale.com/version from tailscale.com/cmd/tailscale/cli+ - tailscale.com/version/distro from tailscale.com/cmd/tailscale/cli+ - tailscale.com/wgengine/filter from tailscale.com/control/controlclient + tailscale.com/version/distro from tailscale.com/cmd/tailscale/cli + tailscale.com/wgengine/filter from tailscale.com/types/netmap golang.org/x/crypto/blake2b from golang.org/x/crypto/nacl/box golang.org/x/crypto/chacha20 from golang.org/x/crypto/chacha20poly1305 golang.org/x/crypto/chacha20poly1305 from crypto/tls+ @@ -65,7 +61,7 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep golang.org/x/crypto/cryptobyte/asn1 from crypto/ecdsa+ golang.org/x/crypto/curve25519 from crypto/tls+ golang.org/x/crypto/hkdf from crypto/tls - golang.org/x/crypto/nacl/box from tailscale.com/control/controlclient+ + golang.org/x/crypto/nacl/box from tailscale.com/derp golang.org/x/crypto/nacl/secretbox from golang.org/x/crypto/nacl/box golang.org/x/crypto/poly1305 from golang.org/x/crypto/chacha20poly1305+ golang.org/x/crypto/salsa20/salsa from golang.org/x/crypto/nacl/box+ @@ -77,7 +73,7 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep golang.org/x/net/idna from golang.org/x/net/http/httpguts+ golang.org/x/net/proxy from tailscale.com/net/netns D golang.org/x/net/route from net - golang.org/x/oauth2 from tailscale.com/control/controlclient+ + golang.org/x/oauth2 from tailscale.com/ipn+ golang.org/x/oauth2/internal from golang.org/x/oauth2 golang.org/x/sync/errgroup from tailscale.com/derp golang.org/x/sync/singleflight from tailscale.com/net/dnscache @@ -93,7 +89,7 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep bufio from compress/flate+ bytes from bufio+ compress/flate from compress/gzip+ - compress/gzip from net/http+ + compress/gzip from net/http compress/zlib from debug/elf+ container/list from crypto/tls+ context from crypto/tls+ @@ -162,14 +158,13 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep regexp from rsc.io/goversion/version regexp/syntax from regexp runtime/debug from golang.org/x/sync/singleflight - runtime/pprof from tailscale.com/log/logheap sort from compress/flate+ strconv from compress/flate+ strings from bufio+ sync from compress/flate+ sync/atomic from context+ syscall from crypto/rand+ - text/tabwriter from github.com/peterbourgon/ff/v2/ffcli+ + text/tabwriter from github.com/peterbourgon/ff/v2/ffcli time from compress/gzip+ unicode from bytes+ unicode/utf16 from encoding/asn1+ diff --git a/cmd/tailscaled/depaware.txt b/cmd/tailscaled/depaware.txt index 137a1d686..e2fa68aab 100644 --- a/cmd/tailscaled/depaware.txt +++ b/cmd/tailscaled/depaware.txt @@ -65,7 +65,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de inet.af/netaddr from tailscale.com/control/controlclient+ rsc.io/goversion/version from tailscale.com/version tailscale.com/atomicfile from tailscale.com/ipn+ - tailscale.com/control/controlclient from tailscale.com/ipn+ + tailscale.com/control/controlclient from tailscale.com/ipn/ipnlocal+ tailscale.com/derp from tailscale.com/derp/derphttp+ tailscale.com/derp/derphttp from tailscale.com/net/netcheck+ tailscale.com/derp/derpmap from tailscale.com/cmd/tailscaled @@ -106,6 +106,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de tailscale.com/types/flagtype from tailscale.com/cmd/tailscaled tailscale.com/types/key from tailscale.com/derp+ tailscale.com/types/logger from tailscale.com/cmd/tailscaled+ + tailscale.com/types/netmap from tailscale.com/control/controlclient+ tailscale.com/types/nettype from tailscale.com/wgengine/magicsock tailscale.com/types/opt from tailscale.com/control/controlclient+ tailscale.com/types/persist from tailscale.com/control/controlclient+ diff --git a/control/controlclient/auto.go b/control/controlclient/auto.go index a3a7b02c5..128ead9a7 100644 --- a/control/controlclient/auto.go +++ b/control/controlclient/auto.go @@ -22,6 +22,7 @@ import ( "tailscale.com/tailcfg" "tailscale.com/types/empty" "tailscale.com/types/logger" + "tailscale.com/types/netmap" "tailscale.com/types/persist" "tailscale.com/types/structs" "tailscale.com/types/wgkey" @@ -69,9 +70,9 @@ type Status struct { LoginFinished *empty.Message Err string URL string - Persist *persist.Persist // locally persisted configuration - NetMap *NetworkMap // server-pushed configuration - Hostinfo *tailcfg.Hostinfo // current Hostinfo data + Persist *persist.Persist // locally persisted configuration + NetMap *netmap.NetworkMap // server-pushed configuration + Hostinfo *tailcfg.Hostinfo // current Hostinfo data State State } @@ -510,7 +511,7 @@ func (c *Client) mapRoutine() { c.inPollNetMap = false c.mu.Unlock() - err := c.direct.PollNetMap(ctx, -1, func(nm *NetworkMap) { + err := c.direct.PollNetMap(ctx, -1, func(nm *netmap.NetworkMap) { c.mu.Lock() select { @@ -607,7 +608,7 @@ func (c *Client) SetNetInfo(ni *tailcfg.NetInfo) { c.sendNewMapRequest() } -func (c *Client) sendStatus(who string, err error, url string, nm *NetworkMap) { +func (c *Client) sendStatus(who string, err error, url string, nm *netmap.NetworkMap) { c.mu.Lock() state := c.state loggedIn := c.loggedIn diff --git a/control/controlclient/direct.go b/control/controlclient/direct.go index 5c603a892..ed36dd502 100644 --- a/control/controlclient/direct.go +++ b/control/controlclient/direct.go @@ -39,6 +39,7 @@ import ( "tailscale.com/net/tshttpproxy" "tailscale.com/tailcfg" "tailscale.com/types/logger" + "tailscale.com/types/netmap" "tailscale.com/types/opt" "tailscale.com/types/persist" "tailscale.com/types/wgkey" @@ -468,7 +469,7 @@ func inTest() bool { return flag.Lookup("test.v") != nil } // // maxPolls is how many network maps to download; common values are 1 // or -1 (to keep a long-poll query open to the server). -func (c *Direct) PollNetMap(ctx context.Context, maxPolls int, cb func(*NetworkMap)) error { +func (c *Direct) PollNetMap(ctx context.Context, maxPolls int, cb func(*netmap.NetworkMap)) error { return c.sendMapRequest(ctx, maxPolls, cb) } @@ -480,7 +481,7 @@ func (c *Direct) SendLiteMapUpdate(ctx context.Context) error { } // cb nil means to omit peers. -func (c *Direct) sendMapRequest(ctx context.Context, maxPolls int, cb func(*NetworkMap)) error { +func (c *Direct) sendMapRequest(ctx context.Context, maxPolls int, cb func(*netmap.NetworkMap)) error { c.mu.Lock() persist := c.persist serverURL := c.serverURL @@ -714,7 +715,7 @@ func (c *Direct) sendMapRequest(ctx context.Context, maxPolls int, cb func(*Netw localPort = c.localPort c.mu.Unlock() - nm := &NetworkMap{ + nm := &netmap.NetworkMap{ SelfNode: resp.Node, NodeKey: tailcfg.NodeKey(persist.PrivateNodeKey.Public()), PrivateKey: persist.PrivateNodeKey, diff --git a/control/controlclient/direct_test.go b/control/controlclient/direct_test.go index bb1637845..3dab4d9ec 100644 --- a/control/controlclient/direct_test.go +++ b/control/controlclient/direct_test.go @@ -5,6 +5,7 @@ package controlclient import ( + "encoding/json" "fmt" "reflect" "strings" @@ -156,3 +157,15 @@ func TestNewDirect(t *testing.T) { t.Errorf("c.newEndpoints(13) want true got %v", changed) } } + +func TestNewHostinfo(t *testing.T) { + hi := NewHostinfo() + if hi == nil { + t.Fatal("no Hostinfo") + } + j, err := json.MarshalIndent(hi, " ", "") + if err != nil { + t.Fatal(err) + } + t.Logf("Got: %s", j) +} diff --git a/ipn/backend.go b/ipn/backend.go index 85bb0581f..9352853b1 100644 --- a/ipn/backend.go +++ b/ipn/backend.go @@ -9,10 +9,10 @@ import ( "time" "golang.org/x/oauth2" - "tailscale.com/control/controlclient" "tailscale.com/ipn/ipnstate" "tailscale.com/tailcfg" "tailscale.com/types/empty" + "tailscale.com/types/netmap" "tailscale.com/types/structs" ) @@ -58,16 +58,16 @@ type EngineStatus struct { // They are JSON-encoded on the wire, despite the lack of struct tags. type Notify struct { _ structs.Incomparable - Version string // version number of IPN backend - ErrMessage *string // critical error message, if any; for InUseOtherUser, the details - LoginFinished *empty.Message // event: non-nil when login process succeeded - State *State // current IPN state has changed - Prefs *Prefs // preferences were changed - NetMap *controlclient.NetworkMap // new netmap received - Engine *EngineStatus // wireguard engine stats - Status *ipnstate.Status // full status - BrowseToURL *string // UI should open a browser right now - BackendLogID *string // public logtail id used by backend + Version string // version number of IPN backend + ErrMessage *string // critical error message, if any; for InUseOtherUser, the details + LoginFinished *empty.Message // event: non-nil when login process succeeded + State *State // current IPN state has changed + Prefs *Prefs // preferences were changed + NetMap *netmap.NetworkMap // new netmap received + Engine *EngineStatus // wireguard engine stats + Status *ipnstate.Status // full status + BrowseToURL *string // UI should open a browser right now + BackendLogID *string // public logtail id used by backend PingResult *ipnstate.PingResult // LocalTCPPort, if non-nil, informs the UI frontend which diff --git a/ipn/fake_test.go b/ipn/fake_test.go index 9b16cceaa..e918f77f0 100644 --- a/ipn/fake_test.go +++ b/ipn/fake_test.go @@ -9,8 +9,8 @@ import ( "time" "golang.org/x/oauth2" - "tailscale.com/control/controlclient" "tailscale.com/ipn/ipnstate" + "tailscale.com/types/netmap" ) type FakeBackend struct { @@ -54,7 +54,7 @@ func (b *FakeBackend) login() { b.newState(NeedsMachineAuth) b.newState(Stopped) // TODO(apenwarr): Fill in a more interesting netmap here. - b.notify(Notify{NetMap: &controlclient.NetworkMap{}}) + b.notify(Notify{NetMap: &netmap.NetworkMap{}}) b.newState(Starting) // TODO(apenwarr): Fill in a more interesting status. b.notify(Notify{Engine: &EngineStatus{}}) @@ -92,7 +92,7 @@ func (b *FakeBackend) RequestStatus() { } func (b *FakeBackend) FakeExpireAfter(x time.Duration) { - b.notify(Notify{NetMap: &controlclient.NetworkMap{}}) + b.notify(Notify{NetMap: &netmap.NetworkMap{}}) } func (b *FakeBackend) Ping(ip string) { diff --git a/ipn/handle.go b/ipn/handle.go index b79eea8e2..91b757f56 100644 --- a/ipn/handle.go +++ b/ipn/handle.go @@ -10,8 +10,8 @@ import ( "golang.org/x/oauth2" "inet.af/netaddr" - "tailscale.com/control/controlclient" "tailscale.com/types/logger" + "tailscale.com/types/netmap" ) type Handle struct { @@ -22,7 +22,7 @@ type Handle struct { // Mutex protects everything below mu sync.Mutex - netmapCache *controlclient.NetworkMap + netmapCache *netmap.NetworkMap engineStatusCache EngineStatus stateCache State prefsCache *Prefs @@ -129,7 +129,7 @@ func (h *Handle) LocalAddrs() []netaddr.IPPrefix { return []netaddr.IPPrefix{} } -func (h *Handle) NetMap() *controlclient.NetworkMap { +func (h *Handle) NetMap() *netmap.NetworkMap { h.mu.Lock() defer h.mu.Unlock() diff --git a/ipn/ipnlocal/local.go b/ipn/ipnlocal/local.go index 523292def..6ad80ed53 100644 --- a/ipn/ipnlocal/local.go +++ b/ipn/ipnlocal/local.go @@ -29,6 +29,7 @@ import ( "tailscale.com/types/empty" "tailscale.com/types/key" "tailscale.com/types/logger" + "tailscale.com/types/netmap" "tailscale.com/types/persist" "tailscale.com/types/wgkey" "tailscale.com/util/systemd" @@ -92,7 +93,7 @@ type LocalBackend struct { // hostinfo is mutated in-place while mu is held. hostinfo *tailcfg.Hostinfo // netMap is not mutated in-place once set. - netMap *controlclient.NetworkMap + netMap *netmap.NetworkMap nodeByAddr map[netaddr.IP]*tailcfg.Node activeLogin string // last logged LoginName from netMap engineStatus ipn.EngineStatus @@ -374,7 +375,7 @@ func (b *LocalBackend) setClientStatus(st controlclient.Status) { // routes provided by the exit node specified in b.prefs. It returns // whether prefs was mutated as part of the process, due to an exit // node IP being converted into a node ID. -func (b *LocalBackend) keepOneExitNodeLocked(nm *controlclient.NetworkMap) (prefsChanged bool) { +func (b *LocalBackend) keepOneExitNodeLocked(nm *netmap.NetworkMap) (prefsChanged bool) { if b.prefs.ExitNodeID == "" && b.prefs.ExitNodeIP.IsZero() { return false } @@ -601,7 +602,7 @@ func (b *LocalBackend) Start(opts ipn.Options) error { // updateFilter updates the packet filter in wgengine based on the // given netMap and user preferences. -func (b *LocalBackend) updateFilter(netMap *controlclient.NetworkMap, prefs *ipn.Prefs) { +func (b *LocalBackend) updateFilter(netMap *netmap.NetworkMap, prefs *ipn.Prefs) { // NOTE(danderson): keep change detection as the first thing in // this function. Don't try to optimize by returning early, more // likely than not you'll just end up breaking the change @@ -660,7 +661,7 @@ func dnsCIDRsEqual(newAddr, oldAddr []netaddr.IPPrefix) bool { // dnsMapsEqual determines whether the new and the old network map // induce the same DNS map. It does so without allocating memory, // at the expense of giving false negatives if peers are reordered. -func dnsMapsEqual(new, old *controlclient.NetworkMap) bool { +func dnsMapsEqual(new, old *netmap.NetworkMap) bool { if (old == nil) != (new == nil) { return false } @@ -694,7 +695,7 @@ func dnsMapsEqual(new, old *controlclient.NetworkMap) bool { // updateDNSMap updates the domain map in the DNS resolver in wgengine // based on the given netMap and user preferences. -func (b *LocalBackend) updateDNSMap(netMap *controlclient.NetworkMap) { +func (b *LocalBackend) updateDNSMap(netMap *netmap.NetworkMap) { if netMap == nil { b.logf("dns map: (not ready)") return @@ -1215,7 +1216,7 @@ func (b *LocalBackend) doSetHostinfoFilterServices(hi *tailcfg.Hostinfo) { // NetMap returns the latest cached network map received from // controlclient, or nil if no network map was received yet. -func (b *LocalBackend) NetMap() *controlclient.NetworkMap { +func (b *LocalBackend) NetMap() *netmap.NetworkMap { b.mu.Lock() defer b.mu.Unlock() return b.netMap @@ -1257,17 +1258,17 @@ func (b *LocalBackend) authReconfig() { return } - var flags controlclient.WGConfigFlags + var flags netmap.WGConfigFlags if uc.RouteAll { - flags |= controlclient.AllowSubnetRoutes + flags |= netmap.AllowSubnetRoutes } if uc.AllowSingleHosts { - flags |= controlclient.AllowSingleHosts + flags |= netmap.AllowSingleHosts } if hasPAC && disableSubnetsIfPAC { - if flags&controlclient.AllowSubnetRoutes != 0 { + if flags&netmap.AllowSubnetRoutes != 0 { b.logf("authReconfig: have PAC; disabling subnet routes") - flags &^= controlclient.AllowSubnetRoutes + flags &^= netmap.AllowSubnetRoutes } } @@ -1303,7 +1304,7 @@ func (b *LocalBackend) authReconfig() { // magicDNSRootDomains returns the subset of nm.DNS.Domains that are the search domains for MagicDNS. // Each entry has a trailing period. -func magicDNSRootDomains(nm *controlclient.NetworkMap) []string { +func magicDNSRootDomains(nm *netmap.NetworkMap) []string { if v := nm.MagicDNSSuffix(); v != "" { return []string{strings.Trim(v, ".") + "."} } @@ -1596,7 +1597,7 @@ func (b *LocalBackend) setNetInfo(ni *tailcfg.NetInfo) { c.SetNetInfo(ni) } -func (b *LocalBackend) setNetMapLocked(nm *controlclient.NetworkMap) { +func (b *LocalBackend) setNetMapLocked(nm *netmap.NetworkMap) { var login string if nm != nil { login = nm.UserProfiles[nm.User].LoginName diff --git a/ipn/ipnlocal/local_test.go b/ipn/ipnlocal/local_test.go index ec9400952..9f19a08f1 100644 --- a/ipn/ipnlocal/local_test.go +++ b/ipn/ipnlocal/local_test.go @@ -8,8 +8,8 @@ import ( "testing" "inet.af/netaddr" - "tailscale.com/control/controlclient" "tailscale.com/tailcfg" + "tailscale.com/types/netmap" ) func TestNetworkMapCompare(t *testing.T) { @@ -27,7 +27,7 @@ func TestNetworkMapCompare(t *testing.T) { tests := []struct { name string - a, b *controlclient.NetworkMap + a, b *netmap.NetworkMap want bool }{ { @@ -38,76 +38,76 @@ func TestNetworkMapCompare(t *testing.T) { }, { "b nil", - &controlclient.NetworkMap{}, + &netmap.NetworkMap{}, nil, false, }, { "a nil", nil, - &controlclient.NetworkMap{}, + &netmap.NetworkMap{}, false, }, { "both default", - &controlclient.NetworkMap{}, - &controlclient.NetworkMap{}, + &netmap.NetworkMap{}, + &netmap.NetworkMap{}, true, }, { "names identical", - &controlclient.NetworkMap{Name: "map1"}, - &controlclient.NetworkMap{Name: "map1"}, + &netmap.NetworkMap{Name: "map1"}, + &netmap.NetworkMap{Name: "map1"}, true, }, { "names differ", - &controlclient.NetworkMap{Name: "map1"}, - &controlclient.NetworkMap{Name: "map2"}, + &netmap.NetworkMap{Name: "map1"}, + &netmap.NetworkMap{Name: "map2"}, false, }, { "Peers identical", - &controlclient.NetworkMap{Peers: []*tailcfg.Node{}}, - &controlclient.NetworkMap{Peers: []*tailcfg.Node{}}, + &netmap.NetworkMap{Peers: []*tailcfg.Node{}}, + &netmap.NetworkMap{Peers: []*tailcfg.Node{}}, true, }, { "Peer list length", // length of Peers list differs - &controlclient.NetworkMap{Peers: []*tailcfg.Node{{}}}, - &controlclient.NetworkMap{Peers: []*tailcfg.Node{}}, + &netmap.NetworkMap{Peers: []*tailcfg.Node{{}}}, + &netmap.NetworkMap{Peers: []*tailcfg.Node{}}, false, }, { "Node names identical", - &controlclient.NetworkMap{Peers: []*tailcfg.Node{&tailcfg.Node{Name: "A"}}}, - &controlclient.NetworkMap{Peers: []*tailcfg.Node{&tailcfg.Node{Name: "A"}}}, + &netmap.NetworkMap{Peers: []*tailcfg.Node{&tailcfg.Node{Name: "A"}}}, + &netmap.NetworkMap{Peers: []*tailcfg.Node{&tailcfg.Node{Name: "A"}}}, true, }, { "Node names differ", - &controlclient.NetworkMap{Peers: []*tailcfg.Node{&tailcfg.Node{Name: "A"}}}, - &controlclient.NetworkMap{Peers: []*tailcfg.Node{&tailcfg.Node{Name: "B"}}}, + &netmap.NetworkMap{Peers: []*tailcfg.Node{&tailcfg.Node{Name: "A"}}}, + &netmap.NetworkMap{Peers: []*tailcfg.Node{&tailcfg.Node{Name: "B"}}}, false, }, { "Node lists identical", - &controlclient.NetworkMap{Peers: []*tailcfg.Node{node1, node1}}, - &controlclient.NetworkMap{Peers: []*tailcfg.Node{node1, node1}}, + &netmap.NetworkMap{Peers: []*tailcfg.Node{node1, node1}}, + &netmap.NetworkMap{Peers: []*tailcfg.Node{node1, node1}}, true, }, { "Node lists differ", - &controlclient.NetworkMap{Peers: []*tailcfg.Node{node1, node1}}, - &controlclient.NetworkMap{Peers: []*tailcfg.Node{node1, node2}}, + &netmap.NetworkMap{Peers: []*tailcfg.Node{node1, node1}}, + &netmap.NetworkMap{Peers: []*tailcfg.Node{node1, node2}}, false, }, { "Node Users differ", // User field is not checked. - &controlclient.NetworkMap{Peers: []*tailcfg.Node{&tailcfg.Node{User: 0}}}, - &controlclient.NetworkMap{Peers: []*tailcfg.Node{&tailcfg.Node{User: 1}}}, + &netmap.NetworkMap{Peers: []*tailcfg.Node{&tailcfg.Node{User: 0}}}, + &netmap.NetworkMap{Peers: []*tailcfg.Node{&tailcfg.Node{User: 1}}}, true, }, } diff --git a/control/controlclient/netmap.go b/types/netmap/netmap.go similarity index 99% rename from control/controlclient/netmap.go rename to types/netmap/netmap.go index 6589bb369..558c74637 100644 --- a/control/controlclient/netmap.go +++ b/types/netmap/netmap.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package controlclient +// Package netmap contains the netmap.NetworkMap type. +package netmap import ( "encoding/json" diff --git a/control/controlclient/netmap_test.go b/types/netmap/netmap_test.go similarity index 96% rename from control/controlclient/netmap_test.go rename to types/netmap/netmap_test.go index 5bb529ab0..977a64cf0 100644 --- a/control/controlclient/netmap_test.go +++ b/types/netmap/netmap_test.go @@ -2,11 +2,10 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package controlclient +package netmap import ( "encoding/hex" - "encoding/json" "testing" "inet.af/netaddr" @@ -283,15 +282,3 @@ func TestConciseDiffFrom(t *testing.T) { }) } } - -func TestNewHostinfo(t *testing.T) { - hi := NewHostinfo() - if hi == nil { - t.Fatal("no Hostinfo") - } - j, err := json.MarshalIndent(hi, " ", "") - if err != nil { - t.Fatal(err) - } - t.Logf("Got: %s", j) -} diff --git a/wgengine/magicsock/magicsock.go b/wgengine/magicsock/magicsock.go index 3147167bb..16fc78493 100644 --- a/wgengine/magicsock/magicsock.go +++ b/wgengine/magicsock/magicsock.go @@ -48,6 +48,7 @@ import ( "tailscale.com/tstime" "tailscale.com/types/key" "tailscale.com/types/logger" + "tailscale.com/types/netmap" "tailscale.com/types/nettype" "tailscale.com/types/wgkey" "tailscale.com/version" @@ -273,7 +274,7 @@ type Conn struct { netInfoLast *tailcfg.NetInfo derpMap *tailcfg.DERPMap // nil (or zero regions/nodes) means DERP is disabled - netMap *controlclient.NetworkMap + netMap *netmap.NetworkMap privateKey key.Private // WireGuard private key for this node everHadKey bool // whether we ever had a non-zero private key myDerp int // nearest DERP region ID; 0 means none/unknown @@ -777,7 +778,7 @@ func (c *Conn) SetNetInfoCallback(fn func(*tailcfg.NetInfo)) { // peerForIP returns the Node in nm that's responsible for // handling the given IP address. -func peerForIP(nm *controlclient.NetworkMap, ip netaddr.IP) (n *tailcfg.Node, ok bool) { +func peerForIP(nm *netmap.NetworkMap, ip netaddr.IP) (n *tailcfg.Node, ok bool) { if nm == nil { return nil, false } @@ -2198,7 +2199,7 @@ func nodesEqual(x, y []*tailcfg.Node) bool { // // It should not use the DERPMap field of NetworkMap; that's // conditionally sent to SetDERPMap instead. -func (c *Conn) SetNetworkMap(nm *controlclient.NetworkMap) { +func (c *Conn) SetNetworkMap(nm *netmap.NetworkMap) { c.mu.Lock() defer c.mu.Unlock() diff --git a/wgengine/magicsock/magicsock_test.go b/wgengine/magicsock/magicsock_test.go index 90a78b9b0..86cd88283 100644 --- a/wgengine/magicsock/magicsock_test.go +++ b/wgengine/magicsock/magicsock_test.go @@ -30,7 +30,6 @@ import ( "github.com/tailscale/wireguard-go/tun/tuntest" "golang.org/x/crypto/nacl/box" "inet.af/netaddr" - "tailscale.com/control/controlclient" "tailscale.com/derp" "tailscale.com/derp/derphttp" "tailscale.com/derp/derpmap" @@ -41,6 +40,7 @@ import ( "tailscale.com/tstest/natlab" "tailscale.com/types/key" "tailscale.com/types/logger" + "tailscale.com/types/netmap" "tailscale.com/types/nettype" "tailscale.com/types/wgkey" "tailscale.com/wgengine/filter" @@ -252,9 +252,9 @@ func meshStacks(logf logger.Logf, ms []*magicStack) (cleanup func()) { eps = make([][]string, len(ms)) ) - buildNetmapLocked := func(myIdx int) *controlclient.NetworkMap { + buildNetmapLocked := func(myIdx int) *netmap.NetworkMap { me := ms[myIdx] - nm := &controlclient.NetworkMap{ + nm := &netmap.NetworkMap{ PrivateKey: me.privateKey, NodeKey: tailcfg.NodeKey(me.privateKey.Public()), Addresses: []netaddr.IPPrefix{{IP: netaddr.IPv4(1, 0, 0, byte(myIdx+1)), Bits: 32}}, @@ -287,14 +287,14 @@ func meshStacks(logf logger.Logf, ms []*magicStack) (cleanup func()) { eps[idx] = newEps for i, m := range ms { - netmap := buildNetmapLocked(i) - m.conn.SetNetworkMap(netmap) - peerSet := make(map[key.Public]struct{}, len(netmap.Peers)) - for _, peer := range netmap.Peers { + nm := buildNetmapLocked(i) + m.conn.SetNetworkMap(nm) + peerSet := make(map[key.Public]struct{}, len(nm.Peers)) + for _, peer := range nm.Peers { peerSet[key.Public(peer.Key)] = struct{}{} } m.conn.UpdatePeers(peerSet) - wg, err := nmcfg.WGCfg(netmap, logf, controlclient.AllowSingleHosts) + wg, err := nmcfg.WGCfg(nm, logf, netmap.AllowSingleHosts) if err != nil { // We're too far from the *testing.T to be graceful, // blow up. Shouldn't happen anyway. @@ -1433,7 +1433,7 @@ func BenchmarkReceiveFrom(b *testing.B) { // valid peer and not fall through to the legacy magicsock // codepath. discoKey := tailcfg.DiscoKey{31: 1} - conn.SetNetworkMap(&controlclient.NetworkMap{ + conn.SetNetworkMap(&netmap.NetworkMap{ Peers: []*tailcfg.Node{ { DiscoKey: discoKey, diff --git a/wgengine/netstack/netstack.go b/wgengine/netstack/netstack.go index 72651bd41..b2b21fcba 100644 --- a/wgengine/netstack/netstack.go +++ b/wgengine/netstack/netstack.go @@ -28,9 +28,9 @@ import ( "gvisor.dev/gvisor/pkg/tcpip/transport/udp" "gvisor.dev/gvisor/pkg/waiter" "inet.af/netaddr" - "tailscale.com/control/controlclient" "tailscale.com/net/packet" "tailscale.com/types/logger" + "tailscale.com/types/netmap" "tailscale.com/wgengine" "tailscale.com/wgengine/filter" "tailscale.com/wgengine/magicsock" @@ -63,7 +63,7 @@ func Impl(logf logger.Logf, tundev *tstun.TUN, e wgengine.Engine, mc *magicsock. log.Fatal(err) } - e.AddNetworkMapCallback(func(nm *controlclient.NetworkMap) { + e.AddNetworkMapCallback(func(nm *netmap.NetworkMap) { oldIPs := make(map[tcpip.Address]bool) for _, ip := range ipstack.AllAddresses()[nicID] { oldIPs[ip.AddressWithPrefix.Address] = true diff --git a/wgengine/userspace.go b/wgengine/userspace.go index 7380b74fa..282b79c7d 100644 --- a/wgengine/userspace.go +++ b/wgengine/userspace.go @@ -36,6 +36,7 @@ import ( "tailscale.com/tailcfg" "tailscale.com/types/key" "tailscale.com/types/logger" + "tailscale.com/types/netmap" "tailscale.com/types/wgkey" "tailscale.com/version" "tailscale.com/version/distro" @@ -1324,7 +1325,7 @@ func (e *userspaceEngine) SetDERPMap(dm *tailcfg.DERPMap) { e.magicConn.SetDERPMap(dm) } -func (e *userspaceEngine) SetNetworkMap(nm *controlclient.NetworkMap) { +func (e *userspaceEngine) SetNetworkMap(nm *netmap.NetworkMap) { e.magicConn.SetNetworkMap(nm) e.mu.Lock() callbacks := make([]NetworkMapCallback, 0, 4) diff --git a/wgengine/watchdog.go b/wgengine/watchdog.go index 91b5fe04e..130ce4610 100644 --- a/wgengine/watchdog.go +++ b/wgengine/watchdog.go @@ -13,10 +13,10 @@ import ( "time" "inet.af/netaddr" - "tailscale.com/control/controlclient" "tailscale.com/ipn/ipnstate" "tailscale.com/net/interfaces" "tailscale.com/tailcfg" + "tailscale.com/types/netmap" "tailscale.com/wgengine/filter" "tailscale.com/wgengine/router" "tailscale.com/wgengine/tsdns" @@ -107,7 +107,7 @@ func (e *watchdogEngine) SetLinkChangeCallback(cb func(major bool, newState *int func (e *watchdogEngine) SetDERPMap(m *tailcfg.DERPMap) { e.watchdog("SetDERPMap", func() { e.wrap.SetDERPMap(m) }) } -func (e *watchdogEngine) SetNetworkMap(nm *controlclient.NetworkMap) { +func (e *watchdogEngine) SetNetworkMap(nm *netmap.NetworkMap) { e.watchdog("SetNetworkMap", func() { e.wrap.SetNetworkMap(nm) }) } func (e *watchdogEngine) AddNetworkMapCallback(callback NetworkMapCallback) func() { diff --git a/wgengine/wgcfg/nmcfg/nmcfg.go b/wgengine/wgcfg/nmcfg/nmcfg.go index ce8408b06..36dc065c8 100644 --- a/wgengine/wgcfg/nmcfg/nmcfg.go +++ b/wgengine/wgcfg/nmcfg/nmcfg.go @@ -16,6 +16,7 @@ import ( "tailscale.com/net/tsaddr" "tailscale.com/tailcfg" "tailscale.com/types/logger" + "tailscale.com/types/netmap" "tailscale.com/wgengine/wgcfg" ) @@ -51,7 +52,7 @@ func cidrIsSubnet(node *tailcfg.Node, cidr netaddr.IPPrefix) bool { } // WGCfg returns the NetworkMaps's Wireguard configuration. -func WGCfg(nm *controlclient.NetworkMap, logf logger.Logf, flags controlclient.WGConfigFlags) (*wgcfg.Config, error) { +func WGCfg(nm *netmap.NetworkMap, logf logger.Logf, flags netmap.WGConfigFlags) (*wgcfg.Config, error) { cfg := &wgcfg.Config{ Name: "tailscale", PrivateKey: wgcfg.PrivateKey(nm.PrivateKey), @@ -88,12 +89,12 @@ func WGCfg(nm *controlclient.NetworkMap, logf logger.Logf, flags controlclient.W } } for _, allowedIP := range peer.AllowedIPs { - if allowedIP.IsSingleIP() && tsaddr.IsTailscaleIP(allowedIP.IP) && (flags&controlclient.AllowSingleHosts) == 0 { + if allowedIP.IsSingleIP() && tsaddr.IsTailscaleIP(allowedIP.IP) && (flags&netmap.AllowSingleHosts) == 0 { logf("[v1] wgcfg: skipping node IP %v from %q (%v)", allowedIP.IP, nodeDebugName(peer), peer.Key.ShortString()) continue } else if cidrIsSubnet(peer, allowedIP) { - if (flags & controlclient.AllowSubnetRoutes) == 0 { + if (flags & netmap.AllowSubnetRoutes) == 0 { logf("[v1] wgcfg: not accepting subnet route %v from %q (%v)", allowedIP, nodeDebugName(peer), peer.Key.ShortString()) continue diff --git a/wgengine/wgengine.go b/wgengine/wgengine.go index ff3efb6a0..257d59f26 100644 --- a/wgengine/wgengine.go +++ b/wgengine/wgengine.go @@ -8,10 +8,10 @@ import ( "errors" "inet.af/netaddr" - "tailscale.com/control/controlclient" "tailscale.com/ipn/ipnstate" "tailscale.com/net/interfaces" "tailscale.com/tailcfg" + "tailscale.com/types/netmap" "tailscale.com/wgengine/filter" "tailscale.com/wgengine/router" "tailscale.com/wgengine/tsdns" @@ -38,7 +38,7 @@ type NetInfoCallback func(*tailcfg.NetInfo) // NetworkMapCallback is the type used by callbacks that hook // into network map updates. -type NetworkMapCallback func(*controlclient.NetworkMap) +type NetworkMapCallback func(*netmap.NetworkMap) // someHandle is allocated so its pointer address acts as a unique // map key handle. (It needs to have non-zero size for Go to guarantee @@ -108,7 +108,7 @@ type Engine interface { // ignored as as it might be disabled; get it from SetDERPMap // instead. // The network map should only be read from. - SetNetworkMap(*controlclient.NetworkMap) + SetNetworkMap(*netmap.NetworkMap) // AddNetworkMapCallback adds a function to a list of callbacks // that are called when the network map updates. It returns a