|
@@ -54,7 +54,7 @@ u32 fib_rules_tclass(const struct fib_result *res)
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-int fib_lookup(struct net *net, struct flowi4 *flp, struct fib_result *res)
|
|
|
|
|
|
+int __fib_lookup(struct net *net, struct flowi4 *flp, struct fib_result *res)
|
|
{
|
|
{
|
|
struct fib_lookup_arg arg = {
|
|
struct fib_lookup_arg arg = {
|
|
.result = res,
|
|
.result = res,
|
|
@@ -67,7 +67,7 @@ int fib_lookup(struct net *net, struct flowi4 *flp, struct fib_result *res)
|
|
|
|
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL_GPL(fib_lookup);
|
|
|
|
|
|
+EXPORT_SYMBOL_GPL(__fib_lookup);
|
|
|
|
|
|
static int fib4_rule_action(struct fib_rule *rule, struct flowi *flp,
|
|
static int fib4_rule_action(struct fib_rule *rule, struct flowi *flp,
|
|
int flags, struct fib_lookup_arg *arg)
|
|
int flags, struct fib_lookup_arg *arg)
|
|
@@ -172,7 +172,7 @@ static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
|
|
if (tb[FRA_FLOW]) {
|
|
if (tb[FRA_FLOW]) {
|
|
rule4->tclassid = nla_get_u32(tb[FRA_FLOW]);
|
|
rule4->tclassid = nla_get_u32(tb[FRA_FLOW]);
|
|
if (rule4->tclassid)
|
|
if (rule4->tclassid)
|
|
- fib_num_tclassid_users++;
|
|
|
|
|
|
+ net->ipv4.fib_num_tclassid_users++;
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
@@ -182,6 +182,7 @@ static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
|
|
rule4->dstmask = inet_make_mask(rule4->dst_len);
|
|
rule4->dstmask = inet_make_mask(rule4->dst_len);
|
|
rule4->tos = frh->tos;
|
|
rule4->tos = frh->tos;
|
|
|
|
|
|
|
|
+ net->ipv4.fib_has_custom_rules = true;
|
|
err = 0;
|
|
err = 0;
|
|
errout:
|
|
errout:
|
|
return err;
|
|
return err;
|
|
@@ -189,12 +190,14 @@ errout:
|
|
|
|
|
|
static void fib4_rule_delete(struct fib_rule *rule)
|
|
static void fib4_rule_delete(struct fib_rule *rule)
|
|
{
|
|
{
|
|
|
|
+ struct net *net = rule->fr_net;
|
|
#ifdef CONFIG_IP_ROUTE_CLASSID
|
|
#ifdef CONFIG_IP_ROUTE_CLASSID
|
|
struct fib4_rule *rule4 = (struct fib4_rule *) rule;
|
|
struct fib4_rule *rule4 = (struct fib4_rule *) rule;
|
|
|
|
|
|
if (rule4->tclassid)
|
|
if (rule4->tclassid)
|
|
- fib_num_tclassid_users--;
|
|
|
|
|
|
+ net->ipv4.fib_num_tclassid_users--;
|
|
#endif
|
|
#endif
|
|
|
|
+ net->ipv4.fib_has_custom_rules = true;
|
|
}
|
|
}
|
|
|
|
|
|
static int fib4_rule_compare(struct fib_rule *rule, struct fib_rule_hdr *frh,
|
|
static int fib4_rule_compare(struct fib_rule *rule, struct fib_rule_hdr *frh,
|
|
@@ -309,6 +312,7 @@ int __net_init fib4_rules_init(struct net *net)
|
|
if (err < 0)
|
|
if (err < 0)
|
|
goto fail;
|
|
goto fail;
|
|
net->ipv4.rules_ops = ops;
|
|
net->ipv4.rules_ops = ops;
|
|
|
|
+ net->ipv4.fib_has_custom_rules = false;
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
fail:
|
|
fail:
|