ipn, wgengine: plumb NetworkMap down to magicsock

Now we can have magicsock make decisions based on tailcfg.Debug
settings sent by the server.

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
pull/512/head
Brad Fitzpatrick 4 years ago committed by Brad Fitzpatrick
parent b8edb7a5e9
commit fe50cd0c48

@ -230,6 +230,7 @@ func (b *LocalBackend) setClientStatus(st controlclient.Status) {
if changed { if changed {
b.updateFilter(st.NetMap) b.updateFilter(st.NetMap)
b.updateDNSMap(st.NetMap) b.updateDNSMap(st.NetMap)
b.e.SetNetworkMap(st.NetMap)
} }
if disableDERP { if disableDERP {
b.e.SetDERPMap(nil) b.e.SetDERPMap(nil)

@ -30,6 +30,7 @@ import (
"github.com/tailscale/wireguard-go/wgcfg" "github.com/tailscale/wireguard-go/wgcfg"
"golang.org/x/time/rate" "golang.org/x/time/rate"
"inet.af/netaddr" "inet.af/netaddr"
"tailscale.com/control/controlclient"
"tailscale.com/derp" "tailscale.com/derp"
"tailscale.com/derp/derphttp" "tailscale.com/derp/derphttp"
"tailscale.com/ipn/ipnstate" "tailscale.com/ipn/ipnstate"
@ -107,6 +108,7 @@ type Conn struct {
netInfoLast *tailcfg.NetInfo netInfoLast *tailcfg.NetInfo
derpMap *tailcfg.DERPMap // nil (or zero regions/nodes) means DERP is disabled derpMap *tailcfg.DERPMap // nil (or zero regions/nodes) means DERP is disabled
netMap *controlclient.NetworkMap
privateKey key.Private privateKey key.Private
myDerp int // nearest DERP region ID; 0 means none/unknown myDerp int // nearest DERP region ID; 0 means none/unknown
derpStarted chan struct{} // closed on first connection to DERP; for tests derpStarted chan struct{} // closed on first connection to DERP; for tests
@ -1347,6 +1349,25 @@ func (c *Conn) SetDERPMap(dm *tailcfg.DERPMap) {
go c.ReSTUN("derp-map-update") go c.ReSTUN("derp-map-update")
} }
// SetNetworkMap is called when the control client gets a new network
// map from the control server.
//
// It should not use the DERPMap field of NetworkMap; that's
// conditionally sent to SetDERPMap instead.
func (c *Conn) SetNetworkMap(nm *controlclient.NetworkMap) {
c.mu.Lock()
defer c.mu.Unlock()
if reflect.DeepEqual(nm, c.netMap) {
return
}
c.logf("magicsock: got updated network map")
c.netMap = nm
// TODO: look at Debug fields
// TODO: look at DiscoKey fields to reset AddrSet states when node restarts
}
func (c *Conn) wantDerpLocked() bool { return c.derpMap != nil } func (c *Conn) wantDerpLocked() bool { return c.derpMap != nil }
// c.mu must be held. // c.mu must be held.

@ -25,6 +25,7 @@ import (
"github.com/tailscale/wireguard-go/tun" "github.com/tailscale/wireguard-go/tun"
"github.com/tailscale/wireguard-go/wgcfg" "github.com/tailscale/wireguard-go/wgcfg"
"go4.org/mem" "go4.org/mem"
"tailscale.com/control/controlclient"
"tailscale.com/ipn/ipnstate" "tailscale.com/ipn/ipnstate"
"tailscale.com/net/interfaces" "tailscale.com/net/interfaces"
"tailscale.com/tailcfg" "tailscale.com/tailcfg"
@ -830,6 +831,10 @@ func (e *userspaceEngine) SetDERPMap(dm *tailcfg.DERPMap) {
e.magicConn.SetDERPMap(dm) e.magicConn.SetDERPMap(dm)
} }
func (e *userspaceEngine) SetNetworkMap(nm *controlclient.NetworkMap) {
e.magicConn.SetNetworkMap(nm)
}
func (e *userspaceEngine) SetDiscoPrivateKey(k key.Private) { func (e *userspaceEngine) SetDiscoPrivateKey(k key.Private) {
e.magicConn.SetDiscoPrivateKey(k) e.magicConn.SetDiscoPrivateKey(k)
} }

@ -11,6 +11,7 @@ import (
"time" "time"
"github.com/tailscale/wireguard-go/wgcfg" "github.com/tailscale/wireguard-go/wgcfg"
"tailscale.com/control/controlclient"
"tailscale.com/ipn/ipnstate" "tailscale.com/ipn/ipnstate"
"tailscale.com/tailcfg" "tailscale.com/tailcfg"
"tailscale.com/types/key" "tailscale.com/types/key"
@ -97,6 +98,9 @@ func (e *watchdogEngine) LinkChange(isExpensive bool) {
func (e *watchdogEngine) SetDERPMap(m *tailcfg.DERPMap) { func (e *watchdogEngine) SetDERPMap(m *tailcfg.DERPMap) {
e.watchdog("SetDERPMap", func() { e.wrap.SetDERPMap(m) }) e.watchdog("SetDERPMap", func() { e.wrap.SetDERPMap(m) })
} }
func (e *watchdogEngine) SetNetworkMap(nm *controlclient.NetworkMap) {
e.watchdog("SetNetworkMap", func() { e.wrap.SetNetworkMap(nm) })
}
func (e *watchdogEngine) SetDiscoPrivateKey(k key.Private) { func (e *watchdogEngine) SetDiscoPrivateKey(k key.Private) {
e.watchdog("SetDiscoPrivateKey", func() { e.wrap.SetDiscoPrivateKey(k) }) e.watchdog("SetDiscoPrivateKey", func() { e.wrap.SetDiscoPrivateKey(k) })
} }

@ -9,6 +9,7 @@ import (
"time" "time"
"github.com/tailscale/wireguard-go/wgcfg" "github.com/tailscale/wireguard-go/wgcfg"
"tailscale.com/control/controlclient"
"tailscale.com/ipn/ipnstate" "tailscale.com/ipn/ipnstate"
"tailscale.com/tailcfg" "tailscale.com/tailcfg"
"tailscale.com/types/key" "tailscale.com/types/key"
@ -105,6 +106,13 @@ type Engine interface {
// is configured. // is configured.
SetDERPMap(*tailcfg.DERPMap) SetDERPMap(*tailcfg.DERPMap)
// SetNetworkMap informs the engine of the latest network map
// from the server. The network map's DERPMap field should be
// ignored as as it might be disabled; get it from SetDERPMap
// instead.
// The network map should only be read from.
SetNetworkMap(*controlclient.NetworkMap)
// SetNetInfoCallback sets the function to call when a // SetNetInfoCallback sets the function to call when a
// new NetInfo summary is available. // new NetInfo summary is available.
SetNetInfoCallback(NetInfoCallback) SetNetInfoCallback(NetInfoCallback)

Loading…
Cancel
Save