feature: add descriptive cli command output for 'set interface feature' 95/23295/9
authorPaul Vinciguerra <pvinci@vinciconsulting.com>
Wed, 6 Nov 2019 18:25:17 +0000 (13:25 -0500)
committerDamjan Marion <dmarion@me.com>
Tue, 17 Dec 2019 18:26:59 +0000 (18:26 +0000)
  DBGvpp# set interface feature local0 arp-foo arc bad-arc
  set interface feature: Unknown arc name (bad-arc)...

  DBGvpp# set interface feature local0 arp-foo arc arp
  set interface feature: Feature (arp-foo) not registered to arc (arp)...
  See 'show features verbose' for valid feature/arc combinations.

  DBGvpp# set interface feature local0 arp-disabled arc arp

Type: fix

Change-Id: I036bb2a75dd2d40f6901e4fde3eb14925238e19b
Signed-off-by: Paul Vinciguerra <pvinci@vinciconsulting.com>
src/vnet/feature/feature.c

index fd88426..0f0bfeb 100644 (file)
@@ -490,21 +490,22 @@ set_interface_features_command_fn (vlib_main_t * vm,
   while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
     {
       if (unformat
-         (line_input, "%U %v", unformat_vnet_sw_interface, vnm, &sw_if_index,
-          &feature_name))
-       ;
-      else if (unformat (line_input, "arc %v", &arc_name))
+         (line_input, "%U %s arc %s", unformat_vnet_sw_interface, vnm,
+          &sw_if_index, &feature_name, &arc_name))
        ;
       else if (unformat (line_input, "disable"))
        enable = 0;
       else
        {
-         if (feature_name && arc_name)
-           break;
          error = unformat_parse_error (line_input);
          goto done;
        }
     }
+  if (!feature_name || !arc_name)
+    {
+      error = clib_error_return (0, "Both feature name and arc required...");
+      goto done;
+    }
 
   if (sw_if_index == ~0)
     {
@@ -515,13 +516,28 @@ set_interface_features_command_fn (vlib_main_t * vm,
   vec_add1 (arc_name, 0);
   vec_add1 (feature_name, 0);
 
+  u8 arc_index;
+
+  arc_index = vnet_get_feature_arc_index ((const char *) arc_name);
+
+  if (arc_index == (u8) ~ 0)
+    {
+      error =
+       clib_error_return (0, "Unknown arc name (%s)... ",
+                          (const char *) arc_name);
+      goto done;
+    }
+
   vnet_feature_registration_t *reg;
   reg =
     vnet_get_feature_reg ((const char *) arc_name,
                          (const char *) feature_name);
   if (reg == 0)
     {
-      error = clib_error_return (0, "Unknown feature...");
+      error =
+       clib_error_return (0,
+                          "Feature (%s) not registered to arc (%s)... See 'show features verbose' for valid feature/arc combinations. ",
+                          feature_name, arc_name);
       goto done;
     }
   if (reg->enable_disable_cb)