[CRIU] [PATCH v2] net: Treat venet device as a separate complete device

Cyrill Gorcunov gorcunov at gmail.com
Mon Oct 26 08:28:35 PDT 2015


On Mon, Oct 26, 2015 at 05:20:05PM +0300, Andrew Vagin wrote:
> >  
> > +static int venet_link_info(NetDeviceEntry *nde, struct newlink_req *req)
> > +{
> > +	struct rtattr *venet_data, *peer_data;
> > +	struct ifinfomsg ifm;
> > +	struct veth_pair *n;
> 
> n isn't used.
> 

Yup, thanks!
-------------- next part --------------
>From 58d9ba799b51e7d2790b48ba76f12588cd5fde4b Mon Sep 17 00:00:00 2001
From: Cyrill Gorcunov <gorcunov at openvz.org>
Date: Mon, 26 Oct 2015 13:58:00 +0300
Subject: [PATCH] net: Treat venet device as a separate complete device

When restoring venet device we need to restore its
index as well, which actually possible with new iproute2
package but the problem is that the index itself lays
inside image file. We could use crit tool to extract
it but this would slowdon procedure signifantly (need
to run python which would parse the image, or need
to pass the index into environmnet from inside of
the CRIU itself).

So lets do a trick and simply created venet device
inside container by criu itself (thanks we support
creating venet via netlink interface now).

Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
 net.c                 | 24 ++++++++++++++++++------
 protobuf/netdev.proto |  4 ++++
 2 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/net.c b/net.c
index 84737427f092..ce4a560293c9 100644
--- a/net.c
+++ b/net.c
@@ -256,12 +256,7 @@ static int dump_one_voiddev(struct ifinfomsg *ifi, char *kind,
 		struct rtattr **tb, struct cr_imgset *fds)
 {
 	if (!strcmp(kind, "venet"))
-		/*
-		 * If we meet a link we know about, such as
-		 * OpenVZ's venet, save general parameters of
-		 * it as external link.
-		 */
-		return dump_one_netdev(ND_TYPE__EXTLINK, ifi, tb, fds, NULL);
+		return dump_one_netdev(ND_TYPE__VENET, ifi, tb, fds, NULL);
 
 	return dump_unknown_device(ifi, kind, tb, fds);
 }
@@ -454,6 +449,21 @@ static int veth_link_info(NetDeviceEntry *nde, struct newlink_req *req)
 	return 0;
 }
 
+static int venet_link_info(NetDeviceEntry *nde, struct newlink_req *req)
+{
+	struct rtattr *venet_data;
+
+	BUG_ON(ns_fd < 0);
+
+	venet_data = NLMSG_TAIL(&req->h);
+	addattr_l(&req->h, sizeof(*req), IFLA_INFO_KIND, "venet", 5);
+	addattr_l(&req->h, sizeof(*req), IFLA_INFO_DATA, NULL, 0);
+	addattr_l(&req->h, sizeof(*req), IFLA_NET_NS_FD, &ns_fd, sizeof(ns_fd));
+	venet_data->rta_len = (void *)NLMSG_TAIL(&req->h) - (void *)venet_data;
+
+	return 0;
+}
+
 static int restore_link(NetDeviceEntry *nde, int nlsk)
 {
 	pr_info("Restoring link %s type %d\n", nde->name, nde->type);
@@ -462,6 +472,8 @@ static int restore_link(NetDeviceEntry *nde, int nlsk)
 	case ND_TYPE__LOOPBACK: /* fallthrough */
 	case ND_TYPE__EXTLINK:  /* see comment in protobuf/netdev.proto */
 		return restore_link_parms(nde, nlsk);
+	case ND_TYPE__VENET:
+		return restore_one_link(nde, nlsk, venet_link_info);
 	case ND_TYPE__VETH:
 		return restore_one_link(nde, nlsk, veth_link_info);
 	case ND_TYPE__TUN:
diff --git a/protobuf/netdev.proto b/protobuf/netdev.proto
index 0ed6d8502120..c189ff64b676 100644
--- a/protobuf/netdev.proto
+++ b/protobuf/netdev.proto
@@ -12,6 +12,10 @@ enum nd_type {
 	 * by the setup-namespaces script.
 	 */
 	EXTLINK		= 4;
+	/*
+	 * Virtuozzo specific device.
+	 */
+	VENET		= 5;
 }
 
 message net_device_entry {
-- 
2.4.3



More information about the CRIU mailing list