[lxc-devel] [lxc/master] network: add lxc_netns_get_nsid()

brauner on Github lxc-bot at linuxcontainers.org
Tue Sep 11 12:03:28 UTC 2018


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 364 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180911/298e474d/attachment.bin>
-------------- next part --------------
From 41a3300dbb16e8eddccda15d5a724921d5ba94e8 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 11 Sep 2018 14:02:03 +0200
Subject: [PATCH 1/2] network: use correct type in lxc_netns_set_nsid()

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 src/lxc/network.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/lxc/network.c b/src/lxc/network.c
index c4e292e12..9fcd3b07c 100644
--- a/src/lxc/network.c
+++ b/src/lxc/network.c
@@ -3196,7 +3196,7 @@ enum {
 
 int lxc_netns_set_nsid(int fd)
 {
-	ssize_t ret;
+	int ret;
 	char buf[NLMSG_ALIGN(sizeof(struct nlmsghdr)) +
 		 NLMSG_ALIGN(sizeof(struct rtgenmsg)) +
 		 NLMSG_ALIGN(1024)];
@@ -3209,7 +3209,7 @@ int lxc_netns_set_nsid(int fd)
 
 	ret = netlink_open(&nlh, NETLINK_ROUTE);
 	if (ret < 0)
-		return ret;
+		return -1;
 
 	memset(buf, 0, sizeof(buf));
 	hdr = (struct nlmsghdr *)buf;

From 7d48d856b4bdfcb8c2b4e0dffa85780fb21e4603 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 11 Sep 2018 14:02:23 +0200
Subject: [PATCH 2/2] network: add lxc_netns_get_nsid()

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 src/lxc/network.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++
 src/lxc/network.h |  2 ++
 2 files changed, 84 insertions(+)

diff --git a/src/lxc/network.c b/src/lxc/network.c
index 9fcd3b07c..1520cc51b 100644
--- a/src/lxc/network.c
+++ b/src/lxc/network.c
@@ -31,6 +31,7 @@
 #include <time.h>
 #include <unistd.h>
 #include <arpa/inet.h>
+#include <linux/net_namespace.h>
 #include <linux/netlink.h>
 #include <linux/rtnetlink.h>
 #include <linux/sockios.h>
@@ -3234,3 +3235,84 @@ int lxc_netns_set_nsid(int fd)
 
 	return 0;
 }
+
+static int parse_rtattr_flags(struct rtattr *tb[], int max, struct rtattr *rta,
+			      int len, unsigned short flags)
+{
+	unsigned short type;
+
+	memset(tb, 0, sizeof(struct rtattr *) * (max + 1));
+	while (RTA_OK(rta, len)) {
+		type = rta->rta_type & ~flags;
+		if ((type <= max) && (!tb[type]))
+			tb[type] = rta;
+		rta = RTA_NEXT(rta, len);
+	}
+
+	return 0;
+}
+
+static int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len)
+{
+	return parse_rtattr_flags(tb, max, rta, len, 0);
+}
+
+static inline __s32 rta_getattr_s32(const struct rtattr *rta)
+{
+	return *(__s32 *)RTA_DATA(rta);
+}
+
+#ifndef NETNS_RTA
+#define NETNS_RTA(r) \
+	((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct rtgenmsg))))
+#endif
+
+int lxc_netns_get_nsid(int fd)
+{
+	int ret;
+	ssize_t len;
+	char buf[NLMSG_ALIGN(sizeof(struct nlmsghdr)) +
+		 NLMSG_ALIGN(sizeof(struct rtgenmsg)) + NLMSG_ALIGN(1024)];
+	struct rtattr *tb[NETNSA_MAX + 1];
+	struct nl_handler nlh;
+	struct nlmsghdr *hdr;
+	struct rtgenmsg *msg;
+	int saved_errno;
+	__u32 netns_fd = fd;
+
+	ret = netlink_open(&nlh, NETLINK_ROUTE);
+	if (ret < 0)
+		return -1;
+
+	memset(buf, 0, sizeof(buf));
+	hdr = (struct nlmsghdr *)buf;
+	msg = (struct rtgenmsg *)NLMSG_DATA(hdr);
+
+	hdr->nlmsg_len = NLMSG_LENGTH(sizeof(*msg));
+	hdr->nlmsg_type = RTM_GETNSID;
+	hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
+	hdr->nlmsg_pid = 0;
+	hdr->nlmsg_seq = RTM_GETNSID;
+	msg->rtgen_family = AF_UNSPEC;
+
+	addattr(hdr, 1024, __LXC_NETNSA_FD, &netns_fd, sizeof(netns_fd));
+
+	ret = __netlink_transaction(&nlh, hdr, hdr);
+	saved_errno = errno;
+	netlink_close(&nlh);
+	errno = saved_errno;
+	if (ret < 0)
+		return -1;
+
+	msg = NLMSG_DATA(hdr);
+	len = hdr->nlmsg_len - NLMSG_SPACE(sizeof(*msg));
+	if (len < 0)
+		return -1;
+
+	parse_rtattr(tb, NETNSA_MAX, NETNS_RTA(msg), len);
+	if (tb[NETNSA_NSID]) {
+		return rta_getattr_s32(tb[NETNSA_NSID]);
+	}
+
+	return -1;
+}
diff --git a/src/lxc/network.h b/src/lxc/network.h
index 50e6b2c56..38f7c8d5f 100644
--- a/src/lxc/network.h
+++ b/src/lxc/network.h
@@ -27,6 +27,7 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <arpa/inet.h>
+#include <linux/types.h>
 #include <sys/socket.h>
 
 #include "list.h"
@@ -273,5 +274,6 @@ extern int lxc_network_recv_veth_names_from_parent(struct lxc_handler *handler);
 extern int lxc_network_send_name_and_ifindex_to_parent(struct lxc_handler *handler);
 extern int lxc_network_recv_name_and_ifindex_from_child(struct lxc_handler *handler);
 extern int lxc_netns_set_nsid(int netns_fd);
+extern int lxc_netns_get_nsid(__s32 fd);
 
 #endif /* __LXC_NETWORK_H */


More information about the lxc-devel mailing list