Fix network detection with multiple interfaces on same net

This commit is contained in:
Daniel 2022-01-22 12:37:38 +01:00
parent caa43f4167
commit f78e516284
2 changed files with 16 additions and 15 deletions

View file

@ -76,14 +76,15 @@ func IsMyIP(ip net.IP) (yes bool, err error) {
// Check if current data matches IP. // Check if current data matches IP.
// Matching on somewhat older data is not a problem, as these IPs would not // Matching on somewhat older data is not a problem, as these IPs would not
// just randomly pop up somewhere else that fast. // just randomly pop up somewhere else that fast.
mine, matched := checkIfMyIP(ip) mine, myNet := checkIfMyIP(ip)
if matched { switch {
return mine, nil case mine:
} // IP matched.
return true, nil
// Check if the network changed. case myNetworksNetworkChangedFlag.IsSet():
if !myNetworksNetworkChangedFlag.IsSet() { // The network changed, so we need to refresh the data.
// Network did not change, return "no match". case myNet:
// IP is one of the networks and nothing changed, so this is not our IP.
return false, nil return false, nil
} }
@ -104,13 +105,13 @@ func IsMyIP(ip net.IP) (yes bool, err error) {
} }
myNetworks = make([]*net.IPNet, 0, len(interfaceNetworks)) myNetworks = make([]*net.IPNet, 0, len(interfaceNetworks))
for _, ifNet := range interfaceNetworks { for _, ifNet := range interfaceNetworks {
net, ok := ifNet.(*net.IPNet) ipNet, ok := ifNet.(*net.IPNet)
if !ok { if !ok {
log.Warningf("netenv: interface network of unexpected type %T", ifNet) log.Warningf("netenv: interface network of unexpected type %T", ifNet)
continue continue
} }
myNetworks = append(myNetworks, net) myNetworks = append(myNetworks, ipNet)
} }
// Reset error. // Reset error.
@ -126,7 +127,7 @@ func IsMyIP(ip net.IP) (yes bool, err error) {
return false, nil return false, nil
} }
func checkIfMyIP(ip net.IP) (mine bool, matched bool) { func checkIfMyIP(ip net.IP) (mine bool, myNet bool) {
// Check against assigned IPs. // Check against assigned IPs.
for _, myNet := range myNetworks { for _, myNet := range myNetworks {
if ip.Equal(myNet.IP) { if ip.Equal(myNet.IP) {

View file

@ -40,8 +40,8 @@ serviceLoop:
for { for {
trigger := false trigger := false
timeout := time.Minute timeout := 15 * time.Second
if GetOnlineStatus() != StatusOnline { if !Online() {
timeout = time.Second timeout = time.Second
} }
// wait for trigger // wait for trigger
@ -62,7 +62,7 @@ serviceLoop:
hasher := sha1.New() //nolint:gosec // not used for security hasher := sha1.New() //nolint:gosec // not used for security
interfaces, err := net.Interfaces() interfaces, err := net.Interfaces()
if err != nil { if err != nil {
log.Warningf("environment: failed to get interfaces: %s", err) log.Warningf("netenv: failed to get interfaces: %s", err)
continue continue
} }
for _, iface := range interfaces { for _, iface := range interfaces {
@ -72,7 +72,7 @@ serviceLoop:
// log.Tracef("adding: %s", iface.Flags.String()) // log.Tracef("adding: %s", iface.Flags.String())
addrs, err := iface.Addrs() addrs, err := iface.Addrs()
if err != nil { if err != nil {
log.Warningf("environment: failed to get addrs from interface %s: %s", iface.Name, err) log.Warningf("netenv: failed to get addrs from interface %s: %s", iface.Name, err)
continue continue
} }
for _, addr := range addrs { for _, addr := range addrs {