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 <philippe.guibert@6wind.com>
This commit is contained in:
Philippe Guibert 2018-02-13 10:48:48 +01:00
parent 281da0a94d
commit 009f8ad5f3
2 changed files with 13 additions and 27 deletions

View File

@ -513,13 +513,14 @@ void if_add_update(struct interface *ifp)
{ {
struct zebra_if *if_data; struct zebra_if *if_data;
struct zebra_ns *zns; struct zebra_ns *zns;
struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id);
if (vrf_is_backend_netns()) /* case interface populate before vrf enabled */
zns = zebra_ns_lookup((ns_id_t)ifp->vrf_id); if (zvrf->zns)
zns = zvrf->zns;
else else
zns = zebra_ns_lookup(NS_DEFAULT); zns = zebra_ns_lookup(NS_DEFAULT);
if_link_per_ns(zns, ifp); if_link_per_ns(zns, ifp);
if_data = ifp->info; if_data = ifp->info;
assert(if_data); 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); inet_pton(AF_INET, buf, &ipv4_ll);
ipv6_ll_address_to_mac(address, (u_char *)mac); 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 * Remove existed arp record for the interface as netlink
* protocol does not have update message types * protocol does not have update message types

View File

@ -1337,10 +1337,7 @@ static int netlink_route_multipath(int cmd, struct prefix *p,
struct zebra_ns *zns; struct zebra_ns *zns;
struct zebra_vrf *zvrf = vrf_info_lookup(re->vrf_id); struct zebra_vrf *zvrf = vrf_info_lookup(re->vrf_id);
if (!vrf_is_backend_netns()) zns = zvrf->zns;
zns = zebra_ns_lookup(NS_DEFAULT);
else
zns = (struct zebra_ns *)ns_info_lookup(re->vrf_id);
memset(&req, 0, sizeof req - NL_PKT_BUF_SIZE); memset(&req, 0, sizeof req - NL_PKT_BUF_SIZE);
bytelen = (family == AF_INET ? 4 : 16); bytelen = (family == AF_INET ? 4 : 16);
@ -1640,10 +1637,7 @@ int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *in)
mroute = mr; mroute = mr;
struct zebra_ns *zns; struct zebra_ns *zns;
if (!vrf_is_backend_netns()) zns = zvrf->zns;
zns = zebra_ns_lookup(NS_DEFAULT);
else
zns = (struct zebra_ns *)ns_info_lookup(zvrf->vrf->vrf_id);
memset(&req.n, 0, sizeof(req.n)); memset(&req.n, 0, sizeof(req.n));
memset(&req.ndm, 0, sizeof(req.ndm)); memset(&req.ndm, 0, sizeof(req.ndm));
@ -1736,11 +1730,9 @@ static int netlink_vxlan_flood_list_update(struct interface *ifp,
char buf[256]; char buf[256];
} req; } req;
u_char dst_mac[6] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; 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 = zvrf->zns;
zns = zebra_ns_lookup(NS_DEFAULT);
else
zns = (struct zebra_ns *)ns_info_lookup(ifp->vrf_id);
memset(&req.n, 0, sizeof(req.n)); memset(&req.n, 0, sizeof(req.n));
memset(&req.ndm, 0, sizeof(req.ndm)); 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; int vid_present = 0, dst_present = 0;
char vid_buf[20]; char vid_buf[20];
char dst_buf[30]; char dst_buf[30];
struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(ifp->vrf_id);
if (!vrf_is_backend_netns()) zns = zvrf->zns;
zns = zebra_ns_lookup(NS_DEFAULT);
else
zns = (struct zebra_ns *)ns_info_lookup(ifp->vrf_id);
zif = ifp->info; zif = ifp->info;
if ((br_if = zif->brslave_info.br_if) == NULL) { if ((br_if = zif->brslave_info.br_if) == NULL) {
zlog_warn("MAC %s on IF %s(%u) - no mapping to bridge", 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; struct zebra_ns *zns;
char buf[INET6_ADDRSTRLEN]; char buf[INET6_ADDRSTRLEN];
char buf2[ETHER_ADDR_STRLEN]; char buf2[ETHER_ADDR_STRLEN];
struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(ifp->vrf_id);
if (!vrf_is_backend_netns()) zns = zvrf->zns;
zns = zebra_ns_lookup(NS_DEFAULT);
else
zns = (struct zebra_ns *)ns_info_lookup(ifp->vrf_id);
memset(&req.n, 0, sizeof(req.n)); memset(&req.n, 0, sizeof(req.n));
memset(&req.ndm, 0, sizeof(req.ndm)); memset(&req.ndm, 0, sizeof(req.ndm));