Fixes & tweaks for sample and hold accounting.
[distributedratelimiting.git] / drl / samplehold.c
index 8c566d4..f98e5df 100644 (file)
@@ -86,14 +86,14 @@ sampled_flow_table sampled_table_create(uint32_t (*hash_function)(const key_flow
 
     /* 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 * 1.05);
+    table->backing = malloc(sizeof(sampled_flow) * table->capacity * SAMPLEHOLD_BONUS_FACTOR);
 
     if (table->backing == NULL) {
         free(table);
         return NULL;
     }
 
-    memset(table->backing, 0, sizeof(sampled_flow) * table->capacity);
+    memset(table->backing, 0, sizeof(sampled_flow) * table->capacity * SAMPLEHOLD_BONUS_FACTOR);
 
     srand(time(NULL));
 
@@ -279,6 +279,15 @@ void sampled_table_update_flows(sampled_flow_table table, struct timeval now, do
     struct in_addr src, dst;
     char sip[22], dip[22];
 
+    /* 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. */
+
     /* Update common aggregate information. */
     time_delta = timeval_subtract(now, table->common->last_update);
 
@@ -340,6 +349,22 @@ void sampled_table_update_flows(sampled_flow_table table, struct timeval now, do
                 table->largest = &table->backing[i];
             }
 
+            if (table->backing[i].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 (table->backing[i].rate > 20480) {
+                table->common->num_flows_20k += 1;
+                table->common->num_flows_10k += 1;
+                table->common->num_flows_5k += 1;
+            } else if (table->backing[i].rate > 10240) {
+                table->common->num_flows_10k += 1;
+                table->common->num_flows_5k += 1;
+            } else if (table->backing[i].rate > 5120) {
+                table->common->num_flows_5k += 1;
+            }
+
             table->common->num_flows += 1;
 
             /* Print debugging info. */