more refucktoring (into multiple modules)
[svn/Prometheus-QoS/.git] / prometheus.c
index 64012559235dc72987d087318984737e747a92bf..717971410549b1ce35de9bc6eadc77ce1ae55fe3 100644 (file)
@@ -7,7 +7,7 @@
 /*  Credit: CZFree.Net,Martin Devera,Netdave,Aquarius,Gandalf  */\r
 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */\r
 \r
-/* Modified by: xChaos, 20120612\r
+/* Modified by: xChaos, 20121007\r
                  ludva, 20080415\r
  \r
    Prometheus QoS is free software; you can redistribute it and/or\r
    GNU General Public License is located in file COPYING */\r
 \r
 #define STRLEN 512\r
-#define FIRSTGROUPID 1024\r
-#define FIRSTIPCLASS 2048\r
 #undef DEBUG\r
 \r
 #include "cll1-0.6.2.h"\r
+#include "ipstruct.h"\r
 \r
-const char *version = "0.8.3-f";\r
+const char *version = "0.8.3-g";\r
 \r
 /* Version numbers: 0.8.3 is development releases ("beta"), 0.8.4 will be "stable" */\r
 /* Debian(RPM) package versions/patchlevels: 0.7.9-2, 0.8.0-1, 0.8.0-2, etc. */\r
@@ -74,6 +73,9 @@ int      row_odd_even = 0; /*<tr class="odd/even"> */
 void parse_ip_log(int argc, char **argv);\r
 /* implementid in parselog.c */\r
 \r
+void parse_hosts(char *hosts);\r
+/* implementid in parsehosts.c */\r
+\r
 const char *tr_odd_even(void)\r
 {\r
  row_odd_even = 1 - row_odd_even;\r
@@ -146,6 +148,8 @@ int         burst_main = 64;
 int        burst_group = 32;\r
 int     magic_treshold = 8; /* reduce ceil by X*magic_treshhold kbps (hard shaping) */\r
 int       keywordcount = 0;\r
+int class_count        = 0;\r
+int ip_count           = 0;\r
 /* not yet implemented:\r
 int      fixed_packets = 0; maximum number of pps per IP address (not class!) \r
 int       packet_limit = 5; maximum number of pps to htn CEIL, not rate !!! \r
@@ -160,40 +164,11 @@ const int idxtable_treshold2 = 12;      /* this is no longer configurable */
 const int idxtable_bitmask1  = 3;        /* this is no longer configurable */\r
 const int idxtable_bitmask2  = 3;        /* this is no longer configurable */\r
 \r
-/* ==== This is C<<1 stuff - learn C<<1 first! https://dev.arachne.cz/svn/cll1h ==== */\r
+struct IP *ips = NULL, *ip, *sharedip;\r
+struct Group *groups = NULL, *group;\r
+struct Keyword *keyword, *defaultkeyword=NULL, *keywords=NULL;\r
 \r
-struct IP\r
-{\r
- char *addr;\r
- char *name;\r
- char *sharing;\r
- int min;\r
- int desired;\r
- int max;\r
- int mark;\r
- int prio;\r
- int fixedprio;\r
- int group;\r
- int lmsid;\r
- unsigned long long direct;\r
- unsigned long long proxy;\r
- unsigned long long upload;\r
- unsigned long long traffic;\r
- unsigned long long credit;\r
- unsigned long pktsup;\r
- unsigned long pktsdown;\r
- struct Keyword *keyword;\r
- list(IP);\r
-} *ips=NULL, *ip, *sharedip;\r
-\r
-struct Group\r
-{\r
- int min;\r
- int count;\r
- int desired;\r
- int id;\r
- list(Group);\r
-} *groups=NULL, *group;\r
+/* ==== This is C<<1 stuff - learn C<<1 first! https://dev.arachne.cz/svn/cll1h ==== */\r
 \r
 struct Index\r
 {\r
@@ -205,53 +180,10 @@ struct Index
  list(Index);\r
 } *idxs=NULL, *idx, *metaindex;\r
 \r
-struct Keyword\r
-{\r
- char *key;\r
\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 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
- int reserve_max;          /* malus for nominal HTB ceil (in kbps) */\r
-// int divide_max;         /* relative malus: new_ceil=rate+(old_ceil-rate)/divide_max */\r
-// int htb_ceil_bonus_divide; /* relative bonus: new_ceil=old_ceil+old_ceil/htb_ceil_bonus_divide */\r
- int default_prio;         /* default HTB priority for this keyword */\r
- char *html_color;\r
- int ip_count;\r
- char *leaf_discipline;\r
\r
- list(Keyword);\r
-} *keyword,*defaultkeyword=NULL,*keywords=NULL;\r
 \r
-/* Damned, this must be object oriented! This looks almost like constructor ;-) */\r
 \r
-void TheIP(void)\r
-{\r
- create(ip,IP);\r
- ip->name        = "";\r
- ip->addr        = "";\r
- ip->sharing     = NULL;\r
- ip->prio        = highest_priority+1;\r
- ip->lmsid       = -1;\r
- ip->fixedprio   = \\r
- ip->mark        = \\r
- ip->min         = \\r
- ip->max         = \\r
- ip->desired     = \\r
- ip->credit      = \\r
- ip->upload      = \\r
- ip->proxy       = \\r
- ip->direct      = \\r
- ip->traffic     = \\r
- ip->pktsup      = \\r
- ip->pktsdown    = 0;\r
- ip->keyword     = keywords;\r
- push(ip,ips);\r
-}\r
+void TheIP(void);\r
+/* function implemented in parsehosts.c */\r
 \r
 /* ====== iptables indexes are used to reduce complexity to log8(N) ===== */\r
 \r
@@ -712,57 +644,6 @@ void run_restore(void)
  free(restor);\r
 }\r
 \r
-/* == This function strips extra characters after IP address and stores it = */\r
-\r
-void parse_ip(char *str)\r
-{\r
- char *ptr,*ipaddr=NULL,*ipname=NULL,*lmsid=NULL;\r
-\r
- ptr=strchr(str,'{');\r
- if(ptr)\r
- {\r
-  lmsid=++ptr;\r
-  while(*ptr && *ptr!='}')\r
-  {\r
-   ptr++;\r
-  }\r
-  *ptr=0;\r
- }\r
\r
- ptr=str;\r
- while(*ptr && *ptr!=' ' && *ptr!=9)\r
- {\r
-  ptr++;\r
- }\r
\r
- *ptr=0;\r
- ipaddr=str;\r
- ptr++;\r
- while(*ptr && (*ptr==' ' || *ptr==9))\r
- {\r
-  ptr++;\r
- }\r
- ipname=ptr; \r
- while(*ptr && *ptr!=' ' && *ptr!=9)\r
- {\r
-  ptr++;\r
- }\r
- *ptr=0;\r
-\r
- if_exists(ip,ips,eq(ip->addr,ipaddr));\r
- else\r
- {\r
-  TheIP();\r
- }\r
- ip->addr=ipaddr;\r
- ip->name=ipname;\r
- if(lmsid)\r
- {\r
-  ip->lmsid=atoi(lmsid);\r
-  found_lmsid=1;\r
- }\r
-}\r
-\r
 char *parse_datafile_line(char *str)\r
 {\r
  char *ptr=strchr(str,' ');\r
@@ -779,9 +660,6 @@ char *parse_datafile_line(char *str)
  }\r
 }\r
 \r
-\r
-\r
-\r
 void append_log(struct IP *self) /*using global variables*/\r
 {\r
  char *d, *str;\r
@@ -804,7 +682,6 @@ void append_log(struct IP *self) /*using global variables*/
  }\r
 }\r
 \r
-\r
 /*-----------------------------------------------------------------*/\r
 /* Are you looking for int main(int argc, char **argv) ? :-))      */\r
 /*-----------------------------------------------------------------*/\r
@@ -815,7 +692,7 @@ program
  FILE *f=NULL;               /* everything is just stream of bytes... */\r
  char *str, *ptr, *d;        /* LET A$=B$ :-) */\r
  char *substring;\r
- int class_count=0,ip_count=0;\r
+\r
  int parent=1;\r
  int just_flush=FALSE;       /* deactivates all previous actions */\r
  int nodelay=FALSE;\r
@@ -894,107 +771,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
  /*-----------------------------------------------------------------*/\r
  printf("Parsing class defintion file %s ...\n", hosts);\r
  /*-----------------------------------------------------------------*/\r
- int groupidx = FIRSTGROUPID;\r
- parse(hosts)\r
- {\r
-  str=_;\r
-\r
-  if(*str<'0' || *str>'9')\r
-  {\r
-   /* any line starting with non-number is comment ...*/\r
-   continue;\r
-  }\r
-  \r
-  //Does this IP share QoS class with some other ?\r
-  substring=strstr(str,"sharing-");\r
-  if(substring)\r
-  { \r
-   substring+=8; //"sharing-"\r
-   parse_ip(str);\r
-   ip_count++;\r
-   ip->sharing=substring;\r
-   ip->keyword=defaultkeyword; /* settings for default keyword */\r
-   while(*substring && *substring!='\n')\r
-   {\r
-    substring++;\r
-   }\r
-   *substring=0; \r
-  }\r
-  else\r
-  {\r
-   //Do we have to create new QoS class for this IP ?\r
-\r
-   if_exists(keyword,keywords,(substring=strstr(str,keyword->key)))\r
-   {\r
-    parse_ip(str);\r
-    ip_count++;\r
-    ip->keyword=keyword;\r
-    keyword->ip_count++;\r
-    ip->prio=keyword->default_prio;\r
-    substring+=strlen(keyword->key)+1;\r
-    ptr=substring;\r
-    while(*ptr && *ptr!='-')\r
-    {\r
-     ptr++;\r
-    }\r
-    if(*ptr=='-')\r
-    {\r
-     *ptr=0;\r
-     ip->max = ip->desired=atoi(ptr+1);\r
-    }\r
-    ip->min = atoi(substring);\r
-    if(ip->min <= 0)\r
-    {\r
-     printf(" %s: Illegal value of minimum bandwidth 0 kbps, using %d kb/s\n",\r
-            str, free_min);\r
-     ip->min = free_min;\r
-    }\r
-    if(ip->max <= ip->min)\r
-    {\r
-     ip->fixedprio = 1;\r
-     ip->max = ip->min+ip->keyword->reserve_min;\r
-    }\r
-    else \r
-    {\r
-     ip->max -= ip->keyword->reserve_max;\r
-     if(ip->max<ip->min)\r
-     {\r
-      ip->max=ip->min;\r
-     }\r
-    }\r
-    ip->mark=FIRSTIPCLASS+1+class_count++;\r
-\r
-    if_exists(group,groups,group->min==ip->min) \r
-    { \r
-     group->count++;      \r
-     group->desired += ip->min;\r
-     ip->group = group->id;   \r
-    }\r
-    else\r
-    {\r
-     create(group,Group);\r
-     group->min = ip->min;\r
-     group->id = groupidx++;\r
-     ip->group = group->id;\r
-\r
-     if(group->min<8) group->min=8;\r
-     /* Warning - this is maybe because of primitive tc namespace, can be fixed */\r
-     /* it is because class IDs are derived from min. bandwidth. - xCh */\r
-     //if(group->min>MAX_GUARANTED_KBPS) group->min=MAX_GUARANTED_KBPS;\r
-     \r
-     group->count=1;\r
-     group->desired=ip->min;   \r
-     insert(group,groups,desc_order_by,min);\r
-    }\r
-   }//endif keyword-\r
-  }//endif sharing-\r
- }\r
- fail\r
- {\r
-  perror(hosts);\r
-  exit(-1);\r
- }\r
- done; /* ugly macro end */\r
+ parse_hosts(hosts);\r
 \r
  /*-----------------------------------------------------------------*/\r
  /* cll1.h - let's allocate brand new character buffer...           */\r
@@ -1014,7 +791,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
    ip->lmsid=sharedip->lmsid;\r
    break;\r
   }\r
-  if(!sharedip)\r
+  if(not sharedip)\r
   {\r
    printf("Unresolved shared connection: %s %s sharing-%s\n",\r
           ip->addr, ip->name, ip->sharing);\r
@@ -1082,11 +859,11 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
    if(qos_proxy)\r
    {\r
     save_line(":post_noproxy - [0:0]");\r
-    sprintf(str,"-A POSTROUTING -p ! tcp -o %s -j post_noproxy", lan);\r
+    sprintf(str,"-A POSTROUTING ! -p tcp -o %s -j post_noproxy", lan);\r
     save_line(str);   \r
-    sprintf(str,"-A POSTROUTING -s ! %s -o %s -j post_noproxy", proxy_ip, lan);\r
+    sprintf(str,"-A POSTROUTING ! -s %s -o %s -j post_noproxy", proxy_ip, lan);\r
     save_line(str);   \r
-    sprintf(str,"-A POSTROUTING -s %s -p tcp --sport ! %d -o %s -j post_noproxy", proxy_ip, proxy_port, lan);\r
+    sprintf(str,"-A POSTROUTING -s %s -p tcp ! --sport %d -o %s -j post_noproxy", proxy_ip, proxy_port, lan);\r
     save_line(str);   \r
 \r
     chain="post_noproxy";    \r
This page took 0.211273 seconds and 4 git commands to generate.