c7f8013746c17d87e9996daf188b1d43a971ea1c
1 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
2 /* Prometheus QoS - you can "steal fire" from your ISP */
3 /* "fair-per-IP" quality of service (QoS) utility */
4 /* requires Linux 2.4.x or 2.6.x with HTB support */
5 /* Copyright(C) 2005-2015 Michael Polak, Arachne Aerospace */
6 /* iptables-restore support Copyright(C) 2007-2008 ludva */
7 /* Credit: CZFree.Net,Martin Devera,Netdave,Aquarius,Gandalf */
8 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
10 /* Modified by: xChaos, 20151020
13 Prometheus QoS is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2.1 of
16 the License, or (at your option) any later version.
18 Prometheus QoS is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with Prometheus Qos; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
27 GNU General Public License is located in file COPYING */
29 #include "cll1-0.6.2.h"
32 const char *version
= "0.8.5-d";
34 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
35 /* Versions: 0.8.5 is development release, 0.8.6 will be "stable" */
36 /* Official Trac URL: https://dev.arachne.cz/svn/prometheus */
37 /* Official SVN URL: https://dev.arachne.cz/repos/prometheus */
38 /* BTC donations account: 19rriLx8vR19wGefPaMhakqnCYNYwjLvxq */
39 /* CZK donations account: 2900242944/2010 (transparent account) */
40 /* Warning: unofficial Github mirror is not supported by author! */
41 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
43 const char *stats_html_signature
= "<span class=\"small\">Statistics generated by Prometheus QoS version %s<br />GPL+Copyright(C)2005-2015 Michael Polak, <a target=\"_blank\" href=\"http://www.arachne.cz/\">Arachne Labs</a></span>\n";
48 /* ======= All path names are defined here (for RPM patch) ======= */
50 const char *tc
= "/sbin/tc"; /* requires tc with HTB support */
51 const char *iptables
= "/sbin/iptables"; /* requires iptables utility */
52 const char *ip6tables
= "/sbin/ip6tables"; /* requires iptables utility */
53 const char *iptablessave
= "/sbin/iptables-save"; /* not yet required */
54 const char *iptablesrestore
= "/sbin/iptables-restore"; /* requires iptables-restore */
55 const char *ip6tablessave
= "/sbin/ip6tables-save"; /* not yet required */
56 const char *ip6tablesrestore
= "/sbin/ip6tables-restore"; /* requires iptables-restore */
57 const char *ls
= "/bin/ls"; /* this is not user configurable :-) */
59 char *config
= "/etc/prometheus/prometheus.conf"; /* main configuration file */
60 char *hosts
= "/etc/prometheus/hosts"; /* per-IP bandwidth definition file */
61 char *macrosfile
= "/etc/prometheus/prometheus.macros"; /* rewrite rules for most common tariffs */
62 char *iptablesfile
= "/var/spool/prometheus.iptables"; /* temporary file for iptables-restore*/
63 char *ip6tablesfile
= "/var/spool/prometheus.ip6tables"; /* temporary file for ip6tables-restore*/
64 char *credit
= "/var/lib/misc/prometheus.credit"; /* credit log file */
65 char *classmap
= "/var/lib/misc/prometheus.classes"; /* credit log file */
66 char *html
= "/var/www/traffic.html"; /* hall of fame - html version */
67 char *preview
= "/var/www/preview.html"; /* hall of fame preview - html version */
68 char *json_traffic
= "/var/www/logs/traffic.json"; /* hall of fame - json version */
69 char *json_preview
= "/var/www/logs/preview.json"; /* hall of fame preview - json version */
70 char *cmdlog
= "/var/log/prometheuslog"; /* command log filename */
71 char *log_dir
= "/var/www/logs/"; /* log directory pathname, ended with slash */
72 char *log_url
= "/logs/"; /* log directory relative URI prefix (partial URL) */
73 char *html_log_dir
= "/var/www/logs/html/";
75 char *jquery_url
= "http://code.jquery.com/jquery-latest.js";
76 char *lms_url
= "/lms/?m=customerinfo&id=";
77 int use_jquery_popups
= TRUE
;
78 int row_odd_even
= 0; /*<tr class="odd/even"> */
80 /* === Configuraration file values defaults - stored in global variables ==== */
82 int filter_type
= 1; /*1 mark, 2 classify*/
83 char *final_chain
= "DROP"; /* REJECT would be better, but it is impossible in mangle */
85 char *mark_iptables
= "MARK --set-mark ";
86 int dry_run
= FALSE
; /* preview - use puts() instead of system() */
87 char *iptablespreamble
= "*mangle\n:PREROUTING ACCEPT [0:0]\n:POSTROUTING ACCEPT [0:0]\n:INPUT ACCEPT [0:0]\n:OUTPUT ACCEPT [0:0]\n:FORWARD ACCEPT [0:0]";
88 char *ip6preamble
= "-A FORWARD -p ipv6-icmp -j ACCEPT\n-A POSTROUTING -p ipv6-icmp -j ACCEPT\n-A FORWARD -s fe80::/10 -j ACCEPT\n-A FORWARD -d ff00::/8 -j ACCEPT\n-A POSTROUTING -s fe80::/10 -j ACCEPT\n-A POSTROUTING -d ff00::/8 -j ACCEPT";
89 FILE *iptables_file
= NULL
;
90 FILE *ip6tables_file
= NULL
;
91 int enable_credit
= TRUE
; /* enable credit file */
92 int use_credit
= FALSE
; /* use credit file (if enabled)*/
93 char *title
= "Hall of Fame - Greatest Suckers"; /* hall of fame title */
94 int hall_of_fame
= TRUE
; /* enable hall of fame */
95 char *lan
= "eth0"; /* LAN interface */
96 char *lan_medium
= "100Mbit"; /* 10Mbit/100Mbit ethernet */
97 char *wan
= "eth1"; /* WAN/ISP interface */
98 char *ip6prefix
= NULL
; /* Prefix for global /48 IPv6 subnet */
99 char *wan_medium
= "100Mbit"; /* 10Mbit/100Mbit ethernet */
100 char *qos_leaf
= "sfq perturb 5"; /* leaf discipline */
101 char *qos_free_zone
= NULL
; /* QoS free zone */
102 /* int qos_proxy = TRUE; include proxy port to QoS */
103 int found_lmsid
= FALSE
; /* show links to users in LMS information system */
104 int include_upload
= TRUE
; /* upload+download=total traffic */
105 /* char *proxy_ip = "192.168.1.1/32"; our IP with proxy port */
106 /* int proxy_port = 3128; proxy port number */
107 long long int line
= 1024; /* WAN/ISP download in kbps */
108 long long int up
= 1024; /* WAN/ISP upload in kbps */
109 int free_min
= 256; /* minimum guaranted bandwidth for all undefined hosts */
110 int free_max
= 512; /* maximum allowed bandwidth for all undefined hosts */
111 int overlimit_min
= 256; /* minimum guaranted bandwidth for all undefined hosts */
112 int overlimit_max
= 512; /* maximum allowed bandwidth for all undefined hosts */
113 int qos_free_delay
= 0; /* seconds to sleep before applying new QoS rules */
114 int digital_divide
= 2; /* controls digital divide weirdness ratio, 1...3 */
115 int max_nesting
= 5; /* /include/uapi/linux/pkt_sched.h: #define TC_HTB_MAXDEPTH 8 [... - 3 parent classes] */
116 int htb_r2q
= 256; /* should work for leaf values 512 kbps to 8 Mbps */
117 int burst
= 8; /* HTB burst (in kbits) */
119 int burst_group
= 32;
120 int magic_treshold
= 8; /* reduce ceil by X*magic_treshhold kbps (hard shaping) */
121 int keywordcount
= 0;
124 FILE *log_file
= NULL
;
125 char *kwd
= "via-prometheus"; /* /etc/hosts comment, eg. #qos-64-128 */
127 const int highest_priority
= 0; /* highest HTB priority (HTB built-in value is 0) */
128 const int lowest_priority
= 7; /* lowest HTB priority /include/uapi/linux/pkt_sched.h: #define TC_HTB_NUMPRIO 8 */
129 const int idxtable_treshold1
= 24; /* this is no longer configurable */
130 const int idxtable_treshold2
= 12; /* this is no longer configurable */
131 const int idxtable_bitmask1
= 3; /* this is no longer configurable */
132 const int idxtable_bitmask2
= 3; /* this is no longer configurable */
134 struct IP
*ips
= NULL
, *networks
= NULL
, *ip
, *sharedip
;
135 struct Group
*groups
= NULL
, *group
;
136 struct Keyword
*keyword
, *defaultkeyword
=NULL
, *keywords
= NULL
;
137 struct Macro
*macro
, *macros
= NULL
;
140 #define OVERLIMIT_CLASS 4
143 /* implemented in help.c */
145 void get_traffic_statistics(const char *whichiptables
, int ipv6
);
146 /* implemented in parseiptables.c */
148 void parse_ip_log(int argc
, char **argv
);
149 /* implemented in parselog.c */
151 void parse_hosts(char *hosts
);
152 /* implemented in parsehosts.c */
154 void write_json_traffic(char *json
);
155 /* implemented in json.c */
157 void write_htmlandlogs(char *html
, char *d
, int total
, int just_preview
);
158 /* implemented in htmlandlogs.c */
160 void analyse_topology(char *traceroute
);
161 /* implemented in networks.c */
163 char *parse_datafile_line(char *str
);
164 /* implemented in utils.c */
166 time_t get_mtime(const char *path
);
167 /* implemented in utils.c */
169 const char *tr_odd_even(void)
171 row_odd_even
= 1 - row_odd_even
;
174 return "<tr class=\"even\">\n";
178 return "<tr class=\"odd\">\n";
182 /* ==== This is C<<1 stuff - learn C<<1 first! https://dev.arachne.cz/svn/cll1h ==== */
183 /* (except that this code uses obsolete, archaic version of this header file...) */
189 struct Index
*parent
;
194 } *idxs
=NULL
, *idx
, *metaindex
;
197 /* ====== iptables indexes are used to reduce complexity to log8(N) ===== */
199 char *index_id(char *ip
, int bitmask
);
200 /* function implemented in ipv4subnets.c */
202 char *subnet_id(char *ip
, int bitmask
);
203 /* function implemented in ipv4subnets.c */
205 char *index6_id(char *ip
, int bitmask
);
206 /* function implemented in ipv6subnets.c */
208 char *subnet6_id(char *ip
, int bitmask
);
209 /* function implemented in ipv6subnets.c */
211 /* ================= Let's parse configuration file here ================ */
213 void reject_config_and_exit(char *filename
)
215 printf("Configuration file %s rejected - abnormal exit.",filename
);
219 void get_config(char *config_filename
)
223 printf("Configured keywords: ");
224 parse(config_filename
)
226 option("keyword",kwd
);
231 create(keyword
,Keyword
);
233 keyword
->asymetry_ratio
= 1; /* ratio for ADSL-like upload */
234 keyword
->asymetry_fixed
= 0; /* fixed treshold for ADSL-like upload */
235 keyword
->data_limit
= 8; /* hard shaping: apply magic_treshold if max*data_limit MB exceeded */
236 keyword
->data_prio
= 4; /* soft shaping (qos): reduce HTB prio if max*data_prio MB exceeded */
237 keyword
->fixed_limit
= 0; /* fixed data limit for setting lower HTB ceil */
238 keyword
->fixed_prio
= 0; /* fixed data limit for setting lower HTB prio */
239 keyword
->reserve_min
= 8; /* bonus for nominal HTB rate bandwidth (in kbps) */
240 keyword
->reserve_max
= 0; /* malus for nominal HTB ceil (in kbps) */
241 keyword
->default_prio
= highest_priority
+1;
242 keyword
->download_aggregation
= keyword
->upload_aggregation
= 0; /* disable by default */
243 keyword
->html_color
= "000000";
244 keyword
->ip_count
= 0;
245 keyword
->leaf_discipline
= "";
246 keyword
->allowed_avgmtu
= 0;
248 push(keyword
, keywords
);
251 defaultkeyword
= keyword
;
259 for_each(keyword
,keywords
)
261 int l
=strlen(keyword
->key
);
263 if(!strncmp(keyword
->key
,_
,l
) && strlen(_
)>l
+2)
265 char *tmptr
=_
; /* <---- l+1 ----> */
266 _
+=l
+1; /* via-prometheus-asymetry-ratio, etc. */
267 foption("asymetry-ratio", keyword
->asymetry_ratio
);
268 ioption("asymetry-treshold", keyword
->asymetry_fixed
);
269 ioption("magic-relative-limit", keyword
->data_limit
);
270 ioption("magic-relative-prio", keyword
->data_prio
);
271 loption("magic-fixed-limit", keyword
->fixed_limit
);
272 loption("magic-fixed-prio", keyword
->fixed_prio
);
273 ioption("htb-default-prio", keyword
->default_prio
);
274 ioption("htb-rate-bonus", keyword
->reserve_min
);
275 ioption("htb-ceil-malus", keyword
->reserve_max
);
276 ioption("download-aggregation", keyword
->download_aggregation
);
277 ioption("upload-aggregation", keyword
->upload_aggregation
);
278 option("leaf-discipline", keyword
->leaf_discipline
);
279 option("html-color", keyword
->html_color
);
280 ioption("allowed-avgmtu" ,keyword
->allowed_avgmtu
);
283 if(keyword
->data_limit
|| keyword
->fixed_limit
||
284 keyword
->data_prio
|| keyword
->fixed_prio
)
293 option("iptables",iptables
);
294 option("iptables-save",iptablessave
);
295 option("iptables-restore",iptablesrestore
);
296 option("ip6tables",ip6tables
);
297 option("ip6tables-save",ip6tablessave
);
298 option("ip6tables-restore",ip6tablesrestore
);
299 option("iptables-in-filename",iptablesfile
);
300 option("ip6tables-in-filename",ip6tablesfile
);
301 option("hosts",hosts
);
302 option("lan-interface",lan
);
303 option("wan-interface",wan
);
304 option("ip6-prefix",ip6prefix
);
305 option("lan-medium",lan_medium
);
306 option("wan-medium",wan_medium
);
307 lloption("wan-download",line
);
308 lloption("wan-upload",up
);
309 ioption("hall-of-fame-enable",hall_of_fame
);
310 option("hall-of-fame-title",title
);
311 option("hall-of-fame-filename",html
);
312 option("json-filename",json_traffic
);
313 option("hall-of-fame-preview",preview
);
314 option("json-preview",json_preview
);
315 option("log-filename",cmdlog
);
316 option("credit-filename",credit
);
317 option("classmap-filename",classmap
);
318 ioption("credit-enable",enable_credit
);
319 option("log-traffic-directory",log_dir
);
320 option("log-traffic-html-directory",html_log_dir
);
321 option("log-traffic-url-path",log_url
);
322 option("jquery-url",jquery_url
);
323 option("lms-url",lms_url
);
324 ioption("use-jquery-popups",use_jquery_popups
);
325 option("qos-free-zone",qos_free_zone
);
326 ioption("qos-free-delay",qos_free_delay
);
327 /* ioption("qos-proxy-enable",qos_proxy); */
328 /* option("qos-proxy-ip",proxy_ip);*/
329 option("htb-leaf-discipline",qos_leaf
);
330 /* ioption("qos-proxy-port",proxy_port); */
331 ioption("free-rate",free_min
);
332 ioption("free-ceil",free_max
);
333 ioption("overlimit-rate",overlimit_min
);
334 ioption("overlimit-ceil",overlimit_max
);
335 ioption("htb-burst",burst
);
336 ioption("htb-burst-main",burst_main
);
337 ioption("htb-burst-group",burst_group
);
338 ioption("htb-nesting-limit",max_nesting
);
339 ioption("htb-r2q",htb_r2q
);
340 ioption("magic-include-upload",include_upload
);
341 ioption("magic-treshold",magic_treshold
);
342 option("filter-type", cnf
);
343 /* not yet implemented:
344 ioption("magic-fixed-packets",fixed_packets);
345 ioption("magic-relative-packets",packet_limit);
350 perror(config_filename
);
351 puts("Warning - using built-in defaults instead ...");
353 done
; /* ugly macro end */
356 /* leaf discipline for keywords */
357 for_each(keyword
,keywords
)
359 if(!strcmpi(keyword
->leaf_discipline
, ""))
361 keyword
->leaf_discipline
= qos_leaf
;
365 if(strcmpi(cnf
, "mark"))
369 mark_iptables
= "CLASSIFY --set-class 1:";
375 mark_iptables
= "MARK --set-mark ";
378 /* are supplied values meaningful ?*/
381 puts("Illegal value of LAN or WAN bandwidth: 0 kbps.");
382 reject_config_and_exit(config_filename
);
387 /* ========== This function executes, logs OR ALSO prints command ========== */
389 void safe_run(char *cmd
)
393 printf("\n=>%s\n",cmd
);
401 fprintf(log_file
,"%s\n",cmd
);
405 void iptables_save_line(char *line
, int ipv6
)
409 fprintf(ip6tables_file
,"%s\n",line
);
413 fprintf(iptables_file
,"%s\n",line
);
417 void run_iptables_restore(void)
420 string(restor
,STRLEN
);
422 /*-----------------------------------------------------------------*/
423 printf("Running %s <%s ...\n", iptablesrestore
, iptablesfile
);
424 /*-----------------------------------------------------------------*/
426 iptables_save_line("COMMIT", FALSE
);
427 fclose(iptables_file
);
434 done
; /* ugly macro end */
437 sprintf(restor
,"%s <%s",iptablesrestore
, iptablesfile
);
442 /*-----------------------------------------------------------------*/
443 printf("Running %s <%s ...\n", ip6tablesrestore
, ip6tablesfile
);
444 /*-----------------------------------------------------------------*/
445 iptables_save_line("COMMIT", TRUE
);
446 fclose(ip6tables_file
);
453 done
; /* ugly macro end */
455 sprintf(restor
,"%s <%s",ip6tablesrestore
, ip6tablesfile
);
463 char *parse_datafile_line(char *str
);
464 time_t get_mtime(const char *path
);
466 /*-----------------------------------------------------------------*/
467 /* Are you looking for int main(int argc, char **argv) ? :-)) */
468 /*-----------------------------------------------------------------*/
472 int i
=0; /* just plain old Fortran style integer :-) */
473 FILE *f
=NULL
; /* everything is just stream of bytes... */
474 char *str
, *ptr
, *d
; /* LET A$=B$ :-) */
475 char *substring
, *limit_pkts
;
478 int just_networks
= FALSE
;
479 int just_flush
= FALSE
; /* deactivates all previous actions */
481 int just_preview
= FALSE
; /* preview - generate just stats */
482 int start_shaping
= FALSE
; /* apply FUP - requires classmap file */
483 int stop_shaping
= FALSE
; /* lift FUP - requires classmap file */
484 int reduce_ceil
= 0; /* allow only rate+(ceil-rate)/2, /4, etc. */
485 int just_logs
= FALSE
; /* just parse logs */
489 char *chain_forward
, *chain_postrouting
;
493 Prometheus QoS - \"fair-per-IP\" Quality of Service setup utility.\n\
494 Version %s - Copyright (C)2005-2015 Michael Polak, Arachne Labs\n\
495 iptables-restore & burst tunning & classify modification by Ludva\n\
496 Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version
);
498 /*----- Boring... we have to check command line options first: ----*/
501 argument("-c") { nextargument(config
); }
502 argument("-h") { nextargument(althosts
);}
503 argument("-d") { run
=TRUE
; dry_run
=TRUE
; }
504 argument("-f") { run
=TRUE
; just_flush
=TRUE
; }
505 argument("-9") { run
=TRUE
; just_flush
=9; }
506 argument("-p") { run
=TRUE
; just_preview
=TRUE
; }
507 argument("-q") { run
=TRUE
; just_preview
=TRUE
; stop_shaping
=TRUE
; }
508 argument("-2") { run
=TRUE
; just_preview
=TRUE
; reduce_ceil
=2; }
509 argument("-4") { run
=TRUE
; just_preview
=TRUE
; reduce_ceil
=4; }
510 argument("-s") { run
=TRUE
; just_preview
=TRUE
; start_shaping
=TRUE
; }
511 argument("-r") { run
=TRUE
; }
512 argument("-n") { run
=TRUE
; nodelay
=TRUE
; }
513 argument("-a") { run
=TRUE
; just_networks
=TRUE
; }
514 argument("-l") { just_logs
=TRUE
; }
515 argument("-m") { just_logs
=TRUE
; }
516 argument("-y") { just_logs
=TRUE
; }
517 argument("-?") { help(); exit(0); }
518 argument("--help") { help(); exit(0); }
519 argument("-v") { exit(0); }
520 argument("--version") { exit(0); }
525 puts("*** THIS IS JUST DRY RUN ! ***\n");
528 date(d
); /* this is typical cll1.h macro - prints current date */
530 /*-----------------------------------------------------------------*/
531 printf("Parsing configuration file %s ...\n", config
);
532 /*-----------------------------------------------------------------*/
537 parse_ip_log(argc
,argv
);
553 /*-----------------------------------------------------------------*/
554 puts("Parsing iptables verbose output ...");
555 /*-----------------------------------------------------------------*/
556 get_traffic_statistics(iptables
, FALSE
);
559 /*-----------------------------------------------------------------*/
560 puts("Parsing ip6tables verbose output ...");
561 /*-----------------------------------------------------------------*/
562 get_traffic_statistics(ip6tables
, TRUE
);
566 /*-----------------------------------------------------------------*/
567 /* cll1.h - let's allocate brand new character buffer... */
568 /*-----------------------------------------------------------------*/
570 string(limit_pkts
, STRLEN
);
572 /*-----------------------------------------------------------------*/
573 printf("Parsing macro definition file %s ...\n", macrosfile
);
574 /*-----------------------------------------------------------------*/
577 ptr
= parse_datafile_line(_
);
580 create(macro
, Macro
);
581 macro
->rewrite_from
= _
;
582 macro
->rewrite_to
= ptr
;
584 printf("%s -> %s\n", macro
->rewrite_from
, macro
->rewrite_to
);
587 done
; /* ugly macro end */
589 /*-----------------------------------------------------------------*/
590 printf("Parsing class defintion file %s ...\n", hosts
);
591 /*-----------------------------------------------------------------*/
595 analyse_topology("/usr/sbin/traceroute -n -m 10 -w 2 %s.%d");
599 /*-----------------------------------------------------------------*/
600 puts("Resolving shared connections ...");
601 /*-----------------------------------------------------------------*/
602 for_each(ip
, ips
) if(ip
->sharing
)
604 for_each(sharedip
, ips
) if(eq(sharedip
->name
, ip
->sharing
))
606 sharedip
->traffic
+= ip
->traffic
;
607 sharedip
->traffic_down
+= ip
->direct
;
608 sharedip
->traffic_up
+= ip
->upload
;
610 ip
->mark
= sharedip
->mark
;
611 ip
->lmsid
= sharedip
->lmsid
;
612 ip
->pps_limit
= sharedip
->pps_limit
; /* no other way to do this */
614 /* Ugly hack: append IPv4 addresses of sharedip to IPv6 uplinks */
615 ptr
= strchr(ip
->addr
, '+');
616 if(ptr
&& ptr
-ip
->addr
> 1 && !sharedip
->v6
)
619 concatenate(ip
->addr
, sharedip
->addr
, ptr
);
620 ip
->name
= ip
->addr
= ptr
;
621 ptr
= strchr(ip
->addr
, '.');
625 ptr
= strchr(ptr
, '.');
634 printf("Unresolved shared connection: %s %s sharing-%s\n",
635 ip
->addr
, ip
->name
, ip
->sharing
);
639 if(enable_credit
&& just_flush
<9)
641 /*-----------------------------------------------------------------*/
642 printf("Parsing credit file %s ...\n", credit
);
643 /*-----------------------------------------------------------------*/
646 ptr
= parse_datafile_line(_
);
649 if_exists(ip
,ips
,eq(ip
->addr
,_
))
651 sscanf(ptr
,"%Lu",&(ip
->credit
));
655 done
; /* ugly macro end */
661 /*-----------------------------------------------------------------*/
662 puts("Initializing iptables and tc classes ...");
663 /*-----------------------------------------------------------------*/
665 iptables_file
= fopen(iptablesfile
, "w");
666 if(iptables_file
== NULL
)
668 perror(iptablesfile
);
671 iptables_save_line(iptablespreamble
, FALSE
);
675 ip6tables_file
= fopen(ip6tablesfile
, "w");
676 if(ip6tables_file
== NULL
)
678 perror(ip6tablesfile
);
681 iptables_save_line(iptablespreamble
, TRUE
);
682 iptables_save_line(ip6preamble
, TRUE
);
685 run_iptables_restore();
687 log_file
= fopen(cmdlog
, "w");
694 sprintf(str
,"%s qdisc del dev %s root 2>/dev/null",tc
,lan
);
697 sprintf(str
,"%s qdisc del dev %s root 2>/dev/null",tc
,wan
);
700 iptables_file
=fopen(iptablesfile
,"w");
701 iptables_save_line(iptablespreamble
, FALSE
);
704 ip6tables_file
=fopen(ip6tablesfile
,"w");
705 iptables_save_line(iptablespreamble
, TRUE
);
706 iptables_save_line(ip6preamble
, TRUE
);
709 if(qos_free_zone
&& *qos_free_zone
!='0') /* this is currently supported only for IPv4 */
713 sprintf(str
,"-A FORWARD -d %s -o %s -j ACCEPT", qos_free_zone
, wan
);
714 iptables_save_line(str
, FALSE
); /* this is currently supported only for IPv4 */
719 iptables_save_line(":post_noproxy - [0:0]", FALSE);
720 sprintf(str,"-A POSTROUTING ! -p tcp -o %s -j post_noproxy", lan);
721 iptables_save_line(str , FALSE);
722 sprintf(str,"-A POSTROUTING ! -s %s -o %s -j post_noproxy", proxy_ip, lan);
723 iptables_save_line(str, FALSE);
724 sprintf(str,"-A POSTROUTING -s %s -p tcp ! --sport %d -o %s -j post_noproxy", proxy_ip, proxy_port, lan);
725 iptables_save_line(str, FALSE);
727 chain="post_noproxy";
733 chain
= "POSTROUTING";
736 sprintf(str
,"-A %s -s %s -o %s -j ACCEPT", chain
, qos_free_zone
, lan
);
737 iptables_save_line(str
, FALSE
);
740 if(ip_count
> idxtable_treshold1
&& !just_flush
)
742 int idxcount
=0, bitmask
=32-idxtable_bitmask1
;
744 /*-----------------------------------------------------------------*/
745 printf("Detected %d addresses - indexing iptables rules to improve performance...\n",ip_count
);
746 /*-----------------------------------------------------------------*/
748 iptables_save_line(":post_common - [0:0]", FALSE
);
749 iptables_save_line(":forw_common - [0:0]", FALSE
);
752 iptables_save_line(":post_common - [0:0]", TRUE
);
753 iptables_save_line(":forw_common - [0:0]", TRUE
);
756 for_each(ip
,ips
) if(ip
->addr
&& *(ip
->addr
) && !eq(ip
->addr
,"0.0.0.0/0"))
760 buf
=index6_id(ip
->addr
,bitmask
+32);
764 buf
=index_id(ip
->addr
, bitmask
);
767 if_exists(idx
,idxs
,eq(idx
->id
,buf
))
774 idx
->addr
= ip
->addr
;
776 idx
->bitmask
= bitmask
+32*ip
->v6
;
785 /* brutal perfomance optimalization */
786 while(idxcount
> idxtable_treshold2
&& bitmask
> 2*idxtable_bitmask2
)
788 bitmask
-= idxtable_bitmask2
;
791 for_each(idx
,idxs
) if(idx
->parent
== NULL
)
795 buf
= index6_id(idx
->addr
, bitmask
+32);
799 buf
= index_id(idx
->addr
, bitmask
);
801 if_exists(metaindex
,idxs
,eq(metaindex
->id
,buf
))
803 metaindex
->children
++;
807 create(metaindex
,Index
);
808 metaindex
->addr
= idx
->addr
;
810 metaindex
->bitmask
= bitmask
+32*idx
->ipv6
;
811 metaindex
->parent
= NULL
;
812 metaindex
->children
= 0;
813 metaindex
->ipv6
= idx
->ipv6
;
815 push(metaindex
,idxs
);
817 idx
->parent
=metaindex
;
821 /* this should slightly optimize throughput ... */
822 sort(idx
,idxs
,desc_order_by
,children
);
823 sort(idx
,idxs
,order_by
,bitmask
);
830 subnet
=subnet6_id(idx
->addr
, idx
->bitmask
);
834 subnet
=subnet_id(idx
->addr
, idx
->bitmask
);
836 printf("%d: %s/%d\n", ++i
, subnet
, idx
->bitmask
);
838 sprintf(str
,":post_%s - [0:0]", idx
->id
);
839 iptables_save_line(str
, idx
->ipv6
);
841 sprintf(str
,":forw_%s - [0:0]", idx
->id
);
842 iptables_save_line(str
, idx
->ipv6
);
846 string(buf
,strlen(idx
->parent
->id
)+6);
847 sprintf(buf
,"post_%s", idx
->parent
->id
);
854 sprintf(str
,"-A %s -d %s/%d -o %s -j post_%s", buf
, subnet
, idx
->bitmask
, lan
, idx
->id
);
855 iptables_save_line(str
, idx
->ipv6
);
857 sprintf(str
,"-A %s -d %s/%d -o %s -j post_common", buf
, subnet
, idx
->bitmask
, lan
);
858 iptables_save_line(str
, idx
->ipv6
);
862 string(buf
,strlen(idx
->parent
->id
)+6);
863 sprintf(buf
,"forw_%s",idx
->parent
->id
);
870 sprintf(str
,"-A %s -s %s/%d -o %s -j forw_%s", buf
, subnet
, idx
->bitmask
, wan
, idx
->id
);
871 iptables_save_line(str
, idx
->ipv6
);
873 sprintf(str
,"-A %s -s %s/%d -o %s -j forw_common", buf
, subnet
, idx
->bitmask
, wan
);
874 iptables_save_line(str
, idx
->ipv6
);
876 printf("Total indexed iptables chains created: %d\n", i
);
878 sprintf(str
,"-A FORWARD -o %s -j forw_common", wan
);
879 iptables_save_line(str
, FALSE
);
881 sprintf(str
,"-A POSTROUTING -o %s -j post_common", lan
);
882 iptables_save_line(str
, FALSE
);
886 sprintf(str
,"-A FORWARD -o %s -j forw_common", wan
);
887 iptables_save_line(str
, TRUE
);
889 sprintf(str
,"-A POSTROUTING -o %s -j post_common", lan
);
890 iptables_save_line(str
, TRUE
);
897 fclose(iptables_file
);
902 puts("Just flushed iptables and tc classes - now exiting ...");
908 if(!dry_run
&& !nodelay
&& qos_free_delay
)
910 printf("Flushed iptables and tc classes - now sleeping for %d seconds...\n",qos_free_delay
);
911 sleep(qos_free_delay
);
914 sprintf(str
,"%s qdisc add dev %s root handle 1: htb r2q %d default 1",
918 sprintf(str
, "%s class add dev %s parent 1: classid 1:2 htb rate %s ceil %s burst %dk prio %d",
919 tc
,lan
,lan_medium
,lan_medium
,burst_main
,highest_priority
);
922 sprintf(str
, "%s class add dev %s parent 1:2 classid 1:1 htb rate %Ldkbit ceil %Ldkbit burst %dk prio %d",
923 tc
,lan
,line
,line
,burst_main
,highest_priority
);
926 sprintf(str
,"%s qdisc add dev %s root handle 1: htb r2q %d default 1",tc
,wan
,htb_r2q
);
929 sprintf(str
, "%s class add dev %s parent 1: classid 1:2 htb rate %s ceil %s burst %dk prio %d",
930 tc
,wan
,wan_medium
,wan_medium
,burst_main
,highest_priority
);
933 sprintf(str
, "%s class add dev %s parent 1:2 classid 1:1 htb rate %Ldkbit ceil %Ldkbit burst %dk prio %d",
934 tc
,wan
,up
,up
,burst_main
,highest_priority
);
938 /*-----------------------------------------------------------------*/
939 puts("Locating heavy downloaders and generating root classes ...");
940 /*-----------------------------------------------------------------*/
941 sort(ip
,ips
,desc_order_by
,traffic
);
943 /*-----------------------------------------------------------------*/
944 /* sub-scope - local variables */
946 long long int rate
= line
;
947 long long int max
= line
;
949 FILE *credit_file
= NULL
;
951 if(!just_preview
&& !dry_run
&& enable_credit
)
953 credit_file
= fopen(credit
,"w");
956 for_each(group
,groups
)
961 sprintf(str
,"%s class add dev %s parent 1:%d classid 1:%d htb rate %Ldkbit ceil %Ldkbit burst %dk prio %d #down desired %d",
962 tc
, lan
, parent
, group
->id
, rate
, max
, burst_group
, highest_priority
+1, group
->desired
);
966 sprintf(str
,"%s class add dev %s parent 1:%d classid 1:%d htb rate %Ldkbit ceil %Ldkbit burst %dk prio %d #up desired %d",
967 tc
, wan
, parent
, group
->id
, rate
*up
/line
, max
*up
/line
, burst_group
, highest_priority
+1, group
->desired
);
971 if(group_count
++ < max_nesting
)
976 rate
-= digital_divide
*group
->min
;
977 if(rate
< group
->min
)
982 /*shaping of aggresive downloaders, with credit file support */
985 int group_rate
= group
->min
, priority_sequence
= lowest_priority
;
987 for_each(ip
, ips
) if(ip
->min
== group
->min
&& ip
->max
> ip
->min
)
989 ip
->realquota
=ip
->credit
+(ip
->min
*ip
->keyword
->data_limit
+(ip
->keyword
->fixed_limit
<<20));
990 if( ip
->keyword
->data_limit
991 and not ip
->fixedprio
992 and ip
->traffic
> ip
->realquota
)
994 if(group_rate
< ip
->max
)
996 ip
->max
= group_rate
;
998 group_rate
+=magic_treshold
;
999 ip
->prio
=lowest_priority
;
1000 if(ip
->prio
<highest_priority
+2)
1002 ip
->prio
=highest_priority
+2;
1007 if( ip
->keyword
->data_prio
1009 && ( ip
->traffic
> ip
->credit
+ (ip
->min
*ip
->keyword
->data_prio
+(ip
->keyword
->fixed_prio
<<20))) )
1011 ip
->prio
=priority_sequence
--;
1012 if(ip
->prio
<highest_priority
+1)
1014 ip
->prio
=highest_priority
+1;
1020 unsigned long long lcredit
=0;
1022 if((ip
->min
*ip
->keyword
->data_limit
+(ip
->keyword
->fixed_limit
<<20))>ip
->traffic
)
1024 lcredit
=(ip
->min
*ip
->keyword
->data_limit
+(ip
->keyword
->fixed_limit
<<20))-ip
->traffic
;
1026 fprintf(credit_file
,"%s %Lu\n",ip
->addr
,lcredit
);
1034 fclose(credit_file
);
1040 if(start_shaping
|| stop_shaping
|| reduce_ceil
)
1042 time_t how_much_seconds
= time(NULL
) - get_mtime(classmap
); /* sice start of daily aggregation session */
1043 printf("Reading %s (%ld seconds old) and applying Fair Use Policy and Aggregation rules... \n", classmap
, how_much_seconds
);
1052 if_exists(ip
,ips
,eq(ip
->addr
,_
))
1054 int unshape_this_ip
= stop_shaping
;
1055 long avg_mbps_down
= ip
->traffic_down
* 8 / how_much_seconds
;
1056 long avg_mbps_up
= ip
->traffic_up
* 8 / how_much_seconds
;
1057 int min_mbps
= ip
->min
>>10;
1058 int agreg
= 1, print_stats
= 1;
1065 if(ip
->keyword
->download_aggregation
)
1067 if(min_mbps
/ip
->keyword
->download_aggregation
<= avg_mbps_down
)
1069 unshape_this_ip
= 0;
1070 agreg
= (int)((float)(avg_mbps_down
+1)/min_mbps
+.5);
1072 ip
->pps_limit
/= agreg
;
1073 printf("Download aggregation 1:%d for %s (min: %lu Mbps avg: %ld Mbps)\n", agreg
, ip
->name
, min_mbps
, avg_mbps_down
);
1077 unshape_this_ip
= 1;
1080 else if(ip
->keyword
->upload_aggregation
)
1082 if(min_mbps
/ip
->keyword
->upload_aggregation
<= avg_mbps_up
)
1084 unshape_this_ip
= 0;
1085 agreg
= (int)((float)(avg_mbps_up
+1)/min_mbps
+.5);
1087 printf("Upload aggregation 1:%d for %s: (min: %lu Mbps avg: %ld Mbps)\n", agreg
, ip
->name
, min_mbps
, avg_mbps_up
);
1091 unshape_this_ip
= 1;
1094 ip
->aggregated
= agreg
;
1095 ip
->mark
= atoi(ptr
);
1096 if(ip
->max
< ip
->desired
|| unshape_this_ip
|| reduce_ceil
) /* apply or disable FUP limit immediately.... */
1100 ip
->max
= ip
->desired
;
1101 if(stop_shaping
) /* all limits removed, but not printed with -s (start_shaping) switch */
1103 printf("Removing limit for %s (%s) ", ip
->name
, ip
->addr
);
1112 printf("Applying limit for %s (%s) ", ip
->name
, ip
->addr
);
1115 ip
->max
= ip
->min
+ (ip
->desired
-ip
->min
)/reduce_ceil
;
1117 else if(ip
->max
< ip
->min
)
1124 printf("(down: %dk-%dk wants %dk, ", ip
->min
, ip
->max
, ip
->desired
);
1126 sprintf(str
, "%s class change dev %s parent 1:%d classid 1:%d htb rate %dkbit ceil %dkbit burst %dk prio %d",
1127 tc
, lan
, ip
->group
, ip
->mark
,ip
->min
,ip
->max
, burst
, ip
->prio
);
1131 printf("up: %dk-%dk wants %dk)\n", (int)((ip
->min
/ip
->keyword
->asymetry_ratio
)-ip
->keyword
->asymetry_fixed
),
1132 (int)((ip
->desired
/ip
->keyword
->asymetry_ratio
)-ip
->keyword
->asymetry_fixed
),
1133 (int)((ip
->desired
/ip
->keyword
->asymetry_ratio
)-ip
->keyword
->asymetry_fixed
));
1135 sprintf(str
,"%s class change dev %s parent 1:%d classid 1:%d htb rate %dkbit ceil %dkbit burst %dk prio %d",
1136 tc
, wan
, ip
->group
, ip
->mark
,
1137 (int)((ip
->min
/ip
->keyword
->asymetry_ratio
)-ip
->keyword
->asymetry_fixed
),
1138 (int)((ip
->max
/ip
->keyword
->asymetry_ratio
)-ip
->keyword
->asymetry_fixed
), burst
, ip
->prio
);
1147 puts("Warning - classmap file not fund, just generating preview ...");
1148 start_shaping
=FALSE
;
1151 done
; /* ugly macro end */
1154 json_traffic
=json_preview
;
1157 if(!dry_run
&& !just_flush
)
1159 /*-----------------------------------------------------------------*/
1160 printf("Writing json traffic overview %s ... ", json_traffic
);
1161 /*-----------------------------------------------------------------*/
1162 write_json_traffic(json_traffic
);
1164 /*-----------------------------------------------------------------*/
1165 printf("Writing statistics into HTML page %s ...\n", html
);
1166 /*-----------------------------------------------------------------*/
1167 write_htmlandlogs(html
, d
, total
, just_preview
);
1177 else if(reduce_ceil
)
1179 swchar
='0'+reduce_ceil
; /* -2, -4 */
1181 else if(stop_shaping
)
1186 printf("Statistics preview generated (-%c switch) - now exiting ...\n", swchar
);
1192 printf("%-22s %-15s mark\n","name","ip");
1195 printf("Writing %s", classmap
);
1196 f
= fopen(classmap
, "w");
1202 /*-----------------------------------------------------------------*/
1203 printf(" + generating iptables and tc classes ... ");
1204 /*-----------------------------------------------------------------*/
1206 for_each(ip
, ips
) if(ip
->mark
> 0) /* works only for IPv4 so far */
1211 duplicate(ip
->addr
,buf
);
1214 buf
=index6_id(ip
->addr
,64-idxtable_bitmask1
);
1218 buf
=index_id(ip
->addr
,32-idxtable_bitmask1
);
1221 string(chain_forward
,6+strlen(buf
));
1222 strcpy(chain_forward
,"forw_");
1223 strcat(chain_forward
,buf
);
1225 string(chain_postrouting
,6+strlen(buf
));
1226 strcpy(chain_postrouting
,"post_");
1227 strcat(chain_postrouting
,buf
);
1233 chain_forward
="FORWARD";
1234 chain_postrouting
="POSTROUTING";
1237 /* packet limits - this will be optional in future */
1240 sprintf(limit_pkts
, "-m limit --limit %d/s --limit-burst %d ",
1241 ip
->pps_limit
, ip
->pps_limit
);
1249 printf("%-22s %-16s %04d %d/s\n", ip
->name
, ip
->addr
, ip
->mark
, ip
->pps_limit
);
1252 /* -------------------------------------------------------- mark download */
1253 sprintf(str
, "-A %s -d %s/%d -o %s -j %s%d",
1254 chain_postrouting
, ip
->addr
, ip
->mask
,
1255 lan
, mark_iptables
, ip
->mark
);
1256 iptables_save_line(str
, ip
->v6
);
1261 sprintf(str, "-A %s -s %s -p tcp --sport %d -d %s/%d -o %s -j %s%d",
1262 chain_postrouting, proxy_ip, proxy_port, ip->addr,
1263 ip->mask, lan, mark_iptables, ip->mark);
1264 iptables_save_line(str, ip->v6);
1267 sprintf(str
, "-A %s -d %s/%d -o %s %s-j ACCEPT",
1268 chain_postrouting
, ip
->addr
, ip
->mask
, lan
, limit_pkts
);
1269 iptables_save_line(str
, ip
->v6
);
1271 /* classify overlimit packets to separate overlimit class */
1272 sprintf(str
, "-A %s -d %s/%d -o %s -j %s%d",
1273 chain_postrouting
, ip
->addr
, ip
->mask
,
1274 lan
, mark_iptables
, OVERLIMIT_CLASS
);
1275 iptables_save_line(str
, ip
->v6
);
1277 sprintf(str
, "-A %s -d %s/%d -o %s -j ACCEPT",
1278 chain_postrouting
, ip
->addr
, ip
->mask
, lan
);
1279 iptables_save_line(str
, ip
->v6
);
1281 /* -------------------------------------------------------- mark upload */
1282 sprintf(str
, "-A %s -s %s/%d -o %s -j %s%d",
1283 chain_forward
, ip
->addr
, ip
->mask
, wan
, mark_iptables
, ip
->mark
);
1284 iptables_save_line(str
, ip
->v6
);
1286 sprintf(str
, "-A %s -s %s/%d -o %s %s-j ACCEPT",
1287 chain_forward
, ip
->addr
, ip
->mask
, wan
, limit_pkts
);
1288 iptables_save_line(str
, ip
->v6
);
1290 /* classify overlimit packets to separate overlimit class */
1291 sprintf(str
, "-A %s -s %s/%d -o %s -j %s%d",
1292 chain_forward
, ip
->addr
, ip
->mask
, wan
, mark_iptables
, OVERLIMIT_CLASS
);
1293 iptables_save_line(str
, ip
->v6
);
1295 sprintf(str
, "-A %s -s %s/%d -o %s -j ACCEPT",
1296 chain_forward
, ip
->addr
, ip
->mask
, wan
);
1297 iptables_save_line(str
, ip
->v6
);
1301 /* -------------------------------------------------------- download class */
1303 printf("(down: %dk-%dk ", ip
->min
, ip
->max
);
1306 sprintf(str
, "%s class add dev %s parent 1:%d classid 1:%d htb rate %dkbit ceil %dkbit burst %dk prio %d",
1307 tc
, lan
, ip
->group
, ip
->mark
, ip
->min
, ip
->max
, burst
, ip
->prio
);
1310 if(strcmpi(ip
->keyword
->leaf_discipline
, "none"))
1312 sprintf(str
, "%s qdisc add dev %s parent 1:%d handle %d %s",
1313 tc
, lan
, ip
->mark
, ip
->mark
, ip
->keyword
->leaf_discipline
); /*qos_leaf*/
1317 if(filter_type
== 1)
1319 sprintf(str
, "%s filter add dev %s parent 1:0 protocol ip handle %d fw flowid 1:%d",
1320 tc
, lan
, ip
->mark
, ip
->mark
);
1324 /* -------------------------------------------------------- upload class */
1326 printf("up: %dk-%dk)\n", (int)((ip
->min
/ip
->keyword
->asymetry_ratio
)-ip
->keyword
->asymetry_fixed
),
1327 (int)((ip
->max
/ip
->keyword
->asymetry_ratio
)-ip
->keyword
->asymetry_fixed
));
1330 sprintf(str
,"%s class add dev %s parent 1:%d classid 1:%d htb rate %dkbit ceil %dkbit burst %dk prio %d",
1331 tc
, wan
, ip
->group
, ip
->mark
,
1332 (int)((ip
->min
/ip
->keyword
->asymetry_ratio
)-ip
->keyword
->asymetry_fixed
),
1333 (int)((ip
->max
/ip
->keyword
->asymetry_ratio
)-ip
->keyword
->asymetry_fixed
), burst
, ip
->prio
);
1336 if(strcmpi(ip
->keyword
->leaf_discipline
, "none"))
1338 sprintf(str
, "%s qdisc add dev %s parent 1:%d handle %d %s",
1339 tc
, wan
, ip
->mark
, ip
->mark
, ip
->keyword
->leaf_discipline
); /*qos_leaf*/
1343 if(filter_type
== 1)
1345 sprintf(str
, "%s filter add dev %s parent 1:0 protocol ip handle %d fw flowid 1:%d",
1346 tc
, wan
, ip
->mark
, ip
->mark
);
1352 fprintf(f
, "%s %d\n", ip
->addr
, ip
->mark
);
1358 printf("(sharing %s)\n", ip
->sharing
);
1371 chain_forward
= "forw_common";
1372 chain_postrouting
= "post_common";
1376 chain_forward
= "FORWARD";
1377 chain_postrouting
= "POSTROUTING";
1382 final_chain
= "ACCEPT";
1390 sprintf(str, "-A %s -s %s -p tcp --sport %d -o %s -j %s%d",
1391 chain_postrouting,proxy_ip,proxy_port,lan,mark_iptables, 3);
1392 iptables_save_line(str, FALSE); // only for IPv4
1394 sprintf(str, "-A %s -s %s -p tcp --sport %d -o %s -j %s",
1395 chain_postrouting,proxy_ip,proxy_port,lan,final_chain);
1396 iptables_save_line(str, FALSE); // only for IPv4
1402 sprintf(str
, "-A %s -o %s -j %s%d",
1403 chain_postrouting
, lan
, mark_iptables
, FREE_CLASS
);
1404 iptables_save_line(str
, FALSE
); /* only for IPv4 */
1407 sprintf(str
,"-A %s -o %s -j %s", chain_postrouting
, lan
, final_chain
);
1408 iptables_save_line(str
, FALSE
);
1411 sprintf(str
,"-A %s -o %s -j %s", chain_postrouting
, lan
, final_chain
);
1412 iptables_save_line(str
, TRUE
);
1417 sprintf(str
,"-A %s -o %s -j %s%d", chain_forward
, wan
, mark_iptables
, FREE_CLASS
);
1418 iptables_save_line(str
, FALSE
); /* only for IPv4 */
1421 sprintf(str
,"-A %s -o %s -j %s", chain_forward
, wan
, final_chain
);
1422 iptables_save_line(str
, FALSE
);
1425 sprintf(str
,"-A %s -o %s -j %s", chain_postrouting
, lan
, final_chain
);
1426 iptables_save_line(str
, TRUE
);
1429 if(free_min
) /* allocate free bandwith if it is not zero... */
1431 /*-----------------------------------------------------------------*/
1432 puts("Generating free bandwith class ...");
1433 /*-----------------------------------------------------------------*/
1434 sprintf(str
, "%s class add dev %s parent 1:%d classid 1:%d htb rate %dkbit ceil %dkbit burst %dk prio %d",
1435 tc
, lan
, parent
, FREE_CLASS
, free_min
, free_max
,burst
, lowest_priority
);
1437 sprintf(str
, "%s class add dev %s parent 1:%d classid 1:%d htb rate %dkbit ceil %dkbit burst %dk prio %d",
1438 tc
, wan
, parent
, FREE_CLASS
, free_min
, free_max
, burst
, lowest_priority
);
1441 if(strcmpi(qos_leaf
, "none"))
1443 sprintf(str
,"%s qdisc add dev %s parent 1:%d handle %d %s", tc
, lan
, FREE_CLASS
, FREE_CLASS
, qos_leaf
);
1446 sprintf(str
,"%s qdisc add dev %s parent 1:%d handle %d %s", tc
, wan
, FREE_CLASS
, FREE_CLASS
, qos_leaf
);
1449 /* tc handle 1 fw flowid */
1450 sprintf(str
,"%s filter add dev %s parent 1:0 protocol ip handle %d fw flowid 1:%d", tc
, lan
, FREE_CLASS
, FREE_CLASS
);
1453 sprintf(str
,"%s filter add dev %s parent 1:0 protocol ip handle %d fw flowid 1:%d", tc
, wan
, FREE_CLASS
, FREE_CLASS
);
1456 /*-----------------------------------------------------------------*/
1457 puts("Generating bandwith class for overlimit packets...");
1458 /*-----------------------------------------------------------------*/
1459 sprintf(str
, "%s class add dev %s parent 1:%d classid 1:%d htb rate %dkbit ceil %dkbit burst %dk prio %d",
1460 tc
, lan
, parent
, OVERLIMIT_CLASS
, overlimit_min
, overlimit_max
, burst
, lowest_priority
);
1462 sprintf(str
, "%s class add dev %s parent 1:%d classid 1:%d htb rate %dkbit ceil %dkbit burst %dk prio %d",
1463 tc
, wan
, parent
, OVERLIMIT_CLASS
, overlimit_min
, overlimit_max
, burst
, lowest_priority
);
1466 printf("Total IP count: %d\n", i
);
1467 run_iptables_restore();
1473 /* that's all folks, thank you for reading it all the way up to this point ;-) */
1474 /* bad luck C<<1 is not yet finished, I promise no sprintf() next time... */
This page took 1.174872 seconds and 3 git commands to generate.