netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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

* [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 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 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 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

* 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).