[CRIU] [RFC] net: Treat venet device as a separate complete device
Andrew Vagin
avagin at odin.com
Mon Oct 26 07:20:05 PDT 2015
On Mon, Oct 26, 2015 at 04:59:10PM +0300, Cyrill Gorcunov wrote:
> 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;
n isn't used.
> +
> + 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