Added a preprocessor option to limit exempt traffic and turned in on for now.
[distributedratelimiting.git] / drl / ulogd_DRL.c
index b87b96e..14de4fe 100644 (file)
@@ -521,7 +521,7 @@ static identity_t *new_identity(ident_config *config) {
     memset(comm_nodes, 0, config->peer_count * sizeof(remote_node_t));
 
     ident->id = config->id;
-    ident->limit = (uint32_t) (((double) config->limit * 1000000.0) / 8.0);
+    ident->limit = (uint32_t) (((double) config->limit * 1000.0) / 8.0);
     ident->fixed_ewma_weight = config->fixed_ewma_weight;
     ident->intervals = config->intervals;
     ident->ewma_weight = pow(ident->fixed_ewma_weight, 
@@ -990,15 +990,6 @@ static int create_htb_hierarchy(drl_instance_t *instance) {
     }
     printlog(LOG_DEBUG, "HTB_cmd: %s\n", cmd);
 
-    /* Add back 1:20. */
-    sprintf(cmd, "/sbin/tc class add dev eth0 parent 1:1 classid 1:20 htb rate 8bit ceil 1000mbit");
-
-    if (execute_cmd(cmd)) {
-        return 1;
-    }
-    printlog(LOG_DEBUG, "HTB_cmd: %s\n", cmd);
-
-
     /* Add machines. */
     for (i = 0; i < instance->machine_count; ++i) {
         sprintf(cmd, "/sbin/tc class add dev eth0 parent 1:%x classid 1:%x htb rate 8bit ceil %lubit",
@@ -1012,6 +1003,25 @@ static int create_htb_hierarchy(drl_instance_t *instance) {
         printlog(LOG_DEBUG, "HTB_cmd: %s\n", cmd);
     }
 
+#define LIMITEXEMPT
+
+    /* Add back 1:20. */
+#ifdef LIMITEXEMPT
+    if (instance->last_machine == NULL) {
+        sprintf(cmd, "/sbin/tc class add dev eth0 parent 1:1 classid 1:20 htb rate 8bit ceil 1000mbit");
+    } else {
+        sprintf(cmd, "/sbin/tc class add dev eth0 parent 1:%x classid 1:20 htb rate 8bit ceil 1000mbit",
+            instance->last_machine->htb_node);
+    }
+#else
+    sprintf(cmd, "/sbin/tc class add dev eth0 parent 1:1 classid 1:20 htb rate 8bit ceil 1000mbit");
+#endif
+
+    if (execute_cmd(cmd)) {
+        return 1;
+    }
+    printlog(LOG_DEBUG, "HTB_cmd: %s\n", cmd);
+
     /* Add sets. */
     for (j = (instance->set_count - 1); j >= 0; --j) {
         sprintf(cmd, "/sbin/tc class add dev eth0 parent 1:%x classid 1:%x htb rate 8bit ceil %lubit",
@@ -1110,16 +1120,6 @@ static int create_htb_hierarchy(drl_instance_t *instance) {
     /* End delay testing */
 #endif
 
-//#define SFQTEST
-
-#ifdef SFQTEST
-    sprintf(cmd, "/sbin/tc qdisc del dev eth0 parent 1:1000 handle 1000 pfifo");
-    execute_cmd(cmd);
-
-    sprintf(cmd, "/sbin/tc qdisc replace dev eth0 parent 1:1000 handle 1000 sfq perturb 20");
-    execute_cmd(cmd);
-#endif
-
     return 0;
 }
 
@@ -1279,6 +1279,8 @@ static int init_drl(void) {
 
     if (parse_drl_config(drl_configfile.u.string, &configs)) {
         /* Parse error occured. Return non-zero to notify init_drl(). */
+        printlog(LOG_CRITICAL, "Failed to parse the DRL configuration file (%s).\n",
+            drl_configfile.u.string);
         return false;
     }
 
@@ -1286,11 +1288,14 @@ static int init_drl(void) {
     if (validate_configs(configs, &limiter.stable_instance)) {
         /* Clean up everything. */
         free_failed_config(configs, &limiter.stable_instance);
+        printlog(LOG_CRITICAL, "Invalid DRL configuration file (%s).\n",
+            drl_configfile.u.string);
         return false;
     }
 
     if (init_identities(configs, &limiter.stable_instance)) {
         free_failed_config(configs, &limiter.stable_instance);
+        printlog(LOG_CRITICAL, "Failed to initialize identities.\n");
         return false;
     }
 
@@ -1305,11 +1310,13 @@ static int init_drl(void) {
         case POLICY_FPS:
             if (assign_htb_hierarchy(&limiter.stable_instance)) {
                 free_instance(&limiter.stable_instance);
+                printlog(LOG_CRITICAL, "Failed to assign HTB hierarchy.\n");
                 return false;
             }
 
             if (create_htb_hierarchy(&limiter.stable_instance)) {
                 free_instance(&limiter.stable_instance);
+                printlog(LOG_CRITICAL, "Failed to create HTB hierarchy.\n");
                 return false;
             }
         break;
@@ -1317,6 +1324,7 @@ static int init_drl(void) {
         case POLICY_GRD:
             if (setup_tc_grd(&limiter.stable_instance)) {
                 free_instance(&limiter.stable_instance);
+                printlog(LOG_CRITICAL, "Failed to initialize tc calls for GRD.\n");
                 return false;
             }
         break;