ip: fix fib and mfib locks
[vpp.git] / src / vnet / ip / lookup.c
index f674fec..192c4c7 100644 (file)
@@ -399,27 +399,32 @@ vnet_ip_table_cmd (vlib_main_t * vm,
        }
     }
 
-  if (~0 == table_id)
-    {
-      error = clib_error_return (0, "No table id");
-      goto done;
-    }
-  else if (0 == table_id)
+  if (0 == table_id)
     {
       error = clib_error_return (0, "Can't change the default table");
       goto done;
     }
   else
-    {
-      if (is_add)
-       {
-         ip_table_create (fproto, table_id, 0, name);
-       }
-      else
        {
-         ip_table_delete (fproto, table_id, 0);
+         if (is_add)
+           {
+             if (~0 == table_id)
+               {
+                 table_id = ip_table_get_unused_id (fproto);
+                 vlib_cli_output (vm, "%u\n", table_id);
+               }
+             ip_table_create (fproto, table_id, 0, name);
+           }
+         else
+           {
+             if (~0 == table_id)
+               {
+                 error = clib_error_return (0, "No table id");
+                 goto done;
+               }
+             ip_table_delete (fproto, table_id, 0);
+           }
        }
-    }
 
 done:
   unformat_free (line_input);
@@ -440,6 +445,71 @@ vnet_ip6_table_cmd (vlib_main_t * vm,
   return (vnet_ip_table_cmd (vm, main_input, cmd, FIB_PROTOCOL_IP6));
 }
 
+clib_error_t *
+vnet_show_ip_table_cmd (vlib_main_t *vm, unformat_input_t *main_input,
+                       vlib_cli_command_t *cmd, fib_protocol_t fproto)
+{
+  unformat_input_t _line_input, *line_input = &_line_input;
+  fib_table_t *fib, *fibs;
+  clib_error_t *error = NULL;
+  u32 table_id = ~0, fib_index;
+  /* Get a line of input. */
+  if (unformat_user (main_input, unformat_line_input, line_input))
+    {
+      while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+       {
+         if (unformat (line_input, "%d", &table_id))
+           ;
+         else
+           {
+             error = unformat_parse_error (line_input);
+             goto done;
+           }
+       }
+      unformat_free (line_input);
+    }
+
+  fibs = (fproto == FIB_PROTOCOL_IP4) ? ip4_main.fibs : ip6_main.fibs;
+
+  if (table_id != (u32) ~0)
+    {
+      fib_index = fib_table_find (fproto, table_id);
+      if (fib_index == (u32) ~0)
+       {
+         error = clib_error_return (0, "Couldn't find table with table_id %u",
+                                    table_id);
+         goto done;
+       }
+
+      fib = fib_table_get (fib_index, fproto);
+      vlib_cli_output (vm, "[%3u] table_id:%3u %v", fib->ft_index,
+                      fib->ft_table_id, fib->ft_desc);
+    }
+  else
+    {
+      pool_foreach (fib, fibs)
+       vlib_cli_output (vm, "[%3u] table_id:%3u %v", fib->ft_index,
+                        fib->ft_table_id, fib->ft_desc);
+    }
+
+done:
+  return error;
+}
+
+clib_error_t *
+vnet_show_ip4_table_cmd (vlib_main_t *vm, unformat_input_t *main_input,
+                        vlib_cli_command_t *cmd)
+{
+  return (vnet_show_ip_table_cmd (vm, main_input, cmd, FIB_PROTOCOL_IP4));
+}
+
+clib_error_t *
+vnet_show_ip6_table_cmd (vlib_main_t *vm, unformat_input_t *main_input,
+                        vlib_cli_command_t *cmd)
+{
+  return (vnet_show_ip_table_cmd (vm, main_input, cmd, FIB_PROTOCOL_IP6));
+}
+
 /* *INDENT-OFF* */
 VLIB_CLI_COMMAND (vlib_cli_ip_command, static) = {
   .path = "ip",
@@ -532,6 +602,18 @@ VLIB_CLI_COMMAND (ip6_table_command, static) = {
   .function = vnet_ip6_table_cmd,
 };
 
+VLIB_CLI_COMMAND (show_ip4_table_command, static) = {
+  .path = "show ip table",
+  .short_help = "show ip table <table-id>",
+  .function = vnet_show_ip4_table_cmd,
+};
+
+VLIB_CLI_COMMAND (show_ip6_table_command, static) = {
+  .path = "show ip6 table",
+  .short_help = "show ip6 table <table-id>",
+  .function = vnet_show_ip6_table_cmd,
+};
+
 static clib_error_t *
 ip_table_bind_cmd (vlib_main_t * vm,
                    unformat_input_t * input,
@@ -561,7 +643,7 @@ ip_table_bind_cmd (vlib_main_t * vm,
       goto done;
     }
 
-  rv = ip_table_bind (fproto, sw_if_index, table_id, 0);
+  rv = ip_table_bind (fproto, sw_if_index, table_id);
 
   if (VNET_API_ERROR_ADDRESS_FOUND_FOR_INTERFACE == rv)
     {