[NET] rules: Add support to invert selectors
Introduces a new flag FIB_RULE_INVERT causing rules to apply if the specified selector doesn't match. Signed-off-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
1f6c9557e8
commit
3dfbcc411e
|
@ -6,6 +6,7 @@
|
|||
|
||||
/* rule is permanent, and cannot be deleted */
|
||||
#define FIB_RULE_PERMANENT 1
|
||||
#define FIB_RULE_INVERT 2
|
||||
|
||||
struct fib_rule_hdr
|
||||
{
|
||||
|
|
|
@ -107,6 +107,22 @@ out:
|
|||
|
||||
EXPORT_SYMBOL_GPL(fib_rules_unregister);
|
||||
|
||||
static int fib_rule_match(struct fib_rule *rule, struct fib_rules_ops *ops,
|
||||
struct flowi *fl, int flags)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (rule->ifindex && (rule->ifindex != fl->iif))
|
||||
goto out;
|
||||
|
||||
if ((rule->mark ^ fl->mark) & rule->mark_mask)
|
||||
goto out;
|
||||
|
||||
ret = ops->match(rule, fl, flags);
|
||||
out:
|
||||
return (rule->flags & FIB_RULE_INVERT) ? !ret : ret;
|
||||
}
|
||||
|
||||
int fib_rules_lookup(struct fib_rules_ops *ops, struct flowi *fl,
|
||||
int flags, struct fib_lookup_arg *arg)
|
||||
{
|
||||
|
@ -116,13 +132,7 @@ int fib_rules_lookup(struct fib_rules_ops *ops, struct flowi *fl,
|
|||
rcu_read_lock();
|
||||
|
||||
list_for_each_entry_rcu(rule, ops->rules_list, list) {
|
||||
if (rule->ifindex && (rule->ifindex != fl->iif))
|
||||
continue;
|
||||
|
||||
if ((rule->mark ^ fl->mark) & rule->mark_mask)
|
||||
continue;
|
||||
|
||||
if (!ops->match(rule, fl, flags))
|
||||
if (!fib_rule_match(rule, ops, fl, flags))
|
||||
continue;
|
||||
|
||||
err = ops->action(rule, fl, flags, arg);
|
||||
|
|
Loading…
Reference in New Issue