mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-08-30 14:52:51 +08:00
igmp: only hand reports to the CPU while snooping is on
handle_rx() dispatched to igmp_packet_handler() on the destination address alone, so an ordinary IGMPv3 report off the wire reached the handler and could write a table entry whether or not anyone had asked for snooping. The STP branch right above it is gated on stpEnabled; this brings the IGMP branch in line. Snooping state lived only in the per-port registers, and the receive path cannot afford to read one per packet, so the flag shadows it: igmp_enable() sets it, igmp_setup() clears it, and igmp_setup() runs from both the boot path and "igmp off". While here, igmp off becomes an explicit subcommand instead of the fall-through, and an unrecognised igmp subcommand prints the usage line rather than silently turning snooping off. Six bytes of BANK1 and one of xdata, no internal RAM.
This commit is contained in:
+2
-1
@@ -121,6 +121,7 @@ __xdata uint16_t management_vlan;
|
||||
__xdata uint8_t tx_seq;
|
||||
|
||||
__xdata uint8_t stpEnabled;
|
||||
__xdata uint8_t igmpEnabled;
|
||||
__xdata char hostname[24]; /* device hostname, default set at boot, see rtl837x_common.h */
|
||||
|
||||
__code uint16_t bit_mask[16] = {
|
||||
@@ -1152,7 +1153,7 @@ void handle_rx(void)
|
||||
print_string("STP TX\n");
|
||||
tcpip_output();
|
||||
}
|
||||
} else if (uip_buf[0] == 0x01 && uip_buf[1] == 0x00 && uip_buf[2] == 0x5e // IPv4-MC packet?
|
||||
} else if (igmpEnabled && uip_buf[0] == 0x01 && uip_buf[1] == 0x00 && uip_buf[2] == 0x5e // IPv4-MC packet?
|
||||
&& uip_buf[3] == 0x00 && uip_buf[4] == 0x00 && uip_buf[5] == 0x16) {
|
||||
igmp_packet_handler();
|
||||
if (uip_len) {
|
||||
|
||||
Reference in New Issue
Block a user