svn commit: r199354 - stable/8/sys/netinet
Bruce M Simpson
bms at FreeBSD.org
Tue Nov 17 10:59:52 UTC 2009
Author: bms
Date: Tue Nov 17 10:59:51 2009
New Revision: 199354
URL: http://svn.freebsd.org/changeset/base/199354
Log:
MFC r199287:
Fix a functional regression in multicast.
Userland daemons need to see IGMP traffic regardless of the group;
omit the imo filter check if the proto is IGMP. The kernel part
of IGMP will have already filtered appropriately at this point.
Submitted by: Franz Struwig
Reported by: Ivor Prebeg, Franz Struwig
Modified:
stable/8/sys/netinet/raw_ip.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
stable/8/sys/dev/xen/xenpci/ (props changed)
stable/8/sys/netinet6/ (props changed)
Modified: stable/8/sys/netinet/raw_ip.c
==============================================================================
--- stable/8/sys/netinet/raw_ip.c Tue Nov 17 09:37:43 2009 (r199353)
+++ stable/8/sys/netinet/raw_ip.c Tue Nov 17 10:59:51 2009 (r199354)
@@ -343,17 +343,35 @@ rip_input(struct mbuf *m, int off)
*/
if (inp->inp_moptions != NULL &&
IN_MULTICAST(ntohl(ip->ip_dst.s_addr))) {
- struct sockaddr_in group;
+ /*
+ * If the incoming datagram is for IGMP, allow it
+ * through unconditionally to the raw socket.
+ *
+ * In the case of IGMPv2, we may not have explicitly
+ * joined the group, and may have set IFF_ALLMULTI
+ * on the interface. imo_multi_filter() may discard
+ * control traffic we actually need to see.
+ *
+ * Userland multicast routing daemons should continue
+ * filter the control traffic appropriately.
+ */
int blocked;
- bzero(&group, sizeof(struct sockaddr_in));
- group.sin_len = sizeof(struct sockaddr_in);
- group.sin_family = AF_INET;
- group.sin_addr = ip->ip_dst;
-
- blocked = imo_multi_filter(inp->inp_moptions, ifp,
- (struct sockaddr *)&group,
- (struct sockaddr *)&ripsrc);
+ blocked = MCAST_PASS;
+ if (proto != IPPROTO_IGMP) {
+ struct sockaddr_in group;
+
+ bzero(&group, sizeof(struct sockaddr_in));
+ group.sin_len = sizeof(struct sockaddr_in);
+ group.sin_family = AF_INET;
+ group.sin_addr = ip->ip_dst;
+
+ blocked = imo_multi_filter(inp->inp_moptions,
+ ifp,
+ (struct sockaddr *)&group,
+ (struct sockaddr *)&ripsrc);
+ }
+
if (blocked != MCAST_PASS) {
IPSTAT_INC(ips_notmember);
continue;
More information about the svn-src-stable
mailing list