X-Git-Url: http://git.onelab.eu/?p=distributedratelimiting.git;a=blobdiff_plain;f=drl%2Fstandard.c;h=9c996e3ceb9b765093bde378886344c65f510c35;hp=ba1fcc7a191de9e91371c2a50e3013ce05fe83f3;hb=f83340496f632165030cc92cd98408a87082f6b1;hpb=a3ef11b996352e66f4031c684c7dcda536bc3bf1 diff --git a/drl/standard.c b/drl/standard.c index ba1fcc7..9c996e3 100644 --- a/drl/standard.c +++ b/drl/standard.c @@ -86,7 +86,7 @@ standard_flow *standard_table_lookup(standard_flow_table table, const key_flow * flow->source_port = key->source_port; flow->dest_port = key->dest_port; flow->last_packet = key->packet_time; - gettimeofday(&flow->last_update, NULL); + flow->last_update = table->common->last_update; /* Add the flow to the hash list. */ flow->nexth = table->flows[hash]; @@ -106,7 +106,7 @@ standard_flow *standard_table_lookup(standard_flow_table table, const key_flow * dst.s_addr = ntohl(flow->dest_ip); strcpy(sip, inet_ntoa(src)); strcpy(dip, inet_ntoa(dst)); - printlog(LOG_DEBUG, "ALLOC:%s:%hd -> %s:%hd\n", sip, + printlog(LOG_DEBUG, "ALLOC:%s:%hu -> %s:%hu\n", sip, flow->source_port, dip, flow->dest_port); } @@ -137,7 +137,6 @@ int standard_table_sample(standard_flow_table table, const key_flow *key) { void standard_table_remove(standard_flow_table table, standard_flow *flow) { key_flow key; uint32_t hash; - standard_flow *current, *prev; assert(flow); @@ -156,23 +155,23 @@ void standard_table_remove(standard_flow_table table, standard_flow *flow) { /* It's the head of the hash list. */ table->flows[hash] = flow->nexth; } else { + standard_flow *current, *prev; + prev = table->flows[hash]; - current = table->flows[hash]->nexth; - while (current != NULL) { + for (current = table->flows[hash]->nexth; current; current = current->nexth) { if (current == flow) { prev->nexth = flow->nexth; break; } else { prev = current; - current = current->next; } } - //assert(current != NULL); if (current == NULL) { - printlog(LOG_WARN, "Flow %p disappeared?\n", current); + printlog(LOG_CRITICAL, "Flow %p disappeared?\n", flow); } + assert(current != NULL); } /* Remove the flow from the linked list. */ @@ -222,7 +221,7 @@ int standard_table_cleanup(standard_flow_table table) { time_t now = time(NULL); while (current != NULL) { - if (current->last_packet + FLOW_IDLE_TIME <= now) { + if (current->last_packet + STD_FLOW_IDLE_TIME <= now) { /* Flow hasn't received a packet in the time limit - kill it. */ remove = current; current = current->next; @@ -243,6 +242,7 @@ void standard_table_update_flows(standard_flow_table table, struct timeval now, standard_flow *current; struct in_addr src, dst; char sip[22], dip[22]; + key_flow largest_flow_info; /* Reset statistics. */ table->common->num_flows = 0; @@ -302,6 +302,11 @@ void standard_table_update_flows(standard_flow_table table, struct timeval now, if (current->rate > maxflowrate) { maxflowrate = current->rate; + largest_flow_info.source_ip = current->source_ip; + largest_flow_info.dest_ip = current->dest_ip; + largest_flow_info.source_port = current->source_port; + largest_flow_info.dest_port = current->dest_port; + largest_flow_info.protocol = current->protocol; } if (current->rate > 51200) { @@ -343,4 +348,5 @@ void standard_table_update_flows(standard_flow_table table, struct timeval now, printlog(LOG_DEBUG, "FLOW:--\n--\n"); table->common->max_flow_rate = maxflowrate; + table->common->max_flow_rate_flow_hash = table->hash_function(&largest_flow_info); }