diff options
author | Yuval Mintz <yuvalm@mellanox.com> | 2018-03-26 15:01:35 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-03-26 13:14:43 -0400 |
commit | d3c07e5b9939a055fa017f200e535ae947eb22ab (patch) | |
tree | 5b724c9f394cc481ca6ec60fd29b1abae8aaa6f2 | |
parent | 088aa3eec2ce340b5d0f0f54430f5706223d5e45 (diff) | |
download | linux-d3c07e5b9939a055fa017f200e535ae947eb22ab.tar.bz2 |
ip6mr: Add API for default_rule fib
Add the ability to discern whether a given FIB rule notification relates
to the default rule inserted when registering ip6mr or a different one.
Would later be used by drivers wishing to offload ipv6 multicast routes
but unable to offload rules other than the default one.
Signed-off-by: Yuval Mintz <yuvalm@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/linux/mroute6.h | 10 | ||||
-rw-r--r-- | net/ipv6/ip6mr.c | 7 |
2 files changed, 17 insertions, 0 deletions
diff --git a/include/linux/mroute6.h b/include/linux/mroute6.h index 1ac38e6819f5..c4a45859f586 100644 --- a/include/linux/mroute6.h +++ b/include/linux/mroute6.h @@ -8,6 +8,7 @@ #include <net/net_namespace.h> #include <uapi/linux/mroute6.h> #include <linux/mroute_base.h> +#include <net/fib_rules.h> #ifdef CONFIG_IPV6_MROUTE static inline int ip6_mroute_opt(int opt) @@ -63,6 +64,15 @@ static inline void ip6_mr_cleanup(void) } #endif +#ifdef CONFIG_IPV6_MROUTE_MULTIPLE_TABLES +bool ip6mr_rule_default(const struct fib_rule *rule); +#else +static inline bool ip6mr_rule_default(const struct fib_rule *rule) +{ + return true; +} +#endif + #define VIFF_STATIC 0x8000 struct mfc6_cache_cmp_arg { diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 0be2f333e168..a187c523a95f 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c @@ -268,6 +268,13 @@ static unsigned int ip6mr_rules_seq_read(struct net *net) { return fib_rules_seq_read(net, RTNL_FAMILY_IP6MR); } + +bool ip6mr_rule_default(const struct fib_rule *rule) +{ + return fib_rule_matchall(rule) && rule->action == FR_ACT_TO_TBL && + rule->table == RT6_TABLE_DFLT && !rule->l3mdev; +} +EXPORT_SYMBOL(ip6mr_rule_default); #else #define ip6mr_for_each_table(mrt, net) \ for (mrt = net->ipv6.mrt6; mrt; mrt = NULL) |