qos free interface list (probably, not tested)
[svn/Prometheus-QoS/.git] / prometheus.c
index 71b2a32e13c9a8188cac8dea38a67d22d0736e42..edab1c109ef84898f655cd37ecc3db71342195c3 100644 (file)
@@ -61,6 +61,7 @@ char           *hosts = "/etc/prometheus/hosts"; /* per-IP bandwidth definition
 char      *macrosfile = "/etc/prometheus/prometheus.macros"; /* rewrite rules for most common tariffs */\r
 char    *upstreamfile = "/etc/prometheus/upstream.interfaces"; /* list of interfaces to manage */\r
 char  *downstreamfile = "/etc/prometheus/downstream.interfaces"; /* list of interfaces to manage */\r
+char     *qosfreefile = "/etc/prometheus/qosfree.interfaces"; /* list of interfaces to manage */\r
 char    *iptablesfile = "/var/spool/prometheus.iptables"; /* temporary file for iptables-restore*/\r
 char   *ip6tablesfile = "/var/spool/prometheus.ip6tables"; /* temporary file for ip6tables-restore*/\r
 char          *credit = "/var/lib/misc/prometheus.credit"; /* credit log file */\r
@@ -138,6 +139,7 @@ struct Keyword *keyword, *defaultkeyword=NULL, *keywords = NULL;
 struct Macro *macro, *macros = NULL;\r
 struct Index *idxs = NULL, *idx, *metaindex;\r
 struct Interface *interfaces = NULL, *interface;\r
+struct QosFreeInterface *qosfreeinterfaces = NULL, *qosfreeinterface;\r
 \r
 #define FREE_CLASS      3\r
 #define OVERLIMIT_CLASS 4\r
@@ -290,6 +292,7 @@ void get_config(char *config_filename)
   option("hosts",hosts);\r
   option("downstream-interfaces-list-filename",downstreamfile);\r
   option("upstream-interfaces-list-filename",upstreamfile);\r
+  option("qos-free-interfaces-list-filename",qosfreefile);\r
   option("macros-filename",macrosfile);\r
   option("ip6-prefix",ip6prefix);\r
   option("medium",medium);\r
@@ -395,6 +398,10 @@ void iptables_save_line(char *line, int ipv6)
  }\r
 }\r
 \r
+#define IPv4 FALSE\r
+#define IPv6 TRUE\r
+\r
+\r
 void run_iptables_restore(void)\r
 {\r
  char *restor;\r
@@ -404,7 +411,7 @@ void run_iptables_restore(void)
  printf("Running %s <%s ...\n", iptablesrestore, iptablesfile);\r
  /*-----------------------------------------------------------------*/\r
 \r
- iptables_save_line("COMMIT", FALSE);\r
+ iptables_save_line("COMMIT", IPv4);\r
  fclose(iptables_file);\r
  if(dry_run) \r
  {\r
@@ -423,7 +430,7 @@ void run_iptables_restore(void)
   /*-----------------------------------------------------------------*/\r
   printf("Running %s <%s ...\n", ip6tablesrestore, ip6tablesfile);\r
   /*-----------------------------------------------------------------*/\r
-  iptables_save_line("COMMIT", TRUE);\r
+  iptables_save_line("COMMIT", IPv6);\r
   fclose(ip6tables_file);\r
   if(dry_run) \r
   {\r
@@ -562,7 +569,6 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
   }\r
  }\r
  done; /* ugly macro end */\r
-\r
  \r
  if(just_logs)\r
  {\r
@@ -601,6 +607,12 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
  string(str, STRLEN); \r
  string(limit_pkts, STRLEN);\r
 \r
+ /*-----------------------------------------------------------------*/\r
+ printf("Parsing qos free interfaces file %s ...\n", qosfreefile);\r
+ /*-----------------------------------------------------------------*/\r
+ load(qosfreeinterface, qosfreeinterfaces,\r
+      qosfreefile, QosFreeInterface, name);\r
+\r
  /*-----------------------------------------------------------------*/\r
  printf("Parsing macro definition file %s ...\n", macrosfile);\r
  /*-----------------------------------------------------------------*/\r
@@ -705,7 +717,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
     perror(iptablesfile);\r
     exit(-1);\r
   }\r
-  iptables_save_line(iptablespreamble, FALSE);\r
+  iptables_save_line(iptablespreamble, IPv4);\r
 \r
   if(ip6prefix)\r
   {\r
@@ -715,8 +727,8 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
      perror(ip6tablesfile);\r
      exit(-1);\r
    }\r
-   iptables_save_line(iptablespreamble, TRUE);\r
-   iptables_save_line(ip6preamble, TRUE);\r
+   iptables_save_line(iptablespreamble, IPv6);\r
+   iptables_save_line(ip6preamble, IPv6);\r
   }\r
 \r
   run_iptables_restore();\r
@@ -735,23 +747,33 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
   }\r
   \r
   iptables_file=fopen(iptablesfile,"w");\r
-  iptables_save_line(iptablespreamble, FALSE);\r
+  iptables_save_line(iptablespreamble, IPv4);\r
   if(ip6prefix)\r
   {\r
    ip6tables_file=fopen(ip6tablesfile,"w");\r
-   iptables_save_line(iptablespreamble, TRUE);\r
-   iptables_save_line(ip6preamble, TRUE);\r
+   iptables_save_line(iptablespreamble, IPv6);\r
+   iptables_save_line(ip6preamble, IPv6);\r
   }\r
 \r
   if(qos_free_zone && *qos_free_zone!='0') /* this is currently supported only for IPv4 */\r
   {\r
    for_each(interface, interfaces)\r
    {\r
-    sprintf(str,"-A %s -s %s -o %s -j ACCEPT", interface->chain, qos_free_zone, interface->name);\r
-    iptables_save_line(str, FALSE);\r
+    sprintf(str,"-A %s -%c %s -o %s -j ACCEPT", interface->chain, (interface->is_upstream?'d':'s'), qos_free_zone, interface->name);\r
+    iptables_save_line(str, IPv4);\r
    }\r
   }\r
   \r
+  for_each(qosfreeinterface, qosfreeinterfaces)\r
+  {\r
+    sprintf(str,"-A FORWARD -i %s -j ACCEPT", qosfreeinterface->name);\r
+    iptables_save_line(str, IPv4);  \r
+    iptables_save_line(str, IPv6);\r
+    sprintf(str,"-A POSTROUTING -o %s -j ACCEPT", qosfreeinterface->name);\r
+    iptables_save_line(str, IPv4);\r
+    iptables_save_line(str, IPv6);\r
+  }\r
+  \r
   if(ip_count > idxtable_treshold1 && !just_flush)\r
   {\r
    int idxcount=0, bitmask=32-idxtable_bitmask1;\r
@@ -760,12 +782,12 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
    printf("Detected %d addresses - indexing iptables rules to improve performance...\n",ip_count);\r
    /*-----------------------------------------------------------------*/\r
 \r
-   iptables_save_line(":post_common - [0:0]", FALSE);\r
-   iptables_save_line(":forw_common - [0:0]", FALSE);\r
+   iptables_save_line(":post_common - [0:0]", IPv4);\r
+   iptables_save_line(":forw_common - [0:0]", IPv4);\r
    if(ip6prefix)\r
    {\r
-    iptables_save_line(":post_common - [0:0]", TRUE);\r
-    iptables_save_line(":forw_common - [0:0]", TRUE);\r
+    iptables_save_line(":post_common - [0:0]", IPv6);\r
+    iptables_save_line(":forw_common - [0:0]", IPv6);\r
    }\r
 \r
    for_each(ip,ips) if(ip->addr && *(ip->addr) && !eq(ip->addr,"0.0.0.0/0")) \r
@@ -868,10 +890,12 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
       buf = interface->chain;\r
      }\r
 \r
-     sprintf(str,"-A %s -d %s/%d -o %s -j %s_%s", buf, subnet, idx->bitmask, interface->name, interface->idxprefix, idx->id);\r
+     sprintf(str, "-A %s -%c %s/%d -o %s -j %s_%s", \r
+                  buf, (interface->is_upstream?'s':'d'), subnet, idx->bitmask, interface->name, interface->idxprefix, idx->id);\r
      iptables_save_line(str, idx->ipv6);\r
 \r
-     sprintf(str,"-A %s -d %s/%d -o %s -j %s_common", buf, subnet, idx->bitmask, interface->name, interface->idxprefix);\r
+     sprintf(str, "-A %s -%c %s/%d -o %s -j %s_common",\r
+                  buf, (interface->is_upstream?'s':'d'), subnet, idx->bitmask, interface->name, interface->idxprefix);\r
      iptables_save_line(str, idx->ipv6);\r
     }\r
    }\r
@@ -880,11 +904,11 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
    for_each(interface, interfaces)\r
    {\r
     sprintf(str,"-A %s -o %s -j %s_common", interface->chain, interface->name, interface->idxprefix);\r
-    iptables_save_line(str, FALSE);\r
+    iptables_save_line(str, IPv4);\r
     if(ip6prefix)\r
     {\r
      sprintf(str,"-A %s -o %s -j %s_common", interface->chain, interface->name, interface->idxprefix);\r
-     iptables_save_line(str, TRUE);\r
+     iptables_save_line(str, IPv6);\r
     }\r
    }\r
   }\r
@@ -1257,25 +1281,27 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
  #endif\r
 \r
    /* ------------------------------------------------ iptables classify */\r
-   sprintf(str, "-A %s -d %s/%d -o %s -j %s%d",\r
-                chain, ip->addr, ip->mask,\r
+   sprintf(str, "-A %s -%c %s/%d -o %s -j %s%d",\r
+                chain, (interface->is_upstream?'s':'d'), ip->addr, ip->mask,\r
                 interface->name, mark_iptables, ip->mark);\r
    iptables_save_line(str, ip->v6);\r
 \r
-   sprintf(str, "-A %s -d %s/%d -o %s %s-j ACCEPT",\r
-                chain, ip->addr, ip->mask, interface->name, limit_pkts);\r
+   sprintf(str, "-A %s -%c %s/%d -o %s %s-j ACCEPT",\r
+                chain, (interface->is_upstream?'s':'d'),ip->addr, ip->mask,\r
+                interface->name, limit_pkts);\r
    iptables_save_line(str, ip->v6);\r
 \r
    if(limit_pkts)\r
    {\r
     /* classify overlimit packets to separate overlimit class */\r
-    sprintf(str, "-A %s -d %s/%d -o %s -j %s%d",\r
-                 chain, ip->addr, ip->mask,\r
+    sprintf(str, "-A %s -%c %s/%d -o %s -j %s%d",\r
+                 chain, (interface->is_upstream?'s':'d'), ip->addr, ip->mask,\r
                  interface->name, mark_iptables, OVERLIMIT_CLASS);\r
     iptables_save_line(str, ip->v6);\r
 \r
-    sprintf(str, "-A %s -d %s/%d -o %s -j ACCEPT",\r
-                 chain, ip->addr, ip->mask, interface->name);\r
+    sprintf(str, "-A %s -%c %s/%d -o %s -j ACCEPT",\r
+                 chain, (interface->is_upstream?'s':'d'), ip->addr, ip->mask,\r
+                 interface->name);\r
     iptables_save_line(str, ip->v6);\r
    }\r
 \r
@@ -1344,15 +1370,15 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
 \r
    sprintf(str, "-A %s -o %s -j %s%d",\r
                 chain, interface->name, mark_iptables, FREE_CLASS);\r
-   iptables_save_line(str, FALSE); /* only for IPv4 */\r
+   iptables_save_line(str, IPv4); /* only for IPv4 */\r
   }\r
 \r
   sprintf(str,"-A %s -o %s -j %s", chain, interface->name, final_chain);\r
-  iptables_save_line(str, FALSE);\r
+  iptables_save_line(str, IPv4);\r
   if(ip6prefix)\r
   {\r
    sprintf(str,"-A %s -o %s -j %s", chain, interface->name, final_chain);\r
-   iptables_save_line(str, TRUE);\r
+   iptables_save_line(str, IPv6);\r
   }\r
 \r
   if(free_min) /* allocate free bandwith if it is not zero... */ \r
This page took 0.168094 seconds and 4 git commands to generate.