|
@@ -2549,7 +2549,8 @@ done:
|
|
/*
|
|
/*
|
|
* check if a multicast source filter allows delivery for a given <src,dst,intf>
|
|
* check if a multicast source filter allows delivery for a given <src,dst,intf>
|
|
*/
|
|
*/
|
|
-int ip_mc_sf_allow(struct sock *sk, __be32 loc_addr, __be32 rmt_addr, int dif)
|
|
|
|
|
|
+int ip_mc_sf_allow(struct sock *sk, __be32 loc_addr, __be32 rmt_addr,
|
|
|
|
+ int dif, int sdif)
|
|
{
|
|
{
|
|
struct inet_sock *inet = inet_sk(sk);
|
|
struct inet_sock *inet = inet_sk(sk);
|
|
struct ip_mc_socklist *pmc;
|
|
struct ip_mc_socklist *pmc;
|
|
@@ -2564,7 +2565,8 @@ int ip_mc_sf_allow(struct sock *sk, __be32 loc_addr, __be32 rmt_addr, int dif)
|
|
rcu_read_lock();
|
|
rcu_read_lock();
|
|
for_each_pmc_rcu(inet, pmc) {
|
|
for_each_pmc_rcu(inet, pmc) {
|
|
if (pmc->multi.imr_multiaddr.s_addr == loc_addr &&
|
|
if (pmc->multi.imr_multiaddr.s_addr == loc_addr &&
|
|
- pmc->multi.imr_ifindex == dif)
|
|
|
|
|
|
+ (pmc->multi.imr_ifindex == dif ||
|
|
|
|
+ (sdif && pmc->multi.imr_ifindex == sdif)))
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
ret = inet->mc_all;
|
|
ret = inet->mc_all;
|