From b8af3fbbafc83b22c3215f3eb97a6465324cc10a Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Sun, 30 Apr 2017 10:26:06 -0300 Subject: [PATCH] zebra: fix detection of interface renames Restore the original logic in netlink_link_change() which works like this: * once an interface event is detected, lookup the associated interface by its name; * call the set_ifindex() function; * set_ifindex() will lookup the interface again but now by its ifindex. If the lookups by name and ifindex yield to different results, then the interface was renamed and set_ifindex() will take care of that. In the future, zns->if_table will be split into two different data structures to allow faster lookups by both name and ifindex. Fixes Issue #397. Regression introduced by commit 12f6fb9. Signed-off-by: Renato Westphal --- zebra/if_netlink.c | 2 +- zebra/interface.c | 17 +++++++++++++++++ zebra/interface.h | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c index 28538fabdf..006fcf16f4 100644 --- a/zebra/if_netlink.c +++ b/zebra/if_netlink.c @@ -746,7 +746,7 @@ netlink_link_change (struct sockaddr_nl *snl, struct nlmsghdr *h, } /* See if interface is present. */ - ifp = if_lookup_by_index_per_ns (zns, ifi->ifi_index); + ifp = if_lookup_by_name_per_ns (zns, name); if (h->nlmsg_type == RTM_NEWLINK) { diff --git a/zebra/interface.c b/zebra/interface.c index 444f3bd587..b227409586 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -211,6 +211,23 @@ if_lookup_by_index_per_ns (struct zebra_ns *ns, u_int32_t ifindex) return ifp; } +/* Look up an interface by name within a NS */ +struct interface * +if_lookup_by_name_per_ns (struct zebra_ns *ns, const char *ifname) +{ + struct route_node *rn; + struct interface *ifp; + + for (rn = route_top (ns->if_table); rn; rn = route_next (rn)) + { + ifp = (struct interface *)rn->info; + if (ifp && strcmp (ifp->name, ifname) == 0) + return (ifp); + } + + return NULL; +} + const char * ifindex2ifname_per_ns (struct zebra_ns *zns, unsigned int ifindex) { diff --git a/zebra/interface.h b/zebra/interface.h index 6039e2d379..9f108760d6 100644 --- a/zebra/interface.h +++ b/zebra/interface.h @@ -236,6 +236,7 @@ struct zebra_if extern struct interface *if_lookup_by_index_per_ns (struct zebra_ns *, u_int32_t); +extern struct interface *if_lookup_by_name_per_ns (struct zebra_ns *, const char *); extern struct interface *if_link_per_ns (struct zebra_ns *, struct interface *); extern const char *ifindex2ifname_per_ns (struct zebra_ns *, unsigned int); -- 2.39.5