• Daniel Borkmann's avatar
    net: ipv6: mld: fix v1/v2 switchback timeout to rfc3810, 9.12. · 89225d1c
    Daniel Borkmann authored
    i) RFC3810, 9.2. Query Interval [QI] says:
    
       The Query Interval variable denotes the interval between General
       Queries sent by the Querier. Default value: 125 seconds. [...]
    
    ii) RFC3810, 9.3. Query Response Interval [QRI] says:
    
      The Maximum Response Delay used to calculate the Maximum Response
      Code inserted into the periodic General Queries. Default value:
      10000 (10 seconds) [...] The number of seconds represented by the
      [Query Response Interval] must be less than the [Query Interval].
    
    iii) RFC3810, 9.12. Older Version Querier Present Timeout [OVQPT] says:
    
      The Older Version Querier Present Timeout is the time-out for
      transitioning a host back to MLDv2 Host Compatibility Mode. When an
      MLDv1 query is received, MLDv2 hosts set their Older Version Querier
      Present Timer to [Older Version Querier Present Timeout].
    
      This value MUST be ([Robustness Variable] times (the [Query Interval]
      in the last Query received)) plus ([Query Response Interval]).
    
    Hence, on *default* the timeout results in:
    
      [RV] = 2, [QI] = 125sec, [QRI] = 10sec
      [OVQPT] = [RV] * [QI] + [QRI] = 260sec
    
    Having that said, we currently calculate [OVQPT] (here given as 'switchback'
    variable) as ...
    
      switchback = (idev->mc_qrv + 1) * max_delay
    
    RFC3810, 9.12. says "the [Query Interval] in the last Query received". In
    section "9.14. Configuring timers", it is said:
    
      This section is meant to provide advice to network administrators on
      how to tune these settings to their network. Ambitious router
      implementations might tune these settings dynamically based upon
      changing characteristics of the network. [...]
    
    iv) RFC38010, 9.14.2. Query Interval:
    
      The overall level of periodic MLD traffic is inversely proportional
      to the Query Interval. A longer Query Interval results in a lower
      overall level of MLD traffic. The value of the Query Interval MUST
      be equal to or greater than the Maximum Response Delay used to
      calculate the Maximum Response Code inserted in General Query
      messages.
    
    I assume that was why switchback is calculated as is (3 * max_delay), although
    this setting seems to be meant for routers only to configure their [QI]
    interval for non-default intervals. So usage here like this is clearly wrong.
    
    Concluding, the current behaviour in IPv6's multicast code is not conform
    to the RFC as switch back is calculated wrongly. That is, it has a too small
    value, so MLDv2 hosts switch back again to MLDv2 way too early, i.e. ~30secs
    instead of ~260secs on default.
    
    Hence, introduce necessary helper functions and fix this up properly as it
    should be.
    
    Introduced in 06da9228 ("[IPV6]: Add MLDv2 support."). Credits to Hannes
    Frederic Sowa who also had a hand in this as well. Also thanks to Hangbin Liu
    who did initial testing.
    Signed-off-by: default avatarDaniel Borkmann <dborkman@redhat.com>
    Cc: David Stevens <dlstevens@us.ibm.com>
    Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
    Acked-by: default avatarHannes Frederic Sowa <hannes@stressinduktion.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    89225d1c
if_inet6.h 6.12 KB