summaryrefslogtreecommitdiffstats
path: root/src/vppinfra
diff options
context:
space:
mode:
Diffstat (limited to 'src/vppinfra')
-rw-r--r--src/vppinfra/flowhash_template.h13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/vppinfra/flowhash_template.h b/src/vppinfra/flowhash_template.h
index 359b9690a50..92272563878 100644
--- a/src/vppinfra/flowhash_template.h
+++ b/src/vppinfra/flowhash_template.h
@@ -374,6 +374,7 @@ FVT(flowhash) *FV(flowhash_alloc)(u32 fixed_entries, u32 collision_buckets)
/* 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 @@ FV(__flowhash_get_chained) (FVT(flowhash) *h, FVT(flowhash_lkey) *k,
}
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 @@ FV(flowhash_gc)(FVT(flowhash) *h, u32 time_now)
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 */