@ -712,14 +712,26 @@ func (b *LocalBackend) linkChange(delta *netmon.ChangeDelta) {
if delta . Major && shouldAutoExitNode ( ) {
if delta . Major && shouldAutoExitNode ( ) {
b . refreshAutoExitNode = true
b . refreshAutoExitNode = true
}
}
// If the PAC-ness of the network changed, reconfig wireguard+route to
// add/remove subnets.
var needReconfig bool
// If the network changed and we're using an exit node and allowing LAN access, we may need to reconfigure.
if delta . Major && b . pm . CurrentPrefs ( ) . ExitNodeID ( ) != "" && b . pm . CurrentPrefs ( ) . ExitNodeAllowLANAccess ( ) {
b . logf ( "linkChange: in state %v; updating LAN routes" , b . state )
needReconfig = true
}
// If the PAC-ness of the network changed, reconfig wireguard+route to add/remove subnets.
if hadPAC != ifst . HasPAC ( ) {
if hadPAC != ifst . HasPAC ( ) {
b . logf ( "linkChange: in state %v; PAC changed from %v->%v" , b . state , hadPAC , ifst . HasPAC ( ) )
b . logf ( "linkChange: in state %v; PAC changed from %v->%v" , b . state , hadPAC , ifst . HasPAC ( ) )
needReconfig = true
}
if needReconfig {
switch b . state {
switch b . state {
case ipn . NoState , ipn . Stopped :
case ipn . NoState , ipn . Stopped :
// Do nothing.
// Do nothing.
default :
default :
// TODO(raggi,tailscale/corp#22574): authReconfig should be refactored such that we can call the
// necessary operations here and avoid the need for asynchronous behavior that is racy and hard
// to test here, and do less extra work in these conditions.
go b . authReconfig ( )
go b . authReconfig ( )
}
}
}
}