diff mbox series

[iproute2,v2,1/2] ip: display netns name instead of nsid

Message ID 20180605130831.8175-2-nicolas.dichtel@6wind.com
State Accepted, archived
Delegated to: stephen hemminger
Headers show
Series display netns name instead of nsid | expand

Commit Message

Nicolas Dichtel June 5, 2018, 1:08 p.m. UTC
When iproute2 has a name for the nsid, let's display it. It's more
user friendly than a number.

Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
---
 ip/ip_common.h |  1 +
 ip/ipaddress.c | 20 +++++++++++++++-----
 ip/ipnetns.c   | 14 ++++++++++++++
 3 files changed, 30 insertions(+), 5 deletions(-)

Comments

Stephen Hemminger June 5, 2018, 4:52 p.m. UTC | #1
On Tue,  5 Jun 2018 15:08:30 +0200
Nicolas Dichtel <nicolas.dichtel@6wind.com> wrote:

>  
> +char *get_name_from_nsid(int nsid)
> +{
> +	struct nsid_cache *c;
> +
> +	netns_nsid_socket_init();
> +	netns_map_init();
> +
> +	c = netns_map_get_by_nsid(nsid);
> +	if (c)
> +		return c->name;
> +
> +	return NULL;
> +}
> +

This is better, but now there is a different problem.
When doing multiple interfaces, won't the initialization code be called twice?
Nicolas Dichtel June 6, 2018, 7:11 a.m. UTC | #2
Le 05/06/2018 à 18:52, Stephen Hemminger a écrit :
> On Tue,  5 Jun 2018 15:08:30 +0200
> Nicolas Dichtel <nicolas.dichtel@6wind.com> wrote:
> 
>>  
>> +char *get_name_from_nsid(int nsid)
>> +{
>> +	struct nsid_cache *c;
>> +
>> +	netns_nsid_socket_init();
>> +	netns_map_init();
>> +
>> +	c = netns_map_get_by_nsid(nsid);
>> +	if (c)
>> +		return c->name;
>> +
>> +	return NULL;
>> +}
>> +
> 
> This is better, but now there is a different problem.
> When doing multiple interfaces, won't the initialization code be called twice?
> 
No, the init function is propected:

void netns_nsid_socket_init(void)
{
        if (rtnsh.fd > -1 || !ipnetns_have_nsid())
                return;
...

void netns_map_init(void)
{
...
        if (initialized || !ipnetns_have_nsid())
                return;
...
diff mbox series

Patch

diff --git a/ip/ip_common.h b/ip/ip_common.h
index 49eb7d7bed40..794478c546cd 100644
--- a/ip/ip_common.h
+++ b/ip/ip_common.h
@@ -60,6 +60,7 @@  void netns_map_init(void);
 void netns_nsid_socket_init(void);
 int print_nsid(const struct sockaddr_nl *who,
 	       struct nlmsghdr *n, void *arg);
+char *get_name_from_nsid(int nsid);
 int do_ipaddr(int argc, char **argv);
 int do_ipaddrlabel(int argc, char **argv);
 int do_iproute(int argc, char **argv);
diff --git a/ip/ipaddress.c b/ip/ipaddress.c
index c7c7e7df4e81..e4a1b985e4e9 100644
--- a/ip/ipaddress.c
+++ b/ip/ipaddress.c
@@ -955,10 +955,16 @@  int print_linkinfo(const struct sockaddr_nl *who,
 		if (is_json_context()) {
 			print_int(PRINT_JSON, "link_netnsid", NULL, id);
 		} else {
-			if (id >= 0)
-				print_int(PRINT_FP, NULL,
-					  " link-netnsid %d", id);
-			else
+			if (id >= 0) {
+				char *name = get_name_from_nsid(id);
+
+				if (name)
+					print_string(PRINT_FP, NULL,
+						     " link-netns %s", name);
+				else
+					print_int(PRINT_FP, NULL,
+						  " link-netnsid %d", id);
+			} else
 				print_string(PRINT_FP, NULL,
 					     " link-netnsid %s", "unknown");
 		}
@@ -966,8 +972,12 @@  int print_linkinfo(const struct sockaddr_nl *who,
 
 	if (tb[IFLA_NEW_NETNSID]) {
 		int id = rta_getattr_u32(tb[IFLA_NEW_NETNSID]);
+		char *name = get_name_from_nsid(id);
 
-		print_int(PRINT_FP, NULL, " new-nsid %d", id);
+		if (name)
+			print_string(PRINT_FP, NULL, " new-netns %s", name);
+		else
+			print_int(PRINT_FP, NULL, " new-netnsid %d", id);
 	}
 	if (tb[IFLA_NEW_IFINDEX]) {
 		int id = rta_getattr_u32(tb[IFLA_NEW_IFINDEX]);
diff --git a/ip/ipnetns.c b/ip/ipnetns.c
index e06100f4ad2d..30af9319f39e 100644
--- a/ip/ipnetns.c
+++ b/ip/ipnetns.c
@@ -169,6 +169,20 @@  static struct nsid_cache *netns_map_get_by_nsid(int nsid)
 	return NULL;
 }
 
+char *get_name_from_nsid(int nsid)
+{
+	struct nsid_cache *c;
+
+	netns_nsid_socket_init();
+	netns_map_init();
+
+	c = netns_map_get_by_nsid(nsid);
+	if (c)
+		return c->name;
+
+	return NULL;
+}
+
 static int netns_map_add(int nsid, const char *name)
 {
 	struct nsid_cache *c;