2004-06-04 15:57:27

by Wesley W. Terpstra

[permalink] [raw]
Subject: Broken? 2.6.6 + IP_ADD_SOURCE_MEMBERSHIP + SO_REUSEADDR

Hi!

I am using the new IGMPv3 support in the 2.6.* series for Single Source
Multicast (SSM). However, the kernel appears to (incorrectly) drop packets
in some situations.

What I do is this: open a UDP port, set it SO_REUSEADDR, bind it to port
6767, and then use IP_ADD_SOURCE_MEMBERSHIP to listen to multicast group
232.65.43.21 and with a command-line controlled sender.

If I launch the same program twice with different senders, the first program
ceases to receive multicast packets. (Neither from its own sender, nor the
second program's sender) The second program receives packets from its
designated sender only (as expected).

I know from tcpdump that the switch is delivering messages from the first
designated sender. The kernel is simply not giving them to the application.

Some more observations:

If both programs specify the same sender, then both programs receive the
message (as expected).

This is not an issue with subscribing to multiple senders in general. A
single program listening to two senders does receive messages from both.

This seems like a bug to me.

PS. I am not subscribed to this list, so please CC me.

--
Wesley W. Terpstra


2004-06-04 16:55:13

by YOSHIFUJI Hideaki

[permalink] [raw]
Subject: Re: Broken? 2.6.6 + IP_ADD_SOURCE_MEMBERSHIP + SO_REUSEADDR

In article <20040604155423.GA5656@muffin> (at Fri, 4 Jun 2004 17:54:23 +0200), "Wesley W. Terpstra" <[email protected]> says:

> If I launch the same program twice with different senders, the first program
> ceases to receive multicast packets. (Neither from its own sender, nor the
> second program's sender) The second program receives packets from its
> designated sender only (as expected).
:
> If both programs specify the same sender, then both programs receive the
> message (as expected).

Thanks for the report.
The following patch should fix the issue. Please try.
Thanks again.

===== net/ipv4/udp.c 1.60 vs edited =====
--- 1.60/net/ipv4/udp.c 2004-05-31 03:57:26 +09:00
+++ edited/net/ipv4/udp.c 2004-06-05 01:47:07 +09:00
@@ -294,7 +294,7 @@
ipv6_only_sock(s) ||
(s->sk_bound_dev_if && s->sk_bound_dev_if != dif))
continue;
- if (!ip_mc_sf_allow(sk, loc_addr, rmt_addr, dif))
+ if (!ip_mc_sf_allow(s, loc_addr, rmt_addr, dif))
continue;
goto found;
}

--
Hideaki YOSHIFUJI @ USAGI Project <[email protected]>
GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA

2004-06-04 21:32:44

by David Miller

[permalink] [raw]
Subject: Re: Broken? 2.6.6 + IP_ADD_SOURCE_MEMBERSHIP + SO_REUSEADDR

On Fri, 4 Jun 2004 23:29:16 +0200
"Wesley W. Terpstra" <[email protected]> wrote:

> I am amazed you fixed it so fast!
> Will this make it into 2.6.7?

Yes, and 2.4.27 hopefully as well.