ip: fix mc_loop checks for tunnels with multicast outer addresses
When we have L3 tunnels with different inner/outer families (i.e. IPV4/IPV6) which use a multicast address as the outer tunnel destination address, multicast packets will be loopbacked back to the sending socket even if IP*_MULTICAST_LOOP is set to disabled. The mc_loop flag is present in the family specific part of the socket (e.g. the IPv4 or IPv4 specific part). setsockopt sets the inner family mc_loop flag. When the packet is pushed through the L3 tunnel it will eventually be processed by the outer family which if different will check the flag in a different part of the socket then it was set. Signed-off-by: Octavian Purdila <opurdila@ixiacom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
58933c643f
commit
7ad6848c7e
3 changed files with 18 additions and 3 deletions
|
@ -326,6 +326,22 @@ static __inline__ void inet_reset_saddr(struct sock *sk)
|
|||
|
||||
#endif
|
||||
|
||||
static inline int sk_mc_loop(struct sock *sk)
|
||||
{
|
||||
if (!sk)
|
||||
return 1;
|
||||
switch (sk->sk_family) {
|
||||
case AF_INET:
|
||||
return inet_sk(sk)->mc_loop;
|
||||
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||
case AF_INET6:
|
||||
return inet6_sk(sk)->mc_loop;
|
||||
#endif
|
||||
}
|
||||
__WARN();
|
||||
return 1;
|
||||
}
|
||||
|
||||
extern int ip_call_ra_chain(struct sk_buff *skb);
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue