[v9,1/9] net: pass the struct nlattrs to dump() functions

Submitted by Tycho Andersen on Oct. 19, 2016, 4:15 p.m.

Details

Message ID 1476893715-24058-2-git-send-email-tycho.andersen@canonical.com
State Superseded
Series "Series without cover letter"
Headers show

Commit Message

Tycho Andersen Oct. 19, 2016, 4:15 p.m.
We'll use this later in the series to get specific information that macvlan
links need.

v2: pass the IFLA_LINKINFO instead of the whole attribute buffer, since
    that's al all we expect the info functions to need, and all we allow
    them to populate on restore

Signed-off-by: Tycho Andersen <tycho.andersen@canonical.com>
---
 criu/include/net.h |  4 +++-
 criu/include/tun.h |  4 +++-
 criu/net.c         | 20 +++++++++++++++-----
 criu/tun.c         |  4 ++--
 4 files changed, 23 insertions(+), 9 deletions(-)

Patch hide | download patch | download mbox

diff --git a/criu/include/net.h b/criu/include/net.h
index ede380f..b367e34 100644
--- a/criu/include/net.h
+++ b/criu/include/net.h
@@ -1,6 +1,8 @@ 
 #ifndef __CR_NET_H__
 #define __CR_NET_H__
 
+#include <linux/netlink.h>
+
 #include "list.h"
 
 struct cr_imgset;
@@ -23,7 +25,7 @@  extern void network_unlock(void);
 extern struct ns_desc net_ns_desc;
 
 #include "images/netdev.pb-c.h"
-extern int write_netdev_img(NetDeviceEntry *nde, struct cr_imgset *fds);
+extern int write_netdev_img(NetDeviceEntry *nde, struct cr_imgset *fds, struct nlattr **info);
 extern int read_ns_sys_file(char *path, char *buf, int len);
 extern int restore_link_parms(NetDeviceEntry *nde, int nlsk);
 
diff --git a/criu/include/tun.h b/criu/include/tun.h
index 1e313d6..c1434ae 100644
--- a/criu/include/tun.h
+++ b/criu/include/tun.h
@@ -5,10 +5,12 @@ 
 #define TUN_MINOR	200
 #endif
 
+#include <linux/netlink.h>
+
 #include "images/netdev.pb-c.h"
 
 extern const struct fdtype_ops tunfile_dump_ops;
-extern int dump_tun_link(NetDeviceEntry *nde, struct cr_imgset *fds);
+extern int dump_tun_link(NetDeviceEntry *nde, struct cr_imgset *fds, struct nlattr **info);
 extern int restore_one_tun(NetDeviceEntry *nde, int nlsk);
 extern struct collect_image_info tunfile_cinfo;
 extern int check_tun_cr(int no_tun_err);
diff --git a/criu/net.c b/criu/net.c
index 32e51ed..42de96d 100644
--- a/criu/net.c
+++ b/criu/net.c
@@ -337,14 +337,14 @@  static int ipv4_conf_op_old(char *tgt, int *conf, int n, int op, int *def_conf)
 	return 0;
 }
 
-int write_netdev_img(NetDeviceEntry *nde, struct cr_imgset *fds)
+int write_netdev_img(NetDeviceEntry *nde, struct cr_imgset *fds, struct nlattr **info)
 {
 	return pb_write_one(img_from_set(fds, CR_FD_NETDEV), nde, PB_NETDEV);
 }
 
 static int dump_one_netdev(int type, struct ifinfomsg *ifi,
 		struct nlattr **tb, struct cr_imgset *fds,
-		int (*dump)(NetDeviceEntry *, struct cr_imgset *))
+		int (*dump)(NetDeviceEntry *, struct cr_imgset *, struct nlattr **info))
 {
 	int ret = -1;
 	int i;
@@ -354,6 +354,7 @@  static int dump_one_netdev(int type, struct ifinfomsg *ifi,
 	SysctlEntry *confs6 = NULL;
 	int size6 = ARRAY_SIZE(devconfs6);
 	char stable_secret[MAX_STR_CONF_LEN + 1] = {};
+	struct nlattr *info[IFLA_INFO_MAX], **arg = NULL;
 
 	if (!tb[IFLA_IFNAME]) {
 		pr_err("No name for link %d\n", ifi->ifi_index);
@@ -421,7 +422,16 @@  static int dump_one_netdev(int type, struct ifinfomsg *ifi,
 	if (!dump)
 		dump = write_netdev_img;
 
-	ret = dump(&netdev, fds);
+	if (tb[IFLA_LINKINFO]) {
+		ret = nla_parse_nested(info, IFLA_INFO_MAX, tb[IFLA_LINKINFO], NULL);
+		if (ret < 0) {
+			pr_err("failed to parse nested linkinfo\n");
+			return -1;
+		}
+		arg = info;
+	}
+
+	ret = dump(&netdev, fds, arg);
 err_free:
 	xfree(netdev.conf4);
 	xfree(confs4);
@@ -463,7 +473,7 @@  static int dump_unknown_device(struct ifinfomsg *ifi, char *kind,
 	return -1;
 }
 
-static int dump_bridge(NetDeviceEntry *nde, struct cr_imgset *imgset)
+static int dump_bridge(NetDeviceEntry *nde, struct cr_imgset *imgset, struct nlattr **info)
 {
 	char spath[IFNAMSIZ + 16]; /* len("class/net//brif") + 1 for null */
 	int ret, fd;
@@ -495,7 +505,7 @@  static int dump_bridge(NetDeviceEntry *nde, struct cr_imgset *imgset)
 		return -1;
 	}
 
-	return write_netdev_img(nde, imgset);
+	return write_netdev_img(nde, imgset, info);
 }
 
 static int dump_one_ethernet(struct ifinfomsg *ifi, char *kind,
diff --git a/criu/tun.c b/criu/tun.c
index b3b8f8f..6d854e7 100644
--- a/criu/tun.c
+++ b/criu/tun.c
@@ -397,7 +397,7 @@  struct collect_image_info tunfile_cinfo = {
 	.collect = collect_one_tunfile,
 };
 
-int dump_tun_link(NetDeviceEntry *nde, struct cr_imgset *fds)
+int dump_tun_link(NetDeviceEntry *nde, struct cr_imgset *fds, struct nlattr **info)
 {
 	TunLinkEntry tle = TUN_LINK_ENTRY__INIT;
 	char spath[64];
@@ -428,7 +428,7 @@  int dump_tun_link(NetDeviceEntry *nde, struct cr_imgset *fds)
 	tle.sndbuf = tl->dmp.sndbuf;
 
 	nde->tun = &tle;
-	return write_netdev_img(nde, fds);
+	return write_netdev_img(nde, fds, info);
 }
 
 int restore_one_tun(NetDeviceEntry *nde, int nlsk)