diff --git a/doc/igmp.md b/doc/igmp.md index adce94f2..b1aeda67 100644 --- a/doc/igmp.md +++ b/doc/igmp.md @@ -86,6 +86,9 @@ for frames to 01:00:5e:xx:xx:xx and returns 0 when the frame is not a trapped IG so that it is passed on to the IP stack. IGMPv1/v2 reports (0x12, 0x16) join the group given in the IGMP header, IGMPv2 leaves (0x17) leave it, IGMPv3 reports use the first group record (type 4 joins, type 3 leaves). Trapped IGMP frames arrive without a VLAN tag. +Reports for groups in 224.0.0.0/24 are ignored: the switch floods that block +even with IGMP on, and an entry for a group such as 224.0.0.251 (mDNS) would +otherwise limit it to the ports that reported it, as RFC 4541 warns against. `igmp_show()` prints out the IGMP configuration on the CLI. diff --git a/rtl837x_igmp.c b/rtl837x_igmp.c index 5628ec5b..b5513b4d 100644 --- a/rtl837x_igmp.c +++ b/rtl837x_igmp.c @@ -251,6 +251,8 @@ uint8_t igmp_packet_handler(void) __banked #ifdef DEBUG print_string("IGMP join "); print_byte(igmp_join); write_char('\n'); #endif + if (uip_buf[igmp_grp] == IGMP_LOCAL_NET_0 && !uip_buf[igmp_grp + 1] && !uip_buf[igmp_grp + 2]) + return 1; #ifdef IPMC_USES_L3MC memset((__xdata uint8_t *)&entry, 0, sizeof(struct ipmc_table_entry)); diff --git a/rtl837x_igmp.h b/rtl837x_igmp.h index d6d28f81..1b56e367 100644 --- a/rtl837x_igmp.h +++ b/rtl837x_igmp.h @@ -10,6 +10,7 @@ #define IGMP_V3_REPORT 0x22 #define IGMP_V3_TO_INCLUDE 3 #define IGMP_V3_TO_EXCLUDE 4 +#define IGMP_LOCAL_NET_0 224 void igmp_setup(void) __banked; void igmp_enable(void) __banked;