02 Nov, 2017

1 commit

  • Many source files in the tree are missing licensing information, which
    makes it harder for compliance tools to determine the correct license.

    By default all files without license information are under the default
    license of the kernel, which is GPL version 2.

    Update the files which contain no license information with the 'GPL-2.0'
    SPDX license identifier. The SPDX identifier is a legally binding
    shorthand, which can be used instead of the full boiler plate text.

    This patch is based on work done by Thomas Gleixner and Kate Stewart and
    Philippe Ombredanne.

    How this work was done:

    Patches were generated and checked against linux-4.14-rc6 for a subset of
    the use cases:
    - file had no licensing information it it.
    - file was a */uapi/* one with no licensing information in it,
    - file was a */uapi/* one with existing licensing information,

    Further patches will be generated in subsequent months to fix up cases
    where non-standard license headers were used, and references to license
    had to be inferred by heuristics based on keywords.

    The analysis to determine which SPDX License Identifier to be applied to
    a file was done in a spreadsheet of side by side results from of the
    output of two independent scanners (ScanCode & Windriver) producing SPDX
    tag:value files created by Philippe Ombredanne. Philippe prepared the
    base worksheet, and did an initial spot review of a few 1000 files.

    The 4.13 kernel was the starting point of the analysis with 60,537 files
    assessed. Kate Stewart did a file by file comparison of the scanner
    results in the spreadsheet to determine which SPDX license identifier(s)
    to be applied to the file. She confirmed any determination that was not
    immediately clear with lawyers working with the Linux Foundation.

    Criteria used to select files for SPDX license identifier tagging was:
    - Files considered eligible had to be source code files.
    - Make and config files were included as candidates if they contained >5
    lines of source
    - File already had some variant of a license header in it (even if
    Reviewed-by: Philippe Ombredanne
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

23 Sep, 2014

1 commit

  • RFC2710 (MLDv1), section 3.7. says:

    The length of a received MLD message is computed by taking the
    IPv6 Payload Length value and subtracting the length of any IPv6
    extension headers present between the IPv6 header and the MLD
    message. If that length is greater than 24 octets, that indicates
    that there are other fields present *beyond* the fields described
    above, perhaps belonging to a *future backwards-compatible* version
    of MLD. An implementation of the version of MLD specified in this
    document *MUST NOT* send an MLD message longer than 24 octets and
    MUST ignore anything past the first 24 octets of a received MLD
    message.

    RFC3810 (MLDv2), section 8.2.1. states for *listeners* regarding
    presence of MLDv1 routers:

    In order to be compatible with MLDv1 routers, MLDv2 hosts MUST
    operate in version 1 compatibility mode. [...] When Host
    Compatibility Mode is MLDv2, a host acts using the MLDv2 protocol
    on that interface. When Host Compatibility Mode is MLDv1, a host
    acts in MLDv1 compatibility mode, using *only* the MLDv1 protocol,
    on that interface. [...]

    While section 8.3.1. specifies *router* behaviour regarding presence
    of MLDv1 routers:

    MLDv2 routers may be placed on a network where there is at least
    one MLDv1 router. The following requirements apply:

    If an MLDv1 router is present on the link, the Querier MUST use
    the *lowest* version of MLD present on the network. This must be
    administratively assured. Routers that desire to be compatible
    with MLDv1 MUST have a configuration option to act in MLDv1 mode;
    if an MLDv1 router is present on the link, the system administrator
    must explicitly configure all MLDv2 routers to act in MLDv1 mode.
    When in MLDv1 mode, the Querier MUST send periodic General Queries
    truncated at the Multicast Address field (i.e., 24 bytes long),
    and SHOULD also warn about receiving an MLDv2 Query (such warnings
    must be rate-limited). The Querier MUST also fill in the Maximum
    Response Delay in the Maximum Response Code field, i.e., the
    exponential algorithm described in section 5.1.3. is not used. [...]

    That means that we should not get queries from different versions of
    MLD. When there's a MLDv1 router present, MLDv2 enforces truncation
    and MRC == MRD (both fields are overlapping within the 24 octet range).

    Section 8.3.2. specifies behaviour in the presence of MLDv1 multicast
    address *listeners*:

    MLDv2 routers may be placed on a network where there are hosts
    that have not yet been upgraded to MLDv2. In order to be compatible
    with MLDv1 hosts, MLDv2 routers MUST operate in version 1 compatibility
    mode. MLDv2 routers keep a compatibility mode per multicast address
    record. The compatibility mode of a multicast address is determined
    from the Multicast Address Compatibility Mode variable, which can be
    in one of the two following states: MLDv1 or MLDv2.

    The Multicast Address Compatibility Mode of a multicast address
    record is set to MLDv1 whenever an MLDv1 Multicast Listener Report is
    *received* for that multicast address. At the same time, the Older
    Version Host Present timer for the multicast address is set to Older
    Version Host Present Timeout seconds. The timer is re-set whenever a
    new MLDv1 Report is received for that multicast address. If the Older
    Version Host Present timer expires, the router switches back to
    Multicast Address Compatibility Mode of MLDv2 for that multicast
    address. [...]

    That means, what can happen is the following scenario, that hosts can
    act in MLDv1 compatibility mode when they previously have received an
    MLDv1 query (or, simply operate in MLDv1 mode-only); and at the same
    time, an MLDv2 router could start up and transmits MLDv2 startup query
    messages while being unaware of the current operational mode.

    Given RFC2710, section 3.7 we would need to answer to that with an MLDv1
    listener report, so that the router according to RFC3810, section 8.3.2.
    would receive that and internally switch to MLDv1 compatibility as well.

    Right now, I believe since the initial implementation of MLDv2, Linux
    hosts would just silently drop such MLDv2 queries instead of replying
    with an MLDv1 listener report, which would prevent a MLDv2 router going
    into fallback mode (until it receives other MLDv1 queries).

    Since the mapping of MRC to MRD in exactly such cases can make use of
    the exponential algorithm from 5.1.3, we cannot [strictly speaking] be
    aware in MLDv1 of the encoding in MRC, it seems also not mentioned by
    the RFC. Since encodings are the same up to 32767, assume in such a
    situation this value as a hard upper limit we would clamp. We have asked
    one of the RFC authors on that regard, and he mentioned that there seem
    not to be any implementations that make use of that exponential algorithm
    on startup messages. In any case, this patch fixes this MLD
    interoperability issue.

    Signed-off-by: Daniel Borkmann
    Acked-by: Hannes Frederic Sowa
    Signed-off-by: David S. Miller

    Daniel Borkmann
     

05 Sep, 2013

2 commits

  • Get rid of MLDV2_MRC and use our new macros for mantisse and
    exponent to calculate Maximum Response Delay out of the Maximum
    Response Code.

    Signed-off-by: Daniel Borkmann
    Cc: Hannes Frederic Sowa
    Acked-by: Hannes Frederic Sowa
    Signed-off-by: David S. Miller

    Daniel Borkmann
     
  • 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 06da92283 ("[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: Daniel Borkmann
    Cc: David Stevens
    Cc: Hannes Frederic Sowa
    Acked-by: Hannes Frederic Sowa
    Signed-off-by: David S. Miller

    Daniel Borkmann
     

23 Apr, 2010

1 commit