linux-cp: fix some CLI error messages 09/37109/2
authorMatthew Smith <mgsmith@netgate.com>
Mon, 12 Sep 2022 19:54:43 +0000 (19:54 +0000)
committerNeale Ranns <neale@graphiant.com>
Mon, 19 Sep 2022 01:24:19 +0000 (01:24 +0000)
Type: fix

If unrecognized input was provided to the commands which add or delete a
pair, the error message was being created incorrectly and only displayed
something like "unknown input `'". Provide the correct argument to
format_unformat_error so that the actual unrecognized input is printed.

There also was no error or useful information printed if only the base
command were provided without any additional arguments. This should
print a warning about what required data was missing. Reorganize code to
handle this and to make sure that memory gets freed appropriately.

Change-Id: If454714f50cf41b3b56cfadfbf017f1d160e13a4
Signed-off-by: Matthew Smith <mgsmith@netgate.com>
src/plugins/linux-cp/lcp_cli.c

index ff84e74..a7732a9 100644 (file)
@@ -34,74 +34,60 @@ lcp_itf_pair_create_command_fn (vlib_main_t *vm, unformat_input_t *input,
 {
   unformat_input_t _line_input, *line_input = &_line_input;
   vnet_main_t *vnm = vnet_get_main ();
-  u32 sw_if_index;
-  u8 *host_if_name;
-  lip_host_type_t host_if_type;
-  u8 *ns;
-  int r;
-
-  if (!unformat_user (input, unformat_line_input, line_input))
-    return 0;
-
-  sw_if_index = ~0;
-  host_if_name = ns = NULL;
-  host_if_type = LCP_ITF_HOST_TAP;
+  u32 sw_if_index = ~0;
+  u8 *host_if_name = NULL;
+  lip_host_type_t host_if_type = LCP_ITF_HOST_TAP;
+  u8 *ns = NULL;
+  clib_error_t *error = NULL;
 
-  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+  if (unformat_user (input, unformat_line_input, line_input))
     {
-      if (unformat (line_input, "%d", &sw_if_index))
-       ;
-      else if (unformat (line_input, "%U", unformat_vnet_sw_interface, vnm,
-                        &sw_if_index))
-       ;
-      else if (unformat (line_input, "host-if %s", &host_if_name))
-       ;
-      else if (unformat (line_input, "netns %s", &ns))
-       ;
-      else if (unformat (line_input, "tun"))
-       host_if_type = LCP_ITF_HOST_TUN;
-      else
+      while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
        {
-         unformat_free (line_input);
-         vec_free (host_if_name);
-         vec_free (ns);
-         return clib_error_return (0, "unknown input `%U'",
-                                   format_unformat_error, input);
+         if (unformat (line_input, "%d", &sw_if_index))
+           ;
+         else if (unformat (line_input, "%U", unformat_vnet_sw_interface, vnm,
+                            &sw_if_index))
+           ;
+         else if (unformat (line_input, "host-if %s", &host_if_name))
+           ;
+         else if (unformat (line_input, "netns %s", &ns))
+           ;
+         else if (unformat (line_input, "tun"))
+           host_if_type = LCP_ITF_HOST_TUN;
+         else
+           {
+             error = clib_error_return (0, "unknown input `%U'",
+                                        format_unformat_error, line_input);
+             break;
+           }
        }
+      unformat_free (line_input);
     }
 
-  unformat_free (line_input);
-
-  if (!host_if_name)
+  if (error)
+    ;
+  else if (sw_if_index == ~0)
+    error = clib_error_return (0, "interface name or sw_if_index required");
+  else if (!host_if_name)
+    error = clib_error_return (0, "host interface name required");
+  else if (vec_len (ns) >= LCP_NS_LEN)
+    error = clib_error_return (
+      0, "Namespace name should be fewer than %d characters", LCP_NS_LEN);
+  else
     {
-      vec_free (ns);
-      return clib_error_return (0, "host interface name required");
-    }
+      int r;
 
-  if (sw_if_index == ~0)
-    {
-      vec_free (host_if_name);
-      vec_free (ns);
-      return clib_error_return (0, "interface name or sw_if_index required");
+      r = lcp_itf_pair_create (sw_if_index, host_if_name, host_if_type, ns,
+                              NULL);
+      if (r)
+       error = clib_error_return (0, "linux-cp pair creation failed (%d)", r);
     }
 
-  if (vec_len (ns) >= LCP_NS_LEN)
-    {
-      vec_free (host_if_name);
-      vec_free (ns);
-      return clib_error_return (
-       0, "Namespace name should be fewer than %d characters", LCP_NS_LEN);
-    }
-
-  r = lcp_itf_pair_create (sw_if_index, host_if_name, host_if_type, ns, NULL);
-
   vec_free (host_if_name);
   vec_free (ns);
 
-  if (r)
-    return clib_error_return (0, "linux-cp pair creation failed (%d)", r);
-
-  return 0;
+  return error;
 }
 
 VLIB_CLI_COMMAND (lcp_itf_pair_create_command, static) = {
@@ -267,36 +253,42 @@ lcp_itf_pair_delete_command_fn (vlib_main_t *vm, unformat_input_t *input,
 {
   vnet_main_t *vnm = vnet_get_main ();
   unformat_input_t _line_input, *line_input = &_line_input;
-  u32 sw_if_index;
-  int r;
-
-  if (!unformat_user (input, unformat_line_input, line_input))
-    return 0;
+  u32 sw_if_index = ~0;
+  clib_error_t *error = NULL;
 
-  sw_if_index = ~0;
-
-  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+  if (unformat_user (input, unformat_line_input, line_input))
     {
-      if (unformat (line_input, "%d", &sw_if_index))
-       ;
-      else if (unformat (line_input, "%U", unformat_vnet_sw_interface, vnm,
-                        &sw_if_index))
-       ;
-      else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+      while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+       {
+         if (unformat (line_input, "%d", &sw_if_index))
+           ;
+         else if (unformat (line_input, "%U", unformat_vnet_sw_interface, vnm,
+                            &sw_if_index))
+           ;
+         else
+           {
+             error = clib_error_return (0, "unknown input `%U'",
+                                        format_unformat_error, line_input);
+             break;
+           }
+       }
+      unformat_free (line_input);
     }
 
-  unformat_free (line_input);
-
-  if (sw_if_index == ~0)
-    return clib_error_return (0, "interface name or sw_if_index required");
+  if (error)
+    ;
+  else if (sw_if_index == ~0)
+    error = clib_error_return (0, "interface name or sw_if_index required");
+  else
+    {
+      int r;
 
-  r = lcp_itf_pair_delete (sw_if_index);
+      r = lcp_itf_pair_delete (sw_if_index);
+      if (r)
+       error = clib_error_return (0, "linux-cp pair deletion failed (%d)", r);
+    }
 
-  if (r)
-    return clib_error_return (0, "linux-cp pair deletion failed (%d)", r);
-  return 0;
+  return error;
 }
 
 VLIB_CLI_COMMAND (lcp_itf_pair_delete_command, static) = {