Commit be43b29b authored by David Stevens's avatar David Stevens Committed by Hideaki Yoshifuji

[IPV{4,6}]: Fix "slow multicast on 2.5.69" bug.

parent b798ab6d
...@@ -2011,7 +2011,7 @@ int ip_mc_sf_allow(struct sock *sk, u32 loc_addr, u32 rmt_addr, int dif) ...@@ -2011,7 +2011,7 @@ int ip_mc_sf_allow(struct sock *sk, u32 loc_addr, u32 rmt_addr, int dif)
break; break;
} }
if (!pmc) if (!pmc)
return 0; return 1;
psl = pmc->sflist; psl = pmc->sflist;
if (!psl) if (!psl)
return pmc->sfmode == MCAST_EXCLUDE; return pmc->sfmode == MCAST_EXCLUDE;
...@@ -2020,11 +2020,11 @@ int ip_mc_sf_allow(struct sock *sk, u32 loc_addr, u32 rmt_addr, int dif) ...@@ -2020,11 +2020,11 @@ int ip_mc_sf_allow(struct sock *sk, u32 loc_addr, u32 rmt_addr, int dif)
if (psl->sl_addr[i] == rmt_addr) if (psl->sl_addr[i] == rmt_addr)
break; break;
} }
if (pmc->sfmode == MCAST_INCLUDE && i < psl->sl_count) if (pmc->sfmode == MCAST_INCLUDE && i >= psl->sl_count)
return 1; return 0;
if (pmc->sfmode == MCAST_EXCLUDE && i >= psl->sl_count) if (pmc->sfmode == MCAST_EXCLUDE && i < psl->sl_count)
return 1; return 0;
return 0; return 1;
} }
/* /*
......
...@@ -582,7 +582,7 @@ int inet6_mc_check(struct sock *sk, struct in6_addr *mc_addr, ...@@ -582,7 +582,7 @@ int inet6_mc_check(struct sock *sk, struct in6_addr *mc_addr,
struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk);
struct ipv6_mc_socklist *mc; struct ipv6_mc_socklist *mc;
struct ip6_sf_socklist *psl; struct ip6_sf_socklist *psl;
int rv = 0; int rv = 1;
read_lock(&ipv6_sk_mc_lock); read_lock(&ipv6_sk_mc_lock);
for (mc = np->ipv6_mc_list; mc; mc = mc->next) { for (mc = np->ipv6_mc_list; mc; mc = mc->next) {
...@@ -591,7 +591,7 @@ int inet6_mc_check(struct sock *sk, struct in6_addr *mc_addr, ...@@ -591,7 +591,7 @@ int inet6_mc_check(struct sock *sk, struct in6_addr *mc_addr,
} }
if (!mc) { if (!mc) {
read_unlock(&ipv6_sk_mc_lock); read_unlock(&ipv6_sk_mc_lock);
return 0; return 1;
} }
psl = mc->sflist; psl = mc->sflist;
if (!psl) { if (!psl) {
...@@ -603,8 +603,10 @@ int inet6_mc_check(struct sock *sk, struct in6_addr *mc_addr, ...@@ -603,8 +603,10 @@ int inet6_mc_check(struct sock *sk, struct in6_addr *mc_addr,
if (ipv6_addr_cmp(&psl->sl_addr[i], src_addr) == 0) if (ipv6_addr_cmp(&psl->sl_addr[i], src_addr) == 0)
break; break;
} }
rv = (mc->sfmode == MCAST_INCLUDE && i < psl->sl_count); if (mc->sfmode == MCAST_INCLUDE && i >= psl->sl_count);
rv |= (mc->sfmode == MCAST_EXCLUDE && i >= psl->sl_count); rv = 0;
if (mc->sfmode == MCAST_EXCLUDE && i < psl->sl_count);
rv = 0;
} }
read_unlock(&ipv6_sk_mc_lock); read_unlock(&ipv6_sk_mc_lock);
......
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