@@ -19,6 +19,7 @@ struct fib_rule {
u32 flags;
u32 table;
u8 action;
+ u8 unresolved;
u32 target;
struct fib_rule __rcu *ctarget;
char iifname[IFNAMSIZ];
@@ -384,9 +384,11 @@ static int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
*/
list_for_each_entry(r, &ops->rules_list, list) {
if (r->action == FR_ACT_GOTO &&
- r->target == rule->pref) {
+ r->target == rule->pref &&
+ r->unresolved) {
BUG_ON(rtnl_dereference(r->ctarget) != NULL);
rcu_assign_pointer(r->ctarget, rule);
+ r->unresolved = 0;
if (--ops->unresolved_rules == 0)
break;
}
@@ -488,6 +490,7 @@ static int fib_nl_delrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
list_for_each_entry(tmp, &ops->rules_list, list) {
if (rtnl_dereference(tmp->ctarget) == rule) {
rcu_assign_pointer(tmp->ctarget, NULL);
+ tmp->unresolved = 1;
ops->unresolved_rules++;
}
}