Message ID | 20191002105645.30756-3-jiri@resnulli.us |
---|---|
State | Changes Requested |
Delegated to: | David Ahern |
Headers | show |
Series | ip: add support for alternative names | expand |
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? > + > + 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; > } > >
Mon, Oct 07, 2019 at 11:52:46PM CEST, dsahern@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; >> } >> >> >
diff --git a/ip/iplink.c b/ip/iplink.c index e3f8a28fe94c..1684e259b538 100644 --- a/ip/iplink.c +++ b/ip/iplink.c @@ -931,7 +931,7 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type) NEXT_ARG(); if (dev != name) duparg2("dev", *argv); - if (check_ifname(*argv)) + if (check_altifname(*argv)) invarg("\"dev\" not a valid ifname", *argv); dev = *argv; } @@ -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, + 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); + + 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); return idx; }