/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-/* Prometheus QoS - you can "steal fire" from your ISP *//* "fair-per-IP" quality of service (QoS) utility */\r
+/* 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-2013 Michael Polak, Arachne Aerospace */\r
/* iptables-restore support Copyright(C) 2007-2008 ludva */\r
char *mark_iptables = "MARK --set-mark ";\r
int dry_run = FALSE; /* preview - use puts() instead of system() */\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
-char *ip6preamble = "-A FORWARD -p ipv6-icmp -j ACCEPT\n-A POSTROUTING -p ipv6-icmp -j ACCEPT";\r
+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";\r
FILE *iptables_file = NULL;\r
FILE *ip6tables_file = NULL;\r
int enable_credit = TRUE; /* enable credit file */\r
int nodelay = FALSE;\r
int just_preview = FALSE; /* preview - generate just stats */\r
int start_shaping = FALSE; /* apply FUP - requires classmap file */\r
+ int stop_shaping = FALSE; /* lift FUP - requires classmap file */\r
+ int reduce_ceil = 0; /* allow only rate+(ceil-rate)/2, /4, etc. */\r
int just_logs = FALSE; /* just parse logs */\r
int run = FALSE;\r
int total = 0;\r
argument("-f") { run=TRUE; just_flush=TRUE; }\r
argument("-9") { run=TRUE; just_flush=9; }\r
argument("-p") { run=TRUE; just_preview=TRUE; }\r
+ argument("-q") { run=TRUE; just_preview=TRUE; stop_shaping=TRUE; }\r
+ argument("-2") { run=TRUE; just_preview=TRUE; reduce_ceil=2; }\r
+ argument("-4") { run=TRUE; just_preview=TRUE; reduce_ceil=4; }\r
argument("-s") { run=TRUE; just_preview=TRUE; start_shaping=TRUE; }\r
argument("-r") { run=TRUE; }\r
argument("-n") { run=TRUE; nodelay=TRUE; }\r
/*-----------------------------------------------------------------*/\r
for_each(ip,ips) if(ip->sharing)\r
{\r
- for_each(sharedip,ips) if(eq(sharedip->name,ip->sharing))\r
+ for_each(sharedip,ips) if(eq(sharedip->name, ip->sharing))\r
{\r
- sharedip->traffic+=ip->traffic;\r
- ip->traffic=0;\r
- ip->mark=sharedip->mark; \r
- ip->lmsid=sharedip->lmsid;\r
+ sharedip->traffic += ip->traffic;\r
+ ip->traffic = 0;\r
+ ip->mark = sharedip->mark; \r
+ ip->lmsid = sharedip->lmsid;\r
break;\r
}\r
if(not sharedip)\r
{\r
perror(cmdlog);\r
exit(-1);\r
- }\r
- \r
+ } \r
\r
sprintf(str,"%s qdisc del dev %s root 2>/dev/null",tc,lan);\r
safe_run(str);\r
\r
if(just_preview)\r
{\r
- if(start_shaping)\r
+ if(start_shaping || stop_shaping || reduce_ceil)\r
{\r
printf("Reading %s and applying Fair Use Policy rules ... \n", classmap);\r
parse(classmap)\r
if_exists(ip,ips,eq(ip->addr,_))\r
{\r
ip->mark=atoi(ptr);\r
- if(ip->max < ip->desired) /* apply FUP limit immediately.... */\r
+ if(ip->max < ip->desired || stop_shaping || reduce_ceil) /* apply or disable FUP limit immediately.... */\r
{\r
- printf("Applying limit for %-22s %-16s %04d ", ip->name, ip->addr, ip->mark); \r
+ if(stop_shaping)\r
+ {\r
+ ip->max = ip->desired;\r
+ printf("Removing limit for %-22s %-16s %04d ", ip->name, ip->addr, ip->mark); \r
+ }\r
+ else\r
+ {\r
+ printf("Applying limit for %-22s %-16s %04d ", ip->name, ip->addr, ip->mark);\r
+ if(reduce_ceil)\r
+ {\r
+ ip->max = ip->min + (ip->desired-ip->min)/reduce_ceil;\r
+ }\r
+ }\r
printf("(down: %dk-%dk ", ip->min, ip->max); \r
sprintf(str, "%s class change dev %s parent 1:%d classid 1:%d htb rate %dkbit ceil %dkbit burst %dk prio %d", \r
tc, lan, ip->group, ip->mark,ip->min,ip->max, burst, ip->prio);\r
perror(classmap);\r
puts("Warning - classmap file not fund, just generating preview ...");\r
start_shaping=FALSE;\r
+ stop_shaping=FALSE;\r
}\r
done; /* ugly macro end */\r
}\r
{\r
swchar='s';\r
}\r
+ else if(reduce_ceil)\r
+ {\r
+ swchar='0'+reduce_ceil; /* -2, -4 */\r
+ }\r
+ else if(stop_shaping)\r
+ {\r
+ swchar='q';\r
+ }\r
+\r
printf("Statistics preview generated (-%c switch) - now exiting ...\n", swchar);\r
exit(0);\r
} \r
printf("%-22s %-15s mark\n","name","ip");\r
#endif\r
\r
- printf("Writing %s ... ", classmap); \r
+ printf("Writing %s", classmap); \r
f = fopen(classmap, "w"); \r
if(f < 0)\r
{\r
}\r
\r
/*-----------------------------------------------------------------*/\r
- puts(" + generating iptables and tc classes ... ");\r
+ printf(" + generating iptables and tc classes ... ");\r
/*-----------------------------------------------------------------*/\r
\r
for_each(ip, ips) if(ip->mark > 0) /* works only for IPv4 so far */\r