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
This commit is contained in:
Bruce M Simpson 2009-11-17 10:59:51 +00:00
parent 7a04f19803
commit 7ea239483a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/stable/8/; revision=199354

View File

@ -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 = 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);
}
blocked = imo_multi_filter(inp->inp_moptions, ifp,
(struct sockaddr *)&group,
(struct sockaddr *)&ripsrc);
if (blocked != MCAST_PASS) {
IPSTAT_INC(ips_notmember);
continue;