diff --git a/html/style.css b/html/style.css
index 9bc8b5d..c03be99 100644
--- a/html/style.css
+++ b/html/style.css
@@ -82,7 +82,6 @@ object, img {
.isNOK{ color: #900;}
.isOK{ color: #090;}
.ip{padding:8px 16px;margin-bottom: 1em;margin-left: 1em}
-/* read-only values line up with the text inside the input fields */
.rotext{display:inline-block;padding:8px 16px;margin-bottom: 1em;margin-left: 1em}
.row {display: flex;}
.rcol {flex: 90%;}
diff --git a/html/system.js b/html/system.js
index cb48a40..f9fd37e 100644
--- a/html/system.js
+++ b/html/system.js
@@ -133,7 +133,7 @@ function fetchIP() {
document.getElementById("gw").value=s.ip_gateway;
document.getElementById("hostname").value=s.hostname;
document.getElementById("model").textContent=s.hw_ver;
- loadMgmtVlan(parseInt(s.mgmt_vlan, 10) || 0);
+ loadMgmtVlan();
clearInterval(systemInterval);
// Fetch and populate the config textbox
fetchConfig().then((configText) => {
@@ -170,14 +170,13 @@ window.addEventListener("load", function() {
var mgmtVlanCurrent = 0;
-/* Populate the management-VLAN picker from the configured VLANs. If management
- * is untagged there is no VLAN to select, so show that as a disabled entry
- * rather than inventing an id the switch would reject. */
-function loadMgmtVlan(cur) {
+function loadMgmtVlan() {
var sel = document.getElementById('mgmtvlan');
if (!sel) return;
- mgmtVlanCurrent = cur;
- fetch('/vlanlist').then(function(r) { return r.json(); }).then(function(list) {
+ fetch('/vlanlist').then(function(r) { return r.json(); }).then(function(d) {
+ var cur = d.mgmt || 0;
+ var list = d.vlan || [];
+ mgmtVlanCurrent = cur;
sel.innerHTML = '';
if (!cur) {
var none = document.createElement('option');
diff --git a/html/vlan.js b/html/vlan.js
index 8e18f27..2ae5efa 100644
--- a/html/vlan.js
+++ b/html/vlan.js
@@ -110,7 +110,7 @@ async function loadVlanTable() {
var resp;
try { resp = await fetch('/vlanlist'); } catch(e) { return; }
if (!resp.ok) return;
- var vlans = await resp.json();
+ var vlans = (await resp.json()).vlan || [];
for (var i = 0; i < vlans.length; i++) {
var v = vlans[i];
var vresp;
@@ -181,7 +181,7 @@ function loadVlanList() {
sel.style.display = 'none';
return;
}
- var vlans = JSON.parse(this.responseText);
+ var vlans = JSON.parse(this.responseText).vlan || [];
if (!vlans.length) {
sel.style.display = 'none';
return;
diff --git a/httpd/page_impl.c b/httpd/page_impl.c
index c78c2e1..44332e5 100644
--- a/httpd/page_impl.c
+++ b/httpd/page_impl.c
@@ -265,10 +265,7 @@ void send_basic_info(void)
slen += strtox(outbuf + slen, BUILD_DATE);
slen += strtox(outbuf + slen, "\",\"hw_ver\":\"");
slen += strtox(outbuf + slen, machine.machine_name);
- /* VLAN carrying switch management, 0 = untagged. */
- slen += strtox(outbuf + slen, "\",\"mgmt_vlan\":");
- itoa16_html(management_vlan);
- slen += strtox(outbuf + slen, ",\"flash_size\":\"");
+ slen += strtox(outbuf + slen, "\",\"flash_size\":\"");
string_to_html(get_flash_size_str());
if (machine.n_sfp) {
@@ -861,7 +858,9 @@ void send_vlanlist(void)
uint8_t first = 1;
slen = strtox(outbuf, HTTP_RESPONCE_JSON);
- char_to_html('[');
+ slen += strtox(outbuf + slen, "{\"mgmt\":");
+ itoa16_html(management_vlan);
+ slen += strtox(outbuf + slen, ",\"vlan\":[");
for (i = 1; i < 4095; i++) {
if (vlan_get(i) < 0)
@@ -869,7 +868,7 @@ void send_vlanlist(void)
if (!(sfr_data[0] & 0x02)) /* bit 1: VLAN table entry valid */
continue;
- if (slen + 139 > TCP_OUTBUF_SIZE) /* 138 bytes worst-case entry + 1 byte for closing ']' */
+ if (slen + 141 > TCP_OUTBUF_SIZE) /* comma + 138-byte worst-case entry + closing "]}" */
break;
if (!first)
@@ -891,4 +890,5 @@ void send_vlanlist(void)
}
char_to_html(']');
+ char_to_html('}');
}