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];
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);
}
void standard_table_remove(standard_flow_table table, standard_flow *flow) {
key_flow key;
uint32_t hash;
- standard_flow *current, *prev;
assert(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. */
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;
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;
+ table->common->num_flows_5k = 0;
+ table->common->num_flows_10k = 0;
+ table->common->num_flows_20k = 0;
+ table->common->num_flows_50k = 0;
+ table->common->avg_rate = 0;
+ /* End statistics. */
time_delta = timeval_subtract(now, table->common->last_update);
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) {
+ table->common->num_flows_50k += 1;
+ table->common->num_flows_20k += 1;
+ table->common->num_flows_10k += 1;
+ table->common->num_flows_5k += 1;
+ } else if (current->rate > 20480) {
+ table->common->num_flows_20k += 1;
+ table->common->num_flows_10k += 1;
+ table->common->num_flows_5k += 1;
+ } else if (current->rate > 10240) {
+ table->common->num_flows_10k += 1;
+ table->common->num_flows_5k += 1;
+ } else if (current->rate > 5120) {
+ table->common->num_flows_5k += 1;
+ }
+
+ table->common->num_flows += 1;
+
src.s_addr = ntohl(current->source_ip);
dst.s_addr = ntohl(current->dest_ip);
strcpy(sip, inet_ntoa(src));
current->rate);
}
+ if (table->common->num_flows > 0) {
+ table->common->avg_rate = table->common->rate / table->common->num_flows;
+ }
+
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);
}