Enable storing state in flowhash hash tables

Flowhash user can now rely on the table to be initialized
to zero and know when an entry is cleaned up by the
garbage collector.

This is usefull to store state in flowhash entries without
the need for callbacks when an entry timeouts.

Change-Id: Ieece6b7277241f84ea3f2473d0771c6ee8ce460c
Signed-off-by: Pierre Pfister <ppfister@cisco.com>
diff --git a/src/vppinfra/flowhash_template.h b/src/vppinfra/flowhash_template.h
index 359b969..9227256 100644
--- a/src/vppinfra/flowhash_template.h
+++ b/src/vppinfra/flowhash_template.h
@@ -374,6 +374,7 @@
 
   /* Fill free elements list */
   int i;
+  memset(h->entries, 0, sizeof(h->entries[0]) * entries);
   for (i = 1; i <= collision_buckets; i++)
     {
       h->free_buckets_indices[-i] =
@@ -525,9 +526,13 @@
 }
 
 static_always_inline void
-FV(flowhash_gc)(FVT(flowhash) *h, u32 time_now)
+FV(flowhash_gc)(FVT(flowhash) *h, u32 time_now,
+    u32 *freed_index, u32 *freed_len)
 {
   u32 ei;
+  if (freed_index)
+    *freed_len = 0;
+
   if (PREDICT_FALSE(h->collision_buckets_mask == (((u32)0) - 1)))
     return;
 
@@ -565,6 +570,12 @@
 
       if (!found)
         {
+          /* Tell caller we freed this */
+          if (freed_index)
+            {
+              *freed_index = ei;
+              *freed_len = FLOWHASH_ENTRIES_PER_BUCKETS;
+            }
           /* The bucket is not used. Let's free it. */
           h->free_buckets_position--;
           /* Reset forward link */