srv6-ad: Adding rewrite counters 54/13354/6
authorFrancois Clad <fclad@cisco.com>
Wed, 4 Jul 2018 11:46:46 +0000 (13:46 +0200)
committerDamjan Marion <dmarion@me.com>
Wed, 22 Aug 2018 10:41:18 +0000 (10:41 +0000)
Change-Id: I0af61b27f3336861af2ad5e5b1053c61607b970c
Signed-off-by: Francois Clad <fclad@cisco.com>
src/plugins/srv6-ad/ad.c
src/plugins/srv6-ad/ad.h
src/plugins/srv6-ad/node.c

index 58dd990..ae7a6c9 100644 (file)
@@ -114,6 +114,18 @@ srv6_ad_localsid_creation_fn (ip6_sr_localsid_t * localsid)
 
   ls_mem->rw_len = 0;
 
+  /* Step 3: Initialize rewrite counters */
+  srv6_ad_localsid_t **ls_p;
+  pool_get (sm->sids, ls_p);
+  *ls_p = ls_mem;
+  ls_mem->index = ls_p - sm->sids;
+
+  vlib_validate_combined_counter (&(sm->valid_counters), ls_mem->index);
+  vlib_validate_combined_counter (&(sm->invalid_counters), ls_mem->index);
+
+  vlib_zero_combined_counter (&(sm->valid_counters), ls_mem->index);
+  vlib_zero_combined_counter (&(sm->invalid_counters), ls_mem->index);
+
   return 0;
 }
 
@@ -151,6 +163,9 @@ srv6_ad_localsid_removal_fn (ip6_sr_localsid_t * localsid)
   /* Unlock (OIF, NHOP) adjacency (from sr_localsid.c:103) */
   adj_unlock (ls_mem->nh_adj);
 
+  /* Delete SID entry */
+  pool_put (sm->sids, pool_elt_at_index (sm->sids, ls_mem->index));
+
   /* Clean up local SID memory */
   clib_mem_free (localsid->plugin_mem);
 
@@ -169,29 +184,36 @@ format_srv6_ad_localsid (u8 * s, va_list * args)
   srv6_ad_localsid_t *ls_mem = va_arg (*args, void *);
 
   vnet_main_t *vnm = vnet_get_main ();
+  srv6_ad_main_t *sm = &srv6_ad_main;
 
   if (ls_mem->ip_version == DA_IP4)
     {
-      return (format (s,
-                     "Next-hop:\t%U\n"
-                     "\tOutgoing iface: %U\n"
-                     "\tIncoming iface: %U",
-                     format_ip4_address, &ls_mem->nh_addr.ip4,
-                     format_vnet_sw_if_index_name, vnm,
-                     ls_mem->sw_if_index_out, format_vnet_sw_if_index_name,
-                     vnm, ls_mem->sw_if_index_in));
+      s =
+       format (s, "Next-hop:\t%U\n", format_ip4_address,
+               &ls_mem->nh_addr.ip4);
     }
   else
     {
-      return (format (s,
-                     "Next-hop:\t%U\n"
-                     "\tOutgoing iface: %U\n"
-                     "\tIncoming iface: %U",
-                     format_ip6_address, &ls_mem->nh_addr.ip6,
-                     format_vnet_sw_if_index_name, vnm,
-                     ls_mem->sw_if_index_out, format_vnet_sw_if_index_name,
-                     vnm, ls_mem->sw_if_index_in));
+      s =
+       format (s, "Next-hop:\t%U\n", format_ip6_address,
+               &ls_mem->nh_addr.ip6);
     }
+
+  s = format (s, "\tOutgoing iface:\t%U\n", format_vnet_sw_if_index_name, vnm,
+             ls_mem->sw_if_index_out);
+  s = format (s, "\tIncoming iface:\t%U\n", format_vnet_sw_if_index_name, vnm,
+             ls_mem->sw_if_index_in);
+
+  vlib_counter_t valid, invalid;
+  vlib_get_combined_counter (&(sm->valid_counters), ls_mem->index, &valid);
+  vlib_get_combined_counter (&(sm->invalid_counters), ls_mem->index,
+                            &invalid);
+  s = format (s, "\tGood rewrite traffic: \t[%Ld packets : %Ld bytes]\n",
+             valid.packets, valid.bytes);
+  s = format (s, "\tBad rewrite traffic:  \t[%Ld packets : %Ld bytes]\n",
+             invalid.packets, invalid.bytes);
+
+  return s;
 }
 
 /*
index 950085f..945e812 100644 (file)
 #define DA_IP4 4
 #define DA_IP6 6
 
-typedef struct
-{
-  u16 msg_id_base;                       /**< API message ID base */
-
-  vlib_main_t *vlib_main;                /**< [convenience] vlib main */
-  vnet_main_t *vnet_main;                /**< [convenience] vnet main */
-
-  dpo_type_t srv6_ad_dpo_type;           /**< DPO type */
-
-  u32 srv6_localsid_behavior_id;         /**< SRv6 LocalSID behavior number */
-
-  u32 *sw_iface_localsid4;               /**< Retrieve local SID from iface */
-  u32 *sw_iface_localsid6;               /**< Retrieve local SID from iface */
-} srv6_ad_main_t;
-
 /*
  * This is the memory that will be stored per each localsid
  * the user instantiates
@@ -55,8 +40,30 @@ typedef struct
   u32 sw_if_index_in;                                              /**< Incoming iface from proxied dev. */
   u32 rw_len;                /**< Number of bits to be rewritten */
   u8 *rewrite;                                                         /**< Headers to be rewritten */
+
+  u32 index;
 } srv6_ad_localsid_t;
 
+typedef struct
+{
+  u16 msg_id_base;                       /**< API message ID base */
+
+  vlib_main_t *vlib_main;                /**< [convenience] vlib main */
+  vnet_main_t *vnet_main;                /**< [convenience] vnet main */
+
+  dpo_type_t srv6_ad_dpo_type;           /**< DPO type */
+
+  u32 srv6_localsid_behavior_id;         /**< SRv6 LocalSID behavior number */
+
+  u32 *sw_iface_localsid4;               /**< Retrieve local SID from iface */
+  u32 *sw_iface_localsid6;               /**< Retrieve local SID from iface */
+
+  srv6_ad_localsid_t **sids;   /**< Pool of AD SID pointers */
+
+  vlib_combined_counter_main_t valid_counters; /**< Valid rewrite counters */
+  vlib_combined_counter_main_t invalid_counters;/**< Invalid rewrite counters */
+} srv6_ad_main_t;
+
 srv6_ad_main_t srv6_ad_main;
 
 format_function_t format_srv6_ad_localsid;
index 2985196..e6afe42 100644 (file)
@@ -194,8 +194,6 @@ srv6_ad_localsid_fn (vlib_main_t * vm,
   n_left_from = frame->n_vectors;
   next_index = node->cached_next_index;
 
-  u32 thread_index = vm->thread_index;
-
   while (n_left_from > 0)
     {
       u32 n_left_to_next;
@@ -243,9 +241,10 @@ srv6_ad_localsid_fn (vlib_main_t * vm,
                                             SRV6_AD_LOCALSID_NEXT_ERROR) ?
                                            &(sm->sr_ls_invalid_counters) :
                                            &(sm->sr_ls_valid_counters)),
-                                          thread_index, ls0 - sm->localsids,
-                                          1, vlib_buffer_length_in_chain (vm,
-                                                                          b0));
+                                          vm->thread_index,
+                                          ls0 - sm->localsids, 1,
+                                          vlib_buffer_length_in_chain (vm,
+                                                                       b0));
 
          vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
                                           n_left_to_next, bi0, next0);
@@ -377,6 +376,15 @@ srv6_ad4_rewrite_fn (vlib_main_t * vm,
                }
            }
 
+         /* Increment per-SID AD rewrite counters */
+         vlib_increment_combined_counter (((next0 ==
+                                            SRV6_AD_LOCALSID_NEXT_ERROR) ?
+                                           &(sm->invalid_counters) :
+                                           &(sm->valid_counters)),
+                                          vm->thread_index, ls0_mem->index,
+                                          1, vlib_buffer_length_in_chain (vm,
+                                                                          b0));
+
          vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
                                           n_left_to_next, bi0, next0);
 
@@ -506,6 +514,15 @@ srv6_ad6_rewrite_fn (vlib_main_t * vm,
                }
            }
 
+         /* Increment per-SID AD rewrite counters */
+         vlib_increment_combined_counter (((next0 ==
+                                            SRV6_AD_LOCALSID_NEXT_ERROR) ?
+                                           &(sm->invalid_counters) :
+                                           &(sm->valid_counters)),
+                                          vm->thread_index, ls0_mem->index,
+                                          1, vlib_buffer_length_in_chain (vm,
+                                                                          b0));
+
          vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
                                           n_left_to_next, bi0, next0);