From patchwork Mon Jul 27 18:31:00 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 500535 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 01EB6140326 for ; Tue, 28 Jul 2015 04:34:19 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b=dqyTFgF2; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754319AbbG0SeE (ORCPT ); Mon, 27 Jul 2015 14:34:04 -0400 Received: from mail-ig0-f176.google.com ([209.85.213.176]:37072 "EHLO mail-ig0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753893AbbG0SdC (ORCPT ); Mon, 27 Jul 2015 14:33:02 -0400 Received: by igbpg9 with SMTP id pg9so89326942igb.0 for ; Mon, 27 Jul 2015 11:33:02 -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=strCgBxbcOCw/ONIIByFRXtKeEMgpTn43iKlPRbDZQ4=; b=dqyTFgF2sDMJZCAQLGyrFKQPJCl/Cz4RuYVs2QGYydbeF5Qr95+2SGgkiXUl0fscCm 6sehIBC1N1GwlsV9LP7k1VHXc8SVeoDtJ+eVmQbrfpuohTZ/MkrM/56v86H8iyfY9h0z HXeh348J521RkzBIqRKBQMKqijupK95sQe45g= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=strCgBxbcOCw/ONIIByFRXtKeEMgpTn43iKlPRbDZQ4=; b=Q5VHDGT5ES16PE+KY+5xI03/MHbnXHKfQkm3TomYgddQsKjd8s+0VinHOomxSCB74l ZZaPkbXgCahVcuprLsFkm7m3zuuAeCoxtovg5ljzIc/7uGkmq19UkEm493OHPDklR9Xw DSuVTOZ9qI4YLylECl1ryD/Vomjv9DyEu1IsuXoAN1c8MWb/9px/QHsAf2n7ha6zvovo C89my5GdJjYY97UglSXIIZ8n2Amn8Y9Qb4P+VRE63GJxIYW3YaW5sbivG2kWWhKWRDXr M3/4BHqz3/locShMv5MXY3bvylNyEpVNAvVXISWjYC6N6gDDwBPaY2x9+hvsvQXNQril Tosw== X-Gm-Message-State: ALoCoQmS483QlcKjiygHQiPoSBlBsRzOOoxWSMHpfvu5PviAgqWNgxEhXC1AyonLE+v7eHUvKdn9 X-Received: by 10.50.79.230 with SMTP id m6mr20945521igx.42.1438021982288; Mon, 27 Jul 2015 11:33:02 -0700 (PDT) Received: from localhost.localdomain (c-174-51-80-140.hsd1.co.comcast.net. [174.51.80.140]) by smtp.googlemail.com with ESMTPSA id p82sm12442981ioi.14.2015.07.27.11.33.00 (version=TLSv1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 27 Jul 2015 11:33:01 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: shm@cumulusnetworks.com, roopa@cumulusnetworks.com, gospo@cumulusnetworks.com, jtoppins@cumulusnetworks.com, nikolay@cumulusnetworks.com, ddutt@cumulusnetworks.com, hannes@stressinduktion.org, nicolas.dichtel@6wind.com, stephen@networkplumber.org, hadi@mojatatu.com, ebiederm@xmission.com, davem@davemloft.net, svaidya@brocade.com, mingo@kernel.org, luto@amacapital.net, David Ahern Subject: [PATCH net-next 07/16] net: Add inet_addr lookup by table Date: Mon, 27 Jul 2015 12:31:00 -0600 Message-Id: <1438021869-49186-8-git-send-email-dsa@cumulusnetworks.com> X-Mailer: git-send-email 2.3.2 (Apple Git-55) In-Reply-To: <1438021869-49186-1-git-send-email-dsa@cumulusnetworks.com> References: <1438021869-49186-1-git-send-email-dsa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Currently inet_addr_type and inet_dev_addr_type expect local addresses to be in the local table. With the VRF device local routes for devices associated with a VRF will be in the table associated with the VRF. Provide an alternate inet_addr lookup to use a specific table rather than defaulting to the local table. Signed-off-by: Shrijeet Mukherjee Signed-off-by: David Ahern --- include/net/route.h | 1 + net/ipv4/fib_frontend.c | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/include/net/route.h b/include/net/route.h index 54f97eea0fb2..3b51c339c269 100644 --- a/include/net/route.h +++ b/include/net/route.h @@ -192,6 +192,7 @@ void ipv4_sk_redirect(struct sk_buff *skb, struct sock *sk); void ip_rt_send_redirect(struct sk_buff *skb); unsigned int inet_addr_type(struct net *net, __be32 addr); +unsigned int inet_addr_type_table(struct net *net, __be32 addr, int tb_id); unsigned int inet_dev_addr_type(struct net *net, const struct net_device *dev, __be32 addr); void ip_rt_multicast_event(struct in_device *); diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index 6e68a003d0fd..cc413b0170ed 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c @@ -214,12 +214,12 @@ void fib_flush_external(struct net *net) */ static inline unsigned int __inet_dev_addr_type(struct net *net, const struct net_device *dev, - __be32 addr) + __be32 addr, int tb_id) { struct flowi4 fl4 = { .daddr = addr }; struct fib_result res; unsigned int ret = RTN_BROADCAST; - struct fib_table *local_table; + struct fib_table *table; if (ipv4_is_zeronet(addr) || ipv4_is_lbcast(addr)) return RTN_BROADCAST; @@ -228,10 +228,10 @@ static inline unsigned int __inet_dev_addr_type(struct net *net, rcu_read_lock(); - local_table = fib_get_table(net, RT_TABLE_LOCAL); - if (local_table) { + table = fib_get_table(net, tb_id); + if (table) { ret = RTN_UNICAST; - if (!fib_table_lookup(local_table, &fl4, &res, FIB_LOOKUP_NOREF)) { + if (!fib_table_lookup(table, &fl4, &res, FIB_LOOKUP_NOREF)) { if (!dev || dev == res.fi->fib_dev) ret = res.type; } @@ -241,16 +241,24 @@ static inline unsigned int __inet_dev_addr_type(struct net *net, return ret; } +unsigned int inet_addr_type_table(struct net *net, __be32 addr, int tb_id) +{ + return __inet_dev_addr_type(net, NULL, addr, tb_id); +} +EXPORT_SYMBOL(inet_addr_type_table); + unsigned int inet_addr_type(struct net *net, __be32 addr) { - return __inet_dev_addr_type(net, NULL, addr); + return __inet_dev_addr_type(net, NULL, addr, RT_TABLE_LOCAL); } EXPORT_SYMBOL(inet_addr_type); unsigned int inet_dev_addr_type(struct net *net, const struct net_device *dev, __be32 addr) { - return __inet_dev_addr_type(net, dev, addr); + int rt_table = vrf_dev_table(dev) ? : RT_TABLE_LOCAL; + + return __inet_dev_addr_type(net, dev, addr, rt_table); } EXPORT_SYMBOL(inet_dev_addr_type);