X-Git-Url: http://git.onelab.eu/?p=distributedratelimiting.git;a=blobdiff_plain;f=drl%2Fulogd_DRL.c;h=f7b027256901326322647c007087b9982b726cb8;hp=97f24bc7fb97334df7e969d802da649cf09d0e53;hb=89df43dd6b8cb8df82cfbf395b923014d2826b5a;hpb=4beac2bba3083d8ee73c49b9ad51e6af1e2c9af4 diff --git a/drl/ulogd_DRL.c b/drl/ulogd_DRL.c index 97f24bc..f7b0272 100644 --- a/drl/ulogd_DRL.c +++ b/drl/ulogd_DRL.c @@ -713,6 +713,25 @@ static identity_t *new_identity(ident_config *config) { return ident; } +static int validate_htb_exists(int node, int parent) { + FILE *pipe = popen("/sbin/tc class show dev eth0", "r"); + char line[200]; + + while (fgets(line, 200, pipe) != NULL) { + int n, p; + char ignore[200]; + + sscanf(line, "class htb 1:%x parent 1:%x prio %s", &n, &p, ignore); + if (n == node && p == parent) { + pclose(pipe); + return 0; + } + } + + pclose(pipe); + return 1; +} + /* Determines the validity of the parameters of one ident_config. * * 0 valid @@ -754,6 +773,11 @@ static int validate_config(ident_config *config) { printlog(LOG_CRITICAL, "When create_htb is disabled in ulogd.conf, an identity must specify the htb_node and htb_parent propertities in its configuration.\n"); return 1; } + + if (validate_htb_exists(config->htb_node, config->htb_parent)) { + printlog(LOG_CRITICAL, "Identity specified htb node %x with parent %x. No such node/parent combo seems to exist!\n", config->htb_node, config->htb_parent); + return 1; + } } else { if (config->htb_node > -1 || config->htb_parent > -1) { printlog(LOG_WARN, "htb_node or htb_parent are configured but ignored because we're configured to create our own htb hierarchy.\n"); @@ -1502,10 +1526,10 @@ static int init_drl(void) { pthread_rwlock_init(&limiter.limiter_lock,NULL); /* determine our local IP by iterating through interfaces */ - if ((limiter.ip = get_local_ip())==0) { - printlog(LOG_CRITICAL, - "ulogd_DRL unable to aquire local IP address, not registering.\n"); - return (false); + limiter.ip = get_local_ip(); + if (limiter.ip == NULL) { + printlog(LOG_CRITICAL, "ulogd_DRL unable to aquire local IP address, not registering.\n"); + return false; } limiter.localaddr = inet_addr(limiter.ip); limiter.port = htons(LIMITER_LISTEN_PORT); @@ -1735,32 +1759,6 @@ static void reconfig() { pthread_rwlock_unlock(&limiter.limiter_lock); } -static ulog_output_t drl_op = { - .name = "drl", - .output = &_output_drl, - .signal = NULL, /* This appears to be broken. Using my own handler. */ - .init = NULL, - .fini = NULL, -}; - -/* Tests the amount of time it takes to call reconfig(). */ -static void time_reconfig(int iterations) { - struct timeval start, end; - int i; - - gettimeofday(&start, NULL); - for (i = 0; i < iterations; ++i) { - reconfig(); - } - gettimeofday(&end, NULL); - - printf("%d reconfigs() took %d seconds and %d microseconds.\n", - iterations, end.tv_sec - start.tv_sec, end.tv_usec - start.tv_usec); - exit(0); - - // Seems to take about 85ms / iteration -} - static int stop_enforcement(drl_instance_t *instance) { char cmd[300]; int i; @@ -1797,27 +1795,34 @@ static void *signal_thread_func(void *args) { sigaddset(&sigs, SIGHUP); sigaddset(&sigs, SIGUSR1); sigaddset(&sigs, SIGUSR2); + sigaddset(&sigs, SIGRTMAX); pthread_sigmask(SIG_BLOCK, &sigs, NULL); while (1) { sigemptyset(&sigs); - sigaddset(&sigs, SIGHUP); + //sigaddset(&sigs, SIGHUP); sigaddset(&sigs, SIGUSR1); sigaddset(&sigs, SIGUSR2); + sigaddset(&sigs, SIGRTMAX); err = sigwait(&sigs, &sig); if (err) { printlog(LOG_CRITICAL, "sigwait() returned an error.\n"); flushlog(); + continue; + } + + if (sig == SIGRTMAX) { + printf("Caught SIGRTMAX - toggling fake partitions.\n"); + do_partition = !do_partition; + continue; } switch (sig) { case SIGHUP: - printlog(LOG_WARN, "Caught SIGHUP - re-reading XML file.\n"); - reconfig(); - //time_reconfig(1000); /* instrumentation */ - flushlog(); + printlog(LOG_CRITICAL, "Caught SIGHUP in signal_thread_func?!?\n"); + printf("Caught SIGHUP in signal_thread_func?!?\n"); break; case SIGUSR1: pthread_rwlock_wrlock(&limiter.limiter_lock); @@ -1832,26 +1837,26 @@ static void *signal_thread_func(void *args) { pthread_rwlock_unlock(&limiter.limiter_lock); break; case SIGUSR2: - do_partition = !do_partition; + printlog(LOG_WARN, "Caught SIGUSR2 - re-reading XML file.\n"); + printf("Caught SIGUSR2 - re-reading XML file.\n"); + reconfig(); + flushlog(); break; default: /* Intentionally blank. */ break; } } - } -/* register output plugin with ulogd */ -static void _drl_reg_op(void) -{ - ulog_output_t *op = &drl_op; +static int drl_plugin_init() { sigset_t signal_mask; sigemptyset(&signal_mask); - sigaddset(&signal_mask, SIGHUP); + //sigaddset(&signal_mask, SIGHUP); sigaddset(&signal_mask, SIGUSR1); sigaddset(&signal_mask, SIGUSR2); + sigaddset(&signal_mask, SIGRTMAX); pthread_sigmask(SIG_BLOCK, &signal_mask, NULL); if (pthread_create(&signal_thread, NULL, &signal_thread_func, NULL) != 0) { @@ -1868,8 +1873,6 @@ static void _drl_reg_op(void) exit(EXIT_FAILURE); } - register_output(op); - /* start up the thread that will periodically estimate the * local rate and set the local limits * see estimate.c @@ -1886,6 +1889,55 @@ static void _drl_reg_op(void) printlog(LOG_CRITICAL, "--Switching enforcement on.--\n"); pthread_rwlock_unlock(&limiter.limiter_lock); } + + return 0; +} + +static void drl_signal(int sig) { + if (sig == SIGHUP) { + printf("Caught SIGHUP - reopening DRL log file.\n"); + + fclose(logfile); + logfile = fopen(drl_logfile.u.string, "a"); + printlog(LOG_CRITICAL, "Reopened logfile.\n"); + } else { + printlog(LOG_WARN, "Caught unexpected signal %d in drl_signal.\n", sig); + } +} + +static ulog_output_t drl_op = { + .name = "drl", + .output = &_output_drl, + .signal = &drl_signal, + .init = &drl_plugin_init, + .fini = NULL, +}; + +#if 0 +/* Tests the amount of time it takes to call reconfig(). */ +static void time_reconfig(int iterations) { + struct timeval start, end; + int i; + + gettimeofday(&start, NULL); + for (i = 0; i < iterations; ++i) { + reconfig(); + } + gettimeofday(&end, NULL); + + printf("%d reconfigs() took %d seconds and %d microseconds.\n", + iterations, end.tv_sec - start.tv_sec, end.tv_usec - start.tv_usec); + exit(0); + + // Seems to take about 85ms / iteration +} +#endif + +/* register output plugin with ulogd */ +static void _drl_reg_op(void) +{ + ulog_output_t *op = &drl_op; + register_output(op); } void _init(void)