From 2467a30fe29a54a6e382c139301de0cd4a8961eb Mon Sep 17 00:00:00 2001 From: Cyrill Gorcunov 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 Acked-by: Andrew Vagin Signed-off-by: Pavel Emelyanov --- net.c | 24 ++++++++++++++++++------ protobuf/netdev.proto | 4 ++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/net.c b/net.c index 082ccb674..e2fa1e5c3 100644 --- a/net.c +++ b/net.c @@ -243,12 +243,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); } @@ -441,6 +436,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); @@ -449,6 +459,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 0ed6d8502..c189ff64b 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 {