diff options
author | David Ahern <dsa@cumulusnetworks.com> | 2015-10-05 11:51:25 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-10-07 07:27:44 -0400 |
commit | 3ce58d84358c7b477811b5100152fad848f936fc (patch) | |
tree | be2bfdfeddad87ab8f9374e91063213982e24ffa /net/ipv4/fib_semantics.c | |
parent | fee6d4c777a125e56de9370db3b2bf359bf958d6 (diff) |
net: Refactor path selection in __ip_route_output_key_hash
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 <dsa@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/fib_semantics.c')
-rw-r--r-- | net/ipv4/fib_semantics.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index 7bd698c3bd3a..af77298c8b4f 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) | |||
1557 | res->nh_sel = 0; | 1557 | res->nh_sel = 0; |
1558 | } | 1558 | } |
1559 | #endif | 1559 | #endif |
1560 | |||
1561 | void fib_select_path(struct net *net, struct fib_result *res, | ||
1562 | struct flowi4 *fl4, int mp_hash) | ||
1563 | { | ||
1564 | #ifdef CONFIG_IP_ROUTE_MULTIPATH | ||
1565 | if (res->fi->fib_nhs > 1 && fl4->flowi4_oif == 0) { | ||
1566 | if (mp_hash < 0) | ||
1567 | mp_hash = fib_multipath_hash(fl4->saddr, fl4->daddr); | ||
1568 | fib_select_multipath(res, mp_hash); | ||
1569 | } | ||
1570 | else | ||
1571 | #endif | ||
1572 | if (!res->prefixlen && | ||
1573 | res->table->tb_num_default > 1 && | ||
1574 | res->type == RTN_UNICAST && !fl4->flowi4_oif) | ||
1575 | fib_select_default(fl4, res); | ||
1576 | |||
1577 | if (!fl4->saddr) | ||
1578 | fl4->saddr = FIB_RES_PREFSRC(net, *res); | ||
1579 | } | ||
1580 | EXPORT_SYMBOL_GPL(fib_select_path); | ||