X-Git-Url: http://git.harvie.cz/?p=svn%2FPrometheus-QoS%2F.git;a=blobdiff_plain;f=prometheus.c;h=03b75543d8964c125fc87c03b48995d74505b162;hp=dea239a2e9366b429790ce9389f976486fe23a03;hb=64b2d1255780905c78973df33145c93ee5613c9c;hpb=a25842fafee4469c8acbacd673fc4c905bcab3f9 diff --git a/prometheus.c b/prometheus.c index dea239a..03b7554 100644 --- a/prometheus.c +++ b/prometheus.c @@ -2,12 +2,12 @@ /* 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-2013 Michael Polak, Arachne Aerospace */ +/* Copyright(C) 2005-2014 Michael Polak, Arachne Aerospace */ /* iptables-restore support Copyright(C) 2007-2008 ludva */ /* Credit: CZFree.Net,Martin Devera,Netdave,Aquarius,Gandalf */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -/* Modified by: xChaos, 20131119 +/* Modified by: xChaos, 20140812 ludva, 20080415 Prometheus QoS is free software; you can redistribute it and/or @@ -29,7 +29,7 @@ #include "cll1-0.6.2.h" #include "ipstruct.h" -const char *version = "0.8.3-j"; +const char *version = "0.8.5-b"; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Versions: 0.8.3 is development release, 0.8.4 will be "stable" */ @@ -40,7 +40,7 @@ const char *version = "0.8.3-j"; /* Warning: unofficial Github mirror is not supported by author! */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -const char *stats_html_signature = "Statistics generated by Prometheus QoS version %s
GPL+Copyright(C)2005-2013 Michael Polak, Arachne Labs
\n"; +const char *stats_html_signature = "Statistics generated by Prometheus QoS version %s
GPL+Copyright(C)2005-2014 Michael Polak, Arachne Labs
\n"; #define STRLEN 512 #undef DEBUG @@ -58,6 +58,7 @@ 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 */ +char *macrosfile = "/etc/prometheus/prometheus.macros"; /* rewrite rules for most common tariffs */ char *iptablesfile = "/var/spool/prometheus.iptables"; /* temporary file for iptables-restore*/ char *ip6tablesfile = "/var/spool/prometheus.ip6tables"; /* temporary file for ip6tables-restore*/ char *credit = "/var/lib/misc/prometheus.credit"; /* credit log file */ @@ -98,18 +99,20 @@ 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 */ int free_max = 512; /* maximum allowed bandwidth for all undefined hosts */ +int overlimit_min = 256; /* minimum guaranted bandwidth for all undefined hosts */ +int overlimit_max = 512; /* maximum allowed bandwidth for all undefined hosts */ 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 max_nesting = 5; /* /include/uapi/linux/pkt_sched.h: #define TC_HTB_MAXDEPTH 8 [... - 3 parent classes] */ 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; @@ -122,7 +125,7 @@ FILE *log_file = NULL; char *kwd = "via-prometheus"; /* /etc/hosts comment, eg. #qos-64-128 */ 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 lowest_priority = 7; /* lowest HTB priority /include/uapi/linux/pkt_sched.h: #define TC_HTB_NUMPRIO 8 */ 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 */ @@ -130,7 +133,8 @@ const int idxtable_bitmask2 = 3; /* this is no longer configurable */ struct IP *ips = NULL, *networks = NULL, *ip, *sharedip; struct Group *groups = NULL, *group; -struct Keyword *keyword, *defaultkeyword=NULL, *keywords=NULL; +struct Keyword *keyword, *defaultkeyword=NULL, *keywords = NULL; +struct Macro *macro, *macros = NULL; #define FREE_CLASS 3 #define OVERLIMIT_CLASS 4 @@ -220,24 +224,25 @@ void get_config(char *config_filename) printf("%s ",kwd); create(keyword,Keyword); - keyword->key=kwd; - 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->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) */ - keyword->default_prio=highest_priority+1; - keyword->html_color="000000"; - keyword->ip_count=0; - keyword->leaf_discipline=""; - - push(keyword,keywords); + keyword->key = kwd; + 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->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) */ + keyword->default_prio = highest_priority+1; + keyword->html_color = "000000"; + keyword->ip_count = 0; + keyword->leaf_discipline = ""; + keyword->allowed_avgmtu = 0; + + push(keyword, keywords); if(!defaultkeyword) { - defaultkeyword=keyword; + defaultkeyword = keyword; } keywordcount++; @@ -253,17 +258,18 @@ void get_config(char *config_filename) { 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); - option("leaf-discipline",keyword->leaf_discipline); - option("html-color",keyword->html_color); + foption("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); + option("leaf-discipline", keyword->leaf_discipline); + option("html-color", keyword->html_color); + ioption("allowed-avgmtu" ,keyword->allowed_avgmtu); _=tmptr; if(keyword->data_limit || keyword->fixed_limit || @@ -310,12 +316,14 @@ 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("overlimit-rate",overlimit_min); + ioption("overlimit-ceil",overlimit_max); ioption("htb-burst",burst); ioption("htb-burst-main",burst_main); ioption("htb-burst-group",burst_group); @@ -444,12 +452,20 @@ void run_iptables_restore(void) char *parse_datafile_line(char *str) { - char *ptr=strchr(str,' '); + char *ptr = strchr(str,' '); + if(!ptr) + { + ptr = strchr(str,'\t'); + } if(ptr) { - *ptr=0; + *ptr = 0; ptr++; + while(*ptr == ' ' || *ptr == '\t') + { + ptr++; + } return ptr; } else @@ -487,7 +503,7 @@ program printf("\n\ Prometheus QoS - \"fair-per-IP\" Quality of Service setup utility.\n\ -Version %s - Copyright (C)2005-2013 Michael Polak, Arachne Labs\n\ +Version %s - Copyright (C)2005-2014 Michael Polak, Arachne Labs\n\ iptables-restore & burst tunning & classify modification by Ludva\n\ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version); @@ -565,6 +581,23 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version); string(str, STRLEN); string(limit_pkts, STRLEN); + /*-----------------------------------------------------------------*/ + printf("Parsing macro definition file %s ...\n", macrosfile); + /*-----------------------------------------------------------------*/ + parse(macrosfile) + { + ptr = parse_datafile_line(_); + if(ptr) + { + create(macro, Macro); + macro->rewrite_from = _; + macro->rewrite_to = ptr; + push(macro, macros); + printf("%s -> %s\n", macro->rewrite_from, macro->rewrite_to); + } + } + done; /* ugly macro end */ + /*-----------------------------------------------------------------*/ printf("Parsing class defintion file %s ...\n", hosts); /*-----------------------------------------------------------------*/ @@ -587,6 +620,23 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version); ip->mark = sharedip->mark; ip->lmsid = sharedip->lmsid; ip->pps_limit = sharedip->pps_limit; /* no other way to do this */ + + /* Ugly hack: append IPv4 addresses of sharedip to IPv6 uplinks */ + ptr = strchr(ip->addr, '+'); + if(ptr && ptr-ip->addr > 1 && !sharedip->v6) + { + *(--ptr) = 0; + concatenate(ip->addr, sharedip->addr, ptr); + ip->name = ip->addr = ptr; + ptr = strchr(ip->addr, '.'); + while(ptr && *ptr) + { + *ptr = ':'; + ptr = strchr(ptr, '.'); + } + ip->mask += 64; + } + break; } if(not sharedip) @@ -603,7 +653,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version); /*-----------------------------------------------------------------*/ parse(credit) { - ptr=parse_datafile_line(_); + ptr = parse_datafile_line(_); if(ptr) { if_exists(ip,ips,eq(ip->addr,_)) @@ -615,6 +665,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version); done; /* ugly macro end */ } + if(!just_preview) { /*-----------------------------------------------------------------*/ @@ -965,8 +1016,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version); { if( ip->keyword->data_prio && !ip->fixedprio - && ( ip->traffic>ip->credit - + (ip->min*ip->keyword->data_prio+(ip->keyword->fixed_prio<<20))) ) + && ( ip->traffic > ip->credit + (ip->min*ip->keyword->data_prio+(ip->keyword->fixed_prio<<20))) ) { ip->prio=priority_sequence--; if(ip->prioaddr, 32*(1+ip->v6), + chain_postrouting, ip->addr, ip->mask, lan, mark_iptables, ip->mark); iptables_save_line(str, ip->v6); @@ -1159,40 +1209,40 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version); { sprintf(str, "-A %s -s %s -p tcp --sport %d -d %s/%d -o %s -j %s%d", chain_postrouting, proxy_ip, proxy_port, ip->addr, - 32*(1+ip->v6), lan, mark_iptables, ip->mark); + ip->mask, lan, mark_iptables, ip->mark); iptables_save_line(str, ip->v6); } */ sprintf(str, "-A %s -d %s/%d -o %s %s-j ACCEPT", - chain_postrouting, ip->addr, 32*(1+ip->v6), lan, limit_pkts); + chain_postrouting, ip->addr, ip->mask, 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), + chain_postrouting, ip->addr, ip->mask, 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); + chain_postrouting, ip->addr, ip->mask, 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); + chain_forward, ip->addr, ip->mask, wan, mark_iptables, ip->mark); iptables_save_line(str, ip->v6); sprintf(str, "-A %s -s %s/%d -o %s %s-j ACCEPT", - chain_forward, ip->addr, 32*(1+ip->v6), wan, limit_pkts); + chain_forward, ip->addr, ip->mask, 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); + chain_forward, ip->addr, ip->mask, 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); + chain_forward, ip->addr, ip->mask, wan); iptables_save_line(str, ip->v6); if(ip->min) @@ -1356,10 +1406,10 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version); 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); + tc, lan, parent, OVERLIMIT_CLASS, overlimit_min, overlimit_max, 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); + tc, wan, parent, OVERLIMIT_CLASS, overlimit_min, overlimit_max, burst, lowest_priority); safe_run(str); } printf("Total IP count: %d\n", i);