diff --git a/html/vlan.js b/html/vlan.js index d783534..8a2c3b1 100644 --- a/html/vlan.js +++ b/html/vlan.js @@ -39,11 +39,6 @@ function vlanForm() { function setC(t, p, c){ document.getElementById(t+'port'+p).checked=c; - // When a tagged port is checked, automatically select the PVID port as well - const tportElem = document.getElementById('tport'+p); - if (tportElem && tportElem.checked) { - document.getElementById('pport'+p).checked=true; - } } function utClicked(t){ @@ -70,10 +65,16 @@ function fetchVLAN() { console.log("VLAN: ", JSON.stringify(s)); m = parseInt(s.members, 16); document.getElementById('vname').value = s.name; + var members = m & 0x3FF; + var untag = (m >> 10) & 0x3FF; + var pvid = parseInt(s.pvid, 16); for (let i = 1; i <= numPorts; i++) { - setC('t', i, (m>>(10+i-1))&1); - setC('u', i, (m>>(i-1))&1); - setC('p', i, (m>>(20+i-1))&1); + var bit = i - 1; + var isMember = (members >> bit) & 1; + var isUntag = (untag >> bit) & 1; + setC('t', i, isMember && !isUntag); + setC('u', i, isMember && isUntag); + setC('p', i, (pvid >> bit) & 1); } } }; diff --git a/httpd/page_impl.c b/httpd/page_impl.c index 9769311..0618758 100644 --- a/httpd/page_impl.c +++ b/httpd/page_impl.c @@ -270,6 +270,14 @@ void send_vlan(uint16_t vlan) while(vlan_names[n] && vlan_names[n] != ' ') char_to_html(vlan_names[n++]); } + slen += strtox(outbuf + slen, "\",\"pvid\":\"0x"); + uint16_t pvid_mask = 0; + for (uint8_t i = machine.min_port; i <= machine.max_port; i++) { + if (port_pvid_get(i) == vlan) + pvid_mask |= (1 << i); +} + byte_to_html(pvid_mask >> 8); + byte_to_html(pvid_mask); slen += strtox(outbuf + slen, "\"}"); } diff --git a/rtl837x_port.c b/rtl837x_port.c index 4e12a6d..1a28c69 100644 --- a/rtl837x_port.c +++ b/rtl837x_port.c @@ -78,6 +78,17 @@ void port_pvid_set(uint8_t port, __xdata uint16_t pvid) __banked } } +uint16_t port_pvid_get(uint8_t port) __banked +{ + uint16_t reg = RTL837x_PVID_BASE_REG + ((port >> 1) << 2); + reg_read_m(reg); + if (port & 0x1) { + return (sfr_data[1] << 4) | (sfr_data[2] >> 4); + } else { + return ((sfr_data[2] & 0x0f) << 8) | sfr_data[3]; + } +} + void vlan_delete(uint16_t vlan) __banked { diff --git a/rtl837x_port.h b/rtl837x_port.h index 480f2e8..60e2282 100644 --- a/rtl837x_port.h +++ b/rtl837x_port.h @@ -28,6 +28,7 @@ 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; +uint16_t port_pvid_get(uint8_t port) __banked; void vlan_create(void) __banked; void vlan_delete(uint16_t vlan) __banked; void port_mirror_set(register uint8_t port, __xdata uint16_t rx_pmask, __xdata uint16_t tx_pmask) __banked;