diff --git a/html/ports.js b/html/ports.js index 0396447..2c6ebf2 100644 --- a/html/ports.js +++ b/html/ports.js @@ -1,3 +1,4 @@ +var mtus = new Int16Array(10); function createPortTable() { var tbl = document.getElementById('speedtable'); if (tbl.rows.length <= 2 && numPorts) { @@ -29,6 +30,34 @@ function createPortTable() { td.innerHTML = button; } } + tbl = document.getElementById('mtutable'); + if (tbl.rows.length <= 2 && numPorts) { + const mSelect = ''; + var tr = tbl.insertRow(); + for (let i = 1; i <= numPorts; i++) { + let td = tr.insertCell(); + if (pIsSFP[i-1]) + td.innerHTML = '' + else + td.innerHTML = '' + } + tr = tbl.insertRow(); + for (let i = 1; i <= numPorts; i++) { + let td = tr.insertCell(); + td.innerHTML = mSelect.replaceAll("mtu_sel", "mtu_sel_" + i); + } + tr = tbl.insertRow(); + for (let i = 1; i <= numPorts; i++) { + let td = tr.insertCell(); + td.innerHTML = ''; + } + } } function updatePortTable() { @@ -42,27 +71,35 @@ function updatePortTable() { tbl.rows[i].cells[1].innerHTML = `${linkS[pState[i-1]+1]}`; var td = tbl.rows[i].cells[2]; var adv = pAdvertised[i-1]; - console.log("pAdvertised for " + i + " is " + adv); - if (pAdvertised[i-1] == 0) - td.innerHTML = "None"; - else if (adv == 0b100000) - td.innerHTML = "2.5GBit Full Duplex"; - else if (adv == 0b010000) - td.innerHTML = "1000MBit Full Duplex"; - else if (adv == 0b111111) - td.innerHTML = "AUTO"; - else if (adv == 0b000011) - td.innerHTML = "10MBit"; - else if (adv == 0b000100) - td.innerHTML = "100MBit Half Duplex"; + switch(pAdvertised[i-1]) { + case 0x20: + td.innerHTML = "2.5GBit Full Duplex"; break; + case 0x10: + td.innerHTML = "1000MBit Full Duplex"; break; + case 0x2f: + td.innerHTML = "AUTO"; break; + case 0xc: + td.innerHTML = "100MBit"; break; + case 8: + td.innerHTML = "100MBit Full Duplex"; break; + case 4: + td.innerHTML = "100MBit Half Duplex"; break; + case 3: + td.innerHTML = "10MBit"; break; + case 2: + td.innerHTML = "10MBit Full Duplex"; break; + case 1: + td.innerHTML = "10MBit Half Duplex"; break; + default: + td.innerHTML = "None"; break; + } } } async function applySpeed(port) { var speed = document.getElementById('speed_sel_' + port).value; var duplex = document.getElementById('duplex_sel_' + port).value; - var cmd = "port " + port + " "; - cmd = cmd + speed; + var cmd = "port " + port + " " + speed; console.log("port " + port, ", speed: " + speed, ", duplex: ", duplex); try { const response = await fetch('/cmd', { @@ -83,8 +120,46 @@ async function applySpeed(port) { } } +async function applyMTU(port) { + var mtu = document.getElementById('mtu_sel_' + port).value; + var cmd = "mtu " + port + " " + mtu; + try { + const response = await fetch('/cmd', { + method: 'POST', + body: cmd + }); + console.log('MTU Completed!', response); + getMTUs(); + } catch(err) { + console.error(`Error: ${err}`); + } +} + +function getMTUs() { + var xhttp = new XMLHttpRequest(); + xhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + const s = JSON.parse(xhttp.responseText); + console.log("MTUS: ", JSON.stringify(s)); + for (let i = 0; i < s.length; i++) { + p = s[i]; + let n = p.portNum; + mtus[n] = parseInt(p.mtu, 16); + var mtu = document.getElementById('mtu_sel_' + n); + if (!mtu) + continue; + mtu.value = mtus[n]; + clearInterval(pMTUInterval); + } + } + }; + xhttp.open("GET", "/mtu.json", true); + xhttp.timeout = 1500; xhttp.send(); +} + window.addEventListener("load", function() { const updatePortTableInterval = setInterval(updatePortTable, 1000); }); const pTableInterval = setInterval(createPortTable, 1000); +const pMTUInterval = setInterval(getMTUs, 1200); diff --git a/httpd/httpd.c b/httpd/httpd.c index fa9b4cb..fff640e 100644 --- a/httpd/httpd.c +++ b/httpd/httpd.c @@ -570,6 +570,8 @@ void httpd_appcall(void) send_eee(); } else if (is_word(q, "/mirror.json")) { send_mirror(); + } else if (is_word(q, "/mtu.json")) { + send_mtu(); } else if (is_word(q, "/lag.json")) { send_lag(); } else if (is_word(q, "/config")) { diff --git a/httpd/page_impl.c b/httpd/page_impl.c index 62d5f07..589eefc 100644 --- a/httpd/page_impl.c +++ b/httpd/page_impl.c @@ -380,6 +380,28 @@ void send_eee(void) } } +void send_mtu(void) +{ + print_string("send_mtu called\n"); + slen = strtox(outbuf, HTTP_RESPONCE_JSON); + char_to_html('['); + for (uint8_t i = machine.min_port; i <= machine.max_port; i++) { + slen += strtox(outbuf + slen, "{\"portNum\":"); + itoa_html(machine.log_to_phys_port[i]); + slen += strtox(outbuf + slen, ",\"mtu\":\"0x"); + reg_read_m(RTL8373_REG_MAC_L2_PORT_MAX_LEN + ((uint16_t) i << 8)); + uint16_t mtu = SFR_DATA_U16 & 0x3fff; + byte_to_html(mtu >> 8); + byte_to_html(mtu & 0xff); + char_to_html('"'); + char_to_html('}'); + if (i < machine.max_port) + char_to_html(','); + else + char_to_html(']'); + } +} + void send_status(void) { diff --git a/httpd/page_impl.h b/httpd/page_impl.h index 166a79c..064a9df 100644 --- a/httpd/page_impl.h +++ b/httpd/page_impl.h @@ -7,6 +7,7 @@ void send_vlan(uint16_t vlan); void send_basic_info(void); void send_eee(void); void send_mirror(void); +void send_mtu(void); void send_config(void); void send_cmd_log(void); void send_lag(void);