@ -42,6 +42,10 @@ type osMon interface {
// until the osMon is closed. After a Close, the returned
// until the osMon is closed. After a Close, the returned
// error is ignored.
// error is ignored.
Receive ( ) ( message , error )
Receive ( ) ( message , error )
// IsInterestingInterface reports whether the provided interface should
// be considered for network change events.
IsInterestingInterface ( iface string ) bool
}
}
// ChangeFunc is a callback function that's called when the network
// ChangeFunc is a callback function that's called when the network
@ -282,6 +286,13 @@ func (m *Mon) notifyRuleDeleted(rdm ipRuleDeletedMessage) {
}
}
}
}
// isInterestingInterface reports whether the provided interface should be
// considered when checking for network state changes.
// The ips parameter should be the IPs of the provided interface.
func ( m * Mon ) isInterestingInterface ( i interfaces . Interface , ips [ ] netaddr . IPPrefix ) bool {
return m . om . IsInterestingInterface ( i . Name ) && interfaces . UseInterestingInterfaces ( i , ips )
}
// debounce calls the callback function with a delay between events
// debounce calls the callback function with a delay between events
// and exits when a stop is issued.
// and exits when a stop is issued.
func ( m * Mon ) debounce ( ) {
func ( m * Mon ) debounce ( ) {
@ -299,7 +310,7 @@ func (m *Mon) debounce() {
m . mu . Lock ( )
m . mu . Lock ( )
oldState := m . ifState
oldState := m . ifState
changed := ! curState . EqualFiltered ( oldState , interfaces. UseInterestingInterfaces , interfaces . UseInterestingIPs )
changed := ! curState . EqualFiltered ( oldState , m. isInterestingInterface , interfaces . UseInterestingIPs )
if changed {
if changed {
m . gwValid = false
m . gwValid = false
m . ifState = curState
m . ifState = curState