bfd: Express node stats using the .api file

Type: improvement

This method allows the assignment of a severity to the error.

Signed-off-by: Neale Ranns <neale@graphiant.com>
Change-Id: Id1a414a88018390d03bd6b16bd048a98903bab5a
diff --git a/src/vnet/bfd/bfd.api b/src/vnet/bfd/bfd.api
index 3957a94..f573bc5 100644
--- a/src/vnet/bfd/bfd.api
+++ b/src/vnet/bfd/bfd.api
@@ -359,6 +359,64 @@
   bool is_delayed;
 };
 
+counters bfd_udp {
+  none {
+    severity info;
+    type counter64;
+    units "packets";
+    description "OK";
+  };
+  no_session {
+    severity error;
+    type counter64;
+    units "packets";
+    description "no-session";
+  };
+  bad {
+    severity error;
+    type counter64;
+    units "packets";
+    description "bad packet";
+  };
+  length {
+    severity error;
+    type counter64;
+    units "packets";
+    description "too short";
+  };
+  failed_verification {
+    severity error;
+    type counter64;
+    units "packets";
+    description "failed-verification";
+  };
+  src_mismatch {
+    severity error;
+    type counter64;
+    units "packets";
+    description "src-mismatch";
+  };
+  dst_mismatch {
+    severity error;
+    type counter64;
+    units "packets";
+    description "dst-mismatch";
+  };
+  ttl {
+    severity error;
+    type counter64;
+    units "packets";
+    description "ttl";
+  };
+};
+
+paths {
+  "/err/bfd-udp4-input" "bfd";
+  "/err/bfd-udp6-input" "bfd";
+  "/err/bfd-udp4-echo-input" "bfd";
+  "/err/bfd-udp6-echo-input" "bfd";
+};
+
 /*
  * Local Variables:
  * eval: (c-set-style "gnu")
diff --git a/src/vnet/bfd/bfd_udp.c b/src/vnet/bfd/bfd_udp.c
index 5a468e4..36ecdf1 100644
--- a/src/vnet/bfd/bfd_udp.c
+++ b/src/vnet/bfd/bfd_udp.c
@@ -40,6 +40,7 @@
 #include <vnet/bfd/bfd_udp.h>
 #include <vnet/bfd/bfd_main.h>
 #include <vnet/bfd/bfd_api.h>
+#include <vnet/bfd/bfd.api_enum.h>
 
 typedef struct
 {
@@ -930,28 +931,6 @@
   BFD_UDP_INPUT_N_NEXT,
 } bfd_udp_input_next_t;
 
-/* Packet counters - BFD control frames */
-#define foreach_bfd_udp_error(F)                                              \
-  F (NO_SESSION, "no-session")                                                \
-  F (FAILED_VERIFICATION, "failed-verification")                              \
-  F (SRC_MISMATCH, "src-mismatch")                                            \
-  F (DST_MISMATCH, "dst-mismatch")                                            \
-  F (TTL, "ttl")
-
-static char *bfd_udp_error_strings[] = {
-#define F(sym, string) string,
-  foreach_bfd_error (F) foreach_bfd_udp_error (F)
-#undef F
-};
-
-typedef enum
-{
-#define F(sym, str) BFD_UDP_ERROR_##sym,
-  foreach_bfd_error (F) foreach_bfd_udp_error (F)
-#undef F
-    BFD_UDP_N_ERROR,
-} bfd_udp_error_t;
-
 typedef enum
 {
   BFD_UDP_ECHO_INPUT_NEXT_NORMAL,
@@ -960,30 +939,11 @@
   BFD_UDP_ECHO_INPUT_N_NEXT,
 } bfd_udp_echo_input_next_t;
 
-/* Packet counters - BFD ECHO packets */
-#define foreach_bfd_udp_echo_error(F)           \
-  F (NONE, "good bfd echo packets (processed)") \
-  F (BAD, "invalid bfd echo packets")
-
-static char *bfd_udp_echo_error_strings[] = {
-#define F(sym, string) string,
-  foreach_bfd_udp_echo_error (F)
-#undef F
-};
-
-typedef enum
-{
-#define F(sym, str) BFD_UDP_ECHO_ERROR_##sym,
-  foreach_bfd_udp_echo_error (F)
-#undef F
-    BFD_UDP_ECHO_N_ERROR,
-} bfd_udp_echo_error_t;
-
-static_always_inline bfd_udp_error_t
+static_always_inline vl_counter_bfd_udp_enum_t
 bfd_error_to_udp (bfd_error_t e)
 {
   /* The UDP error is a super set of the proto independent errors */
-  return ((bfd_udp_error_t) e);
+  return ((vl_counter_bfd_udp_enum_t) e);
 }
 
 static void
@@ -1010,9 +970,9 @@
   *udp = (udp_header_t *) ((*ip4) + 1);
 }
 
-static bfd_udp_error_t
-bfd_udp4_verify_transport (const ip4_header_t * ip4,
-			   const udp_header_t * udp, const bfd_session_t * bs)
+static vl_counter_bfd_udp_enum_t
+bfd_udp4_verify_transport (const ip4_header_t *ip4, const udp_header_t *udp,
+			   const bfd_session_t *bs)
 {
   const bfd_udp_session_t *bus = &bs->udp;
   const bfd_udp_key_t *key = &bus->key;
@@ -1063,7 +1023,7 @@
   return err;
 }
 
-static bfd_udp_error_t
+static vl_counter_bfd_udp_enum_t
 bfd_udp4_scan (vlib_main_t *vm, vlib_buffer_t *b, bfd_session_t **bs_out)
 {
   const bfd_pkt_t *pkt = vlib_buffer_get_current (b);
@@ -1090,7 +1050,7 @@
 	 pkt->head.length, udp_payload_length);
       return BFD_UDP_ERROR_LENGTH;
     }
-  bfd_udp_error_t err;
+  vl_counter_bfd_udp_enum_t err;
   if (BFD_UDP_ERROR_NONE !=
       (err = bfd_error_to_udp (bfd_verify_pkt_common (pkt))))
     {
@@ -1168,9 +1128,9 @@
   *udp = (udp_header_t *) ((*ip6) + 1);
 }
 
-static bfd_udp_error_t
-bfd_udp6_verify_transport (const ip6_header_t * ip6,
-			   const udp_header_t * udp, const bfd_session_t * bs)
+static vl_counter_bfd_udp_enum_t
+bfd_udp6_verify_transport (const ip6_header_t *ip6, const udp_header_t *udp,
+			   const bfd_session_t *bs)
 {
   const bfd_udp_session_t *bus = &bs->udp;
   const bfd_udp_key_t *key = &bus->key;
@@ -1205,7 +1165,7 @@
   return BFD_UDP_ERROR_NONE;
 }
 
-static bfd_udp_error_t
+static vl_counter_bfd_udp_enum_t
 bfd_udp6_scan (vlib_main_t *vm, vlib_buffer_t *b, bfd_session_t **bs_out)
 {
   const bfd_pkt_t *pkt = vlib_buffer_get_current (b);
@@ -1232,7 +1192,7 @@
 	 pkt->head.length, udp_payload_length);
       return BFD_UDP_ERROR_BAD;
     }
-  bfd_udp_error_t err;
+  vl_counter_bfd_udp_enum_t err;
   if (BFD_UDP_ERROR_NONE !=
       (err = bfd_error_to_udp (bfd_verify_pkt_common (pkt))))
     {
@@ -1402,7 +1362,7 @@
   .type = VLIB_NODE_TYPE_INTERNAL,
 
   .n_errors = BFD_UDP_N_ERROR,
-  .error_strings = bfd_udp_error_strings,
+  .error_counters = bfd_udp_error_counters,
 
   .format_trace = bfd_input_format_trace,
 
@@ -1431,7 +1391,7 @@
   .type = VLIB_NODE_TYPE_INTERNAL,
 
   .n_errors = BFD_UDP_N_ERROR,
-  .error_strings = bfd_udp_error_strings,
+  .error_counters = bfd_udp_error_counters,
 
   .format_trace = bfd_input_format_trace,
 
@@ -1556,8 +1516,8 @@
   .vector_size = sizeof (u32),
   .type = VLIB_NODE_TYPE_INTERNAL,
 
-  .n_errors = BFD_UDP_ECHO_N_ERROR,
-  .error_strings = bfd_udp_error_strings,
+  .n_errors = BFD_UDP_N_ERROR,
+  .error_counters = bfd_udp_error_counters,
 
   .format_trace = bfd_echo_input_format_trace,
 
@@ -1585,8 +1545,8 @@
   .vector_size = sizeof (u32),
   .type = VLIB_NODE_TYPE_INTERNAL,
 
-  .n_errors = BFD_UDP_ECHO_N_ERROR,
-  .error_strings = bfd_udp_echo_error_strings,
+  .n_errors = BFD_UDP_N_ERROR,
+  .error_counters = bfd_udp_error_counters,
 
   .format_trace = bfd_echo_input_format_trace,