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

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
pull/1593/head
Brad Fitzpatrick 3 years ago
parent 7dc88e4c1e
commit 5a62aa8047

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

@ -16,18 +16,19 @@ import (
"strconv"
"inet.af/netaddr"
"tailscale.com/net/interfaces"
"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
if initListenConfig != nil {
// On iOS/macOS, this sets the lc.Control hook to
// setsockopt the interface index to bind to, to get
// out of the network sandbox.
if err := initListenConfig(&lc, ip); err != nil {
if err := initListenConfig(&lc, ip, ifState); err != nil {
return nil, err
}
}

Loading…
Cancel
Save