You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
398 lines
12 KiB
Plaintext
398 lines
12 KiB
Plaintext
<!DOCTYPE html>
|
|
<!--
|
|
Tomato GUI
|
|
Copyright (C) 2006-2008 Jonathan Zarate
|
|
http://www.polarcloud.com/tomato/
|
|
|
|
Copyright (C) 2011 Deon 'PrinceAMD' Thomas
|
|
rate limit & connection limit from Conanxu,
|
|
adapted by Victek, Shibby, PrinceAMD, Phykris
|
|
|
|
For use with Tomato Firmware only.
|
|
No part of this file may be used without permission.
|
|
-->
|
|
<html lang="en-GB">
|
|
<head>
|
|
<meta http-equiv="content-type" content="text/html;charset=utf-8">
|
|
<meta name="robots" content="noindex,nofollow">
|
|
<title>[<% ident(); %>] IP/Range BW Limiter</title>
|
|
<link rel="stylesheet" type="text/css" href="tomato.css?rel=<% version(); %>">
|
|
<% css(); %>
|
|
<script src="tomato.js?rel=<% version(); %>"></script>
|
|
|
|
<script>
|
|
|
|
// <% nvram("bwl_enable,wan_qos_ibw,wan_qos_obw,bwl_rules,lan_ipaddr,lan_netmask,bwl_br0_enable,bwl_br0_dlr,bwl_br0_dlc,bwl_br0_ulr,bwl_br0_ulc,bwl_br0_udp,bwl_br0_tcp,bwl_br0_prio,bwl_br1_enable,bwl_br1_dlc,bwl_br1_dlr,bwl_br1_ulc,bwl_br1_ulr,bwl_br1_prio,bwl_br2_enable,bwl_br2_dlc,bwl_br2_dlr,bwl_br2_ulc,bwl_br2_ulr,bwl_br2_prio,bwl_br3_enable,bwl_br3_dlc,bwl_br3_dlr,bwl_br3_ulc,bwl_br3_ulr,bwl_br3_prio,ctf_disable,bcmnat_disable,lan_ifname,lan1_ifname,lan2_ifname,lan3_ifname"); %>
|
|
|
|
var class_prio = [['0','Highest'],['1','High'],['2','Normal'],['3','Low'],['4','Lowest']];
|
|
var class_tcp = [['0','nolimit']];
|
|
var class_udp = [['0','nolimit']];
|
|
for (var i = 1; i <= 100; ++i) {
|
|
class_tcp.push([i*10, i*10+'']);
|
|
class_udp.push([i, i+'/s']);
|
|
}
|
|
|
|
var bwlg = new TomatoGrid();
|
|
|
|
bwlg.setup = function() {
|
|
this.init('bwlg-grid', '', 80, [
|
|
{ type: 'checkbox', prefix: '<div class="centered">', suffix: '<\/div>' },
|
|
{ type: 'text', maxlen: 31 },
|
|
{ type: 'text', maxlen: 8 },
|
|
{ type: 'text', maxlen: 8 },
|
|
{ type: 'text', maxlen: 8 },
|
|
{ type: 'text', maxlen: 8 },
|
|
{ type: 'select', options: class_prio },
|
|
{ type: 'select', options: class_tcp },
|
|
{ type: 'select', options: class_udp },
|
|
{ type: 'text', maxlen: 31 }]);
|
|
|
|
this.headerSet(['Enable','IP | IP Range | MAC','DLRate','DLCeil','ULRate','ULCeil','Priority','TCP Limit','UDP Limit','Description']);
|
|
/* 1<192.168.1.1<4096<4096<2048<2048<2<0<0<desc> */
|
|
var bwllimitrules = nvram.bwl_rules.split('>');
|
|
for (var i = 0; i < bwllimitrules.length; ++i) {
|
|
var t = bwllimitrules[i].split('<');
|
|
if (t.length == 8) { /* compat */
|
|
t.unshift('1');
|
|
t.push('');
|
|
this.insertData(-1, t);
|
|
}
|
|
else if (t.length == 10)
|
|
this.insertData(-1, t);
|
|
}
|
|
this.showNewEditor();
|
|
this.resetNewEditor();
|
|
}
|
|
|
|
bwlg.resetNewEditor = function() {
|
|
var f, c, n;
|
|
|
|
var f = fields.getAll(this.newEditor);
|
|
ferror.clearAll(f);
|
|
|
|
f[0].onchange = '';
|
|
f[2].value = '';
|
|
f[3].value = '';
|
|
f[4].value = '';
|
|
f[5].value = '';
|
|
f[6].selectedIndex = '2';
|
|
f[7].selectedIndex = '0';
|
|
f[8].selectedIndex = '0';
|
|
|
|
if ((c = cookie.get('addbwlimit')) != null) {
|
|
cookie.set('addbwlimit', '', 0);
|
|
c = c.split(',');
|
|
if (c.length == 2) {
|
|
f[0].checked = 'checked';
|
|
f[1].value = c[0];
|
|
f[9].value = c[1].substr(0, 30);
|
|
return;
|
|
}
|
|
}
|
|
|
|
f[0].checked = '';
|
|
f[1].value = '';
|
|
f[9].value = '';
|
|
}
|
|
|
|
bwlg.dataToView = function(row) {
|
|
return ['<input type="checkbox" disabled'+(row[0] != 0 ? ' checked' : '')+'>',row[1],row[2]+'kbps',row[3]+'kbps',row[4]+'kbps',row[5]+'kbps',class_prio[row[6]*1][1],class_tcp[row[7]*1/10][1],class_udp[row[8]*1][1],row[9]];
|
|
}
|
|
|
|
bwlg.dataToFieldValues = function(row) {
|
|
return [row[0] == 1,row[1],row[2],row[3],row[4],row[5],row[6],row[7],row[8],row[9]];
|
|
}
|
|
|
|
bwlg.fieldValuesToData = function(row) {
|
|
var f = fields.getAll(row);
|
|
return ([f[0].checked ? '1' : '0',f[1].value,f[2].value,f[3].value,f[4].value,f[5].value,f[6].value,f[7].value,f[8].value,f[9].value]);
|
|
}
|
|
|
|
bwlg.exist = function(f, v) {
|
|
var data = this.getAllData();
|
|
for (var i = 0; i < data.length; ++i) {
|
|
if (data[i][f] == v)
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bwlg.existIP = function(ip) {
|
|
if (ip == '0.0.0.0')
|
|
return true;
|
|
|
|
return this.exist(1, ip);
|
|
}
|
|
|
|
bwlg.checkRate = function(rate) {
|
|
var s = parseInt(rate, 10);
|
|
if (isNaN(s) || s <= 0 || s >= 100000000)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
bwlg.checkRateCeil = function(rate, ceil) {
|
|
var r = parseInt(rate, 10);
|
|
var c = parseInt(ceil, 10);
|
|
if (r > c)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
bwlg.verifyFields = function(row, quiet) {
|
|
var ok = 1;
|
|
var f = fields.getAll(row);
|
|
|
|
if (v_macip(f[1], quiet, 0, nvram.lan_ipaddr, nvram.lan_netmask)) {
|
|
if (this.existIP(f[1].value)) {
|
|
ferror.set(f[1], 'Duplicate IP or MAC address', quiet);
|
|
ok = 0;
|
|
}
|
|
}
|
|
else
|
|
ok = 0;
|
|
|
|
if (this.checkRate(f[2].value)) {
|
|
ferror.set(f[2], 'DLRate must be between 1 and 99999999', quiet);
|
|
ok = 0;
|
|
}
|
|
|
|
if (this.checkRate(f[3].value)) {
|
|
ferror.set(f[3], 'DLCeil must be between 1 and 99999999', quiet);
|
|
ok = 0;
|
|
}
|
|
|
|
if (this.checkRateCeil(f[2].value, f[3].value)) {
|
|
ferror.set(f[3], 'DLCeil must be greater than DLRate', quiet);
|
|
ok = 0;
|
|
}
|
|
|
|
if (this.checkRate(f[4].value)) {
|
|
ferror.set(f[4], 'ULRate must be between 1 and 99999999', quiet);
|
|
ok = 0;
|
|
}
|
|
|
|
if (this.checkRate(f[5].value)) {
|
|
ferror.set(f[5], 'ULCeil must be between 1 and 99999999', quiet);
|
|
ok = 0;
|
|
}
|
|
|
|
if (this.checkRateCeil(f[4].value, f[5].value)) {
|
|
ferror.set(f[5], 'ULCeil must be greater than ULRate', quiet);
|
|
ok = 0;
|
|
}
|
|
|
|
if (f[9].value.indexOf('>') >= 0 || f[9].value.indexOf('<') >= 0) {
|
|
ferror.set(f[9], 'Description cannot contain "<" or ">" characters', quiet);
|
|
ok = 0;
|
|
}
|
|
|
|
return ok;
|
|
}
|
|
|
|
function verifyFields(focused, quiet) {
|
|
var a = !E('_f_bwl_enable').checked;
|
|
|
|
E('_wan_qos_ibw').disabled = a;
|
|
E('_wan_qos_obw').disabled = a;
|
|
|
|
for (var i = 0; i <= MAX_BRIDGE_ID; i++) {
|
|
var j = (i == 0) ? '' : i.toString();
|
|
E('_f_bwl_br'+i+'_enable').disabled = (a || (nvram['lan'+j+'_ifname'].length < 1));
|
|
|
|
if (nvram['lan'+j+'_ifname'].length < 1)
|
|
E('_f_bwl_br'+i+'_enable').checked = 0;
|
|
|
|
var b = !E('_f_bwl_br'+i+'_enable').checked;
|
|
E('_bwl_br'+i+'_dlr').disabled = b || a;
|
|
E('_bwl_br'+i+'_dlc').disabled = b || a;
|
|
E('_bwl_br'+i+'_ulr').disabled = b || a;
|
|
E('_bwl_br'+i+'_ulc').disabled = b || a;
|
|
E('_bwl_br'+i+'_prio').disabled = b || a;
|
|
elem.display(PR('_bwl_br'+i+'_dlr'), PR('_bwl_br'+i+'_dlc'), PR('_bwl_br'+i+'_ulr'), PR('_bwl_br'+i+'_ulc'), PR('_bwl_br'+i+'_prio'), !a && !b);
|
|
|
|
if (i == 0){
|
|
E('_bwl_br0_tcp').disabled = b || a;
|
|
E('_bwl_br0_udp').disabled = b || a;
|
|
elem.display(PR('_bwl_br0_tcp'), PR('_bwl_br0_udp'), !a && !b);
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
function save() {
|
|
if (bwlg.isEditing())
|
|
return;
|
|
|
|
var data = bwlg.getAllData();
|
|
var bwllimitrules = '';
|
|
var i;
|
|
|
|
if (data.length != 0)
|
|
bwllimitrules += data[0].join('<');
|
|
|
|
for (i = 1; i < data.length; ++i) {
|
|
bwllimitrules += '>'+data[i].join('<');
|
|
}
|
|
|
|
var fom = E('t_fom');
|
|
fom.bwl_enable.value = fom._f_bwl_enable.checked ? 1 : 0;
|
|
|
|
for (var i = 0; i <= MAX_BRIDGE_ID; i++) {
|
|
fom['bwl_br'+i+'_enable'].value = fom['_f_bwl_br'+i+'_enable'].checked ? 1 : 0;
|
|
}
|
|
|
|
fom.bwl_rules.value = bwllimitrules;
|
|
form.submit(fom, 1);
|
|
}
|
|
|
|
function earlyInit() {
|
|
bwlg.setup();
|
|
verifyFields(null, 1);
|
|
}
|
|
|
|
function init() {
|
|
/* CTF-BEGIN */
|
|
if (nvram.ctf_disable == 0) {
|
|
E('_f_bwl_enable').disabled = 1;
|
|
E('ctfnotice').style.display = 'block';
|
|
}
|
|
else
|
|
E('ctfnotice').style.display = 'none';
|
|
/* CTF-END */
|
|
/* BCMNAT-BEGIN */
|
|
if (nvram.bcmnat_disable == 0) {
|
|
E('_f_bwl_enable').disabled = 1;
|
|
E('bcmnatnotice').style.display = 'block';
|
|
}
|
|
else
|
|
E('bcmnatnotice').style.display = 'none';
|
|
/* BCMNAT-END */
|
|
|
|
bwlg.recolor();
|
|
}
|
|
</script>
|
|
</head>
|
|
|
|
<body onload="init()">
|
|
<form id="t_fom" method="post" action="tomato.cgi">
|
|
<table id="container">
|
|
<tr><td colspan="2" id="header">
|
|
<div class="title"><a href="/">FreshTomato</a></div>
|
|
<div class="version">Version <% version(); %> on <% nv("t_model_name"); %></div>
|
|
</td></tr>
|
|
<tr id="body"><td id="navi"><script>navi()</script></td>
|
|
<td id="content">
|
|
<div id="ident"><% ident(); %> | <script>wikiLink();</script></div>
|
|
|
|
<!-- / / / -->
|
|
|
|
<input type="hidden" name="_nextpage" value="bwlimit.asp">
|
|
<input type="hidden" name="_nextwait" value="10">
|
|
<input type="hidden" name="_service" value="bwlimit-restart">
|
|
<input type="hidden" name="bwl_enable">
|
|
<input type="hidden" name="bwl_rules">
|
|
|
|
<script>
|
|
for (var i = 0; i <= MAX_BRIDGE_ID; i++) {
|
|
W('<input type="hidden" name="bwl_br'+i+'_enable">');
|
|
}
|
|
</script>
|
|
|
|
<!-- / / / -->
|
|
|
|
<div class="section-title">Bandwidth Limiter for LAN0 (br0)</div>
|
|
<div class="section">
|
|
<!-- CTF-BEGIN -->
|
|
<div class="fields" id="ctfnotice" style="display:none"><div class="about"><b><a href="advanced-misc.asp">CTF is enabled</a> so BW Limiter doesn't work.</b></div></div>
|
|
<!-- CTF-END -->
|
|
<!-- BCMNAT-BEGIN -->
|
|
<div class="fields" id="bcmnatnotice" style="display:none"><div class="about"><b><a href="advanced-misc.asp">Broadcom FastNAT is enabled</a> so BW Limiter doesn't work.</b></div></div>
|
|
<!-- BCMNAT-END -->
|
|
<script>
|
|
createFieldTable('', [
|
|
{ title: 'Enable Limiter', name: 'f_bwl_enable', type: 'checkbox', value: nvram.bwl_enable != '0' },
|
|
{ title: 'Max Available Download <br><small>(same as used in QoS)<\/small>', indent: 2, name: 'wan_qos_ibw', type: 'text', maxlen: 8, size: 8, suffix: ' <small>kbit/s<\/small>', value: nvram.wan_qos_ibw },
|
|
{ title: 'Max Available Upload <br><small>(same as used in QoS)<\/small>', indent: 2, name: 'wan_qos_obw', type: 'text', maxlen: 8, size: 8, suffix: ' <small>kbit/s<\/small>', value: nvram.wan_qos_obw }
|
|
]);
|
|
</script>
|
|
|
|
<div class="tomato-grid" id="bwlg-grid"></div>
|
|
<div>
|
|
<ul>
|
|
<li><b>IP Address / IP Range:</b>
|
|
</li><li>Example: 192.168.1.5 for one IP.
|
|
</li><li>Example: 192.168.1.4-7 for IP 192.168.1.4 to 192.168.1.7
|
|
</li><li>Example: 4-7 for IP Range .4 to .7
|
|
</li><li><b>The IP Range devices will share the Bandwidth</b>
|
|
</li><li><b>MAC Address</b> Example: 00:2E:3C:6A:22:D8
|
|
</li></ul>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- / / / -->
|
|
|
|
<script>
|
|
for (var i = 0; i <= MAX_BRIDGE_ID; i++) {
|
|
|
|
if (i == 0) {
|
|
W('<div class="section-title">Default Class for unlisted MAC / IP\'s in LAN0 (br0)<\/div>');
|
|
} else {
|
|
W('<div class="section-title">Default Class for LAN'+i+' (br'+i+')<\/div>');
|
|
}
|
|
|
|
W('<div class="section">');
|
|
|
|
var f = [];
|
|
f.push(
|
|
{ title: 'Enable', name: 'f_bwl_br'+i+'_enable', type: 'checkbox', value: nvram['bwl_br'+i+'_enable'] == '1'},
|
|
{ title: 'Download rate', indent: 2, name: 'bwl_br'+i+'_dlr', type: 'text', maxlen: 8, size: 8, suffix: ' <small>kbit/s<\/small>', value: nvram['bwl_br'+i+'_dlr'] },
|
|
{ title: 'Download ceil', indent: 2, name: 'bwl_br'+i+'_dlc', type: 'text', maxlen: 8, size: 8, suffix: ' <small>kbit/s<\/small>', value: nvram['bwl_br'+i+'_dlc'] },
|
|
{ title: 'Upload rate', indent: 2, name: 'bwl_br'+i+'_ulr', type: 'text', maxlen: 8, size: 8, suffix: ' <small>kbit/s<\/small>', value: nvram['bwl_br'+i+'_ulr'] },
|
|
{ title: 'Upload ceil', indent: 2, name: 'bwl_br'+i+'_ulc', type: 'text', maxlen: 8, size: 8, suffix: ' <small>kbit/s<\/small>', value: nvram['bwl_br'+i+'_ulc'] },
|
|
{ title: 'Priority', indent: 2, name: 'bwl_br'+i+'_prio', type: 'select', options:
|
|
[['0','Highest'],['1','High'],['2','Normal'],['3','Low'],['4','Lowest']], value: nvram['bwl_br'+i+'_prio'] })
|
|
|
|
if (i == 0) {
|
|
f.push(
|
|
{ title: 'TCP Limit', indent: 2, name: 'bwl_br0_tcp', type: 'select', options:
|
|
[['0', 'no limit'],['1', '1'],['2', '2'],['5', '5'],['10', '10'],['20', '20'],['50', '50'],['100', '100'],['200', '200'],['500', '500'],['1000', '1000']], value: nvram['bwl_br0_tcp'] },
|
|
{ title: 'UDP limit', indent: 2, name: 'bwl_br0_udp', type: 'select', options:
|
|
[['0', 'no limit'],['1', '1/s'],['2', '2/s'],['5', '5/s'],['10', '10/s'],['20', '20/s'],['50', '50/s'],['100', '100/s']], value: nvram['bwl_br0_udp'] })
|
|
}
|
|
|
|
createFieldTable('', f);
|
|
|
|
W('<div>');
|
|
W('<ul>');
|
|
if (i == 0) {
|
|
W('<li><b>Default Class<\/b> - IP / MAC\'s non included in the list will take the Default Rate/Ceiling setting<\/li>');
|
|
W('<li><b>The bandwidth will be shared by all unlisted hosts in br0<\/b><\/li>');
|
|
} else {
|
|
W('<li><b>The bandwidth will be shared by all hosts in br'+i+'.<\/b><\/li>');
|
|
}
|
|
W('<\/ul>');
|
|
W('<\/div>');
|
|
W('<\/div>');
|
|
}
|
|
</script>
|
|
|
|
<!-- / / / -->
|
|
|
|
<div id="footer">
|
|
<span id="footer-msg"></span>
|
|
<input type="button" value="Save" id="save-button" onclick="save()">
|
|
<input type="button" value="Cancel" id="cancel-button" onclick="reloadPage();">
|
|
</div>
|
|
|
|
</td></tr>
|
|
</table>
|
|
</form>
|
|
<script>earlyInit();</script>
|
|
</body>
|
|
</html>
|