On Tue, Mar 31, 2026 at 12:46 AM Ujjal Roy <[email protected]> wrote:
>
> Description:
> This series addresses a mismatch in how multicast query
> intervals and response codes are handled across IPv4 (IGMPv3)
> and IPv6 (MLDv2). While decoding logic currently exists,
> the corresponding encoding logic is missing during query
> packet generation. This leads to incorrect intervals being
> transmitted when values exceed their linear thresholds.
>
> The patches introduce a unified floating-point encoding
> approach based on RFC3376 and RFC3810, ensuring that large
> intervals are correctly represented in QQIC and MRC fields
> using the exponent-mantissa format.
>
> Key Changes:
> * ipv4: igmp: get rid of IGMPV3_{QQIC,MRC} and simplify calculation
> Removes legacy macros in favor of a cleaner, unified
> calculation for retrieving intervals from encoded fields,
> improving code maintainability.
>
> * ipv6: mld: rename mldv2_mrc() and add mldv2_qqi()
> Standardizes MLDv2 terminology by renaming mldv2_mrc()
> to mldv2_mrd() (Maximum Response Delay) and introducing
> a new API mldv2_qqi for QQI calculation, improving code
> readability.
>
> * ipv4: igmp: encode multicast exponential fields
> Introduces the logic to dynamically calculate the exponent
> and mantissa using bit-scan (fls). This ensures QQIC and
> MRC fields (8-bit) are properly encoded when transmitting
> query packets with intervals that exceed their respective
> linear threshold value of 128 (for QQI/MRT).
>
> * ipv6: mld: encode multicast exponential fields
> Applies similar encoding logic for MLDv2. This ensures
> QQIC (8-bit) and MRC (16-bit) fields are properly encoded
> when transmitting query packets with intervals that exceed
> their respective linear thresholds (128 for QQI; 32768
> for MRD).
>
> Impact:
> These changes ensure that multicast queriers and listeners
> stay synchronized on timing intervals, preventing protocol
> timeouts or premature group membership expiration caused
> by incorrectly formatted packet headers.
>
> v2:
> - Retargeted the series to net-next as suggested
> - Fixed a compilation warning in the MLD rename change
> - Kept reverse xmas tree order in IGMP exponential encoding change
> - Added bridge selftests to validate IGMPv3 Query MRC and QQIC handling
>
> Ujjal Roy (5):
> ipv4: igmp: get rid of IGMPV3_{QQIC,MRC} and simplify calculation
> ipv6: mld: rename mldv2_mrc() and add mldv2_qqi()
> ipv4: igmp: encode multicast exponential fields
> ipv6: mld: encode multicast exponential fields
> selftests: net: bridge: add tests for igmpv3 MRC and QQIC validation
>
> include/linux/igmp.h | 158 +++++++++++++++-
> include/net/mld.h | 179 +++++++++++++++++-
> net/bridge/br_multicast.c | 22 +--
> net/ipv4/igmp.c | 6 +-
> net/ipv6/mcast.c | 19 +-
> .../selftests/net/forwarding/.gitignore | 2 +
> .../testing/selftests/net/forwarding/Makefile | 10 +
> .../selftests/net/forwarding/bridge_igmp.sh | 109 +++++++++++
> .../selftests/net/forwarding/mc_decode.c | 38 ++++
> .../selftests/net/forwarding/mc_encode.c | 40 ++++
> 10 files changed, 535 insertions(+), 48 deletions(-)
> create mode 100644 tools/testing/selftests/net/forwarding/mc_decode.c
> create mode 100644 tools/testing/selftests/net/forwarding/mc_encode.c
>
>
> base-commit: cf0d9080c6f795bc6be08babbffa29b62c06e9b0
> --
> 2.43.0
>
Forgot to attach test result using bridge_igmp.sh selftest.
First two test cases are added newly v3query_mrc_test and v3query_qqic_test.
Without these patches:
tools/testing/selftests/net/forwarding# ./bridge_igmp.sh
TEST: IGMPv3 query: verify MRC (configured=160, expected=132) [FAIL]
Bad MRC value in IGMP packet: Max Resp Time: 51.2 sec (0xa0)
TEST: IGMPv3 query: verify QQIC (configured=160, expected=132) [FAIL]
Bad QQIC value in IGMP packet: QQIC: 160
TEST: IGMPv2 report 239.10.10.10 [ OK ]
...
With these patches:
tools/testing/selftests/net/forwarding# ./bridge_igmp.sh
TEST: IGMPv3 query: verify MRC (configured=160, expected=132) [ OK ]
TEST: IGMPv3 query: verify QQIC (configured=160, expected=132) [ OK ]
TEST: IGMPv2 report 239.10.10.10 [ OK ]
...