{bp-19436} fix(net/igmp): restore General Query handling broken by pointer compare - #19619
Merged
Merged
Conversation
The group address in the IGMP header is declared as uint16_t grpaddr[2], so it decays to a pointer. Comparing it against INADDR_ANY compares the address of a struct member against 0, which is always false. The General Query branch is therefore unreachable and GCC discards it entirely. Commit 09bb292 ("net/igmp: fix build warning on GCC 12.2.0") replaced the original if (igmp->grpaddr == 0) with if (net_ipv4addr_cmp(igmp->grpaddr, INADDR_ANY) != 0) but net_ipv4addr_cmp(a, b) expands to (a == b) and INADDR_ANY expands to ((in_addr_t)0), so the emitted comparison is unchanged. The -Waddress diagnostic disappeared only because the comparison now originates inside a macro expanded from a header included via -isystem, and GCC suppresses warnings from system-header macros. The defect was hidden, not fixed. That commit also rewrote the unicast query test from group->grpaddr != 0, which was well-formed, into the same pointer comparison, making it unconditionally true. Convert the header field with net_ip4addr_conv32() once, and compare the resulting in_addr_t. The conversion was already being done in the group-specific branch, so this only hoists it and reuses it. Impact: a General Query (destination 224.0.0.1, group address 0) is the periodic query every IGMP querier sends. It currently falls through to the group-specific branch, where igmp_grpallocfind() allocates a group for 0.0.0.0 and schedules a report for it, while joined groups never have their report timers restarted. The querier then ages out the membership and multicast delivery to the device stops. Signed-off-by: Jacob Dahl <dahl.jakejacob@gmail.com>
jerpelea
requested review from
acassis,
cederom,
linguini1,
lupyuen and
xiaoxiang781216
August 3, 2026 08:16
xiaoxiang781216
approved these changes
Aug 3, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The group address in the IGMP header is declared as uint16_t grpaddr[2], so it decays to a pointer. Comparing it against INADDR_ANY compares the address of a struct member against 0, which is always false. The General Query branch is therefore unreachable and GCC discards it entirely.
Commit 09bb292 ("net/igmp: fix build warning on GCC 12.2.0") replaced the original
with
but net_ipv4addr_cmp(a, b) expands to (a == b) and INADDR_ANY expands to ((in_addr_t)0), so the emitted comparison is unchanged. The -Waddress diagnostic disappeared only because the comparison now originates inside a macro expanded from a header included via -isystem, and GCC suppresses warnings from system-header macros. The defect was hidden, not fixed.
That commit also rewrote the unicast query test from group->grpaddr != 0, which was well-formed, into the same pointer comparison, making it unconditionally true.
Convert the header field with net_ip4addr_conv32() once, and compare the resulting in_addr_t. The conversion was already being done in the group-specific branch, so this only hoists it and reuses it.
Impact: a General Query (destination 224.0.0.1, group address 0) is the periodic query every IGMP querier sends. It currently falls through to the group-specific branch, where igmp_grpallocfind() allocates a group for 0.0.0.0 and schedules a report for it, while joined groups never have their report timers restarted. The querier then ages out the membership and multicast delivery to the device stops.
Impact
RELEASE
Testing
CI