X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fvnet%2Fsession%2Fsession_table.c;h=cbb284d13018d2feb45cd2307759cd848a27555a;hb=refs%2Fchanges%2F41%2F39941%2F8;hp=d0b576fda7b63d2b34127c000c04dfe4da69e705;hpb=07063b8ea39b05d5d7bb00ad2a2363b11792c571;p=vpp.git diff --git a/src/vnet/session/session_table.c b/src/vnet/session/session_table.c index d0b576fda7b..cbb284d1301 100644 --- a/src/vnet/session/session_table.c +++ b/src/vnet/session/session_table.c @@ -60,6 +60,31 @@ session_table_get (u32 table_index) _(v6,halfopen,buckets,20000) \ _(v6,halfopen,memory,(64<<20)) +void +session_table_free (session_table_t *slt, u8 fib_proto) +{ + u8 all = fib_proto > FIB_PROTOCOL_IP6 ? 1 : 0; + int i; + + for (i = 0; i < TRANSPORT_N_PROTOS; i++) + session_rules_table_free (&slt->session_rules[i]); + + vec_free (slt->session_rules); + + if (fib_proto == FIB_PROTOCOL_IP4 || all) + { + clib_bihash_free_16_8 (&slt->v4_session_hash); + clib_bihash_free_16_8 (&slt->v4_half_open_hash); + } + if (fib_proto == FIB_PROTOCOL_IP6 || all) + { + clib_bihash_free_48_8 (&slt->v6_session_hash); + clib_bihash_free_48_8 (&slt->v6_half_open_hash); + } + + pool_put (lookup_tables, slt); +} + /** * Initialize session table hash tables * @@ -160,6 +185,66 @@ ip4_session_table_walk (clib_bihash_16_8_t * hash, &ctx); } +u32 +session_table_memory_size (session_table_t *st) +{ + u64 total_size = 0; + + if (clib_bihash_is_initialised_16_8 (&st->v4_session_hash)) + { + clib_bihash_alloc_chunk_16_8_t *c = st->v4_session_hash.chunks; + while (c) + { + total_size += c->size; + c = c->next; + } + c = st->v4_half_open_hash.chunks; + while (c) + { + total_size += c->size; + c = c->next; + } + } + + if (clib_bihash_is_initialised_48_8 (&st->v6_session_hash)) + { + clib_bihash_alloc_chunk_48_8_t *c = st->v6_session_hash.chunks; + while (c) + { + total_size += c->size; + c = c->next; + } + c = st->v6_half_open_hash.chunks; + while (c) + { + total_size += c->size; + c = c->next; + } + } + + return total_size; +} + +u8 * +format_session_table (u8 *s, va_list *args) +{ + session_table_t *st = va_arg (*args, session_table_t *); + + if (clib_bihash_is_initialised_16_8 (&st->v4_session_hash)) + { + s = format (s, "%U", format_bihash_16_8, &st->v4_session_hash, 0); + s = format (s, "%U", format_bihash_16_8, &st->v4_half_open_hash, 0); + } + + if (clib_bihash_is_initialised_48_8 (&st->v6_session_hash)) + { + s = format (s, "%U", format_bihash_48_8, &st->v6_session_hash, 0); + s = format (s, "%U", format_bihash_48_8, &st->v6_half_open_hash, 0); + } + + return s; +} + /* *INDENT-ON* */ /* * fd.io coding-style-patch-verification: ON