This is an automated email from the ASF dual-hosted git repository.
jerpelea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new f20cf4aac33 fix(net/igmp): restore General Query handling broken by
pointer compare
f20cf4aac33 is described below
commit f20cf4aac336cdd5623fe29bac1ea91134ac5d78
Author: Jacob Dahl <[email protected]>
AuthorDate: Tue Jul 14 18:25:20 2026 -0600
fix(net/igmp): restore General Query handling broken by pointer compare
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 09bb292fa2 ("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 <[email protected]>
---
net/igmp/igmp_input.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/net/igmp/igmp_input.c b/net/igmp/igmp_input.c
index 262c4aafdb5..5f2a860dee2 100644
--- a/net/igmp/igmp_input.c
+++ b/net/igmp/igmp_input.c
@@ -174,6 +174,13 @@ void igmp_input(struct net_driver_s *dev)
* receivers.
*/
+ /* The group address lies in the IGMP header where it is stored as
+ * an unaligned uint16_t[2] in network order. Convert it to an
+ * in_addr_t before it is used in any comparison.
+ */
+
+ grpaddr = net_ip4addr_conv32(igmp->grpaddr);
+
/* Check if the query was sent to all systems */
if (net_ipv4addr_cmp(destipaddr, g_ipv4_allsystems))
@@ -195,7 +202,7 @@ void igmp_input(struct net_driver_s *dev)
* Query."
*/
- if (net_ipv4addr_cmp(igmp->grpaddr, INADDR_ANY) != 0)
+ if (net_ipv4addr_cmp(grpaddr, INADDR_ANY))
{
FAR struct igmp_group_s *member;
@@ -230,7 +237,7 @@ void igmp_input(struct net_driver_s *dev)
}
}
}
- else /* if (net_ipv4addr_cmp(igmp->grpaddr, INADDR_ANY) == 0) */
+ else /* if (!net_ipv4addr_cmp(grpaddr, INADDR_ANY)) */
{
ninfo("Group-specific multicast query\n");
@@ -240,8 +247,7 @@ void igmp_input(struct net_driver_s *dev)
IGMP_STATINCR(g_netstats.igmp.ucast_query);
- grpaddr = net_ip4addr_conv32(igmp->grpaddr);
- group = igmp_grpallocfind(dev, &grpaddr);
+ group = igmp_grpallocfind(dev, &grpaddr);
if (group != NULL)
{
@@ -259,7 +265,7 @@ void igmp_input(struct net_driver_s *dev)
/* Not sent to all systems -- Unicast query */
- else if (net_ipv4addr_cmp(igmp->grpaddr, INADDR_ANY) == 0)
+ else if (!net_ipv4addr_cmp(grpaddr, INADDR_ANY))
{
ninfo("Unicast query\n");
IGMP_STATINCR(g_netstats.igmp.ucast_query);