]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
ip route: Add RTM_F_LOOKUP_TABLE flag and show table id
authorDavid Ahern <dsa@cumulusnetworks.com>
Mon, 21 Sep 2015 18:19:48 +0000 (11:19 -0700)
committerStephen Hemminger <shemming@brocade.com>
Wed, 23 Sep 2015 23:18:56 +0000 (16:18 -0700)
Currently 'ip route get' does not show the table the lookup result comes
from and prior to kernel commit c36ba6603a11 the response from the kernel
was hardcoded to the main table. From the discussion this appears to be
a leftover from the route cache where the cached entry lost the table id
and so the result was hardcoded to main table.

c36ba6603a11 added the RTM_F_LOOKUP_TABLE flag to maintain that behavior
but to allow new tools to ask for the actual table id for the lookup.
This patch adds that flag to ip route get request and if the result is
not the main table shows the table id.

Signed-off-by: David Ahern <dsa@cumulusnetworks.com>
ip/iproute.c

index da25548c5464b6ea7d5c7a856d49e20b4930ea79..b0cd299e9977d115156e2f3944f3aa563842e45d 100644 (file)
@@ -424,9 +424,9 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
        if (tb[RTA_OIF] && filter.oifmask != -1)
                fprintf(fp, "dev %s ", ll_index_to_name(*(int*)RTA_DATA(tb[RTA_OIF])));
 
+       if (table && (table != RT_TABLE_MAIN || show_details > 0) && !filter.tb)
+               fprintf(fp, " table %s ", rtnl_rttable_n2a(table, b1, sizeof(b1)));
        if (!(r->rtm_flags&RTM_F_CLONED)) {
-               if ((table != RT_TABLE_MAIN || show_details > 0) && !filter.tb)
-                       fprintf(fp, " table %s ", rtnl_rttable_n2a(table, b1, sizeof(b1)));
                if ((r->rtm_protocol != RTPROT_BOOT || show_details > 0) && filter.protocolmask != -1)
                        fprintf(fp, " proto %s ", rtnl_rtprot_n2a(r->rtm_protocol, b1, sizeof(b1)));
                if ((r->rtm_scope != RT_SCOPE_UNIVERSE || show_details > 0) && filter.scopemask != -1)
@@ -1642,6 +1642,8 @@ static int iproute_get(int argc, char **argv)
        if (req.r.rtm_family == AF_UNSPEC)
                req.r.rtm_family = AF_INET;
 
+       req.r.rtm_flags |= RTM_F_LOOKUP_TABLE;
+
        if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0)
                exit(2);