X-Git-Url: https://git.harvie.cz/?a=blobdiff_plain;f=prometheus.c;h=1227592f5e566027f35ced5bf9272bc9c0234e6f;hb=7ae5a5939e4328ed4a1d8c025ea6769265574260;hp=c88857b6268e57d9767d419573c0afb15f8c501b;hpb=c38473c17cd984140f177ccb2000089e10444299;p=svn%2FPrometheus-QoS%2F.git diff --git a/prometheus.c b/prometheus.c index c88857b..1227592 100644 --- a/prometheus.c +++ b/prometheus.c @@ -7,7 +7,7 @@ /* Credit: CZFree.Net,Martin Devera,Netdave,Aquarius,Gandalf */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -/* Modified by: xChaos, 20131118 +/* Modified by: xChaos, 20131119 ludva, 20080415 Prometheus QoS is free software; you can redistribute it and/or @@ -98,11 +98,11 @@ char *ip6prefix = NULL; /* Prefix for global /48 IPv6 subnet */ char *wan_medium = "100Mbit"; /* 10Mbit/100Mbit ethernet */ char *qos_leaf = "sfq perturb 5"; /* leaf discipline */ char *qos_free_zone = NULL; /* QoS free zone */ -int qos_proxy = TRUE; /* include proxy port to QoS */ +/* int qos_proxy = TRUE; include proxy port to QoS */ int found_lmsid = FALSE; /* show links to users in LMS information system */ int include_upload = TRUE; /* upload+download=total traffic */ -char *proxy_ip = "192.168.1.1/32"; /* our IP with proxy port */ -int proxy_port = 3128; /* proxy port number */ +/* char *proxy_ip = "192.168.1.1/32"; our IP with proxy port */ +/* int proxy_port = 3128; proxy port number */ long long int line = 1024; /* WAN/ISP download in kbps */ long long int up = 1024; /* WAN/ISP upload in kbps */ int free_min = 256; /* minimum guaranted bandwidth for all undefined hosts */ @@ -132,6 +132,9 @@ struct IP *ips = NULL, *networks = NULL, *ip, *sharedip; struct Group *groups = NULL, *group; struct Keyword *keyword, *defaultkeyword=NULL, *keywords=NULL; +#define FREE_CLASS 3 +#define OVERLIMIT_CLASS 4 + void help(void); /* implemented in help.c */ @@ -307,10 +310,10 @@ void get_config(char *config_filename) ioption("use-jquery-popups",use_jquery_popups); option("qos-free-zone",qos_free_zone); ioption("qos-free-delay",qos_free_delay); - ioption("qos-proxy-enable",qos_proxy); - option("qos-proxy-ip",proxy_ip); +/* ioption("qos-proxy-enable",qos_proxy); */ +/* option("qos-proxy-ip",proxy_ip);*/ option("htb-leaf-discipline",qos_leaf); - ioption("qos-proxy-port",proxy_port); +/* ioption("qos-proxy-port",proxy_port); */ ioption("free-rate",free_min); ioption("free-ceil",free_max); ioption("htb-burst",burst); @@ -669,6 +672,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version); sprintf(str,"-A FORWARD -d %s -o %s -j ACCEPT", qos_free_zone, wan); iptables_save_line(str, FALSE); /* this is currently supported only for IPv4 */ +/* if(qos_proxy) { iptables_save_line(":post_noproxy - [0:0]", FALSE); @@ -681,10 +685,12 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version); chain="post_noproxy"; } + else { - chain="POSTROUTING"; - } +*/ + chain = "POSTROUTING"; +// } sprintf(str,"-A %s -s %s -o %s -j ACCEPT", chain, qos_free_zone, lan); iptables_save_line(str, FALSE); @@ -1127,18 +1133,28 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version); chain_postrouting="POSTROUTING"; } + /* packet limits - this will be optional in future */ + if(ip->pps_limit) + { + sprintf(limit_pkts, "-m limit --limit %d/s --limit-burst %d ", + ip->pps_limit, ip->pps_limit); + } + else + { + *limit_pkts = 0; + } + #ifdef DEBUG - printf("%-22s %-16s %04d ", ip->name, ip->addr, ip->mark); + printf("%-22s %-16s %04d %d/s\n", ip->name, ip->addr, ip->mark, ip->pps_limit); #endif - /* -------------------------------------------------------- mark download */ - + /* -------------------------------------------------------- mark download */ sprintf(str, "-A %s -d %s/%d -o %s -j %s%d", chain_postrouting, ip->addr, 32*(1+ip->v6), lan, mark_iptables, ip->mark); - /* -m limit --limit 1/s */ iptables_save_line(str, ip->v6); +/* if(qos_proxy) { sprintf(str, "-A %s -s %s -p tcp --sport %d -d %s/%d -o %s -j %s%d", @@ -1146,14 +1162,21 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version); 32*(1+ip->v6), lan, mark_iptables, ip->mark); iptables_save_line(str, ip->v6); } - - /* this will be optional in future - hardcoded for now*/ - sprintf(limit_pkts,"-m limit --limit %d/s ", ip->pps_limit); - +*/ sprintf(str, "-A %s -d %s/%d -o %s %s-j ACCEPT", chain_postrouting, ip->addr, 32*(1+ip->v6), lan, limit_pkts); iptables_save_line(str, ip->v6); + /* classify overlimit packets to separate overlimit class */ + sprintf(str, "-A %s -d %s/%d -o %s -j %s%d", + chain_postrouting, ip->addr, 32*(1+ip->v6), + lan, mark_iptables, OVERLIMIT_CLASS); + iptables_save_line(str, ip->v6); + + sprintf(str, "-A %s -d %s/%d -o %s -j ACCEPT", + chain_postrouting, ip->addr, 32*(1+ip->v6), lan); + iptables_save_line(str, ip->v6); + /* -------------------------------------------------------- mark upload */ sprintf(str, "-A %s -s %s/%d -o %s -j %s%d", chain_forward, ip->addr, 32*(1+ip->v6), wan, mark_iptables, ip->mark); @@ -1163,6 +1186,15 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version); chain_forward, ip->addr, 32*(1+ip->v6), wan, limit_pkts); iptables_save_line(str, ip->v6); + /* classify overlimit packets to separate overlimit class */ + sprintf(str, "-A %s -s %s/%d -o %s -j %s%d", + chain_forward, ip->addr, 32*(1+ip->v6), wan, mark_iptables, OVERLIMIT_CLASS); + iptables_save_line(str, ip->v6); + + sprintf(str, "-A %s -s %s/%d -o %s -j ACCEPT", + chain_forward, ip->addr, 32*(1+ip->v6), wan); + iptables_save_line(str, ip->v6); + if(ip->min) { /* -------------------------------------------------------- download class */ @@ -1249,23 +1281,25 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version); 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); - iptables_save_line(str, FALSE); /* only for IPv4 */ + iptables_save_line(str, FALSE); // only for IPv4 } sprintf(str, "-A %s -s %s -p tcp --sport %d -o %s -j %s", chain_postrouting,proxy_ip,proxy_port,lan,final_chain); - iptables_save_line(str, FALSE); /* only for IPv4 */ + iptables_save_line(str, FALSE); // only for IPv4 } +*/ if(free_min) { sprintf(str, "-A %s -o %s -j %s%d", - chain_postrouting, lan, mark_iptables, 3); + chain_postrouting, lan, mark_iptables, FREE_CLASS); iptables_save_line(str, FALSE); /* only for IPv4 */ } @@ -1279,7 +1313,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version); if(free_min) { - sprintf(str,"-A %s -o %s -j %s%d", chain_forward, wan, mark_iptables, 3); + sprintf(str,"-A %s -o %s -j %s%d", chain_forward, wan, mark_iptables, FREE_CLASS); iptables_save_line(str, FALSE); /* only for IPv4 */ } @@ -1294,28 +1328,38 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version); if(free_min) /* allocate free bandwith if it is not zero... */ { /*-----------------------------------------------------------------*/ - puts("Generating free bandwith classes ..."); + puts("Generating free bandwith class ..."); /*-----------------------------------------------------------------*/ - 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); + sprintf(str, "%s class add dev %s parent 1:%d classid 1:%d htb rate %dkbit ceil %dkbit burst %dk prio %d", + tc, lan, parent, FREE_CLASS, 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); + sprintf(str, "%s class add dev %s parent 1:%d classid 1:%d htb rate %dkbit ceil %dkbit burst %dk prio %d", + tc, wan, parent, FREE_CLASS, 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); + sprintf(str,"%s qdisc add dev %s parent 1:%d handle %d %s", tc, lan, FREE_CLASS, FREE_CLASS, qos_leaf); safe_run(str); - sprintf(str,"%s qdisc add dev %s parent 1:3 handle 3 %s", tc, wan, qos_leaf); + sprintf(str,"%s qdisc add dev %s parent 1:%d handle %d %s", tc, wan, FREE_CLASS, FREE_CLASS, 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); + sprintf(str,"%s filter add dev %s parent 1:0 protocol ip handle %d fw flowid 1:%d", tc, lan, FREE_CLASS, FREE_CLASS); + safe_run(str); + + sprintf(str,"%s filter add dev %s parent 1:0 protocol ip handle %d fw flowid 1:%d", tc, wan, FREE_CLASS, FREE_CLASS); safe_run(str); - sprintf(str,"%s filter add dev %s parent 1:0 protocol ip handle 3 fw flowid 1:3", tc, wan); + /*-----------------------------------------------------------------*/ + puts("Generating bandwith class for overlimit packets..."); + /*-----------------------------------------------------------------*/ + sprintf(str, "%s class add dev %s parent 1:%d classid 1:%d htb rate %dkbit ceil %dkbit burst %dk prio %d", + tc, lan, parent, OVERLIMIT_CLASS, 1024, 4096, burst, lowest_priority); + safe_run(str); + sprintf(str, "%s class add dev %s parent 1:%d classid 1:%d htb rate %dkbit ceil %dkbit burst %dk prio %d", + tc, wan, parent, OVERLIMIT_CLASS, 1024, 4096, burst, lowest_priority); safe_run(str); } printf("Total IP count: %d\n", i);