mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-10-29 17:54:14 +08:00
storm: limit broadcast, multicast and unknown unicast and multicast per port
This commit is contained in:
1 parent
13b75a73c9
commit
26547f3e01
13 files changed
+312
-3
No files matched your search
+60
-2
@@ -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){
|
||||
|
||||
@@ -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">
|
||||
|
||||
Reference in new issue
Block a user