Update
This commit is contained in:
83
vendor/tailscale.com/wgengine/router/router.go
generated
vendored
83
vendor/tailscale.com/wgengine/router/router.go
generated
vendored
@@ -6,14 +6,21 @@
|
||||
package router
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/netip"
|
||||
"reflect"
|
||||
"runtime"
|
||||
"slices"
|
||||
|
||||
"github.com/tailscale/wireguard-go/tun"
|
||||
"tailscale.com/feature"
|
||||
"tailscale.com/feature/buildfeatures"
|
||||
"tailscale.com/health"
|
||||
"tailscale.com/net/netmon"
|
||||
"tailscale.com/types/logger"
|
||||
"tailscale.com/types/preftype"
|
||||
"tailscale.com/util/eventbus"
|
||||
)
|
||||
|
||||
// Router is responsible for managing the system network stack.
|
||||
@@ -28,33 +35,70 @@ type Router interface {
|
||||
// implementation should handle gracefully.
|
||||
Set(*Config) error
|
||||
|
||||
// UpdateMagicsockPort tells the OS network stack what port magicsock
|
||||
// is currently listening on, so it can be threaded through firewalls
|
||||
// and such. This is distinct from Set() since magicsock may rebind
|
||||
// ports independently from the Config changing.
|
||||
//
|
||||
// network should be either "udp4" or "udp6".
|
||||
UpdateMagicsockPort(port uint16, network string) error
|
||||
|
||||
// Close closes the router.
|
||||
Close() error
|
||||
}
|
||||
|
||||
// NewOpts are the options passed to the NewUserspaceRouter hook.
|
||||
type NewOpts struct {
|
||||
Logf logger.Logf // required
|
||||
Tun tun.Device // required
|
||||
NetMon *netmon.Monitor // optional
|
||||
Health *health.Tracker // required (but TODO: support optional later)
|
||||
Bus *eventbus.Bus // required
|
||||
}
|
||||
|
||||
// PortUpdate is an eventbus value, reporting the port and address family
|
||||
// magicsock is currently listening on, so it can be threaded through firewalls
|
||||
// and such.
|
||||
type PortUpdate struct {
|
||||
UDPPort uint16
|
||||
EndpointNetwork string // either "udp4" or "udp6".
|
||||
}
|
||||
|
||||
// HookNewUserspaceRouter is the registration point for router implementations
|
||||
// to register a constructor for userspace routers. It's meant for implementations
|
||||
// in wgengine/router/osrouter.
|
||||
//
|
||||
// If no implementation is registered, [New] will return an error.
|
||||
var HookNewUserspaceRouter feature.Hook[func(NewOpts) (Router, error)]
|
||||
|
||||
// New returns a new Router for the current platform, using the
|
||||
// provided tun device.
|
||||
//
|
||||
// If netMon is nil, it's not used. It's currently (2021-07-20) only
|
||||
// used on Linux in some situations.
|
||||
func New(logf logger.Logf, tundev tun.Device, netMon *netmon.Monitor, health *health.Tracker) (Router, error) {
|
||||
func New(logf logger.Logf, tundev tun.Device, netMon *netmon.Monitor,
|
||||
health *health.Tracker, bus *eventbus.Bus,
|
||||
) (Router, error) {
|
||||
logf = logger.WithPrefix(logf, "router: ")
|
||||
return newUserspaceRouter(logf, tundev, netMon, health)
|
||||
if f, ok := HookNewUserspaceRouter.GetOk(); ok {
|
||||
return f(NewOpts{
|
||||
Logf: logf,
|
||||
Tun: tundev,
|
||||
NetMon: netMon,
|
||||
Health: health,
|
||||
Bus: bus,
|
||||
})
|
||||
}
|
||||
if !buildfeatures.HasOSRouter {
|
||||
return nil, errors.New("router: tailscaled was built without OSRouter support")
|
||||
}
|
||||
return nil, fmt.Errorf("unsupported OS %q", runtime.GOOS)
|
||||
}
|
||||
|
||||
// HookCleanUp is the optional registration point for router implementations
|
||||
// to register a cleanup function for [CleanUp] to use. It's meant for
|
||||
// implementations in wgengine/router/osrouter.
|
||||
var HookCleanUp feature.Hook[func(_ logger.Logf, _ *netmon.Monitor, ifName string)]
|
||||
|
||||
// CleanUp restores the system network configuration to its original state
|
||||
// in case the Tailscale daemon terminated without closing the router.
|
||||
// No other state needs to be instantiated before this runs.
|
||||
func CleanUp(logf logger.Logf, netMon *netmon.Monitor, interfaceName string) {
|
||||
cleanUp(logf, interfaceName)
|
||||
if f, ok := HookCleanUp.GetOk(); ok {
|
||||
f(logf, netMon, interfaceName)
|
||||
}
|
||||
}
|
||||
|
||||
// Config is the subset of Tailscale configuration that is relevant to
|
||||
@@ -91,7 +135,7 @@ type Config struct {
|
||||
SNATSubnetRoutes bool // SNAT traffic to local subnets
|
||||
StatefulFiltering bool // Apply stateful filtering to inbound connections
|
||||
NetfilterMode preftype.NetfilterMode // how much to manage netfilter rules
|
||||
NetfilterKind string // what kind of netfilter to use (nftables, iptables)
|
||||
NetfilterKind string // what kind of netfilter to use ("nftables", "iptables", or "" to auto-detect)
|
||||
}
|
||||
|
||||
func (a *Config) Equal(b *Config) bool {
|
||||
@@ -104,7 +148,14 @@ func (a *Config) Equal(b *Config) bool {
|
||||
return reflect.DeepEqual(a, b)
|
||||
}
|
||||
|
||||
// shutdownConfig is a routing configuration that removes all router
|
||||
// state from the OS. It's the config used when callers pass in a nil
|
||||
// Config.
|
||||
var shutdownConfig = Config{}
|
||||
func (c *Config) Clone() *Config {
|
||||
if c == nil {
|
||||
return nil
|
||||
}
|
||||
c2 := *c
|
||||
c2.LocalAddrs = slices.Clone(c.LocalAddrs)
|
||||
c2.Routes = slices.Clone(c.Routes)
|
||||
c2.LocalRoutes = slices.Clone(c.LocalRoutes)
|
||||
c2.SubnetRoutes = slices.Clone(c.SubnetRoutes)
|
||||
return &c2
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user