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,
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);
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;
*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);
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;
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,
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)