[CRIU] [PATCH v10 07/11] net: open a netlink socket in criu's netns

Tycho Andersen tycho.andersen at canonical.com
Thu Oct 20 09:25:27 PDT 2016


We'll use this socket to restore macvlan interfaces.

Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
---
 criu/net.c | 41 ++++++++++++++++++++++++++++++++++++++---
 1 file changed, 38 insertions(+), 3 deletions(-)

diff --git a/criu/net.c b/criu/net.c
index f807c5e..f7d586e 100644
--- a/criu/net.c
+++ b/criu/net.c
@@ -1026,7 +1026,7 @@ static int changeflags(int s, char *name, short flags)
 	return 0;
 }
 
-static int restore_link(NetDeviceEntry *nde, int nlsk)
+static int restore_link(NetDeviceEntry *nde, int nlsk, int criu_nlsk)
 {
 	pr_info("Restoring link %s type %d\n", nde->name, nde->type);
 
@@ -1052,7 +1052,7 @@ static int restore_link(NetDeviceEntry *nde, int nlsk)
 
 static int restore_links(int pid, NetnsEntry **netns)
 {
-	int nlsk, ret;
+	int nlsk, criu_nlsk = -1, ret = -1, my_netns = -1, ns_fd = get_service_fd(NS_FD_OFF);
 	struct cr_img *img;
 	NetDeviceEntry *nde;
 
@@ -1067,6 +1067,38 @@ static int restore_links(int pid, NetnsEntry **netns)
 		return -1;
 	}
 
+	if (!(root_ns_mask & CLONE_NEWUSER)) {
+		/* FIXME: this whole dance is so we can have a netlink socket to criu's
+		 * netns in case we need it. It should really live on the ns_id struct,
+		 * but those aren't generated on restore yet.
+		 */
+		my_netns = open_proc(PROC_SELF, "ns/net");
+		if (my_netns < 0) {
+			pr_perror("couldn't open my netns");
+			goto out;
+		}
+
+		if (setns(ns_fd, CLONE_NEWNET) < 0) {
+			close(my_netns);
+			pr_perror("couldn't setns to parent ns");
+			goto out;
+		}
+
+		criu_nlsk = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
+		ret = setns(my_netns, CLONE_NEWNET);
+		close(my_netns);
+
+		if (ret < 0) {
+			pr_perror("Can't setns back my netns");
+			goto out;
+		}
+
+		if (criu_nlsk < 0) {
+			pr_perror("Can't create nlk socket");
+			goto out;
+		}
+	}
+
 	while (1) {
 		NetnsEntry **def_netns = netns;
 
@@ -1074,7 +1106,7 @@ static int restore_links(int pid, NetnsEntry **netns)
 		if (ret <= 0)
 			break;
 
-		ret = restore_link(nde, nlsk);
+		ret = restore_link(nde, nlsk, criu_nlsk);
 		if (ret) {
 			pr_err("Can't restore link\n");
 			goto exit;
@@ -1103,6 +1135,9 @@ exit:
 			break;
 	}
 
+out:
+	if (criu_nlsk >= 0)
+		close(criu_nlsk);
 	close(nlsk);
 	close_image(img);
 	return ret;
-- 
2.7.4



More information about the CRIU mailing list