diff options
Diffstat (limited to 'zebra/interface.c')
| -rw-r--r-- | zebra/interface.c | 51 |
1 files changed, 19 insertions, 32 deletions
diff --git a/zebra/interface.c b/zebra/interface.c index 76e0a09c17..ac765e7846 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -806,19 +806,6 @@ static void ipv6_ll_address_to_mac(struct in6_addr *address, uint8_t *mac) mac[5] = address->s6_addr[15]; } -static bool mac_is_same(char *mac1, char *mac2) -{ - if (mac1[0] == mac2[0] && - mac1[1] == mac2[1] && - mac1[2] == mac2[2] && - mac1[3] == mac2[3] && - mac1[4] == mac2[4] && - mac1[5] == mac2[5]) - return true; - else - return false; -} - void if_nbr_mac_to_ipv4ll_neigh_update(struct interface *ifp, char mac[6], struct in6_addr *address, @@ -835,19 +822,23 @@ void if_nbr_mac_to_ipv4ll_neigh_update(struct interface *ifp, ns_id = zvrf->zns->ns_id; /* - * Remove existed arp record for the interface as netlink - * protocol does not have update message types - * - * supported message types are RTM_NEWNEIGH and RTM_DELNEIGH + * Remove and re-add any existing neighbor entry for this address, + * since Netlink doesn't currently offer update message types. */ - if (!mac_is_same(zif->neigh_mac, mac)) { - kernel_neigh_update(0, ifp->ifindex, ipv4_ll.s_addr, - mac, 6, ns_id); + kernel_neigh_update(0, ifp->ifindex, ipv4_ll.s_addr, mac, 6, ns_id); - /* Add arp record */ - kernel_neigh_update(add, ifp->ifindex, ipv4_ll.s_addr, - mac, 6, ns_id); - } + /* Add new neighbor entry. + * + * We force installation even if current neighbor entry is the same. + * Since this function is used to refresh our MAC entries after an + * interface flap, if we don't force in our custom entries with their + * state set to PERMANENT or REACHABLE then the kernel will attempt to + * resolve our leftover entries, fail, mark them unreachable and then + * they'll be useless to us. + */ + if (add) + kernel_neigh_update(add, ifp->ifindex, ipv4_ll.s_addr, mac, 6, + ns_id); memcpy(&zif->neigh_mac[0], &mac[0], 6); @@ -2767,7 +2758,7 @@ DEFUN (no_ip_address_label, static int ipv6_address_install(struct vty *vty, struct interface *ifp, const char *addr_str, const char *peer_str, - const char *label, int secondary) + const char *label) { struct zebra_if *if_data; struct prefix_ipv6 cp; @@ -2798,10 +2789,6 @@ static int ipv6_address_install(struct vty *vty, struct interface *ifp, *p = cp; ifc->address = (struct prefix *)p; - /* Secondary. */ - if (secondary) - SET_FLAG(ifc->flags, ZEBRA_IFA_SECONDARY); - /* Label. */ if (label) ifc->label = XSTRDUP(MTYPE_CONNECTED_LABEL, label); @@ -2857,7 +2844,7 @@ int ipv6_address_configured(struct interface *ifp) static int ipv6_address_uninstall(struct vty *vty, struct interface *ifp, const char *addr_str, const char *peer_str, - const char *label, int secondry) + const char *label) { struct prefix_ipv6 cp; struct connected *ifc; @@ -2915,7 +2902,7 @@ DEFUN (ipv6_address, int idx_ipv6_prefixlen = 2; VTY_DECLVAR_CONTEXT(interface, ifp); return ipv6_address_install(vty, ifp, argv[idx_ipv6_prefixlen]->arg, - NULL, NULL, 0); + NULL, NULL); } DEFUN (no_ipv6_address, @@ -2929,7 +2916,7 @@ DEFUN (no_ipv6_address, int idx_ipv6_prefixlen = 3; VTY_DECLVAR_CONTEXT(interface, ifp); return ipv6_address_uninstall(vty, ifp, argv[idx_ipv6_prefixlen]->arg, - NULL, NULL, 0); + NULL, NULL); } static int link_params_config_write(struct vty *vty, struct interface *ifp) |
