1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML
4.0//EN'
>
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.
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>
20 <script type='text/javascript' src='debug.js'
></script>
22 <script type='text/javascript'
>
25 !!TB - added qos_pfifo
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';
47 E('qosclassnames').style
.display
='';
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
)
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
]);
83 if (!v_range(f
, quiet
, 0, 65535)) return 0;
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;
105 for (i
= 1; i
< 11; ++i
) {
106 qos
.push(E('_f_qos_' + (i
- 1)).value
);
110 fom
.qos_classnames
.value
= qos
.join(' ');
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(',');
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;
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>
141 <tr id='body'
><td id='navi'
><script type='text/javascript'
>navi()</script></td>
143 <div id='ident'
><%
ident(); %></div>
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'
>
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 ', name
: 'f_qos_ack', type
: 'checkbox', value
: nvram
.qos_ack
== '1' },
177 { suffix
: ' SYN ', name
: 'f_qos_syn', type
: 'checkbox', value
: nvram
.qos_syn
== '1' },
178 { suffix
: ' FIN ', name
: 'f_qos_fin', type
: 'checkbox', value
: nvram
.qos_fin
== '1' },
179 { suffix
: ' RST ', name
: 'f_qos_rst', type
: 'checkbox', value
: nvram
.qos_rst
== '1' }
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
},
185 !!TB - added qos_pfifo
187 { title
: 'Qdisc Scheduler', name
: 'qos_pfifo', type
: 'select', options
: [['0','sfq'],['1','pfifo']], value
: nvram
.qos_pfifo
}
194 <div class='section-title'
>Outbound Rates / Limits
</div>
195 <div class='section'
>
196 <script type='text/javascript'
>
197 cc
= nvram
.qos_orates
.split(/[,-]/);
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
});
202 for (i
= 0; i
< 10; ++i
) {
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
: ' <span id="_okbps_' + i
+ '"></span>' } ]
211 createFieldTable('', f
);
217 <div class='section-title'
>Inbound Class Limits
</div>
218 <div class='section'
>
219 <script type='text/javascript'
>
220 rates
= nvram
.qos_irates
.split(',');
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
});
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
: ' <span id="_ikbps_' + i
+ '"></span>' } ]
230 createFieldTable('', f
);
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
);
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'
>
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
}
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();'
>
279 <script type='text/javascript'
>verifyFields(null, 1);</script>