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

Andrew Vagin avagin at odin.com
Tue Oct 27 02:29:18 PDT 2015


On Mon, Oct 26, 2015 at 06:28:35PM +0300, Cyrill Gorcunov wrote:
> 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!

Acked-by: Andrew Vagin <avagin at odin.com>


> 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