net/interfaces: define DefaultRouteInterface and State.DefaultRouteInterface

It was pretty ill-defined before and mostly for logging. But I wanted
to start depending on it, so define what it is and make Windows match
the other operating systems, without losing the log output we had
before. (and add tests for that)

Change-Id: I0fbbba1cfc67a265d09dd6cb738b73f0f6005247
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick
2021-12-29 10:37:33 -08:00
committed by Brad Fitzpatrick
parent 96cab21383
commit 04c2c5bd80
6 changed files with 132 additions and 24 deletions
+7 -6
View File
@@ -5,7 +5,6 @@
package interfaces
import (
"fmt"
"log"
"net"
"net/url"
@@ -217,18 +216,20 @@ func GetWindowsDefault(family winipcfg.AddressFamily) (*winipcfg.IPAdapterAddres
return bestIface, nil
}
func DefaultRouteInterface() (string, error) {
func defaultRoute() (d DefaultRouteDetails, err error) {
// We always return the IPv4 default route.
// TODO(bradfitz): adjust API if/when anything cares. They could in theory differ, though,
// in which case we might send traffic to the wrong interface.
iface, err := GetWindowsDefault(windows.AF_INET)
if err != nil {
return "", err
return d, err
}
if iface == nil {
return "(none)", nil
if iface != nil {
d.InterfaceName = iface.FriendlyName()
d.InterfaceDesc = iface.Description()
d.InterfaceIndex = int(iface.IfIndex)
}
return fmt.Sprintf("%s (%s)", iface.FriendlyName(), iface.Description()), nil
return d, nil
}
var (