bridge: Snoop Multicast Router Advertisements
When multiple multicast routers are present in a broadcast domain then only one of them will be detectable via IGMP/MLD query snooping. The multicast router with the lowest IP address will become the selected and active querier while all other multicast routers will then refrain from sending queries. To detect such rather silent multicast routers, too, RFC4286 ("Multicast Router Discovery") provides a standardized protocol to detect multicast routers for multicast snooping switches. This patch implements the necessary MRD Advertisement message parsing and after successful processing adds such routers to the internal multicast router list. Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
4effd28c12
commit
4b3087c7e3
@@ -229,6 +229,7 @@ void ipv6_mc_unmap(struct inet6_dev *idev);
|
||||
void ipv6_mc_remap(struct inet6_dev *idev);
|
||||
void ipv6_mc_init_dev(struct inet6_dev *idev);
|
||||
void ipv6_mc_destroy_dev(struct inet6_dev *idev);
|
||||
int ipv6_mc_check_icmpv6(struct sk_buff *skb);
|
||||
int ipv6_mc_check_mld(struct sk_buff *skb);
|
||||
void addrconf_dad_failure(struct sk_buff *skb, struct inet6_ifaddr *ifp);
|
||||
|
||||
@@ -499,6 +500,20 @@ static inline bool ipv6_addr_is_solict_mult(const struct in6_addr *addr)
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline bool ipv6_addr_is_all_snoopers(const struct in6_addr *addr)
|
||||
{
|
||||
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
|
||||
__be64 *p = (__be64 *)addr;
|
||||
|
||||
return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) |
|
||||
(p[1] ^ cpu_to_be64(0x6a))) == 0UL;
|
||||
#else
|
||||
return ((addr->s6_addr32[0] ^ htonl(0xff020000)) |
|
||||
addr->s6_addr32[1] | addr->s6_addr32[2] |
|
||||
(addr->s6_addr32[3] ^ htonl(0x0000006a))) == 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
int if6_proc_init(void);
|
||||
void if6_proc_exit(void);
|
||||
|
Reference in New Issue
Block a user