From ad7685de2871996469d370192af7afafc234a3ca Mon Sep 17 00:00:00 2001 From: Chirag Shah Date: Tue, 30 Nov 2021 20:42:01 -0800 Subject: [PATCH 1/2] zebra: evpn handle del event for dup detected mac Upon receiving local mobility event for MAC + NEIGH, both are detected as duplicate upon hitting DAD threshold. Duplicated detected ( freezed) MAC + NEIGH are not known to bgpd. If locally learnt MAC + NEIGH are deleted in kernel, the MAC is marked as AUTO after sending delete event to bgpd. Bgpd only reinstalls best route for MAC_IP route (NEIGH) but not for MAC event. This puts a situation where MAC is AUTO state and associated neigh as remote. Fix: DUPLICATE + LOCAL MAC deletion, set MAC delete request as reinstall from bgpd. Ticket:#2873307 Reviewed By: Testing Done: Freeze MAC + two NEIGHs in local mobility event. Delete MAC and NEIGH from kerenl. bgp rsync remote mac route which puts MAC to remote state. Signed-off-by: Chirag Shah --- zebra/zebra_evpn_mac.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/zebra/zebra_evpn_mac.c b/zebra/zebra_evpn_mac.c index 5ba075e297f4..fb135c9929c1 100644 --- a/zebra/zebra_evpn_mac.c +++ b/zebra/zebra_evpn_mac.c @@ -1341,16 +1341,26 @@ int zebra_evpn_mac_send_add_to_client(vni_t vni, const struct ethaddr *macaddr, int zebra_evpn_mac_send_del_to_client(vni_t vni, const struct ethaddr *macaddr, uint32_t flags, bool force) { + int state = ZEBRA_NEIGH_ACTIVE; + if (!force) { if (CHECK_FLAG(flags, ZEBRA_MAC_LOCAL_INACTIVE) && !CHECK_FLAG(flags, ZEBRA_MAC_ES_PEER_ACTIVE)) /* the host was not advertised - nothing to delete */ return 0; + + /* MAC is LOCAL and DUP_DETECTED, this local mobility event + * is not known to bgpd. Upon receiving local delete + * ask bgp to reinstall the best route (remote entry). + */ + if (CHECK_FLAG(flags, ZEBRA_MAC_LOCAL) && + CHECK_FLAG(flags, ZEBRA_MAC_DUPLICATE)) + state = ZEBRA_NEIGH_INACTIVE; } return zebra_evpn_macip_send_msg_to_client( - vni, macaddr, NULL, 0 /* flags */, 0 /* seq */, - ZEBRA_NEIGH_ACTIVE, NULL, ZEBRA_MACIP_DEL); + vni, macaddr, NULL, 0 /* flags */, 0 /* seq */, state, NULL, + ZEBRA_MACIP_DEL); } /* From 89844a967858d34de99bad8dcb410b4ab4e1dece Mon Sep 17 00:00:00 2001 From: Chirag Shah Date: Sat, 22 Oct 2022 16:00:14 -0700 Subject: [PATCH 2/2] zebra:fix evpn dup detected local mac del event The current local mac delete event send to flag with force always which breaks the duplicate detected MACs where it requires to be resynced from bgpd to earlier state. Ticket:#3233019 Issue:3233019 Signed-off-by: Chirag Shah --- zebra/zebra_evpn_mac.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/zebra/zebra_evpn_mac.c b/zebra/zebra_evpn_mac.c index fb135c9929c1..6d5cd66143d3 100644 --- a/zebra/zebra_evpn_mac.c +++ b/zebra/zebra_evpn_mac.c @@ -1038,12 +1038,11 @@ int zebra_evpn_macip_send_msg_to_client(vni_t vni, char flag_buf[MACIP_BUF_SIZE]; zlog_debug( - "Send MACIP %s f %s MAC %pEA IP %pIA seq %u L2-VNI %u ESI %s to %s", + "Send MACIP %s f %s state %u MAC %pEA IP %pIA seq %u L2-VNI %u ESI %s to %s", (cmd == ZEBRA_MACIP_ADD) ? "Add" : "Del", zclient_evpn_dump_macip_flags(flags, flag_buf, sizeof(flag_buf)), - macaddr, ip, seq, vni, - es ? es->esi_str : "-", + state, macaddr, ip, seq, vni, es ? es->esi_str : "-", zebra_route_string(client->proto)); } @@ -2445,7 +2444,7 @@ int zebra_evpn_del_local_mac(struct zebra_evpn *zevpn, struct zebra_mac *mac, /* Remove MAC from BGP. */ zebra_evpn_mac_send_del_to_client(zevpn->vni, &mac->macaddr, mac->flags, - false /* force */); + clear_static /* force */); zebra_evpn_es_mac_deref_entry(mac);