From f7431e2913ea0dc6681f3880f377fa71ef2c07d4 Mon Sep 17 00:00:00 2001 From: Nicolas Dichtel Date: Fri, 17 May 2013 01:47:33 -0700 Subject: [PATCH] ipnetconf: by default dump all entries This is now possible, because the dump function has been added in kernel. Note that IPv4 and IPv6 entries are displayed. Before this patch, only all entries were displayed. Example: $ ip netconf ipv4 dev lo forwarding on rp_filter off mc_forwarding 0 ipv4 dev eth0 forwarding on rp_filter off mc_forwarding 1 ipv4 all forwarding on rp_filter off mc_forwarding 1 ipv4 default forwarding on rp_filter off mc_forwarding 0 ipv6 dev lo forwarding on mc_forwarding 0 ipv6 dev eth0 forwarding on mc_forwarding 0 ipv6 all forwarding on mc_forwarding 0 ipv6 default forwarding on mc_forwarding 0 Signed-off-by: Nicolas Dichtel Signed-off-by: Stephen Hemminger --- ip/ipnetconf.c | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/ip/ipnetconf.c b/ip/ipnetconf.c index 8ceadfe4..9a77ecbf 100644 --- a/ip/ipnetconf.c +++ b/ip/ipnetconf.c @@ -136,7 +136,6 @@ static int do_show(int argc, char **argv) filter.family = preferred_family; if (filter.family == AF_UNSPEC) filter.family = AF_INET; - filter.ifindex = NETCONFA_IFINDEX_ALL; while (argc > 0) { if (strcmp(*argv, "dev") == 0) { @@ -152,17 +151,34 @@ static int do_show(int argc, char **argv) } ll_init_map(&rth); - memset(&req, 0, sizeof(req)); - req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct netconfmsg)); - req.n.nlmsg_flags = NLM_F_REQUEST|NLM_F_ACK; - req.n.nlmsg_type = RTM_GETNETCONF; - req.ncm.ncm_family = filter.family; - addattr_l(&req.n, sizeof(req), NETCONFA_IFINDEX, &filter.ifindex, - sizeof(filter.ifindex)); - - rtnl_send(&rth, &req.n, req.n.nlmsg_len); - rtnl_listen(&rth, print_netconf, stdout); + if (filter.ifindex) { + memset(&req, 0, sizeof(req)); + req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct netconfmsg)); + req.n.nlmsg_flags = NLM_F_REQUEST|NLM_F_ACK; + req.n.nlmsg_type = RTM_GETNETCONF; + req.ncm.ncm_family = filter.family; + if (filter.ifindex) + addattr_l(&req.n, sizeof(req), NETCONFA_IFINDEX, + &filter.ifindex, sizeof(filter.ifindex)); + rtnl_send(&rth, &req.n, req.n.nlmsg_len); + rtnl_listen(&rth, print_netconf, stdout); + } else { +dump: + if (rtnl_wilddump_request(&rth, filter.family, RTM_GETNETCONF) < 0) { + perror("Cannot send dump request"); + exit(1); + } + if (rtnl_dump_filter(&rth, print_netconf, stdout) < 0) { + fprintf(stderr, "Dump terminated\n"); + exit(1); + } + if (preferred_family == AF_UNSPEC) { + preferred_family = AF_INET6; + filter.family = AF_INET6; + goto dump; + } + } return 0; }