iproute: support onelink route option and print route flags
authorMichael Tokarev <mjt@tls.msk.ru>
Mon, 28 Jul 2014 06:05:41 +0000 (10:05 +0400)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 17 Nov 2014 18:35:41 +0000 (19:35 +0100)
function                                             old     new   delta
print_route                                         1797    1865     +68
do_iproute                                          2097    2112     +15
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 83/0)               Total: 83 bytes

Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/libiproute/iproute.c

index ec4d8ba036563815573f0ad92319cbbd3a048e3f..170c67b30d470857e739d8ad1834c39b1f113c31 100644 (file)
@@ -298,6 +298,19 @@ static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM,
        if (tb[RTA_PRIORITY]) {
                printf(" metric %d ", *(uint32_t*)RTA_DATA(tb[RTA_PRIORITY]));
        }
+       if (r->rtm_flags & RTNH_F_DEAD) {
+               printf("dead ");
+       }
+       if (r->rtm_flags & RTNH_F_ONLINK) {
+               printf("onlink ");
+       }
+       if (r->rtm_flags & RTNH_F_PERVASIVE) {
+               printf("pervasive ");
+       }
+       if (r->rtm_flags & RTM_F_NOTIFY) {
+               printf("notify ");
+       }
+
        if (r->rtm_family == AF_INET6) {
                struct rta_cacheinfo *ci = NULL;
                if (tb[RTA_CACHEINFO]) {
@@ -330,7 +343,7 @@ static int iproute_modify(int cmd, unsigned flags, char **argv)
 {
        static const char keywords[] ALIGN1 =
                "src\0""via\0""mtu\0""lock\0""protocol\0"IF_FEATURE_IP_RULE("table\0")
-               "dev\0""oif\0""to\0""metric\0";
+               "dev\0""oif\0""to\0""metric\0""onlink\0";
        enum {
                ARG_src,
                ARG_via,
@@ -341,6 +354,7 @@ IF_FEATURE_IP_RULE(ARG_table,)
                ARG_oif,
                ARG_to,
                ARG_metric,
+               ARG_onlink,
        };
        enum {
                gw_ok = 1 << 0,
@@ -431,6 +445,8 @@ IF_FEATURE_IP_RULE(ARG_table,)
                        NEXT_ARG();
                        metric = get_u32(*argv, "metric");
                        addattr32(&req.n, sizeof(req), RTA_PRIORITY, metric);
+               } else if (arg == ARG_onlink) {
+                       req.r.rtm_flags |= RTNH_F_ONLINK;
                } else {
                        int type;
                        inet_prefix dst;