Mon, Oct 07, 2019 at 11:52:46PM CEST, dsah...@gmail.com wrote: >On 10/2/19 4:56 AM, Jiri Pirko wrote: >> @@ -1106,7 +1106,8 @@ int iplink_get(char *name, __u32 filt_mask) >> >> if (name) { >> addattr_l(&req.n, sizeof(req), >> - IFLA_IFNAME, name, strlen(name) + 1); >> + !check_ifname(name) ? IFLA_IFNAME : IFLA_ALT_IFNAME, > >If this trick works here ... > >> + name, strlen(name) + 1); >> } >> addattr32(&req.n, sizeof(req), IFLA_EXT_MASK, filt_mask); >> >> diff --git a/lib/ll_map.c b/lib/ll_map.c >> index e0ed54bf77c9..04dfb0f2320b 100644 >> --- a/lib/ll_map.c >> +++ b/lib/ll_map.c >> @@ -70,7 +70,7 @@ static struct ll_cache *ll_get_by_name(const char *name) >> struct ll_cache *im >> = container_of(n, struct ll_cache, name_hash); >> >> - if (strncmp(im->name, name, IFNAMSIZ) == 0) >> + if (strcmp(im->name, name) == 0) >> return im; >> } >> >> @@ -240,6 +240,43 @@ int ll_index_to_flags(unsigned idx) >> return im ? im->flags : -1; >> } >> >> +static int altnametoindex(const char *name) >> +{ >> + struct { >> + struct nlmsghdr n; >> + struct ifinfomsg ifm; >> + char buf[1024]; >> + } req = { >> + .n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)), >> + .n.nlmsg_flags = NLM_F_REQUEST, >> + .n.nlmsg_type = RTM_GETLINK, >> + }; >> + struct rtnl_handle rth = {}; >> + struct nlmsghdr *answer; >> + struct ifinfomsg *ifm; >> + int rc = 0; >> + >> + if (rtnl_open(&rth, 0) < 0) >> + return 0; >> + >> + addattr32(&req.n, sizeof(req), IFLA_EXT_MASK, >> + RTEXT_FILTER_VF | RTEXT_FILTER_SKIP_STATS); >> + addattr_l(&req.n, sizeof(req), IFLA_ALT_IFNAME, name, strlen(name) + 1); > >then why is altnametoindex even needed? why not just use the same check >in the current ll_link_get?
Good point. Reworked. Thanks! > >> + >> + if (rtnl_talk_suppress_rtnl_errmsg(&rth, &req.n, &answer) < 0) >> + goto out; >> + >> + ifm = NLMSG_DATA(answer); >> + rc = ifm->ifi_index; >> + >> + free(answer); >> + >> + rtnl_close(&rth); >> +out: >> + return rc; >> +} >> + >> + >> unsigned ll_name_to_index(const char *name) >> { >> const struct ll_cache *im; >> @@ -257,6 +294,8 @@ unsigned ll_name_to_index(const char *name) >> idx = if_nametoindex(name); >> if (idx == 0) >> idx = ll_idx_a2n(name); >> + if (idx == 0) >> + idx = altnametoindex(name); > >And then this ordering does not need to be fixed (altname check should >come before if_nametoindex. > >> return idx; >> } >> >> >