zebra: extract neighbor processing from process_remote_macip_del

extract the neighbor uninstall  part of process_remote_macip_add
into a new function zebra_evpn_neigh_remote_uninstall in
zebra_evpn_neigh.c.

Signed-off-by: Pat Ruddy <pat@voltanet.io>
This commit is contained in:
Pat Ruddy 2020-04-24 14:50:23 +01:00
parent 224315f3e4
commit 32fe7dfd9b
3 changed files with 49 additions and 43 deletions

View File

@ -574,9 +574,10 @@ bool zebra_evpn_neigh_is_bgp_seq_ok(zebra_evpn_t *zevpn, zebra_neigh_t *n,
/* /*
* Add neighbor entry. * Add neighbor entry.
*/ */
zebra_neigh_t *zebra_evpn_neigh_add(zebra_evpn_t *zevpn, struct ipaddr *ip, static zebra_neigh_t *zebra_evpn_neigh_add(zebra_evpn_t *zevpn,
struct ethaddr *mac, zebra_mac_t *zmac, struct ipaddr *ip,
uint32_t n_flags) struct ethaddr *mac,
zebra_mac_t *zmac, uint32_t n_flags)
{ {
zebra_neigh_t tmp_n; zebra_neigh_t tmp_n;
zebra_neigh_t *n = NULL; zebra_neigh_t *n = NULL;
@ -853,7 +854,7 @@ zebra_evpn_proc_sync_neigh_update(zebra_evpn_t *zevpn, zebra_neigh_t *n,
/* /*
* Uninstall remote neighbor from the kernel. * Uninstall remote neighbor from the kernel.
*/ */
int zebra_evpn_neigh_uninstall(zebra_evpn_t *zevpn, zebra_neigh_t *n) static int zebra_evpn_neigh_uninstall(zebra_evpn_t *zevpn, zebra_neigh_t *n)
{ {
struct interface *vlan_if; struct interface *vlan_if;
@ -2348,3 +2349,41 @@ int zebra_evpn_neigh_gw_macip_add(struct interface *ifp, zebra_evpn_t *zevpn,
return 0; return 0;
} }
void zebra_evpn_neigh_remote_uninstall(zebra_evpn_t *zevpn,
struct zebra_vrf *zvrf, zebra_neigh_t *n,
zebra_mac_t *mac, struct ipaddr *ipaddr)
{
char buf1[INET6_ADDRSTRLEN];
if (zvrf->dad_freeze && CHECK_FLAG(n->flags, ZEBRA_NEIGH_DUPLICATE)
&& CHECK_FLAG(n->flags, ZEBRA_NEIGH_REMOTE)
&& (memcmp(n->emac.octet, mac->macaddr.octet, ETH_ALEN) == 0)) {
struct interface *vlan_if;
vlan_if = zevpn_map_to_svi(zevpn);
if (IS_ZEBRA_DEBUG_VXLAN)
zlog_debug(
"%s: IP %s (flags 0x%x intf %s) is remote and duplicate, read kernel for local entry",
__func__,
ipaddr2str(ipaddr, buf1, sizeof(buf1)),
n->flags, vlan_if ? vlan_if->name : "Unknown");
if (vlan_if)
neigh_read_specific_ip(ipaddr, vlan_if);
}
/* When the MAC changes for an IP, it is possible the
* client may update the new MAC before trying to delete the
* "old" neighbor (as these are two different MACIP routes).
* Do the delete only if the MAC matches.
*/
if (!memcmp(n->emac.octet, mac->macaddr.octet, ETH_ALEN)) {
if (CHECK_FLAG(n->flags, ZEBRA_NEIGH_LOCAL)) {
zebra_evpn_sync_neigh_del(n);
} else if (CHECK_FLAG(n->flags, ZEBRA_NEIGH_REMOTE)) {
zebra_evpn_neigh_uninstall(zevpn, n);
zebra_evpn_neigh_del(zevpn, n);
zebra_evpn_deref_ip2mac(zevpn, mac);
}
}
}

View File

@ -281,11 +281,10 @@ void process_neigh_remote_macip_add(zebra_evpn_t *zevpn, struct zebra_vrf *zvrf,
uint32_t seq); uint32_t seq);
int zebra_evpn_neigh_gw_macip_add(struct interface *ifp, zebra_evpn_t *zevpn, int zebra_evpn_neigh_gw_macip_add(struct interface *ifp, zebra_evpn_t *zevpn,
struct ipaddr *ip, zebra_mac_t *mac); struct ipaddr *ip, zebra_mac_t *mac);
void zebra_evpn_neigh_remote_uninstall(zebra_evpn_t *zevpn,
struct zebra_vrf *zvrf, zebra_neigh_t *n,
zebra_mac_t *mac, struct ipaddr *ipaddr);
zebra_neigh_t *zebra_evpn_neigh_add(zebra_evpn_t *zevpn, struct ipaddr *ip,
struct ethaddr *mac, zebra_mac_t *zmac,
uint32_t n_flags);
int zebra_evpn_neigh_uninstall(zebra_evpn_t *zevpn, zebra_neigh_t *n);
void zebra_evpn_neigh_send_add_del_to_client(zebra_neigh_t *n, void zebra_evpn_neigh_send_add_del_to_client(zebra_neigh_t *n,
bool old_bgp_ready, bool old_bgp_ready,
bool new_bgp_ready); bool new_bgp_ready);

View File

@ -3432,41 +3432,9 @@ static void process_remote_macip_del(vni_t vni,
} }
/* Uninstall remote neighbor or MAC. */ /* Uninstall remote neighbor or MAC. */
if (n) { if (n)
if (zvrf->dad_freeze && zebra_evpn_neigh_remote_uninstall(zevpn, zvrf, n, mac, ipaddr);
CHECK_FLAG(n->flags, ZEBRA_NEIGH_DUPLICATE) && else {
CHECK_FLAG(n->flags, ZEBRA_NEIGH_REMOTE) &&
(memcmp(n->emac.octet, macaddr->octet, ETH_ALEN) == 0)) {
struct interface *vlan_if;
vlan_if = zvni_map_to_svi(vxl->access_vlan,
zif->brslave_info.br_if);
if (IS_ZEBRA_DEBUG_VXLAN)
zlog_debug(
"%s: IP %s (flags 0x%x intf %s) is remote and duplicate, read kernel for local entry",
__func__,
ipaddr2str(ipaddr, buf1, sizeof(buf1)),
n->flags,
vlan_if ? vlan_if->name : "Unknown");
if (vlan_if)
neigh_read_specific_ip(ipaddr, vlan_if);
}
/* When the MAC changes for an IP, it is possible the
* client may update the new MAC before trying to delete the
* "old" neighbor (as these are two different MACIP routes).
* Do the delete only if the MAC matches.
*/
if (!memcmp(n->emac.octet, macaddr->octet, ETH_ALEN)) {
if (CHECK_FLAG(n->flags, ZEBRA_NEIGH_LOCAL)) {
zebra_evpn_sync_neigh_del(n);
} else if (CHECK_FLAG(n->flags, ZEBRA_NEIGH_REMOTE)) {
zebra_evpn_neigh_uninstall(zevpn, n);
zebra_evpn_neigh_del(zevpn, n);
zebra_evpn_deref_ip2mac(zevpn, mac);
}
}
} else {
/* DAD: when MAC is freeze state as remote learn event, /* DAD: when MAC is freeze state as remote learn event,
* remote mac-ip delete event is received will result in freeze * remote mac-ip delete event is received will result in freeze
* entry removal, first fetch kernel for the same entry present * entry removal, first fetch kernel for the same entry present