cosmetics
[tomato.git] / release / src / router / www / qos-settings.asp
blob8ecbf849216ade10aebbf8d390cec2dcb5d255ae
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 pctList = [[0, 'None']];
32 for (i = 1; i <= 100; ++i) pctList.push([i, i + '%']);
34 function oscale(rate, ceil)
36 if (rate <= 0) return '';
37 var b = E('_qos_obw').value;
38 var s = comma(MAX(Math.floor((b * rate) / 100), 1));
39 if (ceil > 0) s += ' - ' + MAX(Math.round((b * ceil) / 100), 1);
40 return s + ' <small>kbit/s</small>';
43 function toggleFiltersVisibility(){
44 if(E('qosclassnames').style.display=='')
45 E('qosclassnames').style.display='none';
46 else
47 E('qosclassnames').style.display='';
50 function iscale(ceil)
52 if (ceil < 1) return '';
53 return comma(MAX(Math.floor((E('_qos_ibw').value * ceil) / 100), 1)) + ' <small>kbit/s</small>';
56 function verifyFields(focused, quiet)
58 var i, e, b, f;
60 if (!v_range('_qos_obw', quiet, 10, 999999)) return 0;
61 for (i = 0; i < 10; ++i) {
62 elem.setInnerHTML('_okbps_' + i, oscale(E('_f_orate_' + i).value, E('_f_oceil_' + i).value));
65 if (!v_range('_qos_ibw', quiet, 10, 999999)) return 0;
66 for (i = 0; i < 10; ++i) {
67 elem.setInnerHTML('_ikbps_' + i, iscale(E('_f_iceil_' + i).value));
70 f = E('_fom').elements;
71 b = !E('_f_qos_enable').checked;
72 for (i = 0; i < f.length; ++i) {
73 if ((f[i].name.substr(0, 1) != '_') && (f[i].type != 'button') && (f[i].name.indexOf('enable') == -1) &&
74 (f[i].name.indexOf('ne_v') == -1)) f[i].disabled = b;
77 var abg = ['alpha', 'beta', 'gamma'];
78 b = E('_f_ne_vegas').checked;
79 for (i = 0; i < 3; ++i) {
80 f = E('_ne_v' + abg[i]);
81 f.disabled = !b;
82 if (b) {
83 if (!v_range(f, quiet, 0, 65535)) return 0;
87 return 1;
90 function save()
92 var fom = E('_fom');
93 var i, a, qos, c;
96 fom.qos_enable.value = E('_f_qos_enable').checked ? 1 : 0;
97 fom.qos_ack.value = E('_f_qos_ack').checked ? 1 : 0;
98 fom.qos_syn.value = E('_f_qos_syn').checked ? 1 : 0;
99 fom.qos_fin.value = E('_f_qos_fin').checked ? 1 : 0;
100 fom.qos_rst.value = E('_f_qos_rst').checked ? 1 : 0;
101 fom.qos_icmp.value = E('_f_qos_icmp').checked ? 1 : 0;
102 fom.qos_reset.value = E('_f_qos_reset').checked ? 1 : 0;
104 qos = [];
105 for (i = 1; i < 11; ++i) {
106 qos.push(E('_f_qos_' + (i - 1)).value);
109 fom = E('_fom');
110 fom.qos_classnames.value = qos.join(' ');
112 a = [];
113 for (i = 0; i < 10; ++i) {
114 a.push(E('_f_orate_' + i).value + '-' + E('_f_oceil_' + i).value);
116 fom.qos_orates.value = a.join(',');
118 a = [];
119 for (i = 0; i < 10; ++i) {
120 a.push(E('_f_iceil_' + i).value);
122 fom.qos_irates.value = a.join(',');
124 fom.ne_vegas.value = E('_f_ne_vegas').checked ? 1 : 0;
126 form.submit(fom, 1);
131 </script>
133 </head>
134 <body>
135 <form id='_fom' method='post' action='tomato.cgi'>
136 <table id='container' cellspacing=0>
137 <tr><td colspan=2 id='header'>
138 <div class='title'>Tomato</div>
139 <div class='version'>Version <% version(); %></div>
140 </td></tr>
141 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
142 <td id='content'>
143 <div id='ident'><% ident(); %></div>
145 <!-- / / / -->
148 <input type='hidden' name='_nextpage' value='qos-settings.asp'>
149 <input type='hidden' name='_service' value='qos-restart'>
151 <input type='hidden' name='qos_classnames'>
152 <input type='hidden' name='qos_enable'>
153 <input type='hidden' name='qos_ack'>
154 <input type='hidden' name='qos_syn'>
155 <input type='hidden' name='qos_fin'>
156 <input type='hidden' name='qos_rst'>
157 <input type='hidden' name='qos_icmp'>
158 <input type='hidden' name='qos_orates'>
159 <input type='hidden' name='qos_irates'>
160 <input type='hidden' name='qos_reset'>
161 <input type='hidden' name='ne_vegas'>
165 <div class='section-title'>Basic Settings</div>
166 <div class='section'>
167 <script type='text/javascript'>
169 classList = [];
170 for (i = 0; i < 10; ++i) {
171 classList.push([i, classNames[i]]);
173 createFieldTable('', [
174 { title: 'Enable QoS', name: 'f_qos_enable', type: 'checkbox', value: nvram.qos_enable == '1' },
175 { title: 'Prioritize small packets with these control flags', multi: [
176 { suffix: ' ACK &nbsp;', name: 'f_qos_ack', type: 'checkbox', value: nvram.qos_ack == '1' },
177 { suffix: ' SYN &nbsp;', name: 'f_qos_syn', type: 'checkbox', value: nvram.qos_syn == '1' },
178 { suffix: ' FIN &nbsp;', name: 'f_qos_fin', type: 'checkbox', value: nvram.qos_fin == '1' },
179 { suffix: ' RST &nbsp;', name: 'f_qos_rst', type: 'checkbox', value: nvram.qos_rst == '1' }
180 ] },
181 { title: 'Prioritize ICMP', name: 'f_qos_icmp', type: 'checkbox', value: nvram.qos_icmp == '1' },
182 { title: 'Reset class when changing settings', name: 'f_qos_reset', type: 'checkbox', value: nvram.qos_reset == '1' },
183 { title: 'Default class', name: 'qos_default', type: 'select', options: classList, value: nvram.qos_default },
184 /* REMOVE-BEGIN
185 !!TB - added qos_pfifo
186 REMOVE-END */
187 { title: 'Qdisc Scheduler', name: 'qos_pfifo', type: 'select', options: [['0','sfq'],['1','pfifo']], value: nvram.qos_pfifo }
189 </script>
190 </div>
194 <div class='section-title'>Outbound Rates / Limits</div>
195 <div class='section'>
196 <script type='text/javascript'>
197 cc = nvram.qos_orates.split(/[,-]/);
198 f = [];
199 f.push({ title: 'Max Bandwidth Limit', name: 'qos_obw', type: 'text', maxlen: 6, size: 8, suffix: ' <small>kbit/s</small>', value: nvram.qos_obw });
200 f.push(null);
201 j = 0;
202 for (i = 0; i < 10; ++i) {
203 x = cc[j++] || 1;
204 y = cc[j++] || 1;
205 f.push({ title: classNames[i], multi: [
206 { name: 'f_orate_' + i, type: 'select', options: pctList, value: x, suffix: ' ' },
207 { name: 'f_oceil_' + i, type: 'select', options: pctList, value: y },
208 { type: 'custom', custom: ' &nbsp; <span id="_okbps_' + i + '"></span>' } ]
211 createFieldTable('', f);
212 </script>
213 </div>
217 <div class='section-title'>Inbound Class Limits</div>
218 <div class='section'>
219 <script type='text/javascript'>
220 rates = nvram.qos_irates.split(',');
221 f = [];
222 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</small>', value: nvram.qos_ibw });
223 f.push(null);
224 for (i = 0; i < 10; ++i) {
225 f.push({ title: classNames[i], multi: [
226 { name: 'f_iceil_' + i, type: 'select', options: pctList, value: rates[i] },
227 { custom: ' &nbsp; <span id="_ikbps_' + i + '"></span>' } ]
230 createFieldTable('', f);
231 </script>
232 </div>
234 <div class='section-title'>QOS Class Names <small><i><a href='javascript:toggleFiltersVisibility();'>(Toggle Visibility)</a></i></small></div>
235 <div class='section' id='qosclassnames' style='display:none'>
236 <script type='text/javascript'>
238 if ((v = nvram.qos_classnames.match(/^(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)$/)) == null) {
239 v = ["-","Highest","High","Medium","Low","Lowest","A","B","C","D","E"];
241 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'];
242 f = [{ title: ' ', text: '<small>(Maximum 10 characters, no spaces)</small>' }];
243 for (i = 1; i < 11; ++i) {
244 f.push({ title: titles[i], name: ('f_qos_' + (i - 1)),
245 type: 'text', maxlen: 10, size: 15, value: v[i],
246 suffix: '<span id="count' + i + '"></span>' });
248 createFieldTable('', f);
249 </script>
250 </div>
254 <span id='s_vegas' style='display:none'>
255 <div class='section-title'>TCP Vegas <small>(network congestion control)</small></div>
256 <div class='section'>
257 <script type='text/javascript'>
258 /* move me? */
259 createFieldTable('', [
260 { title: 'Enable TCP Vegas', name: 'f_ne_vegas', type: 'checkbox', value: nvram.ne_vegas == '1' },
261 { title: 'Alpha', name: 'ne_valpha', type: 'text', maxlen: 6, size: 8, value: nvram.ne_valpha },
262 { title: 'Beta', name: 'ne_vbeta', type: 'text', maxlen: 6, size: 8, value: nvram.ne_vbeta },
263 { title: 'Gamma', name: 'ne_vgamma', type: 'text', maxlen: 6, size: 8, value: nvram.ne_vgamma }
265 </script>
266 </div>
267 </span>
269 <!-- / / / -->
271 </td></tr>
272 <tr><td id='footer' colspan=2>
273 <span id='footer-msg'></span>
274 <input type='button' value='Save' id='save-button' onclick='save()'>
275 <input type='button' value='Cancel' id='cancel-button' onclick='reloadPage();'>
276 </td></tr>
277 </table>
278 </form>
279 <script type='text/javascript'>verifyFields(null, 1);</script>
280 </body>
281 </html>