(Hopefully) fix the bug that was causing flows to not be found in
Kevin Webb [Wed, 19 Nov 2008 22:36:04 +0000 (22:36 +0000)]
standard_table_remove and thus loop for much longer than expected.

drl/standard.c

index 5b860a3..5b9632e 100644 (file)
@@ -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_DEBUG, "Flow %p disappeared?\n", flow);
+            printlog(LOG_CRITICAL, "Flow %p disappeared?\n", flow);
         }
+        assert(current != NULL);
     }
 
     /* Remove the flow from the linked list. */