From: Philippe Guibert Date: Mon, 27 Aug 2018 15:00:18 +0000 (+0200) Subject: zebra: when veth link is used across vrf, the link may not be good X-Git-Tag: frr-7.1-dev~412^2~1 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=680c278fb8110b19873a4f4877878b1ea0eec2d3;p=mirror%2Ffrr.git zebra: when veth link is used across vrf, the link may not be good This function is changed so that the interface index is searched across the correct namespace. Signed-off-by: Philippe Guibert --- diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c index a15d914243..2b9e8a589c 100644 --- a/zebra/if_netlink.c +++ b/zebra/if_netlink.c @@ -675,7 +675,7 @@ static int netlink_interface(struct nlmsghdr *h, ns_id_t ns_id, int startup) SET_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK); /* Update link. */ - zebra_if_update_link(ifp, link_ifindex); + zebra_if_update_link(ifp, link_ifindex, ns_id); /* Hardware type and address. */ ifp->ll_type = netlink_to_zebra_link_type(ifi->ifi_type); @@ -1262,7 +1262,7 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) ZEBRA_INTERFACE_VRF_LOOPBACK); /* Update link. */ - zebra_if_update_link(ifp, link_ifindex); + zebra_if_update_link(ifp, link_ifindex, ns_id); netlink_interface_update_hw_addr(tb, ifp); diff --git a/zebra/interface.c b/zebra/interface.c index 763931d350..8558a8bd59 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -1002,13 +1002,14 @@ void if_refresh(struct interface *ifp) if_get_flags(ifp); } -void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex) +void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex, + ns_id_t ns_id) { struct zebra_if *zif; zif = (struct zebra_if *)ifp->info; zif->link_ifindex = link_ifindex; - zif->link = if_lookup_by_index_per_ns(zebra_ns_lookup(NS_DEFAULT), + zif->link = if_lookup_by_index_per_ns(zebra_ns_lookup(ns_id), link_ifindex); } diff --git a/zebra/interface.h b/zebra/interface.h index 9634bfdb3f..bb39ac5e67 100644 --- a/zebra/interface.h +++ b/zebra/interface.h @@ -344,7 +344,8 @@ extern int if_subnet_add(struct interface *, struct connected *); extern int if_subnet_delete(struct interface *, struct connected *); extern int ipv6_address_configured(struct interface *ifp); extern void if_handle_vrf_change(struct interface *ifp, vrf_id_t vrf_id); -extern void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex); +extern void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex, + ns_id_t ns_id); extern void vrf_add_update(struct vrf *vrfp);