]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: unset sticky mac upon local deletion
authorChirag Shah <chirag@cumulusnetworks.com>
Thu, 9 May 2019 19:25:44 +0000 (12:25 -0700)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 16 May 2019 20:34:09 +0000 (16:34 -0400)
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 <chirag@cumulusnetworks.com>
zebra/zebra_vxlan.c

index baa050c9b90e1d19828f10f2c1b930a54b4a11c6..605e9eae6683f4d52e599864e10dc0435b6f046a 100644 (file)
@@ -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);
        }