]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: optimize l3vni lookup in certain callflows
authormitesh <mitesh@cumulusnetworks.com>
Wed, 24 Jan 2018 23:25:03 +0000 (15:25 -0800)
committermitesh <mitesh@cumulusnetworks.com>
Wed, 24 Jan 2018 23:49:21 +0000 (15:49 -0800)
Currently, while processing kernel messages related to VNIs
we first check if VNI is L3 - this is a hash lookup
later, we do the lookup again to find the L3-VNI.
This is non-optimal.
Made changed to make sure we only do the lookup once.

Signed-off-by: Mitesh Kanjariya <mitesh@cumulusnetworks.com>
zebra/zebra_vxlan.c

index 1690079f68f76c7d0e7f67167f34976d58459d43..0054555e5a938317b5caab78e6cce1f53e743afe 100644 (file)
@@ -126,7 +126,6 @@ static int zl3vni_rmac_uninstall(zebra_l3vni_t *zl3vni,
                                 zebra_mac_t *zrmac);
 
 /* l3-vni related APIs*/
-static int is_vni_l3(vni_t);
 static zebra_l3vni_t *zl3vni_lookup(vni_t vni);
 static void *zl3vni_alloc(void *p);
 static zebra_l3vni_t *zl3vni_add(vni_t vni, vrf_id_t vrf_id);
@@ -2593,6 +2592,8 @@ static void zvni_build_hash_table()
        zns = zebra_ns_lookup(NS_DEFAULT);
        for (rn = route_top(zns->if_table); rn; rn = route_next(rn)) {
                vni_t vni;
+               zebra_vni_t *zvni = NULL;
+               zebra_l3vni_t *zl3vni = NULL;
                struct zebra_if *zif;
                struct zebra_l2info_vxlan *vxl;
 
@@ -2606,21 +2607,14 @@ static void zvni_build_hash_table()
                vxl = &zif->l2info.vxl;
                vni = vxl->vni;
 
-               if (is_vni_l3(vni)) {
-                       zebra_l3vni_t *zl3vni = NULL;
+               /* L3-VNI and L2-VNI are handled seperately */
+               zl3vni = zl3vni_lookup(vni);
+               if (zl3vni) {
 
                        if (IS_ZEBRA_DEBUG_VXLAN)
                                zlog_debug("create L3-VNI hash for Intf %s(%u) L3-VNI %u",
                                           ifp->name, ifp->ifindex, vni);
 
-                       zl3vni = zl3vni_lookup(vni);
-                       if (!zl3vni) {
-                               zlog_err(
-                                       "Failed to locate L3-VNI hash at UP, IF %s(%u) VNI %u",
-                                       ifp->name, ifp->ifindex, vni);
-                               return;
-                       }
-
                        /* associate with vxlan_if */
                        zl3vni->local_vtep_ip = vxl->vtep_ip;
                        zl3vni->vxlan_if = ifp;
@@ -2636,8 +2630,6 @@ static void zvni_build_hash_table()
                                zebra_vxlan_process_l3vni_oper_up(zl3vni);
 
                } else {
-                       zebra_vni_t *zvni = NULL;
-                       zebra_l3vni_t *zl3vni = NULL;
                        struct interface *vlan_if = NULL;
 
                        if (IS_ZEBRA_DEBUG_VXLAN)
@@ -3387,16 +3379,6 @@ static int zl3vni_del(zebra_l3vni_t *zl3vni)
        return 0;
 }
 
-static int is_vni_l3(vni_t vni)
-{
-       zebra_l3vni_t *zl3vni = NULL;
-
-       zl3vni = zl3vni_lookup(vni);
-       if (zl3vni)
-               return 1;
-       return 0;
-}
-
 static struct interface *zl3vni_map_to_vxlan_if(zebra_l3vni_t *zl3vni)
 {
        struct zebra_ns *zns = NULL;
@@ -5815,6 +5797,8 @@ int zebra_vxlan_if_down(struct interface *ifp)
        vni_t vni;
        struct zebra_if *zif = NULL;
        struct zebra_l2info_vxlan *vxl = NULL;
+       zebra_l3vni_t *zl3vni = NULL;
+       zebra_vni_t *zvni;
 
        /* Check if EVPN is enabled. */
        if (!is_evpn_enabled())
@@ -5825,30 +5809,16 @@ int zebra_vxlan_if_down(struct interface *ifp)
        vxl = &zif->l2info.vxl;
        vni = vxl->vni;
 
-
-       if (is_vni_l3(vni)) {
-
+       zl3vni = zl3vni_lookup(vni);
+       if (zl3vni) {
                /* process-if-down for l3-vni */
-               zebra_l3vni_t *zl3vni = NULL;
-
                if (IS_ZEBRA_DEBUG_VXLAN)
                        zlog_debug("Intf %s(%u) L3-VNI %u is DOWN",
                                   ifp->name, ifp->ifindex, vni);
 
-               zl3vni = zl3vni_lookup(vni);
-               if (!zl3vni) {
-                       zlog_err(
-                               "Failed to locate L3-VNI hash at DOWN, IF %s(%u) VNI %u",
-                               ifp->name, ifp->ifindex, vni);
-                       return -1;
-               }
-
                zebra_vxlan_process_l3vni_oper_down(zl3vni);
-
        } else {
                /* process if-down for l2-vni */
-               zebra_vni_t *zvni;
-
                if (IS_ZEBRA_DEBUG_VXLAN)
                        zlog_debug("Intf %s(%u) L2-VNI %u is DOWN",
                                   ifp->name, ifp->ifindex, vni);
@@ -5885,6 +5855,8 @@ int zebra_vxlan_if_up(struct interface *ifp)
        vni_t vni;
        struct zebra_if *zif = NULL;
        struct zebra_l2info_vxlan *vxl = NULL;
+       zebra_vni_t *zvni = NULL;
+       zebra_l3vni_t *zl3vni = NULL;
 
        /* Check if EVPN is enabled. */
        if (!is_evpn_enabled())
@@ -5895,7 +5867,8 @@ int zebra_vxlan_if_up(struct interface *ifp)
        vxl = &zif->l2info.vxl;
        vni = vxl->vni;
 
-       if (is_vni_l3(vni)) {
+       zl3vni = zl3vni_lookup(vni);
+       if (zl3vni) {
 
                /* Handle L3-VNI add */
                zebra_l3vni_t *zl3vni = NULL;
@@ -5904,14 +5877,6 @@ int zebra_vxlan_if_up(struct interface *ifp)
                        zlog_debug("Intf %s(%u) L3-VNI %u is UP",
                                   ifp->name, ifp->ifindex, vni);
 
-               zl3vni = zl3vni_lookup(vni);
-               if (!zl3vni) {
-                       zlog_err(
-                               "Failed to locate L3-VNI hash at UP, IF %s(%u) VNI %u",
-                               ifp->name, ifp->ifindex, vni);
-                       return -1;
-               }
-
                /* we need to associate with SVI, if any, we can associate with
                 * svi-if only after association with vxlan-intf is complete
                 */
@@ -5921,9 +5886,6 @@ int zebra_vxlan_if_up(struct interface *ifp)
                        zebra_vxlan_process_l3vni_oper_up(zl3vni);
        } else {
                /* Handle L2-VNI add */
-
-               zebra_vni_t *zvni = NULL;
-               zebra_l3vni_t *zl3vni = NULL;
                struct interface *vlan_if = NULL;
 
                if (IS_ZEBRA_DEBUG_VXLAN)
@@ -5969,6 +5931,8 @@ int zebra_vxlan_if_del(struct interface *ifp)
        vni_t vni;
        struct zebra_if *zif = NULL;
        struct zebra_l2info_vxlan *vxl = NULL;
+       zebra_vni_t *zvni = NULL;
+       zebra_l3vni_t *zl3vni = NULL;
 
        /* Check if EVPN is enabled. */
        if (!is_evpn_enabled())
@@ -5979,7 +5943,8 @@ int zebra_vxlan_if_del(struct interface *ifp)
        vxl = &zif->l2info.vxl;
        vni = vxl->vni;
 
-       if (is_vni_l3(vni)) {
+       zl3vni = zl3vni_lookup(vni);
+       if (zl3vni) {
 
                /* process if-del for l3-vni */
                zebra_l3vni_t *zl3vni = NULL;
@@ -5988,14 +5953,6 @@ int zebra_vxlan_if_del(struct interface *ifp)
                        zlog_debug("Del L3-VNI %u intf %s(%u)",
                                   vni, ifp->name, ifp->ifindex);
 
-               zl3vni = zl3vni_lookup(vni);
-               if (!zl3vni) {
-                       zlog_err(
-                               "Failed to locate L3-VNI hash at del, IF %s(%u) VNI %u",
-                               ifp->name, ifp->ifindex, vni);
-                       return 0;
-               }
-
                /* process oper-down for l3-vni */
                zebra_vxlan_process_l3vni_oper_down(zl3vni);
 
@@ -6005,9 +5962,6 @@ int zebra_vxlan_if_del(struct interface *ifp)
        } else {
 
                /* process if-del for l2-vni*/
-               zebra_vni_t *zvni = NULL;
-               zebra_l3vni_t *zl3vni = NULL;
-
                if (IS_ZEBRA_DEBUG_VXLAN)
                        zlog_debug("Del L2-VNI %u intf %s(%u)",
                                   vni, ifp->name, ifp->ifindex);
@@ -6043,7 +5997,6 @@ int zebra_vxlan_if_del(struct interface *ifp)
                        return -1;
                }
        }
-
        return 0;
 }
 
@@ -6055,6 +6008,8 @@ int zebra_vxlan_if_update(struct interface *ifp, u_int16_t chgflags)
        vni_t vni;
        struct zebra_if *zif = NULL;
        struct zebra_l2info_vxlan *vxl = NULL;
+       zebra_vni_t *zvni = NULL;
+       zebra_l3vni_t *zl3vni = NULL;
 
        /* Check if EVPN is enabled. */
        if (!is_evpn_enabled())
@@ -6065,16 +6020,8 @@ int zebra_vxlan_if_update(struct interface *ifp, u_int16_t chgflags)
        vxl = &zif->l2info.vxl;
        vni = vxl->vni;
 
-       if (is_vni_l3(vni)) {
-               zebra_l3vni_t *zl3vni = NULL;
-
-               zl3vni = zl3vni_lookup(vni);
-               if (!zl3vni) {
-                       zlog_err(
-                               "Failed to find L3-VNI hash on update, IF %s(%u) VNI %u",
-                               ifp->name, ifp->ifindex, vni);
-                       return -1;
-               }
+       zl3vni = zl3vni_lookup(vni);
+       if (zl3vni) {
 
                if (IS_ZEBRA_DEBUG_VXLAN)
                        zlog_debug(
@@ -6110,7 +6057,6 @@ int zebra_vxlan_if_update(struct interface *ifp, u_int16_t chgflags)
                                zebra_vxlan_process_l3vni_oper_up(zl3vni);
                }
        } else {
-               zebra_vni_t *zvni = NULL;
 
                /* Update VNI hash. */
                zvni = zvni_lookup(vni);
@@ -6201,6 +6147,8 @@ int zebra_vxlan_if_add(struct interface *ifp)
        vni_t vni;
        struct zebra_if *zif = NULL;
        struct zebra_l2info_vxlan *vxl = NULL;
+       zebra_vni_t *zvni = NULL;
+       zebra_l3vni_t *zl3vni = NULL;
 
        /* Check if EVPN is enabled. */
        if (!is_evpn_enabled())
@@ -6211,11 +6159,10 @@ int zebra_vxlan_if_add(struct interface *ifp)
        vxl = &zif->l2info.vxl;
        vni = vxl->vni;
 
-       if (is_vni_l3(vni)) {
+       zl3vni = zl3vni_lookup(vni);
+       if (zl3vni) {
 
                /* process if-add for l3-vni*/
-               zebra_l3vni_t *zl3vni = NULL;
-
                if (IS_ZEBRA_DEBUG_VXLAN)
                        zlog_debug(
                                "Add L3-VNI %u intf %s(%u) VLAN %u local IP %s master %u",
@@ -6223,20 +6170,6 @@ int zebra_vxlan_if_add(struct interface *ifp)
                                vxl->access_vlan, inet_ntoa(vxl->vtep_ip),
                                zif->brslave_info.bridge_ifindex);
 
-               /*
-                *  we expect the l3-vni has entry to be present here.
-                *  The only place l3-vni is created in zebra is vrf-vni mapping
-                *  command. This might change when we have the switchd support
-                *  for l3-vxlan interface.
-                */
-               zl3vni = zl3vni_lookup(vni);
-               if (!zl3vni) {
-                       zlog_err(
-                               "Failed to locate L3-VNI hash at del, IF %s(%u) VNI %u",
-                               ifp->name, ifp->ifindex, vni);
-                       return 0;
-               }
-
                /* associate with vxlan_if */
                zl3vni->local_vtep_ip = vxl->vtep_ip;
                zl3vni->vxlan_if = ifp;
@@ -6250,8 +6183,6 @@ int zebra_vxlan_if_add(struct interface *ifp)
        } else {
 
                /* process if-add for l2-vni */
-               zebra_vni_t *zvni = NULL;
-               zebra_l3vni_t *zl3vni = NULL;
                struct interface *vlan_if = NULL;
 
                /* Create or update VNI hash. */