storm: limit broadcast, multicast and unknown unicast and multicast per port

This commit is contained in:
DrDoof committed 2026-09-29 21:46:56 +02:00
1 parent 13b75a73c9
commit 26547f3e01
13 files changed
+312 -3

No files matched your search

+60 -2
View File
@@ -70,6 +70,9 @@ e_idle:"idle",e_na:"n/a",
bw_title:"Bandwidth limits",bw_h:"Mbit/s, 0.016-10000",bw_in:"Ingress limit",bw_out:"Egress limit",
bw_exceed:"When exceeded",bw_fc:"Flow control",bw_drop:"Drop",
bw_in_err:"Ingress limit must be 0.016-10000 Mbit/s",bw_out_err:"Egress limit must be 0.016-10000 Mbit/s",
sc_title:"Storm control",sc_h:"per port and traffic type, empty = off",sc_bcast:"Broadcast",sc_mcast:"Multicast",
sc_ucast:"Unknown unicast",sc_umcast:"Unknown multicast",sc_err:"Storm limit must be 1-1048575 pps or 1-10000000 kbit/s",
sc_note:"Frames of a type above its limit are dropped where they enter the switch.",
sy_network:"Network",sy_dhcp:"Use DHCP",sy_dhcp_t:"Request address via DHCP",sy_services:"Services",
sy_igmp:"IGMP snooping",sy_sysip:"server IP",sy_server:"Server",sy_port:"Port",
sy_sesstmo:"Session timeout (s)",sy_sesstmo_err:"Session timeout must be 1-65535 s",
@@ -677,6 +680,7 @@ var CONF_CMDS=[
/^stp\s+(port\s+\d{1,2}|lag\s+[1-4])\s+p2p\s+(auto|on|off)$/,
/^igmp\s+(on|off)$/,/^mtu\s+\d{1,2}\s+\d+$/,
/^bw\s+(in|out)\s+\d{1,2}\s+\S+$/,
/^storm\s+\d{1,2}\s+(bcast|mcast|ucast|umcast)\s+(off|\d{1,8}\s+(pps|kbps))$/,
];
function isConfCmd(line){
for(var i=0;i<CONF_CMDS.length;i++)if(CONF_CMDS[i].test(line))return true;
@@ -1725,7 +1729,61 @@ function bwApply(n){
}else cmds.push("bw out "+n+" off");
postCmds(cmds).then(bwLoad).catch(function(){});
}
tabHooks.bw={enter:function(){needPorts(function(){bwLoad().catch(function(){})})}};
var SC_TYPES=["bcast","mcast","ucast","umcast"],scSig="";
function scLoad(){
return getJSON("/storm.json").then(function(s){
var tb=$("sctable").tBodies[0];
byPort(s);
var sig=s.map(function(p){return p.portNum}).join();
if(sig!==scSig){
scSig=sig;tb.innerHTML="";
s.forEach(function(p){
var n=p.portNum,tr=tb.insertRow();
tr.id="scr"+n;
tr.addEventListener("input",function(){tr.dataset.dirty="1"});
tr.addEventListener("change",function(){tr.dataset.dirty="1"});
tr.insertCell().textContent=n;
SC_TYPES.forEach(function(ty){
tr.insertCell().appendChild(h("span",{style:"display:flex;gap:4px"},[
h("input",{class:"in sm",id:"scv"+ty+n,type:"number",min:"1",step:"1"}),
h("select",{class:"in",id:"scu"+ty+n},[
h("option",{value:"pps",text:"pps"}),
h("option",{value:"kbps",text:"kbit/s"}),
]),
]));
});
tr.insertCell().appendChild(h("button",{class:"ctl",text:t("c_apply"),onclick:function(){scApply(n)}}));
});
}
s.forEach(function(p){
var n=p.portNum;
if($("scr"+n).dataset.dirty)return;
SC_TYPES.forEach(function(ty,k){
var on=p.en.charAt(k)==="1",pps=p.pps.charAt(k)==="1",raw=parseInt(p.rate.substr(k*6,6),16);
var inp=$("scv"+ty+n),sel=$("scu"+ty+n);
inp.value=on?raw:"";
sel.value=on&&!pps?"kbps":"pps";
inp.dataset.cur=on?inp.value+" "+sel.value:"off";
});
});
});
}
function scApply(n){
var cmds=[];
for(var k=0;k<SC_TYPES.length;k++){
var ty=SC_TYPES[k],inp=$("scv"+ty+n),u=$("scu"+ty+n).value,v=inp.value.trim(),want="off";
if(v!==""&&v!=="0"){
var x=Number(v);
if(!Number.isInteger(x)||x<1||(u==="pps"&&x>1048575)||(u==="kbps"&&x>10000000)){toast(t("sc_err"),"err");return;}
want=x+" "+u;
}
if(want!==inp.dataset.cur)cmds.push("storm "+n+" "+ty+" "+want);
}
delete $("scr"+n).dataset.dirty;
if(!cmds.length)return;
postCmds(cmds).then(scLoad).catch(function(){});
}
tabHooks.bw={enter:function(){needPorts(function(){bwLoad().then(scLoad).catch(function(){})})}};
var IPRE=/^(\d{1,3}\.){3}\d{1,3}$/;
function okIp(s){
@@ -1870,7 +1928,7 @@ var CONF_OVERWRITE=[
/^lag\s+\d\b/,/^laghash\s+\d\b/,/^isolate\s+\d{1,2}\b/,
/^stp\s+(prio|hello|maxage|fwd|txhold|version)\b/,
/^stp\s+(port\s+\d{1,2}|lag\s+[1-4])\s+(edge|cost|prio|guard|filter|p2p)\b/,
/^igmp\b/,/^mtu\s+\d{1,2}\b/,
/^igmp\b/,/^mtu\s+\d{1,2}\b/,/^storm\s+\d{1,2}\s+(bcast|mcast|ucast|umcast)\b/,
];
var CONF_TOGGLE=[/^(syslog)\s+(on|off)$/,/^(stp)\s+(on|off)$/,/^(stp\s+(port\s+\d{1,2}|lag\s+[1-4]))\s+(on|off)$/];
function mergeConf(base,texts){
+6
View File
@@ -351,6 +351,12 @@ button.danger{background:var(--bad);color:#fff;border-color:transparent}
<thead><tr><th data-i18n="c_port">Port</th><th data-i18n="bw_in">Ingress limit</th><th>Mbit/s</th><th data-i18n="bw_exceed">When exceeded</th><th data-i18n="bw_out">Egress limit</th><th>Mbit/s</th><th></th></tr></thead>
<tbody></tbody></table></div>
</div>
<div class="card"><h2><span data-i18n="sc_title">Storm control</span> <span class="hint" data-i18n="sc_h">per port and traffic type, empty = off</span></h2>
<div class="scrollx"><table class="t" id="sctable">
<thead><tr><th data-i18n="c_port">Port</th><th data-i18n="sc_bcast">Broadcast</th><th data-i18n="sc_mcast">Multicast</th><th data-i18n="sc_ucast">Unknown unicast</th><th data-i18n="sc_umcast">Unknown multicast</th><th></th></tr></thead>
<tbody></tbody></table></div>
<p class="small mut" style="margin-top:8px" data-i18n="sc_note">Frames of a type above its limit are dropped where they enter the switch.</p>
</div>
</section>
<section class="tab" id="tab-system">