mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 12:44:11 +08:00
net/ipv6: Refactor fib6_rule_action
Move source address lookup from fib6_rule_action to a helper. It will be used in a later patch by a second variant for fib6_rule_action. Signed-off-by: David Ahern <dsahern@gmail.com> Acked-by: David S. Miller <davem@davemloft.net> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
This commit is contained in:
parent
1d053da910
commit
cc065a9eb9
@ -96,6 +96,31 @@ struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6,
|
||||
return &net->ipv6.ip6_null_entry->dst;
|
||||
}
|
||||
|
||||
static int fib6_rule_saddr(struct net *net, struct fib_rule *rule, int flags,
|
||||
struct flowi6 *flp6, const struct net_device *dev)
|
||||
{
|
||||
struct fib6_rule *r = (struct fib6_rule *)rule;
|
||||
|
||||
/* If we need to find a source address for this traffic,
|
||||
* we check the result if it meets requirement of the rule.
|
||||
*/
|
||||
if ((rule->flags & FIB_RULE_FIND_SADDR) &&
|
||||
r->src.plen && !(flags & RT6_LOOKUP_F_HAS_SADDR)) {
|
||||
struct in6_addr saddr;
|
||||
|
||||
if (ipv6_dev_get_saddr(net, dev, &flp6->daddr,
|
||||
rt6_flags2srcprefs(flags), &saddr))
|
||||
return -EAGAIN;
|
||||
|
||||
if (!ipv6_prefix_equal(&saddr, &r->src.addr, r->src.plen))
|
||||
return -EAGAIN;
|
||||
|
||||
flp6->saddr = saddr;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp,
|
||||
int flags, struct fib_lookup_arg *arg)
|
||||
{
|
||||
@ -134,27 +159,12 @@ static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp,
|
||||
|
||||
rt = lookup(net, table, flp6, arg->lookup_data, flags);
|
||||
if (rt != net->ipv6.ip6_null_entry) {
|
||||
struct fib6_rule *r = (struct fib6_rule *)rule;
|
||||
err = fib6_rule_saddr(net, rule, flags, flp6,
|
||||
ip6_dst_idev(&rt->dst)->dev);
|
||||
|
||||
/*
|
||||
* If we need to find a source address for this traffic,
|
||||
* we check the result if it meets requirement of the rule.
|
||||
*/
|
||||
if ((rule->flags & FIB_RULE_FIND_SADDR) &&
|
||||
r->src.plen && !(flags & RT6_LOOKUP_F_HAS_SADDR)) {
|
||||
struct in6_addr saddr;
|
||||
if (err == -EAGAIN)
|
||||
goto again;
|
||||
|
||||
if (ipv6_dev_get_saddr(net,
|
||||
ip6_dst_idev(&rt->dst)->dev,
|
||||
&flp6->daddr,
|
||||
rt6_flags2srcprefs(flags),
|
||||
&saddr))
|
||||
goto again;
|
||||
if (!ipv6_prefix_equal(&saddr, &r->src.addr,
|
||||
r->src.plen))
|
||||
goto again;
|
||||
flp6->saddr = saddr;
|
||||
}
|
||||
err = rt->dst.error;
|
||||
if (err != -EAGAIN)
|
||||
goto out;
|
||||
|
Loading…
Reference in New Issue
Block a user