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

Cyrill Gorcunov gorcunov at openvz.org
Mon Oct 26 06:59:10 PDT 2015


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                 | 21 ++++++++++++++++++++-
 protobuf/netdev.proto |  4 ++++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/net.c b/net.c
index 84737427f092..ac9adc2d662b 100644
--- a/net.c
+++ b/net.c
@@ -261,7 +261,7 @@ static int dump_one_voiddev(struct ifinfomsg *ifi, char *kind,
 		 * 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 +454,23 @@ 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, *peer_data;
+	struct ifinfomsg ifm;
+	struct veth_pair *n;
+
+	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 +479,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