Loading include/linux/fib_rules.h +1 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading net/core/fib_rules.c +17 −7 Original line number Diff line number Diff line Loading @@ -107,6 +107,22 @@ int fib_rules_unregister(struct fib_rules_ops *ops) 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) { Loading @@ -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 Loading
include/linux/fib_rules.h +1 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading
net/core/fib_rules.c +17 −7 Original line number Diff line number Diff line Loading @@ -107,6 +107,22 @@ int fib_rules_unregister(struct fib_rules_ops *ops) 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) { Loading @@ -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