]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: zvni_map_to_svi() adaptation for other network namespaces
authorPhilippe Guibert <philippe.guibert@6wind.com>
Fri, 27 Sep 2019 13:45:42 +0000 (15:45 +0200)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Mon, 18 May 2020 12:11:03 +0000 (14:11 +0200)
the function is called with all the network namespaces.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
zebra/zebra_vxlan.c

index 232f45543284c4b5bfebc1c87fcd86a67555bd57..126e2c2bc3d3a52c206bd82cc00b8078beef8d44 100644 (file)
@@ -3682,6 +3682,42 @@ static zebra_vni_t *zvni_from_svi(struct interface *ifp,
        return zvni;
 }
 
+static int zvni_map_to_svi_zns(struct zebra_ns *zns,
+                              void *_in_param,
+                              void **_p_ifp)
+{
+       struct route_node *rn;
+       struct zvni_from_svi_param *in_param =
+               (struct zvni_from_svi_param *)_in_param;
+       struct zebra_l2info_vlan *vl;
+       struct interface *tmp_if = NULL;
+       struct interface **p_ifp = (struct interface **)_p_ifp;
+       struct zebra_if *zif;
+
+       if (!in_param)
+               return ZNS_WALK_STOP;
+
+       /* TODO: Optimize with a hash. */
+       for (rn = route_top(zns->if_table); rn; rn = route_next(rn)) {
+               tmp_if = (struct interface *)rn->info;
+               /* Check oper status of the SVI. */
+               if (!tmp_if || !if_is_operative(tmp_if))
+                       continue;
+               zif = tmp_if->info;
+               if (!zif || zif->zif_type != ZEBRA_IF_VLAN
+                   || zif->link != in_param->br_if)
+                       continue;
+               vl = (struct zebra_l2info_vlan *)&zif->l2info.vl;
+
+               if (vl->vid == in_param->vid) {
+                       if (p_ifp)
+                               *p_ifp = tmp_if;
+                       return ZNS_WALK_STOP;
+               }
+       }
+       return ZNS_WALK_CONTINUE;
+}
+
 /* Map to SVI on bridge corresponding to specified VLAN. This can be one
  * of two cases:
  * (a) In the case of a VLAN-aware bridge, the SVI is a L3 VLAN interface
@@ -3691,15 +3727,11 @@ static zebra_vni_t *zvni_from_svi(struct interface *ifp,
  */
 static struct interface *zvni_map_to_svi(vlanid_t vid, struct interface *br_if)
 {
-       struct zebra_ns *zns;
-       struct route_node *rn;
        struct interface *tmp_if = NULL;
        struct zebra_if *zif;
        struct zebra_l2info_bridge *br;
-       struct zebra_l2info_vlan *vl;
-       uint8_t bridge_vlan_aware;
-       int found = 0;
-
+       struct zvni_from_svi_param in_param;
+       struct interface **p_ifp;
        /* Defensive check, caller expected to invoke only with valid bridge. */
        if (!br_if)
                return NULL;
@@ -3708,33 +3740,19 @@ static struct interface *zvni_map_to_svi(vlanid_t vid, struct interface *br_if)
        zif = br_if->info;
        assert(zif);
        br = &zif->l2info.br;
-       bridge_vlan_aware = br->vlan_aware;
-
+       in_param.bridge_vlan_aware = br->vlan_aware;
        /* Check oper status of the SVI. */
-       if (!bridge_vlan_aware)
+       if (!in_param.bridge_vlan_aware)
                return if_is_operative(br_if) ? br_if : NULL;
 
+       in_param.vid = vid;
+       in_param.br_if = br_if;
+       in_param.zif = NULL;
+       p_ifp = &tmp_if;
        /* Identify corresponding VLAN interface. */
-       /* TODO: Optimize with a hash. */
-       zns = zebra_ns_lookup(NS_DEFAULT);
-       for (rn = route_top(zns->if_table); rn; rn = route_next(rn)) {
-               tmp_if = (struct interface *)rn->info;
-               /* Check oper status of the SVI. */
-               if (!tmp_if || !if_is_operative(tmp_if))
-                       continue;
-               zif = tmp_if->info;
-               if (!zif || zif->zif_type != ZEBRA_IF_VLAN
-                   || zif->link != br_if)
-                       continue;
-               vl = &zif->l2info.vl;
-
-               if (vl->vid == vid) {
-                       found = 1;
-                       break;
-               }
-       }
-
-       return found ? tmp_if : NULL;
+       zebra_ns_list_walk(zvni_map_to_svi_zns, (void *)&in_param,
+                          (void **)p_ifp);
+       return tmp_if;
 }
 
 /* Map to MAC-VLAN interface corresponding to specified SVI interface.