wgengine/router: rename config.Settings to config.Config, make pointer.

Signed-off-by: David Anderson <danderson@tailscale.com>
This commit is contained in:
David Anderson
2020-05-12 07:08:52 +00:00
committed by Dave Anderson
parent 72cae5504c
commit 9ccbcda612
13 changed files with 78 additions and 54 deletions

View File

@ -236,7 +236,7 @@ func setFirewall(ifcGUID *windows.GUID) (bool, error) {
return false, nil
}
func configureInterface(rs Settings, tun *tun.NativeTun) error {
func configureInterface(cfg *Config, tun *tun.NativeTun) error {
const mtu = 0
guid := tun.GUID()
log.Printf("wintun GUID is %v\n", guid)
@ -262,13 +262,13 @@ func configureInterface(rs Settings, tun *tun.NativeTun) error {
}
}()
setDNSDomains(guid, rs.DNSDomains)
setDNSDomains(guid, cfg.DNSDomains)
routes := []winipcfg.RouteData{}
var firstGateway4 *net.IP
var firstGateway6 *net.IP
addresses := make([]*net.IPNet, len(rs.LocalAddrs))
for i, addr := range rs.LocalAddrs {
addresses := make([]*net.IPNet, len(cfg.LocalAddrs))
for i, addr := range cfg.LocalAddrs {
ipnet := addr.IPNet()
addresses[i] = ipnet
gateway := ipnet.IP
@ -281,7 +281,7 @@ func configureInterface(rs Settings, tun *tun.NativeTun) error {
foundDefault4 := false
foundDefault6 := false
for _, route := range rs.Routes {
for _, route := range cfg.Routes {
if (route.IP.Is4() && firstGateway4 == nil) || (route.IP.Is6() && firstGateway6 == nil) {
return errors.New("Due to a Windows limitation, one cannot have interface routes without an interface address")
}
@ -359,7 +359,7 @@ func configureInterface(rs Settings, tun *tun.NativeTun) error {
}
var dnsIPs []net.IP
for _, ip := range rs.DNS {
for _, ip := range cfg.DNS {
dnsIPs = append(dnsIPs, ip.IPAddr().IP)
}
err = iface.SetDNS(dnsIPs)

View File

@ -20,10 +20,10 @@ type Router interface {
// Up brings the router up.
Up() error
// Set updates the OS network stack with new settings. It may be
// called multiple times with identical Settings, which the
// Set updates the OS network stack with a new Config. It may be
// called multiple times with identical Configs, which the
// implementation should handle gracefully.
Set(Settings) error
Set(*Config) error
// Close closes the router.
Close() error
@ -35,9 +35,9 @@ func New(logf logger.Logf, wgdev *device.Device, tundev tun.Device) (Router, err
return newUserspaceRouter(logf, wgdev, tundev)
}
// Settings is the subset of Tailscale configuration that is relevant
// to the OS's network stack.
type Settings struct {
// Config is the subset of Tailscale configuration that is relevant to
// the OS's network stack.
type Config struct {
LocalAddrs []netaddr.IPPrefix
DNS []netaddr.IP
DNSDomains []string
@ -45,3 +45,12 @@ type Settings struct {
SubnetRoutes []netaddr.IPPrefix // subnets being advertised to other Tailscale nodes
NoSNAT bool // don't SNAT traffic to local subnets
}
// shutdownConfig is a routing configuration that removes all router
// state from the OS. It's the config used when callers pass in a nil
// Config.
var shutdownConfig = Config{
// TODO(danderson): set more things in here to disable all
// firewall rules and routing overrides when nil.
NoSNAT: true,
}

View File

@ -26,11 +26,14 @@ func (r *darwinRouter) Up() error {
return nil
}
func (r *darwinRouter) Set(rs Settings) error {
if SetRoutesFunc != nil {
return SetRoutesFunc(rs)
func (r *darwinRouter) Set(cfg *Config) error {
if SetRoutesFunc == nil {
return nil
}
return nil
if cfg == nil {
cfg = &shutdownConfig
}
return SetRoutesFunc(cfg)
}
func (r *darwinRouter) Close() error {

View File

@ -7,7 +7,7 @@
package router
// SetRoutesFunc applies the given router settings to the OS network
// stack.
// stack. cfg is guaranteed to be non-nil.
//
// This is logically part of the router_darwin.go implementation, and
// should not be used on other platforms.
@ -22,4 +22,4 @@ package router
// as MacOS, so that we don't have to wait until the Mac CI to
// discover that we broke it. So this one definition needs to exist in
// both the darwin and linux builds. Hence this file and build tag.
var SetRoutesFunc func(rs Settings) error
var SetRoutesFunc func(cfg *Config) error

View File

@ -25,7 +25,7 @@ func (r fakeRouter) Up() error {
return nil
}
func (r fakeRouter) Set(rs Settings) error {
func (r fakeRouter) Set(cfg *Config) error {
r.logf("Warning: fakeRouter.Set: not implemented.")
return nil
}

View File

@ -55,15 +55,18 @@ func (r *freebsdRouter) Up() error {
return nil
}
func (r *freebsdRouter) Set(rs Settings) error {
if len(rs.LocalAddrs) == 0 {
func (r *freebsdRouter) Set(cfg *Config) error {
if cfg == nil {
cfg = &shutdownConfig
}
if len(cfg.LocalAddrs) == 0 {
return nil
}
// TODO: support configuring multiple local addrs on interface.
if len(rs.LocalAddrs) != 1 {
if len(cfg.LocalAddrs) != 1 {
return errors.New("freebsd doesn't support setting multiple local addrs yet")
}
localAddr := rs.LocalAddrs[0]
localAddr := cfg.LocalAddrs[0]
var errq error
@ -95,7 +98,7 @@ func (r *freebsdRouter) Set(rs Settings) error {
}
newRoutes := make(map[netaddr.IPPrefix]struct{})
for _, route := range rs.Routes {
for _, route := range cfg.Routes {
newRoutes[route] = struct{}{}
}
// Delete any pre-existing routes.
@ -139,7 +142,7 @@ func (r *freebsdRouter) Set(rs Settings) error {
r.local = localAddr
r.routes = newRoutes
if err := r.replaceResolvConf(rs.DNS, rs.DNSDomains); err != nil {
if err := r.replaceResolvConf(cfg.DNS, cfg.DNSDomains); err != nil {
errq = fmt.Errorf("replacing resolv.conf failed: %v", err)
}

View File

@ -141,7 +141,11 @@ func (r *linuxRouter) Close() error {
}
// Set implements the Router interface.
func (r *linuxRouter) Set(rs Settings) error {
func (r *linuxRouter) Set(cfg *Config) error {
if cfg == nil {
cfg = &shutdownConfig
}
// cidrDiff calls add and del as needed to make the set of prefixes in
// old and new match. Returns a map version of new, and the first
// error encountered while reconfiguring, if any.
@ -182,23 +186,23 @@ func (r *linuxRouter) Set(rs Settings) error {
var errq error
newAddrs, err := cidrDiff("addr", r.addrs, rs.LocalAddrs, r.addAddress, r.delAddress)
newAddrs, err := cidrDiff("addr", r.addrs, cfg.LocalAddrs, r.addAddress, r.delAddress)
if err != nil && errq == nil {
errq = err
}
newRoutes, err := cidrDiff("route", r.routes, rs.Routes, r.addRoute, r.delRoute)
newRoutes, err := cidrDiff("route", r.routes, cfg.Routes, r.addRoute, r.delRoute)
if err != nil && errq == nil {
errq = err
}
newSubnetRoutes, err := cidrDiff("subnet rule", r.subnetRoutes, rs.SubnetRoutes, r.addSubnetRule, r.delSubnetRule)
newSubnetRoutes, err := cidrDiff("subnet rule", r.subnetRoutes, cfg.SubnetRoutes, r.addSubnetRule, r.delSubnetRule)
if err != nil && errq == nil {
errq = err
}
switch {
case rs.NoSNAT == r.noSNAT:
case cfg.NoSNAT == r.noSNAT:
// state already correct, nothing to do.
case rs.NoSNAT:
case cfg.NoSNAT:
if err := r.delSNATRule(); err != nil && errq == nil {
errq = err
}
@ -211,11 +215,11 @@ func (r *linuxRouter) Set(rs Settings) error {
r.addrs = newAddrs
r.routes = newRoutes
r.subnetRoutes = newSubnetRoutes
r.noSNAT = rs.NoSNAT
r.noSNAT = cfg.NoSNAT
// TODO: this:
if false {
if err := r.replaceResolvConf(rs.DNS, rs.DNSDomains); err != nil {
if err := r.replaceResolvConf(cfg.DNS, cfg.DNSDomains); err != nil {
errq = fmt.Errorf("replacing resolv.conf failed: %v", err)
}
}

View File

@ -60,12 +60,16 @@ func (r *openbsdRouter) Up() error {
return nil
}
func (r *openbsdRouter) Set(rs Settings) error {
func (r *openbsdRouter) Set(cfg *Config) error {
if cfg == nil {
cfg = &shutdownConfig
}
// TODO: support configuring multiple local addrs on interface.
if len(rs.LocalAddrs) != 1 {
if len(cfg.LocalAddrs) != 1 {
return errors.New("freebsd doesn't support setting multiple local addrs yet")
}
localAddr := rs.LocalAddrs[0]
localAddr := cfg.LocalAddrs[0]
var errq error
@ -114,7 +118,7 @@ func (r *openbsdRouter) Set(rs Settings) error {
}
newRoutes := make(map[netaddr.IPPrefix]struct{})
for _, route := range rs.Routes {
for _, route := range cfg.Routes {
newRoutes[route] = struct{}{}
}
for route := range r.routes {
@ -155,7 +159,7 @@ func (r *openbsdRouter) Set(rs Settings) error {
r.local = localAddr
r.routes = newRoutes
if err := r.replaceResolvConf(rs.DNS, rs.DNSDomains); err != nil {
if err := r.replaceResolvConf(cfg.DNS, cfg.DNSDomains); err != nil {
errq = fmt.Errorf("replacing resolv.conf failed: %v", err)
}

View File

@ -45,8 +45,12 @@ func (r *winRouter) Up() error {
return nil
}
func (r *winRouter) Set(rs Settings) error {
err := configureInterface(rs, r.nativeTun)
func (r *winRouter) Set(cfg *Config) error {
if cfg == nil {
cfg = &shutdownConfig
}
err := configureInterface(cfg, r.nativeTun)
if err != nil {
r.logf("ConfigureInterface: %v\n", err)
return err