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

Tycho Andersen tycho.andersen at canonical.com
Fri Feb 19 07:52:11 PST 2016


On Thu, Feb 18, 2016 at 11:47:36PM +0300, Pavel Emelyanov wrote:
> 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.

Because it gave me -EOPNOTSUPP when I tried it with an address :)

> >  		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.

Ok, I'll look into it and resend.

Tycho

> 
> > +
> > +	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