From 0df48fbb1cd47fda7971fa93ebd19751fec93cf5 Mon Sep 17 00:00:00 2001 From: d00f <8052722+DrDoof@users.noreply.github.com> Date: Mon, 12 Oct 2026 16:27:21 +0200 Subject: [PATCH] httpd: leave the L2 listing as it is on main Listing by next-address also returned the reserved-multicast entries STP writes, shown as port 1 with a delete button, while l2_delete() still looks up by next-unicast and so removed the unicast entry after that index instead. The change was there to show the LACP steering entries; delivery by trap writes none, so it goes. --- httpd/page_impl.c | 26 ++++---------------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/httpd/page_impl.c b/httpd/page_impl.c index 44c9ddcb..94ccb483 100644 --- a/httpd/page_impl.c +++ b/httpd/page_impl.c @@ -409,19 +409,14 @@ void send_l2(uint16_t idx) */ __xdata uint16_t entry = idx & 0xfff; __xdata uint16_t first_entry = 0xffff; // An illegal entry index - __xdata uint16_t mbr; __bit first = true; char_to_html('['); while (1) { entries_left--; uint8_t port = 0; uint8_t lag; - uint8_t mc = 0; reg_read_m(RTL837x_TBL_DATA_0); - // Iterate with "next address" (method 2) so static multicast entries - - // an IGMP group entry, say - are listed too, not only learned or - // static unicast ones. - REG_WRITE(RTL837x_TBL_DATA_0, sfr_data[0], sfr_data[1] & 0xfc, sfr_data[2] | (TBL_LUTREAD_NEXT_ADDRESS << 6), sfr_data[3]); + REG_WRITE(RTL837x_TBL_DATA_0, sfr_data[0], sfr_data[1] & 0xfc, sfr_data[2] | (TBL_LUTREAD_NEXT_L2UC << 6), sfr_data[3]); REG_WRITE(RTL837X_TBL_CTRL, entry >> 8, entry, TBL_L2_UNICAST, TBL_EXECUTE); do { @@ -429,7 +424,7 @@ void send_l2(uint16_t idx) } while (sfr_data[3] & TBL_EXECUTE); reg_read_m(RTL837x_L2_DATA_OUT_B); - __bit valid = (sfr_data[0] & 0x20) && !(sfr_data[0] & 0x10); + __bit valid = (sfr_data[0] & 0x20) != 0; if (valid) { /* separator + 74-byte worst-case entry + closing "]" */ if (slen + 76 > TCP_OUTBUF_SIZE) @@ -438,8 +433,6 @@ void send_l2(uint16_t idx) char_to_html(','); first = false; - mc = sfr_data[2] & 0x01; // multicast MAC: member mask, no SPA/age - // VLAN, taken from the read above instead of reading the register twice slen += strtox(outbuf + slen, "{\"vlan\":\""); charhex_to_html(sfr_data[0] & 0x0f); @@ -458,23 +451,12 @@ void send_l2(uint16_t idx) // type reg_read_m(RTL837x_L2_DATA_OUT_C); - if (mc || (sfr_data[1] & 0x1)) + if (sfr_data[1] & 0x1) slen += strtox(outbuf + slen, "\",\"type\":\"s\",\"port\":"); else slen += strtox(outbuf + slen, "\",\"type\":\"l\",\"port\":"); - if (mc) { - // Report the lowest member of the mask (an entry holding only - // the CPU port is rendered as "CPU" by the UI) - mbr = port | ((uint16_t)sfr_data[3] << 2); - port = 0; - while (mbr && !(mbr & 1)) { - mbr >>= 1; - port++; - } - } else { - port |= (sfr_data[3] & 0x3) << 2; - } + port |= (sfr_data[3] & 0x3) << 2; itoa_html(port); slen += strtox(outbuf + slen, ",\"lag\":"); lag = port_lag_of(port);