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)
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

View File

@ -16,18 +16,19 @@
"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
}
}