From patchwork Wed May 24 18:19:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roopa Prabhu X-Patchwork-Id: 766610 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3wY0zW3380z9sPK for ; Thu, 25 May 2017 04:19:35 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="Q1GTRMQ3"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933892AbdEXSTc (ORCPT ); Wed, 24 May 2017 14:19:32 -0400 Received: from mail-pf0-f179.google.com ([209.85.192.179]:36215 "EHLO mail-pf0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933834AbdEXSTX (ORCPT ); Wed, 24 May 2017 14:19:23 -0400 Received: by mail-pf0-f179.google.com with SMTP id m17so143163444pfg.3 for ; Wed, 24 May 2017 11:19:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=9r10mCK+MQKhCdSJyXtlE6v2JBNGMI1+jpxYu/szhVY=; b=Q1GTRMQ3Z4SfYstNLMc9ZQZ1MQTIKhfrjN+oCiGzjkLIHMXI3OLjn+rVOxFi85m8YL ZnP95vkMdPEXHTgNFVxulbdvypC/tGBqLsyf9uuONUBxR0GuD3mYd5ZOlUwrEUam9Ie6 39+2rnSutWD+2FPhsUsLFc61oxYobq7wspb4o= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=9r10mCK+MQKhCdSJyXtlE6v2JBNGMI1+jpxYu/szhVY=; b=hKboiO4HRTUhkqj8JbH4+jTKZYeFu60n0IyW7Bm4cZFpjI8xcQKICN9+U4M5CNURFf ETpjRxEYj0TbFOfc+uCkXxnFAKPXkI6r4Z00zrelFEiU/II3HrFaItt3v/Qd2b4PXrmt 4L6tGdkXjq9JzJMf5LUoMH4DzobNUbVVvmo/kvzzE1TE13D8yzl7LOl3XQUcAQZJRGdL DCuJY8ZzxARtv/HWKOUqe+G3Bvut65DPxcAIsajnb+X+GYv7BoAsYTbOv5uaAmRCWC+Q 6J9NMBc/cvhDG7bD5t68tu8yGJIXNTCDRdi0nMR0fOwULbMEoJ+xZ1TEa9btdN7qSrYx GboQ== X-Gm-Message-State: AODbwcD8NnpBkuJJGlo1e9wuw7jorznbqmVlRbQb1WGdzX+ND0Y7cltL Rp47ca1yFaOTkrPj X-Received: by 10.99.181.25 with SMTP id y25mr39822617pge.192.1495649962727; Wed, 24 May 2017 11:19:22 -0700 (PDT) Received: from monster-08.mvlab.cumulusnetworks.com. ([216.129.126.126]) by smtp.googlemail.com with ESMTPSA id g63sm8805255pgc.59.2017.05.24.11.19.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 24 May 2017 11:19:22 -0700 (PDT) From: Roopa Prabhu X-Google-Original-From: Roopa Prabhu To: davem@davemloft.net Cc: netdev@vger.kernel.org, dsahern@gmail.com, nikolay@cumulusnetworks.com Subject: [PATCH net-next 8/8] net: ipv6: RTM_GETROUTE: return matched fib result when requested Date: Wed, 24 May 2017 11:19:11 -0700 Message-Id: <1495649951-30417-9-git-send-email-roopa@cumulusnetworks.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1495649951-30417-1-git-send-email-roopa@cumulusnetworks.com> References: <1495649951-30417-1-git-send-email-roopa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Roopa Prabhu This patch adds support to return matched fib result when RTM_F_FIB_MATCH flag is specified in RTM_GETROUTE request. This is useful for user-space applications/controllers wanting to query a matching route. Signed-off-by: Roopa Prabhu --- net/ipv6/route.c | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 80bda31..c4d6da9 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -3612,6 +3612,7 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, struct rtmsg *rtm; struct flowi6 fl6; int err, iif = 0, oif = 0; + bool fibmatch; err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_ipv6_policy, extack); @@ -3622,6 +3623,7 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, memset(&fl6, 0, sizeof(fl6)); rtm = nlmsg_data(nlh); fl6.flowlabel = ip6_make_flowinfo(rtm->rtm_tos, 0); + fibmatch = (rtm->rtm_flags & RTM_F_FIB_MATCH) ? true : false; if (tb[RTA_SRC]) { if (nla_len(tb[RTA_SRC]) < sizeof(struct in6_addr)) @@ -3667,12 +3669,27 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, if (!ipv6_addr_any(&fl6.saddr)) flags |= RT6_LOOKUP_F_HAS_SADDR; - rt = (struct rt6_info *)ip6_route_input_lookup(net, dev, &fl6, - flags); + if (!fibmatch) + rt = (struct rt6_info *)ip6_route_input_lookup(net, dev, + &fl6, + flags); } else { fl6.flowi6_oif = oif; - rt = (struct rt6_info *)ip6_route_output(net, NULL, &fl6); + if (!fibmatch) + rt = (struct rt6_info *)ip6_route_output_flags(net, + NULL, + &fl6, 0); + } + + if (fibmatch) { + rt = (struct rt6_info *)ip6_route_lookup(net, &fl6, 0); + if (rt->dst.error) { + err = rt->dst.error; + ip6_rt_put(rt); + goto errout; + } + } if (rt == net->ipv6.ip6_null_entry) { @@ -3689,10 +3706,15 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, } skb_dst_set(skb, &rt->dst); - - err = rt6_fill_node(net, skb, rt, &fl6.daddr, &fl6.saddr, iif, - RTM_NEWROUTE, NETLINK_CB(in_skb).portid, - nlh->nlmsg_seq, 0); + if (fibmatch) { + err = rt6_fill_node(net, skb, rt, NULL, NULL, iif, + RTM_NEWROUTE, NETLINK_CB(in_skb).portid, + nlh->nlmsg_seq, 0); + } else { + err = rt6_fill_node(net, skb, rt, &fl6.daddr, &fl6.saddr, iif, + RTM_NEWROUTE, NETLINK_CB(in_skb).portid, + nlh->nlmsg_seq, 0); + } if (err < 0) { kfree_skb(skb); goto errout;