X-Git-Url: http://git.onelab.eu/?p=distributedratelimiting.git;a=blobdiff_plain;f=drl%2Fulogd_DRL.c;h=b87b96eef4e37e8a5e715061d457ee0f83ec77bd;hp=ef5cf206d22d1c396f82a98a4587d11726442995;hb=a3ef11b996352e66f4031c684c7dcda536bc3bf1;hpb=f54a05e4b5bef7c5c90663765656a9084d622e82 diff --git a/drl/ulogd_DRL.c b/drl/ulogd_DRL.c index ef5cf20..b87b96e 100644 --- a/drl/ulogd_DRL.c +++ b/drl/ulogd_DRL.c @@ -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) {