On Tue, Mar 27, 2007 at 03:21:59PM +0200, Thomas Graf wrote:

> The results of FIB rules lookups are cached in the routing cache
> except for IPv6 as no such cache exists. So far, it was the
> responsibility of the user to flush the cache after modifying any
> rules. This lead to many false bug reports due to misunderstanding
> of this concept.
> 
> This patch automatically flushes the route cache after inserting
> or deleting a rule.
> 
> Signed-off-by: Thomas Graf <[EMAIL PROTECTED]>
> 
> Index: net-2.6.22/include/net/fib_rules.h
> ===================================================================
> --- net-2.6.22.orig/include/net/fib_rules.h   2007-03-27 13:54:52.000000000 
> +0200
> +++ net-2.6.22/include/net/fib_rules.h        2007-03-27 14:16:24.000000000 
> +0200
> @@ -59,6 +59,10 @@ struct fib_rules_ops
>       u32                     (*default_pref)(void);
>       size_t                  (*nlmsg_payload)(struct fib_rule *);
>  
> +     /* Called after modifications to the rules set, must flush
> +      * the route cache if one exists. */
> +     void                    (*flush_cache)(void);
> +
>       int                     nlgroup;
>       struct nla_policy       *policy;
>       struct list_head        *rules_list;
> Index: net-2.6.22/net/core/fib_rules.c
> ===================================================================
> --- net-2.6.22.orig/net/core/fib_rules.c      2007-03-27 13:53:29.000000000 
> +0200
> +++ net-2.6.22/net/core/fib_rules.c   2007-03-27 13:59:20.000000000 +0200
> @@ -44,6 +44,12 @@ static void rules_ops_put(struct fib_rul
>               module_put(ops->owner);
>  }
>  
> +static void flush_route_cache(struct fib_rules_ops *ops)
> +{
> +     if (ops->flush_cache)
> +             ops->flush_cache();
> +}
> +
>  int fib_rules_register(struct fib_rules_ops *ops)
>  {
>       int err = -EEXIST;
> @@ -315,6 +321,7 @@ static int fib_nl_newrule(struct sk_buff
>  
>       notify_rule_change(RTM_NEWRULE, rule, ops, nlh, NETLINK_CB(skb).pid);
>       rules_ops_put(ops);
> +     flush_route_cache(ops);
>       return 0;
>  
>  errout_free:
> @@ -405,6 +412,7 @@ static int fib_nl_delrule(struct sk_buff
>                                  NETLINK_CB(skb).pid);
>               fib_rule_put(rule);
>               rules_ops_put(ops);
> +             flush_route_cache(ops);
>               return 0;
>       }

That looks like a bug - shouldn't we flush the cache first, then do
the rules_ops_put()?

Cheers,
Muli
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to