ipv4/igmp: fix v1/v2 switchback timeout based on rfc3376, 8.12
authorHangbin Liu <liuhangbin@gmail.com>
Fri, 26 Oct 2018 03:30:35 +0000 (11:30 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 30 Oct 2018 03:26:06 +0000 (20:26 -0700)
commit966c37f2d77eb44d47af8e919267b1ba675b2eca
tree02ebfc013815d68086875c392d35548c409ce9c9
parent4b42745211af552f170f38a1b97f4a112b5da6b2
ipv4/igmp: fix v1/v2 switchback timeout based on rfc3376, 8.12

Similiar with ipv6 mcast commit 89225d1ce6af3 ("net: ipv6: mld: fix v1/v2
switchback timeout to rfc3810, 9.12.")

i) RFC3376 8.12. Older Version Querier Present Timeout says:

   The Older Version Querier Interval is the time-out for transitioning
   a host back to IGMPv3 mode once an older version query is heard.
   When an older version query is received, hosts set their Older
   Version Querier Present Timer to Older Version Querier Interval.

   This value MUST be ((the Robustness Variable) times (the Query
   Interval in the last Query received)) plus (one Query Response
   Interval).

Currently we only use a hardcode value IGMP_V1/v2_ROUTER_PRESENT_TIMEOUT.
Fix it by adding two new items mr_qi(Query Interval) and mr_qri(Query Response
Interval) in struct in_device.

Now we can calculate the switchback time via (mr_qrv * mr_qi) + mr_qri.
We need update these values when receive IGMPv3 queries.

Reported-by: Ying Xu <yinxu@redhat.com>
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/inetdevice.h
net/ipv4/igmp.c