Merge pull request #313 from DrDoof/fix/vlan-id-range

Reject VLAN IDs and numeric arguments the hardware cannot take
This commit is contained in:
René van Dorst
2026-08-08 20:51:43 +00:00
committed by GitHub
2 changed files with 33 additions and 13 deletions
+25 -13
View File
@@ -191,8 +191,11 @@ uint8_t atoi_byte(__xdata uint8_t *out, uint8_t idx)
uint8_t num = 0; uint8_t num = 0;
while (isnumber(cmd_buffer[idx])) { while (isnumber(cmd_buffer[idx])) {
uint8_t val = cmd_buffer[idx] - '0';
err = 0; err = 0;
num = (num * 10) + cmd_buffer[idx] - '0'; if (num > 25 || (num == 25 && val > 5))
return 1;
num = (num * 10) + val;
idx++; idx++;
} }
@@ -209,6 +212,8 @@ uint8_t atoi_short(__xdata uint16_t *vlan, uint8_t idx)
while (isnumber(cmd_buffer[idx])) { while (isnumber(cmd_buffer[idx])) {
err = 0; err = 0;
uint8_t val = cmd_buffer[idx] - '0'; uint8_t val = cmd_buffer[idx] - '0';
if (*vlan > 6553 || (*vlan == 6553 && val > 5))
return 1;
*vlan = (*vlan * 10) + val; *vlan = (*vlan * 10) + val;
idx++; idx++;
} }
@@ -342,6 +347,8 @@ void parse_vlan(void)
return; return;
} }
if (cmd_compare(2, "mgmt")) { if (cmd_compare(2, "mgmt")) {
if (vlan_settings.vlan > 4094)
goto err;
management_vlan = vlan_settings.vlan; management_vlan = vlan_settings.vlan;
if (!vlan_settings.vlan) if (!vlan_settings.vlan)
print_string("Management VLAN disabled\n"); print_string("Management VLAN disabled\n");
@@ -349,6 +356,8 @@ void parse_vlan(void)
print_string("Management VLAN set to "); print_short(management_vlan); write_char('\n'); print_string("Management VLAN set to "); print_short(management_vlan); write_char('\n');
return; return;
} }
if (!vlan_settings.vlan || vlan_settings.vlan > 4094)
goto err;
uint8_t w = 2; uint8_t w = 2;
if (cmd_words_len > w && isletter(cmd_buffer[cmd_words_b[w]])) { if (cmd_words_len > w && isletter(cmd_buffer[cmd_words_b[w]])) {
register uint8_t i = 0; register uint8_t i = 0;
@@ -721,17 +730,18 @@ void parse_mtu(void)
print_string("Port "); print_byte(machine.log_to_phys_port[p]); print_string("Port "); print_byte(machine.log_to_phys_port[p]);
write_char(' '); print_short(mtu); write_char('\n'); write_char(' '); print_short(mtu); write_char('\n');
} }
return;
} }
p = cmd_buffer[cmd_words_b[1]] - '1'; if (cmd_words_len != 3 || cmd_buffer[cmd_words_b[1]] < '1'
p = machine.phys_to_log_port[p]; || cmd_buffer[cmd_words_b[1]] > '9'
print_byte(p); || cmd_buffer[cmd_words_b[1] + 1] > ' ') {
if (cmd_words_len != 3) {
print_string("mtu [port] [size]\n"); print_string("mtu [port] [size]\n");
return; return;
} }
atoi_short(&mtu, cmd_words_b[2]); p = machine.phys_to_log_port[cmd_buffer[cmd_words_b[1]] - '1'];
if (mtu > 0x3fff) { print_byte(p);
print_string("Maximum MTU is 16383\n"); if (atoi_short(&mtu, cmd_words_b[2]) || mtu < 64 || mtu > 0x3fff) {
print_string("MTU must be 64..16383\n");
return; return;
} }
REG_WRITE(RTL8373_REG_MAC_L2_PORT_MAX_LEN + ((uint16_t) p << 8), (mtu >> 10) & 0xf, (mtu >> 2) & 0xff, REG_WRITE(RTL8373_REG_MAC_L2_PORT_MAX_LEN + ((uint16_t) p << 8), (mtu >> 10) & 0xf, (mtu >> 2) & 0xff,
@@ -1559,11 +1569,13 @@ void cmd_parser(void) __banked
} }
} else if (cmd_compare(0, "pvid") && cmd_words_len == 3) { } else if (cmd_compare(0, "pvid") && cmd_words_len == 3) {
__xdata uint16_t pvid; __xdata uint16_t pvid;
uint8_t port; if (cmd_buffer[cmd_words_b[1]] >= '1'
port = cmd_buffer[cmd_words_b[1]] - '1'; && cmd_buffer[cmd_words_b[1]] <= '9'
port = machine.phys_to_log_port[port]; && cmd_buffer[cmd_words_b[1] + 1] <= ' '
if (!atoi_short(&pvid, cmd_words_b[2])) && !atoi_short(&pvid, cmd_words_b[2]) && pvid && pvid <= 4094)
port_pvid_set(port, pvid); port_pvid_set(machine.phys_to_log_port[cmd_buffer[cmd_words_b[1]] - '1'], pvid);
else
print_string("Error: pvid <port> <1-4094>\n");
} else if (cmd_compare(0, "vlan")) { } else if (cmd_compare(0, "vlan")) {
parse_vlan(); parse_vlan();
} else if (cmd_compare(0, "isolate")) { } else if (cmd_compare(0, "isolate")) {
+8
View File
@@ -115,6 +115,9 @@ uint16_t port_pvid_get(uint8_t port) __banked
void vlan_delete(uint16_t vlan) __banked void vlan_delete(uint16_t vlan) __banked
{ {
if (!vlan || vlan >= 0xfff)
return;
print_string("\nvlan_delete called \n"); print_short(vlan); print_string("\nvlan_delete called \n"); print_short(vlan);
vlan_name_remove(vlan); vlan_name_remove(vlan);
REG_WRITE(RTL837x_TBL_DATA_IN_A, 0, 0, 0, 0); REG_WRITE(RTL837x_TBL_DATA_IN_A, 0, 0, 0, 0);
@@ -197,6 +200,11 @@ __xdata uint16_t vlan_name(register uint16_t vlan) __banked
*/ */
void vlan_create(void) __banked void vlan_create(void) __banked
{ {
if (!vlan_settings.vlan || vlan_settings.vlan >= 0xfff) {
print_string("\nInvalid VLAN: "); print_short(vlan_settings.vlan); write_char('\n');
return;
}
// For now, the CPU-port is always a tagged member: // For now, the CPU-port is always a tagged member:
vlan_settings.members |= 0x0200; // Set 10th bit vlan_settings.members |= 0x0200; // Set 10th bit
vlan_settings.tagged |= 0x0200; vlan_settings.tagged |= 0x0200;