[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