[CRIU] [PATCH v10 06/11] net: add struct newlink_extras
Tycho Andersen
tycho.andersen at canonical.com
Thu Oct 20 09:25:26 PDT 2016
We'll use this struct in the next patch to set some top level IFLA_ members
that we need for restoring macvlan devices.
Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
---
criu/net.c | 41 +++++++++++++++++++++++++++++++----------
1 file changed, 31 insertions(+), 10 deletions(-)
diff --git a/criu/net.c b/criu/net.c
index 4c502cd..f807c5e 100644
--- a/criu/net.c
+++ b/criu/net.c
@@ -841,8 +841,17 @@ struct newlink_req {
char buf[1024];
};
+/* Optional extra things to be provided at the top level of the NEWLINK
+ * request.
+ */
+struct newlink_extras {
+ int netns_id; /* IFLA_NET_NS_ID */
+ int link; /* IFLA_LINK */
+ int target_netns; /* IFLA_NET_NS_FD */
+};
+
static int populate_newlink_req(struct newlink_req *req, int msg_type, NetDeviceEntry *nde,
- int (*link_info)(NetDeviceEntry *, struct newlink_req *))
+ int (*link_info)(NetDeviceEntry *, struct newlink_req *), struct newlink_extras *extras)
{
memset(req, 0, sizeof(*req));
@@ -860,6 +869,17 @@ static int populate_newlink_req(struct newlink_req *req, int msg_type, NetDevice
req->i.ifi_index = nde->ifindex;
req->i.ifi_flags = nde->flags;
+ if (extras) {
+ if (extras->netns_id >= 0)
+ addattr_l(&req->h, sizeof(*req), IFLA_LINK_NETNSID, &extras->netns_id, sizeof(extras->netns_id));
+
+ if (extras->link >= 0)
+ addattr_l(&req->h, sizeof(*req), IFLA_LINK, &extras->link, sizeof(extras->link));
+
+ if (extras->target_netns >= 0)
+ addattr_l(&req->h, sizeof(*req), IFLA_NET_NS_FD, &extras->target_netns, sizeof(extras->target_netns));
+
+ }
addattr_l(&req->h, sizeof(*req), IFLA_IFNAME, nde->name, strlen(nde->name));
addattr_l(&req->h, sizeof(*req), IFLA_MTU, &nde->mtu, sizeof(nde->mtu));
@@ -889,11 +909,12 @@ static int populate_newlink_req(struct newlink_req *req, int msg_type, NetDevice
}
static int do_rtm_link_req(int msg_type, NetDeviceEntry *nde, int nlsk,
- int (*link_info)(NetDeviceEntry *, struct newlink_req *))
+ int (*link_info)(NetDeviceEntry *, struct newlink_req *),
+ struct newlink_extras *extras)
{
struct newlink_req req;
- if (populate_newlink_req(&req, msg_type, nde, link_info) < 0)
+ if (populate_newlink_req(&req, msg_type, nde, link_info, extras) < 0)
return -1;
return do_rtnl_req(nlsk, &req, req.h.nlmsg_len, restore_link_cb, NULL, NULL);
@@ -901,14 +922,15 @@ static int do_rtm_link_req(int msg_type, NetDeviceEntry *nde, int nlsk,
int restore_link_parms(NetDeviceEntry *nde, int nlsk)
{
- return do_rtm_link_req(RTM_SETLINK, nde, nlsk, NULL);
+ return do_rtm_link_req(RTM_SETLINK, nde, nlsk, NULL, NULL);
}
static int restore_one_link(NetDeviceEntry *nde, int nlsk,
- int (*link_info)(NetDeviceEntry *, struct newlink_req *))
+ int (*link_info)(NetDeviceEntry *, struct newlink_req *),
+ struct newlink_extras *extras)
{
pr_info("Restoring netdev %s idx %d\n", nde->name, nde->ifindex);
- return do_rtm_link_req(RTM_NEWLINK, nde, nlsk, link_info);
+ return do_rtm_link_req(RTM_NEWLINK, nde, nlsk, link_info, extras);
}
#ifndef VETH_INFO_MAX
@@ -1013,14 +1035,13 @@ static int restore_link(NetDeviceEntry *nde, int nlsk)
case ND_TYPE__EXTLINK: /* see comment in images/netdev.proto */
return restore_link_parms(nde, nlsk);
case ND_TYPE__VENET:
- return restore_one_link(nde, nlsk, venet_link_info);
+ return restore_one_link(nde, nlsk, venet_link_info, NULL);
case ND_TYPE__VETH:
- return restore_one_link(nde, nlsk, veth_link_info);
+ return restore_one_link(nde, nlsk, veth_link_info, NULL);
case ND_TYPE__TUN:
return restore_one_tun(nde, nlsk);
case ND_TYPE__BRIDGE:
- return restore_one_link(nde, nlsk, bridge_link_info);
-
+ return restore_one_link(nde, nlsk, bridge_link_info, NULL);
default:
pr_err("Unsupported link type %d\n", nde->type);
break;
--
2.7.4
More information about the CRIU
mailing list