More logging in the event of startup failures.
[distributedratelimiting.git] / drl / ulogd_DRL.c
index 0d734a7..e8e0747 100644 (file)
@@ -229,6 +229,7 @@ uint32_t local_ip = 0;
 limiter_t limiter;
 extern FILE *logfile;
 extern uint8_t system_loglevel;
+extern uint8_t do_enforcement;
 
 /* functions */
 
@@ -1109,6 +1110,16 @@ 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;
 }
 
@@ -1268,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;
     }
 
@@ -1275,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;
     }
 
@@ -1294,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;
@@ -1306,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;
@@ -1458,6 +1477,33 @@ static void time_reconfig(int iterations) {
     // Seems to take about 85ms / iteration
 }
 
+static int stop_enforcement(drl_instance_t *instance) {
+    char cmd[300];
+    int i;
+
+    for (i = 0; i < instance->machine_count; ++i) {
+        sprintf(cmd, "/sbin/tc class change dev eth0 parent 1:%x classid 1:%x htb rate 8bit ceil 100mbit",
+                instance->machines[i]->htb_parent,
+                instance->machines[i]->htb_node);
+
+        if (execute_cmd(cmd)) {
+            return 1;
+        }
+    }
+
+    for (i = 0; i < instance->set_count; ++i) {
+        sprintf(cmd, "/sbin/tc class change dev eth0 parent 1:%x classid 1:%x htb rate 8bit ceil 100mbit",
+                instance->sets[i]->htb_parent,
+                instance->sets[i]->htb_node);
+
+        if (execute_cmd(cmd)) {
+            return 1;
+        }
+    }
+
+    return 0;
+}
+
 static void *signal_thread_func(void *args) {
     int sig;
     int err;
@@ -1465,11 +1511,13 @@ static void *signal_thread_func(void *args) {
 
     sigemptyset(&sigs);
     sigaddset(&sigs, SIGHUP);
+    sigaddset(&sigs, SIGUSR1);
     pthread_sigmask(SIG_BLOCK, &sigs, NULL);
 
     while (1) {
         sigemptyset(&sigs);
         sigaddset(&sigs, SIGHUP);
+        sigaddset(&sigs, SIGUSR1);
 
         err = sigwait(&sigs, &sig);
 
@@ -1482,11 +1530,23 @@ static void *signal_thread_func(void *args) {
             case SIGHUP:
                 printlog(LOG_WARN, "Caught SIGHUP - re-reading XML file.\n");
                 reconfig();
-                //time_reconfig(1000); //instrumentation
+                //time_reconfig(1000); /* instrumentation */
                 flushlog();
                 break;
+            case SIGUSR1:
+                pthread_rwlock_wrlock(&limiter.limiter_lock);
+                if (do_enforcement) {
+                    do_enforcement = 0;
+                    stop_enforcement(&limiter.stable_instance);
+                    printlog(LOG_CRITICAL, "--Switching enforcement off.--\n");
+                } else {
+                    do_enforcement = 1;
+                    printlog(LOG_CRITICAL, "--Switching enforcement on.--\n");
+                }
+                pthread_rwlock_unlock(&limiter.limiter_lock);
+                break;
             default:
-                /* Should be impossible... */
+                /* Intentionally blank. */
                 break;
         }
     }
@@ -1501,6 +1561,7 @@ static void _drl_reg_op(void)
 
     sigemptyset(&signal_mask);
     sigaddset(&signal_mask, SIGHUP);
+    sigaddset(&signal_mask, SIGUSR1);
     pthread_sigmask(SIG_BLOCK, &signal_mask, NULL);
 
     if (pthread_create(&signal_thread, NULL, &signal_thread_func, NULL) != 0) {