]> git.puffer.fish Git - matthieu/frr.git/commitdiff
evpn-netns: Revert PR5077, has been re-worked post-refactor
authorPat Ruddy <pat@voltanet.io>
Wed, 3 Jun 2020 11:22:26 +0000 (12:22 +0100)
committerAnuradha Karuppiah <anuradhak@cumulusnetworks.com>
Wed, 5 Aug 2020 13:46:12 +0000 (06:46 -0700)
Revert "zebra: support for macvlan interfaces"

This reverts commit bf69e212fd053af3298fc3cba38458b396467849.

Revert "doc: add some documentation about bgp evpn netns support"

This reverts commit 89b97c33d7a6d9dc427d56fea52fa27334dde81d.

Revert "zebra: dynamically detect vxlan link interfaces in other netns"

This reverts commit de0ebb25404fe984f084a0d57b7f873618423876.

Revert "bgpd: sanity check when updating nexthop from bgp to zebra"

This reverts commit ee9633ed87f0ff5da1373a42d6c044f0a682c8d3.

Revert "lib, zebra: reuse and adapt ns_list walk functionality"

This reverts commit c4d466c830083e8ba58881d7ad03a90f6baf0754.

Revert "zebra: local mac entries populated in correct netnamespace"

This reverts commit 40424548910887f3bbbf544ce964d3b736048ae5.

Revert "zebra: when parsing local entry against dad, retrieve config"

This reverts commit 3acc394bc5e5c225e9258fd0d57a6cebea0c0ccd.

Revert "bgpd: evpn nexthop can be changed by default"

This reverts commit a2342a241253c41b798845cae155b4caab4bcda5.

Revert "zebra: zvni_map_to_vlan() adaptation for all namespaces"

This reverts commit db81d18647bbd81a2c335620c9a03e32e4a5b2be.

Revert "zebra: add ns_id attribute to mac structure"

This reverts commit 388d5b438e22cddc6740e362763c0922edbb242a.

Revert "zebra: bridge layer2 information records ns_id where bridge is"

This reverts commit b5b453a2d6af58692bee0e256fe1dffe99824801.

Revert "zebra, lib: new API to get absolute netns val from relative netns val"

This reverts commit b6ebab34f664ba1cc9479fc1287f127c12077509.

Revert "zebra, lib: store relative default ns id in each namespace"

This reverts commit 9d3555e06ccc68fe37e0a00100029ac4bad8dee2.

Revert "zebra, lib: add an internal API to get relative default nsid in other ns"

This reverts commit 97c9e7533bd22029ac19838c043cfca82d2f6eb3.

Revert "zebra: map vxlan interface to bridge interface with correct ns id"

This reverts commit 7c990878f20efff335c1211deda3ec50071ae2b5.

Revert "zebra: fdb and neighbor table are read for all zns"

This reverts commit f8ed2c5420106314a940cb67264494e0110fc4c0.

Revert "zebra: zvni_map_to_svi() adaptation for other network namespaces"

This reverts commit 2a9dccb6475bfc11af2b855c4c8ff9e500ba21f4.

Revert "zebra: display interface slave type"

This reverts commit fc3141393ad95651d31fccd144b5c029d00e5f3a.

Revert "zebra: zvni_from_svi() adaptation for other network namespaces"

This reverts commit 6fe516bd4b85569b3b8b4bcc2910afc5569aa026.

Revert "zebra: importation of bgp evpn rt5 from vni with other netns"

This reverts commit 28254125d06f65cc4344b6156eec76a37ec6aede.

Revert "lib, zebra: update interface name at netlink creation"

This reverts commit 1f7a68a2ff0ba1424131f30112e0cc1572f0bee3.

Signed-off-by: Pat Ruddy <pat@voltanet.io>
22 files changed:
bgpd/bgp_zebra.c
bgpd/bgpd.c
doc/user/bgp.rst
include/linux/net_namespace.h
lib/if.c
lib/if.h
lib/netns_linux.c
lib/ns.h
lib/vrf.c
lib/vrf.h
zebra/if_netlink.c
zebra/interface.c
zebra/main.c
zebra/zebra_l2.c
zebra/zebra_l2.h
zebra/zebra_netns_id.c
zebra/zebra_netns_id.h
zebra/zebra_netns_notify.c
zebra/zebra_ns.c
zebra/zebra_ns.h
zebra/zebra_vxlan.c
zebra/zebra_vxlan_private.h

index 0a55a46ed4026313f05be58864bb44187fd178c0..a469fb507f3bcb2ab7bcb1c34a8a31c61ce945fb 100644 (file)
@@ -1143,8 +1143,7 @@ static bool update_ipv6nh_for_route_install(int nh_othervrf, struct bgp *nh_bgp,
                        api_nh->ifindex = 0;
                }
        }
-       if (nexthop)
-               api_nh->gate.ipv6 = *nexthop;
+       api_nh->gate.ipv6 = *nexthop;
 
        return true;
 }
index f0ee8002876d6d0c160d1ce9403dc1fdeee67272..35d90d4711b4bb2e48425d0708eb4ec77cae7f50 100644 (file)
@@ -1227,6 +1227,10 @@ struct peer *peer_new(struct bgp *bgp)
                peer->addpath_type[afi][safi] = BGP_ADDPATH_NONE;
        }
 
+       /* set nexthop-unchanged for l2vpn evpn by default */
+       SET_FLAG(peer->af_flags[AFI_L2VPN][SAFI_EVPN],
+                PEER_FLAG_NEXTHOP_UNCHANGED);
+
        SET_FLAG(peer->sflags, PEER_STATUS_CAPABILITY_OPEN);
 
        /* Initialize per peer bgp GR FSM */
index cc27bc202dcd21a11ae5401bc995cefa051c3412..db0776adbaecc5341e265dccf24208338531d40e 100644 (file)
@@ -2465,26 +2465,6 @@ the same behavior of using same next-hop and RMAC values.
 Enables or disables advertise-pip feature, specifiy system-IP and/or system-MAC
 parameters.
 
-Support with VRF network namespace backend
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-It is possible to separate overlay networks contained in VXLAN interfaces from
-underlay networks by using VRFs. VRF-lite and VRF-netns backends can be used for
-that. In the latter case, this is necessary to set both bridge and vxlan interface
-on the same network namespace, as below example illustrates:
-
-.. code-block:: shell
-
-   # linux shell
-   ip netns add vrf1
-   ip link add name vxlan101 type vxlan id 101 dstport 4789 dev eth0 local 10.1.1.1
-   ip link set dev vxlan101 netns vrf1
-   ip netns exec vrf1 ip link set dev lo up
-   ip netns exec vrf1 brctl addbr bridge101
-   ip netns exec vrf1 brctl addif bridge101 vxlan101
-
-This makes possible to separate not only layer 3 networks like VRF-lite networks.
-Also, VRF netns based make possible to separate layer 2 networks on separate VRF
-instances.
 
 .. _bgp-debugging:
 
index 0ed9dd61d32a1ed7a66ad235566fff8d9a2d63a7..0187c74d88894ade01c6a6bb9b5baba23675d09b 100644 (file)
@@ -16,7 +16,6 @@ enum {
        NETNSA_NSID,
        NETNSA_PID,
        NETNSA_FD,
-       NETNSA_TARGET_NSID,
        __NETNSA_MAX,
 };
 
index 07e786c7086d714061f55d631ea71d139b80911b..d8392708e14083b69de1d536ca5171075b54a1ea 100644 (file)
--- a/lib/if.c
+++ b/lib/if.c
@@ -217,16 +217,14 @@ struct interface *if_create_name(const char *name, vrf_id_t vrf_id)
        return ifp;
 }
 
-struct interface *if_create_ifindex(ifindex_t ifindex, vrf_id_t vrf_id,
-                                   char *optional_name)
+struct interface *if_create_ifindex(ifindex_t ifindex, vrf_id_t vrf_id)
 {
        struct interface *ifp;
 
        ifp = if_new(vrf_id);
 
        if_set_index(ifp, ifindex);
-       if (optional_name)
-               if_set_name(ifp, optional_name);
+
        hook_call(if_add, ifp);
        return ifp;
 }
@@ -573,8 +571,7 @@ struct interface *if_get_by_name(const char *name, vrf_id_t vrf_id)
        return NULL;
 }
 
-struct interface *if_get_by_ifindex(ifindex_t ifindex, vrf_id_t vrf_id,
-                                   char *optional_name)
+struct interface *if_get_by_ifindex(ifindex_t ifindex, vrf_id_t vrf_id)
 {
        struct interface *ifp;
 
@@ -584,7 +581,7 @@ struct interface *if_get_by_ifindex(ifindex_t ifindex, vrf_id_t vrf_id,
                ifp = if_lookup_by_ifindex(ifindex, vrf_id);
                if (ifp)
                        return ifp;
-               return if_create_ifindex(ifindex, vrf_id, optional_name);
+               return if_create_ifindex(ifindex, vrf_id);
        case VRF_BACKEND_VRF_LITE:
                ifp = if_lookup_by_index_all_vrf(ifindex);
                if (ifp) {
@@ -596,7 +593,7 @@ struct interface *if_get_by_ifindex(ifindex_t ifindex, vrf_id_t vrf_id,
                        if_update_to_new_vrf(ifp, vrf_id);
                        return ifp;
                }
-               return if_create_ifindex(ifindex, vrf_id, optional_name);
+               return if_create_ifindex(ifindex, vrf_id);
        }
 
        return NULL;
index 40e87c1e312237d26422cfaa73fd01e09bd8de1c..1fb0757db28000242084c343dc7e80c78e9e4316 100644 (file)
--- a/lib/if.h
+++ b/lib/if.h
@@ -509,8 +509,7 @@ extern void if_update_to_new_vrf(struct interface *, vrf_id_t vrf_id);
 extern struct interface *if_create_name(const char *name, vrf_id_t vrf_id);
 
 /* Create new interface, adds to index list only */
-extern struct interface *if_create_ifindex(ifindex_t ifindex, vrf_id_t vrf_id,
-                                          char *name);
+extern struct interface *if_create_ifindex(ifindex_t ifindex, vrf_id_t vrf_id);
 extern struct interface *if_lookup_by_index(ifindex_t, vrf_id_t vrf_id);
 extern struct interface *if_lookup_by_index_all_vrf(ifindex_t);
 extern struct interface *if_lookup_exact_address(const void *matchaddr,
@@ -527,8 +526,8 @@ extern struct interface *if_lookup_by_name_all_vrf(const char *ifname);
 extern struct interface *if_lookup_by_name_vrf(const char *name, struct vrf *vrf);
 extern struct interface *if_lookup_by_name(const char *ifname, vrf_id_t vrf_id);
 extern struct interface *if_get_by_name(const char *ifname, vrf_id_t vrf_id);
-extern struct interface *if_get_by_ifindex(ifindex_t ifindex, vrf_id_t vrf_id,
-                                          char *optional_name);
+extern struct interface *if_get_by_ifindex(ifindex_t ifindex, vrf_id_t vrf_id);
+
 /* Sets the index and adds to index list */
 extern int if_set_index(struct interface *ifp, ifindex_t ifindex);
 /* Sets the name and adds to name list */
index e1c0159fc58259043e629063aea27e94fefd8bdc..98f359401e377c4fc33e4e45dc652cd4ad3dd014 100644 (file)
@@ -379,20 +379,12 @@ struct ns *ns_lookup(ns_id_t ns_id)
        return ns_lookup_internal(ns_id);
 }
 
-void ns_walk_func(int (*func)(struct ns *,
-                             void *param_in,
-                             void **param_out),
-                 void *param_in,
-                 void **param_out)
+void ns_walk_func(int (*func)(struct ns *))
 {
        struct ns *ns = NULL;
-       int ret;
 
-       RB_FOREACH (ns, ns_head, &ns_tree) {
-               ret = func(ns, param_in, param_out);
-               if (ret == NS_WALK_STOP)
-                       return;
-       }
+       RB_FOREACH (ns, ns_head, &ns_tree)
+               func(ns);
 }
 
 const char *ns_get_name(struct ns *ns)
@@ -592,33 +584,9 @@ int ns_socket(int domain, int type, int protocol, ns_id_t ns_id)
        return ret;
 }
 
-/* if relative link_nsid matches default netns,
- * then return default absolute netns value
- * otherwise, return NS_UNKNOWN
- */
-ns_id_t ns_id_get_absolute(ns_id_t ns_id_reference, ns_id_t link_nsid)
-{
-       struct ns *ns;
-
-       ns = ns_lookup(ns_id_reference);
-       if (!ns)
-               return NS_UNKNOWN;
-       if (ns->relative_default_ns != link_nsid)
-               return NS_UNKNOWN;
-       ns = ns_get_default();
-       assert(ns);
-       return ns->ns_id;
-}
-
 ns_id_t ns_get_default_id(void)
 {
        if (default_ns)
                return default_ns->ns_id;
        return NS_DEFAULT_INTERNAL;
 }
-
-struct ns *ns_get_default(void)
-{
-       return default_ns;
-}
-
index 286ff5b29517514beae64ce6595dc6c714892af8..20e0a38e3b3e0d84586188171e7a8c1640199d79 100644 (file)
--- a/lib/ns.h
+++ b/lib/ns.h
@@ -53,11 +53,6 @@ struct ns {
        /* Identifier, mapped on the NSID value */
        ns_id_t internal_ns_id;
 
-       /* Identifier, value of NSID of default netns,
-        * relative value in that local netns
-        */
-       ns_id_t relative_default_ns;
-
        /* Name */
        char *name;
 
@@ -125,14 +120,7 @@ int ns_socket(int domain, int type, int protocol, ns_id_t ns_id);
 extern char *ns_netns_pathname(struct vty *vty, const char *name);
 
 /* Parse and execute a function on all the NETNS */
-#define NS_WALK_CONTINUE 0
-#define NS_WALK_STOP 1
-
-extern void ns_walk_func(int (*func)(struct ns *,
-                                    void *,
-                                    void **),
-                        void *param_in,
-                        void **param_out);
+extern void ns_walk_func(int (*func)(struct ns *));
 
 /* API to get the NETNS name, from the ns pointer */
 extern const char *ns_get_name(struct ns *ns);
@@ -186,9 +174,7 @@ extern struct ns *ns_lookup_name(const char *name);
  */
 extern int ns_enable(struct ns *ns, void (*func)(ns_id_t, void *));
 extern struct ns *ns_get_created(struct ns *ns, char *name, ns_id_t ns_id);
-extern ns_id_t ns_id_get_absolute(ns_id_t ns_id_reference, ns_id_t link_nsid);
 extern void ns_disable(struct ns *ns);
-extern struct ns *ns_get_default(void);
 
 #ifdef __cplusplus
 }
index 20e08b03d848f32a796fd15cc821fc9db0b65700..2a3ce2a31515c802822228dbc6be8294988eadf4 100644 (file)
--- a/lib/vrf.c
+++ b/lib/vrf.c
@@ -653,8 +653,7 @@ int vrf_handler_create(struct vty *vty, const char *vrfname,
 }
 
 int vrf_netns_handler_create(struct vty *vty, struct vrf *vrf, char *pathname,
-                            ns_id_t ns_id, ns_id_t internal_ns_id,
-                            ns_id_t rel_def_ns_id)
+                            ns_id_t ns_id, ns_id_t internal_ns_id)
 {
        struct ns *ns = NULL;
 
@@ -701,7 +700,6 @@ int vrf_netns_handler_create(struct vty *vty, struct vrf *vrf, char *pathname,
        }
        ns = ns_get_created(ns, pathname, ns_id);
        ns->internal_ns_id = internal_ns_id;
-       ns->relative_default_ns = rel_def_ns_id;
        ns->vrf_ctxt = (void *)vrf;
        vrf->ns_ctxt = (void *)ns;
        /* update VRF netns NAME */
@@ -797,9 +795,7 @@ DEFUN_NOSH (vrf_netns,
 
        frr_with_privs(vrf_daemon_privs) {
                ret = vrf_netns_handler_create(vty, vrf, pathname,
-                                              NS_UNKNOWN,
-                                              NS_UNKNOWN,
-                                              NS_UNKNOWN);
+                                              NS_UNKNOWN, NS_UNKNOWN);
        }
        return ret;
 }
index a8514d74ed9374f38589238cd3ce32d47d4b0bd4..83ed16b48e4e19678050236d555a45fec801e878 100644 (file)
--- a/lib/vrf.h
+++ b/lib/vrf.h
@@ -315,7 +315,7 @@ extern int vrf_handler_create(struct vty *vty, const char *name,
  */
 extern int vrf_netns_handler_create(struct vty *vty, struct vrf *vrf,
                                    char *pathname, ns_id_t ext_ns_id,
-                                   ns_id_t ns_id, ns_id_t rel_def_ns_id);
+                                   ns_id_t ns_id);
 
 /* used internally to enable or disable VRF.
  * Notify a change in the VRF ID of the VRF
index a15f93245121979782247c5742c22fe3bc43ec9f..4e85ce7d0289824d68e937417f464091c8c2116c 100644 (file)
@@ -721,10 +721,8 @@ static int netlink_interface(struct nlmsghdr *h, ns_id_t ns_id, int startup)
        if (tb[IFLA_LINK])
                link_ifindex = *(ifindex_t *)RTA_DATA(tb[IFLA_LINK]);
 
-       if (tb[IFLA_LINK_NETNSID]) {
+       if (tb[IFLA_LINK_NETNSID])
                link_nsid = *(ns_id_t *)RTA_DATA(tb[IFLA_LINK_NETNSID]);
-               link_nsid = ns_id_get_absolute(ns_id, link_nsid);
-       }
 
        /* Add interface.
         * We add by index first because in some cases such as the master
@@ -732,9 +730,11 @@ static int netlink_interface(struct nlmsghdr *h, ns_id_t ns_id, int startup)
         * back references on the slave interfaces is painful if not done
         * this way, i.e. by creating by ifindex.
         */
-       ifp = if_get_by_ifindex(ifi->ifi_index, vrf_id, name);
+       ifp = if_get_by_ifindex(ifi->ifi_index, vrf_id);
        set_ifindex(ifp, ifi->ifi_index, zns); /* add it to ns struct */
 
+       if_set_name(ifp, name);
+
        ifp->flags = ifi->ifi_flags & 0x0000fffff;
        ifp->mtu6 = ifp->mtu = *(uint32_t *)RTA_DATA(tb[IFLA_MTU]);
        ifp->metric = 0;
@@ -771,7 +771,7 @@ static int netlink_interface(struct nlmsghdr *h, ns_id_t ns_id, int startup)
        netlink_interface_update_l2info(ifp, linkinfo[IFLA_INFO_DATA],
                                        1, link_nsid);
        if (IS_ZEBRA_IF_BRIDGE_SLAVE(ifp))
-               zebra_l2if_update_bridge_slave(ifp, bridge_ifindex, ns_id);
+               zebra_l2if_update_bridge_slave(ifp, bridge_ifindex);
        else if (IS_ZEBRA_IF_BOND_SLAVE(ifp))
                zebra_l2if_update_bond_slave(ifp, bond_ifindex);
 
@@ -1263,10 +1263,9 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
        if (tb[IFLA_LINK])
                link_ifindex = *(ifindex_t *)RTA_DATA(tb[IFLA_LINK]);
 
-       if (tb[IFLA_LINK_NETNSID]) {
+       if (tb[IFLA_LINK_NETNSID])
                link_nsid = *(ns_id_t *)RTA_DATA(tb[IFLA_LINK_NETNSID]);
-               link_nsid = ns_id_get_absolute(ns_id, link_nsid);
-       }
+
        if (tb[IFLA_IFALIAS]) {
                desc = (char *)RTA_DATA(tb[IFLA_IFALIAS]);
        }
@@ -1354,8 +1353,7 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
                                1, link_nsid);
                        if (IS_ZEBRA_IF_BRIDGE_SLAVE(ifp))
                                zebra_l2if_update_bridge_slave(ifp,
-                                                              bridge_ifindex,
-                                                              ns_id);
+                                                              bridge_ifindex);
                        else if (IS_ZEBRA_IF_BOND_SLAVE(ifp))
                                zebra_l2if_update_bond_slave(ifp, bond_ifindex);
                } else if (ifp->vrf_id != vrf_id) {
@@ -1456,8 +1454,7 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
                                0, link_nsid);
                        if (IS_ZEBRA_IF_BRIDGE_SLAVE(ifp) || was_bridge_slave)
                                zebra_l2if_update_bridge_slave(ifp,
-                                                              bridge_ifindex,
-                                                              ns_id);
+                                                              bridge_ifindex);
                        else if (IS_ZEBRA_IF_BOND_SLAVE(ifp) || was_bond_slave)
                                zebra_l2if_update_bond_slave(ifp, bond_ifindex);
                }
index 53ae1d2089c644cc8219d9934cefa475debe3abd..c23e6037c518d220c7126bf3778eba5c7c5d8669 100644 (file)
@@ -1233,23 +1233,6 @@ static void nbr_connected_dump_vty(struct vty *vty,
        vty_out(vty, "\n");
 }
 
-static const char *zebra_zifslavetype_2str(zebra_slave_iftype_t zif_slave_type)
-{
-       switch (zif_slave_type) {
-       case ZEBRA_IF_SLAVE_BRIDGE:
-               return "Bridge";
-       case ZEBRA_IF_SLAVE_VRF:
-               return "Vrf";
-       case ZEBRA_IF_SLAVE_BOND:
-               return "Bond";
-       case ZEBRA_IF_SLAVE_OTHER:
-               return "Other";
-       case ZEBRA_IF_SLAVE_NONE:
-               return "None";
-       }
-       return "None";
-}
-
 static const char *zebra_ziftype_2str(zebra_iftype_t zif_type)
 {
        switch (zif_type) {
@@ -1477,9 +1460,6 @@ static void if_dump_vty(struct vty *vty, struct interface *ifp)
 
        vty_out(vty, "  Interface Type %s\n",
                zebra_ziftype_2str(zebra_if->zif_type));
-       vty_out(vty, "  Interface Slave Type %s\n",
-               zebra_zifslavetype_2str(zebra_if->zif_slave_type));
-
        if (IS_ZEBRA_IF_BRIDGE(ifp)) {
                struct zebra_l2info_bridge *bridge_info;
 
index 9c5a1ef9b6f213d16bd9a957bd78fb8b4b5d747b..92e94c2a2a51390f5a8132f6a96cd043dd9b1e5b 100644 (file)
@@ -186,7 +186,7 @@ static void sigint(void)
        vrf_terminate();
        rtadv_terminate();
 
-       ns_walk_func(zebra_ns_early_shutdown, NULL, NULL);
+       ns_walk_func(zebra_ns_early_shutdown);
        zebra_ns_notify_close();
 
        access_list_reset();
@@ -217,7 +217,7 @@ int zebra_finalize(struct thread *dummy)
        zlog_info("Zebra final shutdown");
 
        /* Final shutdown of ns resources */
-       ns_walk_func(zebra_ns_final_shutdown, NULL, NULL);
+       ns_walk_func(zebra_ns_final_shutdown);
 
        /* Stop dplane thread and finish any cleanup */
        zebra_dplane_shutdown();
index 4c0cc62fbf34a07862737847e14a6f807fe82dff..e549d80a5c05ae2524a7a1eaf0d53bd5e8399fb7 100644 (file)
@@ -53,13 +53,7 @@ static void map_slaves_to_bridge(struct interface *br_if, int link)
 {
        struct vrf *vrf;
        struct interface *ifp;
-       struct zebra_vrf *zvrf;
-       struct zebra_ns *zns;
 
-       zvrf = zebra_vrf_lookup_by_id(br_if->vrf_id);
-       assert(zvrf);
-       zns = zvrf->zns;
-       assert(zns);
        RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
                FOR_ALL_INTERFACES (vrf, ifp) {
                        struct zebra_if *zif;
@@ -78,8 +72,7 @@ static void map_slaves_to_bridge(struct interface *br_if, int link)
                        br_slave = &zif->brslave_info;
 
                        if (link) {
-                               if (br_slave->bridge_ifindex == br_if->ifindex &&
-                                   br_slave->ns_id == zns->ns_id)
+                               if (br_slave->bridge_ifindex == br_if->ifindex)
                                        br_slave->br_if = br_if;
                        } else {
                                if (br_slave->br_if == br_if)
@@ -90,14 +83,12 @@ static void map_slaves_to_bridge(struct interface *br_if, int link)
 }
 
 /* Public functions */
-void zebra_l2_map_slave_to_bridge(struct zebra_l2info_brslave *br_slave,
-                                 struct zebra_ns *zns)
+void zebra_l2_map_slave_to_bridge(struct zebra_l2info_brslave *br_slave)
 {
        struct interface *br_if;
 
        /* TODO: Handle change of master */
-       assert(zns);
-       br_if = if_lookup_by_index_per_ns(zebra_ns_lookup(zns->ns_id),
+       br_if = if_lookup_by_index_per_ns(zebra_ns_lookup(NS_DEFAULT),
                                          br_slave->bridge_ifindex);
        if (br_if)
                br_slave->br_if = br_if;
@@ -119,7 +110,7 @@ void zebra_l2_map_slave_to_bond(struct zebra_l2info_bondslave *bond_slave,
                bond_slave->bond_if = bond_if;
        else
                bond_slave->bond_if = if_create_ifindex(bond_slave->bond_ifindex,
-                                                       vrf_id, NULL);
+                                                       vrf_id);
 }
 
 void zebra_l2_unmap_slave_from_bond(struct zebra_l2info_bondslave *bond_slave)
@@ -246,32 +237,23 @@ void zebra_l2_vxlanif_del(struct interface *ifp)
  * from a bridge before it can be mapped to another bridge.
  */
 void zebra_l2if_update_bridge_slave(struct interface *ifp,
-                                   ifindex_t bridge_ifindex,
-                                   ns_id_t ns_id)
+                                   ifindex_t bridge_ifindex)
 {
        struct zebra_if *zif;
        ifindex_t old_bridge_ifindex;
-       ns_id_t old_ns_id;
-       struct zebra_vrf *zvrf;
 
        zif = ifp->info;
        assert(zif);
 
-       zvrf = zebra_vrf_lookup_by_id(ifp->vrf_id);
-       if (!zvrf)
-               return;
-
        old_bridge_ifindex = zif->brslave_info.bridge_ifindex;
-       old_ns_id = zif->brslave_info.ns_id;
-       if (old_bridge_ifindex == bridge_ifindex &&
-           old_ns_id == zif->brslave_info.ns_id)
+       if (old_bridge_ifindex == bridge_ifindex)
                return;
 
-       zif->brslave_info.ns_id = ns_id;
        zif->brslave_info.bridge_ifindex = bridge_ifindex;
+
        /* Set up or remove link with master */
        if (bridge_ifindex != IFINDEX_INTERNAL) {
-               zebra_l2_map_slave_to_bridge(&zif->brslave_info, zvrf->zns);
+               zebra_l2_map_slave_to_bridge(&zif->brslave_info);
                /* In the case of VxLAN, invoke the handler for EVPN. */
                if (zif->zif_type == ZEBRA_IF_VXLAN)
                        zebra_vxlan_if_update(ifp, ZEBRA_VXLIF_MASTER_CHANGE);
index a3c780ee091e7021de70c1f5b444b7f46e50a9d1..23875331f747ea63340b025257733e07b51d3c64 100644 (file)
@@ -37,7 +37,6 @@ extern "C" {
 struct zebra_l2info_brslave {
        ifindex_t bridge_ifindex; /* Bridge Master */
        struct interface *br_if;  /* Pointer to master */
-       ns_id_t ns_id; /* network namespace where bridge is */
 };
 
 /* zebra L2 interface information - bridge interface */
@@ -82,8 +81,7 @@ union zebra_l2if_info {
 
 #define IS_ZEBRA_IF_BRIDGE_VLAN_AWARE(zif) ((zif)->l2info.br.vlan_aware == 1)
 
-extern void zebra_l2_map_slave_to_bridge(struct zebra_l2info_brslave *br_slave,
-                                        struct zebra_ns *zns);
+extern void zebra_l2_map_slave_to_bridge(struct zebra_l2info_brslave *br_slave);
 extern void
 zebra_l2_unmap_slave_from_bridge(struct zebra_l2info_brslave *br_slave);
 extern void
@@ -103,8 +101,7 @@ extern void zebra_l2_vxlanif_update_access_vlan(struct interface *ifp,
                                                vlanid_t access_vlan);
 extern void zebra_l2_vxlanif_del(struct interface *ifp);
 extern void zebra_l2if_update_bridge_slave(struct interface *ifp,
-                                          ifindex_t bridge_ifindex,
-                                          ns_id_t ns_id);
+                                          ifindex_t bridge_ifindex);
 
 extern void zebra_l2if_update_bond_slave(struct interface *ifp,
                                         ifindex_t bond_ifindex);
index 79121bb0861c2fc69f975629bb8cfd2027ea21cf..8de4daf439a2cfc073860f7494a7baff32bac8fd 100644 (file)
@@ -159,34 +159,27 @@ static ns_id_t extract_nsid(struct nlmsghdr *nlh, char *buf)
        return ns_id;
 }
 
-/* fd_param = -1 is ignored.
- * netnspath set to null is ignored.
- * one of the 2 params is mandatory. netnspath is looked in priority
- */
-ns_id_t zebra_ns_id_get(const char *netnspath, int fd_param)
+ns_id_t zebra_ns_id_get(const char *netnspath)
 {
        int ns_id = -1;
        struct sockaddr_nl snl;
-       int fd = -1, sock, ret;
+       int fd, sock, ret;
        unsigned int seq;
        ns_id_t return_nsid = NS_UNKNOWN;
 
        /* netns path check */
-       if (!netnspath && fd_param == -1)
+       if (!netnspath)
                return NS_UNKNOWN;
-       if (netnspath)  {
-               fd = open(netnspath, O_RDONLY);
-               if (fd == -1)
-                       return NS_UNKNOWN;
-       } else if (fd_param != -1)
-               fd = fd_param;
+       fd = open(netnspath, O_RDONLY);
+       if (fd == -1)
+               return NS_UNKNOWN;
+
        /* netlink socket */
        sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
        if (sock < 0) {
                flog_err_sys(EC_LIB_SOCKET, "netlink( %u) socket() error: %s",
                             sock, safe_strerror(errno));
-               if (fd_param == -1)
-                       close(fd);
+               close(fd);
                return NS_UNKNOWN;
        }
        memset(&snl, 0, sizeof(snl));
@@ -199,8 +192,7 @@ ns_id_t zebra_ns_id_get(const char *netnspath, int fd_param)
                             "netlink( %u) socket() bind error: %s", sock,
                             safe_strerror(errno));
                close(sock);
-               if (fd_param == -1)
-                       close(fd);
+               close(fd);
                return NS_UNKNOWN;
        }
 
@@ -222,8 +214,7 @@ ns_id_t zebra_ns_id_get(const char *netnspath, int fd_param)
        ret = send_receive(sock, nlh, seq, buf);
        if (ret < 0) {
                close(sock);
-               if (fd_param == -1)
-                       close(fd);
+               close(fd);
                return NS_UNKNOWN;
        }
        nlh = (struct nlmsghdr *)buf;
@@ -267,8 +258,7 @@ ns_id_t zebra_ns_id_get(const char *netnspath, int fd_param)
                                "netlink( %u) recvfrom() error 2 when reading: %s",
                                fd, safe_strerror(errno));
                        close(sock);
-                       if (fd_param == -1)
-                               close(fd);
+                       close(fd);
                        if (errno == ENOTSUP) {
                                zlog_debug("NEWNSID locally generated");
                                return zebra_ns_id_get_fallback(netnspath);
@@ -289,8 +279,7 @@ ns_id_t zebra_ns_id_get(const char *netnspath, int fd_param)
                ret = send_receive(sock, nlh, seq, buf);
                if (ret < 0) {
                        close(sock);
-                       if (fd_param == -1)
-                               close(fd);
+                       close(fd);
                        return NS_UNKNOWN;
                }
                nlh = (struct nlmsghdr *)buf;
@@ -321,18 +310,16 @@ ns_id_t zebra_ns_id_get(const char *netnspath, int fd_param)
                } while (len != 0 && ret == 0);
        }
 
-       if (fd_param == -1)
-               close(fd);
+       close(fd);
        close(sock);
        return return_nsid;
 }
 
 #else
-ns_id_t zebra_ns_id_get(const char *netnspath, int fd __attribute__ ((unused)))
+ns_id_t zebra_ns_id_get(const char *netnspath)
 {
        return zebra_ns_id_get_fallback(netnspath);
 }
-
 #endif /* ! defined(HAVE_NETLINK) */
 
 #ifdef HAVE_NETNS
@@ -368,7 +355,7 @@ ns_id_t zebra_ns_id_get_default(void)
                return NS_DEFAULT_INTERNAL;
        }
        close(fd);
-       return zebra_ns_id_get((char *)NS_DEFAULT_NAME, -1);
+       return zebra_ns_id_get((char *)NS_DEFAULT_NAME);
 #else  /* HAVE_NETNS */
        return NS_DEFAULT_INTERNAL;
 #endif /* !HAVE_NETNS */
index dd9eab18e0f773e6ffb8730dcc3c11abfcc5c7e7..7a5f6851f481f94cc11eeaeca0c26a1a781b5215 100644 (file)
@@ -24,7 +24,7 @@
 extern "C" {
 #endif
 
-extern ns_id_t zebra_ns_id_get(const char *netnspath, int fd);
+extern ns_id_t zebra_ns_id_get(const char *netnspath);
 extern ns_id_t zebra_ns_id_get_default(void);
 
 #ifdef __cplusplus
index 995fa6fb5af6cbc5410d342713e205aa26a2c180..ec7681bf2381b09726ea2e5cea4c0b5640c5cbfe 100644 (file)
@@ -72,14 +72,13 @@ static void zebra_ns_notify_create_context_from_entry_name(const char *name)
        char *netnspath = ns_netns_pathname(NULL, name);
        struct vrf *vrf;
        int ret;
-       ns_id_t ns_id, ns_id_external, ns_id_relative = NS_UNKNOWN;
-       struct ns *default_ns;
+       ns_id_t ns_id, ns_id_external;
 
        if (netnspath == NULL)
                return;
 
        frr_with_privs(&zserv_privs) {
-               ns_id = zebra_ns_id_get(netnspath, -1);
+               ns_id = zebra_ns_id_get(netnspath);
        }
        if (ns_id == NS_UNKNOWN)
                return;
@@ -98,21 +97,9 @@ static void zebra_ns_notify_create_context_from_entry_name(const char *name)
                ns_map_nsid_with_external(ns_id, false);
                return;
        }
-
-       default_ns = ns_get_default();
-
-       /* force kernel ns_id creation in that new vrf */
-       frr_with_privs(&zserv_privs) {
-               ns_switch_to_netns(netnspath);
-               ns_id_relative = zebra_ns_id_get(NULL, default_ns->fd);
-               ns_switchback_to_initial();
-       }
-
        frr_with_privs(&zserv_privs) {
                ret = vrf_netns_handler_create(NULL, vrf, netnspath,
-                                              ns_id_external,
-                                              ns_id,
-                                              ns_id_relative);
+                                              ns_id_external, ns_id);
        }
        if (ret != CMD_SUCCESS) {
                flog_warn(EC_ZEBRA_NS_VRF_CREATION_FAILED,
index 6462daf6874ee7963a10233b6aae385b3c66008d..4e51437337896810655ab4cd375cb659be890927 100644 (file)
@@ -153,25 +153,20 @@ static int zebra_ns_disable_internal(struct zebra_ns *zns, bool complete)
 /* During zebra shutdown, do partial cleanup while the async dataplane
  * is still running.
  */
-int zebra_ns_early_shutdown(struct ns *ns,
-                           void *param_in __attribute__((unused)),
-                           void **param_out __attribute__((unused)))
+int zebra_ns_early_shutdown(struct ns *ns)
 {
        struct zebra_ns *zns = ns->info;
 
        if (zns == NULL)
                return 0;
 
-       zebra_ns_disable_internal(zns, false);
-       return NS_WALK_CONTINUE;
+       return zebra_ns_disable_internal(zns, false);
 }
 
 /* During zebra shutdown, do final cleanup
  * after all dataplane work is complete.
  */
-int zebra_ns_final_shutdown(struct ns *ns,
-                           void *param_in __attribute__((unused)),
-                           void **param_out __attribute__((unused)))
+int zebra_ns_final_shutdown(struct ns *ns)
 {
        struct zebra_ns *zns = ns->info;
 
@@ -180,7 +175,7 @@ int zebra_ns_final_shutdown(struct ns *ns,
 
        kernel_terminate(zns, true);
 
-       return NS_WALK_CONTINUE;
+       return 0;
 }
 
 int zebra_ns_init(const char *optional_default_name)
@@ -188,16 +183,12 @@ int zebra_ns_init(const char *optional_default_name)
        struct ns *default_ns;
        ns_id_t ns_id;
        ns_id_t ns_id_external;
-       struct ns *ns;
 
        frr_with_privs(&zserv_privs) {
                ns_id = zebra_ns_id_get_default();
        }
        ns_id_external = ns_map_nsid_with_external(ns_id, true);
        ns_init_management(ns_id_external, ns_id);
-       ns = ns_get_default();
-       if (ns)
-               ns->relative_default_ns = ns_id;
 
        default_ns = ns_lookup(ns_get_default_id());
        if (!default_ns) {
index f7d1f40782a7e42b97f0932b7cc2a59be7be21b8..dc79a83db0d878216b57ac9cde2231871acaccdb 100644 (file)
@@ -67,12 +67,9 @@ struct zebra_ns *zebra_ns_lookup(ns_id_t ns_id);
 int zebra_ns_init(const char *optional_default_name);
 int zebra_ns_enable(ns_id_t ns_id, void **info);
 int zebra_ns_disabled(struct ns *ns);
-int zebra_ns_early_shutdown(struct ns *ns,
-                           void *param_in __attribute__((unused)),
-                           void **param_out __attribute__((unused)));
-int zebra_ns_final_shutdown(struct ns *ns,
-                           void *param_in __attribute__((unused)),
-                           void **param_out __attribute__((unused)));
+int zebra_ns_early_shutdown(struct ns *ns);
+int zebra_ns_final_shutdown(struct ns *ns);
+
 int zebra_ns_config_write(struct vty *vty, struct ns *ns);
 
 #ifdef __cplusplus
index 1bb673c9407db2db7f96823bc9ec16d902963878..daff5e7b3ac25e96c2e2ddb359532f06e7c6e5b8 100644 (file)
@@ -1193,7 +1193,7 @@ static void zvni_print_mac(zebra_mac_t *mac, void *ctxt, json_object *json)
                        ifindex_t ifindex;
 
                        ifindex = mac->fwd_info.local.ifindex;
-                       zns = zebra_ns_lookup(mac->fwd_info.local.ns_id);
+                       zns = zebra_ns_lookup(NS_DEFAULT);
                        ifp = if_lookup_by_index_per_ns(zns, ifindex);
                        if (!ifp)
                                return;
@@ -1275,7 +1275,7 @@ static void zvni_print_mac(zebra_mac_t *mac, void *ctxt, json_object *json)
                        ifindex_t ifindex;
 
                        ifindex = mac->fwd_info.local.ifindex;
-                       zns = zebra_ns_lookup(mac->fwd_info.local.ns_id);
+                       zns = zebra_ns_lookup(NS_DEFAULT);
                        ifp = if_lookup_by_index_per_ns(zns, ifindex);
                        if (!ifp)
                                return;
@@ -1367,7 +1367,7 @@ static void zvni_print_mac_hash(struct hash_bucket *bucket, void *ctxt)
                if (wctx->flags & SHOW_REMOTE_MAC_FROM_VTEP)
                        return;
 
-               zns = zebra_ns_lookup(mac->fwd_info.local.ns_id);
+               zns = zebra_ns_lookup(NS_DEFAULT);
                ifindex = mac->fwd_info.local.ifindex;
                ifp = if_lookup_by_index_per_ns(zns, ifindex);
                if (!ifp) // unexpected
@@ -2729,12 +2729,7 @@ static int zvni_gw_macip_add(struct interface *ifp, zebra_vni_t *zvni,
        zebra_mac_t *mac = NULL;
        struct zebra_if *zif = NULL;
        struct zebra_l2info_vxlan *vxl = NULL;
-       struct zebra_vrf *zvrf;
-       ns_id_t local_ns_id = NS_DEFAULT;
 
-       zvrf = zebra_vrf_lookup_by_id(ifp->vrf_id);
-       if (zvrf && zvrf->zns)
-               local_ns_id = zvrf->zns->ns_id;
        zif = zvni->vxlan_if->info;
        if (!zif)
                return -1;
@@ -2759,7 +2754,6 @@ static int zvni_gw_macip_add(struct interface *ifp, zebra_vni_t *zvni,
        SET_FLAG(mac->flags, ZEBRA_MAC_DEF_GW);
        memset(&mac->fwd_info, 0, sizeof(mac->fwd_info));
        mac->fwd_info.local.ifindex = ifp->ifindex;
-       mac->fwd_info.local.ns_id = local_ns_id;
        mac->fwd_info.local.vid = vxl->access_vlan;
 
        n = zvni_neigh_lookup(zvni, ip);
@@ -3526,68 +3520,6 @@ static int zvni_mac_send_del_to_client(vni_t vni, struct ethaddr *macaddr)
                             0 /* seq */, ZEBRA_NEIGH_ACTIVE, ZEBRA_MACIP_DEL);
 }
 
-struct zvni_from_svi_param {
-       struct interface *br_if;
-       struct interface *svi_if;
-       struct zebra_if *zif;
-       uint8_t bridge_vlan_aware;
-       vlanid_t vid;
-};
-
-static int zvni_map_vlan_ns(struct ns *ns,
-                           void *_in_param,
-                           void **_p_zvni)
-{
-       struct zebra_ns *zns = ns->info;
-       struct route_node *rn;
-       struct interface *br_if;
-       zebra_vni_t **p_zvni = (zebra_vni_t **)_p_zvni;
-       zebra_vni_t *zvni;
-       struct interface *tmp_if = NULL;
-       struct zebra_if *zif;
-       struct zebra_l2info_vxlan *vxl = NULL;
-       struct zvni_from_svi_param *in_param =
-               (struct zvni_from_svi_param *)_in_param;
-       int found = 0;
-
-       if (!in_param)
-               return NS_WALK_STOP;
-       br_if = in_param->br_if;
-       zif = in_param->zif;
-       assert(zif);
-       assert(br_if);
-
-       /* See if this interface (or interface plus VLAN Id) maps to a VxLAN */
-       /* TODO: Optimize with a hash. */
-       for (rn = route_top(zns->if_table); rn; rn = route_next(rn)) {
-               tmp_if = (struct interface *)rn->info;
-               if (!tmp_if)
-                       continue;
-               zif = tmp_if->info;
-               if (!zif || zif->zif_type != ZEBRA_IF_VXLAN)
-                       continue;
-               if (!if_is_operative(tmp_if))
-                       continue;
-               vxl = &zif->l2info.vxl;
-
-               if (zif->brslave_info.br_if != br_if)
-                       continue;
-
-               if (!in_param->bridge_vlan_aware
-                   || vxl->access_vlan == in_param->vid) {
-                       found = 1;
-                       break;
-               }
-       }
-       if (!found)
-               return NS_WALK_CONTINUE;
-
-       zvni = zvni_lookup(vxl->vni);
-       if (p_zvni)
-               *p_zvni = zvni;
-       return NS_WALK_STOP;
-}
-
 /*
  * Map port or (port, VLAN) to a VNI. This is invoked upon getting MAC
  * notifications, to see if they are of interest.
@@ -3595,51 +3527,25 @@ static int zvni_map_vlan_ns(struct ns *ns,
 static zebra_vni_t *zvni_map_vlan(struct interface *ifp,
                                  struct interface *br_if, vlanid_t vid)
 {
-       struct zebra_if *zif;
-       struct zebra_l2info_bridge *br;
-       zebra_vni_t **p_zvni;
-       zebra_vni_t *zvni = NULL;
-       struct zvni_from_svi_param in_param;
-
-       /* Determine if bridge is VLAN-aware or not */
-       zif = br_if->info;
-       assert(zif);
-       br = &zif->l2info.br;
-       in_param.bridge_vlan_aware = br->vlan_aware;
-       in_param.vid = vid;
-       in_param.br_if = br_if;
-       in_param.zif = zif;
-       p_zvni = &zvni;
-
-       ns_walk_func(zvni_map_vlan_ns,
-                    (void *)&in_param,
-                    (void **)p_zvni);
-       return zvni;
-}
-
-static int zvni_from_svi_ns(struct ns *ns,
-                           void *_in_param,
-                           void **_p_zvni)
-{
-       struct zebra_ns *zns = ns->info;
+       struct zebra_ns *zns;
        struct route_node *rn;
-       struct interface *br_if;
-       zebra_vni_t **p_zvni = (zebra_vni_t **)_p_zvni;
-       zebra_vni_t *zvni;
        struct interface *tmp_if = NULL;
        struct zebra_if *zif;
+       struct zebra_l2info_bridge *br;
        struct zebra_l2info_vxlan *vxl = NULL;
-       struct zvni_from_svi_param *in_param =
-               (struct zvni_from_svi_param *)_in_param;
+       uint8_t bridge_vlan_aware;
+       zebra_vni_t *zvni;
        int found = 0;
 
-       if (!in_param)
-               return NS_WALK_STOP;
-       br_if = in_param->br_if;
-       zif = in_param->zif;
+       /* Determine if bridge is VLAN-aware or not */
+       zif = br_if->info;
        assert(zif);
+       br = &zif->l2info.br;
+       bridge_vlan_aware = br->vlan_aware;
 
+       /* See if this interface (or interface plus VLAN Id) maps to a VxLAN */
        /* 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;
                if (!tmp_if)
@@ -3654,20 +3560,17 @@ static int zvni_from_svi_ns(struct ns *ns,
                if (zif->brslave_info.br_if != br_if)
                        continue;
 
-               if (!in_param->bridge_vlan_aware
-                   || vxl->access_vlan == !in_param->vid) {
+               if (!bridge_vlan_aware || vxl->access_vlan == vid) {
                        found = 1;
                        break;
                }
        }
 
        if (!found)
-               return NS_WALK_CONTINUE;
+               return NULL;
 
        zvni = zvni_lookup(vxl->vni);
-       if (p_zvni)
-               *p_zvni = zvni;
-       return NS_WALK_STOP;
+       return zvni;
 }
 
 /*
@@ -3677,11 +3580,16 @@ static int zvni_from_svi_ns(struct ns *ns,
 static zebra_vni_t *zvni_from_svi(struct interface *ifp,
                                  struct interface *br_if)
 {
-       struct zebra_l2info_bridge *br;
-       zebra_vni_t *zvni = NULL;
-       zebra_vni_t **p_zvni;
+       struct zebra_ns *zns;
+       struct route_node *rn;
+       struct interface *tmp_if = NULL;
        struct zebra_if *zif;
-       struct zvni_from_svi_param in_param;
+       struct zebra_l2info_bridge *br;
+       struct zebra_l2info_vxlan *vxl = NULL;
+       uint8_t bridge_vlan_aware;
+       vlanid_t vid = 0;
+       zebra_vni_t *zvni;
+       int found = 0;
 
        if (!br_if)
                return NULL;
@@ -3694,10 +3602,8 @@ static zebra_vni_t *zvni_from_svi(struct interface *ifp,
        zif = br_if->info;
        assert(zif);
        br = &zif->l2info.br;
-       in_param.bridge_vlan_aware = br->vlan_aware;
-       in_param.vid = 0;
-
-       if (in_param.bridge_vlan_aware) {
+       bridge_vlan_aware = br->vlan_aware;
+       if (bridge_vlan_aware) {
                struct zebra_l2info_vlan *vl;
 
                if (!IS_ZEBRA_IF_VLAN(ifp))
@@ -3706,54 +3612,37 @@ static zebra_vni_t *zvni_from_svi(struct interface *ifp,
                zif = ifp->info;
                assert(zif);
                vl = &zif->l2info.vl;
-               in_param.vid = vl->vid;
+               vid = vl->vid;
        }
 
-       in_param.br_if = br_if;
-       in_param.zif = zif;
-       p_zvni = &zvni;
        /* See if this interface (or interface plus VLAN Id) maps to a VxLAN */
-       ns_walk_func(zvni_from_svi_ns,
-                    (void *)&in_param,
-                    (void **)p_zvni);
-       return zvni;
-}
-
-static int zvni_map_to_svi_ns(struct ns *ns,
-                             void *_in_param,
-                             void **_p_ifp)
-{
-       struct zebra_ns *zns = ns->info;
-       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 NS_WALK_STOP;
-
        /* 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))
+               if (!tmp_if)
                        continue;
                zif = tmp_if->info;
-               if (!zif || zif->zif_type != ZEBRA_IF_VLAN
-                   || zif->link != in_param->br_if)
+               if (!zif || zif->zif_type != ZEBRA_IF_VXLAN)
+                       continue;
+               if (!if_is_operative(tmp_if))
+                       continue;
+               vxl = &zif->l2info.vxl;
+
+               if (zif->brslave_info.br_if != 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 NS_WALK_STOP;
+               if (!bridge_vlan_aware || vxl->access_vlan == vid) {
+                       found = 1;
+                       break;
                }
        }
-       return NS_WALK_CONTINUE;
+
+       if (!found)
+               return NULL;
+
+       zvni = zvni_lookup(vxl->vni);
+       return zvni;
 }
 
 /* Map to SVI on bridge corresponding to specified VLAN. This can be one
@@ -3765,11 +3654,15 @@ static int zvni_map_to_svi_ns(struct ns *ns,
  */
 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 zvni_from_svi_param in_param;
-       struct interface **p_ifp;
+       struct zebra_l2info_vlan *vl;
+       uint8_t bridge_vlan_aware;
+       int found = 0;
+
        /* Defensive check, caller expected to invoke only with valid bridge. */
        if (!br_if)
                return NULL;
@@ -3778,56 +3671,33 @@ static struct interface *zvni_map_to_svi(vlanid_t vid, struct interface *br_if)
        zif = br_if->info;
        assert(zif);
        br = &zif->l2info.br;
-       in_param.bridge_vlan_aware = br->vlan_aware;
+       bridge_vlan_aware = br->vlan_aware;
+
        /* Check oper status of the SVI. */
-       if (!in_param.bridge_vlan_aware)
+       if (!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. */
-       ns_walk_func(zvni_map_to_svi_ns,
-                    (void *)&in_param,
-                    (void **)p_ifp);
-       return tmp_if;
-}
-
-static int zvni_map_to_macvlan_ns(struct ns *ns,
-                                 void *_in_param,
-                                 void **_p_ifp)
-{
-       struct zebra_ns *zns = ns->info;
-       struct zvni_from_svi_param *in_param =
-               (struct zvni_from_svi_param *)_in_param;
-       struct interface **p_ifp = (struct interface **)_p_ifp;
-       struct route_node *rn;
-       struct interface *tmp_if = NULL;
-       struct zebra_if *zif;
-
-       if (!in_param)
-               return NS_WALK_STOP;
-
        /* 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_MACVLAN)
+               if (!zif || zif->zif_type != ZEBRA_IF_VLAN
+                   || zif->link != br_if)
                        continue;
+               vl = &zif->l2info.vl;
 
-               if (zif->link == in_param->svi_if) {
-                       if (p_ifp)
-                               *p_ifp = tmp_if;
-                       return NS_WALK_STOP;
+               if (vl->vid == vid) {
+                       found = 1;
+                       break;
                }
        }
 
-       return NS_WALK_CONTINUE;
+       return found ? tmp_if : NULL;
 }
 
 /* Map to MAC-VLAN interface corresponding to specified SVI interface.
@@ -3835,10 +3705,11 @@ static int zvni_map_to_macvlan_ns(struct ns *ns,
 static struct interface *zvni_map_to_macvlan(struct interface *br_if,
                                             struct interface *svi_if)
 {
+       struct zebra_ns *zns;
+       struct route_node *rn;
        struct interface *tmp_if = NULL;
        struct zebra_if *zif;
-       struct interface **p_ifp;
-       struct zvni_from_svi_param in_param;
+       int found = 0;
 
        /* Defensive check, caller expected to invoke only with valid bridge. */
        if (!br_if)
@@ -3853,19 +3724,28 @@ static struct interface *zvni_map_to_macvlan(struct interface *br_if,
        zif = br_if->info;
        assert(zif);
 
-       in_param.vid = 0;
-       in_param.br_if = br_if;
-       in_param.zif = NULL;
-       in_param.svi_if = svi_if;
-       p_ifp = &tmp_if;
-
        /* Identify corresponding VLAN interface. */
-       ns_walk_func(zvni_map_to_macvlan_ns,
-                    (void *)&in_param,
-                    (void **)p_ifp);
-       return tmp_if;
+       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_MACVLAN)
+                       continue;
+
+               if (zif->link == svi_if) {
+                       found = 1;
+                       break;
+               }
+       }
+
+       return found ? tmp_if : NULL;
 }
 
+
 /*
  * Install remote MAC into the forwarding plane.
  */
@@ -4018,7 +3898,6 @@ static void zvni_deref_ip2mac(zebra_vni_t *zvni, zebra_mac_t *mac)
 static void zvni_read_mac_neigh(zebra_vni_t *zvni, struct interface *ifp)
 {
        struct zebra_ns *zns;
-       struct zebra_vrf *zvrf;
        struct zebra_if *zif;
        struct interface *vlan_if;
        struct zebra_l2info_vxlan *vxl;
@@ -4026,10 +3905,7 @@ static void zvni_read_mac_neigh(zebra_vni_t *zvni, struct interface *ifp)
 
        zif = ifp->info;
        vxl = &zif->l2info.vxl;
-       zvrf = zebra_vrf_lookup_by_id(zvni->vrf_id);
-       if (!zvrf || !zvrf->zns)
-               return;
-       zns = zvrf->zns;
+       zns = zebra_ns_lookup(NS_DEFAULT);
 
        if (IS_ZEBRA_DEBUG_VXLAN)
                zlog_debug(
@@ -4237,21 +4113,18 @@ static int zvni_send_del_to_client(vni_t vni)
        return zserv_send_message(client, s);
 }
 
-static int zvni_build_hash_table_ns(struct ns *ns,
-                                    void *param_in __attribute__((unused)),
-                                    void **param_out __attribute__((unused)))
+/*
+ * Build the VNI hash table by going over the VxLAN interfaces. This
+ * is called when EVPN (advertise-all-vni) is enabled.
+ */
+static void zvni_build_hash_table(void)
 {
-       struct zebra_ns *zns = ns->info;
+       struct zebra_ns *zns;
        struct route_node *rn;
        struct interface *ifp;
-       struct zebra_vrf *zvrf;
-
-       zvrf = zebra_vrf_get_evpn();
-
-       if (!zvrf)
-               return NS_WALK_STOP;
 
        /* Walk VxLAN interfaces and create VNI hash. */
+       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;
@@ -4268,14 +4141,7 @@ static int zvni_build_hash_table_ns(struct ns *ns,
 
                vxl = &zif->l2info.vxl;
                vni = vxl->vni;
-               /* link of VXLAN interface should be in zebra_evpn_vrf */
-               if (zvrf->zns->ns_id != vxl->link_nsid) {
-                       if (IS_ZEBRA_DEBUG_VXLAN)
-                               zlog_debug(
-                                       "Intf %s(%u) VNI %u, link not in same namespace than BGP EVPN core instance ",
-                                       ifp->name, ifp->ifindex, vni);
-                       continue;
-               }
+
                /* L3-VNI and L2-VNI are handled seperately */
                zl3vni = zl3vni_lookup(vni);
                if (zl3vni) {
@@ -4344,7 +4210,7 @@ static int zvni_build_hash_table_ns(struct ns *ns,
                                        zlog_debug(
                                                "Failed to add VNI hash, IF %s(%u) L2-VNI %u",
                                                ifp->name, ifp->ifindex, vni);
-                                       return NS_WALK_CONTINUE;
+                                       return;
                                }
 
                                if (zvni->local_vtep_ip.s_addr !=
@@ -4381,19 +4247,6 @@ static int zvni_build_hash_table_ns(struct ns *ns,
                        }
                }
        }
-       return NS_WALK_CONTINUE;
-}
-
-/*
- * Build the VNI hash table by going over the VxLAN interfaces. This
- * is called when EVPN (advertise-all-vni) is enabled.
- */
-
-static void zvni_build_hash_table(void)
-{
-       ns_walk_func(zvni_build_hash_table_ns,
-                    (void *)NULL,
-                    (void **)NULL);
 }
 
 /*
@@ -5178,22 +5031,14 @@ static int zl3vni_del(zebra_l3vni_t *zl3vni)
        return 0;
 }
 
-static int zl3vni_map_to_vxlan_if_ns(struct ns *ns,
-                                     void *_zl3vni,
-                                     void **_pifp)
+struct interface *zl3vni_map_to_vxlan_if(zebra_l3vni_t *zl3vni)
 {
-       struct zebra_ns *zns = ns->info;
-       zebra_l3vni_t *zl3vni = (zebra_l3vni_t *)_zl3vni;
+       struct zebra_ns *zns = NULL;
        struct route_node *rn = NULL;
        struct interface *ifp = NULL;
-       struct zebra_vrf *zvrf;
-
-       zvrf = zebra_vrf_get_evpn();
-
-       if (!zvrf)
-               return NS_WALK_STOP;
 
        /* loop through all vxlan-interface */
+       zns = zebra_ns_lookup(NS_DEFAULT);
        for (rn = route_top(zns->if_table); rn; rn = route_next(rn)) {
 
                struct zebra_if *zif = NULL;
@@ -5208,38 +5053,13 @@ static int zl3vni_map_to_vxlan_if_ns(struct ns *ns,
                        continue;
 
                vxl = &zif->l2info.vxl;
-               if (vxl->vni != zl3vni->vni)
-                       continue;
-
-               /* link of VXLAN interface should be in zebra_evpn_vrf */
-               if (zvrf->zns->ns_id != vxl->link_nsid) {
-                       if (IS_ZEBRA_DEBUG_VXLAN)
-                               zlog_debug(
-                                       "Intf %s(%u) VNI %u, link not in same namespace than BGP EVPN core instance ",
-                                       ifp->name, ifp->ifindex, vxl->vni);
-                       continue;
+               if (vxl->vni == zl3vni->vni) {
+                       zl3vni->local_vtep_ip = vxl->vtep_ip;
+                       return ifp;
                }
-
-
-               zl3vni->local_vtep_ip = vxl->vtep_ip;
-               if (_pifp)
-                       *_pifp = (void *)ifp;
-               return NS_WALK_STOP;
        }
 
-       return NS_WALK_CONTINUE;
-}
-
-struct interface *zl3vni_map_to_vxlan_if(zebra_l3vni_t *zl3vni)
-{
-       struct interface **p_ifp;
-       struct interface *ifp = NULL;
-
-       p_ifp = &ifp;
-
-       ns_walk_func(zl3vni_map_to_vxlan_if_ns,
-                    (void *)zl3vni, (void **)p_ifp);
-       return ifp;
+       return NULL;
 }
 
 struct interface *zl3vni_map_to_svi_if(zebra_l3vni_t *zl3vni)
@@ -5715,7 +5535,7 @@ static void process_remote_macip_add(vni_t vni,
                return;
        }
 
-       zvrf = zebra_vrf_get_evpn();
+       zvrf = vrf_info_lookup(zvni->vxlan_if->vrf_id);
        if (!zvrf)
                return;
 
@@ -8196,11 +8016,6 @@ int zebra_vxlan_local_mac_add_update(struct interface *ifp,
        bool upd_neigh = false;
        bool is_dup_detect = false;
        struct in_addr vtep_ip = {.s_addr = 0};
-       ns_id_t local_ns_id = NS_DEFAULT;
-
-       zvrf = zebra_vrf_lookup_by_id(ifp->vrf_id);
-       if (zvrf && zvrf->zns)
-               local_ns_id = zvrf->zns->ns_id;
 
        /* We are interested in MACs only on ports or (port, VLAN) that
         * map to a VNI.
@@ -8224,10 +8039,11 @@ int zebra_vxlan_local_mac_add_update(struct interface *ifp,
                return -1;
        }
 
-       zvrf = zebra_vrf_get_evpn();
+       zvrf = vrf_info_lookup(zvni->vxlan_if->vrf_id);
        if (!zvrf) {
                if (IS_ZEBRA_DEBUG_VXLAN)
-                       zlog_debug("        No Evpn Global Vrf found");
+                       zlog_debug("        No Vrf found for vrf_id: %d",
+                                  zvni->vxlan_if->vrf_id);
                return -1;
        }
 
@@ -8252,7 +8068,6 @@ int zebra_vxlan_local_mac_add_update(struct interface *ifp,
                }
                SET_FLAG(mac->flags, ZEBRA_MAC_LOCAL);
                mac->fwd_info.local.ifindex = ifp->ifindex;
-               mac->fwd_info.local.ns_id = local_ns_id;
                mac->fwd_info.local.vid = vid;
                if (sticky)
                        SET_FLAG(mac->flags, ZEBRA_MAC_STICKY);
@@ -8277,7 +8092,6 @@ int zebra_vxlan_local_mac_add_update(struct interface *ifp,
                         */
                        if (mac_sticky == sticky
                            && mac->fwd_info.local.ifindex == ifp->ifindex
-                           && mac->fwd_info.local.ns_id == local_ns_id
                            && mac->fwd_info.local.vid == vid) {
                                if (IS_ZEBRA_DEBUG_VXLAN)
                                        zlog_debug(
@@ -8301,7 +8115,6 @@ int zebra_vxlan_local_mac_add_update(struct interface *ifp,
 
                        memset(&mac->fwd_info, 0, sizeof(mac->fwd_info));
                        mac->fwd_info.local.ifindex = ifp->ifindex;
-                       mac->fwd_info.local.ns_id = local_ns_id;
                        mac->fwd_info.local.vid = vid;
 
                } else if (CHECK_FLAG(mac->flags, ZEBRA_MAC_REMOTE) ||
@@ -8339,7 +8152,6 @@ int zebra_vxlan_local_mac_add_update(struct interface *ifp,
                        SET_FLAG(mac->flags, ZEBRA_MAC_LOCAL);
                        memset(&mac->fwd_info, 0, sizeof(mac->fwd_info));
                        mac->fwd_info.local.ifindex = ifp->ifindex;
-                       mac->fwd_info.local.ns_id = local_ns_id;
                        mac->fwd_info.local.vid = vid;
                        if (sticky)
                                SET_FLAG(mac->flags, ZEBRA_MAC_STICKY);
@@ -9811,25 +9623,6 @@ stream_failure:
        return;
 }
 
-static int macfdb_read_ns(struct ns *ns,
-                            void *_in_param __attribute__((unused)),
-                            void **out_param __attribute__((unused)))
-{
-       struct zebra_ns *zns = ns->info;
-
-       macfdb_read(zns);
-       return NS_WALK_CONTINUE;
-}
-
-static int neigh_read_ns(struct ns *ns,
-                         void *_in_param __attribute__((unused)),
-                         void **out_param __attribute__((unused)))
-{
-       struct zebra_ns *zns = ns->info;
-
-       neigh_read(zns);
-       return NS_WALK_CONTINUE;
-}
 
 /*
  * Handle message from client to learn (or stop learning) about VNIs and MACs.
@@ -9879,10 +9672,10 @@ void zebra_vxlan_advertise_all_vni(ZAPI_HANDLER_ARGS)
                             NULL);
 
                /* Read the MAC FDB */
-               ns_walk_func(macfdb_read_ns, NULL, NULL);
+               macfdb_read(zvrf->zns);
 
                /* Read neighbors */
-               ns_walk_func(neigh_read_ns, NULL, NULL);
+               neigh_read(zvrf->zns);
        } else {
                /* Cleanup VTEPs for all VNIs - uninstall from
                 * kernel and free entries.
index e4b06054b2986ccc3fc6ae05943e350b6201f41a..806611c50ea30da62df85c91ccb1c65d043df48f 100644 (file)
@@ -310,7 +310,6 @@ struct zebra_mac_t_ {
        union {
                struct {
                        ifindex_t ifindex;
-                       ns_id_t ns_id;
                        vlanid_t vid;
                } local;