mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-08-30 14:52:51 +08:00
Add support for VLAN names
This commit is contained in:
+32
-1
@@ -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
@@ -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
@@ -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
@@ -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_");
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user