summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--zebra/if_netlink.c5
-rw-r--r--zebra/interface.c10
-rw-r--r--zebra/interface.h2
3 files changed, 9 insertions, 8 deletions
diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c
index 6aaf9d94f3..e7d8b318e0 100644
--- a/zebra/if_netlink.c
+++ b/zebra/if_netlink.c
@@ -974,7 +974,7 @@ int interface_lookup_netlink(struct zebra_ns *zns)
return ret;
/* fixup linkages */
- zebra_if_update_all_links();
+ zebra_if_update_all_links(zns);
return 0;
}
@@ -1550,6 +1550,9 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
memcpy(old_hw_addr, ifp->hw_addr, INTERFACE_HWADDR_MAX);
+ /* Update link. */
+ zebra_if_update_link(ifp, link_ifindex, ns_id);
+
netlink_interface_update_hw_addr(tb, ifp);
if (if_is_no_ptm_operative(ifp)) {
diff --git a/zebra/interface.c b/zebra/interface.c
index 4b708496a1..a3134d6647 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -1148,18 +1148,16 @@ void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex,
* during initial link dump kernel does not order lower devices before
* upper devices so we need to fixup link dependencies at the end of dump
*/
-void zebra_if_update_all_links(void)
+void zebra_if_update_all_links(struct zebra_ns *zns)
{
struct route_node *rn;
struct interface *ifp;
struct zebra_if *zif;
- struct zebra_ns *ns;
if (IS_ZEBRA_DEBUG_KERNEL)
zlog_info("fixup link dependencies");
- ns = zebra_ns_lookup(NS_DEFAULT);
- for (rn = route_top(ns->if_table); rn; rn = route_next(rn)) {
+ for (rn = route_top(zns->if_table); rn; rn = route_next(rn)) {
ifp = (struct interface *)rn->info;
if (!ifp)
continue;
@@ -1177,8 +1175,8 @@ void zebra_if_update_all_links(void)
/* update SVI linkages */
if ((zif->link_ifindex != IFINDEX_INTERNAL) && !zif->link) {
- zif->link = if_lookup_by_index_per_ns(ns,
- zif->link_ifindex);
+ zif->link = if_lookup_by_index_per_ns(
+ zns, zif->link_ifindex);
if (IS_ZEBRA_DEBUG_KERNEL)
zlog_debug("interface %s/%d's lower fixup to %s/%d",
ifp->name, ifp->ifindex,
diff --git a/zebra/interface.h b/zebra/interface.h
index 67eb1176b9..24bc70cb9b 100644
--- a/zebra/interface.h
+++ b/zebra/interface.h
@@ -482,7 +482,7 @@ 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,
ns_id_t ns_id);
-extern void zebra_if_update_all_links(void);
+extern void zebra_if_update_all_links(struct zebra_ns *zns);
extern void zebra_if_set_protodown(struct interface *ifp, bool down);
extern int if_ip_address_install(struct interface *ifp, struct prefix *prefix,
const char *label, struct prefix *pp);