From e53f5e7134cbcfe0dc1c926fc90b9a527f8c91cb Mon Sep 17 00:00:00 2001 From: logicog Date: Fri, 16 Jan 2026 18:00:34 +0100 Subject: [PATCH] Add L2 entry deletion support via web --- html/l2.js | 2 +- httpd/httpd.c | 3 +++ httpd/page_impl.c | 55 ++++++++++++++++++++++++++++++++++++++++++++--- httpd/page_impl.h | 1 + 4 files changed, 57 insertions(+), 4 deletions(-) diff --git a/html/l2.js b/html/l2.js index be75787..b5af281 100644 --- a/html/l2.js +++ b/html/l2.js @@ -134,6 +134,6 @@ function getL2() { } window.addEventListener("load", function() { - l2GetInterval = setInterval(getL2, 300); + l2GetInterval = setInterval(getL2, 1000); }); diff --git a/httpd/httpd.c b/httpd/httpd.c index bbb0a29..8e6b28c 100644 --- a/httpd/httpd.c +++ b/httpd/httpd.c @@ -576,6 +576,9 @@ void httpd_appcall(void) } else if (is_word(q, "/l2.json")) { parse_short(q + 13); // e.g.: /l2.json?idx=10 send_l2(short_parsed); + } else if (is_word(q, "/l2_del.json")) { + parse_short(q + 17); + l2_delete(short_parsed); } else if (is_word(q, "/mirror.json")) { send_mirror(); } else if (is_word(q, "/mtu.json")) { diff --git a/httpd/page_impl.c b/httpd/page_impl.c index 8727d3a..dceff3c 100644 --- a/httpd/page_impl.c +++ b/httpd/page_impl.c @@ -16,7 +16,7 @@ // #define DEBUG #include "debug.h" -#define L2_MAX_TRANSFER 2 +#define L2_MAX_TRANSFER 30 #pragma codeseg BANK1 #pragma constseg BANK1 @@ -288,8 +288,8 @@ void send_counters(char port) void send_l2(uint16_t idx) { slen = strtox(outbuf, HTTP_RESPONCE_JSON); - dbg_string("sending L2\n"); // TODO: Remove - print_short(idx); + dbg_string("sending L2\n"); + dbg_short(idx); __xdata uint8_t entries_left = L2_MAX_TRANSFER; do { @@ -379,6 +379,55 @@ void send_l2(uint16_t idx) } +void l2_delete(uint16_t idx) +{ + slen = strtox(outbuf, HTTP_RESPONCE_JSON); + dbg_string("L2 DELETE\n"); + dbg_short(idx); + __xdata uint8_t entries_left = L2_MAX_TRANSFER; + + do { + reg_read_m(RTL837X_TBL_CTRL); + } while (sfr_data[3] & 0x01); + slen += strtox(outbuf + slen, "{\"result\":"); + // First, search for the entry based on the index + reg_read_m(RTL837x_TBL_DATA_0); + REG_WRITE(RTL837x_TBL_DATA_0, sfr_data[0], sfr_data[1],sfr_data[2] | 0xc0, sfr_data[3]); + + REG_WRITE(RTL837X_TBL_CTRL, idx >> 8, idx, TBL_L2_UNICAST, 0x1); + do { + reg_read_m(RTL837X_TBL_CTRL); + } while (sfr_data[3] & 0x1); + reg_read_m(RTL837x_L2_DATA_OUT_B); + if (!(sfr_data[0] & 0x20)) { + char_to_html('0'); + } else { + sfr_data[0] &= 0x3f; // Clear SPA + reg_write_m(RTL837x_TBL_DATA_IN_B); + + // Second half of MAC is copied + reg_read_m(RTL837x_L2_DATA_OUT_A); + reg_write_m(RTL837x_TBL_DATA_IN_A); + + reg_read_m(RTL837x_L2_DATA_OUT_C); + sfr_data[3] &= 0xc0; // Clear age, auth and second part of ports + sfr_data[1] &= 0xfe; // Clear nosalearn + reg_write_m(RTL837x_TBL_DATA_IN_C); + + reg_read_m(RTL837x_TBL_DATA_0); + REG_WRITE(RTL837x_TBL_DATA_0, sfr_data[0], sfr_data[1],TBL_L2_UNICAST, sfr_data[3]); + + REG_WRITE(RTL837X_TBL_CTRL, idx >> 8, idx, TBL_L2_UNICAST, TBL_WRITE | TBL_EXECUTE); + do { + reg_read_m(RTL837X_TBL_CTRL); + } while (sfr_data[3] & 0x1); + + char_to_html('1'); + } + char_to_html('}'); +} + + void send_mirror(void) { dbg_string("send_mirror called\n"); diff --git a/httpd/page_impl.h b/httpd/page_impl.h index a67d503..00c178c 100644 --- a/httpd/page_impl.h +++ b/httpd/page_impl.h @@ -7,6 +7,7 @@ void send_vlan(uint16_t vlan); void send_basic_info(void); void send_eee(void); void send_l2(uint16_t idx); +void l2_delete(uint16_t idx); void send_mirror(void); void send_mtu(void); void send_config(void);