[IPv6] rules: Use RT6_LOOKUP_F_HAS_SADDR and fix source based selectors
Fixes rt6_lookup() to provide the source address in the flow and sets RT6_LOOKUP_F_HAS_SADDR whenever it is present in the flow. Avoids unnecessary prefix comparisons by checking for a prefix length first. Fixes the rule logic to not match packets if a source selector has been specified but no source address is available. Thanks to Kim Nordlund <kim.nordlund@nokia.com> for working on this patch with me. Signed-off-by: Thomas Graf <tgraf@suug.ch> Acked-by: Ville Nuorvala <vnuorval@tcs.hut.fi> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
918049f013
commit
adaa70bbdf
@ -117,12 +117,15 @@ static int fib6_rule_match(struct fib_rule *rule, struct flowi *fl, int flags)
|
||||
{
|
||||
struct fib6_rule *r = (struct fib6_rule *) rule;
|
||||
|
||||
if (!ipv6_prefix_equal(&fl->fl6_dst, &r->dst.addr, r->dst.plen))
|
||||
if (r->dst.plen &&
|
||||
!ipv6_prefix_equal(&fl->fl6_dst, &r->dst.addr, r->dst.plen))
|
||||
return 0;
|
||||
|
||||
if ((flags & RT6_LOOKUP_F_HAS_SADDR) &&
|
||||
!ipv6_prefix_equal(&fl->fl6_src, &r->src.addr, r->src.plen))
|
||||
return 0;
|
||||
if (r->src.plen) {
|
||||
if (!(flags & RT6_LOOKUP_F_HAS_SADDR) ||
|
||||
!ipv6_prefix_equal(&fl->fl6_src, &r->src.addr, r->src.plen))
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (r->tclass && r->tclass != ((ntohl(fl->fl6_flowlabel) >> 20) & 0xff))
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user