X-Git-Url: http://git.onelab.eu/?p=distributedratelimiting.git;a=blobdiff_plain;f=drl%2Fulogd_DRL.c;h=83e5f137ec95369eba9d7d6ff3e8559291290a1c;hp=79cb4ef43f746a3f63e865692f136c57786d92ff;hb=17fba5cc2628df108d09ab4abbbd4b4a7437e7eb;hpb=d12ab8f1cd4ff135d692f7841360af70f0beb57b diff --git a/drl/ulogd_DRL.c b/drl/ulogd_DRL.c index 79cb4ef..83e5f13 100644 --- a/drl/ulogd_DRL.c +++ b/drl/ulogd_DRL.c @@ -1269,7 +1269,7 @@ static int create_htb_hierarchy(drl_instance_t *instance) { } static int setup_tc_grd(drl_instance_t *instance) { - int i; + int i, j; char cmd[300]; for (i = 0; i < instance->leaf_count; ++i) { @@ -1282,15 +1282,11 @@ static int setup_tc_grd(drl_instance_t *instance) { } /* Add the netem qdisc. */ -#ifdef DELAY40MS - sprintf(cmd, "/sbin/tc qdisc replace dev eth0 parent 1:1%x handle 1%x netem loss 0 delay 40ms", - instance->leaves[i].xid, instance->leaves[i].xid); -#else sprintf(cmd, "/sbin/tc qdisc replace dev eth0 parent 1:1%x handle 1%x netem loss 0 delay 0ms", instance->leaves[i].xid, instance->leaves[i].xid); -#endif if (execute_cmd(cmd)) { + printlog(LOG_CRITICAL, "TC GRD call failed: %s\n", cmd); return 1; } } @@ -1303,13 +1299,10 @@ static int setup_tc_grd(drl_instance_t *instance) { } /* Add the netem qdisc. */ -#ifdef DELAY40MS - sprintf(cmd, "/sbin/tc qdisc replace dev eth0 parent 1:1000 handle 1000 netem loss 0 delay 40ms"); -#else sprintf(cmd, "/sbin/tc qdisc replace dev eth0 parent 1:1000 handle 1000 netem loss 0 delay 0ms"); -#endif if (execute_cmd(cmd)) { + printlog(LOG_CRITICAL, "TC GRD call failed: %s\n", cmd); return 1; } @@ -1320,16 +1313,65 @@ static int setup_tc_grd(drl_instance_t *instance) { } /* Add the netem qdisc. */ -#ifdef DELAY40MS - sprintf(cmd, "/sbin/tc qdisc replace dev eth0 parent 1:1fff handle 1fff netem loss 0 delay 40ms"); -#else sprintf(cmd, "/sbin/tc qdisc replace dev eth0 parent 1:1fff handle 1fff netem loss 0 delay 0ms"); -#endif if (execute_cmd(cmd)) { + printlog(LOG_CRITICAL, "TC GRD call failed: %s\n", cmd); return 1; } + /* Artifical delay or loss for experimentation. */ + if (netem_delay.u.value || netem_loss.u.value) { + if (!strcmp(netem_slice.u.string, "ALL")) { + sprintf(cmd, "/sbin/tc qdisc change dev eth0 parent 1:1000 handle 1000 netem loss %d delay %dms", netem_loss.u.value, netem_delay.u.value); + if (execute_cmd(cmd)) { + printlog(LOG_CRITICAL, "TC GRD call failed: %s\n", cmd); + return 1; + } + + sprintf(cmd, "/sbin/tc qdisc change dev eth0 parent 1:1fff handle 1fff netem loss %d delay %dms", netem_loss.u.value, netem_delay.u.value); + if (execute_cmd(cmd)) { + printlog(LOG_CRITICAL, "TC GRD call failed: %s\n", cmd); + return 1; + } + + for (j = 0; j < instance->leaf_count; ++j) { + leaf_t *current = &instance->leaves[j]; + + current->delay = netem_delay.u.value; + + sprintf(cmd, "/sbin/tc qdisc change dev eth0 parent 1:1%x handle 1%x netem loss %d delay %dms", current->xid, current->xid, netem_loss.u.value, netem_delay.u.value); + + if (execute_cmd(cmd)) { + printlog(LOG_CRITICAL, "TC GRD call failed: %s\n", cmd); + return 1; + } + } + } else { + uint32_t slice_xid; + leaf_t *leaf = NULL; + + sscanf(netem_slice.u.string, "%x", &slice_xid); + + leaf = (leaf_t *) map_search(instance->leaf_map, &slice_xid, sizeof(slice_xid)); + + if (leaf == NULL) { + /* Leaf not found - invalid selection. */ + printf("Your experimental setup is incorrect...\n"); + return 1; + } + + leaf->delay = netem_delay.u.value; + + sprintf(cmd, "/sbin/tc qdisc change dev eth0 parent 1:1%x handle 1%x netem loss %d delay %dms", slice_xid, slice_xid, netem_loss.u.value, netem_delay.u.value); + + if (execute_cmd(cmd)) { + printlog(LOG_CRITICAL, "TC GRD call failed: %s\n", cmd); + return 1; + } + } + } + return 0; }