]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: retrieve zns context from zvrf when netlink discovery
authorPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 13 Feb 2018 09:48:48 +0000 (10:48 +0100)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 27 Feb 2018 10:11:24 +0000 (11:11 +0100)
So as to get the correct NETNS where some discovery must be done and
populated, the zns pointer is directly retrieved from zvrf, instead of
checking that the VRF is a backend NETNS or not.
In the case where the interfaces are discovered before the VRF is enabled
( VRF-lite populate), then the default NS is retrieved.

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

index e919d9f08f77e1da7893bf729a37d8606f048da4..7229b8818d84d82d9e13ccf35af7b26cdbbf94ad 100644 (file)
@@ -513,13 +513,14 @@ void if_add_update(struct interface *ifp)
 {
        struct zebra_if *if_data;
        struct zebra_ns *zns;
+       struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id);
 
-       if (vrf_is_backend_netns())
-               zns = zebra_ns_lookup((ns_id_t)ifp->vrf_id);
+       /* case interface populate before vrf enabled */
+       if (zvrf->zns)
+               zns = zvrf->zns;
        else
                zns = zebra_ns_lookup(NS_DEFAULT);
        if_link_per_ns(zns, ifp);
-
        if_data = ifp->info;
        assert(if_data);
 
@@ -810,11 +811,8 @@ void if_nbr_ipv6ll_to_ipv4ll_neigh_update(struct interface *ifp,
        inet_pton(AF_INET, buf, &ipv4_ll);
 
        ipv6_ll_address_to_mac(address, (u_char *)mac);
+       ns_id = zvrf->zns->ns_id;
 
-       if (!vrf_is_backend_netns())
-               ns_id = NS_DEFAULT;
-       else
-               ns_id = (ns_id_t)(ifp->vrf_id);
        /*
         * Remove existed arp record for the interface as netlink
         * protocol does not have update message types
index 0371c6b99b985e6655ec538676f43451e32a3720..e26109badf38363b5478558e5dfc6ec8e7402d53 100644 (file)
@@ -1337,10 +1337,7 @@ static int netlink_route_multipath(int cmd, struct prefix *p,
        struct zebra_ns *zns;
        struct zebra_vrf *zvrf = vrf_info_lookup(re->vrf_id);
 
-       if (!vrf_is_backend_netns())
-               zns = zebra_ns_lookup(NS_DEFAULT);
-       else
-               zns = (struct zebra_ns *)ns_info_lookup(re->vrf_id);
+       zns = zvrf->zns;
        memset(&req, 0, sizeof req - NL_PKT_BUF_SIZE);
 
        bytelen = (family == AF_INET ? 4 : 16);
@@ -1640,10 +1637,7 @@ int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *in)
        mroute = mr;
        struct zebra_ns *zns;
 
-       if (!vrf_is_backend_netns())
-               zns = zebra_ns_lookup(NS_DEFAULT);
-       else
-               zns = (struct zebra_ns *)ns_info_lookup(zvrf->vrf->vrf_id);
+       zns = zvrf->zns;
        memset(&req.n, 0, sizeof(req.n));
        memset(&req.ndm, 0, sizeof(req.ndm));
 
@@ -1736,11 +1730,9 @@ static int netlink_vxlan_flood_list_update(struct interface *ifp,
                char buf[256];
        } req;
        u_char dst_mac[6] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
+       struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(ifp->vrf_id);
 
-       if (!vrf_is_backend_netns())
-               zns = zebra_ns_lookup(NS_DEFAULT);
-       else
-               zns = (struct zebra_ns *)ns_info_lookup(ifp->vrf_id);
+       zns = zvrf->zns;
        memset(&req.n, 0, sizeof(req.n));
        memset(&req.ndm, 0, sizeof(req.ndm));
 
@@ -2046,11 +2038,9 @@ static int netlink_macfdb_update(struct interface *ifp, vlanid_t vid,
        int vid_present = 0, dst_present = 0;
        char vid_buf[20];
        char dst_buf[30];
+       struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(ifp->vrf_id);
 
-       if (!vrf_is_backend_netns())
-               zns = zebra_ns_lookup(NS_DEFAULT);
-       else
-               zns = (struct zebra_ns *)ns_info_lookup(ifp->vrf_id);
+       zns = zvrf->zns;
        zif = ifp->info;
        if ((br_if = zif->brslave_info.br_if) == NULL) {
                zlog_warn("MAC %s on IF %s(%u) - no mapping to bridge",
@@ -2355,11 +2345,9 @@ static int netlink_neigh_update2(struct interface *ifp, struct ipaddr *ip,
        struct zebra_ns *zns;
        char buf[INET6_ADDRSTRLEN];
        char buf2[ETHER_ADDR_STRLEN];
+       struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(ifp->vrf_id);
 
-       if (!vrf_is_backend_netns())
-               zns = zebra_ns_lookup(NS_DEFAULT);
-       else
-               zns = (struct zebra_ns *)ns_info_lookup(ifp->vrf_id);
+       zns = zvrf->zns;
        memset(&req.n, 0, sizeof(req.n));
        memset(&req.ndm, 0, sizeof(req.ndm));