From 8e40bfc6ea420318d109b721e4b07707cfc4ba4d Mon Sep 17 00:00:00 2001 From: Maisem Ali Date: Wed, 20 Apr 2022 12:03:50 -0700 Subject: [PATCH] wgengine/monitor: ignore OS-specific uninteresting interfaces Currently we ignore these interfaces in the darwin osMon but then would consider it interesting when checking if anything had changed. Signed-off-by: Maisem Ali --- wgengine/monitor/monitor.go | 13 ++++++++++++- wgengine/monitor/monitor_darwin.go | 13 ++++++++++--- wgengine/monitor/monitor_freebsd.go | 2 ++ wgengine/monitor/monitor_linux.go | 2 ++ wgengine/monitor/monitor_windows.go | 2 ++ wgengine/monitor/polling.go | 4 ++++ 6 files changed, 32 insertions(+), 4 deletions(-) diff --git a/wgengine/monitor/monitor.go b/wgengine/monitor/monitor.go index d2ddfb8c3..a954867fe 100644 --- a/wgengine/monitor/monitor.go +++ b/wgengine/monitor/monitor.go @@ -42,6 +42,10 @@ type osMon interface { // until the osMon is closed. After a Close, the returned // error is ignored. Receive() (message, error) + + // IsInterestingInterface reports whether the provided interface should + // be considered for network change events. + IsInterestingInterface(iface string) bool } // ChangeFunc is a callback function that's called when the network @@ -282,6 +286,13 @@ func (m *Mon) notifyRuleDeleted(rdm ipRuleDeletedMessage) { } } +// isInterestingInterface reports whether the provided interface should be +// considered when checking for network state changes. +// The ips parameter should be the IPs of the provided interface. +func (m *Mon) isInterestingInterface(i interfaces.Interface, ips []netaddr.IPPrefix) bool { + return m.om.IsInterestingInterface(i.Name) && interfaces.UseInterestingInterfaces(i, ips) +} + // debounce calls the callback function with a delay between events // and exits when a stop is issued. func (m *Mon) debounce() { @@ -299,7 +310,7 @@ func (m *Mon) debounce() { m.mu.Lock() oldState := m.ifState - changed := !curState.EqualFiltered(oldState, interfaces.UseInterestingInterfaces, interfaces.UseInterestingIPs) + changed := !curState.EqualFiltered(oldState, m.isInterestingInterface, interfaces.UseInterestingIPs) if changed { m.gwValid = false m.ifState = curState diff --git a/wgengine/monitor/monitor_darwin.go b/wgengine/monitor/monitor_darwin.go index 0dd4ef2ed..c37bbd00c 100644 --- a/wgengine/monitor/monitor_darwin.go +++ b/wgengine/monitor/monitor_darwin.go @@ -112,11 +112,18 @@ func addrType(addrs []route.Addr, rtaxType int) route.Addr { return nil } +func (m *darwinRouteMon) IsInterestingInterface(iface string) bool { + baseName := strings.TrimRight(iface, "0123456789") + switch baseName { + case "llw", "awdl", "pdp_ip", "ipsec": + return false + } + return true +} + func (m *darwinRouteMon) skipInterfaceAddrMessage(msg *route.InterfaceAddrMessage) bool { if la, ok := addrType(msg.Addrs, unix.RTAX_IFP).(*route.LinkAddr); ok { - baseName := strings.TrimRight(la.Name, "0123456789") - switch baseName { - case "llw", "awdl", "pdp_ip", "ipsec": + if !m.IsInterestingInterface(la.Name) { return true } } diff --git a/wgengine/monitor/monitor_freebsd.go b/wgengine/monitor/monitor_freebsd.go index 7e0e8c258..f2f85fa85 100644 --- a/wgengine/monitor/monitor_freebsd.go +++ b/wgengine/monitor/monitor_freebsd.go @@ -34,6 +34,8 @@ func newOSMon(logf logger.Logf, m *Mon) (osMon, error) { return &devdConn{conn}, nil } +func (c *devdConn) IsInterestingInterface(iface string) bool { return true } + func (c *devdConn) Close() error { return c.conn.Close() } diff --git a/wgengine/monitor/monitor_linux.go b/wgengine/monitor/monitor_linux.go index 92b5fe54b..1537ec13b 100644 --- a/wgengine/monitor/monitor_linux.go +++ b/wgengine/monitor/monitor_linux.go @@ -64,6 +64,8 @@ func newOSMon(logf logger.Logf, m *Mon) (osMon, error) { return &nlConn{logf: logf, conn: conn, addrCache: make(map[uint32]map[netaddr.IP]bool)}, nil } +func (c *nlConn) IsInterestingInterface(iface string) bool { return true } + func (c *nlConn) Close() error { return c.conn.Close() } func (c *nlConn) Receive() (message, error) { diff --git a/wgengine/monitor/monitor_windows.go b/wgengine/monitor/monitor_windows.go index 027c0c557..13eca8d2c 100644 --- a/wgengine/monitor/monitor_windows.go +++ b/wgengine/monitor/monitor_windows.go @@ -72,6 +72,8 @@ func newOSMon(logf logger.Logf, _ *Mon) (osMon, error) { return m, nil } +func (m *winMon) IsInterestingInterface(iface string) bool { return true } + func (m *winMon) Close() (ret error) { m.cancel() m.noDeadlockTicker.Stop() diff --git a/wgengine/monitor/polling.go b/wgengine/monitor/polling.go index 85f980ae7..2ec5383a3 100644 --- a/wgengine/monitor/polling.go +++ b/wgengine/monitor/polling.go @@ -38,6 +38,10 @@ type pollingMon struct { stop chan struct{} } +func (pm *pollingMon) IsInterestingInterface(iface string) bool { + return true +} + func (pm *pollingMon) Close() error { pm.closeOnce.Do(func() { close(pm.stop)