diff --git a/html/l2.js b/html/l2.js
index aa5742f..2011c65 100644
--- a/html/l2.js
+++ b/html/l2.js
@@ -1,7 +1,3 @@
-var l2GetInterval;
-var l2Entries = [];
-var l2CurrentEntry = 0;
-
function fillStats() {
var tbl = document.getElementById('statstable');
if (!numPorts)
@@ -118,7 +114,6 @@ function fillL2(s)
s = uniq(s);
l2All = s;
renderL2();
- l2Entries = [];
}
function paintL2(tbl, s)
@@ -147,53 +142,20 @@ function paintL2(tbl, s)
}
function getL2() {
- var xhttp = new XMLHttpRequest();
- xhttp.onreadystatechange = function() {
- if (this.readyState == 4 && this.status == 200) {
- var s = JSON.parse(xhttp.responseText);
- var s = s.map(function(e) {
- e.vlan = parseInt(e.vlan, 16);
- e.idx = parseInt(e.idx, 16);
- e.type = e.type == "s" ? t('l2_static') : t('l2_learned');
- e.port = e.port == 9 ? 'CPU' : logToPhysPort[e.port];
- return e;
- });
- l2Entries.push(...s);
- if (l2Entries.length >= 4096) {
- l2Entries = [];
- l2CurrentEntry = 0;
- clearInterval(l2GetInterval);
- return;
- }
- if (!s.length) {
- l2CurrentEntry = 0;
- fillL2(l2Entries);
- return;
- }
- var w = 0;
- for (var i = l2Entries.length-1; i > 0; i--) {
- if (l2Entries[0].idx == l2Entries[i].idx) {
- w = 1;
- break;
- }
- }
- if (w) {
- l2CurrentEntry = 0;
- fillL2(l2Entries);
- } else {
- l2CurrentEntry = s[s.length-1].idx + 1;
- }
+ walkL2(function(entries, ok) {
+ if (ok) {
+ for (var i = 0; i < entries.length; i++)
+ entries[i].type = entries[i].type == "s" ? t('l2_static') : t('l2_learned');
+ fillL2(entries);
}
- };
- xhttp.open("GET", "/l2.json?idx=" + l2CurrentEntry, true);
- xhttp.timeout = 1500; sendXHTTP(xhttp);
+ setTimeout(getL2, 1000);
+ });
}
window.addEventListener("load", function() {
update( () => {
getL2();
const interval = setInterval(update, 2000);
- l2GetInterval = setInterval(getL2, 1000);
});;
});
diff --git a/html/main.js b/html/main.js
index f82b232..bd9c19d 100644
--- a/html/main.js
+++ b/html/main.js
@@ -285,3 +285,66 @@ function sendXHTTP(x)
currentRequests.push(x);
}
+
+function walkL2(onDone)
+{
+ var entries = [];
+ var idx = 0;
+ var tries = 0;
+
+ function retry() {
+ if (++tries < 3) {
+ setTimeout(page, 1000);
+ return;
+ }
+ onDone(entries, false);
+ }
+
+ function page() {
+ var xhttp = new XMLHttpRequest();
+ xhttp.onreadystatechange = function() {
+ if (this.readyState != 4)
+ return;
+ if (this.status != 200) {
+ retry();
+ return;
+ }
+ var s;
+ try {
+ s = JSON.parse(xhttp.responseText);
+ } catch (err) {
+ retry();
+ return;
+ }
+ tries = 0;
+ s = s.map(function(e) {
+ e.vlan = parseInt(e.vlan, 16);
+ e.idx = parseInt(e.idx, 16);
+ e.port = e.port == 9 ? 'CPU' : logToPhysPort[e.port];
+ return e;
+ });
+ if (!s.length) {
+ onDone(entries, true);
+ return;
+ }
+ entries.push(...s);
+ for (var i = entries.length - 1; i > 0; i--) {
+ if (entries[0].idx == entries[i].idx) {
+ onDone(entries, true);
+ return;
+ }
+ }
+ if (entries.length >= 4096) {
+ onDone(entries, true);
+ return;
+ }
+ idx = s[s.length - 1].idx + 1;
+ setTimeout(page, 1000);
+ };
+ xhttp.open("GET", "/l2.json?idx=" + idx, true);
+ xhttp.timeout = 1500;
+ sendXHTTP(xhttp);
+ }
+
+ page();
+}