Squashed commit of the following:

The MLD implementation did not follow the RFC correctly when it is the Querier.  The Querier should use a general query and get query messages from all members of all groups.  This would be driven by a single timer per sub-nset since all groups are queried at once. Instead, the design used a Multicast Address Specific Query with one timer per group and ignores groups that we are not members of.

    Similary, the MLDv1 compatibility timer should be a single, separate timer, not a per-group timer.

    net/mld: Group may be NULL when sending a general query
This commit is contained in:
Gregory Nutt
2018-11-11 11:38:29 -06:00
parent f14cf966c9
commit 8a3fc26b74
12 changed files with 564 additions and 368 deletions
+18
View File
@@ -51,7 +51,9 @@
#include <nuttx/config.h>
#include <stdint.h>
#include <queue.h>
#include <nuttx/wdog.h>
#include <nuttx/net/ip.h>
#include <nuttx/net/icmpv6.h>
@@ -370,6 +372,22 @@ struct mld_mcast_listen_done_s
net_ipv6addr_t mcastaddr; /* Multicast address */
};
/* This structure represents the overall MLD state for a single network.
* This structure in included withing the net_driver_s structure.
*
* There will be a group for the all systems group address but this
* will not run the state machine as it is used to kick off reports
* from all the other groups
*/
struct mld_netdev_s
{
sq_queue_t grplist; /* MLD group list */
WDOG_ID gendog; /* General query timer */
WDOG_ID v1dog; /* MLDv1 compatibility timer */
uint8_t flags; /* See MLD_ flags definitions */
};
#ifdef CONFIG_NET_STATISTICS
/* MLD statistic counters */
+1 -1
View File
@@ -346,7 +346,7 @@ struct net_driver_s
sq_queue_t d_igmp_grplist; /* IGMP group list */
#endif
#ifdef CONFIG_NET_MLD
sq_queue_t d_mld_grplist; /* MLD group list */
struct mld_netdev_s d_mld; /* MLD state information */
#endif
#ifdef CONFIG_NETDEV_STATISTICS