mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-29 04:55:31 +00:00
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:
parent
45f0721530
commit
6b95219e3a
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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+
|
||||||
|
@ -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.
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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 {
|
||||||
|
@ -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,
|
||||||
}
|
}
|
||||||
|
@ -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
8
net/netmon/state.go
Normal 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
|
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user