Use lisp_gpeX iface counters to store decap stats
[vpp.git] / vnet / vnet / lisp-gpe / interface.c
index bda68d6..c20e902 100644 (file)
@@ -154,7 +154,6 @@ lisp_gpe_interface_tx (vlib_main_t * vm, vlib_node_runtime_t * node,
 {
   u32 n_left_from, next_index, * from, * to_next;
   lisp_gpe_main_t * lgm = &lisp_gpe_main;
-  u32 pkts_encapsulated = 0;
 
   from = vlib_frame_vector_args (from_frame);
   n_left_from = from_frame->n_vectors;
@@ -249,8 +248,6 @@ lisp_gpe_interface_tx (vlib_main_t * vm, vlib_node_runtime_t * node,
               tr->tunnel_index = t1 - lgm->tunnels;
             }
 
-          pkts_encapsulated += 2;
-
           vlib_validate_buffer_enqueue_x2(vm, node, next_index, to_next,
                                           n_left_to_next, bi0, bi1, next0,
                                           next1);
@@ -281,8 +278,6 @@ lisp_gpe_interface_tx (vlib_main_t * vm, vlib_node_runtime_t * node,
           /* Reset to look up tunnel partner in the configured FIB */
           vnet_buffer(b0)->sw_if_index[VLIB_TX] = t0->encap_fib_index;
 
-          pkts_encapsulated++;
-
           if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED)) 
             {
               lisp_gpe_tx_trace_t *tr = vlib_add_trace (vm, node, b0,
@@ -295,8 +290,7 @@ lisp_gpe_interface_tx (vlib_main_t * vm, vlib_node_runtime_t * node,
 
       vlib_put_next_frame (vm, node, next_index, n_left_to_next);
     }
-  vlib_node_increment_counter (vm, node->node_index,
-                               LISP_GPE_ERROR_ENCAPSULATED, pkts_encapsulated);
+
   return from_frame->n_vectors;
 }
 
@@ -512,6 +506,22 @@ vnet_lisp_gpe_add_del_iface (vnet_lisp_gpe_add_del_iface_args_t * a,
         {
           hw_if_index = lgm->free_lisp_gpe_tunnel_hw_if_indices[flen - 1];
           _vec_len(lgm->free_lisp_gpe_tunnel_hw_if_indices) -= 1;
+
+          hi = vnet_get_hw_interface (vnm, hw_if_index);
+
+          /* clear old stats of freed interface before reuse */
+          vnet_interface_main_t * im = &vnm->interface_main;
+          vnet_interface_counter_lock (im);
+          vlib_zero_combined_counter (
+              &im->combined_sw_if_counters[VNET_INTERFACE_COUNTER_TX],
+              hi->sw_if_index);
+          vlib_zero_combined_counter (
+              &im->combined_sw_if_counters[VNET_INTERFACE_COUNTER_RX],
+              hi->sw_if_index);
+          vlib_zero_simple_counter (
+              &im->sw_if_counters[VNET_INTERFACE_COUNTER_DROP],
+              hi->sw_if_index);
+          vnet_interface_counter_unlock (im);
         }
       else
         {
@@ -519,9 +529,9 @@ vnet_lisp_gpe_add_del_iface (vnet_lisp_gpe_add_del_iface_args_t * a,
                                                  lisp_gpe_device_class.index,
                                                  a->table_id,
                                                  lisp_gpe_hw_class.index, 0);
+          hi = vnet_get_hw_interface (vnm, hw_if_index);
         }
 
-      hi = vnet_get_hw_interface (vnm, hw_if_index);
       hash_set(lgm->lisp_gpe_hw_if_index_by_table_id, a->table_id, hw_if_index);
 
       /* set tunnel termination: post decap, packets are tagged as having been