Skip to content

Commit

Permalink
net: Refactor path selection in __ip_route_output_key_hash
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
David Ahern authored and David S. Miller committed Oct 7, 2015
1 parent fee6d4c commit 3ce58d8
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 15 deletions.
2 changes: 2 additions & 0 deletions include/net/ip_fib.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
21 changes: 21 additions & 0 deletions net/ipv4/fib_semantics.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
16 changes: 1 addition & 15 deletions net/ipv4/route.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 3ce58d8

Please sign in to comment.