limiter_t limiter;
extern FILE *logfile;
extern uint8_t system_loglevel;
+extern uint8_t do_enforcement;
/* functions */
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,
}
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",
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",
/* 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;
}
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;
}
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;
}
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;
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;
// 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;
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);
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;
}
}
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) {