All of lore.kernel.org
 help / color / mirror / Atom feed
* question about function igmp_stop_timer() in net/ipv4/igmp.c
@ 2016-10-24 11:50 Dongpo Li
  2016-10-24 15:32 ` Andrew Lunn
  0 siblings, 1 reply; 6+ messages in thread
From: Dongpo Li @ 2016-10-24 11:50 UTC (permalink / raw)
  To: netdev

Hello

We encountered a multicast problem when two set-top box(STB) join the same multicast group and leave.
The two boxes can join the same multicast group
but only one box can send the IGMP leave group message when leave,
the other box does not send the IGMP leave message.
Our boxes use the IGMP version 2.

I added some debug info and found the whole procedure is like this:
(1) Box A joins the multicast group 225.1.101.145 and send the IGMP v2 membership report(join group).
(2) Box B joins the same multicast group 225.1.101.145 and also send the IGMP v2 membership report(join group).
(3) Box A receives the IGMP membership report from Box B and kernel calls igmp_heard_report().
    This function will call igmp_stop_timer(im).
    In function igmp_stop_timer(im), it tries to delete IGMP timer and does the following:
        im->tm_running = 0;
        im->reporter = 0;
(4) Box A leaves the multicast group 225.1.101.145 and kernel calls
    ip_mc_leave_group -> ip_mc_dec_group -> igmp_group_dropped.
    But in function igmp_group_dropped(), the im->reporter is 0, so the kernel does not send the IGMP leave message.

I think there may be some problem in step (3).
The function igmp_stop_timer(im) should not set im->reporter to 0 if the IGMP timer has expired.
It should only work if the IGMP timer is running and does not send the IGMP join message.
I'm not sure whether it's a problem and hope any advice.

Thanks!


    Regards,
    Dongpo

.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: question about function igmp_stop_timer() in net/ipv4/igmp.c
  2016-10-24 11:50 question about function igmp_stop_timer() in net/ipv4/igmp.c Dongpo Li
@ 2016-10-24 15:32 ` Andrew Lunn
  2016-10-25  1:13   ` Dongpo Li
  0 siblings, 1 reply; 6+ messages in thread
From: Andrew Lunn @ 2016-10-24 15:32 UTC (permalink / raw)
  To: Dongpo Li; +Cc: netdev

On Mon, Oct 24, 2016 at 07:50:12PM +0800, Dongpo Li wrote:
> Hello
> 
> We encountered a multicast problem when two set-top box(STB) join the same multicast group and leave.
> The two boxes can join the same multicast group
> but only one box can send the IGMP leave group message when leave,
> the other box does not send the IGMP leave message.
> Our boxes use the IGMP version 2.
> 
> I added some debug info and found the whole procedure is like this:
> (1) Box A joins the multicast group 225.1.101.145 and send the IGMP v2 membership report(join group).
> (2) Box B joins the same multicast group 225.1.101.145 and also send the IGMP v2 membership report(join group).
> (3) Box A receives the IGMP membership report from Box B and kernel calls igmp_heard_report().
>     This function will call igmp_stop_timer(im).
>     In function igmp_stop_timer(im), it tries to delete IGMP timer and does the following:
>         im->tm_running = 0;
>         im->reporter = 0;
> (4) Box A leaves the multicast group 225.1.101.145 and kernel calls
>     ip_mc_leave_group -> ip_mc_dec_group -> igmp_group_dropped.
>     But in function igmp_group_dropped(), the im->reporter is 0, so the kernel does not send the IGMP leave message.

RFC 2236 says:

2.  Introduction

   The Internet Group Management Protocol (IGMP) is used by IP hosts to
   report their multicast group memberships to any immediately-
   neighboring multicast routers.

Are Box A or B multicast routers?

    Andrew

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: question about function igmp_stop_timer() in net/ipv4/igmp.c
  2016-10-24 15:32 ` Andrew Lunn
@ 2016-10-25  1:13   ` Dongpo Li
  2016-10-25  7:39     ` Andrew Lunn
  0 siblings, 1 reply; 6+ messages in thread
From: Dongpo Li @ 2016-10-25  1:13 UTC (permalink / raw)
  To: Andrew Lunn; +Cc: netdev

Hi Andrew,

On 2016/10/24 23:32, Andrew Lunn wrote:
> On Mon, Oct 24, 2016 at 07:50:12PM +0800, Dongpo Li wrote:
>> Hello
>>
>> We encountered a multicast problem when two set-top box(STB) join the same multicast group and leave.
>> The two boxes can join the same multicast group
>> but only one box can send the IGMP leave group message when leave,
>> the other box does not send the IGMP leave message.
>> Our boxes use the IGMP version 2.
>>
>> I added some debug info and found the whole procedure is like this:
>> (1) Box A joins the multicast group 225.1.101.145 and send the IGMP v2 membership report(join group).
>> (2) Box B joins the same multicast group 225.1.101.145 and also send the IGMP v2 membership report(join group).
>> (3) Box A receives the IGMP membership report from Box B and kernel calls igmp_heard_report().
>>     This function will call igmp_stop_timer(im).
>>     In function igmp_stop_timer(im), it tries to delete IGMP timer and does the following:
>>         im->tm_running = 0;
>>         im->reporter = 0;
>> (4) Box A leaves the multicast group 225.1.101.145 and kernel calls
>>     ip_mc_leave_group -> ip_mc_dec_group -> igmp_group_dropped.
>>     But in function igmp_group_dropped(), the im->reporter is 0, so the kernel does not send the IGMP leave message.
> 
> RFC 2236 says:
> 
> 2.  Introduction
> 
>    The Internet Group Management Protocol (IGMP) is used by IP hosts to
>    report their multicast group memberships to any immediately-
>    neighboring multicast routers.
> 
> Are Box A or B multicast routers?
Thank you for your comments.
Both Box A and B are IP hosts, not multicast routers.
And the RFC says: IGMP is used by "IP hosts" to report their multicast group membership.

> 
>     Andrew
> 
> .
> 

    Regards,
    Dongpo

.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: question about function igmp_stop_timer() in net/ipv4/igmp.c
  2016-10-25  1:13   ` Dongpo Li
@ 2016-10-25  7:39     ` Andrew Lunn
  2016-10-25 11:50       ` Dongpo Li
  0 siblings, 1 reply; 6+ messages in thread
From: Andrew Lunn @ 2016-10-25  7:39 UTC (permalink / raw)
  To: Dongpo Li; +Cc: netdev

On Tue, Oct 25, 2016 at 09:13:54AM +0800, Dongpo Li wrote:
> Hi Andrew,
> 
> On 2016/10/24 23:32, Andrew Lunn wrote:
> > On Mon, Oct 24, 2016 at 07:50:12PM +0800, Dongpo Li wrote:
> >> Hello
> >>
> >> We encountered a multicast problem when two set-top box(STB) join the same multicast group and leave.
> >> The two boxes can join the same multicast group
> >> but only one box can send the IGMP leave group message when leave,
> >> the other box does not send the IGMP leave message.
> >> Our boxes use the IGMP version 2.
> >>
> >> I added some debug info and found the whole procedure is like this:
> >> (1) Box A joins the multicast group 225.1.101.145 and send the IGMP v2 membership report(join group).
> >> (2) Box B joins the same multicast group 225.1.101.145 and also send the IGMP v2 membership report(join group).
> >> (3) Box A receives the IGMP membership report from Box B and kernel calls igmp_heard_report().
> >>     This function will call igmp_stop_timer(im).
> >>     In function igmp_stop_timer(im), it tries to delete IGMP timer and does the following:
> >>         im->tm_running = 0;
> >>         im->reporter = 0;
> >> (4) Box A leaves the multicast group 225.1.101.145 and kernel calls
> >>     ip_mc_leave_group -> ip_mc_dec_group -> igmp_group_dropped.
> >>     But in function igmp_group_dropped(), the im->reporter is 0, so the kernel does not send the IGMP leave message.
> > 
> > RFC 2236 says:
> > 
> > 2.  Introduction
> > 
> >    The Internet Group Management Protocol (IGMP) is used by IP hosts to
> >    report their multicast group memberships to any immediately-
> >    neighboring multicast routers.
> > 
> > Are Box A or B multicast routers?
> Thank you for your comments.
> Both Box A and B are IP hosts, not multicast routers.
> And the RFC says: IGMP is used by "IP hosts" to report their multicast group membership.

They report their membership to gateways, not to each other. The
gateway will then arrange for multicast traffic for the group from
other subnets to be forwarded to this subnet. You don't need IGMP to
receive local traffic.

Also, this timer is to do with responding to IGMP querier, typically
the multicast gateway. The querier keeps track of if a group is in use
within a subnet. It listens to group joins and optionally leaves. It
also periodically sends out IGMP querier requests, asking who is
interested in what groups. The hosts use a random delay before
answering, and if some other hosts replies about a group they are a
member of, they don't send a response themselves. One is enough.

Read the RFC.

     Andrew

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: question about function igmp_stop_timer() in net/ipv4/igmp.c
  2016-10-25  7:39     ` Andrew Lunn
@ 2016-10-25 11:50       ` Dongpo Li
  2016-10-25 12:19         ` Andrew Lunn
  0 siblings, 1 reply; 6+ messages in thread
From: Dongpo Li @ 2016-10-25 11:50 UTC (permalink / raw)
  To: Andrew Lunn; +Cc: netdev



On 2016/10/25 15:39, Andrew Lunn wrote:
> On Tue, Oct 25, 2016 at 09:13:54AM +0800, Dongpo Li wrote:
>> Hi Andrew,
>>
>> On 2016/10/24 23:32, Andrew Lunn wrote:
>>> On Mon, Oct 24, 2016 at 07:50:12PM +0800, Dongpo Li wrote:
>>>> Hello
>>>>
>>>> We encountered a multicast problem when two set-top box(STB) join the same multicast group and leave.
>>>> The two boxes can join the same multicast group
>>>> but only one box can send the IGMP leave group message when leave,
>>>> the other box does not send the IGMP leave message.
>>>> Our boxes use the IGMP version 2.
>>>>
>>>> I added some debug info and found the whole procedure is like this:
>>>> (1) Box A joins the multicast group 225.1.101.145 and send the IGMP v2 membership report(join group).
>>>> (2) Box B joins the same multicast group 225.1.101.145 and also send the IGMP v2 membership report(join group).
>>>> (3) Box A receives the IGMP membership report from Box B and kernel calls igmp_heard_report().
>>>>     This function will call igmp_stop_timer(im).
>>>>     In function igmp_stop_timer(im), it tries to delete IGMP timer and does the following:
>>>>         im->tm_running = 0;
>>>>         im->reporter = 0;
>>>> (4) Box A leaves the multicast group 225.1.101.145 and kernel calls
>>>>     ip_mc_leave_group -> ip_mc_dec_group -> igmp_group_dropped.
>>>>     But in function igmp_group_dropped(), the im->reporter is 0, so the kernel does not send the IGMP leave message.
>>>
>>> RFC 2236 says:
>>>
>>> 2.  Introduction
>>>
>>>    The Internet Group Management Protocol (IGMP) is used by IP hosts to
>>>    report their multicast group memberships to any immediately-
>>>    neighboring multicast routers.
>>>
>>> Are Box A or B multicast routers?
>> Thank you for your comments.
>> Both Box A and B are IP hosts, not multicast routers.
>> And the RFC says: IGMP is used by "IP hosts" to report their multicast group membership.
> 
> They report their membership to gateways, not to each other. The
> gateway will then arrange for multicast traffic for the group from
> other subnets to be forwarded to this subnet. You don't need IGMP to
> receive local traffic.
> 
> Also, this timer is to do with responding to IGMP querier, typically
> the multicast gateway. The querier keeps track of if a group is in use
> within a subnet. It listens to group joins and optionally leaves. It
> also periodically sends out IGMP querier requests, asking who is
> interested in what groups. The hosts use a random delay before
> answering, and if some other hosts replies about a group they are a
> member of, they don't send a response themselves. One is enough.
> 
Of course, this timer is to do with responding to IGMP querier.
I mean, if the timer has expired, the host must have sent the IGMP responding message,
maybe IGMP join group message or responding router's IGMP querier.
So the function igmp_stop_timer() should not set im->reporter to 0 if the timer has expired.
Otherwise the host can't send IGMP leave message when it leaves the group because the im->reporter is 0.

    Regards,
    Dongpo

.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: question about function igmp_stop_timer() in net/ipv4/igmp.c
  2016-10-25 11:50       ` Dongpo Li
@ 2016-10-25 12:19         ` Andrew Lunn
  0 siblings, 0 replies; 6+ messages in thread
From: Andrew Lunn @ 2016-10-25 12:19 UTC (permalink / raw)
  To: Dongpo Li; +Cc: netdev

> Otherwise the host can't send IGMP leave message when it leaves the
> group because the im->reporter is 0.

Leave is optional for IGMP v2, so net sending it is fine. And only a
querier is going to take any notice of it.

What happens when you have a querier in your network and you are using
IGMPv3. That is the use case which matters.

     Andrew

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2016-10-25 12:19 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-10-24 11:50 question about function igmp_stop_timer() in net/ipv4/igmp.c Dongpo Li
2016-10-24 15:32 ` Andrew Lunn
2016-10-25  1:13   ` Dongpo Li
2016-10-25  7:39     ` Andrew Lunn
2016-10-25 11:50       ` Dongpo Li
2016-10-25 12:19         ` Andrew Lunn

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.