ipn/ipnlocal: pass down interface state to peerapi ListenConfig hook

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick 2021-03-25 21:41:37 -07:00
parent 7dc88e4c1e
commit 5a62aa8047
2 changed files with 6 additions and 4 deletions

View File

@ -143,6 +143,7 @@ func NewLocalBackend(logf logger.Logf, logid string, store ipn.StateStore, e wge
b.statusChanged = sync.NewCond(&b.statusLock) b.statusChanged = sync.NewCond(&b.statusLock)
linkMon := e.GetLinkMonitor() linkMon := e.GetLinkMonitor()
b.prevIfState = linkMon.InterfaceState()
// Call our linkChange code once with the current state, and // Call our linkChange code once with the current state, and
// then also whenever it changes: // then also whenever it changes:
b.linkChange(false, linkMon.InterfaceState()) b.linkChange(false, linkMon.InterfaceState())
@ -1446,7 +1447,7 @@ func (b *LocalBackend) initPeerAPIListener() {
b.peerAPIListeners = nil b.peerAPIListeners = nil
for _, a := range b.netMap.Addresses { for _, a := range b.netMap.Addresses {
ln, err := peerAPIListen(a.IP) ln, err := peerAPIListen(a.IP, b.prevIfState)
if err != nil { if err != nil {
b.logf("[unexpected] peerAPI listen(%q) error: %v", a.IP, err) b.logf("[unexpected] peerAPI listen(%q) error: %v", a.IP, err)
continue continue

View File

@ -16,18 +16,19 @@
"strconv" "strconv"
"inet.af/netaddr" "inet.af/netaddr"
"tailscale.com/net/interfaces"
"tailscale.com/tailcfg" "tailscale.com/tailcfg"
) )
var initListenConfig func(*net.ListenConfig, netaddr.IP) error var initListenConfig func(*net.ListenConfig, netaddr.IP, *interfaces.State) error
func peerAPIListen(ip netaddr.IP) (ln net.Listener, err error) { func peerAPIListen(ip netaddr.IP, ifState *interfaces.State) (ln net.Listener, err error) {
var lc net.ListenConfig var lc net.ListenConfig
if initListenConfig != nil { if initListenConfig != nil {
// On iOS/macOS, this sets the lc.Control hook to // On iOS/macOS, this sets the lc.Control hook to
// setsockopt the interface index to bind to, to get // setsockopt the interface index to bind to, to get
// out of the network sandbox. // out of the network sandbox.
if err := initListenConfig(&lc, ip); err != nil { if err := initListenConfig(&lc, ip, ifState); err != nil {
return nil, err return nil, err
} }
} }