Add support for VLAN names

This commit is contained in:
logicog
2025-08-28 16:58:51 +02:00
parent e8c6492786
commit a0239b72f4
7 changed files with 111 additions and 21 deletions
+32 -1
View File
@@ -28,6 +28,9 @@ extern __code uint8_t * __code greeting;
extern __code uint8_t * __code hex; extern __code uint8_t * __code hex;
extern __xdata uint8_t flash_buf[256]; 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 // Buffer for writing to flash 0x1fd000, copy to 0x1fe000
__xdata uint8_t cmd_buffer[SBUF_SIZE]; __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 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) uint8_t cmd_compare(uint8_t start, uint8_t * __code cmd)
{ {
signed char i; signed char i;
@@ -110,11 +120,28 @@ void parse_vlan(void)
__xdata uint16_t members = 0; __xdata uint16_t members = 0;
__xdata uint16_t tagged = 0; __xdata uint16_t tagged = 0;
if (!atoi_short(&vlan, cmd_words_b[1])) { 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); vlan_delete(vlan);
return; return;
} }
uint8_t w = 2; 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) { while (cmd_words_b[w] > 0) {
uint8_t port; uint8_t port;
if (cmd_buffer[cmd_words_b[w]] >= '0' && cmd_buffer[cmd_words_b[w]] <= '9') { 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); 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; return;
err: err:
print_string("Error: vlan <vlan-id> [port][t/u]..."); print_string("Error: vlan <vlan-id> [port][t/u]...");
+3 -4
View File
@@ -22,8 +22,7 @@ function vlanForm() {
} else { } else {
o.src = "port.svg"; o.width = "40"; o.height = "40"; o.src = "port.svg"; o.width = "40"; o.height = "40";
} }
l.appendChild(inp); l.appendChild(inp); l.appendChild(o);
l.appendChild(o);
d.appendChild(l) d.appendChild(l)
t.appendChild(d); t.appendChild(d);
var d2=d.cloneNode(true); 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; document.getElementById(t+'port'+p).checked=c;
} }
@@ -55,6 +53,7 @@ function fetchVLAN() {
const s = JSON.parse(xhttp.responseText); const s = JSON.parse(xhttp.responseText);
console.log("VLAN: ", JSON.stringify(s)); console.log("VLAN: ", JSON.stringify(s));
m = parseInt(s.members, 16); m = parseInt(s.members, 16);
document.getElementById('vname').value = s.name;
for (let i = 1; i <= numPorts; i++) { for (let i = 1; i <= numPorts; i++) {
setC('t', i, (m>>(10+i-1))&1); setC('t', i, (m>>(10+i-1))&1);
setC('u', i, (m>>(i-1))&1); setC('u', i, (m>>(i-1))&1);
+1 -1
View File
@@ -15,7 +15,7 @@ extern __code struct f_data f_data[];
extern __code fcall_ptr f_calls[]; extern __code fcall_ptr f_calls[];
extern __code char * __code mime_strings[]; extern __code char * __code mime_strings[];
__xdata uint8_t outbuf[2048]; __xdata uint8_t outbuf[TCP_OUTBUF_SIZE];
__xdata uint8_t entry; __xdata uint8_t entry;
__xdata uint16_t slen; __xdata uint16_t slen;
__xdata uint16_t o_idx; __xdata uint16_t o_idx;
+36 -6
View File
@@ -10,7 +10,7 @@
#pragma codeseg BANK1 #pragma codeseg BANK1
extern __xdata uint8_t outbuf[2048]; extern __xdata uint8_t outbuf[TCP_OUTBUF_SIZE];
extern __xdata uint16_t slen; extern __xdata uint16_t slen;
extern __code uint8_t * __code hex; extern __code uint8_t * __code hex;
extern __xdata uip_ipaddr_t uip_hostaddr, uip_draddr, uip_netmask; 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 cpuPort;
extern __xdata uint8_t isRTL8373; extern __xdata uint8_t isRTL8373;
extern __xdata uint8_t sfp_pins_last; extern __xdata uint8_t sfp_pins_last;
extern __xdata uint8_t vlan_names[VLAN_NAMES_SIZE];
inline void byte_to_html(uint8_t a) inline void byte_to_html(uint8_t a)
{ {
@@ -67,13 +68,36 @@ uint16_t port_status(void)
void sfr_data_to_html(void) void sfr_data_to_html(void)
{ {
__bit print_zeros = 0;
if (print_zeros || sfr_data[0] & 0xf0) {
char_to_html(hex[sfr_data[0] >> 4]); 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]); 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]); 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]); 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]); 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]); 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]); char_to_html(hex[sfr_data[3] >> 4]);
print_zeros = 1;
}
char_to_html(hex[sfr_data[3] & 0xf]); 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"); slen = strtox(outbuf, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n");
print_string("sending VLAN\n"); print_string("sending VLAN\n");
@@ -123,21 +147,27 @@ void send_vlan(register uint16_t vlan)
slen += strtox(outbuf + slen, "{\"members\":\"0x"); slen += strtox(outbuf + slen, "{\"members\":\"0x");
vlan_get(vlan); vlan_get(vlan);
sfr_data_to_html(); 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, "\"}"); slen += strtox(outbuf + slen, "\"}");
} }
void send_counters(char port) 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"); slen = strtox(outbuf, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n");
print_string("sending counters\n"); print_string("sending counters\n");
port--; 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\":"); 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++) { for (uint8_t j = 0; j < 0x3f; j++) {
STAT_GET(j, i); STAT_GET(j, i);
+6
View File
@@ -16,6 +16,12 @@
// Must be 2^x and <= 128 // Must be 2^x and <= 128
#define SBUF_SIZE 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, // 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 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 // the VLAN tag is inserted after the RTL tag
+24 -1
View File
@@ -14,12 +14,15 @@
#pragma codeseg BANK1 #pragma codeseg BANK1
extern __code uint8_t * __code hex;
extern __code uint16_t bit_mask[16]; extern __code uint16_t bit_mask[16];
extern __xdata uint8_t minPort; extern __xdata uint8_t minPort;
extern __xdata uint8_t maxPort; extern __xdata uint8_t maxPort;
extern __xdata uint8_t nSFPPorts; extern __xdata uint8_t nSFPPorts;
extern __xdata uint8_t sfr_data[4]; extern __xdata uint8_t sfr_data[4];
extern __xdata uint8_t cpuPort; 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; 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 int8_t vlan_get(register uint16_t vlan) __banked
{ {
if (vlan >= 2048) if (vlan >= 0x3ff) // VLAN 4095 is special
return -1; return -1;
REG_WRITE(RTL837X_TBL_CTRL, vlan >> 8, vlan, TBL_VLAN, TBL_EXECUTE); 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 * A member that is not tagged, is untagged
*/ */
@@ -157,6 +176,10 @@ void vlan_setup(void) __banked
{ {
print_string("\nvlan_setup called \n"); 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 // Initialize VLAN table for VLAN 1, by disabling that entry
if (isRTL8373) { if (isRTL8373) {
REG_SET(RTL837x_TBL_DATA_IN_A, 0x0007ffff); REG_SET(RTL837x_TBL_DATA_IN_A, 0x0007ffff);
+1
View File
@@ -17,6 +17,7 @@ uint8_t port_l2_forget(void) __banked;
void port_l2_learned(void) __banked; void port_l2_learned(void) __banked;
void port_stats_print(void) __banked; void port_stats_print(void) __banked;
int8_t vlan_get(register uint16_t vlan) __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 vlan_setup(void) __banked;
void port_pvid_set(uint8_t port, __xdata uint16_t pvid) __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; void vlan_create(register uint16_t vlan, register uint16_t members, register uint16_t tagged) __banked;