/* === Prometheus QoS - you can "steal fire" from your ISP === */\r
/* === "fair-per-IP" quality of service (QoS) utility === */\r
/* === requires Linux 2.4.x or 2.6.x with HTB support === */\r
-/* === Copyright(C) 2005-2007 Michael Polak (xChaos) === */\r
+/* === Copyright(C) 2005-2008 Michael Polak (xChaos) === */\r
/* === Credits: CZFree.Net, Martin Devera, Netdave, Aquarius === */\r
/* ============================================================= */\r
\r
-/* Modified: xChaos, 20070502\r
+/* Modified: xChaos, 20080119\r
ludva, 20071227\r
\r
Prometheus QoS is free software; you can redistribute it and/or\r
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
General Public License for more details.\r
\r
- You should have received a copy of the GNU General Public License \r
- along with the Linux kernel source code; if not, write to \r
- Michael Polak, Svojsikova 7, 169 00 Praha 6 Czech Republic */\r
+ You should have received a copy of the GNU General Public License
+ along with Prometheus Qos; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA \r
+ \r
+ GNU General Public License is located in file COPYING */
\r
#define STRLEN 256\r
#define FIRSTGROUPID 1024\r
\r
#include "cll1.h"\r
\r
-const char *version="0.8.0";\r
+const char *version="0.7.7-1"; /*0.7.9 will be last development, 0.8.0 first stable */\r
\r
/* ======= Help screen is hopefuly self-documenting part of code :-) ======= */\r
\r
char *mark="MARK";\r
char *mark_iptables="MARK --set-mark ";\r
int dry_run=0; /* preview - use puts() instead of system() */\r
-char *config="/etc/prometheus.conf"; /* main configuration file */\r
-char *hosts="/etc/hosts"; /* line bandwidth definition file */\r
+char *config="/etc/prometheus/prometheus.conf"; /* main configuration file */\r
+char *hosts="/etc/prometheus/hosts"; /* line bandwidth definition file */\r
char *tc="/sbin/tc"; /* requires tc with HTB support */\r
-char *iptables="/usr/sbin/iptables"; /* requires iptables utility */\r
-char *iptablessave="/usr/sbin/iptables-save"; /* new */\r
-char *iptablesrestore="/usr/sbin/iptables-restore"; /* new */\r
+char *iptables="/sbin/iptables"; /* requires iptables utility */\r
+char *iptablessave="/sbin/iptables-save"; /* new */\r
+char *iptablesrestore="/sbin/iptables-restore"; /* new */\r
char *iptablesfile="/var/spool/prometheus.iptables"; /* new; file for iptables-restore*/\r
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]";\r
FILE *iptables_file=NULL;\r
char *credit="/var/run/prometheus.credit"; /* credit log file */\r
int enable_credit=1; /* enable credit file */\r
int use_credit=0; /* use credit file (if enabled)*/\r
-char *log_dir="/var/www/html/logs/"; /* log directory pathname */\r
+char *log_dir="/var/www/logs/"; /* log directory pathname */\r
char *log_url="logs/"; /* log directory URL prefix */\r
char *title="Hall of Fame - Greatest Suckers"; /* hall of fame title */\r
int hall_of_fame=1; /* enable hall of fame */\r
int asymetry_ratio; /* ratio for ADSL-like upload */\r
int asymetry_fixed; /* fixed treshold for ADSL-like upload */\r
int data_limit; /* hard shaping: apply magic_treshold if max*data_limit MB exceeded */\r
- int prio_limit; /* soft shaping (qos): reduce HTB prio if max*prio_limit MB exceeded */\r
+ int data_prio; /* soft shaping (qos): reduce HTB prio if max*data_prio MB exceeded */\r
long fixed_limit; /* fixed data limit for setting lower HTB ceil */\r
long fixed_prio; /* fixed data lmit for setting lower HTB prio */\r
int reserve_min; /* bonus for nominal HTB rate bandwidth (in kbps) */\r
keyword->asymetry_ratio=1; /* ratio for ADSL-like upload */\r
keyword->asymetry_fixed=0; /* fixed treshold for ADSL-like upload */\r
keyword->data_limit=8; /* hard shaping: apply magic_treshold if max*data_limit MB exceeded */\r
- keyword->prio_limit=4; /* soft shaping (qos): reduce HTB prio if max*prio_limit MB exceeded */\r
+ keyword->data_prio=4; /* soft shaping (qos): reduce HTB prio if max*data_prio MB exceeded */\r
keyword->fixed_limit=0; /* fixed data limit for setting lower HTB ceil */\r
keyword->fixed_prio=0; /* fixed data limit for setting lower HTB prio */\r
keyword->reserve_min=8; /* bonus for nominal HTB rate bandwidth (in kbps) */\r
ioption("asymetry-ratio",keyword->asymetry_ratio);\r
ioption("asymetry-treshold",keyword->asymetry_fixed);\r
ioption("magic-relative-limit",keyword->data_limit);\r
- ioption("magic-relative-prio",keyword->prio_limit);\r
+ ioption("magic-relative-prio",keyword->data_prio);\r
loption("magic-fixed-limit",keyword->fixed_limit);\r
loption("magic-fixed-prio",keyword->fixed_prio);\r
ioption("htb-default-prio",keyword->default_prio);\r
_=tmptr;\r
\r
if(keyword->data_limit || keyword->fixed_limit || \r
- keyword->prio_limit || keyword->fixed_prio)\r
+ keyword->data_prio || keyword->fixed_prio)\r
use_credit=1;\r
\r
\r
else\r
sscanf(ptr,"%Lu",&traffic); traffic+=(1<<19); traffic>>=20;\r
break;\r
- case 3: if(strncmp(ptr,"post_",5) && strncmp(ptr,"forw_",5) || commonflag)\r
+ case 3: if((strncmp(ptr,"post_",5) && strncmp(ptr,"forw_",5)) || commonflag)\r
accept=eq(ptr,mark);\r
/*if (filter_type==1) accept=eq(ptr,"MARK"); else accept=eq(ptr,"CLASSIFY");*/\r
break;\r
\r
printf("\n\\r
Prometheus QoS - \"fair-per-IP\" Quality of Service setup utility.\n\\r
-Version %s - Copyright (C)2005-2007 Michael Polak (xChaos)\n\\r
+Version %s - Copyright (C)2005-2008 Michael Polak (xChaos)\n\\r
iptables-restore & burst tunning & classify modification 0.7d by Ludva\n\\r
Credits: CZFree.Net, Martin Devera, Netdave, Aquarius\n\n",version);\r
\r
\r
search(ip, ips, ip->min==group->min && ip->max>ip->min)\r
{\r
- if(ip->keyword->data_limit>0 &&\r
+ if( ip->keyword->data_limit && !ip->fixedprio &&\r
ip->traffic>ip->credit+\r
- (ip->min*ip->keyword->data_limit+(ip->keyword->fixed_limit<<20)) \r
- && !ip->fixedprio)\r
+ (ip->min*ip->keyword->data_limit+(ip->keyword->fixed_limit<<20)) )\r
{\r
if(group_rate<ip->max) ip->max=group_rate;\r
group_rate+=magic_treshold;\r
}\r
else\r
{\r
- if(ip->traffic>ip->credit+\r
- (ip->min*ip->keyword->prio_limit+(ip->keyword->fixed_prio<<20)) && \r
- !ip->fixedprio)\r
+ if( keyword->data_prio && !ip->fixedprio &&\r
+ ip->traffic>ip->credit+\r
+ (ip->min*ip->keyword->data_prio+(ip->keyword->fixed_prio<<20)) )\r
{\r
ip->prio=priority_sequence--;\r
if(ip->prio<2) ip->prio=2;\r
if(credit_file)\r
{\r
unsigned long long lcredit=0;\r
+ \r
if((ip->min*ip->keyword->data_limit+(ip->keyword->fixed_limit<<20))>ip->traffic) \r
lcredit=(ip->min*ip->keyword->data_limit+(ip->keyword->fixed_limit<<20))-ip->traffic;\r
fprintf(credit_file,"%s %Lu\n",ip->addr,lcredit);\r
fputs("<td colspan=\"4\"></td></th>\n</table>\n",f);\r
\r
if(active_classes>10)\r
- {\r
- fputs("<a name=\"erp\"></a><p><table border><tr><th colspan=\"4\">Enterprise Research and Planning (ERP)</th></tr>\n",f);\r
- fputs("<tr><td colspan=\"2\">Active Classes</td><td colspan=\"2\">Data transfers</td></tr>\n",f);\r
- find (sum,sums,sum->l>=total/4)\r
- fprintf(f,"<tr><td>Top %d</td><td align=\"right\">%d %%</td><td align=\"right\">%Lu M</td><td align=\"right\">%Ld %%</td></tr>\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total);\r
- find (sum,sums,sum->i==10)\r
- fprintf(f,"<tr><td>Top 10</td><td align=\"right\">%d %%</td><td align=\"right\">%Lu M</td><td align=\"right\">%Ld %%</td></tr>\n",(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total);\r
- find (sum,sums,sum->l>=total/2)\r
- fprintf(f,"<tr><td>Top %d</td><td align=\"right\">%d %%</td><td align=\"right\">%Lu M</td><td align=\"right\">%Ld %%</td></tr>\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total);\r
- find (sum,sums,sum->i>=(active_classes+3)/4)\r
- fprintf(f,"<tr><td>Top %d</td><td align=\"right\">%d %%</td><td align=\"right\">%Lu M</td><td align=\"right\">%Ld %%</td></tr>\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total);\r
- find (sum,sums,sum->i>=(active_classes+1)/2)\r
- fprintf(f,"<tr><td>Top %d</td><td align=\"right\">%d %%</td><td align=\"right\">%Lu M</td><td align=\"right\">%Ld %%</td></tr>\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total);\r
- fprintf(f,"<tr><th align=\"left\">All %d</th><th align=\"right\">100 %%</th><th align=\"right\">%Lu M</th><th align=\"right\">100 %%</th></tr>\n",active_classes,total);\r
- fputs("</table>\n",f);\r
- }\r
- fprintf(f,"<small>Statistics generated by Prometheus QoS version %s<br>GPL+Copyright(C)2005 Michael Polak, <a href=\"http://www.arachne.cz/\">Arachne Labs</a></small>\n",version);\r
+ {
+ fputs("<a name=\"erp\"></a><p><table border><tr><th colspan=\"5\">Enterprise Research and Planning (ERP)</th></tr>\n",f);
+ fputs("<tr><td>Analytic category</td>\n",f);
+ fputs("<td colspan=\"2\" align=\"center\">Active Classes</td><td colspan=\"2\" align=\"center\">Data transfers</td></tr>\n",f);
+
+ find(sum,sums,sum->l>=total/4)
+ {
+ fprintf(f,"<tr><td>Top 25%% of traffic</td>\n");
+ fprintf(f,"<td align=\"right\">%d</td><td align=\"right\">%d %%</td><td align=\"right\">%Lu M</td><td align=\"right\">%Ld %%</td></tr>\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total);
+ }
+
+ find(sum,sums,sum->i==10)
+ {
+ fprintf(f,"<tr><td>Top 10 downloaders</td>\n");
+ fprintf(f,"<th align=\"right\">10</th><td align=\"right\">%d %%</td><td align=\"right\">%Lu M</td><td align=\"right\">%Ld %%</td></tr>\n",(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total);
+ }
+
+ find(sum,sums,sum->l>=total/2)
+ {
+ fprintf(f,"<tr><td>Top 50%% of traffic</td>\n");
+ fprintf(f,"<td align=\"right\">%d</td><td align=\"right\">%d %%</td><td align=\"right\">%Lu M</td><th align=\"right\">%Ld %%</th></tr>\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,"<tr><td>Top 80%% of traffic</td>\n");
+ fprintf(f,"<td align=\"right\">%d</td><td align=\"right\">%d %%</td><td align=\"right\">%Lu M</td><th align=\"right\">%Ld %%</th></tr>\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,"<tr><td>Top 20%% downloaders</td>\n");
+ fprintf(f,"<td align=\"right\">%d</td><th align=\"right\">%d %%</th><td align=\"right\">%Lu M</td><td align=\"right\">%Ld %%</td></tr>\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,"<tr><td>Top 25%% downloaders</td>\n");
+ fprintf(f,"<td align=\"right\">%d</td><td align=\"right\">%d %%</td><td align=\"right\">%Lu M</td><td align=\"right\">%Ld %%</td></tr>\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,"<tr><td>Top 50%% downloaders</td>\n");
+ fprintf(f,"<td align=\"right\">%d</td><th align=\"right\">%d %%</th><td align=\"right\">%Lu M</td><td align=\"right\">%Ld %%</td></tr>\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,"<tr><td>Top 80%% downloaders</td>\n");
+ fprintf(f,"<td align=\"right\">%d</td><td align=\"right\">%d %%</td><td align=\"right\">%Lu M</td><td align=\"right\">%Ld %%</td></tr>\n",sum->i,(100*sum->i+50)/active_classes,sum->l,(100*sum->l+50)/total);
+ }
+
+ fprintf(f,"<tr><td>All users, all traffic</td>\n");
+ fprintf(f,"<th align=\"right\">%d</th><th align=\"right\">100 %%</th><th align=\"right\">%Lu M</th><th align=\"right\">100 %%</th></tr>\n",active_classes,total);
+ fputs("</table>\n",f);
+ }
+ fprintf(f,"<small>Statistics generated by Prometheus QoS version %s<br>GPL+Copyright(C)2005-2008 Michael Polak, <a href=\"http://www.arachne.cz/\">Arachne Labs</a></small>\n",version);\r
fclose(f);\r
}\r
\r