cosmetics, various
[tomato.git] / release / src / router / www / qos-settings.asp
blobf9e0615a489bc5297748d6218bffb712785081ec
1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0//EN'>
2 <!--
3 Tomato GUI
4 Copyright (C) 2006-2010 Jonathan Zarate
5 http://www.polarcloud.com/tomato/
7 For use with Tomato Firmware only.
8 No part of this file may be used without permission.
9 -->
10 <html>
11 <head>
12 <meta http-equiv='content-type' content='text/html;charset=utf-8'>
13 <meta name='robots' content='noindex,nofollow'>
14 <title>[<% ident(); %>] QoS: Basic Settings</title>
15 <link rel='stylesheet' type='text/css' href='tomato.css'>
16 <link rel='stylesheet' type='text/css' href='color.css'>
17 <script type='text/javascript' src='tomato.js'></script>
19 <!-- / / / -->
20 <script type='text/javascript' src='debug.js'></script>
22 <script type='text/javascript'>
24 /* REMOVE-BEGIN
25 !!TB - added qos_pfifo
26 REMOVE-END */
27 // <% nvram("qos_classnames,qos_enable,qos_ack,qos_syn,qos_fin,qos_rst,qos_icmp,qos_default,qos_pfifo,qos_obw,qos_ibw,qos_orates,qos_irates,qos_reset,ne_vegas,ne_valpha,ne_vbeta,ne_vgamma"); %>
29 var classNames = nvram.qos_classnames.split(' '); // Toastman - configurable class names
31 pctListin = [[0, 'No Limit']];
32 for (i = 1; i <= 100; ++i) pctListin.push([i, i + '%']);
34 pctListout = [[0, '0']];
35 for (i = 1; i <= 100; ++i) pctListout.push([i, i + '%']);
37 function oscale(rate, ceil)
39 if (rate <= 0) return '';
40 var b = E('_qos_obw').value;
41 var s = comma(MAX(Math.floor((b * rate) / 100), 1));
42 if (ceil > 0) s += ' - ' + MAX(Math.round((b * ceil) / 100), 1);
43 return s + ' <small>kbit/s</small>';
46 function toggleFiltersVisibility(){
47 if(E('qosclassnames').style.display=='')
48 E('qosclassnames').style.display='none';
49 else
50 E('qosclassnames').style.display='';
53 function iscale(ceil)
55 if (ceil < 1) return '';
56 return comma(MAX(Math.floor((E('_qos_ibw').value * ceil) / 100), 1)) + ' <small>kbit/s</small>';
59 function verifyFields(focused, quiet)
61 var i, e, b, f;
63 if (!v_range('_qos_obw', quiet, 10, 999999)) return 0;
64 for (i = 0; i < 10; ++i) {
65 elem.setInnerHTML('_okbps_' + i, oscale(E('_f_orate_' + i).value, E('_f_oceil_' + i).value));
68 if (!v_range('_qos_ibw', quiet, 10, 999999)) return 0;
69 for (i = 0; i < 10; ++i) {
70 elem.setInnerHTML('_ikbps_' + i, iscale(E('_f_iceil_' + i).value));
73 f = E('_fom').elements;
74 b = !E('_f_qos_enable').checked;
75 for (i = 0; i < f.length; ++i) {
76 if ((f[i].name.substr(0, 1) != '_') && (f[i].type != 'button') && (f[i].name.indexOf('enable') == -1) &&
77 (f[i].name.indexOf('ne_v') == -1)) f[i].disabled = b;
80 var abg = ['alpha', 'beta', 'gamma'];
81 b = E('_f_ne_vegas').checked;
82 for (i = 0; i < 3; ++i) {
83 f = E('_ne_v' + abg[i]);
84 f.disabled = !b;
85 if (b) {
86 if (!v_range(f, quiet, 0, 65535)) return 0;
90 return 1;
93 function save()
95 var fom = E('_fom');
96 var i, a, qos, c;
99 fom.qos_enable.value = E('_f_qos_enable').checked ? 1 : 0;
100 fom.qos_ack.value = E('_f_qos_ack').checked ? 1 : 0;
101 fom.qos_syn.value = E('_f_qos_syn').checked ? 1 : 0;
102 fom.qos_fin.value = E('_f_qos_fin').checked ? 1 : 0;
103 fom.qos_rst.value = E('_f_qos_rst').checked ? 1 : 0;
104 fom.qos_icmp.value = E('_f_qos_icmp').checked ? 1 : 0;
105 fom.qos_reset.value = E('_f_qos_reset').checked ? 1 : 0;
107 qos = [];
108 for (i = 1; i < 11; ++i) {
109 qos.push(E('_f_qos_' + (i - 1)).value);
112 fom = E('_fom');
113 fom.qos_classnames.value = qos.join(' ');
115 a = [];
116 for (i = 0; i < 10; ++i) {
117 a.push(E('_f_orate_' + i).value + '-' + E('_f_oceil_' + i).value);
119 fom.qos_orates.value = a.join(',');
121 a = [];
122 for (i = 0; i < 10; ++i) {
123 a.push(E('_f_iceil_' + i).value);
125 fom.qos_irates.value = a.join(',');
127 fom.ne_vegas.value = E('_f_ne_vegas').checked ? 1 : 0;
129 form.submit(fom, 1);
134 </script>
136 </head>
137 <body>
138 <form id='_fom' method='post' action='tomato.cgi'>
139 <table id='container' cellspacing=0>
140 <tr><td colspan=2 id='header'>
141 <div class='title'>Tomato</div>
142 <div class='version'>Version <% version(); %></div>
143 </td></tr>
144 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
145 <td id='content'>
146 <div id='ident'><% ident(); %></div>
148 <!-- / / / -->
151 <input type='hidden' name='_nextpage' value='qos-settings.asp'>
152 <input type='hidden' name='_service' value='qos-restart'>
154 <input type='hidden' name='qos_classnames'>
155 <input type='hidden' name='qos_enable'>
156 <input type='hidden' name='qos_ack'>
157 <input type='hidden' name='qos_syn'>
158 <input type='hidden' name='qos_fin'>
159 <input type='hidden' name='qos_rst'>
160 <input type='hidden' name='qos_icmp'>
161 <input type='hidden' name='qos_orates'>
162 <input type='hidden' name='qos_irates'>
163 <input type='hidden' name='qos_reset'>
164 <input type='hidden' name='ne_vegas'>
168 <div class='section-title'>Basic Settings</div>
169 <div class='section'>
170 <script type='text/javascript'>
172 classList = [];
173 for (i = 0; i < 10; ++i) {
174 classList.push([i, classNames[i]]);
176 createFieldTable('', [
177 { title: 'Enable QoS', name: 'f_qos_enable', type: 'checkbox', value: nvram.qos_enable == '1' },
178 { title: 'Prioritize small packets with these control flags', multi: [
179 { suffix: ' ACK &nbsp;', name: 'f_qos_ack', type: 'checkbox', value: nvram.qos_ack == '1' },
180 { suffix: ' SYN &nbsp;', name: 'f_qos_syn', type: 'checkbox', value: nvram.qos_syn == '1' },
181 { suffix: ' FIN &nbsp;', name: 'f_qos_fin', type: 'checkbox', value: nvram.qos_fin == '1' },
182 { suffix: ' RST &nbsp;', name: 'f_qos_rst', type: 'checkbox', value: nvram.qos_rst == '1' }
183 ] },
184 { title: 'Prioritize ICMP', name: 'f_qos_icmp', type: 'checkbox', value: nvram.qos_icmp == '1' },
185 { title: 'Reset class when changing settings', name: 'f_qos_reset', type: 'checkbox', value: nvram.qos_reset == '1' },
186 { title: 'Default class', name: 'qos_default', type: 'select', options: classList, value: nvram.qos_default },
187 /* REMOVE-BEGIN
188 !!TB - added qos_pfifo
189 REMOVE-END */
190 { title: 'Qdisc Scheduler', name: 'qos_pfifo', type: 'select', options: [['0','sfq'],['1','pfifo']], value: nvram.qos_pfifo }
192 </script>
193 </div>
197 <div class='section-title'>Outbound Rates / Limits</div>
198 <div class='section'>
199 <script type='text/javascript'>
200 cc = nvram.qos_orates.split(/[,-]/);
201 f = [];
202 f.push({ title: 'Max Bandwidth Limit', name: 'qos_obw', type: 'text', maxlen: 6, size: 8, suffix: ' <small>kbit/s (Set to measured bandwidth less 15-30%)</small>', value: nvram.qos_obw });
203 f.push(null);
204 j = 0;
205 for (i = 0; i < 10; ++i) {
206 x = cc[j++] || 1;
207 y = cc[j++] || 1;
208 f.push({ title: classNames[i], multi: [
209 { name: 'f_orate_' + i, type: 'select', options: pctListout, value: x, suffix: ' ' },
210 { name: 'f_oceil_' + i, type: 'select', options: pctListout, value: y },
211 { type: 'custom', custom: ' &nbsp; <span id="_okbps_' + i + '"></span>' } ]
214 createFieldTable('', f);
215 </script>
216 </div>
220 <div class='section-title'>Inbound Class Limits</div>
221 <div class='section'>
222 <script type='text/javascript'>
223 rates = nvram.qos_irates.split(',');
224 f = [];
225 f.push({ title: 'Max Available Bandwidth <small>(this is NOT an overall limit!)</small>', name: 'qos_ibw', type: 'text', maxlen: 6, size: 8, suffix: ' <small>kbit/s (Set to measured bandwidth less 15-30%)</small>', value: nvram.qos_ibw });
226 f.push(null);
227 for (i = 0; i < 10; ++i) {
228 f.push({ title: classNames[i], multi: [
229 { name: 'f_iceil_' + i, type: 'select', options: pctListin, value: rates[i] },
230 { custom: ' &nbsp; <span id="_ikbps_' + i + '"></span>' } ]
233 createFieldTable('', f);
234 </script>
235 </div>
237 <div class='section-title'>QOS Class Names <small><i><a href='javascript:toggleFiltersVisibility();'>(Toggle Visibility)</a></i></small></div>
238 <div class='section' id='qosclassnames' style='display:none'>
239 <script type='text/javascript'>
241 if ((v = nvram.qos_classnames.match(/^(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)$/)) == null) {
242 v = ["-","Highest","High","Medium","Low","Lowest","A","B","C","D","E"];
244 titles = ['-','Priority Class 1', 'Priority Class 2', 'Priority Class 3', 'Priority Class 4', 'Priority Class 5', 'Priority Class 6', 'Priority Class 7', 'Priority Class 8', 'Priority Class 9', 'Priority Class 10'];
245 f = [{ title: ' ', text: '<small>(Maximum 10 characters, no spaces)</small>' }];
246 for (i = 1; i < 11; ++i) {
247 f.push({ title: titles[i], name: ('f_qos_' + (i - 1)),
248 type: 'text', maxlen: 10, size: 15, value: v[i],
249 suffix: '<span id="count' + i + '"></span>' });
251 createFieldTable('', f);
252 </script>
253 </div>
257 <span id='s_vegas' style='display:none'>
258 <div class='section-title'>TCP Vegas <small>(network congestion control)</small></div>
259 <div class='section'>
260 <script type='text/javascript'>
261 /* move me? */
262 createFieldTable('', [
263 { title: 'Enable TCP Vegas', name: 'f_ne_vegas', type: 'checkbox', value: nvram.ne_vegas == '1' },
264 { title: 'Alpha', name: 'ne_valpha', type: 'text', maxlen: 6, size: 8, value: nvram.ne_valpha },
265 { title: 'Beta', name: 'ne_vbeta', type: 'text', maxlen: 6, size: 8, value: nvram.ne_vbeta },
266 { title: 'Gamma', name: 'ne_vgamma', type: 'text', maxlen: 6, size: 8, value: nvram.ne_vgamma }
268 </script>
269 </div>
270 </span>
272 <!-- / / / -->
274 </td></tr>
275 <tr><td id='footer' colspan=2>
276 <span id='footer-msg'></span>
277 <input type='button' value='Save' id='save-button' onclick='save()'>
278 <input type='button' value='Cancel' id='cancel-button' onclick='reloadPage();'>
279 </td></tr>
280 </table>
281 </form>
282 <script type='text/javascript'>verifyFields(null, 1);</script>
283 </body>
284 </html>