Skip to content

Commit

Permalink
Announce all IP addresses on error
Browse files Browse the repository at this point in the history
Don't let the first error shortcut the announcement of subsequent
addresses. Loop over all addresses, but return the first error we
encountered. Note that the caller anyway ignores the error and only uses
it for debug logging.
  • Loading branch information
thom311 committed Jul 31, 2024
1 parent 1efb5c0 commit 0a30adb
Showing 1 changed file with 13 additions and 12 deletions.
25 changes: 13 additions & 12 deletions pkg/utils/packet.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,26 +175,27 @@ func AnnounceIPs(ifName string, ipConfigs []*current.IPConfig) error {
return fmt.Errorf("invalid Ethernet MAC address: %q", linkObj.Attrs().HardwareAddr)
}

var errResult error

// For all the IP addresses assigned by IPAM, we will send either a GARP (IPv4) or Unsolicited NA (IPv6).
for _, ipc := range ipConfigs {
var err error
if IsIPv6(ipc.Address.IP) {
if IsIPv4(ipc.Address.IP) {
err := SendGratuitousArp(ipc.Address.IP, linkObj)
if err != nil && errResult == nil {
errResult = fmt.Errorf("failed to send GARP message for ip %s on interface %q: %v", ipc.Address.IP.String(), ifName, err)
}
} else if IsIPv6(ipc.Address.IP) {
/* As per RFC 4861, sending unsolicited neighbor advertisements should be considered as a performance
* optimization. It does not reliably update caches in all nodes. The Neighbor Unreachability Detection
* algorithm is more reliable although it may take slightly longer to update.
*/
err = SendUnsolicitedNeighborAdvertisement(ipc.Address.IP, linkObj)
} else if IsIPv4(ipc.Address.IP) {
err = SendGratuitousArp(ipc.Address.IP, linkObj)
} else {
return fmt.Errorf("the IP %s on interface %q is neither IPv4 or IPv6", ipc.Address.IP.String(), ifName)
}

if err != nil {
return fmt.Errorf("failed to send GARP/NA message for ip %s on interface %q: %v", ipc.Address.IP.String(), ifName, err)
err := SendUnsolicitedNeighborAdvertisement(ipc.Address.IP, linkObj)
if err != nil && errResult == nil {
errResult = fmt.Errorf("failed to send NA message for ip %s on interface %q: %v", ipc.Address.IP.String(), ifName, err)
}
}
}
return nil
return errResult
}

// Blocking wait for interface ifName to have carrier (!NO_CARRIER flag).
Expand Down

0 comments on commit 0a30adb

Please sign in to comment.