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 __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
@@ -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
@@ -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;
|
||||||
|
|||||||
+44
-14
@@ -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)
|
||||||
{
|
{
|
||||||
char_to_html(hex[sfr_data[0] >> 4]);
|
__bit print_zeros = 0;
|
||||||
char_to_html(hex[sfr_data[0] & 0xf]);
|
|
||||||
char_to_html(hex[sfr_data[1] >> 4]);
|
if (print_zeros || sfr_data[0] & 0xf0) {
|
||||||
char_to_html(hex[sfr_data[1] & 0xf]);
|
char_to_html(hex[sfr_data[0] >> 4]);
|
||||||
char_to_html(hex[sfr_data[2] >> 4]);
|
print_zeros = 1;
|
||||||
char_to_html(hex[sfr_data[2] & 0xf]);
|
}
|
||||||
char_to_html(hex[sfr_data[3] >> 4]);
|
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]);
|
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,22 +147,28 @@ 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(i + 1);
|
||||||
itoa_html(log_to_phys_port[i]);
|
|
||||||
else
|
|
||||||
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);
|
||||||
slen += strtox(outbuf + slen, ",\"cnt_");
|
slen += strtox(outbuf + slen, ",\"cnt_");
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user