[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