From 2f24d30d0133f81cf3e0639746039a8ed58426e9 Mon Sep 17 00:00:00 2001 From: André Draszik Date: Tue, 13 Jun 2017 19:59:59 +0200 Subject: iproute: support for filtering by and printing of scope MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch adds filtering by and printing of 'scope' to the ip route command, taken from the upstream ip command. x86_64: function old new delta iproute_list_or_flush 1548 1674 +126 print_route 2394 2469 +75 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 2/0 up/down: 201/0) Total: 201 bytes mipsel: iproute_list_or_flush 1952 2096 +144 print_route 2580 2696 +116 ------------------------------------------------------------------------------ (add/remove: 3/0 grow/shrink: 2/0 up/down: 260/0) Total: 260 bytes Signed-off-by: André Draszik Signed-off-by: Denys Vlasenko --- networking/libiproute/iproute.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'networking/libiproute') diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c index cc3443a92..6a41b8331 100644 --- a/networking/libiproute/iproute.c +++ b/networking/libiproute/iproute.c @@ -28,7 +28,7 @@ struct filter_t { int flushe; struct rtnl_handle *rth; //int protocol, protocolmask; - write-only fields?! - //int scope, scopemask; - unused + int scope, scopemask; //int type; - read-only //int typemask; - unused //int tos, tosmask; - unused @@ -120,6 +120,8 @@ static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM, return 0; } } + if ((G_filter.scope ^ r->rtm_scope) & G_filter.scopemask) + return 0; if (G_filter.rdst.family && (r->rtm_family != G_filter.rdst.family || G_filter.rdst.bitlen > r->rtm_dst_len) ) { @@ -270,7 +272,11 @@ static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM, printf("table %s ", rtnl_rttable_n2a(tid)); #endif - /* Todo: parse & show "proto kernel", "scope link" here */ + /* Todo: parse & show "proto kernel" here */ + if (!(r->rtm_flags & RTM_F_CLONED)) { + if ((r->rtm_scope != RT_SCOPE_UNIVERSE) && G_filter.scopemask != -1) + printf("scope %s ", rtnl_rtscope_n2a(r->rtm_scope)); + } if (tb[RTA_PREFSRC] && /*G_filter.rprefsrc.bitlen - always 0*/ 0 != host_len) { /* Do not use format_host(). It is our local addr @@ -761,10 +767,11 @@ static int iproute_list_or_flush(char **argv, int flush) char *id = NULL; char *od = NULL; static const char keywords[] ALIGN1 = + /* If you add stuff here, update iproute_full_usage */ /* "ip route list/flush" parameters: */ "protocol\0" "dev\0" "oif\0" "iif\0" "via\0" "table\0" "cache\0" - "from\0" "to\0" + "from\0" "to\0" "scope\0" /* and possible further keywords */ "all\0" "root\0" @@ -775,7 +782,7 @@ static int iproute_list_or_flush(char **argv, int flush) enum { KW_proto, KW_dev, KW_oif, KW_iif, KW_via, KW_table, KW_cache, - KW_from, KW_to, + KW_from, KW_to, KW_scope, /* */ KW_all, KW_root, @@ -834,6 +841,17 @@ static int iproute_list_or_flush(char **argv, int flush) /* The command 'ip route flush cache' is used by OpenSWAN. * Assuming it's a synonym for 'ip route flush table cache' */ G_filter.tb = -1; + } else if (arg == KW_scope) { + uint32_t scope; + NEXT_ARG(); + G_filter.scopemask = -1; + if (rtnl_rtscope_a2n(&scope, *argv)) { + if (strcmp(*argv, "all") != 0) + invarg_1_to_2(*argv, "scope"); + scope = RT_SCOPE_NOWHERE; + G_filter.scopemask = 0; + } + G_filter.scope = scope; } else if (arg == KW_from) { NEXT_ARG(); parm = index_in_substrings(keywords, *argv); -- cgit v1.2.3