Commit b705dcc3 authored by Tycho Andersen's avatar Tycho Andersen Committed by Pavel Emelyanov

net: pass the struct nlattrs to dump() functions

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

travis-ci: success for series starting with [v10,01/11] net: pass the struct nlattrs to dump() functions
Signed-off-by: 's avatarTycho Andersen <tycho.andersen@canonical.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 05ac45b1
#ifndef __CR_NET_H__ #ifndef __CR_NET_H__
#define __CR_NET_H__ #define __CR_NET_H__
#include <linux/netlink.h>
#include "common/list.h" #include "common/list.h"
struct cr_imgset; struct cr_imgset;
...@@ -23,7 +25,7 @@ extern void network_unlock(void); ...@@ -23,7 +25,7 @@ extern void network_unlock(void);
extern struct ns_desc net_ns_desc; extern struct ns_desc net_ns_desc;
#include "images/netdev.pb-c.h" #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 read_ns_sys_file(char *path, char *buf, int len);
extern int restore_link_parms(NetDeviceEntry *nde, int nlsk); extern int restore_link_parms(NetDeviceEntry *nde, int nlsk);
......
...@@ -5,10 +5,12 @@ ...@@ -5,10 +5,12 @@
#define TUN_MINOR 200 #define TUN_MINOR 200
#endif #endif
#include <linux/netlink.h>
#include "images/netdev.pb-c.h" #include "images/netdev.pb-c.h"
extern const struct fdtype_ops tunfile_dump_ops; 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 int restore_one_tun(NetDeviceEntry *nde, int nlsk);
extern struct collect_image_info tunfile_cinfo; extern struct collect_image_info tunfile_cinfo;
extern int check_tun_cr(int no_tun_err); extern int check_tun_cr(int no_tun_err);
......
...@@ -338,14 +338,14 @@ static int ipv4_conf_op_old(char *tgt, int *conf, int n, int op, int *def_conf) ...@@ -338,14 +338,14 @@ static int ipv4_conf_op_old(char *tgt, int *conf, int n, int op, int *def_conf)
return 0; 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); return pb_write_one(img_from_set(fds, CR_FD_NETDEV), nde, PB_NETDEV);
} }
static int dump_one_netdev(int type, struct ifinfomsg *ifi, static int dump_one_netdev(int type, struct ifinfomsg *ifi,
struct nlattr **tb, struct cr_imgset *fds, 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 ret = -1;
int i; int i;
...@@ -355,6 +355,7 @@ static int dump_one_netdev(int type, struct ifinfomsg *ifi, ...@@ -355,6 +355,7 @@ static int dump_one_netdev(int type, struct ifinfomsg *ifi,
SysctlEntry *confs6 = NULL; SysctlEntry *confs6 = NULL;
int size6 = ARRAY_SIZE(devconfs6); int size6 = ARRAY_SIZE(devconfs6);
char stable_secret[MAX_STR_CONF_LEN + 1] = {}; char stable_secret[MAX_STR_CONF_LEN + 1] = {};
struct nlattr *info[IFLA_INFO_MAX], **arg = NULL;
if (!tb[IFLA_IFNAME]) { if (!tb[IFLA_IFNAME]) {
pr_err("No name for link %d\n", ifi->ifi_index); pr_err("No name for link %d\n", ifi->ifi_index);
...@@ -422,7 +423,16 @@ static int dump_one_netdev(int type, struct ifinfomsg *ifi, ...@@ -422,7 +423,16 @@ static int dump_one_netdev(int type, struct ifinfomsg *ifi,
if (!dump) if (!dump)
dump = write_netdev_img; 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: err_free:
xfree(netdev.conf4); xfree(netdev.conf4);
xfree(confs4); xfree(confs4);
...@@ -464,7 +474,7 @@ static int dump_unknown_device(struct ifinfomsg *ifi, char *kind, ...@@ -464,7 +474,7 @@ static int dump_unknown_device(struct ifinfomsg *ifi, char *kind,
return -1; 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 */ char spath[IFNAMSIZ + 16]; /* len("class/net//brif") + 1 for null */
int ret, fd; int ret, fd;
...@@ -496,7 +506,7 @@ static int dump_bridge(NetDeviceEntry *nde, struct cr_imgset *imgset) ...@@ -496,7 +506,7 @@ static int dump_bridge(NetDeviceEntry *nde, struct cr_imgset *imgset)
return -1; 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, static int dump_one_ethernet(struct ifinfomsg *ifi, char *kind,
......
...@@ -399,7 +399,7 @@ struct collect_image_info tunfile_cinfo = { ...@@ -399,7 +399,7 @@ struct collect_image_info tunfile_cinfo = {
.collect = collect_one_tunfile, .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; TunLinkEntry tle = TUN_LINK_ENTRY__INIT;
char spath[64]; char spath[64];
...@@ -430,7 +430,7 @@ int dump_tun_link(NetDeviceEntry *nde, struct cr_imgset *fds) ...@@ -430,7 +430,7 @@ int dump_tun_link(NetDeviceEntry *nde, struct cr_imgset *fds)
tle.sndbuf = tl->dmp.sndbuf; tle.sndbuf = tl->dmp.sndbuf;
nde->tun = &tle; nde->tun = &tle;
return write_netdev_img(nde, fds); return write_netdev_img(nde, fds, info);
} }
int restore_one_tun(NetDeviceEntry *nde, int nlsk) int restore_one_tun(NetDeviceEntry *nde, int nlsk)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment