Merge branch 'hdrs-for-dump-req' into iproute2-next

David Ahern says:

====================

iproute2 currently uses ifinfomsg as the header for all dumps using the
wilddump headers. This is wrong as each message type actually has its own
header type. While the kernel has traditionally let it go as it for the
most part only uses the family entry, the use of kernel side filters is
increasing to alter what is returned on a request. The kernel side filters
really need to use the proper header type.

To that end, fix iproute2 to use the proper header struct for the GET type.

====================

Signed-off-by: David Ahern <dsahern@gmail.com>
This commit is contained in:
David Ahern 2018-10-02 18:40:37 -07:00
commit 169e667c93
22 changed files with 210 additions and 55 deletions

View File

@ -502,7 +502,7 @@ static int brlink_show(int argc, char **argv)
}
if (show_details) {
if (rtnl_wilddump_req_filter(&rth, PF_BRIDGE, RTM_GETLINK,
if (rtnl_linkdump_req_filter(&rth, PF_BRIDGE,
(compress_vlans ?
RTEXT_FILTER_BRVLAN_COMPRESSED :
RTEXT_FILTER_BRVLAN)) < 0) {
@ -510,7 +510,7 @@ static int brlink_show(int argc, char **argv)
exit(1);
}
} else {
if (rtnl_wilddump_request(&rth, PF_BRIDGE, RTM_GETLINK) < 0) {
if (rtnl_linkdump_req(&rth, PF_BRIDGE) < 0) {
perror("Cannon send dump request");
exit(1);
}

View File

@ -293,7 +293,7 @@ static int mdb_show(int argc, char **argv)
new_json_obj(json);
/* get mdb entries*/
if (rtnl_wilddump_request(&rth, PF_BRIDGE, RTM_GETMDB) < 0) {
if (rtnl_mdbdump_req(&rth, PF_BRIDGE) < 0) {
perror("Cannot send dump request");
return -1;
}

View File

@ -575,7 +575,7 @@ static int vlan_show(int argc, char **argv)
new_json_obj(json);
if (!show_stats) {
if (rtnl_wilddump_req_filter(&rth, PF_BRIDGE, RTM_GETLINK,
if (rtnl_linkdump_req_filter(&rth, PF_BRIDGE,
(compress_vlans ?
RTEXT_FILTER_BRVLAN_COMPRESSED :
RTEXT_FILTER_BRVLAN)) < 0) {
@ -603,9 +603,7 @@ static int vlan_show(int argc, char **argv)
__u32 filt_mask;
filt_mask = IFLA_STATS_FILTER_BIT(IFLA_STATS_LINK_XSTATS);
if (rtnl_wilddump_stats_req_filter(&rth, AF_UNSPEC,
RTM_GETSTATS,
filt_mask) < 0) {
if (rtnl_statsdump_req_filter(&rth, AF_UNSPEC, filt_mask) < 0) {
perror("Cannont send dump request");
exit(1);
}
@ -619,9 +617,7 @@ static int vlan_show(int argc, char **argv)
}
filt_mask = IFLA_STATS_FILTER_BIT(IFLA_STATS_LINK_XSTATS_SLAVE);
if (rtnl_wilddump_stats_req_filter(&rth, AF_UNSPEC,
RTM_GETSTATS,
filt_mask) < 0) {
if (rtnl_statsdump_req_filter(&rth, AF_UNSPEC, filt_mask) < 0) {
perror("Cannont send slave dump request");
exit(1);
}

View File

@ -46,19 +46,37 @@ int rtnl_open_byproto(struct rtnl_handle *rth, unsigned int subscriptions,
__attribute__((warn_unused_result));
void rtnl_close(struct rtnl_handle *rth);
int rtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type)
int rtnl_addrdump_req(struct rtnl_handle *rth, int family)
__attribute__((warn_unused_result));
int rtnl_wilddump_req_filter(struct rtnl_handle *rth, int fam, int type,
__u32 filt_mask)
int rtnl_addrlbldump_req(struct rtnl_handle *rth, int family)
__attribute__((warn_unused_result));
int rtnl_routedump_req(struct rtnl_handle *rth, int family)
__attribute__((warn_unused_result));
int rtnl_ruledump_req(struct rtnl_handle *rth, int family)
__attribute__((warn_unused_result));
int rtnl_neighdump_req(struct rtnl_handle *rth, int family)
__attribute__((warn_unused_result));
int rtnl_neightbldump_req(struct rtnl_handle *rth, int family)
__attribute__((warn_unused_result));
int rtnl_mdbdump_req(struct rtnl_handle *rth, int family)
__attribute__((warn_unused_result));
int rtnl_netconfdump_req(struct rtnl_handle *rth, int family)
__attribute__((warn_unused_result));
int rtnl_nsiddump_req(struct rtnl_handle *rth, int family)
__attribute__((warn_unused_result));
int rtnl_linkdump_req(struct rtnl_handle *rth, int fam)
__attribute__((warn_unused_result));
int rtnl_linkdump_req_filter(struct rtnl_handle *rth, int fam, __u32 filt_mask)
__attribute__((warn_unused_result));
typedef int (*req_filter_fn_t)(struct nlmsghdr *nlh, int reqlen);
int rtnl_wilddump_req_filter_fn(struct rtnl_handle *rth, int fam, int type,
int rtnl_linkdump_req_filter_fn(struct rtnl_handle *rth, int fam,
req_filter_fn_t fn)
__attribute__((warn_unused_result));
int rtnl_wilddump_stats_req_filter(struct rtnl_handle *rth, int fam, int type,
__u32 filt_mask)
int rtnl_statsdump_req_filter(struct rtnl_handle *rth, int fam, __u32 filt_mask)
__attribute__((warn_unused_result));
int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req,
int len)

View File

@ -1698,7 +1698,7 @@ static int ipaddr_flush(void)
filter.flushe = sizeof(flushb);
while ((max_flush_loops == 0) || (round < max_flush_loops)) {
if (rtnl_wilddump_request(&rth, filter.family, RTM_GETADDR) < 0) {
if (rtnl_addrdump_req(&rth, filter.family) < 0) {
perror("Cannot send dump request");
exit(1);
}
@ -1778,7 +1778,7 @@ static int iplink_filter_req(struct nlmsghdr *nlh, int reqlen)
int ip_linkaddr_list(int family, req_filter_fn_t filter_fn,
struct nlmsg_chain *linfo, struct nlmsg_chain *ainfo)
{
if (rtnl_wilddump_req_filter_fn(&rth, preferred_family, RTM_GETLINK,
if (rtnl_linkdump_req_filter_fn(&rth, preferred_family,
filter_fn) < 0) {
perror("Cannot send dump request");
return 1;
@ -1790,7 +1790,7 @@ int ip_linkaddr_list(int family, req_filter_fn_t filter_fn,
}
if (ainfo) {
if (rtnl_wilddump_request(&rth, family, RTM_GETADDR) < 0) {
if (rtnl_addrdump_req(&rth, family) < 0) {
perror("Cannot send dump request");
return 1;
}
@ -1915,7 +1915,7 @@ static int ipaddr_list_flush_or_save(int argc, char **argv, int action)
if (ipadd_save_prep())
exit(1);
if (rtnl_wilddump_request(&rth, preferred_family, RTM_GETADDR) < 0) {
if (rtnl_addrdump_req(&rth, preferred_family) < 0) {
perror("Cannot send dump request");
exit(1);
}
@ -2031,7 +2031,7 @@ void ipaddr_get_vf_rate(int vfnum, int *min, int *max, const char *dev)
exit(1);
}
if (rtnl_wilddump_request(&rth, AF_UNSPEC, RTM_GETLINK) < 0) {
if (rtnl_linkdump_req(&rth, AF_UNSPEC) < 0) {
perror("Cannot send dump request");
exit(1);
}

View File

@ -118,7 +118,7 @@ static int ipaddrlabel_list(int argc, char **argv)
return -1;
}
if (rtnl_wilddump_request(&rth, af, RTM_GETADDRLABEL) < 0) {
if (rtnl_addrlbldump_req(&rth, af) < 0) {
perror("Cannot send dump request");
return 1;
}
@ -237,7 +237,7 @@ static int ipaddrlabel_flush(int argc, char **argv)
return -1;
}
if (rtnl_wilddump_request(&rth, af, RTM_GETADDRLABEL) < 0) {
if (rtnl_addrlbldump_req(&rth, af) < 0) {
perror("Cannot send dump request");
return -1;
}

View File

@ -1601,9 +1601,7 @@ static int iplink_afstats(int argc, char **argv)
}
}
if (rtnl_wilddump_stats_req_filter(&rth, AF_UNSPEC,
RTM_GETSTATS,
filt_mask) < 0) {
if (rtnl_statsdump_req_filter(&rth, AF_UNSPEC, filt_mask) < 0) {
perror("Cannont send dump request");
return 1;
}

View File

@ -65,9 +65,7 @@ int iplink_ifla_xstats(int argc, char **argv)
else
filt_mask = IFLA_STATS_FILTER_BIT(IFLA_STATS_LINK_XSTATS);
if (rtnl_wilddump_stats_req_filter(&rth, AF_UNSPEC,
RTM_GETSTATS,
filt_mask) < 0) {
if (rtnl_statsdump_req_filter(&rth, AF_UNSPEC, filt_mask) < 0) {
perror("Cannont send dump request");
return -1;
}

View File

@ -283,7 +283,7 @@ static int mroute_list(int argc, char **argv)
filter.iif = idx;
}
if (rtnl_wilddump_request(&rth, filter.af, RTM_GETROUTE) < 0) {
if (rtnl_routedump_req(&rth, filter.af) < 0) {
perror("Cannot send dump request");
return 1;
}

View File

@ -210,8 +210,7 @@ static int do_show(int argc, char **argv)
} else {
rth.flags = RTNL_HANDLE_F_SUPPRESS_NLERR;
dump:
if (rtnl_wilddump_request(&rth, filter.family,
RTM_GETNETCONF) < 0) {
if (rtnl_netconfdump_req(&rth, filter.family) < 0) {
perror("Cannot send dump request");
exit(1);
}

View File

@ -346,7 +346,7 @@ static int netns_list_id(int argc, char **argv)
return -ENOTSUP;
}
if (rtnl_wilddump_request(&rth, AF_UNSPEC, RTM_GETNSID) < 0) {
if (rtnl_nsiddump_req(&rth, AF_UNSPEC) < 0) {
perror("Cannot send dump request");
exit(1);
}

View File

@ -658,7 +658,7 @@ static int ipntable_show(int argc, char **argv)
argc--; argv++;
}
if (rtnl_wilddump_request(&rth, preferred_family, RTM_GETNEIGHTBL) < 0) {
if (rtnl_neightbldump_req(&rth, preferred_family) < 0) {
perror("Cannot send dump request");
exit(1);
}

View File

@ -1645,7 +1645,7 @@ static int iproute_flush(int do_ipv6, rtnl_filter_t filter_fn)
filter.flushe = sizeof(flushb);
for (;;) {
if (rtnl_wilddump_request(&rth, do_ipv6, RTM_GETROUTE) < 0) {
if (rtnl_routedump_req(&rth, do_ipv6) < 0) {
perror("Cannot send dump request");
return -2;
}
@ -1891,7 +1891,7 @@ static int iproute_list_flush_or_save(int argc, char **argv, int action)
return iproute_flush(do_ipv6, filter_fn);
if (!filter.cloned) {
if (rtnl_wilddump_request(&rth, do_ipv6, RTM_GETROUTE) < 0) {
if (rtnl_routedump_req(&rth, do_ipv6) < 0) {
perror("Cannot send dump request");
return -2;
}

View File

@ -615,7 +615,7 @@ static int iprule_list_flush_or_save(int argc, char **argv, int action)
argc--; argv++;
}
if (rtnl_wilddump_request(&rth, af, RTM_GETRULE) < 0) {
if (rtnl_ruledump_req(&rth, af) < 0) {
perror("Cannot send dump request");
return 1;
}

View File

@ -109,7 +109,7 @@ static int iptoken_list(int argc, char **argv)
argc--; argv++;
}
if (rtnl_wilddump_request(&rth, af, RTM_GETLINK) < 0) {
if (rtnl_linkdump_req(&rth, af) < 0) {
perror("Cannot send dump request");
return -1;
}

View File

@ -459,7 +459,7 @@ static int print_tuntap(const struct sockaddr_nl *who,
static int do_show(int argc, char **argv)
{
if (rtnl_wilddump_req_filter_fn(&rth, AF_UNSPEC, RTM_GETLINK,
if (rtnl_linkdump_req_filter_fn(&rth, AF_UNSPEC,
tuntap_filter_req) < 0) {
perror("Cannot send dump request\n");
return -1;

View File

@ -163,7 +163,7 @@ main(int argc, char **argv)
if (rtnl_open(&rth, groups) < 0)
exit(1);
if (rtnl_wilddump_request(&rth, AF_UNSPEC, RTM_GETLINK) < 0) {
if (rtnl_linkdump_req(&rth, AF_UNSPEC) < 0) {
perror("Cannot send dump request");
exit(1);
}

View File

@ -392,7 +392,7 @@ static int print_nlmsg_tunnel(const struct sockaddr_nl *who,
int do_tunnels_list(struct tnl_print_nlmsg_info *info)
{
if (rtnl_wilddump_request(&rth, preferred_family, RTM_GETLINK) < 0) {
if (rtnl_linkdump_req(&rth, preferred_family) < 0) {
perror("Cannot send dump request\n");
return -1;
}

View File

@ -22,6 +22,9 @@
#include <errno.h>
#include <time.h>
#include <sys/uio.h>
#include <linux/fib_rules.h>
#include <linux/if_addrlabel.h>
#include <linux/if_bridge.h>
#include "libnetlink.h"
@ -199,12 +202,156 @@ int rtnl_open(struct rtnl_handle *rth, unsigned int subscriptions)
return rtnl_open_byproto(rth, subscriptions, NETLINK_ROUTE);
}
int rtnl_wilddump_request(struct rtnl_handle *rth, int family, int type)
int rtnl_addrdump_req(struct rtnl_handle *rth, int family)
{
return rtnl_wilddump_req_filter(rth, family, type, RTEXT_FILTER_VF);
struct {
struct nlmsghdr nlh;
struct ifaddrmsg ifm;
} req = {
.nlh.nlmsg_len = sizeof(req),
.nlh.nlmsg_type = RTM_GETADDR,
.nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
.nlh.nlmsg_seq = rth->dump = ++rth->seq,
.ifm.ifa_family = family,
};
return send(rth->fd, &req, sizeof(req), 0);
}
int rtnl_wilddump_req_filter(struct rtnl_handle *rth, int family, int type,
int rtnl_addrlbldump_req(struct rtnl_handle *rth, int family)
{
struct {
struct nlmsghdr nlh;
struct ifaddrlblmsg ifal;
} req = {
.nlh.nlmsg_len = sizeof(req),
.nlh.nlmsg_type = RTM_GETADDRLABEL,
.nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
.nlh.nlmsg_seq = rth->dump = ++rth->seq,
.ifal.ifal_family = family,
};
return send(rth->fd, &req, sizeof(req), 0);
}
int rtnl_routedump_req(struct rtnl_handle *rth, int family)
{
struct {
struct nlmsghdr nlh;
struct rtmsg rtm;
} req = {
.nlh.nlmsg_len = sizeof(req),
.nlh.nlmsg_type = RTM_GETROUTE,
.nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
.nlh.nlmsg_seq = rth->dump = ++rth->seq,
.rtm.rtm_family = family,
};
return send(rth->fd, &req, sizeof(req), 0);
}
int rtnl_ruledump_req(struct rtnl_handle *rth, int family)
{
struct {
struct nlmsghdr nlh;
struct fib_rule_hdr frh;
} req = {
.nlh.nlmsg_len = sizeof(req),
.nlh.nlmsg_type = RTM_GETRULE,
.nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
.nlh.nlmsg_seq = rth->dump = ++rth->seq,
.frh.family = family
};
return send(rth->fd, &req, sizeof(req), 0);
}
int rtnl_neighdump_req(struct rtnl_handle *rth, int family)
{
struct {
struct nlmsghdr nlh;
struct ndmsg ndm;
} req = {
.nlh.nlmsg_len = sizeof(req),
.nlh.nlmsg_type = RTM_GETNEIGH,
.nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
.nlh.nlmsg_seq = rth->dump = ++rth->seq,
.ndm.ndm_family = family,
};
return send(rth->fd, &req, sizeof(req), 0);
}
int rtnl_neightbldump_req(struct rtnl_handle *rth, int family)
{
struct {
struct nlmsghdr nlh;
struct ndtmsg ndtmsg;
} req = {
.nlh.nlmsg_len = sizeof(req),
.nlh.nlmsg_type = RTM_GETNEIGHTBL,
.nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
.nlh.nlmsg_seq = rth->dump = ++rth->seq,
.ndtmsg.ndtm_family = family,
};
return send(rth->fd, &req, sizeof(req), 0);
}
int rtnl_mdbdump_req(struct rtnl_handle *rth, int family)
{
struct {
struct nlmsghdr nlh;
struct br_port_msg bpm;
} req = {
.nlh.nlmsg_len = sizeof(req),
.nlh.nlmsg_type = RTM_GETMDB,
.nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
.nlh.nlmsg_seq = rth->dump = ++rth->seq,
.bpm.family = family,
};
return send(rth->fd, &req, sizeof(req), 0);
}
int rtnl_netconfdump_req(struct rtnl_handle *rth, int family)
{
struct {
struct nlmsghdr nlh;
struct netconfmsg ncm;
} req = {
.nlh.nlmsg_len = sizeof(req),
.nlh.nlmsg_type = RTM_GETNETCONF,
.nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
.nlh.nlmsg_seq = rth->dump = ++rth->seq,
.ncm.ncm_family = family,
};
return send(rth->fd, &req, sizeof(req), 0);
}
int rtnl_nsiddump_req(struct rtnl_handle *rth, int family)
{
struct {
struct nlmsghdr nlh;
struct rtgenmsg rtm;
} req = {
.nlh.nlmsg_len = sizeof(req),
.nlh.nlmsg_type = RTM_GETNSID,
.nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
.nlh.nlmsg_seq = rth->dump = ++rth->seq,
.rtm.rtgen_family = family,
};
return send(rth->fd, &req, sizeof(req), 0);
}
int rtnl_linkdump_req(struct rtnl_handle *rth, int family)
{
return rtnl_linkdump_req_filter(rth, family, RTEXT_FILTER_VF);
}
int rtnl_linkdump_req_filter(struct rtnl_handle *rth, int family,
__u32 filt_mask)
{
struct {
@ -215,7 +362,7 @@ int rtnl_wilddump_req_filter(struct rtnl_handle *rth, int family, int type,
__u32 ext_filter_mask;
} req = {
.nlh.nlmsg_len = sizeof(req),
.nlh.nlmsg_type = type,
.nlh.nlmsg_type = RTM_GETLINK,
.nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
.nlh.nlmsg_seq = rth->dump = ++rth->seq,
.ifm.ifi_family = family,
@ -227,7 +374,7 @@ int rtnl_wilddump_req_filter(struct rtnl_handle *rth, int family, int type,
return send(rth->fd, &req, sizeof(req), 0);
}
int rtnl_wilddump_req_filter_fn(struct rtnl_handle *rth, int family, int type,
int rtnl_linkdump_req_filter_fn(struct rtnl_handle *rth, int family,
req_filter_fn_t filter_fn)
{
struct {
@ -236,7 +383,7 @@ int rtnl_wilddump_req_filter_fn(struct rtnl_handle *rth, int family, int type,
char buf[1024];
} req = {
.nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
.nlh.nlmsg_type = type,
.nlh.nlmsg_type = RTM_GETLINK,
.nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
.nlh.nlmsg_seq = rth->dump = ++rth->seq,
.ifm.ifi_family = family,
@ -253,8 +400,7 @@ int rtnl_wilddump_req_filter_fn(struct rtnl_handle *rth, int family, int type,
return send(rth->fd, &req, req.nlh.nlmsg_len, 0);
}
int rtnl_wilddump_stats_req_filter(struct rtnl_handle *rth, int fam, int type,
__u32 filt_mask)
int rtnl_statsdump_req_filter(struct rtnl_handle *rth, int fam, __u32 filt_mask)
{
struct {
struct nlmsghdr nlh;
@ -263,7 +409,7 @@ int rtnl_wilddump_stats_req_filter(struct rtnl_handle *rth, int fam, int type,
memset(&req, 0, sizeof(req));
req.nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct if_stats_msg));
req.nlh.nlmsg_type = type;
req.nlh.nlmsg_type = RTM_GETSTATS;
req.nlh.nlmsg_flags = NLM_F_DUMP|NLM_F_REQUEST;
req.nlh.nlmsg_pid = 0;
req.nlh.nlmsg_seq = rth->dump = ++rth->seq;

View File

@ -218,7 +218,7 @@ void ll_init_map(struct rtnl_handle *rth)
if (initialized)
return;
if (rtnl_wilddump_request(rth, AF_UNSPEC, RTM_GETLINK) < 0) {
if (rtnl_linkdump_req(rth, AF_UNSPEC) < 0) {
perror("Cannot send dump request");
exit(1);
}

View File

@ -424,7 +424,7 @@ static int do_one_request(struct nlmsghdr *n)
static void load_initial_table(void)
{
if (rtnl_wilddump_request(&rth, AF_INET, RTM_GETNEIGH) < 0) {
if (rtnl_neighdump_req(&rth, AF_INET) < 0) {
perror("dump request failed");
exit(1);
}

View File

@ -203,8 +203,8 @@ static void load_info(void)
if (is_extended) {
ll_init_map(&rth);
filter_mask = IFLA_STATS_FILTER_BIT(filter_type);
if (rtnl_wilddump_stats_req_filter(&rth, AF_UNSPEC, RTM_GETSTATS,
filter_mask) < 0) {
if (rtnl_statsdump_req_filter(&rth, AF_UNSPEC,
filter_mask) < 0) {
perror("Cannot send dump request");
exit(1);
}
@ -214,7 +214,7 @@ static void load_info(void)
exit(1);
}
} else {
if (rtnl_wilddump_request(&rth, AF_INET, RTM_GETLINK) < 0) {
if (rtnl_linkdump_req(&rth, AF_INET) < 0) {
perror("Cannot send dump request");
exit(1);
}