wgengine/router: alter API to support multiple addrs, and use on linux.

FreeBSD and OpenBSD will error out with a complaint if we pass >1 address
right now, but we don't yet so that's okay.
This commit is contained in:
David Anderson
2020-05-08 00:18:18 +00:00
parent 6802481bf5
commit 8861bb5a19
5 changed files with 61 additions and 32 deletions

View File

@@ -51,7 +51,7 @@ const (
type linuxRouter struct {
logf func(fmt string, args ...interface{})
tunname string
local wgcfg.CIDR
addrs map[wgcfg.CIDR]bool
routes map[wgcfg.CIDR]bool
subnetRoutes map[wgcfg.CIDR]bool
@@ -117,8 +117,9 @@ func (r *linuxRouter) down() error {
return err
}
r.routes = map[wgcfg.CIDR]bool{}
r.local = wgcfg.CIDR{}
r.addrs = nil
r.routes = nil
r.subnetRoutes = nil
return nil
}
@@ -140,16 +141,26 @@ func (r *linuxRouter) Close() error {
func (r *linuxRouter) SetRoutes(rs RouteSettings) error {
var errq error
if rs.LocalAddr != r.local {
if r.local != (wgcfg.CIDR{}) {
if err := r.delAddress(r.local); err != nil {
r.logf("addr del failed: %v", err)
if errq == nil {
errq = err
}
newAddrs := make(map[wgcfg.CIDR]bool)
for _, addr := range rs.LocalAddrs {
newAddrs[addr] = true
}
for addr := range r.addrs {
if newAddrs[addr] {
continue
}
if err := r.delAddress(addr); err != nil {
r.logf("addr del failed: %v", err)
if errq == nil {
errq = err
}
}
if err := r.addAddress(rs.LocalAddr); err != nil {
}
for addr := range newAddrs {
if r.addrs[addr] {
continue
}
if err := r.addAddress(addr); err != nil {
r.logf("addr add failed: %v", err)
if errq == nil {
errq = err
@@ -213,7 +224,7 @@ func (r *linuxRouter) SetRoutes(rs RouteSettings) error {
}
}
r.local = rs.LocalAddr
r.addrs = newAddrs
r.routes = newRoutes
r.subnetRoutes = newSubnetRoutes