diff --git a/cmd_parser.c b/cmd_parser.c index 293e2c0..2e33a5b 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -28,6 +28,9 @@ extern __code uint8_t * __code greeting; extern __code uint8_t * __code hex; extern __xdata uint8_t flash_buf[256]; +__xdata uint8_t vlan_names[VLAN_NAMES_SIZE]; +__xdata uint16_t vlan_ptr; + // Buffer for writing to flash 0x1fd000, copy to 0x1fe000 __xdata uint8_t cmd_buffer[SBUF_SIZE]; @@ -44,6 +47,13 @@ __code uint8_t phys_to_log_port[6] = { 4, 5, 6, 7, 3, 8 }; + +inline uint8_t isletter(uint8_t l) +{ + return (l >= 'a' && l <= 'z') || (l >= 'A' && l <= 'Z'); +} + + uint8_t cmd_compare(uint8_t start, uint8_t * __code cmd) { signed char i; @@ -110,11 +120,28 @@ void parse_vlan(void) __xdata uint16_t members = 0; __xdata uint16_t tagged = 0; if (!atoi_short(&vlan, cmd_words_b[1])) { - if (cmd_words_b[2] > 0 && cmd_buffer[cmd_words_b[2]] == 'd') { + if (cmd_words_b[2] > 0 && cmd_buffer[cmd_words_b[2]] == 'd' && cmd_words_b[3] < 0) { vlan_delete(vlan); return; } uint8_t w = 2; + write_char('#'); + print_byte(cmd_words_b[w] ); + write_char('#'); write_char(cmd_buffer[cmd_words_b[w]]); + if (cmd_words_b[w] > 0 && isletter(cmd_buffer[cmd_words_b[w]])) { + register uint8_t i = 0; + vlan_names[vlan_ptr++] = hex[(vlan >> 8) & 0xf]; + vlan_names[vlan_ptr++] = hex[(vlan >> 4) & 0xf] ; + vlan_names[vlan_ptr++] = hex[vlan & 0xf]; + print_string("COPYING: >"); + while(cmd_buffer[cmd_words_b[w] + i] != ' ') { + write_char(cmd_buffer[cmd_words_b[w] + i]); + vlan_names[vlan_ptr++] = cmd_buffer[cmd_words_b[w] + i++]; + } + vlan_names[vlan_ptr++] = ' '; vlan_names[vlan_ptr] = '\0'; + w++; + print_string("<\n"); + } while (cmd_words_b[w] > 0) { uint8_t port; if (cmd_buffer[cmd_words_b[w]] >= '0' && cmd_buffer[cmd_words_b[w]] <= '9') { @@ -137,6 +164,10 @@ void parse_vlan(void) } vlan_create(vlan, members, tagged); } + if (cmd_words_b[2] > 0 && isletter(cmd_buffer[cmd_words_b[2]])) { + print_string("vlan_ptr "); print_short(vlan_ptr); write_char(':'); + write_char('>'); print_string_x(&vlan_names[0]); write_char('<'); write_char('\n'); + } return; err: print_string("Error: vlan [port][t/u]..."); diff --git a/html/vlan.js b/html/vlan.js index aa59e9f..4377173 100644 --- a/html/vlan.js +++ b/html/vlan.js @@ -22,8 +22,7 @@ function vlanForm() { } else { o.src = "port.svg"; o.width = "40"; o.height = "40"; } - l.appendChild(inp); - l.appendChild(o); + l.appendChild(inp); l.appendChild(o); d.appendChild(l) t.appendChild(d); var d2=d.cloneNode(true); @@ -33,8 +32,7 @@ function vlanForm() { } } -function setC(t, p, c) -{ +function setC(t, p, c){ document.getElementById(t+'port'+p).checked=c; } @@ -55,6 +53,7 @@ function fetchVLAN() { const s = JSON.parse(xhttp.responseText); console.log("VLAN: ", JSON.stringify(s)); m = parseInt(s.members, 16); + document.getElementById('vname').value = s.name; for (let i = 1; i <= numPorts; i++) { setC('t', i, (m>>(10+i-1))&1); setC('u', i, (m>>(i-1))&1); diff --git a/httpd/httpd.c b/httpd/httpd.c index 8fd3cd4..e26983c 100644 --- a/httpd/httpd.c +++ b/httpd/httpd.c @@ -15,7 +15,7 @@ extern __code struct f_data f_data[]; extern __code fcall_ptr f_calls[]; extern __code char * __code mime_strings[]; -__xdata uint8_t outbuf[2048]; +__xdata uint8_t outbuf[TCP_OUTBUF_SIZE]; __xdata uint8_t entry; __xdata uint16_t slen; __xdata uint16_t o_idx; diff --git a/httpd/page_impl.c b/httpd/page_impl.c index b4c4a5c..e9377f9 100644 --- a/httpd/page_impl.c +++ b/httpd/page_impl.c @@ -10,7 +10,7 @@ #pragma codeseg BANK1 -extern __xdata uint8_t outbuf[2048]; +extern __xdata uint8_t outbuf[TCP_OUTBUF_SIZE]; extern __xdata uint16_t slen; extern __code uint8_t * __code hex; extern __xdata uip_ipaddr_t uip_hostaddr, uip_draddr, uip_netmask; @@ -25,6 +25,7 @@ extern __xdata uint8_t sfr_data[4]; extern __xdata uint8_t cpuPort; extern __xdata uint8_t isRTL8373; extern __xdata uint8_t sfp_pins_last; +extern __xdata uint8_t vlan_names[VLAN_NAMES_SIZE]; inline void byte_to_html(uint8_t a) { @@ -67,13 +68,36 @@ uint16_t port_status(void) void sfr_data_to_html(void) { - char_to_html(hex[sfr_data[0] >> 4]); - char_to_html(hex[sfr_data[0] & 0xf]); - char_to_html(hex[sfr_data[1] >> 4]); - char_to_html(hex[sfr_data[1] & 0xf]); - char_to_html(hex[sfr_data[2] >> 4]); - char_to_html(hex[sfr_data[2] & 0xf]); - char_to_html(hex[sfr_data[3] >> 4]); + __bit print_zeros = 0; + + if (print_zeros || sfr_data[0] & 0xf0) { + char_to_html(hex[sfr_data[0] >> 4]); + print_zeros = 1; + } + if (print_zeros || sfr_data[0] & 0xf) { + char_to_html(hex[sfr_data[0] & 0xf]); + print_zeros = 1; + } + if (print_zeros || sfr_data[1] & 0xf0) { + char_to_html(hex[sfr_data[1] >> 4]); + print_zeros = 1; + } + if (print_zeros || sfr_data[1] & 0xf) { + char_to_html(hex[sfr_data[1] & 0xf]); + print_zeros = 1; + } + if (print_zeros || sfr_data[2] & 0xf0) { + char_to_html(hex[sfr_data[2] >> 4]); + print_zeros = 1; + } + if (print_zeros || sfr_data[2] & 0xf) { + char_to_html(hex[sfr_data[2] & 0xf]); + print_zeros = 1; + } + if (print_zeros || sfr_data[3] & 0xf0) { + char_to_html(hex[sfr_data[3] >> 4]); + print_zeros = 1; + } char_to_html(hex[sfr_data[3] & 0xf]); } @@ -115,7 +139,7 @@ uint16_t html_index(void) } -void send_vlan(register uint16_t vlan) +void send_vlan(__xdata uint16_t vlan) { slen = strtox(outbuf, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n"); print_string("sending VLAN\n"); @@ -123,22 +147,28 @@ void send_vlan(register uint16_t vlan) slen += strtox(outbuf + slen, "{\"members\":\"0x"); vlan_get(vlan); sfr_data_to_html(); + slen += strtox(outbuf + slen, "\",\"name\":\""); + __xdata uint16_t n = vlan_name(vlan); + if (n== 0xffff) { + print_string("VLAN has no name\n"); + } else { + while(vlan_names[n] && vlan_names[n] != ' ') + char_to_html(vlan_names[n++]); + } slen += strtox(outbuf + slen, "\"}"); } void send_counters(char port) { + print_string("send_counters called: "); print_byte(port); write_char('\n'); slen = strtox(outbuf, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n"); print_string("sending counters\n"); port--; - uint8_t i = isRTL8373 ? port : phys_to_log_port[port]; + uint8_t i = isRTL8373 ? port - 1: phys_to_log_port[port]; slen += strtox(outbuf + slen, "{\"portNum\":"); - if (!isRTL8373) - itoa_html(log_to_phys_port[i]); - else - itoa_html(i + 1); + itoa_html(i + 1); for (uint8_t j = 0; j < 0x3f; j++) { STAT_GET(j, i); slen += strtox(outbuf + slen, ",\"cnt_"); diff --git a/rtl837x_common.h b/rtl837x_common.h index c8a0417..a568276 100644 --- a/rtl837x_common.h +++ b/rtl837x_common.h @@ -16,6 +16,12 @@ // Must be 2^x and <= 128 #define SBUF_SIZE 128 +// Size of the TCP Output buffer +#define TCP_OUTBUF_SIZE 2500 + +// Size of the memory area dedicated to VLAN-names +#define VLAN_NAMES_SIZE 1024 + // For RX data, a propriatary RTL FRAME is inserted. Instead of 0x0800 for IPv4, // the RTL_FRAME_TAG_ID is used as part of an 8-byte tag. When VLAN is activated, // the VLAN tag is inserted after the RTL tag diff --git a/rtl837x_port.c b/rtl837x_port.c index 4f183a7..aee37e0 100644 --- a/rtl837x_port.c +++ b/rtl837x_port.c @@ -14,12 +14,15 @@ #pragma codeseg BANK1 +extern __code uint8_t * __code hex; extern __code uint16_t bit_mask[16]; extern __xdata uint8_t minPort; extern __xdata uint8_t maxPort; extern __xdata uint8_t nSFPPorts; extern __xdata uint8_t sfr_data[4]; extern __xdata uint8_t cpuPort; +extern __xdata uint16_t vlan_ptr; +extern __xdata uint8_t vlan_names[VLAN_NAMES_SIZE]; extern __xdata uint8_t isRTL8373; @@ -104,7 +107,7 @@ void vlan_delete(uint16_t vlan) __banked */ int8_t vlan_get(register uint16_t vlan) __banked { - if (vlan >= 2048) + if (vlan >= 0x3ff) // VLAN 4095 is special return -1; REG_WRITE(RTL837X_TBL_CTRL, vlan >> 8, vlan, TBL_VLAN, TBL_EXECUTE); @@ -117,6 +120,22 @@ int8_t vlan_get(register uint16_t vlan) __banked } +__xdata uint16_t vlan_name(register uint16_t vlan) __banked +{ + __xdata int16_t i = 0; + __xdata uint8_t begin = 1; + while (vlan_names[i]) { + if (begin && vlan_names[i] == hex[(vlan >> 8) & 0xf] && vlan_names[i + 1] == hex[(vlan >> 4) & 0xf] && vlan_names[i + 2] == hex[vlan & 0xf]) + break; + begin = vlan_names[i++] == ' ' ? 1 : 0; + } + if (vlan_names[i]) + return i + 3; + + return 0xffff; +} + + /* * A member that is not tagged, is untagged */ @@ -157,6 +176,10 @@ void vlan_setup(void) __banked { print_string("\nvlan_setup called \n"); + // No VLAN names set up so far + vlan_ptr = 0; + vlan_names[0] = 0; + // Initialize VLAN table for VLAN 1, by disabling that entry if (isRTL8373) { REG_SET(RTL837x_TBL_DATA_IN_A, 0x0007ffff); diff --git a/rtl837x_port.h b/rtl837x_port.h index cc95e2a..6e199af 100644 --- a/rtl837x_port.h +++ b/rtl837x_port.h @@ -17,6 +17,7 @@ uint8_t port_l2_forget(void) __banked; void port_l2_learned(void) __banked; void port_stats_print(void) __banked; int8_t vlan_get(register uint16_t vlan) __banked; +__xdata uint16_t vlan_name(register uint16_t vlan) __banked; void vlan_setup(void) __banked; void port_pvid_set(uint8_t port, __xdata uint16_t pvid) __banked; void vlan_create(register uint16_t vlan, register uint16_t members, register uint16_t tagged) __banked;