[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