X-Git-Url: http://git.harvie.cz/?a=blobdiff_plain;f=prometheus.c;h=0c0d93bbb7d85d6f81f6490f24ace26d95a62010;hb=9476091134bee3a9f4a5483a8b00b75b1406098a;hp=8fc385d27b6be2c6697385edf1eb8bc1c328f45f;hpb=e83b9af69bf2a90d199319d66ffd51ac9a0f4a53;p=svn%2FPrometheus-QoS%2F.git
diff --git a/prometheus.c b/prometheus.c
index 8fc385d..0c0d93b 100644
--- a/prometheus.c
+++ b/prometheus.c
@@ -7,9 +7,9 @@
/* Credit: CZFree.Net,Martin Devera,Netdave,Aquarius,Gandalf */
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-/* Modified: xChaos, 20080504
- ludva, 20080415
-
+/* Modified by: xChaos, 20110221
+ ludva, 20080415
+
Prometheus QoS is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2.1 of
@@ -31,16 +31,16 @@
#define FIRSTIPCLASS 2048
#undef DEBUG
-#include "cll1-0.6.h"
+#include "cll1-0.6.2.h"
-const char *version = "0.7.9-c";
+const char *version = "0.8.3";
-/* Version numbers: 0.7.9 is development releases ("beta"), 0.8.0 will be "stable" */
+/* Version numbers: 0.8.3 is development releases ("beta"), 0.8.4 will be "stable" */
/* Debian(RPM) package versions/patchlevels: 0.7.9-2, 0.8.0-1, 0.8.0-2, etc. */
/* C source code development versions ("beta"): 0.7.9-a, 0.8.1-b, etc. */
/* C source code release versions: 0.8.0, 0.8.2, 0.8.4, etc. */
-const char *stats_html_signature = "Statistics generated by Prometheus QoS version %s
GPL+Copyright(C)2005-2008 Michael Polak, Arachne Labs\n";
+const char *stats_html_signature = "Statistics generated by Prometheus QoS version %s
GPL+Copyright(C)2005-2011 Michael Polak, Arachne Labs\n";
/* ======= All path names are defined here (for RPM patch) ======= */
@@ -48,7 +48,7 @@ char *tc = "/sbin/tc"; /* requires tc with HTB support */
char *iptables = "/sbin/iptables"; /* requires iptables utility */
char *iptablessave = "/sbin/iptables-save"; /* not yet required */
char *iptablesrestore = "/sbin/iptables-restore"; /* requires iptables-restore */
-char *ls = "/bin/ls"; /* this is not user configurable :-) */
+const char *ls = "/bin/ls"; /* this is not user configurable :-) */
char *config = "/etc/prometheus/prometheus.conf"; /* main configuration file */
char *hosts = "/etc/prometheus/hosts"; /* per-IP bandwidth definition file */
@@ -69,20 +69,20 @@ void help(void)
puts("Command line switches:\n\
\n\
-?, --help this help screen\n\
--v, --version show version number of this utility and exit\n\
--c filename force alternative /etc/prometheus.conf filename\n\
--h filename force alternative /etc/hosts filename (overrides hosts keyword)\n\
--f just flush iptables and tc classes and exit (stop shaping)\n\
+-v, --version show Version number of this utility and exit\n\
+-c filename force alternative /etc/prometheus.Conf filename\n\
+-h filename force alternative /etc/Hosts filename (overrides hosts keyword)\n\
+-f just Flush iptables and tc classes and exit (stop shaping)\n\
-9 emergency iptables flush (do not read data transfer statistics)\n\
--p just generate preview of data transfer statistics and exit\n\
--n no delay (overrides qos-free-delay keyword)\n\
--d dry run (preview tc and iptables commands on stdout)\n\
--l Mmm YYYY generate HTML summary of traffic logs (Mmm=Jan-Dec or Year, YYYY=year)\n\
--m generate HTML summary of traffic logs for yesterday's month\n\
--y generate HTML summary of traffic logs for yesterday's year\n");
+-p just generate Preview of data transfer statistics and exit\n\
+-d Dry run (preview tc and iptables commands on stdout)\n\
+-r Run (reset all statistics and start shaping)\n\
+-n run Now (start shaping without delay - overrides qos-free-delay keyword)\n\
+-l Mmm YYYY generate HTML summary of traffic Logs (Mmm=Jan-Dec or Year, YYYY=year)\n\
+-m generate HTML summary of traffic logs for yesterday's Month\n\
+-y generate HTML summary of traffic logs for yesterday's Year\n");
/* not yet implemented:
-s start shaping! (keep data transfer statistics - but apply shaping)\n\
--r just reload configuration (...and keep data transfer statistics)\n\
*/
}
/* === Configuraration file values defaults - stored in global variables ==== */
@@ -114,11 +114,10 @@ int free_max = 64; /* maximum allowed bandwidth for all undefined host
int qos_free_delay = 0; /* seconds to sleep before applying new QoS rules */
int digital_divide = 2; /* controls digital divide weirdness ratio, 1...3 */
int max_nesting = 3; /* maximum nesting of HTB clases, built-in maximum seems to be 4 */
-int htb_r2q = 1;
+int htb_r2q = 256; /* should work for leaf values 512 kbps to 8 Mbps */
int burst = 8; /* HTB burst (in kbits) */
int burst_main = 64;
int burst_group = 32;
-int magic_priorities = 8; /* number of priority levels (soft shaping) */
int magic_treshold = 8; /* reduce ceil by X*magic_treshhold kbps (hard shaping) */
int keywordcount = 0;
/* not yet implemented:
@@ -128,10 +127,12 @@ int packet_limit = 5; maximum number of pps to htn CEIL, not rate !!!
FILE *log_file = NULL;
char *kwd = "via-prometheus"; /* /etc/hosts comment, eg. #qos-64-128 */
-const int idxtable_treshold1=24; /* this is no longer configurable */
-const int idxtable_treshold2=12; /* this is no longer configurable */
-const int idxtable_bitmask1=3; /* this is no longer configurable */
-const int idxtable_bitmask2=3; /* this is no longer configurable */
+const int highest_priority = 0; /* highest HTB priority (HTB built-in value is 0) */
+const int lowest_priority = 7; /* lowest HTB priority (HTB built-in value is 7) */
+const int idxtable_treshold1 = 24; /* this is no longer configurable */
+const int idxtable_treshold2 = 12; /* this is no longer configurable */
+const int idxtable_bitmask1 = 3; /* this is no longer configurable */
+const int idxtable_bitmask2 = 3; /* this is no longer configurable */
/* ==== This is C<<1 stuff - learn C<<1 first! http://cll1.arachne.cz ==== */
@@ -184,7 +185,7 @@ struct Keyword
int asymetry_ratio; /* ratio for ADSL-like upload */
int asymetry_fixed; /* fixed treshold for ADSL-like upload */
int data_limit; /* hard shaping: apply magic_treshold if max*data_limit MB exceeded */
- int data_prio; /* soft shaping (qos): reduce HTB prio if max*data_prio MB exceeded */
+ int data_prio; /* soft shaping (qos): reduce HTB prio if max*data_prio MB exceeded */
long fixed_limit; /* fixed data limit for setting lower HTB ceil */
long fixed_prio; /* fixed data lmit for setting lower HTB prio */
int reserve_min; /* bonus for nominal HTB rate bandwidth (in kbps) */
@@ -204,15 +205,23 @@ struct Keyword
void TheIP(void)
{
create(ip,IP);
- ip->name="";
- ip->addr="";
- ip->sharing=NULL;
- ip->prio=1;
- ip->fixedprio=0;
- ip->mark=ip->min=ip->max=ip->desired=ip->credit=0;
- ip->upload=ip->proxy=ip->direct=ip->traffic=0;
- ip->pktsup=ip->pktsdown=0;
- ip->keyword=keywords;
+ ip->name = "";
+ ip->addr = "";
+ ip->sharing = NULL;
+ ip->prio = highest_priority+1;
+ ip->fixedprio = 0;
+ ip->mark = \
+ ip->min = \
+ ip->max = \
+ ip->desired = \
+ ip->credit = \
+ ip->upload = \
+ ip->proxy = \
+ ip->direct = \
+ ip->traffic = \
+ ip->pktsup = \
+ ip->pktsdown = 0;
+ ip->keyword = keywords;
push(ip,ips);
}
@@ -313,16 +322,15 @@ void get_config(char *config_filename)
keyword->asymetry_ratio=1; /* ratio for ADSL-like upload */
keyword->asymetry_fixed=0; /* fixed treshold for ADSL-like upload */
keyword->data_limit=8; /* hard shaping: apply magic_treshold if max*data_limit MB exceeded */
- keyword->data_prio=4; /* soft shaping (qos): reduce HTB prio if max*data_prio MB exceeded */
+ keyword->data_prio=4; /* soft shaping (qos): reduce HTB prio if max*data_prio MB exceeded */
keyword->fixed_limit=0; /* fixed data limit for setting lower HTB ceil */
keyword->fixed_prio=0; /* fixed data limit for setting lower HTB prio */
keyword->reserve_min=8; /* bonus for nominal HTB rate bandwidth (in kbps) */
keyword->reserve_max=0; /* malus for nominal HTB ceil (in kbps) */
/* obsolete:
keyword->divide_max=0; relative malus: new_ceil=rate+(old_ceil-rate)/divide_max
- keyword->htb_ceil_bonus_divide=0; relative bonus: new_ceil=old_ceil+old_ceil/htb_ceil_bonus_divide
-*/
- keyword->default_prio=1;
+ keyword->htb_ceil_bonus_divide=0; relative bonus: new_ceil=old_ceil+old_ceil/htb_ceil_bonus_divide */
+ keyword->default_prio=highest_priority+1;
keyword->html_color="000000";
keyword->ip_count=0;
keyword->leaf_discipline="";
@@ -333,36 +341,39 @@ void get_config(char *config_filename)
kwd=NULL;
}
- else every(keyword,keywords)
+ else
{
- int l=strlen(keyword->key);
+ for_each(keyword,keywords)
+ {
+ int l=strlen(keyword->key);
- if(!strncmp(keyword->key,_,l) && strlen(_)>l+2)
- {
- char *tmptr=_; /* <---- l+1 ----> */
- _+=l+1; /* via-prometheus-asymetry-ratio, etc. */
- ioption("asymetry-ratio",keyword->asymetry_ratio);
- ioption("asymetry-treshold",keyword->asymetry_fixed);
- ioption("magic-relative-limit",keyword->data_limit);
- ioption("magic-relative-prio",keyword->data_prio);
- loption("magic-fixed-limit",keyword->fixed_limit);
- loption("magic-fixed-prio",keyword->fixed_prio);
- ioption("htb-default-prio",keyword->default_prio);
- ioption("htb-rate-bonus",keyword->reserve_min);
- ioption("htb-ceil-malus",keyword->reserve_max);
-/* obsolete:
- ioption("htb-ceil-divide",keyword->divide_max);
- ioption("htb-ceil-bonus-divide",keyword->htb_ceil_bonus_divide);
-*/
- option("leaf-discipline",keyword->leaf_discipline);
- option("html-color",keyword->html_color);
- _=tmptr;
-
- if(keyword->data_limit || keyword->fixed_limit ||
- keyword->data_prio || keyword->fixed_prio)
- use_credit=1;
- }
+ if(!strncmp(keyword->key,_,l) && strlen(_)>l+2)
+ {
+ char *tmptr=_; /* <---- l+1 ----> */
+ _+=l+1; /* via-prometheus-asymetry-ratio, etc. */
+ ioption("asymetry-ratio",keyword->asymetry_ratio);
+ ioption("asymetry-treshold",keyword->asymetry_fixed);
+ ioption("magic-relative-limit",keyword->data_limit);
+ ioption("magic-relative-prio",keyword->data_prio);
+ loption("magic-fixed-limit",keyword->fixed_limit);
+ loption("magic-fixed-prio",keyword->fixed_prio);
+ ioption("htb-default-prio",keyword->default_prio);
+ ioption("htb-rate-bonus",keyword->reserve_min);
+ ioption("htb-ceil-malus",keyword->reserve_max);
+ /* obsolete:
+ ioption("htb-ceil-divide",keyword->divide_max);
+ ioption("htb-ceil-bonus-divide",keyword->htb_ceil_bonus_divide);
+ */
+ option("leaf-discipline",keyword->leaf_discipline);
+ option("html-color",keyword->html_color);
+ _=tmptr;
+
+ if(keyword->data_limit || keyword->fixed_limit ||
+ keyword->data_prio || keyword->fixed_prio)
+ use_credit=1;
+ }
+ }
}
option("tc",tc);
@@ -401,7 +412,6 @@ void get_config(char *config_filename)
ioption("htb-nesting-limit",max_nesting);
ioption("htb-r2q",htb_r2q);
ioption("magic-include-upload",include_upload);
- ioption("magic-priorities",magic_priorities);
ioption("magic-treshold",magic_treshold);
option("filter-type", cnf);
@@ -419,9 +429,10 @@ void get_config(char *config_filename)
printf("\n");
/*leaf discipline for keywords*/
- every(keyword,keywords)
+ for_each(keyword,keywords)
{
- if (!strcmpi(keyword->leaf_discipline, "")){
+ if (!strcmpi(keyword->leaf_discipline, ""))
+ {
keyword->leaf_discipline = qos_leaf;
}
}
@@ -465,7 +476,7 @@ void get_traffic_statistics(void)
append(line,lines);
}
- every(line,lines)
+ for_each(line,lines)
{
int col, accept=0,proxyflag=0,valid=1,setchainname=0,commonflag=0;
unsigned long long traffic=0;
@@ -516,7 +527,8 @@ void get_traffic_statistics(void)
if(proxyflag)printf("(proxy) ");
else if(!downloadflag) printf("(upload) ");
printf("IP %s: %Lu M (%ld pkts)\n", ipaddr, traffic, pkts);
- find(ip,ips,eq(ip->addr,ipaddr));
+
+ if_exists(ip,ips,eq(ip->addr,ipaddr));
else
{
TheIP();
@@ -612,7 +624,11 @@ void parse_ip(char *str)
ptr++;
*ptr=0;
- find(ip,ips,eq(ip->addr,ipaddr)); else TheIP();
+ if_exists(ip,ips,eq(ip->addr,ipaddr));
+ else
+ {
+ TheIP();
+ }
ip->addr=ipaddr;
ip->name=ipname;
}
@@ -636,134 +652,207 @@ struct IpLog
char *name;
long traffic;
long guaranted;
+ int i;
+ long l;
list(IpLog);
} *iplog,*iplogs;
void parse_ip_log(int argc, char **argv)
{
- char *month, *year, *str, *name, *ptr, *ptr2;
- long traffic, traffic_month, total=0, guaranted;
+ char *month, *year, *str, *name="(undefined)", *ptr, *ptr2, *filename;
+ long traffic=0l, traffic_month, total=0, guaranted;
int col, col2, y_ok, m_ok, accept_month, i=1, any_month=0;
char mstr[4], ystr[5];
FILE *f;
string(str,STRLEN);
+ string(filename,STRLEN);
if(argv[1][1]=='l') /* -l */
{
- if(argc<4)
- {
- puts("Missing parameter(s)!\nUsage: prometheus -l Mmm YYYY (Mmm=Jan-Dec or Year, YYYY=year)");
- exit(-1);
- }
- else
- {
- month=argv[2];
- if(eq(month,"Year")) any_month=1;
- year=argv[3];
- }
+ if(argc<4)
+ {
+ puts("Missing parameter(s)!\nUsage: prometheus -l Mmm YYYY (Mmm=Jan-Dec or Year, YYYY=year)");
+ exit(-1);
+ }
+ else
+ {
+ month=argv[2];
+ if(eq(month,"Year")) any_month=1;
+ year=argv[3];
+ }
}
else
{
- time_t t = time(NULL) - 3600*24 ; /* yesterday's timestamp*/
- struct tm *timep = localtime(&t);
-
- if(argv[1][1]=='m') /* -m yestarday - month */
- {
- strftime(mstr, 4, "%b", timep);
- month=mstr;
- strftime(ystr, 5, "%Y", timep);
- year=ystr;
- }
- else /* -y yesterday - year */
- {
- month="Year";
- any_month=1;
- strftime(ystr, 5, "%Y", timep);
- year=ystr;
- }
+ time_t t = time(NULL) - 3600*24 ; /* yesterday's timestamp*/
+ struct tm *timep = localtime(&t);
+
+ if(argv[1][1]=='m') /* -m yestarday - month */
+ {
+ strftime(mstr, 4, "%b", timep);
+ month=mstr;
+ strftime(ystr, 5, "%Y", timep);
+ year=ystr;
+ }
+ else /* -y yesterday - year */
+ {
+ month="Year";
+ any_month=1;
+ strftime(ystr, 5, "%Y", timep);
+ year=ystr;
+ }
}
printf("Analysing traffic for %s %s ...\n",month,year);
- sprintf(str,"%s %s/*.log",ls,log_dir);
+ /* sorry... next release of C<<1 header file will include for_path_files(name,path) { } macro */
+ sprintf(str,"%s %s/",ls,log_dir);
shell(str);
-
- input(str,STRLEN)
+ input(str,STRLEN)
{
- ptr=strrchr(str,'\n');
- if(ptr) *ptr='\0';
- printf("Parsing %s ...",str);
- accept_month=0;
- traffic_month=0;
- guaranted = 0;
- parse(str)
+ if(strstr(str,".log"))
{
- y_ok=m_ok=0;
- valid_columns(ptr,_,'\t',col) switch(col)
- {
- case 2: name = ptr;break;
- case 3: traffic = atol(ptr);break;
- /* column number - was 7, now 10...*/
- case 7:
- case 8:
- case 9:
- case 10: if (isalpha(*ptr)) /* character, not numeric string = date, just one*/
- {
- valid_columns(ptr2,ptr,' ',col2) switch(col2)
+ ptr=strrchr(str,'\n');
+ if(ptr) *ptr='\0';
+ sprintf(filename,"%s/%s",log_dir,str);
+ printf("Parsing %s ...",filename);
+ accept_month=0;
+ traffic_month=0;
+ guaranted = 0;
+ parse(filename)
+ {
+ y_ok=m_ok=0;
+ valid_columns(ptr,_,'\t',col) switch(col)
+ {
+ case 2: name = ptr;break;
+ case 3: traffic = atol(ptr);break;
+ /* column number - was 7, now 10...*/
+ case 7:
+ case 8:
+ case 9:
+ case 10: if (isalpha(*ptr)) /* character, not numeric string = date, just one*/
{
- case 2: if(any_month || eq(ptr2,month)) m_ok = 1; break;
- case 5: if(eq(ptr2,year)) y_ok = 1; break;
+ valid_columns(ptr2,ptr,' ',col2) switch(col2)
+ {
+ case 2: if(any_month || eq(ptr2,month)) m_ok = 1; break;
+ case 5: if(eq(ptr2,year)) y_ok = 1; break;
+ }
}
- }
- else
- {
- if(col == 7) guaranted = atol(ptr);
- }
- }
-
- if(y_ok && m_ok)
- {
- traffic_month += traffic;
- accept_month = 1;
- }
- }
- done;
+ else
+ {
+ if(col == 7) guaranted = atol(ptr);
+ }
+ }
+
+ if(y_ok && m_ok)
+ {
+ traffic_month += traffic;
+ accept_month = 1;
+ }
+ }
+ done;
- if(accept_month)
- {
- create(iplog,IpLog);
- iplog->name = name;
- iplog->guaranted = guaranted;
- iplog->traffic = traffic_month;
- insert(iplog,iplogs,desc_order_by,traffic);
- printf(" %ld MB\n",iplog->traffic);
+ if(accept_month)
+ {
+ create(iplog,IpLog);
+ iplog->name = name;
+ iplog->guaranted = guaranted;
+ iplog->traffic = traffic_month;
+ insert(iplog,iplogs,desc_order_by,traffic);
+ printf(" %ld MB\n",iplog->traffic);
+ }
+ else
+ {
+ puts(" no records.");
+ }
}
- else
- puts(" no records.");
}
sprintf(str,"%s/%s-%s.html",html_log_dir,year,month);
printf("Writing %s ...",str);
f=fopen(str,"w");
if(f)
{
- fprintf(f,"
Data transfers - %s %s | Min.speed |
\n ",month,year);
- every(iplog,iplogs)
+ fprintf(f,"%s %s | Data transfers | Min.speed |
\n ",month,year);
+
+ for_each(iplog,iplogs)
+ {
if(iplog->traffic)
{
- fprintf(f,"%d | %s | %ld MB | %ld GB | %ld kbps |
\n",
+ fprintf(f,"%d | %s | %ld M | %ld G | %ld kbps |
\n",
i++, iplog->name, iplog->traffic, iplog->traffic>>10, iplog->guaranted);
total+=iplog->traffic>>10;
+ iplog->i=i;
+ iplog->l=total;
}
+ }
fprintf(f,"Total: | %ld GB | %Ld kbps |
\n", total, line);
fputs("
\n", f);
+
+ if(i>10)
+ {
+ fputs("Enterprise Research and Planning (ERP) |
\n",f);
+ fputs("Analytic category | \n",f);
+ fputs("Active Classes | Data transfers |
\n",f);
+
+ if_exists(iplog,iplogs,iplog->l>=total/4)
+ {
+ fprintf(f,"Top 25%% of traffic | \n");
+ fprintf(f,"%d | %d %% | %ld G | %d %% |
\n",iplog->i,(100*iplog->i+50)/i,iplog->l,(int)((100*iplog->l+50)/total));
+ }
+
+ if_exists(iplog,iplogs,iplog->i==10)
+ {
+ fprintf(f,"Top 10 downloaders | \n");
+ fprintf(f,"10 | %d %% | %ld G | %d %% |
\n",(100*iplog->i+50)/i,iplog->l,(int)((100*iplog->l+50)/total));
+ }
+
+ if_exists(iplog,iplogs,iplog->l>=total/2)
+ {
+ fprintf(f,"Top 50%% of traffic | \n");
+ fprintf(f,"%d | %d %% | %ld G | %d %% |
\n",iplog->i,(100*iplog->i+50)/i,iplog->l,(int)((100*iplog->l+50)/total));
+ }
+
+ if_exists(iplog,iplogs,iplog->l>=4*total/5)
+ {
+ fprintf(f,"Top 80%% of traffic | \n");
+ fprintf(f,"%d | %d %% | %ld G | %d %% |
\n",iplog->i,(100*iplog->i+50)/i,iplog->l,(int)((100*iplog->l+50)/total));
+ }
+
+ if_exists (iplog,iplogs,iplog->i>=i/5)
+ {
+ fprintf(f,"Top 20%% downloaders | \n");
+ fprintf(f,"%d | %d %% | %ld G | %d %% |
\n",iplog->i,(100*iplog->i+50)/i,iplog->l,(int)((100*iplog->l+50)/total));
+ }
+
+ if_exists(iplog,iplogs,iplog->i>=i/4)
+ {
+ fprintf(f,"Top 25%% downloaders | \n");
+ fprintf(f,"%d | %d %% | %ld G | %d %% |
\n",iplog->i,(100*iplog->i+50)/i,iplog->l,(int)((100*iplog->l+50)/total));
+ }
+
+ if_exists(iplog,iplogs,iplog->i>=i/2)
+ {
+ fprintf(f,"Top 50%% downloaders | \n");
+ fprintf(f,"%d | %d %% | %ld G | %d %% |
\n",iplog->i,(100*iplog->i+50)/i,iplog->l,(int)((100*iplog->l+50)/total));
+ }
+
+ if_exists(iplog,iplogs,iplog->i>=4*i/5)
+ {
+ fprintf(f,"Top 80%% downloaders | \n");
+ fprintf(f,"%d | %d %% | %ld G | %d %% |
\n",iplog->i,(100*iplog->i+50)/i,iplog->l,(int)((100*iplog->l+50)/total));
+ }
+
+ fprintf(f,"All users, all traffic | \n");
+ fprintf(f,"%d | 100 %% | %ld G | 100 %% |
\n",i-1,total);
+ fputs("
\n", f);
+ }
+
fprintf(f, stats_html_signature, version);
fclose(f);
puts(" done.");
}
}
-
/*-----------------------------------------------------------------*/
-/* Are you looking for int main (int argc, char **argv) ? :-)) */
+/* Are you looking for int main(int argc, char **argv) ? :-)) */
/*-----------------------------------------------------------------*/
program
@@ -774,10 +863,11 @@ program
char *substring;
int class_count=0,ip_count=0;
int parent=1;
- int just_flush=0;
- int nodelay=0;
- int just_preview=0; /* preview - generate just stats */
- int just_logs=0; /* just parse logs */
+ int just_flush=FALSE;
+ int nodelay=FALSE;
+ int just_preview=FALSE; /* preview - generate just stats */
+ int just_logs=FALSE; /* just parse logs */
+ int run=FALSE;
char *chain_forward, *chain_postrouting;
char *althosts=NULL;
@@ -794,24 +884,27 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
{
argument("-c") { nextargument(config); }
argument("-h") { nextargument(althosts);}
- argument("-d") { dry_run=1; }
- argument("-f") { just_flush=1; }
- argument("-9") { just_flush=9; }
- argument("-p") { just_preview=1; }
- argument("-n") { nodelay=1; }
- argument("-l") { just_logs=1; }
- argument("-m") { just_logs=1; }
- argument("-y") { just_logs=1; }
+ argument("-d") { run=TRUE; dry_run=TRUE; }
+ argument("-f") { run=TRUE; just_flush=TRUE; }
+ argument("-9") { run=TRUE; just_flush=9; }
+ argument("-p") { run=TRUE; just_preview=TRUE; }
+ argument("-r") { run=TRUE; }
+ argument("-n") { run=TRUE; nodelay=TRUE; }
+ argument("-l") { just_logs=TRUE; }
+ argument("-m") { just_logs=TRUE; }
+ argument("-y") { just_logs=TRUE; }
argument("-?") { help(); exit(0); }
argument("--help") { help(); exit(0); }
argument("-v") { exit(0); }
argument("--version") { exit(0); }
}
-
+
if(dry_run)
+ {
puts("*** THIS IS JUST DRY RUN ! ***\n");
+ }
- date(d); /* this is typical cll1.h macro */
+ date(d); /* this is typical cll1.h macro - prints current date */
/*-----------------------------------------------------------------*/
printf("Parsing configuration file %s ...\n", config);
@@ -820,11 +913,19 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
if(just_logs)
{
- parse_ip_log(argc,argv);
- exit(0);
+ parse_ip_log(argc,argv);
+ exit(0);
+ }
+ else if(not run)
+ {
+ help();
+ exit(0);
}
- if(althosts) hosts=althosts;
+ if(althosts)
+ {
+ hosts=althosts;
+ }
if(just_flush<9)
{
@@ -862,7 +963,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
{
//Do we have to create new QoS class for this IP ?
- find(keyword,keywords,(substring=strstr(str,keyword->key)))
+ if_exists(keyword,keywords,(substring=strstr(str,keyword->key)))
{
parse_ip(str);
ip_count++;
@@ -904,7 +1005,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
}
ip->mark=FIRSTIPCLASS+1+class_count++;
- find(group,groups,group->min==ip->min)
+ if_exists(group,groups,group->min==ip->min)
{
group->count++;
group->desired+=ip->min;
@@ -944,9 +1045,9 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
/*-----------------------------------------------------------------*/
puts("Resolving shared connections ...");
/*-----------------------------------------------------------------*/
- search(ip,ips,ip->sharing)
+ for_selected(ip,ips,ip->sharing)
{
- search(sharedip,ips,eq(sharedip->name,ip->sharing))
+ for_selected(sharedip,ips,eq(sharedip->name,ip->sharing))
{
sharedip->traffic+=ip->traffic;
ip->traffic=0;
@@ -967,8 +1068,10 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
ptr=parse_datafile_line(_);
if(ptr)
{
- find(ip,ips,eq(ip->addr,_))
+ if_exists(ip,ips,eq(ip->addr,_))
+ {
sscanf(ptr,"%Lu",&(ip->credit));
+ }
}
}
done;
@@ -1041,11 +1144,13 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
save_line(":post_common - [0:0]");
save_line(":forw_common - [0:0]");
- search(ip,ips,ip->addr && *(ip->addr) && !eq(ip->addr,"0.0.0.0/0"))
+ for_selected(ip,ips,ip->addr && *(ip->addr) && !eq(ip->addr,"0.0.0.0/0"))
{
buf=hash_id(ip->addr,bitmask);
- find(idx,idxs,eq(idx->id,buf))
+ if_exists(idx,idxs,eq(idx->id,buf))
+ {
idx->children++;
+ }
else
{
create(idx,Index);
@@ -1064,11 +1169,14 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
{
bitmask-=idxtable_bitmask2;
idxcount=0;
- search(idx,idxs,idx->parent==NULL)
+
+ for_selected(idx,idxs,idx->parent==NULL)
{
buf=hash_id(idx->addr,bitmask);
- find(metaindex,idxs,eq(metaindex->id,buf))
- metaindex->children++;
+ if_exists(metaindex,idxs,eq(metaindex->id,buf))
+ {
+ metaindex->children++;
+ }
else
{
create(metaindex,Index);
@@ -1089,7 +1197,8 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
sort(idx,idxs,order_by,bitmask);
i=0;
- every(idx,idxs)
+
+ for_each(idx,idxs)
{
subnet=subnet_id(idx->addr,idx->bitmask);
printf("%d: %s/%d\n",++i,subnet,idx->bitmask);
@@ -1158,24 +1267,28 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
sprintf(str,"%s qdisc add dev %s root handle 1: htb r2q %d default 1",tc,lan,htb_r2q);
safe_run(str);
- sprintf(str,"%s class add dev %s parent 1: classid 1:2 htb rate %s ceil %s burst %dk prio 0",tc,lan,lan_medium,lan_medium,burst_main);
+ sprintf(str, "%s class add dev %s parent 1: classid 1:2 htb rate %s ceil %s burst %dk prio %d",
+ tc,lan,lan_medium,lan_medium,burst_main,highest_priority);
safe_run(str);
- sprintf(str,"%s class add dev %s parent 1:2 classid 1:1 htb rate %Ldkbit ceil %Ldkbit burst %dk prio 0",tc,lan,line,line,burst_main);
+ sprintf(str, "%s class add dev %s parent 1:2 classid 1:1 htb rate %Ldkbit ceil %Ldkbit burst %dk prio %d",
+ tc,lan,line,line,burst_main,highest_priority);
safe_run(str);
sprintf(str,"%s qdisc add dev %s root handle 1: htb r2q %d default 1",tc,wan,htb_r2q);
safe_run(str);
- sprintf(str,"%s class add dev %s parent 1: classid 1:2 htb rate %s ceil %s burst %dk prio 0",tc,wan,wan_medium,wan_medium,burst_main);
+ sprintf(str, "%s class add dev %s parent 1: classid 1:2 htb rate %s ceil %s burst %dk prio %d",
+ tc,wan,wan_medium,wan_medium,burst_main,highest_priority);
safe_run(str);
- sprintf(str,"%s class add dev %s parent 1:2 classid 1:1 htb rate %Ldkbit ceil %Ldkbit burst %dk prio 0",tc,wan,up,up,burst_main);
+ sprintf(str, "%s class add dev %s parent 1:2 classid 1:1 htb rate %Ldkbit ceil %Ldkbit burst %dk prio %d",
+ tc,wan,up,up,burst_main,highest_priority);
safe_run(str);
}
/*-----------------------------------------------------------------*/
- puts("Locating suckers and generating root classes ...");
+ puts("Locating heavy downloaders and generating root classes ...");
/*-----------------------------------------------------------------*/
sort(ip,ips,desc_order_by,traffic);
@@ -1190,19 +1303,18 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
if(!just_preview && !dry_run && enable_credit) credit_file=fopen(credit,"w");
- every(group,groups)
+ for_each(group,groups)
{
if(!just_preview)
{
-
//download
- sprintf(str,"%s class add dev %s parent 1:%d classid 1:%d htb rate %Ldkbit ceil %Ldkbit burst %dk prio 1 #down desired %d",
- tc, lan, parent, group->id, rate, max, burst_group, group->desired);
+ 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",
+ tc, lan, parent, group->id, rate, max, burst_group, highest_priority+1, group->desired);
safe_run(str);
//upload
- sprintf(str,"%s class add dev %s parent 1:%d classid 1:%d htb rate %Ldkbit ceil %Ldkbit burst %dk prio 1 #up desired %d",
- tc, wan, parent, group->id, rate*up/line, max*up/line, burst_group, group->desired);
+ 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",
+ tc, wan, parent, group->id, rate*up/line, max*up/line, burst_group, highest_priority+1, group->desired);
safe_run(str);
}
@@ -1214,9 +1326,9 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
/*shaping of aggresive downloaders, with credit file support */
if(use_credit)
{
- int group_rate=group->min, priority_sequence=magic_priorities+1;
+ int group_rate=group->min, priority_sequence=lowest_priority;
- search(ip, ips, ip->min==group->min && ip->max>ip->min)
+ for_selected(ip, ips, ip->min==group->min && ip->max>ip->min)
{
if( ip->keyword->data_limit && !ip->fixedprio &&
ip->traffic>ip->credit+
@@ -1224,8 +1336,8 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
{
if(group_ratemax) ip->max=group_rate;
group_rate+=magic_treshold;
- ip->prio=magic_priorities+2;
- if(ip->prio<3) ip->prio=3;
+ ip->prio=lowest_priority;
+ if(ip->prioprio=highest_priority+2;
}
else
{
@@ -1234,7 +1346,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
(ip->min*ip->keyword->data_prio+(ip->keyword->fixed_prio<<20)) )
{
ip->prio=priority_sequence--;
- if(ip->prio<2) ip->prio=2;
+ if(ip->prioprio=highest_priority+1;
}
if(credit_file)
@@ -1266,7 +1378,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
f=fopen("/var/run/prometheus.previous","w");
if(f)
{
- search(ip,ips,ip->traffic || ip->direct || ip->proxy ||ip->upload)
+ for_selected(ip,ips,ip->traffic || ip->direct || ip->proxy ||ip->upload)
fprintf(f,"%s %Lu %Lu %Lu %Lu\n",ip->addr,ip->traffic,ip->direct,ip->proxy,ip->upload);
fclose(f);
}
@@ -1288,7 +1400,8 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
fputs("\n# | group | IPs | requested | \n",f);
fprintf(f,"data limits | \n",keywordcount);
fputs("
\n",f);
- every(group,groups)
+
+ for_each(group,groups)
{
#ifdef DEBUG
printf("%d k group: %d bandwidth requested: %d k\n",group->min,group->count,group->desired);
@@ -1296,9 +1409,10 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
fprintf(f,"%d | %d k | ",count,group->min);
fprintf(f,"%d | %d k | ",group->count,group->desired);
- every(keyword,keywords)
- fprintf(f,"%d M | ",keyword->html_color,group->min*keyword->data_limit);
-
+ for_each(keyword,keywords)
+ {
+ fprintf(f,"%d M | ",keyword->html_color,group->min*keyword->data_limit);
+ }
i+=group->desired;
total+=group->count;
count++;
@@ -1309,9 +1423,10 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
fprintf(f,"
Line %Ld k",line);
fprintf(f," | %d | %d k",total,i);
- every(keyword,keywords)
- fprintf(f," | %d IPs | ",keyword->ip_count);
-
+ for_each(keyword,keywords)
+ {
+ fprintf(f,"%d IPs | ",keyword->ip_count);
+ }
fprintf(f,"
---|
Aggregation 1/%d | \n",(int)(0.5+i/line));
fprintf(f,"%d traffic classes |
\n",keywordcount,total);
@@ -1349,7 +1464,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
maximum | \
prio | \n",f);
- every(ip,ips)
+ for_each(ip,ips)
{
char *f1="", *f2="";
if(ip->maxdesired)
@@ -1357,7 +1472,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
f1="";
f2="";
}
- else if(ip->prio>1)
+ else if(ip->prio>highest_priority+1)
{
f1="";
f2="";
@@ -1417,49 +1532,49 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
fputs("Analytic category | \n",f);
fputs("Active Classes | Data transfers |
\n",f);
- find(sum,sums,sum->l>=total/4)
+ if_exists(sum,sums,sum->l>=total/4)
{
fprintf(f,"Top 25%% of traffic | \n");
fprintf(f,"%d | %d %% | %Lu M | %Ld %% |
\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total);
}
- find(sum,sums,sum->i==10)
+ if_exists(sum,sums,sum->i==10)
{
fprintf(f,"Top 10 downloaders | \n");
fprintf(f,"10 | %d %% | %Lu M | %Ld %% |
\n",(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total);
}
- find(sum,sums,sum->l>=total/2)
+ if_exists(sum,sums,sum->l>=total/2)
{
fprintf(f,"Top 50%% of traffic | \n");
fprintf(f,"%d | %d %% | %Lu M | %Ld %% |
\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total);
}
- find(sum,sums,sum->l>=4*total/5)
+ if_exists(sum,sums,sum->l>=4*total/5)
{
fprintf(f,"Top 80%% of traffic | \n");
fprintf(f,"%d | %d %% | %Lu M | %Ld %% |
\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total);
}
- find (sum,sums,sum->i>=(active_classes+1)/5)
+ if_exists (sum,sums,sum->i>=(active_classes+1)/5)
{
fprintf(f,"Top 20%% downloaders | \n");
fprintf(f,"%d | %d %% | %Lu M | %Ld %% |
\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total);
}
- find(sum,sums,sum->i>=(active_classes+1)/4)
+ if_exists(sum,sums,sum->i>=(active_classes+1)/4)
{
fprintf(f,"Top 25%% downloaders | \n");
fprintf(f,"%d | %d %% | %Lu M | %Ld %% |
\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total);
}
- find(sum,sums,sum->i>=(active_classes+1)/2)
+ if_exists(sum,sums,sum->i>=(active_classes+1)/2)
{
fprintf(f,"Top 50%% downloaders | \n");
fprintf(f,"%d | %d %% | %Lu M | %Ld %% |
\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total);
}
- find(sum,sums,sum->i>=4*(active_classes+1)/5)
+ if_exists(sum,sums,sum->i>=4*(active_classes+1)/5)
{
fprintf(f,"Top 80%% downloaders | \n");
fprintf(f,"%d | %d %% | %Lu M | %Ld %% |
\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total);
@@ -1485,7 +1600,8 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
i=0;
printf("%-22s %-15s mark\n","name","ip");
- search(ip,ips,ip->mark>0)
+
+ for_selected(ip,ips,ip->mark>0)
{
if(idxs)
@@ -1545,14 +1661,15 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
sprintf(str,"%s class add dev %s parent 1:%d classid 1:%d htb rate %dkbit ceil %dkbit burst %dk prio %d", tc, lan, ip->group, ip->mark,ip->min,ip->max, burst, ip->prio);
safe_run(str);
- if (strcmpi(ip->keyword->leaf_discipline, "none")){
- sprintf(str,"%s qdisc add dev %s parent 1:%d handle %d %s", tc, lan, ip->mark, ip->mark, ip->keyword->leaf_discipline); /*qos_leaf*/
- safe_run(str);
- }
-
- if (filter_type == 1){
- sprintf(str,"%s filter add dev %s parent 1:0 protocol ip handle %d fw flowid 1:%d", tc, lan, ip->mark, ip->mark);
- safe_run(str);
+ if (strcmpi(ip->keyword->leaf_discipline, "none"))
+ {
+ sprintf(str,"%s qdisc add dev %s parent 1:%d handle %d %s", tc, lan, ip->mark, ip->mark, ip->keyword->leaf_discipline); /*qos_leaf*/
+ safe_run(str);
+ }
+ if (filter_type == 1)
+ {
+ sprintf(str,"%s filter add dev %s parent 1:0 protocol ip handle %d fw flowid 1:%d", tc, lan, ip->mark, ip->mark);
+ safe_run(str);
}
/* -------------------------------------------------------- upload class */
@@ -1565,14 +1682,15 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
(int)((ip->max/ip->keyword->asymetry_ratio)-ip->keyword->asymetry_fixed), burst, ip->prio);
safe_run(str);
- if (strcmpi(ip->keyword->leaf_discipline, "none")){
- sprintf(str,"%s qdisc add dev %s parent 1:%d handle %d %s",tc, wan, ip->mark, ip->mark, ip->keyword->leaf_discipline); /*qos_leaf*/
- safe_run(str);
- }
-
- if (filter_type == 1){
- sprintf(str,"%s filter add dev %s parent 1:0 protocol ip handle %d fw flowid 1:%d",tc, wan, ip->mark, ip->mark);
- safe_run(str);
+ if (strcmpi(ip->keyword->leaf_discipline, "none"))
+ {
+ sprintf(str,"%s qdisc add dev %s parent 1:%d handle %d %s",tc, wan, ip->mark, ip->mark, ip->keyword->leaf_discipline); /*qos_leaf*/
+ safe_run(str);
+ }
+ if (filter_type == 1)
+ {
+ sprintf(str,"%s filter add dev %s parent 1:0 protocol ip handle %d fw flowid 1:%d",tc, wan, ip->mark, ip->mark);
+ safe_run(str);
}
}
else
@@ -1580,72 +1698,78 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
i++;
}
-
if(idxs)
{
- chain_forward="forw_common";
- chain_postrouting="post_common";
+ chain_forward = "forw_common";
+ chain_postrouting = "post_common";
}
else
{
- chain_forward="FORWARD";
- chain_postrouting="POSTROUTING";
+ chain_forward = "FORWARD";
+ chain_postrouting = "POSTROUTING";
}
-
- /* -------------------------------------------------------- mark download */
-
- if(qos_proxy)
+ /* -------------------------------- classify or reject free download */
{
- sprintf(str,"-A %s -s %s -p tcp --sport %d -o %s -j %s%d",chain_postrouting,proxy_ip,proxy_port,lan,mark_iptables,3);
- save_line(str);
- sprintf(str,"-A %s -s %s -p tcp --sport %d -o %s -j ACCEPT",chain_postrouting,proxy_ip,proxy_port,lan);
- save_line(str);
+ char *final_chain = "DROP"; /* REJECT would be better, but it is impossible in mangle */
+ if(free_min) final_chain = "ACCEPT";
+ if(qos_proxy)
+ {
+ if(free_min)
+ {
+ sprintf(str,"-A %s -s %s -p tcp --sport %d -o %s -j %s%d",chain_postrouting,proxy_ip,proxy_port,lan,mark_iptables,3);
+ save_line(str);
+ }
+ sprintf(str,"-A %s -s %s -p tcp --sport %d -o %s -j %s",chain_postrouting,proxy_ip,proxy_port,lan,final_chain);
+ save_line(str);
+ }
+ if(free_min)
+ {
+ sprintf(str,"-A %s -o %s -j %s%d",chain_postrouting,lan,mark_iptables,3);
+ save_line(str);
+ }
+ sprintf(str,"-A %s -o %s -j %s",chain_postrouting,lan,final_chain);
+ save_line(str);
+ /* ------------------------------- classify or reject free upload */
+ if(free_min)
+ {
+ sprintf(str,"-A %s -o %s -j %s%d",chain_forward,wan,mark_iptables,3);
+ save_line(str);
+ }
+ sprintf(str,"-A %s -o %s -j %s",chain_forward,wan,final_chain);
+ save_line(str);
}
- sprintf(str,"-A %s -o %s -j %s%d",chain_postrouting,lan,mark_iptables,3);
- save_line(str);
- sprintf(str,"-A %s -o %s -j ACCEPT",chain_postrouting,lan);
- save_line(str);
-
- /* -------------------------------------------------------- mark upload */
- sprintf(str,"-A %s -o %s -j %s%d",chain_forward,wan,mark_iptables,3);
- save_line(str);
- sprintf(str,"-A %s -o %s -j ACCEPT",chain_forward,wan);
- save_line(str);
- printf("Total IP count: %d\n", i);
-
- /*-----------------------------------------------------------------*/
- puts("Generating free bandwith classes ...");
- /*-----------------------------------------------------------------*/
-
- /* ---------------------------------------- tc - free bandwith shared class */
- sprintf(str,"%s class add dev %s parent 1:%d classid 1:3 htb rate %dkbit ceil %dkbit burst %dk prio 2",tc,lan,parent,free_min,free_max,burst);
- safe_run(str);
-
- sprintf(str,"%s class add dev %s parent 1:%d classid 1:3 htb rate %dkbit ceil %dkbit burst %dk prio 2",tc,wan,parent,free_min,free_max,burst);
- safe_run(str);
+ if(free_min) /* allocate free bandwith if it is not zero... */
+ {
+ /*-----------------------------------------------------------------*/
+ puts("Generating free bandwith classes ...");
+ /*-----------------------------------------------------------------*/
+ sprintf(str, "%s class add dev %s parent 1:%d classid 1:3 htb rate %dkbit ceil %dkbit burst %dk prio %d",
+ tc,lan,parent,free_min,free_max,burst,lowest_priority);
+ safe_run(str);
+ sprintf(str, "%s class add dev %s parent 1:%d classid 1:3 htb rate %dkbit ceil %dkbit burst %dk prio %d",
+ tc,wan,parent,free_min,free_max,burst,lowest_priority);
+ safe_run(str);
+ /* tc SFQ */
+ if (strcmpi(qos_leaf, "none"))
+ {
+ sprintf(str,"%s qdisc add dev %s parent 1:3 handle 3 %s",tc,lan,qos_leaf);
+ safe_run(str);
+
+ sprintf(str,"%s qdisc add dev %s parent 1:3 handle 3 %s",tc,wan,qos_leaf);
+ safe_run(str);
+ }
+ /* tc handle 1 fw flowid */
+ sprintf(str,"%s filter add dev %s parent 1:0 protocol ip handle 3 fw flowid 1:3",tc,lan);
+ safe_run(str);
- /* tc SFQ */
- if (strcmpi(qos_leaf, "none")){
- sprintf(str,"%s qdisc add dev %s parent 1:3 handle 3 %s",tc,lan,qos_leaf);
- safe_run(str);
-
- sprintf(str,"%s qdisc add dev %s parent 1:3 handle 3 %s",tc,wan,qos_leaf);
- safe_run(str);
+ sprintf(str,"%s filter add dev %s parent 1:0 protocol ip handle 3 fw flowid 1:3",tc,wan);
+ safe_run(str);
}
-
- /* tc handle 1 fw flowid */
- sprintf(str,"%s filter add dev %s parent 1:0 protocol ip handle 3 fw flowid 1:3",tc,lan);
- safe_run(str);
-
- sprintf(str,"%s filter add dev %s parent 1:0 protocol ip handle 3 fw flowid 1:3",tc,wan);
- safe_run(str);
-
- run_restore();
-
+ printf("Total IP count: %d\n", i);
+ run_restore();
if (log_file) fclose(log_file);
return 0;
-
/* that's all folks, thank you for reading it all the way up to this point ;-) */
/* bad luck C<<1 is not yet finished, I promise no sprintf() next time... */
}