From: Philippe Guibert Date: Tue, 13 Feb 2018 09:48:48 +0000 (+0100) Subject: zebra: retrieve zns context from zvrf when netlink discovery X-Git-Tag: frr-5.0-dev~209^2~1 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=009f8ad5f3a99ae813d8a6739a1137443c83e345;p=matthieu%2Ffrr.git zebra: retrieve zns context from zvrf when netlink discovery 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 --- diff --git a/zebra/interface.c b/zebra/interface.c index e919d9f08f..7229b8818d 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -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 diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index 0371c6b99b..e26109badf 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -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));