mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-10-29 17:54:14 +08:00
A reserved-multicast trap goes to the port named in EXT_CPU_CTRL, which names no port out of reset, so trapped frames were dropped at ingress. trap_init() points it at the CPU port once at startup, and trap_rma_set() changes only the action field of an RMA register. A trapped frame arrives without the VLAN tag a forwarded one gets, so TRAP_RX_BODY() gives the offset of the payload for both forms. STP now traps its address while it runs instead of steering it with a static L2 entry per VLAN, so turning it on no longer walks the VLAN table and a pvid change no longer needs stp off and on. With STP off the flooding entries are restored as before. A trapped BPDU passes the tagged-only ingress filter that drops a forwarded one, so the stp_setup() warning about such ports goes.
22 lines
421 B
C
22 lines
421 B
C
#include "rtl837x_common.h"
|
|
#include "rtl837x_sfr.h"
|
|
#include "rtl837x_regs.h"
|
|
#include "rtl837x_trap.h"
|
|
|
|
#pragma codeseg BANK2
|
|
#pragma constseg BANK2
|
|
|
|
extern __xdata uint8_t sfr_data[4];
|
|
|
|
void trap_init(void) __banked
|
|
{
|
|
REG_SET(RTL837X_EXT_CPU_CTRL, CPU_PORT);
|
|
}
|
|
|
|
void trap_rma_set(uint16_t reg, uint8_t act) __banked
|
|
{
|
|
reg_read_m(reg);
|
|
sfr_data[3] = (sfr_data[3] & ~RTL837X_RMA_ACT_MASK) | act;
|
|
reg_write_m(reg);
|
|
}
|