[CRIU] [PATCH 6/7] net: allow checkpoint/restore if sit devices

Pavel Emelyanov xemul at virtuozzo.com
Thu Feb 18 12:47:36 PST 2016


On 02/18/2016 07:08 PM, Tycho Andersen wrote:
> I really have no idea if I'm missing something here, as I don't know
> anything about these tunnels. But, this patch at least is a start on c/r
> for sit devices.
> 
> Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
> ---
>  criu/net.c          | 27 ++++++++++++++++++++++++++-
>  images/netdev.proto |  2 ++
>  2 files changed, 28 insertions(+), 1 deletion(-)
> 
> diff --git a/criu/net.c b/criu/net.c
> index cf1e821..50e1b0e 100644
> --- a/criu/net.c
> +++ b/criu/net.c
> @@ -169,7 +169,7 @@ static int dump_one_netdev(int type, struct ifinfomsg *ifi,
>  	netdev.flags = ifi->ifi_flags;
>  	netdev.name = RTA_DATA(tb[IFLA_IFNAME]);
>  
> -	if (tb[IFLA_ADDRESS] && (type != ND_TYPE__LOOPBACK)) {
> +	if (tb[IFLA_ADDRESS] && (type != ND_TYPE__LOOPBACK) && (type != ND_TYPE__SIT)) {

Why skipping address for sit? AFAIU it has one.

>  		netdev.has_address = true;
>  		netdev.address.data = RTA_DATA(tb[IFLA_ADDRESS]);
>  		netdev.address.len = RTA_PAYLOAD(tb[IFLA_ADDRESS]);
> @@ -303,6 +303,15 @@ static int dump_one_voiddev(struct ifinfomsg *ifi, char *kind,
>  	return dump_unknown_device(ifi, kind, tb, fds);
>  }
>  
> +static int dump_one_sit(struct ifinfomsg *ifi, char *kind,
> +		struct rtattr **tb, struct cr_imgset *fds)
> +{
> +	if (!strcmp(kind, "sit"))
> +		return dump_one_netdev(ND_TYPE__SIT, ifi, tb, fds, NULL);

Well, yes, sit has one very specific thing w/o which it doesn't work -- the remote
address it tunnels into. So this thing should be dumped here.


> +
> +	return dump_unknown_device(ifi, kind, tb, fds);
> +}
> +
>  static int dump_one_link(struct nlmsghdr *hdr, void *arg)
>  {
>  	struct cr_imgset *fds = arg;
> @@ -338,6 +347,9 @@ static int dump_one_link(struct nlmsghdr *hdr, void *arg)
>  	case ARPHRD_VOID:
>  		ret = dump_one_voiddev(ifi, kind, tb, fds);
>  		break;
> +	case ARPHRD_SIT:
> +		ret = dump_one_sit(ifi, kind, tb, fds);
> +		break;
>  	default:
>  unk:
>  		ret = dump_unknown_device(ifi, kind, tb, fds);
> @@ -686,6 +698,17 @@ static int bridge_link_info(NetDeviceEntry *nde, struct newlink_req *req)
>  	return 0;
>  }
>  
> +static int sit_link_info(NetDeviceEntry *nde, struct newlink_req *req)
> +{
> +	struct rtattr *sit_data;
> +
> +	sit_data = NLMSG_TAIL(&req->h);
> +	addattr_l(&req->h, sizeof(*req), IFLA_INFO_KIND, "sit", sizeof("sit"));
> +	sit_data->rta_len = (void *)NLMSG_TAIL(&req->h) - (void *)sit_data;
> +
> +	return 0;
> +}
> +
>  static int restore_link(NetDeviceEntry *nde, int nlsk)
>  {
>  	pr_info("Restoring link %s type %d\n", nde->name, nde->type);
> @@ -702,6 +725,8 @@ static int restore_link(NetDeviceEntry *nde, int nlsk)
>  		return restore_one_tun(nde, nlsk);
>  	case ND_TYPE__BRIDGE:
>  		return restore_one_link(nde, nlsk, bridge_link_info);
> +	case ND_TYPE__SIT:
> +		return restore_one_link(nde, nlsk, sit_link_info);
>  
>  	default:
>  		pr_err("Unsupported link type %d\n", nde->type);
> diff --git a/images/netdev.proto b/images/netdev.proto
> index dafa2bd..bc8a229 100644
> --- a/images/netdev.proto
> +++ b/images/netdev.proto
> @@ -17,6 +17,8 @@ enum nd_type {
>  	 */
>  	VENET		= 5;
>  	BRIDGE		= 6;
> +	/* ipv4 over ipv6 tunnel */
> +	SIT		= 7;
>  }
>  
>  message net_device_entry {
> 



More information about the CRIU mailing list