Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/checkpoint-restore/criu.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrill Gorcunov <gorcunov@openvz.org>2015-10-26 13:58:00 +0300
committerPavel Emelyanov <xemul@parallels.com>2015-10-28 10:23:12 +0300
commit2467a30fe29a54a6e382c139301de0cd4a8961eb (patch)
tree694e10e5bf9a463f35f8f60ac72616bc3b01ee77
parent8f0f75a6d6de847df9c6cb1f38ef434d3109e405 (diff)
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@openvz.org> Acked-by: Andrew Vagin <avagin@odin.com> Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
-rw-r--r--net.c24
-rw-r--r--protobuf/netdev.proto4
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 {