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 __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 <vlan-id> [port][t/u]...");
+3 -4
View File
@@ -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);
+1 -1
View File
@@ -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;
+44 -14
View File
@@ -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_");
+6
View File
@@ -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
+24 -1
View File
@@ -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);
+1
View File
@@ -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;