From 390078094563b343d93392b6e2e5157e4303d1ed Mon Sep 17 00:00:00 2001 From: Chirag Shah Date: Thu, 9 May 2019 12:25:44 -0700 Subject: [PATCH] zebra: unset sticky mac upon local deletion if the local sticky mac delete request is received, if there are associated neighbor entries present, mac's only local flag is removed and marked as auto mac. this results in next local mac learning automatically assumes mac is sticky. There is a case when bridge learning off is configured, user configures sticky mac via bridge fdb add. This MAC learns associated neighbor entry. Later user deletes stick mac via bridge fdb del, this triggers frr to delete mac but if there are neighbors present, frr marks MAC as AUTO but does not remove sticky flag. User enables bridge learning on which triggers The mac to learn as dynamic entry and in absence of this fix, the mac is marked as sticky. Ticket:CM-24968 Reviewed By:CCR-8683 Testing Done: Validated broken condition with internally reproduction with fix and without. Signed-off-by: Chirag Shah --- zebra/zebra_vxlan.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/zebra/zebra_vxlan.c b/zebra/zebra_vxlan.c index baa050c9b9..605e9eae66 100644 --- a/zebra/zebra_vxlan.c +++ b/zebra/zebra_vxlan.c @@ -7505,9 +7505,9 @@ int zebra_vxlan_check_del_local_mac(struct interface *ifp, if (IS_ZEBRA_DEBUG_VXLAN) zlog_debug( - "Add/update remote MAC %s intf %s(%u) VNI %u - del local", + "Add/update remote MAC %s intf %s(%u) VNI %u flags 0x%x - del local", prefix_mac2str(macaddr, buf, sizeof(buf)), ifp->name, - ifp->ifindex, vni); + ifp->ifindex, vni, mac->flags); /* Remove MAC from BGP. */ zvni_mac_send_del_to_client(zvni->vni, macaddr); @@ -7520,6 +7520,7 @@ int zebra_vxlan_check_del_local_mac(struct interface *ifp, zvni_mac_del(zvni, mac); } else { UNSET_FLAG(mac->flags, ZEBRA_MAC_LOCAL); + UNSET_FLAG(mac->flags, ZEBRA_MAC_STICKY); SET_FLAG(mac->flags, ZEBRA_MAC_AUTO); } @@ -7603,11 +7604,6 @@ int zebra_vxlan_local_mac_del(struct interface *ifp, struct interface *br_if, return -1; } - if (IS_ZEBRA_DEBUG_VXLAN) - zlog_debug("DEL MAC %s intf %s(%u) VID %u -> VNI %u", - prefix_mac2str(macaddr, buf, sizeof(buf)), ifp->name, - ifp->ifindex, vid, zvni->vni); - /* If entry doesn't exist, nothing to do. */ mac = zvni_mac_lookup(zvni, macaddr); if (!mac) @@ -7617,6 +7613,11 @@ int zebra_vxlan_local_mac_del(struct interface *ifp, struct interface *br_if, if (!CHECK_FLAG(mac->flags, ZEBRA_MAC_LOCAL)) return 0; + if (IS_ZEBRA_DEBUG_VXLAN) + zlog_debug("DEL MAC %s intf %s(%u) VID %u -> VNI %u flags 0x%x", + prefix_mac2str(macaddr, buf, sizeof(buf)), ifp->name, + ifp->ifindex, vid, zvni->vni, mac->flags); + /* Update all the neigh entries associated with this mac */ zvni_process_neigh_on_local_mac_del(zvni, mac); @@ -7631,6 +7632,7 @@ int zebra_vxlan_local_mac_del(struct interface *ifp, struct interface *br_if, zvni_mac_del(zvni, mac); } else { UNSET_FLAG(mac->flags, ZEBRA_MAC_LOCAL); + UNSET_FLAG(mac->flags, ZEBRA_MAC_STICKY); SET_FLAG(mac->flags, ZEBRA_MAC_AUTO); } -- 2.39.5