diff options
author | David L Stevens <dlstevens@us.ibm.com> | 2005-12-27 14:03:00 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-12-27 14:03:00 -0800 |
commit | 5ab4a6c81eb3dbe32361791d1535f9153f79b0ed (patch) | |
tree | c89504389bf1a3452a499db9ea19acea76941616 /include/net | |
parent | 1b93ae64cabe5e28dd5a1f35f96f938ca4f6ae20 (diff) | |
download | linux-5ab4a6c81eb3dbe32361791d1535f9153f79b0ed.tar.gz linux-5ab4a6c81eb3dbe32361791d1535f9153f79b0ed.tar.bz2 linux-5ab4a6c81eb3dbe32361791d1535f9153f79b0ed.zip |
[IPV6] mcast: Fix multiple issues in MLDv2 reports.
The below "jumbo" patch fixes the following problems in MLDv2.
1) Add necessary "ntohs" to recent "pskb_may_pull" check [breaks
all nonzero source queries on little-endian (!)]
2) Add locking to source filter list [resend of prior patch]
3) fix "mld_marksources()" to
a) send nothing when all queried sources are excluded
b) send full exclude report when source queried sources are
not excluded
c) don't schedule a timer when there's nothing to report
NOTE: RFC 3810 specifies the source list should be saved and each
source reported individually as an IS_IN. This is an obvious DOS
path, requiring the host to store and then multicast as many sources
as are queried (e.g., millions...). This alternative sends a full,
relevant report that's limited to number of sources present on the
machine.
4) fix "add_grec()" to send empty-source records when it should
The original check doesn't account for a non-empty source
list with all sources inactive; the new code keeps that
short-circuit case, and also generates the group header
with an empty list if needed.
5) fix mca_crcount decrement to be after add_grec(), which needs
its original value
These issues (other than item #1 ;-) ) were all found by Yan Zheng,
much thanks!
Signed-off-by: David L Stevens <dlstevens@us.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net')
-rw-r--r-- | include/net/if_inet6.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/net/if_inet6.h b/include/net/if_inet6.h index d8234f9bd4c4..eb8afe3499a9 100644 --- a/include/net/if_inet6.h +++ b/include/net/if_inet6.h @@ -83,6 +83,7 @@ struct ipv6_mc_socklist struct in6_addr addr; int ifindex; struct ipv6_mc_socklist *next; + rwlock_t sflock; unsigned int sfmode; /* MCAST_{INCLUDE,EXCLUDE} */ struct ip6_sf_socklist *sflist; }; |