iproute: fix handling of "dev IFACE" selector
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 9 Feb 2011 03:39:09 +0000 (04:39 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 9 Feb 2011 03:39:09 +0000 (04:39 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/libiproute/iproute.c
networking/libiproute/libnetlink.c

index f6071b463455bad4bc76a645aa629558602289d1..14fc16c4d930d54fc539c65506381923d7d9aa38 100644 (file)
@@ -31,8 +31,8 @@ struct filter_t {
        //int type; - read-only
        //int typemask; - unused
        //int tos, tosmask; - unused
-       int iif, iifmask;
-       int oif, oifmask;
+       int iif;
+       int oif;
        //int realm, realmmask; - unused
        //inet_prefix rprefsrc; - read-only
        inet_prefix rvia;
@@ -182,17 +182,25 @@ static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM,
        ) {
                return 0;
        }
-       if (G_filter.flushb
-        && r->rtm_family == AF_INET6
-        && r->rtm_dst_len == 0
-        && r->rtm_type == RTN_UNREACHABLE
-        && tb[RTA_PRIORITY]
-        && *(int*)RTA_DATA(tb[RTA_PRIORITY]) == -1
-       ) {
-               return 0;
+       if (G_filter.oif != 0) {
+               if (!tb[RTA_OIF])
+                       return 0;
+               if (G_filter.oif != *(int*)RTA_DATA(tb[RTA_OIF]))
+                       return 0;
        }
 
        if (G_filter.flushb) {
+               /* We are creating route flush commands */
+
+               if (r->rtm_family == AF_INET6
+                && r->rtm_dst_len == 0
+                && r->rtm_type == RTN_UNREACHABLE
+                && tb[RTA_PRIORITY]
+                && *(int*)RTA_DATA(tb[RTA_PRIORITY]) == -1
+               ) {
+                       return 0;
+               }
+
                struct nlmsghdr *fn;
                if (NLMSG_ALIGN(G_filter.flushp) + n->nlmsg_len > G_filter.flushe) {
                        if (flush_update())
@@ -208,6 +216,8 @@ static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM,
                return 0;
        }
 
+       /* We are printing routes */
+
        if (n->nlmsg_type == RTM_DELROUTE) {
                printf("Deleted ");
        }
@@ -257,10 +267,12 @@ static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM,
                                        RTA_DATA(tb[RTA_GATEWAY]),
                                        abuf, sizeof(abuf)));
        }
-       if (tb[RTA_OIF] && G_filter.oifmask != -1) {
+       if (tb[RTA_OIF]) {
                printf("dev %s ", ll_index_to_name(*(int*)RTA_DATA(tb[RTA_OIF])));
        }
 
+       /* Todo: parse & show "proto kernel", "scope link" here */
+
        if (tb[RTA_PREFSRC] && /*G_filter.rprefsrc.bitlen - always 0*/ 0 != host_len) {
                /* Do not use format_host(). It is our local addr
                   and symbolic name will not be useful.
@@ -292,7 +304,7 @@ static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM,
                                printf(" error %d", ci->rta_error);
                }
        }
-       if (tb[RTA_IIF] && G_filter.iifmask != -1) {
+       if (tb[RTA_IIF] && G_filter.iif == 0) {
                printf(" iif %s", ll_index_to_name(*(int*)RTA_DATA(tb[RTA_IIF])));
        }
        bb_putchar('\n');
@@ -662,12 +674,10 @@ static int iproute_list_or_flush(char **argv, int flush)
                if (id) {
                        idx = xll_name_to_index(id);
                        G_filter.iif = idx;
-                       G_filter.iifmask = -1;
                }
                if (od) {
                        idx = xll_name_to_index(od);
                        G_filter.oif = idx;
-                       G_filter.oifmask = -1;
                }
        }
 
index 7291ee2f1056c853c2ca88fc7e4857a30d80295f..547013ff63ffb6411dfa83535b1c30993c048ff6 100644 (file)
@@ -55,6 +55,7 @@ int FAST_FUNC xrtnl_wilddump_request(struct rtnl_handle *rth, int family, int ty
        return rtnl_send(rth, (void*)&req, sizeof(req));
 }
 
+//TODO: pass rth->fd instead of full rth?
 int FAST_FUNC rtnl_send(struct rtnl_handle *rth, char *buf, int len)
 {
        struct sockaddr_nl nladdr;