From 98301bd5603ce691d809759ec444641953cb5caa Mon Sep 17 00:00:00 2001 From: Filip Varga Date: Thu, 13 Feb 2020 14:52:18 +0100 Subject: nat: user deletion function & extra metrics Type: improvement Signed-off-by: Filip Varga Change-Id: Ia5dbfe864c18e953ff49147a9a4684d2ca14b96e --- src/plugins/nat/nat44/inlines.h | 68 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) (limited to 'src/plugins/nat/nat44') diff --git a/src/plugins/nat/nat44/inlines.h b/src/plugins/nat/nat44/inlines.h index 52dd37c9321..0c8487b473d 100644 --- a/src/plugins/nat/nat44/inlines.h +++ b/src/plugins/nat/nat44/inlines.h @@ -40,6 +40,74 @@ nat44_session_cleanup (snat_session_t * s, u32 thread_index) nat44_delete_session (sm, s, thread_index); } +static_always_inline void +nat44_user_del_sessions (snat_user_t * u, u32 thread_index) +{ + dlist_elt_t *elt; + snat_session_t *s; + + snat_main_t *sm = &snat_main; + snat_main_per_thread_data_t *tsm = &sm->per_thread_data[thread_index]; + + // get head + elt = pool_elt_at_index (tsm->list_pool, + u->sessions_per_user_list_head_index); + // get first element + elt = pool_elt_at_index (tsm->list_pool, elt->next); + + while (elt->value != ~0) + { + s = pool_elt_at_index (tsm->sessions, elt->value); + elt = pool_elt_at_index (tsm->list_pool, elt->next); + nat44_session_cleanup (s, thread_index); + } +} + +static_always_inline int +nat44_user_del (ip4_address_t * addr, u32 fib_index) +{ + int rv = 1; + + snat_main_t *sm = &snat_main; + snat_main_per_thread_data_t *tsm; + + snat_user_key_t user_key; + clib_bihash_kv_8_8_t kv, value; + + user_key.addr.as_u32 = addr->as_u32; + user_key.fib_index = fib_index; + kv.key = user_key.as_u64; + + if (sm->num_workers > 1) + { + /* *INDENT-OFF* */ + vec_foreach (tsm, sm->per_thread_data) + { + if (!clib_bihash_search_8_8 (&tsm->user_hash, &kv, &value)) + { + nat44_user_del_sessions ( + pool_elt_at_index (tsm->users, value.value), + tsm->thread_index); + rv = 0; + break; + } + } + /* *INDENT-ON* */ + } + else + { + tsm = vec_elt_at_index (sm->per_thread_data, sm->num_workers); + if (!clib_bihash_search_8_8 (&tsm->user_hash, &kv, &value)) + { + nat44_user_del_sessions (pool_elt_at_index + (tsm->users, value.value), + tsm->thread_index); + rv = 0; + } + } + return rv; +} + static_always_inline void nat44_user_try_cleanup (snat_user_t * u, u32 thread_index, f64 now) { -- cgit 1.2.3-korg