From patchwork Mon Oct 5 15:51:25 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 526389 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 0443314090A for ; Tue, 6 Oct 2015 02:51:46 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b=Fe8cMvOj; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752194AbbJEPvk (ORCPT ); Mon, 5 Oct 2015 11:51:40 -0400 Received: from mail-pa0-f51.google.com ([209.85.220.51]:34602 "EHLO mail-pa0-f51.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751285AbbJEPvj (ORCPT ); Mon, 5 Oct 2015 11:51:39 -0400 Received: by padhy16 with SMTP id hy16so40309667pad.1 for ; Mon, 05 Oct 2015 08:51:38 -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=grEWYlSKzzUU+IzysbAMfpqs7OJlNfhmLauZC5J1Jj4=; b=Fe8cMvOj7SqiML9D3SjOgCfdXccSusxEdJEKI+LttUAkcV0rlhjNxKfKcMaVXPra+F +cu+Y9u2+VPKMrvqWfdizge+bNVFfP7VjQPRICJXeSr4NR4+38++p5WOIBD0QmlzvOMW lYhR7J/wxA34pkGYy0GoM/JLrurTLjELMp5Ec= 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=grEWYlSKzzUU+IzysbAMfpqs7OJlNfhmLauZC5J1Jj4=; b=bWR0IdYHhdYBdke9OLVLxKm+tniQXHd75AGOYosP/h+Ki+tRwMwtW7qoDbsEA7RdIN 5QSC4PS2/N+LCKEqrj6k3yEFIV9JvZGgGBJtOi6PQEOq+eU+E617kbesKaCcG5GLgmvr 4f4GV9/B8+p9QBbAfDnjyBb1zM7kti4s6u7RXFHoCDOTvnJlNzPQ4GEiGvn7E0Uf1wyQ 1BZjGjQzt9QXE2NsUVIutkW5U9HU1jVwww+ta4kp2sbtKzSwezFPl34QKcgi3cf5r8uJ t/Vb+Cc2RXM68xerpMvqc0yaqK+G58QG8jUjQjpgQpjVSGPM+ObbCeTljJyLqKAaJIkt gHTQ== X-Gm-Message-State: ALoCoQn9f1AI5Dpz6OtF/PdbiiWhE4ckEjVIC+M9bXmKvuW0e3VpCrztCRZiJIEXQctKZGFQR25k X-Received: by 10.66.144.199 with SMTP id so7mr40815231pab.42.1444060298497; Mon, 05 Oct 2015 08:51:38 -0700 (PDT) Received: from monster-14.cumulusnetworks.com. ([216.129.126.126]) by smtp.googlemail.com with ESMTPSA id qn5sm28346087pbc.74.2015.10.05.08.51.37 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 05 Oct 2015 08:51:37 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: dsahern@gmail.com, David Ahern Subject: [PATCH net-next 3/5] net: Refactor path selection in __ip_route_output_key_hash Date: Mon, 5 Oct 2015 08:51:25 -0700 Message-Id: <1444060287-11024-4-git-send-email-dsa@cumulusnetworks.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1444060287-11024-1-git-send-email-dsa@cumulusnetworks.com> References: <1444060287-11024-1-git-send-email-dsa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org VRF device needs the same path selection following lookup to set source address. Rather than duplicating code, move existing code into a function that is exported to modules. Code move only; no functional change. Signed-off-by: David Ahern --- include/net/ip_fib.h | 2 ++ net/ipv4/fib_semantics.c | 21 +++++++++++++++++++++ net/ipv4/route.c | 16 +--------------- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h index 7a51fd8d99e4..ac5c6e80586a 100644 --- a/include/net/ip_fib.h +++ b/include/net/ip_fib.h @@ -329,6 +329,8 @@ static inline int fib_multipath_hash(__be32 saddr, __be32 daddr) } void fib_select_multipath(struct fib_result *res, int hash); +void fib_select_path(struct net *net, struct fib_result *res, + struct flowi4 *fl4, int mp_hash); /* Exported by fib_trie.c */ void fib_trie_init(void); diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index 0c49d2f3bbc0..caf994c66d59 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c @@ -1557,3 +1557,24 @@ void fib_select_multipath(struct fib_result *res, int hash) res->nh_sel = 0; } #endif + +void fib_select_path(struct net *net, struct fib_result *res, + struct flowi4 *fl4, int mp_hash) +{ +#ifdef CONFIG_IP_ROUTE_MULTIPATH + if (res->fi->fib_nhs > 1 && fl4->flowi4_oif == 0) { + if (mp_hash < 0) + mp_hash = fib_multipath_hash(fl4->saddr, fl4->daddr); + fib_select_multipath(res, mp_hash); + } + else +#endif + if (!res->prefixlen && + res->table->tb_num_default > 1 && + res->type == RTN_UNICAST && !fl4->flowi4_oif) + fib_select_default(fl4, res); + + if (!fl4->saddr) + fl4->saddr = FIB_RES_PREFSRC(net, *res); +} +EXPORT_SYMBOL_GPL(fib_select_path); diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 54297d3a0559..54e6f456a760 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -2238,21 +2238,7 @@ struct rtable *__ip_route_output_key_hash(struct net *net, struct flowi4 *fl4, goto make_route; } -#ifdef CONFIG_IP_ROUTE_MULTIPATH - if (res.fi->fib_nhs > 1 && fl4->flowi4_oif == 0) { - if (mp_hash < 0) - mp_hash = fib_multipath_hash(fl4->saddr, fl4->daddr); - fib_select_multipath(&res, mp_hash); - } - else -#endif - if (!res.prefixlen && - res.table->tb_num_default > 1 && - res.type == RTN_UNICAST && !fl4->flowi4_oif) - fib_select_default(fl4, &res); - - if (!fl4->saddr) - fl4->saddr = FIB_RES_PREFSRC(net, res); + fib_select_path(net, &res, fl4, mp_hash); dev_out = FIB_RES_DEV(res); fl4->flowi4_oif = dev_out->ifindex;