From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stephen Hemminger Subject: Re: [iproute2 net-next] ip route: Add RTM_F_LOOKUP_TABLE flag and show table id Date: Mon, 21 Sep 2015 14:19:29 -0700 Message-ID: <20150921141929.681ebf69@urahara> References: <1442859588-14831-1-git-send-email-dsa@cumulusnetworks.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Cc: netdev@vger.kernel.org To: David Ahern Return-path: Received: from mail-pa0-f53.google.com ([209.85.220.53]:36498 "EHLO mail-pa0-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752845AbbIUVTR (ORCPT ); Mon, 21 Sep 2015 17:19:17 -0400 Received: by padbj2 with SMTP id bj2so1966726pad.3 for ; Mon, 21 Sep 2015 14:19:16 -0700 (PDT) In-Reply-To: <1442859588-14831-1-git-send-email-dsa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org List-ID: On Mon, 21 Sep 2015 11:19:48 -0700 David Ahern wrote: > 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 > --- > ip/iproute.c | 6 ++++-- > 1 files changed, 4 insertions(+), 2 deletions(-) > > diff --git a/ip/iproute.c b/ip/iproute.c > index 8f49e6289003..bae43d5d8fb6 100644 > --- a/ip/iproute.c > +++ b/ip/iproute.c > @@ -421,9 +421,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) > @@ -1638,6 +1638,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); > How will this work (or not) on older kernels?