Interface Unicast, Multicast and Broadcast stats on the API 10/11210/2
authorNeale Ranns <nranns@cisco.com>
Fri, 16 Mar 2018 23:26:21 +0000 (16:26 -0700)
committerDave Barach <openvpp@barachs.net>
Mon, 19 Mar 2018 15:56:23 +0000 (15:56 +0000)
Change-Id: I7c75da358aff1bd0216a602a49f2909cef5d920d
Signed-off-by: Neale Ranns <nranns@cisco.com>
src/vnet/interface.api
src/vnet/interface.c
src/vnet/interface.h
src/vnet/interface_api.c

index 9dfb0c3..4d1b5ac 100644 (file)
@@ -238,17 +238,41 @@ typeonly manual_print manual_endian define vlib_counter
     @param sw_if_index - interface indexes for counters
     @param rx_packets - received packet count
     @param rx_bytes - received byte count
+    @param rx_unicast_packets - received unicast packet count
+    @param rx_unicast_bytes - received unicast byte count
+    @param rx_multicast_packets - received multicast packet count
+    @param rx_multicast_bytes - received multicast byte count
+    @param rx_broadcast_packets - received broadcast packet count
+    @param rx_broadcast_bytes - received broadcast byte count
     @param tx_packets - transmitted packet count
     @param tx_bytes - transmitted byte count
+    @param tx_unicast_packets - transmitted unicast packet count
+    @param tx_unicast_bytes - transmitted unicast byte count
+    @param tx_multicast_packets - transmitted multicast packet count
+    @param tx_multicast_bytes - transmitted multicast byte count
+    @param tx_broadcast_packets - transmitted broadcast packet count
+    @param tx_broadcast_bytes - transmitted broadcast byte count
 
 */
 typeonly manual_print manual_endian define vnet_combined_counter
 {
   u32 sw_if_index;
-  u64 rx_packets;                      /**< packet counter */
-  u64 rx_bytes;                        /**< byte counter  */
-  u64 tx_packets;                      /**< packet counter */
-  u64 tx_bytes;                        /**< byte counter  */
+  u64 rx_packets;                              /**< packet counter */
+  u64 rx_bytes;                                        /**< byte counter  */
+  u64 rx_unicast_packets;                      /**< packet counter */
+  u64 rx_unicast_bytes;                                /**< byte counter  */
+  u64 rx_multicast_packets;                    /**< packet counter */
+  u64 rx_multicast_bytes;                      /**< byte counter  */
+  u64 rx_broadcast_packets;                    /**< packet counter */
+  u64 rx_broadcast_bytes;                      /**< byte counter  */
+  u64 tx_packets;                              /**< packet counter */
+  u64 tx_bytes;                                        /**< byte counter  */
+  u64 tx_unicast_packets;                      /**< packet counter */
+  u64 tx_unicast_bytes;                                /**< byte counter  */
+  u64 tx_multicast_packets;                    /**< packet counter */
+  u64 tx_multicast_bytes;                      /**< byte counter  */
+  u64 tx_broadcast_packets;                    /**< packet counter */
+  u64 tx_broadcast_bytes;                      /**< byte counter  */
 };
 
 /** \brief Simple interface counter data type for vnet_interface_simple_counters
@@ -517,6 +541,18 @@ autoreply define delete_loopback
   u32 sw_if_index;
 };
 
+/** \brief Enable or disable detailed interface stats
+    @param client_index - opaque cookie to identify the sender
+    @param context - sender context, to match reply w/ request
+    @param enable_disable - set to 1 to enable, 0 to disable detailed stats
+*/
+autoreply define collect_detailed_interface_stats
+{
+  u32 client_index;
+  u32 context;
+  u8 enable_disable;
+};
+
 /*
  * Local Variables:
  * eval: (c-set-style "gnu")
index 122ae06..ba342d4 100644 (file)
@@ -1237,7 +1237,19 @@ vnet_interface_init (vlib_main_t * vm)
   vec_validate (im->combined_sw_if_counters,
                VNET_N_COMBINED_INTERFACE_COUNTER - 1);
   im->combined_sw_if_counters[VNET_INTERFACE_COUNTER_RX].name = "rx";
+  im->combined_sw_if_counters[VNET_INTERFACE_COUNTER_RX_UNICAST].name =
+    "rx-unicast";
+  im->combined_sw_if_counters[VNET_INTERFACE_COUNTER_RX_MULTICAST].name =
+    "rx-multicast";
+  im->combined_sw_if_counters[VNET_INTERFACE_COUNTER_RX_BROADCAST].name =
+    "rx-broadcast";
   im->combined_sw_if_counters[VNET_INTERFACE_COUNTER_TX].name = "tx";
+  im->combined_sw_if_counters[VNET_INTERFACE_COUNTER_TX_UNICAST].name =
+    "tx-unicast";
+  im->combined_sw_if_counters[VNET_INTERFACE_COUNTER_TX_MULTICAST].name =
+    "tx-multicast";
+  im->combined_sw_if_counters[VNET_INTERFACE_COUNTER_TX_BROADCAST].name =
+    "tx-broadcast";
 
   im->sw_if_counter_lock[0] = 0;
 
@@ -1537,6 +1549,60 @@ default_update_adjacency (vnet_main_t * vnm, u32 sw_if_index, u32 ai)
     }
 }
 
+int collect_detailed_interface_stats_flag = 0;
+
+void
+collect_detailed_interface_stats_flag_set ()
+{
+  collect_detailed_interface_stats_flag = 1;
+}
+
+void
+collect_detailed_interface_stats_flag_clear ()
+{
+  collect_detailed_interface_stats_flag = 0;
+}
+
+static clib_error_t *
+collect_detailed_interface_stats_cli (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;
+
+  /* Get a line of input. */
+  if (!unformat_user (input, unformat_line_input, line_input))
+    return clib_error_return (0, "expected enable | disable");
+
+  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (line_input, "enable") || unformat (line_input, "on"))
+       collect_detailed_interface_stats_flag_set ();
+      else if (unformat (line_input, "disable")
+              || unformat (line_input, "off"))
+       collect_detailed_interface_stats_flag_clear ();
+      else
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
+    }
+
+done:
+  unformat_free (line_input);
+  return error;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (collect_detailed_interface_stats_command, static) = {
+  .path = "interface collect detailed-stats",
+  .short_help = "interface collect detailed-stats <enable|disable>",
+  .function = collect_detailed_interface_stats_cli,
+};
+/* *INDENT-ON* */
+
 /*
  * fd.io coding-style-patch-verification: ON
  *
index 8988eb0..73f1895 100644 (file)
@@ -634,9 +634,43 @@ typedef enum
   /* Combined counters. */
   VNET_INTERFACE_COUNTER_RX = 0,
   VNET_INTERFACE_COUNTER_TX = 1,
-  VNET_N_COMBINED_INTERFACE_COUNTER = 2,
+  VNET_INTERFACE_COUNTER_RX_UNICAST = 2,
+  VNET_INTERFACE_COUNTER_TX_UNICAST = 3,
+  VNET_INTERFACE_COUNTER_RX_MULTICAST = 4,
+  VNET_INTERFACE_COUNTER_TX_MULTICAST = 5,
+  VNET_INTERFACE_COUNTER_RX_BROADCAST = 6,
+  VNET_INTERFACE_COUNTER_TX_BROADCAST = 7,
+  VNET_N_COMBINED_INTERFACE_COUNTER = 8,
 } vnet_interface_counter_type_t;
 
+#define foreach_combined_interface_counter(X)                  \
+  X(VNET_INTERFACE_COUNTER_RX, rx)                             \
+  X(VNET_INTERFACE_COUNTER_TX, tx)                             \
+  X(VNET_INTERFACE_COUNTER_RX_UNICAST, rx_unicast)             \
+  X(VNET_INTERFACE_COUNTER_TX_UNICAST, tx_unicast)             \
+  X(VNET_INTERFACE_COUNTER_RX_MULTICAST, rx_multicast)         \
+  X(VNET_INTERFACE_COUNTER_TX_MULTICAST, tx_multicast)         \
+  X(VNET_INTERFACE_COUNTER_RX_BROADCAST, rx_broadcast)         \
+  X(VNET_INTERFACE_COUNTER_TX_BROADCAST, tx_broadcast)
+
+typedef enum
+{
+  COLLECT_SIMPLE_STATS = 0,
+  COLLECT_DETAILED_STATS = 1,
+} vnet_interface_stats_collection_mode_e;
+
+extern int collect_detailed_interface_stats_flag;
+
+static inline int
+collect_detailed_interface_stats ()
+{
+  return collect_detailed_interface_stats_flag;
+}
+
+void collect_detailed_interface_stats_flag_set ();
+void collect_detailed_interface_stats_flag_clear ();
+
+
 typedef struct
 {
   u32 output_node_index;
index b22cadd..3d9bb30 100644 (file)
@@ -68,7 +68,8 @@ _(DELETE_SUBIF, delete_subif)                                   \
 _(CREATE_LOOPBACK, create_loopback)                            \
 _(CREATE_LOOPBACK_INSTANCE, create_loopback_instance)          \
 _(DELETE_LOOPBACK, delete_loopback)                             \
-_(INTERFACE_NAME_RENUMBER, interface_name_renumber)
+_(INTERFACE_NAME_RENUMBER, interface_name_renumber)             \
+_(COLLECT_DETAILED_INTERFACE_STATS, collect_detailed_interface_stats)
 
 static void
 vl_api_sw_interface_set_flags_t_handler (vl_api_sw_interface_set_flags_t * mp)
@@ -1169,6 +1170,25 @@ vl_api_delete_loopback_t_handler (vl_api_delete_loopback_t * mp)
   REPLY_MACRO (VL_API_DELETE_LOOPBACK_REPLY);
 }
 
+static void
+  vl_api_collect_detailed_interface_stats_t_handler
+  (vl_api_collect_detailed_interface_stats_t * mp)
+{
+  vl_api_collect_detailed_interface_stats_reply_t *rmp;
+  int rv = 0;
+
+  if (mp->enable_disable)
+    {
+      collect_detailed_interface_stats_flag_set ();
+    }
+  else
+    {
+      collect_detailed_interface_stats_flag_clear ();
+    }
+
+  REPLY_MACRO (VL_API_COLLECT_DETAILED_INTERFACE_STATS_REPLY);
+}
+
 /*
  * vpe_api_hookup
  * Add vpe's API message handlers to the table.