interface: add capabilities flags
[vpp.git] / src / plugins / lldp / lldp_cli.c
index 2a0891a..e77d699 100644 (file)
@@ -39,6 +39,8 @@ lldp_cfg_err_to_clib_err (lldp_cfg_err_t e)
       return clib_error_return (0, "not supported");
     case lldp_invalid_arg:
       return clib_error_return (0, "invalid argument");
+    case lldp_internal_error:
+      return clib_error_return (0, "internal error");
     }
   return 0;
 }
@@ -47,6 +49,7 @@ lldp_cfg_err_t
 lldp_cfg_intf_set (u32 hw_if_index, u8 ** port_desc, u8 ** mgmt_ip4,
                   u8 ** mgmt_ip6, u8 ** mgmt_oid, int enable)
 {
+  clib_error_t *error = 0;
   lldp_main_t *lm = &lldp_main;
   vnet_main_t *vnm = lm->vnet_main;
   ethernet_main_t *em = &ethernet_main;
@@ -99,6 +102,22 @@ lldp_cfg_intf_set (u32 hw_if_index, u8 ** port_desc, u8 ** mgmt_ip4,
          *mgmt_oid = NULL;
        }
 
+      /* Add MAC address to an interface's filter */
+      if (hi->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_MAC_FILTER)
+       {
+         error =
+           vnet_hw_interface_add_del_mac_address (lm->vnet_main,
+                                                  hw_if_index,
+                                                  lldp_mac_addr,
+                                                  1 /* is_add */ );
+         if (error)
+           {
+             clib_error_free (error);
+             lldp_delete_intf (lm, n);
+             return lldp_internal_error;
+           }
+       }
+
       const vnet_sw_interface_t *sw =
        vnet_get_sw_interface (lm->vnet_main, hi->sw_if_index);
       if (sw->flags & (VNET_SW_INTERFACE_FLAG_ADMIN_UP))
@@ -110,6 +129,19 @@ lldp_cfg_intf_set (u32 hw_if_index, u8 ** port_desc, u8 ** mgmt_ip4,
     {
       lldp_intf_t *n = lldp_get_intf (lm, hi->sw_if_index);
       lldp_delete_intf (lm, n);
+      /* Remove MAC address from the interface's filter */
+      if ((n) && (hi->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_MAC_FILTER))
+       {
+         error =
+           vnet_hw_interface_add_del_mac_address (lm->vnet_main,
+                                                  hw_if_index,
+                                                  lldp_mac_addr,
+                                                  0 /* is_add */ );
+         if (error)
+           {
+             clib_error_free (error);
+           }
+       }
     }
 
   return lldp_ok;
@@ -549,12 +581,12 @@ format_lldp_intfs_detail (u8 * s, vlib_main_t * vm, const lldp_main_t * lm)
   f64 now = vlib_time_now (vm);
 
   /* *INDENT-OFF* */
-  pool_foreach(
-      n, lm->intfs, ({
+  pool_foreach (
+      n, lm->intfs)  {
         hw = vnet_get_hw_interface(vnm, n->hw_if_index);
         sw = vnet_get_sw_interface(lm->vnet_main, hw->sw_if_index);
 
-        s = format(s, "\nLocal Interface name: %s\n"
+        s = format(s, "\nLocal Interface name: %v\n"
                       "Local Port Description: %s\n",
                        hw->name, n->port_desc);
         if (n->mgmt_ip4)
@@ -607,7 +639,7 @@ format_lldp_intfs_detail (u8 * s, vlib_main_t * vm, const lldp_main_t * lm)
                        vec_len(n->port_id), 1, format_time_ago, n->last_sent,
                        now, format_time_ago, n->last_heard, now);
           }
-      }));
+      }
   /* *INDENT-ON* */
   return s;
 }
@@ -632,8 +664,8 @@ format_lldp_intfs (u8 * s, va_list * va)
              "Status");
 
   /* *INDENT-OFF* */
-  pool_foreach(
-      n, lm->intfs, ({
+  pool_foreach (
+      n, lm->intfs)  {
         const vnet_hw_interface_t *hw =
             vnet_get_hw_interface(vnm, n->hw_if_index);
         const vnet_sw_interface_t *sw =
@@ -643,7 +675,7 @@ format_lldp_intfs (u8 * s, va_list * va)
           continue;
         if (now < n->last_heard + n->ttl)
           {
-            s = format(s, "%-25s %-25U %-25U %=15U %=15U %=10s\n", hw->name,
+            s = format(s, "%-25v %-25U %-25U %=15U %=15U %=10s\n", hw->name,
                        format_lldp_chassis_id, n->chassis_id_subtype,
                        n->chassis_id, vec_len(n->chassis_id), 0,
                        format_lldp_port_id, n->port_id_subtype, n->port_id,
@@ -652,11 +684,11 @@ format_lldp_intfs (u8 * s, va_list * va)
           }
         else
           {
-            s = format(s, "%-25s %-25s %-25s %=15U %=15U %=10s\n", hw->name,
+            s = format(s, "%-25v %-25s %-25s %=15U %=15U %=10s\n", hw->name,
                        "", "", format_time_ago, n->last_heard, now,
                        format_time_ago, n->last_sent, now, "inactive");
           }
-      }));
+      }
   /* *INDENT-ON* */
   return s;
 }