Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Sep 2009 06:00:19 GMT
From:      Stef Walter <stef@memberwebs.com>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   kern/138691: Multicast: Keep membership and filters in sync
Message-ID:  <200909100600.n8A60Ja8068945@www.freebsd.org>
Resent-Message-ID: <200909100610.n8A6A1bi067770@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         138691
>Category:       kern
>Synopsis:       Multicast: Keep membership and filters in sync
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Sep 10 06:10:01 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator:     Stef Walter
>Release:        8.0-BETA4
>Organization:
>Environment:
FreeBSD portillo-gate.ws.local 8.0-BETA4 FreeBSD 8.0-BETA4 #10: Wed Sep  9 22:49:39 UTC 2009     root@portillo-gate.ws.local:/usr/obj/usr/src/sys/MESHNODE  i386

>Description:
When removing multicast membership from a socket (ie:
IP_DROP_MEMBERSHIP) that has multiple multicast memberships, the
internal list of memberships and filters are not kept in sync.

This results in dropped packets that are not delivered to the socket
that has the multicast membership. This was experienced with OSPF
(running quagga).
>How-To-Repeat:
Besides the obvious non-functional multicast, the following command is
another way to see an indication of the problem:

> > # netstat -s -p ip | grep multicast
> > 	7 packets received for unknown multicast group

>Fix:
Patch attached which fixes the problem.

Patch attached with submission follows:

--- sys/netinet/in_mcast.c.orig	2009-09-09 19:33:22.000000000 +0000
+++ sys/netinet/in_mcast.c	2009-09-10 05:28:20.000000000 +0000
@@ -2280,7 +2292,9 @@
 
 	if (is_final) {
-		/* Remove the gap in the membership array. */
-		for (++idx; idx < imo->imo_num_memberships; ++idx)
+		/* Remove the gap in the membership and filter array. */
+		for (++idx; idx < imo->imo_num_memberships; ++idx) {
 			imo->imo_membership[idx-1] = imo->imo_membership[idx];
+			imo->imo_mfilters[idx-1] = imo->imo_mfilters[idx];
+		}
 		imo->imo_num_memberships--;
 	}


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200909100600.n8A60Ja8068945>