Added a handler for SIGUSR1, which toggles off/on the enforcement calls to tc.
[distributedratelimiting.git] / drl / ulogd_DRL.c
index ef5cf20..b87b96e 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 */
 
@@ -1468,6 +1469,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;
@@ -1475,11 +1503,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);
 
@@ -1492,11 +1522,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;
         }
     }
@@ -1511,6 +1553,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) {