nat: api & cli command for forcing session cleanup 30/24830/2
authorFilip Varga <fivarga@cisco.com>
Thu, 6 Feb 2020 14:25:27 +0000 (15:25 +0100)
committerOle Trøan <otroan@employees.org>
Fri, 7 Feb 2020 07:37:05 +0000 (07:37 +0000)
Ticket: VPP-1836
Type: feature

Signed-off-by: Filip Varga <fivarga@cisco.com>
Change-Id: I8f7fc011bac435445a8916a4948d130ca9162f67

src/plugins/nat/nat.api
src/plugins/nat/nat44/inlines.h
src/plugins/nat/nat44_cli.c
src/plugins/nat/nat_api.c

index 58eee45..0294d40 100644 (file)
@@ -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
index a7bb469..d7c3554 100644 (file)
@@ -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__ */
 
 /*
index e9d3ff5..659dbb2 100644 (file)
@@ -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}
index d73a033..4c162b7 100644 (file)
@@ -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)                                   \