diff options
author | Filip Varga <fivarga@cisco.com> | 2020-02-13 14:52:18 +0100 |
---|---|---|
committer | Ole Trøan <otroan@employees.org> | 2020-02-20 09:29:41 +0000 |
commit | 98301bd5603ce691d809759ec444641953cb5caa (patch) | |
tree | 00db0e0d15d4faf4d5e3788df736301379e48e9b /src/plugins/nat/nat44/inlines.h | |
parent | 1284f8c71da8ec35cba04351cf62cba7bdd7f847 (diff) |
nat: user deletion function & extra metrics
Type: improvement
Signed-off-by: Filip Varga <fivarga@cisco.com>
Change-Id: Ia5dbfe864c18e953ff49147a9a4684d2ca14b96e
Diffstat (limited to 'src/plugins/nat/nat44/inlines.h')
-rw-r--r-- | src/plugins/nat/nat44/inlines.h | 68 |
1 files changed, 68 insertions, 0 deletions
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 @@ -41,6 +41,74 @@ nat44_session_cleanup (snat_session_t * s, u32 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) { dlist_elt_t *elt; |