ipv6: Refactor rt6_device_match
Move the device and gateway checks in the fib6_next loop to a helper that can be called per fib6_nh entry. Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d83009d462
commit
0c59d00675
|
@ -466,12 +466,34 @@ struct fib6_info *fib6_multipath_select(const struct net *net,
|
||||||
* Route lookup. rcu_read_lock() should be held.
|
* Route lookup. rcu_read_lock() should be held.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static bool __rt6_device_match(struct net *net, const struct fib6_nh *nh,
|
||||||
|
const struct in6_addr *saddr, int oif, int flags)
|
||||||
|
{
|
||||||
|
const struct net_device *dev;
|
||||||
|
|
||||||
|
if (nh->fib_nh_flags & RTNH_F_DEAD)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
dev = nh->fib_nh_dev;
|
||||||
|
if (oif) {
|
||||||
|
if (dev->ifindex == oif)
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
if (ipv6_chk_addr(net, saddr, dev,
|
||||||
|
flags & RT6_LOOKUP_F_IFACE))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static inline struct fib6_info *rt6_device_match(struct net *net,
|
static inline struct fib6_info *rt6_device_match(struct net *net,
|
||||||
struct fib6_info *rt,
|
struct fib6_info *rt,
|
||||||
const struct in6_addr *saddr,
|
const struct in6_addr *saddr,
|
||||||
int oif,
|
int oif,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
|
const struct fib6_nh *nh;
|
||||||
struct fib6_info *sprt;
|
struct fib6_info *sprt;
|
||||||
|
|
||||||
if (!oif && ipv6_addr_any(saddr) &&
|
if (!oif && ipv6_addr_any(saddr) &&
|
||||||
|
@ -479,19 +501,9 @@ static inline struct fib6_info *rt6_device_match(struct net *net,
|
||||||
return rt;
|
return rt;
|
||||||
|
|
||||||
for (sprt = rt; sprt; sprt = rcu_dereference(sprt->fib6_next)) {
|
for (sprt = rt; sprt; sprt = rcu_dereference(sprt->fib6_next)) {
|
||||||
const struct net_device *dev = sprt->fib6_nh.fib_nh_dev;
|
nh = &sprt->fib6_nh;
|
||||||
|
if (__rt6_device_match(net, nh, saddr, oif, flags))
|
||||||
if (sprt->fib6_nh.fib_nh_flags & RTNH_F_DEAD)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (oif) {
|
|
||||||
if (dev->ifindex == oif)
|
|
||||||
return sprt;
|
return sprt;
|
||||||
} else {
|
|
||||||
if (ipv6_chk_addr(net, saddr, dev,
|
|
||||||
flags & RT6_LOOKUP_F_IFACE))
|
|
||||||
return sprt;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (oif && flags & RT6_LOOKUP_F_IFACE)
|
if (oif && flags & RT6_LOOKUP_F_IFACE)
|
||||||
|
|
Loading…
Reference in New Issue