mirror of
https://github.com/tailscale/tailscale.git
synced 2026-03-04 04:51:22 +01:00
wgengine/router: pull out interface method only needed in Linux
Instead of having userspace do the call into the router, just let the router pick up the change itself. Updates #15160 Signed-off-by: Claus Lensbøl <claus@tailscale.com>
This commit is contained in:
parent
f54d2f3f0e
commit
21cfa2a47c
@ -3464,7 +3464,9 @@ func (c *Conn) listenPacket(network string, port uint16) (nettype.PacketConn, er
|
||||
return nettype.MakePacketListenerWithNetIP(netns.Listener(c.logf, c.netMon)).ListenPacket(ctx, network, addr)
|
||||
}
|
||||
|
||||
// PortUpdate is an eventbus value, reporting the port and address family of a magicsock connection.
|
||||
// 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".
|
||||
|
||||
@ -56,13 +56,6 @@ func (r *CallbackRouter) Set(rcfg *Config) error {
|
||||
return r.SetBoth(r.rcfg, r.dcfg)
|
||||
}
|
||||
|
||||
// UpdateMagicsockPort implements the Router interface. This implementation
|
||||
// does nothing and returns nil because this router does not currently need
|
||||
// to know what the magicsock UDP port is.
|
||||
func (r *CallbackRouter) UpdateMagicsockPort(_ uint16, _ string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetDNS implements dns.OSConfigurator.
|
||||
func (r *CallbackRouter) SetDNS(dcfg dns.OSConfig) error {
|
||||
r.mu.Lock()
|
||||
|
||||
@ -34,6 +34,7 @@ import (
|
||||
"tailscale.com/util/eventbus"
|
||||
"tailscale.com/util/linuxfw"
|
||||
"tailscale.com/version/distro"
|
||||
"tailscale.com/wgengine/magicsock"
|
||||
"tailscale.com/wgengine/router"
|
||||
)
|
||||
|
||||
@ -171,6 +172,7 @@ func newUserspaceRouterAdvanced(logf logger.Logf, tunname string, netMon *netmon
|
||||
// [eventbus.Client] is closed.
|
||||
func (r *linuxRouter) consumeEventbusTopics(ec *eventbus.Client) func(*eventbus.Client) {
|
||||
ruleDeletedSub := eventbus.Subscribe[netmon.RuleDeleted](ec)
|
||||
portUpdateSub := eventbus.Subscribe[magicsock.PortUpdate](ec)
|
||||
return func(ec *eventbus.Client) {
|
||||
for {
|
||||
select {
|
||||
@ -178,6 +180,11 @@ func (r *linuxRouter) consumeEventbusTopics(ec *eventbus.Client) func(*eventbus.
|
||||
return
|
||||
case rs := <-ruleDeletedSub.Events():
|
||||
r.onIPRuleDeleted(rs.Table, rs.Priority)
|
||||
case pu := <-portUpdateSub.Events():
|
||||
r.logf("portUpdate(port=%v, network=%s)", pu.UDPPort, pu.EndpointNetwork)
|
||||
if err := r.updateMagicsockPort(pu.UDPPort, pu.EndpointNetwork); err != nil {
|
||||
r.logf("updateMagicsockPort(port=%v, network=%s) failed: %v", pu.UDPPort, pu.EndpointNetwork, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -540,8 +547,8 @@ func (r *linuxRouter) updateStatefulFilteringWithDockerWarning(cfg *router.Confi
|
||||
r.health.SetHealthy(dockerStatefulFilteringWarnable)
|
||||
}
|
||||
|
||||
// UpdateMagicsockPort implements the Router interface.
|
||||
func (r *linuxRouter) UpdateMagicsockPort(port uint16, network string) error {
|
||||
// updateMagicsockPort implements the Router interface.
|
||||
func (r *linuxRouter) updateMagicsockPort(port uint16, network string) error {
|
||||
r.mu.Lock()
|
||||
defer r.mu.Unlock()
|
||||
if r.nfr == nil {
|
||||
|
||||
@ -238,13 +238,6 @@ func (r *openbsdRouter) Set(cfg *router.Config) error {
|
||||
return errq
|
||||
}
|
||||
|
||||
// UpdateMagicsockPort implements the Router interface. This implementation
|
||||
// does nothing and returns nil because this router does not currently need
|
||||
// to know what the magicsock UDP port is.
|
||||
func (r *openbsdRouter) UpdateMagicsockPort(_ uint16, _ string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *openbsdRouter) Close() error {
|
||||
cleanUp(r.logf, r.tunname)
|
||||
return nil
|
||||
|
||||
@ -115,13 +115,6 @@ func (r *plan9Router) Set(cfg *router.Config) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateMagicsockPort implements the Router interface. This implementation
|
||||
// does nothing and returns nil because this router does not currently need
|
||||
// to know what the magicsock UDP port is.
|
||||
func (r *plan9Router) UpdateMagicsockPort(_ uint16, _ string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *plan9Router) Close() error {
|
||||
// TODO(bradfitz): unbind
|
||||
return nil
|
||||
|
||||
@ -206,13 +206,6 @@ func (r *userspaceBSDRouter) Set(cfg *router.Config) (reterr error) {
|
||||
return reterr
|
||||
}
|
||||
|
||||
// UpdateMagicsockPort implements the Router interface. This implementation
|
||||
// does nothing and returns nil because this router does not currently need
|
||||
// to know what the magicsock UDP port is.
|
||||
func (r *userspaceBSDRouter) UpdateMagicsockPort(_ uint16, _ string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *userspaceBSDRouter) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -114,13 +114,6 @@ func hasDefaultRoute(routes []netip.Prefix) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
// UpdateMagicsockPort implements the Router interface. This implementation
|
||||
// does nothing and returns nil because this router does not currently need
|
||||
// to know what the magicsock UDP port is.
|
||||
func (r *winRouter) UpdateMagicsockPort(_ uint16, _ string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *winRouter) Close() error {
|
||||
r.firewall.clear()
|
||||
|
||||
|
||||
@ -34,14 +34,6 @@ 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
|
||||
}
|
||||
|
||||
@ -27,11 +27,6 @@ func (r fakeRouter) Set(cfg *Config) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r fakeRouter) UpdateMagicsockPort(_ uint16, _ string) error {
|
||||
r.logf("[v1] warning: fakeRouter.UpdateMagicsockPort: not implemented.")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r fakeRouter) Close() error {
|
||||
r.logf("[v1] warning: fakeRouter.Close: not implemented.")
|
||||
return nil
|
||||
|
||||
@ -549,7 +549,6 @@ func NewUserspaceEngine(logf logger.Logf, conf Config) (_ Engine, reterr error)
|
||||
// [eventbus.Client] is closed.
|
||||
func (e *userspaceEngine) consumeEventbusTopics(cli *eventbus.Client) func(*eventbus.Client) {
|
||||
changeDeltaSub := eventbus.Subscribe[netmon.ChangeDelta](cli)
|
||||
portUpdateSub := eventbus.Subscribe[magicsock.PortUpdate](cli)
|
||||
return func(cli *eventbus.Client) {
|
||||
for {
|
||||
select {
|
||||
@ -560,11 +559,6 @@ func (e *userspaceEngine) consumeEventbusTopics(cli *eventbus.Client) func(*even
|
||||
f()
|
||||
}
|
||||
e.linkChange(&changeDelta)
|
||||
case pu := <-portUpdateSub.Events():
|
||||
e.logf("portUpdate(port=%v, network=%s)", pu.UDPPort, pu.EndpointNetwork)
|
||||
if err := e.router.UpdateMagicsockPort(pu.UDPPort, pu.EndpointNetwork); err != nil {
|
||||
e.logf("UpdateMagicsockPort(port=%v, network=%s) failed: %v", pu.UDPPort, pu.EndpointNetwork, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user