X-Git-Url: https://git.harvie.cz/?a=blobdiff_plain;f=prometheus.c;h=3abaa34ecb78b77d2ed83100e20b42b3d05f13f2;hb=99127c70a2642b70ed3cde02f22ed2e4fc5d126f;hp=a22397c3cd438443eb9c22838bf0e1fc6e6ccb71;hpb=d1ae4fa779bf16bc00b135519cabcdcf3622cffe;p=svn%2FPrometheus-QoS%2F.git diff --git a/prometheus.c b/prometheus.c index a22397c..3abaa34 100644 --- a/prometheus.c +++ b/prometheus.c @@ -3,11 +3,11 @@ /* === Prometheus QoS - you can "steal fire" from your ISP === */ /* === "fair-per-IP" quality of service (QoS) utility === */ /* === requires Linux 2.4.x or 2.6.x with HTB support === */ -/* === Copyright(C) 2005-2007 Michael Polak (xChaos) === */ +/* === Copyright(C) 2005-2008 Michael Polak (xChaos) === */ /* === Credits: CZFree.Net, Martin Devera, Netdave, Aquarius === */ /* ============================================================= */ -/* Modified: xChaos, 20070502 +/* Modified: xChaos, 20080119 ludva, 20071227 Prometheus QoS is free software; you can redistribute it and/or @@ -173,7 +173,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 prio_limit; /* soft shaping (qos): reduce HTB prio if max*prio_limit 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) */ @@ -302,7 +302,7 @@ 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->prio_limit=4; /* soft shaping (qos): reduce HTB prio if max*prio_limit 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) */ @@ -334,7 +334,7 @@ void get_config(char *config_filename) ioption("asymetry-ratio",keyword->asymetry_ratio); ioption("asymetry-treshold",keyword->asymetry_fixed); ioption("magic-relative-limit",keyword->data_limit); - ioption("magic-relative-prio",keyword->prio_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); @@ -349,7 +349,7 @@ void get_config(char *config_filename) _=tmptr; if(keyword->data_limit || keyword->fixed_limit || - keyword->prio_limit || keyword->fixed_prio) + keyword->data_prio || keyword->fixed_prio) use_credit=1; @@ -639,7 +639,7 @@ program printf("\n\ Prometheus QoS - \"fair-per-IP\" Quality of Service setup utility.\n\ -Version %s - Copyright (C)2005-2007 Michael Polak (xChaos)\n\ +Version %s - Copyright (C)2005-2008 Michael Polak (xChaos)\n\ iptables-restore & burst tunning & classify modification 0.7d by Ludva\n\ Credits: CZFree.Net, Martin Devera, Netdave, Aquarius\n\n",version); @@ -1064,10 +1064,9 @@ Credits: CZFree.Net, Martin Devera, Netdave, Aquarius\n\n",version); search(ip, ips, ip->min==group->min && ip->max>ip->min) { - if(ip->keyword->data_limit>0 && + if( ip->keyword->data_limit && !ip->fixedprio && ip->traffic>ip->credit+ - (ip->min*ip->keyword->data_limit+(ip->keyword->fixed_limit<<20)) - && !ip->fixedprio) + (ip->min*ip->keyword->data_limit+(ip->keyword->fixed_limit<<20)) ) { if(group_ratemax) ip->max=group_rate; group_rate+=magic_treshold; @@ -1076,9 +1075,9 @@ Credits: CZFree.Net, Martin Devera, Netdave, Aquarius\n\n",version); } else { - if(ip->traffic>ip->credit+ - (ip->min*ip->keyword->prio_limit+(ip->keyword->fixed_prio<<20)) && - !ip->fixedprio) + if( keyword->data_prio && !ip->fixedprio && + ip->traffic>ip->credit+ + (ip->min*ip->keyword->data_prio+(ip->keyword->fixed_prio<<20)) ) { ip->prio=priority_sequence--; if(ip->prio<2) ip->prio=2; @@ -1087,6 +1086,7 @@ Credits: CZFree.Net, Martin Devera, Netdave, Aquarius\n\n",version); if(credit_file) { unsigned long long lcredit=0; + if((ip->min*ip->keyword->data_limit+(ip->keyword->fixed_limit<<20))>ip->traffic) lcredit=(ip->min*ip->keyword->data_limit+(ip->keyword->fixed_limit<<20))-ip->traffic; fprintf(credit_file,"%s %Lu\n",ip->addr,lcredit); @@ -1257,23 +1257,64 @@ Credits: CZFree.Net, Martin Devera, Netdave, Aquarius\n\n",version); fputs("\n\n",f); if(active_classes>10) - { - fputs("

\n",f); - fputs("\n",f); - find (sum,sums,sum->l>=total/4) - fprintf(f,"\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total); - find (sum,sums,sum->i==10) - fprintf(f,"\n",(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total); - find (sum,sums,sum->l>=total/2) - fprintf(f,"\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total); - find (sum,sums,sum->i>=(active_classes+3)/4) - fprintf(f,"\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) - fprintf(f,"\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total); - fprintf(f,"\n",active_classes,total); - fputs("
Enterprise Research and Planning (ERP)
Active ClassesData transfers
Top %d%d %%%Lu M%Ld %%
Top 10%d %%%Lu M%Ld %%
Top %d%d %%%Lu M%Ld %%
Top %d%d %%%Lu M%Ld %%
Top %d%d %%%Lu M%Ld %%
All %d100 %%%Lu M100 %%
\n",f); - } - fprintf(f,"Statistics generated by Prometheus QoS version %s
GPL+Copyright(C)2005 Michael Polak, Arachne Labs
\n",version); + { + fputs("

\n",f); + fputs("\n",f); + fputs("\n",f); + + find(sum,sums,sum->l>=total/4) + { + fprintf(f,"\n"); + fprintf(f,"\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total); + } + + find(sum,sums,sum->i==10) + { + fprintf(f,"\n"); + fprintf(f,"\n",(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total); + } + + find(sum,sums,sum->l>=total/2) + { + fprintf(f,"\n"); + fprintf(f,"\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total); + } + + find(sum,sums,sum->l>=4*total/5) + { + fprintf(f,"\n"); + fprintf(f,"\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) + { + fprintf(f,"\n"); + fprintf(f,"\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) + { + fprintf(f,"\n"); + fprintf(f,"\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) + { + fprintf(f,"\n"); + fprintf(f,"\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) + { + fprintf(f,"\n"); + fprintf(f,"\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total); + } + + fprintf(f,"\n"); + fprintf(f,"\n",active_classes,total); + fputs("
Enterprise Research and Planning (ERP)
Analytic categoryActive ClassesData transfers
Top 25%% of traffic%d%d %%%Lu M%Ld %%
Top 10 downloaders10%d %%%Lu M%Ld %%
Top 50%% of traffic%d%d %%%Lu M%Ld %%
Top 80%% of traffic%d%d %%%Lu M%Ld %%
Top 20%% downloaders%d%d %%%Lu M%Ld %%
Top 25%% downloaders%d%d %%%Lu M%Ld %%
Top 50%% downloaders%d%d %%%Lu M%Ld %%
Top 80%% downloaders%d%d %%%Lu M%Ld %%
All users, all traffic%d100 %%%Lu M100 %%
\n",f); + } + fprintf(f,"Statistics generated by Prometheus QoS version %s
GPL+Copyright(C)2005-2008 Michael Polak, Arachne Labs
\n",version); fclose(f); }