stats: Split stat_segment and stats code in preparation for deprecation.
[vpp.git] / src / vnet / ip / ip_api.c
index 7217f9d..477090d 100644 (file)
@@ -20,7 +20,6 @@
 #include <vnet/vnet.h>
 #include <vlibmemory/api.h>
 
-#include <vpp/stats/stats.h>
 #include <vnet/interface.h>
 #include <vnet/api_errno.h>
 #include <vnet/ethernet/ethernet.h>
@@ -212,6 +211,8 @@ send_ip_fib_details (vpe_api_main_t * am,
          clib_min (vec_len (table->ft_desc), sizeof (mp->table_name)));
   mp->address_length = pfx->fp_len;
   memcpy (mp->address, &pfx->fp_addr.ip4, sizeof (pfx->fp_addr.ip4));
+  mp->stats_index =
+    htonl (fib_table_entry_get_stats_index (table->ft_index, pfx));
 
   mp->count = htonl (path_count);
   fp = mp->path;
@@ -309,6 +310,8 @@ send_ip6_fib_details (vpe_api_main_t * am,
   memcpy (mp->address, &pfx->fp_addr.ip6, sizeof (pfx->fp_addr.ip6));
   memcpy (mp->table_name, table->ft_desc,
          clib_min (vec_len (table->ft_desc), sizeof (mp->table_name)));
+  mp->stats_index =
+    htonl (fib_table_entry_get_stats_index (table->ft_index, pfx));
 
   mp->count = htonl (path_count);
   fp = mp->path;
@@ -653,48 +656,31 @@ static void
 vl_api_ip_neighbor_add_del_t_handler (vl_api_ip_neighbor_add_del_t * mp,
                                      vlib_main_t * vm)
 {
+  ip46_address_t ip = ip46_address_initializer;
   vl_api_ip_neighbor_add_del_reply_t *rmp;
-  vnet_main_t *vnm = vnet_get_main ();
+  ip_neighbor_flags_t flags;
   int rv = 0;
 
   VALIDATE_SW_IF_INDEX (mp);
 
   stats_dslock_with_hint (1 /* release hint */ , 7 /* tag */ );
 
-  /*
-   * there's no validation here of the ND/ARP entry being added.
-   * The expectation is that the FIB will ensure that nothing bad
-   * will come of adding bogus entries.
-   */
+  flags = IP_NEIGHBOR_FLAG_NODE;
+  if (mp->is_static)
+    flags |= IP_NEIGHBOR_FLAG_STATIC;
+  if (mp->is_no_adj_fib)
+    flags |= IP_NEIGHBOR_FLAG_NO_ADJ_FIB;
+
   if (mp->is_ipv6)
-    {
-      if (mp->is_add)
-       rv = vnet_set_ip6_ethernet_neighbor
-         (vm, ntohl (mp->sw_if_index),
-          (ip6_address_t *) (mp->dst_address),
-          mp->mac_address, sizeof (mp->mac_address), mp->is_static,
-          mp->is_no_adj_fib);
-      else
-       rv = vnet_unset_ip6_ethernet_neighbor
-         (vm, ntohl (mp->sw_if_index),
-          (ip6_address_t *) (mp->dst_address),
-          mp->mac_address, sizeof (mp->mac_address));
-    }
+    clib_memcpy (&ip.ip6, mp->dst_address, 16);
   else
-    {
-      ethernet_arp_ip4_over_ethernet_address_t a;
-
-      clib_memcpy (&a.ethernet, mp->mac_address, 6);
-      clib_memcpy (&a.ip4, mp->dst_address, 4);
+    clib_memcpy (&ip.ip4, mp->dst_address, 4);
 
-      if (mp->is_add)
-       rv = vnet_arp_set_ip4_over_ethernet (vnm, ntohl (mp->sw_if_index),
-                                            &a, mp->is_static,
-                                            mp->is_no_adj_fib);
-      else
-       rv =
-         vnet_arp_unset_ip4_over_ethernet (vnm, ntohl (mp->sw_if_index), &a);
-    }
+  if (mp->is_add)
+    rv = ip_neighbor_add (&ip, mp->is_ipv6, mp->mac_address,
+                         ntohl (mp->sw_if_index), flags);
+  else
+    rv = ip_neighbor_del (&ip, mp->is_ipv6, ntohl (mp->sw_if_index));
 
   stats_dsunlock ();
 
@@ -839,26 +825,6 @@ add_del_route_t_handler (u8 is_multipath,
 
   path.frp_flags = path_flags;
 
-  if (is_multipath)
-    {
-      stats_dslock_with_hint (1 /* release hint */ , 10 /* tag */ );
-
-
-      vec_add1 (paths, path);
-
-      if (is_add)
-       fib_table_entry_path_add2 (fib_index,
-                                  prefix,
-                                  FIB_SOURCE_API, entry_flags, paths);
-      else
-       fib_table_entry_path_remove2 (fib_index,
-                                     prefix, FIB_SOURCE_API, paths);
-
-      vec_free (paths);
-      stats_dsunlock ();
-      return 0;
-    }
-
   stats_dslock_with_hint (1 /* release hint */ , 2 /* tag */ );
 
   if (is_drop || is_local || is_classify || is_unreach || is_prohibit)
@@ -914,6 +880,20 @@ add_del_route_t_handler (u8 is_multipath,
          fib_table_entry_special_remove (fib_index, prefix, FIB_SOURCE_API);
        }
     }
+  else if (is_multipath)
+    {
+      vec_add1 (paths, path);
+
+      if (is_add)
+       fib_table_entry_path_add2 (fib_index,
+                                  prefix,
+                                  FIB_SOURCE_API, entry_flags, paths);
+      else
+       fib_table_entry_path_remove2 (fib_index,
+                                     prefix, FIB_SOURCE_API, paths);
+
+      vec_free (paths);
+    }
   else
     {
       if (is_add)
@@ -985,7 +965,8 @@ add_del_route_check (fib_protocol_t table_proto,
 }
 
 static int
-ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
+ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp,
+                            u32 * stats_index)
 {
   u32 fib_index, next_hop_fib_index;
   fib_mpls_label_t *label_stack = NULL;
@@ -1029,32 +1010,37 @@ ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
        }
     }
 
-  return (add_del_route_t_handler (mp->is_multipath,
-                                  mp->is_add,
-                                  mp->is_drop,
-                                  mp->is_unreach,
-                                  mp->is_prohibit,
-                                  mp->is_local, 0,
-                                  mp->is_classify,
-                                  mp->classify_table_index,
-                                  mp->is_resolve_host,
-                                  mp->is_resolve_attached, 0, 0,
-                                  mp->is_dvr,
-                                  mp->is_source_lookup,
-                                  mp->is_udp_encap,
-                                  fib_index, &pfx, DPO_PROTO_IP4,
-                                  &nh,
-                                  ntohl (mp->next_hop_id),
-                                  ntohl (mp->next_hop_sw_if_index),
-                                  next_hop_fib_index,
-                                  mp->next_hop_weight,
-                                  mp->next_hop_preference,
-                                  ntohl (mp->next_hop_via_label),
-                                  label_stack));
+  rv = add_del_route_t_handler (mp->is_multipath,
+                               mp->is_add,
+                               mp->is_drop,
+                               mp->is_unreach,
+                               mp->is_prohibit,
+                               mp->is_local, 0,
+                               mp->is_classify,
+                               mp->classify_table_index,
+                               mp->is_resolve_host,
+                               mp->is_resolve_attached, 0, 0,
+                               mp->is_dvr,
+                               mp->is_source_lookup,
+                               mp->is_udp_encap,
+                               fib_index, &pfx, DPO_PROTO_IP4,
+                               &nh,
+                               ntohl (mp->next_hop_id),
+                               ntohl (mp->next_hop_sw_if_index),
+                               next_hop_fib_index,
+                               mp->next_hop_weight,
+                               mp->next_hop_preference,
+                               ntohl (mp->next_hop_via_label), label_stack);
+
+  if (mp->is_add && 0 == rv)
+    *stats_index = fib_table_entry_get_stats_index (fib_index, &pfx);
+
+  return (rv);
 }
 
 static int
-ip6_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
+ip6_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp,
+                            u32 * stats_index)
 {
   fib_mpls_label_t *label_stack = NULL;
   u32 fib_index, next_hop_fib_index;
@@ -1098,46 +1084,57 @@ ip6_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
        }
     }
 
-  return (add_del_route_t_handler (mp->is_multipath,
-                                  mp->is_add,
-                                  mp->is_drop,
-                                  mp->is_unreach,
-                                  mp->is_prohibit,
-                                  mp->is_local, 0,
-                                  mp->is_classify,
-                                  mp->classify_table_index,
-                                  mp->is_resolve_host,
-                                  mp->is_resolve_attached, 0, 0,
-                                  mp->is_dvr,
-                                  mp->is_source_lookup,
-                                  mp->is_udp_encap,
-                                  fib_index, &pfx, DPO_PROTO_IP6,
-                                  &nh, ntohl (mp->next_hop_id),
-                                  ntohl (mp->next_hop_sw_if_index),
-                                  next_hop_fib_index,
-                                  mp->next_hop_weight,
-                                  mp->next_hop_preference,
-                                  ntohl (mp->next_hop_via_label),
-                                  label_stack));
+  rv = add_del_route_t_handler (mp->is_multipath,
+                               mp->is_add,
+                               mp->is_drop,
+                               mp->is_unreach,
+                               mp->is_prohibit,
+                               mp->is_local, 0,
+                               mp->is_classify,
+                               mp->classify_table_index,
+                               mp->is_resolve_host,
+                               mp->is_resolve_attached, 0, 0,
+                               mp->is_dvr,
+                               mp->is_source_lookup,
+                               mp->is_udp_encap,
+                               fib_index, &pfx, DPO_PROTO_IP6,
+                               &nh, ntohl (mp->next_hop_id),
+                               ntohl (mp->next_hop_sw_if_index),
+                               next_hop_fib_index,
+                               mp->next_hop_weight,
+                               mp->next_hop_preference,
+                               ntohl (mp->next_hop_via_label), label_stack);
+
+  if (mp->is_add && 0 == rv)
+    *stats_index = fib_table_entry_get_stats_index (fib_index, &pfx);
+
+  return (rv);
 }
 
 void
 vl_api_ip_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
 {
   vl_api_ip_add_del_route_reply_t *rmp;
+  u32 stats_index;
   int rv;
   vnet_main_t *vnm = vnet_get_main ();
 
   vnm->api_errno = 0;
+  stats_index = ~0;
 
   if (mp->is_ipv6)
-    rv = ip6_add_del_route_t_handler (mp);
+    rv = ip6_add_del_route_t_handler (mp, &stats_index);
   else
-    rv = ip4_add_del_route_t_handler (mp);
+    rv = ip4_add_del_route_t_handler (mp, &stats_index);
 
   rv = (rv == 0) ? vnm->api_errno : rv;
 
-  REPLY_MACRO (VL_API_IP_ADD_DEL_ROUTE_REPLY);
+  /* *INDENT-OFF* */
+  REPLY_MACRO2 (VL_API_IP_ADD_DEL_ROUTE_REPLY,
+  ({
+    rmp->stats_index = htonl (stats_index);
+  }))
+  /* *INDENT-ON* */
 }
 
 void
@@ -1424,6 +1421,7 @@ vl_api_ip_address_dump_t_handler (vl_api_ip_address_dump_t * mp)
       }));
       /* *INDENT-ON* */
     }
+
   BAD_SW_IF_INDEX_LABEL;
 }