X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fnat%2Fnat44%2Finlines.h;h=459badac8e18d41208165370a5e4dae0ab1897a6;hb=603e75465;hp=52dd37c932116bf6bc8e2fe1fb099cddc65421f2;hpb=8a10c7351b35ab8405c2a9b030dba74a4da28f30;p=vpp.git diff --git a/src/plugins/nat/nat44/inlines.h b/src/plugins/nat/nat44/inlines.h index 52dd37c9321..459badac8e1 100644 --- a/src/plugins/nat/nat44/inlines.h +++ b/src/plugins/nat/nat44/inlines.h @@ -26,26 +26,49 @@ static_always_inline u8 nat44_maximum_sessions_exceeded (snat_main_t * sm, u32 thread_index) { if (pool_elts (sm->per_thread_data[thread_index].sessions) >= - sm->max_translations) + sm->max_translations_per_thread) return 1; return 0; } -static_always_inline void -nat44_session_cleanup (snat_session_t * s, u32 thread_index) +static_always_inline u8 +nat44_ed_maximum_sessions_exceeded (snat_main_t * sm, + u32 fib_index, u32 thread_index) { - snat_main_t *sm = &snat_main; + u32 translations; + translations = pool_elts (sm->per_thread_data[thread_index].sessions); + if (vec_len (sm->max_translations_per_fib) <= fib_index) + fib_index = 0; + return translations >= sm->max_translations_per_fib[fib_index]; +} - nat_free_session_data (sm, s, thread_index, 0); - nat44_delete_session (sm, s, thread_index); +static_always_inline snat_session_t * +nat44_session_reuse_old (snat_main_t * sm, snat_user_t * u, + snat_session_t * s, u32 thread_index, f64 now) +{ + nat44_free_session_data (sm, s, thread_index, 0); + if (snat_is_session_static (s)) + u->nstaticsessions--; + else + u->nsessions--; + s->flags = 0; + s->total_bytes = 0; + s->total_pkts = 0; + s->state = 0; + s->ext_host_addr.as_u32 = 0; + s->ext_host_port = 0; + s->ext_host_nat_addr.as_u32 = 0; + s->ext_host_nat_port = 0; + s->tcp_closed_timestamp = 0; + s->ha_last_refreshed = now; + return s; } static_always_inline void -nat44_user_try_cleanup (snat_user_t * u, u32 thread_index, f64 now) +nat44_user_del_sessions (snat_user_t * u, u32 thread_index) { dlist_elt_t *elt; snat_session_t *s; - u64 sess_timeout_time; snat_main_t *sm = &snat_main; snat_main_per_thread_data_t *tsm = &sm->per_thread_data[thread_index]; @@ -61,106 +84,57 @@ nat44_user_try_cleanup (snat_user_t * u, u32 thread_index, f64 now) s = pool_elt_at_index (tsm->sessions, elt->value); elt = pool_elt_at_index (tsm->list_pool, elt->next); - sess_timeout_time = s->last_heard + - (f64) nat44_session_get_timeout (sm, s); - - if (now < sess_timeout_time) - { - tsm->min_session_timeout = - clib_min (sess_timeout_time, tsm->min_session_timeout); - continue; - } - - nat44_session_cleanup (s, thread_index); + nat44_free_session_data (sm, s, thread_index, 0); + nat44_delete_session (sm, s, thread_index); } } -static_always_inline void -nat44_session_try_cleanup (ip4_address_t * addr, - u32 fib_index, u32 thread_index, f64 now) +static_always_inline int +nat44_user_del (ip4_address_t * addr, u32 fib_index) { - snat_user_t *u = 0; + 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; - snat_main_t *sm = &snat_main; - snat_main_per_thread_data_t *tsm = &sm->per_thread_data[thread_index]; + if (sm->endpoint_dependent) + return rv; user_key.addr.as_u32 = addr->as_u32; user_key.fib_index = fib_index; kv.key = user_key.as_u64; - // lookup user for this traffic - if (PREDICT_FALSE (clib_bihash_search_8_8 (&tsm->user_hash, &kv, &value))) - { - // there is still place and a new user can be created - if (PREDICT_TRUE (pool_elts (tsm->sessions) < sm->max_translations)) - return; - - if (now >= tsm->min_session_timeout) - { - tsm->min_session_timeout = ~0; - // there is no place so we try to cleanup all users in this thread - /* *INDENT-OFF* */ - pool_foreach (u, tsm->users, - ({ nat44_user_try_cleanup (u, thread_index, now); })); - /* *INDENT-ON* */ - if (~0 == tsm->min_session_timeout) - { - tsm->min_session_timeout = 0; - } - } - return; - } - - if (now >= tsm->min_session_timeout) - { - tsm->min_session_timeout = ~0; - // each time user creates a new session we try to cleanup expired sessions - nat44_user_try_cleanup (pool_elt_at_index (tsm->users, value.value), - thread_index, now); - if (~0 == tsm->min_session_timeout) - { - tsm->min_session_timeout = 0; - } - } -} - -static_always_inline void -nat44_force_session_cleanup (void) -{ - snat_user_t *u = 0; - - snat_main_t *sm = &snat_main; - snat_main_per_thread_data_t *tsm; - - vlib_main_t *vm = vlib_get_main (); - f64 now = vlib_time_now (vm); - - // TODO: consider own timeouts - if (sm->num_workers > 1) { /* *INDENT-OFF* */ vec_foreach (tsm, sm->per_thread_data) { - pool_foreach (u, tsm->users, - ({ - nat44_user_try_cleanup (u, tsm->thread_index, now); - })); + 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); - /* *INDENT-OFF* */ - pool_foreach (u, tsm->users, - ({ - nat44_user_try_cleanup (u, tsm->thread_index, now); - })); - /* *INDENT-ON* */ + 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; } #endif /* included_nat44_inlines_h__ */