ip-neighbor: add set ip neighbor-config CLI command

Type: improvement

Signed-off-by: Ivan Shvedunov <ivan4th@gmail.com>
Change-Id: I77ade50425e88d2da979f732d2248bed383f4ba4
diff --git a/src/vnet/ip-neighbor/ip_neighbor.c b/src/vnet/ip-neighbor/ip_neighbor.c
index 78b45a2..8637e16 100644
--- a/src/vnet/ip-neighbor/ip_neighbor.c
+++ b/src/vnet/ip-neighbor/ip_neighbor.c
@@ -23,6 +23,7 @@
 #include <vnet/ip-neighbor/ip_neighbor_watch.h>
 
 #include <vnet/ip/ip6_ll_table.h>
+#include <vnet/ip/ip46_address.h>
 #include <vnet/fib/fib_table.h>
 #include <vnet/adj/adj_mcast.h>
 
@@ -1717,12 +1718,65 @@
   return (NULL);
 }
 
+static clib_error_t *
+ip_neighbor_config_set (vlib_main_t *vm, unformat_input_t *input,
+			vlib_cli_command_t *cmd)
+{
+  unformat_input_t _line_input, *line_input = &_line_input;
+  clib_error_t *error = NULL;
+  ip_address_family_t af;
+  u32 limit, age;
+  bool recycle;
+
+  if (!unformat_user (input, unformat_line_input, line_input))
+    return 0;
+
+  if (!unformat (line_input, "%U", unformat_ip_address_family, &af))
+    {
+      error = unformat_parse_error (line_input);
+      goto done;
+    }
+
+  limit = ip_neighbor_db[af].ipndb_limit;
+  age = ip_neighbor_db[af].ipndb_age;
+  recycle = ip_neighbor_db[af].ipndb_recycle;
+
+  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (line_input, "limit %u", &limit))
+	;
+      else if (unformat (line_input, "age %u", &age))
+	;
+      else if (unformat (line_input, "recycle"))
+	recycle = true;
+      else if (unformat (line_input, "norecycle"))
+	recycle = false;
+      else
+	{
+	  error = unformat_parse_error (line_input);
+	  goto done;
+	}
+    }
+
+  ip_neighbor_config (af, limit, age, recycle);
+
+done:
+  unformat_free (line_input);
+  return error;
+}
+
 /* *INDENT-OFF* */
 VLIB_CLI_COMMAND (show_ip_neighbor_cfg_cmd_node, static) = {
   .path = "show ip neighbor-config",
   .function = ip_neighbor_config_show,
   .short_help = "show ip neighbor-config",
 };
+VLIB_CLI_COMMAND (set_ip_neighbor_cfg_cmd_node, static) = {
+  .path = "set ip neighbor-config",
+  .function = ip_neighbor_config_set,
+  .short_help = "set ip neighbor-config ip4|ip6 [limit <limit>] [age <age>] "
+		"[recycle|norecycle]",
+};
 /* *INDENT-ON* */
 
 static clib_error_t *