* [patch iproute2-next v2 0/2] ip: add support for alternative names @ 2019-10-02 10:56 Jiri Pirko 2019-10-02 10:56 ` [patch iproute2-next v2 1/2] ip: add support for alternative name addition/deletion/list Jiri Pirko 2019-10-02 10:56 ` [patch iproute2-next v2 2/2] ip: allow to use alternative names as handle Jiri Pirko 0 siblings, 2 replies; 7+ messages in thread From: Jiri Pirko @ 2019-10-02 10:56 UTC (permalink / raw) To: netdev Cc: davem, jakub.kicinski, dsahern, roopa, dcbw, nikolay, mkubecek, andrew, parav, saeedm, f.fainelli, stephen, sd, sbrivio, pabeni, mlxsw From: Jiri Pirko <jiri@mellanox.com> This patchset adds support for alternative names manipulation and usage. Jiri Pirko (2): ip: add support for alternative name addition/deletion/list ip: allow to use alternative names as handle include/uapi/linux/if_link.h | 2 + include/uapi/linux/rtnetlink.h | 7 +++ include/utils.h | 1 + ip/ipaddress.c | 20 +++++++- ip/iplink.c | 87 ++++++++++++++++++++++++++++++++-- lib/ll_map.c | 41 +++++++++++++++- lib/utils.c | 19 ++++++-- man/man8/ip-link.8.in | 11 +++++ 8 files changed, 177 insertions(+), 11 deletions(-) -- 2.21.0 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [patch iproute2-next v2 1/2] ip: add support for alternative name addition/deletion/list 2019-10-02 10:56 [patch iproute2-next v2 0/2] ip: add support for alternative names Jiri Pirko @ 2019-10-02 10:56 ` Jiri Pirko 2019-10-07 21:37 ` David Ahern 2019-10-02 10:56 ` [patch iproute2-next v2 2/2] ip: allow to use alternative names as handle Jiri Pirko 1 sibling, 1 reply; 7+ messages in thread From: Jiri Pirko @ 2019-10-02 10:56 UTC (permalink / raw) To: netdev Cc: davem, jakub.kicinski, dsahern, roopa, dcbw, nikolay, mkubecek, andrew, parav, saeedm, f.fainelli, stephen, sd, sbrivio, pabeni, mlxsw From: Jiri Pirko <jiri@mellanox.com> Implement addition/deletion of lists of properties, currently alternative ifnames. Also extent the ip link show command to list them. Signed-off-by: Jiri Pirko <jiri@mellanox.com> --- v1->v2: - s/\"NULL\"/NULL/ in print_string arg rfc->v1: - convert to generic property lists - added patch description - use ll_name_to_index() and ifindex as handle - fixed parsing with nested flag on - adjusted output - added arg name to check_altifname header prototype - added help and man parts --- include/uapi/linux/if_link.h | 2 + include/uapi/linux/rtnetlink.h | 7 +++ include/utils.h | 1 + ip/ipaddress.c | 20 ++++++++- ip/iplink.c | 82 +++++++++++++++++++++++++++++++++- lib/utils.c | 19 +++++--- man/man8/ip-link.8.in | 11 +++++ 7 files changed, 134 insertions(+), 8 deletions(-) diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h index d36919fb4024..1c49f436424d 100644 --- a/include/uapi/linux/if_link.h +++ b/include/uapi/linux/if_link.h @@ -167,6 +167,8 @@ enum { IFLA_NEW_IFINDEX, IFLA_MIN_MTU, IFLA_MAX_MTU, + IFLA_PROP_LIST, + IFLA_ALT_IFNAME, /* Alternative ifname */ __IFLA_MAX }; diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h index 358e83ee134d..4b93791cdbd4 100644 --- a/include/uapi/linux/rtnetlink.h +++ b/include/uapi/linux/rtnetlink.h @@ -164,6 +164,13 @@ enum { RTM_GETNEXTHOP, #define RTM_GETNEXTHOP RTM_GETNEXTHOP + RTM_NEWLINKPROP = 108, +#define RTM_NEWLINKPROP RTM_NEWLINKPROP + RTM_DELLINKPROP, +#define RTM_DELLINKPROP RTM_DELLINKPROP + RTM_GETLINKPROP, +#define RTM_GETLINKPROP RTM_GETLINKPROP + __RTM_MAX, #define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1) }; diff --git a/include/utils.h b/include/utils.h index 794d36053634..001491a1eb40 100644 --- a/include/utils.h +++ b/include/utils.h @@ -196,6 +196,7 @@ void duparg(const char *, const char *) __attribute__((noreturn)); void duparg2(const char *, const char *) __attribute__((noreturn)); int nodev(const char *dev); int check_ifname(const char *); +int check_altifname(const char *name); int get_ifname(char *, const char *); const char *get_ifname_rta(int ifindex, const struct rtattr *rta); bool matches(const char *prefix, const char *string); diff --git a/ip/ipaddress.c b/ip/ipaddress.c index bc8f5ba13c33..b72eb7a1f808 100644 --- a/ip/ipaddress.c +++ b/ip/ipaddress.c @@ -879,7 +879,7 @@ int print_linkinfo(struct nlmsghdr *n, void *arg) if (filter.up && !(ifi->ifi_flags&IFF_UP)) return -1; - parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len); + parse_rtattr_flags(tb, IFLA_MAX, IFLA_RTA(ifi), len, NLA_F_NESTED); name = get_ifname_rta(ifi->ifi_index, tb[IFLA_IFNAME]); if (!name) @@ -1139,7 +1139,23 @@ int print_linkinfo(struct nlmsghdr *n, void *arg) close_json_array(PRINT_JSON, NULL); } - print_string(PRINT_FP, NULL, "%s", "\n"); + if (tb[IFLA_PROP_LIST]) { + struct rtattr *i, *proplist = tb[IFLA_PROP_LIST]; + int rem = RTA_PAYLOAD(proplist); + + open_json_array(PRINT_JSON, "altnames"); + for (i = RTA_DATA(proplist); RTA_OK(i, rem); + i = RTA_NEXT(i, rem)) { + if (i->rta_type != IFLA_ALT_IFNAME) + continue; + print_string(PRINT_FP, NULL, "%s altname ", _SL_); + print_string(PRINT_ANY, NULL, + "%s", rta_getattr_str(i)); + } + close_json_array(PRINT_JSON, NULL); + } + + print_string(PRINT_FP, NULL, "%s", _SL_); fflush(fp); return 1; } diff --git a/ip/iplink.c b/ip/iplink.c index 212a088535da..e3f8a28fe94c 100644 --- a/ip/iplink.c +++ b/ip/iplink.c @@ -111,7 +111,9 @@ void iplink_usage(void) "\n" " ip link xstats type TYPE [ ARGS ]\n" "\n" - " ip link afstats [ dev DEVICE ]\n"); + " ip link afstats [ dev DEVICE ]\n" + " ip link prop add dev DEVICE [ altname NAME .. ]\n" + " ip link prop del dev DEVICE [ altname NAME .. ]\n"); if (iplink_have_newlink()) { fprintf(stderr, @@ -1617,6 +1619,81 @@ static int iplink_afstats(int argc, char **argv) return 0; } +static int iplink_prop_mod(int argc, char **argv, struct iplink_req *req) +{ + struct rtattr *proplist; + char *dev = NULL; + char *name; + + proplist = addattr_nest(&req->n, sizeof(*req), + IFLA_PROP_LIST | NLA_F_NESTED); + + while (argc > 0) { + if (matches(*argv, "altname") == 0) { + NEXT_ARG(); + if (check_altifname(*argv)) + invarg("not a valid altname", *argv); + name = *argv; + addattr_l(&req->n, sizeof(*req), IFLA_ALT_IFNAME, + name, strlen(name) + 1); + } else if (matches(*argv, "help") == 0) { + usage(); + } else { + if (strcmp(*argv, "dev") == 0) + NEXT_ARG(); + if (dev) + duparg2("dev", *argv); + if (check_altifname(*argv)) + invarg("\"dev\" not a valid ifname", *argv); + dev = *argv; + } + argv++; argc--; + } + addattr_nest_end(&req->n, proplist); + + if (!dev) { + fprintf(stderr, "Not enough of information: \"dev\" argument is required.\n"); + exit(-1); + } + + req->i.ifi_index = ll_name_to_index(dev); + if (!req->i.ifi_index) + return nodev(dev); + + if (rtnl_talk(&rth, &req->n, NULL) < 0) + return -2; + + return 0; +} + +static int iplink_prop(int argc, char **argv) +{ + struct iplink_req req = { + .n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)), + .n.nlmsg_flags = NLM_F_REQUEST, + .i.ifi_family = preferred_family, + }; + + if (argc <= 0) { + usage(); + exit(-1); + } + + if (matches(*argv, "add") == 0) { + req.n.nlmsg_flags |= NLM_F_EXCL | NLM_F_CREATE | NLM_F_APPEND; + req.n.nlmsg_type = RTM_NEWLINKPROP; + } else if (matches(*argv, "del") == 0) { + req.n.nlmsg_flags |= RTM_DELLINK; + req.n.nlmsg_type = RTM_DELLINKPROP; + } else if (matches(*argv, "help") == 0) { + usage(); + } else { + fprintf(stderr, "Operator required\n"); + exit(-1); + } + return iplink_prop_mod(argc - 1, argv + 1, &req); +} + static void do_help(int argc, char **argv) { struct link_util *lu = NULL; @@ -1674,6 +1751,9 @@ int do_iplink(int argc, char **argv) return 0; } + if (matches(*argv, "prop") == 0) + return iplink_prop(argc-1, argv+1); + if (matches(*argv, "help") == 0) { do_help(argc-1, argv+1); return 0; diff --git a/lib/utils.c b/lib/utils.c index 95d46ff210aa..bbb3bdcfa80b 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -824,14 +824,10 @@ int nodev(const char *dev) return -1; } -int check_ifname(const char *name) +static int __check_ifname(const char *name) { - /* These checks mimic kernel checks in dev_valid_name */ if (*name == '\0') return -1; - if (strlen(name) >= IFNAMSIZ) - return -1; - while (*name) { if (*name == '/' || isspace(*name)) return -1; @@ -840,6 +836,19 @@ int check_ifname(const char *name) return 0; } +int check_ifname(const char *name) +{ + /* These checks mimic kernel checks in dev_valid_name */ + if (strlen(name) >= IFNAMSIZ) + return -1; + return __check_ifname(name); +} + +int check_altifname(const char *name) +{ + return __check_ifname(name); +} + /* buf is assumed to be IFNAMSIZ */ int get_ifname(char *buf, const char *name) { diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in index a8ae72d2b097..7cb4d56726d8 100644 --- a/man/man8/ip-link.8.in +++ b/man/man8/ip-link.8.in @@ -244,6 +244,17 @@ ip-link \- network device configuration .IR VLAN-QOS " ] [" .B proto .IR VLAN-PROTO " ] ]" +.in -8 + +.ti -8 +.BI "ip link prop add" +.RB "[ " altname +.IR NAME " .. ]" + +.ti -8 +.BI "ip link prop del" +.RB "[ " altname +.IR NAME " .. ]" .SH "DESCRIPTION" .SS ip link add - add virtual link -- 2.21.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [patch iproute2-next v2 1/2] ip: add support for alternative name addition/deletion/list 2019-10-02 10:56 ` [patch iproute2-next v2 1/2] ip: add support for alternative name addition/deletion/list Jiri Pirko @ 2019-10-07 21:37 ` David Ahern 2019-10-09 11:13 ` Jiri Pirko 0 siblings, 1 reply; 7+ messages in thread From: David Ahern @ 2019-10-07 21:37 UTC (permalink / raw) To: Jiri Pirko, netdev Cc: davem, jakub.kicinski, roopa, dcbw, nikolay, mkubecek, andrew, parav, saeedm, f.fainelli, stephen, sd, sbrivio, pabeni, mlxsw On 10/2/19 4:56 AM, Jiri Pirko wrote: > diff --git a/ip/iplink.c b/ip/iplink.c > index 212a088535da..e3f8a28fe94c 100644 > --- a/ip/iplink.c > +++ b/ip/iplink.c > @@ -111,7 +111,9 @@ void iplink_usage(void) > "\n" > " ip link xstats type TYPE [ ARGS ]\n" > "\n" > - " ip link afstats [ dev DEVICE ]\n"); > + " ip link afstats [ dev DEVICE ]\n" > + " ip link prop add dev DEVICE [ altname NAME .. ]\n" > + " ip link prop del dev DEVICE [ altname NAME .. ]\n"); spell out 'property' here. The matches below on "prop" is fine, but the help can show the full name. > + > + if (matches(*argv, "add") == 0) { > + req.n.nlmsg_flags |= NLM_F_EXCL | NLM_F_CREATE | NLM_F_APPEND; > + req.n.nlmsg_type = RTM_NEWLINKPROP; > + } else if (matches(*argv, "del") == 0) { > + req.n.nlmsg_flags |= RTM_DELLINK; RTM_DELLINK is a command not a netlink flag. > + req.n.nlmsg_type = RTM_DELLINKPROP; > + } else if (matches(*argv, "help") == 0) { > + usage(); > + } else { > + fprintf(stderr, "Operator required\n"); > + exit(-1); > + } > + return iplink_prop_mod(argc - 1, argv + 1, &req); > +} > + > static void do_help(int argc, char **argv) > { > struct link_util *lu = NULL; > > diff --git a/lib/utils.c b/lib/utils.c > index 95d46ff210aa..bbb3bdcfa80b 100644 > --- a/lib/utils.c > +++ b/lib/utils.c > @@ -824,14 +824,10 @@ int nodev(const char *dev) > return -1; > } > > -int check_ifname(const char *name) > +static int __check_ifname(const char *name) > { > - /* These checks mimic kernel checks in dev_valid_name */ > if (*name == '\0') > return -1; > - if (strlen(name) >= IFNAMSIZ) > - return -1; > - > while (*name) { > if (*name == '/' || isspace(*name)) > return -1; > @@ -840,6 +836,19 @@ int check_ifname(const char *name) > return 0; > } > > +int check_ifname(const char *name) > +{ > + /* These checks mimic kernel checks in dev_valid_name */ > + if (strlen(name) >= IFNAMSIZ) > + return -1; > + return __check_ifname(name); > +} > + > +int check_altifname(const char *name) > +{ > + return __check_ifname(name); > +} > + > /* buf is assumed to be IFNAMSIZ */ > int get_ifname(char *buf, const char *name) > { > diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in > index a8ae72d2b097..7cb4d56726d8 100644 > --- a/man/man8/ip-link.8.in > +++ b/man/man8/ip-link.8.in > @@ -244,6 +244,17 @@ ip-link \- network device configuration > .IR VLAN-QOS " ] [" > .B proto > .IR VLAN-PROTO " ] ]" > +.in -8 > + > +.ti -8 > +.BI "ip link prop add" > +.RB "[ " altname > +.IR NAME " .. ]" > + > +.ti -8 > +.BI "ip link prop del" > +.RB "[ " altname > +.IR NAME " .. ]" > > .SH "DESCRIPTION" > .SS ip link add - add virtual link > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patch iproute2-next v2 1/2] ip: add support for alternative name addition/deletion/list 2019-10-07 21:37 ` David Ahern @ 2019-10-09 11:13 ` Jiri Pirko 0 siblings, 0 replies; 7+ messages in thread From: Jiri Pirko @ 2019-10-09 11:13 UTC (permalink / raw) To: David Ahern Cc: netdev, davem, jakub.kicinski, roopa, dcbw, nikolay, mkubecek, andrew, parav, saeedm, f.fainelli, stephen, sd, sbrivio, pabeni, mlxsw Mon, Oct 07, 2019 at 11:37:21PM CEST, dsahern@gmail.com wrote: >On 10/2/19 4:56 AM, Jiri Pirko wrote: >> diff --git a/ip/iplink.c b/ip/iplink.c >> index 212a088535da..e3f8a28fe94c 100644 >> --- a/ip/iplink.c >> +++ b/ip/iplink.c >> @@ -111,7 +111,9 @@ void iplink_usage(void) >> "\n" >> " ip link xstats type TYPE [ ARGS ]\n" >> "\n" >> - " ip link afstats [ dev DEVICE ]\n"); >> + " ip link afstats [ dev DEVICE ]\n" >> + " ip link prop add dev DEVICE [ altname NAME .. ]\n" >> + " ip link prop del dev DEVICE [ altname NAME .. ]\n"); > >spell out 'property' here. The matches below on "prop" is fine, but the >help can show the full name. Okay. > > >> + >> + if (matches(*argv, "add") == 0) { >> + req.n.nlmsg_flags |= NLM_F_EXCL | NLM_F_CREATE | NLM_F_APPEND; >> + req.n.nlmsg_type = RTM_NEWLINKPROP; >> + } else if (matches(*argv, "del") == 0) { >> + req.n.nlmsg_flags |= RTM_DELLINK; > >RTM_DELLINK is a command not a netlink flag. Will fix. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [patch iproute2-next v2 2/2] ip: allow to use alternative names as handle 2019-10-02 10:56 [patch iproute2-next v2 0/2] ip: add support for alternative names Jiri Pirko 2019-10-02 10:56 ` [patch iproute2-next v2 1/2] ip: add support for alternative name addition/deletion/list Jiri Pirko @ 2019-10-02 10:56 ` Jiri Pirko 2019-10-07 21:52 ` David Ahern 1 sibling, 1 reply; 7+ messages in thread From: Jiri Pirko @ 2019-10-02 10:56 UTC (permalink / raw) To: netdev Cc: davem, jakub.kicinski, dsahern, roopa, dcbw, nikolay, mkubecek, andrew, parav, saeedm, f.fainelli, stephen, sd, sbrivio, pabeni, mlxsw From: Jiri Pirko <jiri@mellanox.com> Extend ll_name_to_index() to get the index of a netdevice using alternative interface name. Allow alternative long names to pass checks in couple of ip link/addr commands. Signed-off-by: Jiri Pirko <jiri@mellanox.com> --- rfc->v1: - added patch description --- ip/iplink.c | 5 +++-- lib/ll_map.c | 41 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 3 deletions(-) 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; } -- 2.21.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [patch iproute2-next v2 2/2] ip: allow to use alternative names as handle 2019-10-02 10:56 ` [patch iproute2-next v2 2/2] ip: allow to use alternative names as handle Jiri Pirko @ 2019-10-07 21:52 ` David Ahern 2019-10-09 12:41 ` Jiri Pirko 0 siblings, 1 reply; 7+ messages in thread From: David Ahern @ 2019-10-07 21:52 UTC (permalink / raw) To: Jiri Pirko, netdev Cc: davem, jakub.kicinski, roopa, dcbw, nikolay, mkubecek, andrew, parav, saeedm, f.fainelli, stephen, sd, sbrivio, pabeni, mlxsw 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; > } > > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patch iproute2-next v2 2/2] ip: allow to use alternative names as handle 2019-10-07 21:52 ` David Ahern @ 2019-10-09 12:41 ` Jiri Pirko 0 siblings, 0 replies; 7+ messages in thread From: Jiri Pirko @ 2019-10-09 12:41 UTC (permalink / raw) To: David Ahern Cc: netdev, davem, jakub.kicinski, roopa, dcbw, nikolay, mkubecek, andrew, parav, saeedm, f.fainelli, stephen, sd, sbrivio, pabeni, mlxsw 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; >> } >> >> > ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2019-10-09 12:41 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-10-02 10:56 [patch iproute2-next v2 0/2] ip: add support for alternative names Jiri Pirko 2019-10-02 10:56 ` [patch iproute2-next v2 1/2] ip: add support for alternative name addition/deletion/list Jiri Pirko 2019-10-07 21:37 ` David Ahern 2019-10-09 11:13 ` Jiri Pirko 2019-10-02 10:56 ` [patch iproute2-next v2 2/2] ip: allow to use alternative names as handle Jiri Pirko 2019-10-07 21:52 ` David Ahern 2019-10-09 12:41 ` Jiri Pirko
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).