Commit e3ea9731 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller

ipv6: fib_rules: Check if rule is a default rule

As explained in commit 3c71006d ("ipv4: fib_rules: Check if rule is
a default rule"), drivers supporting IPv6 FIB offload need to be able to
sanitize the rules they don't support and potentially flush their
tables.

Add an IPv6 helper to check if a FIB rule is a default rule.
Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1b2a4440
...@@ -295,6 +295,7 @@ int ipv6_route_open(struct inode *inode, struct file *file); ...@@ -295,6 +295,7 @@ int ipv6_route_open(struct inode *inode, struct file *file);
#ifdef CONFIG_IPV6_MULTIPLE_TABLES #ifdef CONFIG_IPV6_MULTIPLE_TABLES
int fib6_rules_init(void); int fib6_rules_init(void);
void fib6_rules_cleanup(void); void fib6_rules_cleanup(void);
bool fib6_rule_default(const struct fib_rule *rule);
#else #else
static inline int fib6_rules_init(void) static inline int fib6_rules_init(void)
{ {
...@@ -304,5 +305,9 @@ static inline void fib6_rules_cleanup(void) ...@@ -304,5 +305,9 @@ static inline void fib6_rules_cleanup(void)
{ {
return ; return ;
} }
static inline bool fib6_rule_default(const struct fib_rule *rule)
{
return true;
}
#endif #endif
#endif #endif
...@@ -29,6 +29,26 @@ struct fib6_rule { ...@@ -29,6 +29,26 @@ struct fib6_rule {
u8 tclass; u8 tclass;
}; };
static bool fib6_rule_matchall(const struct fib_rule *rule)
{
struct fib6_rule *r = container_of(rule, struct fib6_rule, common);
if (r->dst.plen || r->src.plen || r->tclass)
return false;
return fib_rule_matchall(rule);
}
bool fib6_rule_default(const struct fib_rule *rule)
{
if (!fib6_rule_matchall(rule) || rule->action != FR_ACT_TO_TBL ||
rule->l3mdev)
return false;
if (rule->table != RT6_TABLE_LOCAL && rule->table != RT6_TABLE_MAIN)
return false;
return true;
}
EXPORT_SYMBOL_GPL(fib6_rule_default);
struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6, struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6,
int flags, pol_lookup_t lookup) int flags, pol_lookup_t lookup)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment