net/netmon, add: add netmon.State type alias of interfaces.State

... in prep for merging the net/interfaces package into net/netmon.

This is a no-op change that updates a bunch of the API signatures ahead of
a future change to actually move things (and remove the type alias)

Updates tailscale/corp#10910
Updates tailscale/corp#18960
Updates #7967
Updates #3299

Change-Id: I477613388f09389214db0d77ccf24a65bff2199c
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick 2024-04-27 21:01:54 -07:00 committed by Brad Fitzpatrick
parent 45f0721530
commit 6b95219e3a
11 changed files with 32 additions and 27 deletions

View File

@ -23,7 +23,6 @@
"tailscale.com/derp/derphttp" "tailscale.com/derp/derphttp"
"tailscale.com/health" "tailscale.com/health"
"tailscale.com/ipn" "tailscale.com/ipn"
"tailscale.com/net/interfaces"
"tailscale.com/net/netmon" "tailscale.com/net/netmon"
"tailscale.com/net/tshttpproxy" "tailscale.com/net/tshttpproxy"
"tailscale.com/tailcfg" "tailscale.com/tailcfg"
@ -73,7 +72,7 @@ func debugMode(args []string) error {
} }
func runMonitor(ctx context.Context, loop bool) error { func runMonitor(ctx context.Context, loop bool) error {
dump := func(st *interfaces.State) { dump := func(st *netmon.State) {
j, _ := json.MarshalIndent(st, "", " ") j, _ := json.MarshalIndent(st, "", " ")
os.Stderr.Write(j) os.Stderr.Write(j)
} }

View File

@ -295,7 +295,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de
tailscale.com/net/dnscache from tailscale.com/control/controlclient+ tailscale.com/net/dnscache from tailscale.com/control/controlclient+
tailscale.com/net/dnsfallback from tailscale.com/cmd/tailscaled+ tailscale.com/net/dnsfallback from tailscale.com/cmd/tailscaled+
tailscale.com/net/flowtrack from tailscale.com/net/packet+ tailscale.com/net/flowtrack from tailscale.com/net/packet+
💣 tailscale.com/net/interfaces from tailscale.com/cmd/tailscaled+ 💣 tailscale.com/net/interfaces from tailscale.com/doctor/ethtool+
tailscale.com/net/netaddr from tailscale.com/ipn+ tailscale.com/net/netaddr from tailscale.com/ipn+
tailscale.com/net/netcheck from tailscale.com/wgengine/magicsock+ tailscale.com/net/netcheck from tailscale.com/wgengine/magicsock+
tailscale.com/net/neterror from tailscale.com/net/dns/resolver+ tailscale.com/net/neterror from tailscale.com/net/dns/resolver+

View File

@ -36,7 +36,6 @@
"tailscale.com/logtail" "tailscale.com/logtail"
"tailscale.com/net/dnscache" "tailscale.com/net/dnscache"
"tailscale.com/net/dnsfallback" "tailscale.com/net/dnsfallback"
"tailscale.com/net/interfaces"
"tailscale.com/net/netmon" "tailscale.com/net/netmon"
"tailscale.com/net/netutil" "tailscale.com/net/netutil"
"tailscale.com/net/tlsdial" "tailscale.com/net/tlsdial"
@ -1284,7 +1283,7 @@ func initDevKnob() devKnobs {
// //
// TODO(bradfitz): Change controlclient.Options.SkipIPForwardingCheck into a // TODO(bradfitz): Change controlclient.Options.SkipIPForwardingCheck into a
// func([]netip.Prefix) error signature instead. // func([]netip.Prefix) error signature instead.
func ipForwardingBroken(routes []netip.Prefix, state *interfaces.State) bool { func ipForwardingBroken(routes []netip.Prefix, state *netmon.State) bool {
warn, err := netutil.CheckIPForwarding(routes, state) warn, err := netutil.CheckIPForwarding(routes, state)
if err != nil { if err != nil {
// Oh well, we tried. This is just for debugging. // Oh well, we tried. This is just for debugging.

View File

@ -258,7 +258,7 @@ type LocalBackend struct {
authURLTime time.Time // when the authURL was received from the control server authURLTime time.Time // when the authURL was received from the control server
interact bool interact bool
egg bool egg bool
prevIfState *interfaces.State prevIfState *netmon.State
peerAPIServer *peerAPIServer // or nil peerAPIServer *peerAPIServer // or nil
peerAPIListeners []*peerAPIListener peerAPIListeners []*peerAPIListener
loginFlags controlclient.LoginFlags loginFlags controlclient.LoginFlags
@ -3066,7 +3066,7 @@ func (b *LocalBackend) isDefaultServerLocked() bool {
// updateExitNodeUsageWarning updates a warnable meant to notify users of // updateExitNodeUsageWarning updates a warnable meant to notify users of
// configuration issues that could break exit node usage. // configuration issues that could break exit node usage.
func updateExitNodeUsageWarning(p ipn.PrefsView, state *interfaces.State, health *health.Tracker) { func updateExitNodeUsageWarning(p ipn.PrefsView, state *netmon.State, health *health.Tracker) {
var result error var result error
if p.ExitNodeIP().IsValid() || p.ExitNodeID() != "" { if p.ExitNodeIP().IsValid() || p.ExitNodeID() != "" {
warn, _ := netutil.CheckReversePathFiltering(state) warn, _ := netutil.CheckReversePathFiltering(state)

View File

@ -36,6 +36,7 @@
"tailscale.com/ipn" "tailscale.com/ipn"
"tailscale.com/net/interfaces" "tailscale.com/net/interfaces"
"tailscale.com/net/netaddr" "tailscale.com/net/netaddr"
"tailscale.com/net/netmon"
"tailscale.com/net/netutil" "tailscale.com/net/netutil"
"tailscale.com/net/sockstats" "tailscale.com/net/sockstats"
"tailscale.com/tailcfg" "tailscale.com/tailcfg"
@ -51,7 +52,7 @@
taildrivePrefix = "/v0/drive" taildrivePrefix = "/v0/drive"
) )
var initListenConfig func(*net.ListenConfig, netip.Addr, *interfaces.State, string) error var initListenConfig func(*net.ListenConfig, netip.Addr, *netmon.State, string) error
// addH2C is non-nil on platforms where we want to add H2C // addH2C is non-nil on platforms where we want to add H2C
// ("cleartext" HTTP/2) support to the peerAPI. // ("cleartext" HTTP/2) support to the peerAPI.
@ -69,7 +70,7 @@ type peerAPIServer struct {
taildrop *taildrop.Manager taildrop *taildrop.Manager
} }
func (s *peerAPIServer) listen(ip netip.Addr, ifState *interfaces.State) (ln net.Listener, err error) { func (s *peerAPIServer) listen(ip netip.Addr, ifState *netmon.State) (ln net.Listener, err error) {
// Android for whatever reason often has problems creating the peerapi listener. // Android for whatever reason often has problems creating the peerapi listener.
// But since we started intercepting it with netstack, it's not even important that // But since we started intercepting it with netstack, it's not even important that
// we have a real kernel-level listener. So just create a dummy listener on Android // we have a real kernel-level listener. So just create a dummy listener on Android

View File

@ -10,7 +10,7 @@
"net" "net"
"net/netip" "net/netip"
"tailscale.com/net/interfaces" "tailscale.com/net/netmon"
"tailscale.com/net/netns" "tailscale.com/net/netns"
) )
@ -21,7 +21,7 @@ func init() {
// initListenConfigNetworkExtension configures nc for listening on IP // initListenConfigNetworkExtension configures nc for listening on IP
// through the iOS/macOS Network/System Extension (Packet Tunnel // through the iOS/macOS Network/System Extension (Packet Tunnel
// Provider) sandbox. // Provider) sandbox.
func initListenConfigNetworkExtension(nc *net.ListenConfig, ip netip.Addr, st *interfaces.State, tunIfName string) error { func initListenConfigNetworkExtension(nc *net.ListenConfig, ip netip.Addr, st *netmon.State, tunIfName string) error {
tunIf, ok := st.Interface[tunIfName] tunIf, ok := st.Interface[tunIfName]
if !ok { if !ok {
return fmt.Errorf("no interface with name %q", tunIfName) return fmt.Errorf("no interface with name %q", tunIfName)

View File

@ -27,7 +27,6 @@
"tailscale.com/derp/derphttp" "tailscale.com/derp/derphttp"
"tailscale.com/envknob" "tailscale.com/envknob"
"tailscale.com/net/dnscache" "tailscale.com/net/dnscache"
"tailscale.com/net/interfaces"
"tailscale.com/net/neterror" "tailscale.com/net/neterror"
"tailscale.com/net/netmon" "tailscale.com/net/netmon"
"tailscale.com/net/netns" "tailscale.com/net/netns"
@ -389,7 +388,7 @@ func sortRegions(dm *tailcfg.DERPMap, last *Report) (prev []*tailcfg.DERPRegion)
// makeProbePlan generates the probe plan for a DERPMap, given the most // makeProbePlan generates the probe plan for a DERPMap, given the most
// recent report and whether IPv6 is configured on an interface. // recent report and whether IPv6 is configured on an interface.
func makeProbePlan(dm *tailcfg.DERPMap, ifState *interfaces.State, last *Report) (plan probePlan) { func makeProbePlan(dm *tailcfg.DERPMap, ifState *State, last *Report) (plan probePlan) {
if last == nil || len(last.RegionLatency) == 0 { if last == nil || len(last.RegionLatency) == 0 {
return makeProbePlanInitial(dm, ifState) return makeProbePlanInitial(dm, ifState)
} }
@ -469,7 +468,7 @@ func makeProbePlan(dm *tailcfg.DERPMap, ifState *interfaces.State, last *Report)
return plan return plan
} }
func makeProbePlanInitial(dm *tailcfg.DERPMap, ifState *interfaces.State) (plan probePlan) { func makeProbePlanInitial(dm *tailcfg.DERPMap, ifState *netmon.State) (plan probePlan) {
plan = make(probePlan) plan = make(probePlan)
for _, reg := range dm.Regions { for _, reg := range dm.Regions {

View File

@ -18,7 +18,6 @@
"testing" "testing"
"time" "time"
"tailscale.com/net/interfaces"
"tailscale.com/net/netmon" "tailscale.com/net/netmon"
"tailscale.com/net/stun" "tailscale.com/net/stun"
"tailscale.com/net/stun/stuntest" "tailscale.com/net/stun/stuntest"
@ -673,7 +672,7 @@ func TestMakeProbePlan(t *testing.T) {
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
ifState := &interfaces.State{ ifState := &netmon.State{
HaveV6: tt.have6if, HaveV6: tt.have6if,
HaveV4: !tt.no4, HaveV4: !tt.no4,
} }

View File

@ -64,7 +64,7 @@ type Monitor struct {
mu sync.Mutex // guards all following fields mu sync.Mutex // guards all following fields
cbs set.HandleSet[ChangeFunc] cbs set.HandleSet[ChangeFunc]
ruleDelCB set.HandleSet[RuleDeleteCallback] ruleDelCB set.HandleSet[RuleDeleteCallback]
ifState *interfaces.State ifState *State
gwValid bool // whether gw and gwSelfIP are valid gwValid bool // whether gw and gwSelfIP are valid
gw netip.Addr // our gateway's IP gw netip.Addr // our gateway's IP
gwSelfIP netip.Addr // our own IP address (that corresponds to gw) gwSelfIP netip.Addr // our own IP address (that corresponds to gw)
@ -88,12 +88,12 @@ type ChangeDelta struct {
// Old is the old interface state, if known. // Old is the old interface state, if known.
// It's nil if the old state is unknown. // It's nil if the old state is unknown.
// Do not mutate it. // Do not mutate it.
Old *interfaces.State Old *State
// New is the new network state. // New is the new network state.
// It is always non-nil. // It is always non-nil.
// Do not mutate it. // Do not mutate it.
New *interfaces.State New *State
// Major is our legacy boolean of whether the network changed in some major // Major is our legacy boolean of whether the network changed in some major
// way. // way.
@ -155,13 +155,13 @@ func NewStatic() *Monitor {
// interfaces. // interfaces.
// //
// The returned value is owned by Mon; it must not be modified. // The returned value is owned by Mon; it must not be modified.
func (m *Monitor) InterfaceState() *interfaces.State { func (m *Monitor) InterfaceState() *State {
m.mu.Lock() m.mu.Lock()
defer m.mu.Unlock() defer m.mu.Unlock()
return m.ifState return m.ifState
} }
func (m *Monitor) interfaceStateUncached() (*interfaces.State, error) { func (m *Monitor) interfaceStateUncached() (*State, error) {
return interfaces.GetState() return interfaces.GetState()
} }
@ -421,7 +421,7 @@ func (m *Monitor) debounce() {
// up callers and updates the monitor's state if so. // up callers and updates the monitor's state if so.
// //
// If forceCallbacks is true, they're always notified. // If forceCallbacks is true, they're always notified.
func (m *Monitor) handlePotentialChange(newState *interfaces.State, forceCallbacks bool) { func (m *Monitor) handlePotentialChange(newState *State, forceCallbacks bool) {
m.mu.Lock() m.mu.Lock()
defer m.mu.Unlock() defer m.mu.Unlock()
oldState := m.ifState oldState := m.ifState
@ -476,7 +476,7 @@ func (m *Monitor) handlePotentialChange(newState *interfaces.State, forceCallbac
// a bunch of connections and rebinding. // a bunch of connections and rebinding.
// //
// TODO(bradiftz): tigten this definition. // TODO(bradiftz): tigten this definition.
func (m *Monitor) IsMajorChangeFrom(s1, s2 *interfaces.State) bool { func (m *Monitor) IsMajorChangeFrom(s1, s2 *State) bool {
if s1 == nil && s2 == nil { if s1 == nil && s2 == nil {
return false return false
} }

8
net/netmon/state.go Normal file
View File

@ -0,0 +1,8 @@
// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause
package netmon
import "tailscale.com/net/interfaces"
type State = interfaces.State // temporary (2024-04-27) alias during multi-step removal of net/interfaces

View File

@ -16,13 +16,13 @@
"strconv" "strconv"
"strings" "strings"
"tailscale.com/net/interfaces" "tailscale.com/net/netmon"
) )
// protocolsRequiredForForwarding reports whether IPv4 and/or IPv6 protocols are // protocolsRequiredForForwarding reports whether IPv4 and/or IPv6 protocols are
// required to forward the specified routes. // required to forward the specified routes.
// The state param must be specified. // The state param must be specified.
func protocolsRequiredForForwarding(routes []netip.Prefix, state *interfaces.State) (v4, v6 bool) { func protocolsRequiredForForwarding(routes []netip.Prefix, state *netmon.State) (v4, v6 bool) {
if len(routes) == 0 { if len(routes) == 0 {
// Nothing to route, so no need to warn. // Nothing to route, so no need to warn.
return false, false return false, false
@ -59,7 +59,7 @@ func protocolsRequiredForForwarding(routes []netip.Prefix, state *interfaces.Sta
// It returns an error if it is unable to determine if IP forwarding is enabled. // It returns an error if it is unable to determine if IP forwarding is enabled.
// It returns a warning describing configuration issues if IP forwarding is // It returns a warning describing configuration issues if IP forwarding is
// non-functional or partly functional. // non-functional or partly functional.
func CheckIPForwarding(routes []netip.Prefix, state *interfaces.State) (warn, err error) { func CheckIPForwarding(routes []netip.Prefix, state *netmon.State) (warn, err error) {
if runtime.GOOS != "linux" { if runtime.GOOS != "linux" {
switch runtime.GOOS { switch runtime.GOOS {
case "dragonfly", "freebsd", "netbsd", "openbsd": case "dragonfly", "freebsd", "netbsd", "openbsd":
@ -152,7 +152,7 @@ func CheckIPForwarding(routes []netip.Prefix, state *interfaces.State) (warn, er
// This function returns an error if it is unable to determine whether reverse // This function returns an error if it is unable to determine whether reverse
// path filtering is enabled, or a warning describing configuration issues if // path filtering is enabled, or a warning describing configuration issues if
// reverse path fitering is non-functional or partly functional. // reverse path fitering is non-functional or partly functional.
func CheckReversePathFiltering(state *interfaces.State) (warn []string, err error) { func CheckReversePathFiltering(state *netmon.State) (warn []string, err error) {
if runtime.GOOS != "linux" { if runtime.GOOS != "linux" {
return nil, nil return nil, nil
} }