nat: api & cli command for forcing session cleanup

Ticket: VPP-1836
Type: feature

Signed-off-by: Filip Varga <fivarga@cisco.com>
Change-Id: I8f7fc011bac435445a8916a4948d130ca9162f67
This commit is contained in:
Filip Varga
2020-02-06 15:25:27 +01:00
committed by Ole Trøan
parent b71ef86c74
commit edf777272b
4 changed files with 98 additions and 0 deletions

@ -130,6 +130,15 @@ enum nat_log_level : u8
NAT_LOG_DEBUG = 0x05,
};
/** \brief Run nat44 garbage collection
@param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request
*/
autoreply define nat44_session_cleanup {
u32 client_index;
u32 context;
};
/** \brief Set NAT logging level
@param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request

@ -108,6 +108,43 @@ nat44_session_try_cleanup (ip4_address_t * addr,
thread_index, now);
}
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);
}));
}
/* *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* */
}
}
#endif /* included_nat44_inlines_h__ */
/*

@ -22,6 +22,7 @@
#include <nat/nat_det.h>
#include <nat/nat64.h>
#include <nat/nat_inlines.h>
#include <nat/nat44/inlines.h>
#include <nat/nat_affinity.h>
#include <vnet/fib/fib_table.h>
#include <nat/nat_ha.h>
@ -115,6 +116,18 @@ nat_show_workers_commnad_fn (vlib_main_t * vm, unformat_input_t * input,
return 0;
}
static clib_error_t *
nat44_session_cleanup_command_fn (vlib_main_t * vm,
unformat_input_t * input,
vlib_cli_command_t * cmd)
{
clib_error_t *error = 0;
nat44_force_session_cleanup ();
return error;
}
static clib_error_t *
snat_set_log_level_command_fn (vlib_main_t * vm,
unformat_input_t * input,
@ -1976,6 +1989,19 @@ VLIB_CLI_COMMAND (nat_show_timeouts_command, static) = {
.function = nat_show_timeouts_command_fn,
};
/*?
* @cliexpar
* @cliexstart{nat set logging level}
* To force garbage collection of nat sessions
* vpp# nat44 session cleanup
* @cliexend
?*/
VLIB_CLI_COMMAND (nat44_session_cleanup_command, static) = {
.path = "nat44 session cleanup",
.function = nat44_session_cleanup_command_fn,
.short_help = "nat44 session cleanup",
};
/*?
* @cliexpar
* @cliexstart{nat set logging level}

@ -23,6 +23,7 @@
#include <nat/nat64.h>
#include <nat/nat66.h>
#include <nat/nat_inlines.h>
#include <nat/nat44/inlines.h>
#include <nat/nat_ha.h>
#include <vlibapi/api.h>
#include <vlibmemory/api.h>
@ -240,6 +241,30 @@ vl_api_nat_worker_dump_t_print (vl_api_nat_worker_dump_t * mp, void *handle)
FINISH;
}
static void
vl_api_nat44_session_cleanup_t_handler (vl_api_nat44_session_cleanup_t * mp)
{
snat_main_t *sm = &snat_main;
vl_api_nat44_session_cleanup_reply_t *rmp;
int rv = 0;
nat44_force_session_cleanup ();
REPLY_MACRO (VL_API_NAT44_SESSION_CLEANUP_REPLY);
}
static void *
vl_api_nat44_session_cleanup_t_print (vl_api_nat44_session_cleanup_t * mp,
void *handle)
{
u8 *s;
s = format (0, "SCRIPT: nat44_session_cleanup");
FINISH;
}
static void
vl_api_nat_set_log_level_t_handler (vl_api_nat_set_log_level_t * mp)
{
@ -3094,6 +3119,7 @@ _(NAT_CONTROL_PING, nat_control_ping) \
_(NAT_SHOW_CONFIG, nat_show_config) \
_(NAT_SET_WORKERS, nat_set_workers) \
_(NAT_WORKER_DUMP, nat_worker_dump) \
_(NAT44_SESSION_CLEANUP, nat44_session_cleanup) \
_(NAT_SET_LOG_LEVEL, nat_set_log_level) \
_(NAT_IPFIX_ENABLE_DISABLE, nat_ipfix_enable_disable) \
_(NAT_SET_TIMEOUTS, nat_set_timeouts) \