X-Git-Url: http://git.onelab.eu/?p=distributedratelimiting.git;a=blobdiff_plain;f=drl%2Fsamplehold.c;h=8c566d4d9a4b85ce02536b0c3a80a04b3e93ae24;hp=8ebab9d8b9398312978ff602b81cfe230f204ae1;hb=f83340496f632165030cc92cd98408a87082f6b1;hpb=74f52acf84cbf11faab8aa53e069464063ce11b9 diff --git a/drl/samplehold.c b/drl/samplehold.c index 8ebab9d..8c566d4 100644 --- a/drl/samplehold.c +++ b/drl/samplehold.c @@ -1,10 +1,13 @@ /* See the DRL-LICENSE file for this file's software license. */ +#include #include +#include #include #include #include #include +#include #include #include "common_accounting.h" @@ -74,14 +77,16 @@ sampled_flow_table sampled_table_create(uint32_t (*hash_function)(const key_flow return NULL; } - table->capacity = (uint32_t) ((base_size * oversampling_factor) * 1.03); + table->capacity = (uint32_t) (base_size * oversampling_factor); table->size = 0; table->hash_function = hash_function; table->sample_prob = (double) (((double) table->capacity / (double) max_bytes) * (double) RANDOM_GRANULARITY); table->threshold = (double) ((double) flow_percentage / 100) * max_bytes; + + /* Allocate the backing and give it a little bit extra to deal with variance. */ table->largest = NULL; - table->backing = malloc(sizeof(sampled_flow) * table->capacity); + table->backing = malloc(sizeof(sampled_flow) * table->capacity * 1.05); if (table->backing == NULL) { free(table); @@ -271,6 +276,8 @@ void sampled_table_update_flows(sampled_flow_table table, struct timeval now, do uint32_t rate_delta = 0; double time_delta = 0; double unweighted_rate = 0; + struct in_addr src, dst; + char sip[22], dip[22]; /* Update common aggregate information. */ time_delta = timeval_subtract(now, table->common->last_update); @@ -295,8 +302,11 @@ void sampled_table_update_flows(sampled_flow_table table, struct timeval now, do unweighted_rate * (1 - ewma_weight); } + printlog(LOG_DEBUG, "table->common->rate is now %u\n", table->common->rate); + table->common->bytes_since = 0; table->common->last_update = now; + table->common->num_flows = 0; /* Update per-flow information. */ table->largest = &table->backing[i]; @@ -329,6 +339,18 @@ void sampled_table_update_flows(sampled_flow_table table, struct timeval now, do largest_rate = table->backing[i].rate; table->largest = &table->backing[i]; } + + table->common->num_flows += 1; + + /* Print debugging info. */ + src.s_addr = ntohl(table->backing[i].source_ip); + dst.s_addr = ntohl(table->backing[i].dest_ip); + strcpy(sip, inet_ntoa(src)); + strcpy(dip, inet_ntoa(dst)); + printlog(LOG_DEBUG, "FLOW: (%p) %s:%d -> %s:%d at %d\n", &table->backing[i], + sip, table->backing[i].source_port, + dip, table->backing[i].dest_port, + table->backing[i].rate); } }