UDP-Encap: name counters for the stats segment 34/14734/6
authorNeale Ranns <nranns@cisco.com>
Fri, 7 Sep 2018 15:57:41 +0000 (08:57 -0700)
committerDamjan Marion <dmarion@me.com>
Thu, 20 Sep 2018 10:57:25 +0000 (10:57 +0000)
change the ADD api so that is returns the 'ID' that can be used
by the client to read the stats from the stats segment and to
delete the object. Previously a similar value used required
to be chosen by the client, now VPP allocates one (like it
does e.g. for interfaces)

Change-Id: I563cf6092276eb990c52d5457c86e72546bcf69e
Signed-off-by: Neale Ranns <nranns@cisco.com>
13 files changed:
src/vnet/bier/bier_fmask.c
src/vnet/bier/bier_fmask_db.h
src/vnet/bier/bier_output.c
src/vnet/fib/fib_path.c
src/vnet/udp/udp.api
src/vnet/udp/udp_api.c
src/vnet/udp/udp_encap.c
src/vnet/udp/udp_encap.h
src/vpp/stats/stats.c
test/test_bier.py
test/test_udp.py
test/vpp_papi_provider.py
test/vpp_udp_encap.py

index cb61681..3370d5a 100644 (file)
@@ -181,7 +181,11 @@ bier_fmask_init (bier_fmask_t *bfm,
     btid = bier_table_get_id(bfm->bfm_id->bfmi_bti);
     bier_fmask_bits_init(&bfm->bfm_bits, btid->bti_hdr_len);
 
-    if (ip46_address_is_zero(&(bfm->bfm_id->bfmi_nh)))
+    if (rpath->frp_flags & FIB_ROUTE_PATH_UDP_ENCAP)
+    {
+        bfm->bfm_id->bfmi_nh_type = BIER_NH_UDP;
+    }
+    else if (ip46_address_is_zero(&(bfm->bfm_id->bfmi_nh)))
     {
         bfm->bfm_flags |= BIER_FMASK_FLAG_DISP;
     }
index 36e555f..cf78bda 100644 (file)
@@ -80,7 +80,7 @@ typedef struct bier_fmask_id_t_ {
     bier_hdr_type_t bfmi_hdr_type;
 
     /**
-     * Union discriminatrr
+     * Union discriminator
      */
     bier_nh_type_t bfmi_nh_type;
 } __attribute__((packed)) bier_fmask_id_t;
index 16c1d8e..e2cf7d6 100644 (file)
@@ -58,6 +58,7 @@ typedef struct bier_output_trace_t_
 {
     u32 next_index;
     index_t bfm_index;
+    mpls_label_t bfm_label;
 } bier_output_trace_t;
 
 static uword
@@ -163,6 +164,7 @@ bier_output (vlib_main_t * vm,
                 tr = vlib_add_trace (vm, node, b0, sizeof (*tr));
                 tr->next_index = next0;
                 tr->bfm_index = bfmi0;
+                tr->bfm_label = bfm0->bfm_label;
             }
 
             vlib_validate_buffer_enqueue_x1 (vm, node, next_index,
@@ -186,8 +188,8 @@ format_bier_output_trace (u8 * s, va_list * args)
     CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
     bier_output_trace_t * t = va_arg (*args, bier_output_trace_t *);
 
-    s = format (s, " next [%d], BFM index %d",
-                t->next_index, t->bfm_index);
+    s = format (s, " next [%d], BFM index %d label:%x",
+                t->next_index, t->bfm_index, t->bfm_label);
     return s;
 }
 
index 4714228..226de2a 100644 (file)
@@ -903,7 +903,7 @@ fib_path_unresolve (fib_path_t *path)
         adj_unlock(path->fp_dpo.dpoi_index);
         break;
     case FIB_PATH_TYPE_UDP_ENCAP:
-       udp_encap_unlock_w_index(path->fp_dpo.dpoi_index);
+       udp_encap_unlock(path->fp_dpo.dpoi_index);
         break;
     case FIB_PATH_TYPE_EXCLUSIVE:
        dpo_reset(&path->exclusive.fp_ex_dpo);
index 8788fba..193b577 100644 (file)
@@ -33,16 +33,16 @@ import "vnet/ip/ip_types.api";
  * @param src_ip - Encap source address
  * @param dst_port - Encap destination port
  * @param src_port - Encap source port
- * @param id - The ID assigned to this encap object by the caller
+ * @param id - VPP assigned id; ignored in add message, set in dump
  */
 typedef udp_encap
 {
-  u32 id;
   u32 table_id;
   u16 src_port;
   u16 dst_port;
   vl_api_address_t src_ip;
   vl_api_address_t dst_ip;
+  u32 id;
 };
 
 /**
@@ -51,13 +51,27 @@ typedef udp_encap
  * @param context - sender context, to match reply w/ request
  * @param udp_encap - UDP encap description
  */
-autoreply define udp_encap_add
+define udp_encap_add
 {
   u32 client_index;
   u32 context;
   vl_api_udp_encap_t udp_encap;
 };
 
+/**
+ * @brief Add UDP encap reply
+ * @param context - sender context, to match reply w/ request
+ * @param retval - success/failure return value
+ * @param id - The ID of the encap object that should be used on delete
+ *             and when reading stats from the stats segment.
+ */
+define udp_encap_add_reply
+{
+  u32 context;
+  i32 retval;
+  u32 id;
+};
+
 /**
  * @brief Del UDP encap
  * @param client_index - opaque cookie to identify the sender
index 43a39b8..d00d74e 100644 (file)
@@ -86,7 +86,7 @@ send_udp_encap_details (const udp_encap_t * ue, vl_api_registration_t * reg,
 
   mp->udp_encap.table_id =
     htonl (fib_table_get_table_id (ue->ue_fib_index, ue->ue_ip_proto));
-  mp->udp_encap.id = htonl (ue->ue_id);
+  mp->udp_encap.id = htonl (ue - udp_encap_pool);
 
   vl_api_send_msg (reg, (u8 *) mp);
 }
@@ -115,12 +115,12 @@ vl_api_udp_encap_add_t_handler (vl_api_udp_encap_add_t * mp, vlib_main_t * vm)
 {
   vl_api_udp_encap_add_reply_t *rmp;
   ip46_address_t src_ip, dst_ip;
-  u32 fib_index, table_id, ue_id;
+  u32 fib_index, table_id;
   fib_protocol_t fproto;
   ip46_type_t itype;
+  index_t uei;
   int rv = 0;
 
-  ue_id = ntohl (mp->udp_encap.id);
   table_id = ntohl (mp->udp_encap.table_id);
 
   itype = ip_address_decode (&mp->udp_encap.src_ip, &src_ip);
@@ -134,14 +134,20 @@ vl_api_udp_encap_add_t_handler (vl_api_udp_encap_add_t * mp, vlib_main_t * vm)
       goto done;
     }
 
-  udp_encap_add_and_lock (ue_id, fproto, fib_index,
-                         &src_ip, &dst_ip,
-                         ntohs (mp->udp_encap.src_port),
-                         ntohs (mp->udp_encap.dst_port),
-                         UDP_ENCAP_FIXUP_NONE);
+  uei = udp_encap_add_and_lock (fproto, fib_index,
+                               &src_ip, &dst_ip,
+                               ntohs (mp->udp_encap.src_port),
+                               ntohs (mp->udp_encap.dst_port),
+                               UDP_ENCAP_FIXUP_NONE);
 
 done:
-  REPLY_MACRO (VL_API_UDP_ENCAP_ADD_REPLY);
+  /* *INDENT-OFF* */
+  REPLY_MACRO2 (VL_API_UDP_ENCAP_ADD_REPLY,
+  ({
+    rmp->id = ntohl (uei);
+  }));
+  /* *INDENT-ON* */
+
 }
 
 static void
index 914680f..072bc79 100644 (file)
  */
 dpo_type_t udp_encap_dpo_types[FIB_PROTOCOL_MAX];
 
-/**
- * Hash DB to map from client ID to VPP index.
- */
-uword *udp_encap_db;
-
 /**
  * Pool of encaps
  */
@@ -36,23 +31,16 @@ udp_encap_t *udp_encap_pool;
 /**
  * Stats for each UDP encap object
  */
-vlib_combined_counter_main_t udp_encap_counters;
-
-static udp_encap_t *
-udp_encap_get_w_id (u32 id)
-{
-  udp_encap_t *ue = NULL;
-  index_t uei;
-
-  uei = udp_encap_find (id);
-
-  if (INDEX_INVALID != uei)
-    {
-      ue = udp_encap_get (uei);
-    }
-
-  return (ue);
-}
+vlib_combined_counter_main_t udp_encap_counters = {
+  /**
+   * The counter collection's name.
+   */
+  .name = "udp-encap",
+  /**
+   * Name in stat segment directory
+   */
+  .stat_segment_name = "/net/udp-encap",
+};
 
 static void
 udp_encap_restack (udp_encap_t * ue)
@@ -64,8 +52,7 @@ udp_encap_restack (udp_encap_t * ue)
 }
 
 index_t
-udp_encap_add_and_lock (u32 id,
-                       fib_protocol_t proto,
+udp_encap_add_and_lock (fib_protocol_t proto,
                        index_t fib_index,
                        const ip46_address_t * src_ip,
                        const ip46_address_t * dst_ip,
@@ -73,102 +60,80 @@ udp_encap_add_and_lock (u32 id,
                        u16 dst_port, udp_encap_fixup_flags_t flags)
 {
   udp_encap_t *ue;
+  u8 pfx_len = 0;
   index_t uei;
 
-  uei = udp_encap_find (id);
+  pool_get_aligned (udp_encap_pool, ue, CLIB_CACHE_LINE_BYTES);
+  uei = ue - udp_encap_pool;
 
-  if (INDEX_INVALID == uei)
-    {
-      u8 pfx_len = 0;
+  vlib_validate_combined_counter (&(udp_encap_counters), uei);
+  vlib_zero_combined_counter (&(udp_encap_counters), uei);
 
-      pool_get_aligned (udp_encap_pool, ue, CLIB_CACHE_LINE_BYTES);
-      uei = ue - udp_encap_pool;
+  fib_node_init (&ue->ue_fib_node, FIB_NODE_TYPE_UDP_ENCAP);
+  fib_node_lock (&ue->ue_fib_node);
+  ue->ue_fib_index = fib_index;
+  ue->ue_flags = flags;
+  ue->ue_ip_proto = proto;
 
-      vlib_validate_combined_counter (&(udp_encap_counters), uei);
-      vlib_zero_combined_counter (&(udp_encap_counters), uei);
+  switch (proto)
+    {
+    case FIB_PROTOCOL_IP4:
+      pfx_len = 32;
+      ue->ue_hdrs.ip4.ue_ip4.ip_version_and_header_length = 0x45;
+      ue->ue_hdrs.ip4.ue_ip4.ttl = 254;
+      ue->ue_hdrs.ip4.ue_ip4.protocol = IP_PROTOCOL_UDP;
+      ue->ue_hdrs.ip4.ue_ip4.src_address.as_u32 = src_ip->ip4.as_u32;
+      ue->ue_hdrs.ip4.ue_ip4.dst_address.as_u32 = dst_ip->ip4.as_u32;
+      ue->ue_hdrs.ip4.ue_ip4.checksum =
+       ip4_header_checksum (&ue->ue_hdrs.ip4.ue_ip4);
+      ue->ue_hdrs.ip4.ue_udp.src_port = clib_host_to_net_u16 (src_port);
+      ue->ue_hdrs.ip4.ue_udp.dst_port = clib_host_to_net_u16 (dst_port);
 
-      hash_set (udp_encap_db, id, uei);
+      break;
+    case FIB_PROTOCOL_IP6:
+      pfx_len = 128;
+      ue->ue_hdrs.ip6.ue_ip6.ip_version_traffic_class_and_flow_label =
+       clib_host_to_net_u32 (6 << 28);
+      ue->ue_hdrs.ip6.ue_ip6.hop_limit = 255;
+      ue->ue_hdrs.ip6.ue_ip6.protocol = IP_PROTOCOL_UDP;
+      ue->ue_hdrs.ip6.ue_ip6.src_address.as_u64[0] = src_ip->ip6.as_u64[0];
+      ue->ue_hdrs.ip6.ue_ip6.src_address.as_u64[1] = src_ip->ip6.as_u64[1];
+      ue->ue_hdrs.ip6.ue_ip6.dst_address.as_u64[0] = dst_ip->ip6.as_u64[0];
+      ue->ue_hdrs.ip6.ue_ip6.dst_address.as_u64[1] = dst_ip->ip6.as_u64[1];
+      ue->ue_hdrs.ip6.ue_udp.src_port = clib_host_to_net_u16 (src_port);
+      ue->ue_hdrs.ip6.ue_udp.dst_port = clib_host_to_net_u16 (dst_port);
 
-      fib_node_init (&ue->ue_fib_node, FIB_NODE_TYPE_UDP_ENCAP);
-      fib_node_lock (&ue->ue_fib_node);
-      ue->ue_fib_index = fib_index;
-      ue->ue_flags = flags;
-      ue->ue_id = id;
-      ue->ue_ip_proto = proto;
+      break;
+    default:
+      ASSERT (0);
+    }
 
-      switch (proto)
-       {
-       case FIB_PROTOCOL_IP4:
-         pfx_len = 32;
-         ue->ue_hdrs.ip4.ue_ip4.ip_version_and_header_length = 0x45;
-         ue->ue_hdrs.ip4.ue_ip4.ttl = 254;
-         ue->ue_hdrs.ip4.ue_ip4.protocol = IP_PROTOCOL_UDP;
-         ue->ue_hdrs.ip4.ue_ip4.src_address.as_u32 = src_ip->ip4.as_u32;
-         ue->ue_hdrs.ip4.ue_ip4.dst_address.as_u32 = dst_ip->ip4.as_u32;
-         ue->ue_hdrs.ip4.ue_ip4.checksum =
-           ip4_header_checksum (&ue->ue_hdrs.ip4.ue_ip4);
-         ue->ue_hdrs.ip4.ue_udp.src_port = clib_host_to_net_u16 (src_port);
-         ue->ue_hdrs.ip4.ue_udp.dst_port = clib_host_to_net_u16 (dst_port);
-
-         break;
-       case FIB_PROTOCOL_IP6:
-         pfx_len = 128;
-         ue->ue_hdrs.ip6.ue_ip6.ip_version_traffic_class_and_flow_label =
-           clib_host_to_net_u32 (6 << 28);
-         ue->ue_hdrs.ip6.ue_ip6.hop_limit = 255;
-         ue->ue_hdrs.ip6.ue_ip6.protocol = IP_PROTOCOL_UDP;
-         ue->ue_hdrs.ip6.ue_ip6.src_address.as_u64[0] =
-           src_ip->ip6.as_u64[0];
-         ue->ue_hdrs.ip6.ue_ip6.src_address.as_u64[1] =
-           src_ip->ip6.as_u64[1];
-         ue->ue_hdrs.ip6.ue_ip6.dst_address.as_u64[0] =
-           dst_ip->ip6.as_u64[0];
-         ue->ue_hdrs.ip6.ue_ip6.dst_address.as_u64[1] =
-           dst_ip->ip6.as_u64[1];
-         ue->ue_hdrs.ip6.ue_udp.src_port = clib_host_to_net_u16 (src_port);
-         ue->ue_hdrs.ip6.ue_udp.dst_port = clib_host_to_net_u16 (dst_port);
-
-         break;
-       default:
-         ASSERT (0);
-       }
+  /*
+   * track the destination address
+   */
+  fib_prefix_t dst_pfx = {
+    .fp_proto = proto,
+    .fp_len = pfx_len,
+    .fp_addr = *dst_ip,
+  };
+
+  ue->ue_fib_entry_index =
+    fib_table_entry_special_add (fib_index,
+                                &dst_pfx,
+                                FIB_SOURCE_RR, FIB_ENTRY_FLAG_NONE);
+  ue->ue_fib_sibling =
+    fib_entry_child_add (ue->ue_fib_entry_index,
+                        FIB_NODE_TYPE_UDP_ENCAP, uei);
+
+  udp_encap_restack (ue);
 
-      /*
-       * track the destination address
-       */
-      fib_prefix_t dst_pfx = {
-       .fp_proto = proto,
-       .fp_len = pfx_len,
-       .fp_addr = *dst_ip,
-      };
-
-      ue->ue_fib_entry_index =
-       fib_table_entry_special_add (fib_index,
-                                    &dst_pfx,
-                                    FIB_SOURCE_RR, FIB_ENTRY_FLAG_NONE);
-      ue->ue_fib_sibling =
-       fib_entry_child_add (ue->ue_fib_entry_index,
-                            FIB_NODE_TYPE_UDP_ENCAP, uei);
-
-      udp_encap_restack (ue);
-    }
-  else
-    {
-      /*
-       * existing entry. updates not supported yet
-       */
-      uei = INDEX_INVALID;
-    }
   return (uei);
 }
 
 void
-udp_encap_contribute_forwarding (u32 id, dpo_proto_t proto, dpo_id_t * dpo)
+udp_encap_contribute_forwarding (index_t uei, dpo_proto_t proto,
+                                dpo_id_t * dpo)
 {
-  index_t uei;
-
-  uei = udp_encap_find (id);
-
   if (INDEX_INVALID == uei)
     {
       dpo_copy (dpo, drop_dpo_get (proto));
@@ -183,25 +148,12 @@ udp_encap_contribute_forwarding (u32 id, dpo_proto_t proto, dpo_id_t * dpo)
     }
 }
 
-index_t
-udp_encap_find (u32 id)
-{
-  uword *p;
-
-  p = hash_get (udp_encap_db, id);
-
-  if (NULL != p)
-    return p[0];
-
-  return INDEX_INVALID;
-}
-
 void
-udp_encap_lock (u32 id)
+udp_encap_lock (index_t uei)
 {
   udp_encap_t *ue;
 
-  ue = udp_encap_get_w_id (id);
+  ue = udp_encap_get (uei);
 
   if (NULL != ue)
     {
@@ -210,7 +162,7 @@ udp_encap_lock (u32 id)
 }
 
 void
-udp_encap_unlock_w_index (index_t uei)
+udp_encap_unlock (index_t uei)
 {
   udp_encap_t *ue;
 
@@ -227,19 +179,6 @@ udp_encap_unlock_w_index (index_t uei)
     }
 }
 
-void
-udp_encap_unlock (u32 id)
-{
-  udp_encap_t *ue;
-
-  ue = udp_encap_get_w_id (id);
-
-  if (NULL != ue)
-    {
-      fib_node_unlock (&ue->ue_fib_node);
-    }
-}
-
 static void
 udp_encap_dpo_lock (dpo_id_t * dpo)
 {
@@ -272,8 +211,7 @@ format_udp_encap_i (u8 * s, va_list * args)
   ue = udp_encap_get (uei);
 
   // FIXME
-  s = format (s, "udp-ecap:[%d]: id:%d ip-fib-index:%d ",
-             uei, ue->ue_id, ue->ue_fib_index);
+  s = format (s, "udp-ecap:[%d]: ip-fib-index:%d ", uei, ue->ue_fib_index);
   if (FIB_PROTOCOL_IP4 == ue->ue_ip_proto)
     {
       s = format (s, "ip:[src:%U, dst:%U] udp:[src:%d, dst:%d]",
@@ -331,16 +269,8 @@ format_udp_encap_dpo (u8 * s, va_list * args)
 u8 *
 format_udp_encap (u8 * s, va_list * args)
 {
-  u32 id = va_arg (*args, u32);
+  index_t uei = va_arg (*args, u32);
   u32 details = va_arg (*args, u32);
-  index_t uei;
-
-  uei = udp_encap_find (id);
-
-  if (INDEX_INVALID == uei)
-    {
-      return (format (s, "Invalid udp-encap ID: %d", id));
-    }
 
   return (format (s, "%U", format_udp_encap_i, uei, 0, details));
 }
@@ -391,7 +321,6 @@ udp_encap_fib_last_lock_gone (fib_node_t * node)
      * reset the stacked DPO to unlock it
      */
   dpo_reset (&ue->ue_dpo);
-  hash_unset (udp_encap_db, ue->ue_id);
 
   fib_entry_child_remove (ue->ue_fib_entry_index, ue->ue_fib_sibling);
   fib_table_entry_delete_index (ue->ue_fib_entry_index, FIB_SOURCE_RR);
@@ -473,8 +402,6 @@ const static dpo_vft_t udp_encap_dpo_vft = {
 clib_error_t *
 udp_encap_init (vlib_main_t * vm)
 {
-  udp_encap_db = hash_create (0, sizeof (index_t));
-
   fib_node_register_type (FIB_NODE_TYPE_UDP_ENCAP, &udp_encap_fib_vft);
 
   udp_encap_dpo_types[FIB_PROTOCOL_IP4] =
@@ -494,10 +421,10 @@ udp_encap_cli (vlib_main_t * vm,
   unformat_input_t _line_input, *line_input = &_line_input;
   clib_error_t *error = NULL;
   ip46_address_t src_ip, dst_ip;
-  u32 table_id, ue_id;
-  u32 src_port, dst_port;
+  u32 table_id, src_port, dst_port;
   udp_encap_fixup_flags_t flags;
   fib_protocol_t fproto;
+  index_t uei;
   u8 is_del;
 
   is_del = 0;
@@ -505,7 +432,7 @@ udp_encap_cli (vlib_main_t * vm,
   flags = UDP_ENCAP_FIXUP_NONE;
   fproto = FIB_PROTOCOL_MAX;
   dst_port = 0;
-  ue_id = ~0;
+  uei = ~0;
 
   /* Get a line of input. */
   if (!unformat_user (main_input, unformat_line_input, line_input))
@@ -513,7 +440,7 @@ udp_encap_cli (vlib_main_t * vm,
 
   while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
     {
-      if (unformat (line_input, "id %d", &ue_id))
+      if (unformat (line_input, "index %d", &uei))
        ;
       else if (unformat (line_input, "add"))
        is_del = 0;
@@ -542,13 +469,6 @@ udp_encap_cli (vlib_main_t * vm,
        }
     }
 
-  if (~0 == ue_id)
-    {
-      error =
-       clib_error_return (0, "An ID for the UDP encap instance is required");
-      goto done;
-    }
-
   if (!is_del && fproto != FIB_PROTOCOL_MAX)
     {
       u32 fib_index;
@@ -562,28 +482,24 @@ udp_encap_cli (vlib_main_t * vm,
          goto done;
        }
 
-      uei = udp_encap_add_and_lock (ue_id, fproto, fib_index,
+      uei = udp_encap_add_and_lock (fproto, fib_index,
                                    &src_ip, &dst_ip,
                                    src_port, dst_port, flags);
 
+      vlib_cli_output (vm, "udp-encap: %d\n", uei);
+    }
+  else if (is_del)
+    {
       if (INDEX_INVALID == uei)
        {
-         error =
-           clib_error_return (0, "update to existing encap not supported %d",
-                              ue_id);
+         error = clib_error_return (0, "specify udp-encap object index");
          goto done;
        }
-    }
-  else if (is_del)
-    {
-      udp_encap_unlock (ue_id);
+      udp_encap_unlock (uei);
     }
   else
     {
-      error =
-       clib_error_return (0,
-                          "Some IP addresses would be usefull, don't you think?",
-                          ue_id);
+      error = clib_error_return (0, "specify some IP addresses");
     }
 
 done:
@@ -609,34 +525,32 @@ clib_error_t *
 udp_encap_show (vlib_main_t * vm,
                unformat_input_t * input, vlib_cli_command_t * cmd)
 {
-  u32 ue_id;
+  index_t uei;
 
-  ue_id = ~0;
+  uei = INDEX_INVALID;
 
   /* Get a line of input. */
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {
-      if (unformat (input, "%d", &ue_id))
+      if (unformat (input, "%d", &uei))
        ;
       else
        return clib_error_return (0, "unknown input `%U'",
                                  format_unformat_error, input);
     }
 
-  if (~0 == ue_id)
+  if (INDEX_INVALID == uei)
     {
-      udp_encap_t *ue;
-
       /* *INDENT-OFF* */
-      pool_foreach(ue, udp_encap_pool,
+      pool_foreach_index(uei, udp_encap_pool,
       ({
-        vlib_cli_output(vm, "%U", format_udp_encap, ue->ue_id, 0);
+        vlib_cli_output(vm, "%U", format_udp_encap, uei, 0);
       }));
       /* *INDENT-ON* */
     }
   else
     {
-      vlib_cli_output (vm, "%U", format_udp_encap, ue_id, 1);
+      vlib_cli_output (vm, "%U", format_udp_encap, uei, 1);
     }
 
   return NULL;
index e2d6527..ac8e88b 100644 (file)
@@ -92,12 +92,6 @@ typedef struct udp_encap_t_
    */
   fib_node_t ue_fib_node;
 
-  /**
-   * The ID given by the user/client.
-   * This ID is used by the client for modifications.
-   */
-  u32 ue_id;
-
   /**
    * Tracking information for the IP destination
    */
@@ -110,8 +104,7 @@ typedef struct udp_encap_t_
   index_t ue_fib_index;
 } udp_encap_t;
 
-extern index_t udp_encap_add_and_lock (u32 id,
-                                      fib_protocol_t proto,
+extern index_t udp_encap_add_and_lock (fib_protocol_t proto,
                                       index_t fib_index,
                                       const ip46_address_t * src_ip,
                                       const ip46_address_t * dst_ip,
@@ -119,12 +112,10 @@ extern index_t udp_encap_add_and_lock (u32 id,
                                       u16 dst_port,
                                       udp_encap_fixup_flags_t flags);
 
-extern index_t udp_encap_find (u32 id);
-extern void udp_encap_lock (u32 id);
-extern void udp_encap_unlock (u32 id);
+extern void udp_encap_lock (index_t uei);
+extern void udp_encap_unlock (index_t uei);
 extern u8 *format_udp_encap (u8 * s, va_list * args);
-extern void udp_encap_unlock_w_index (index_t uei);
-extern void udp_encap_contribute_forwarding (u32 id,
+extern void udp_encap_contribute_forwarding (index_t uei,
                                             dpo_proto_t proto,
                                             dpo_id_t * dpo);
 
index 5eea25e..25b8c18 100644 (file)
@@ -2154,11 +2154,9 @@ udp_encap_stats_walk_cb (index_t uei, void *arg)
   vl_api_udp_encap_counter_t *stat;
   udp_encap_t *ue;
 
-  ue = udp_encap_get (uei);
   vec_add2 (ctx->stats, stat, 1);
 
-  stat->id = ue->ue_id;
-  udp_encap_get_stats (ue->ue_id, &stat->packets, &stat->bytes);
+  udp_encap_get_stats (uei, &stat->packets, &stat->bytes);
 
   return (WALK_CONTINUE);
 }
index 9a1967c..b719f0c 100644 (file)
@@ -666,7 +666,7 @@ class TestBier(VppTestCase):
                                             labels=[VppMplsLabel(2001)])])
         ip_route.add_vpp_config()
 
-        udp_encap = VppUdpEncap(self, 4,
+        udp_encap = VppUdpEncap(self,
                                 self.pg0.local_ip4,
                                 nh1,
                                 330, 8138)
@@ -677,7 +677,7 @@ class TestBier(VppTestCase):
             [VppRoutePath("0.0.0.0",
                           0xFFFFFFFF,
                           is_udp_encap=1,
-                          next_hop_id=4)])
+                          next_hop_id=udp_encap.id)])
         bier_route.add_vpp_config()
 
         #
@@ -727,7 +727,7 @@ class TestBier(VppTestCase):
         self.assertEqual(rx[0][IP].dst, nh1)
         self.assertEqual(rx[0][UDP].sport, 330)
         self.assertEqual(rx[0][UDP].dport, 8138)
-        self.assertEqual(rx[0][BIFT].bsl, 2)
+        self.assertEqual(rx[0][BIFT].bsl, BIERLength.BIER_LEN_256)
         self.assertEqual(rx[0][BIFT].sd, 1)
         self.assertEqual(rx[0][BIFT].set, 0)
         self.assertEqual(rx[0][BIFT].ttl, 64)
index b0c6ee9..e04d7be 100644 (file)
@@ -87,21 +87,21 @@ class TestUdpEncap(VppTestCase):
         # construct a UDP encap object through each of the peers
         # v4 through the first two peears, v6 through the second.
         #
-        udp_encap_0 = VppUdpEncap(self, 0,
+        udp_encap_0 = VppUdpEncap(self,
                                   self.pg0.local_ip4,
                                   self.pg0.remote_ip4,
                                   330, 440)
-        udp_encap_1 = VppUdpEncap(self, 1,
+        udp_encap_1 = VppUdpEncap(self,
                                   self.pg1.local_ip4,
                                   self.pg1.remote_ip4,
                                   331, 441,
                                   table_id=1)
-        udp_encap_2 = VppUdpEncap(self, 2,
+        udp_encap_2 = VppUdpEncap(self,
                                   self.pg2.local_ip6,
                                   self.pg2.remote_ip6,
                                   332, 442,
                                   table_id=2)
-        udp_encap_3 = VppUdpEncap(self, 3,
+        udp_encap_3 = VppUdpEncap(self,
                                   self.pg3.local_ip6,
                                   self.pg3.remote_ip6,
                                   333, 443,
@@ -125,23 +125,23 @@ class TestUdpEncap(VppTestCase):
                                [VppRoutePath("0.0.0.0",
                                              0xFFFFFFFF,
                                              is_udp_encap=1,
-                                             next_hop_id=0)])
+                                             next_hop_id=udp_encap_0.id)])
         route_4o6 = VppIpRoute(self, "1.1.2.1", 32,
                                [VppRoutePath("0.0.0.0",
                                              0xFFFFFFFF,
                                              is_udp_encap=1,
-                                             next_hop_id=2)])
+                                             next_hop_id=udp_encap_2.id)])
         route_6o4 = VppIpRoute(self, "2001::1", 128,
                                [VppRoutePath("0.0.0.0",
                                              0xFFFFFFFF,
                                              is_udp_encap=1,
-                                             next_hop_id=1)],
+                                             next_hop_id=udp_encap_1.id)],
                                is_ip6=1)
         route_6o6 = VppIpRoute(self, "2001::3", 128,
                                [VppRoutePath("0.0.0.0",
                                              0xFFFFFFFF,
                                              is_udp_encap=1,
-                                             next_hop_id=3)],
+                                             next_hop_id=udp_encap_3.id)],
                                is_ip6=1)
         route_4o4.add_vpp_config()
         route_4o6.add_vpp_config()
@@ -161,6 +161,7 @@ class TestUdpEncap(VppTestCase):
             self.validate_outer4(p, udp_encap_0)
             p = IP(p["UDP"].payload.load)
             self.validate_inner4(p, p_4o4)
+        self.assertEqual(udp_encap_0.get_stats()['packets'], 65)
 
         #
         # 4o6 encap
@@ -175,6 +176,7 @@ class TestUdpEncap(VppTestCase):
             self.validate_outer6(p, udp_encap_2)
             p = IP(p["UDP"].payload.load)
             self.validate_inner4(p, p_4o6)
+        self.assertEqual(udp_encap_2.get_stats()['packets'], 65)
 
         #
         # 6o4 encap
@@ -189,6 +191,7 @@ class TestUdpEncap(VppTestCase):
             self.validate_outer4(p, udp_encap_1)
             p = IPv6(p["UDP"].payload.load)
             self.validate_inner6(p, p_6o4)
+        self.assertEqual(udp_encap_1.get_stats()['packets'], 65)
 
         #
         # 6o6 encap
@@ -203,6 +206,7 @@ class TestUdpEncap(VppTestCase):
             self.validate_outer6(p, udp_encap_3)
             p = IPv6(p["UDP"].payload.load)
             self.validate_inner6(p, p_6o6)
+        self.assertEqual(udp_encap_3.get_stats()['packets'], 65)
 
         #
         # A route with an output label
@@ -226,6 +230,7 @@ class TestUdpEncap(VppTestCase):
             self.validate_outer4(p, udp_encap_1)
             p = MPLS(p["UDP"].payload.load)
             self.validate_inner4(p, p_4omo4, ttl=63)
+        self.assertEqual(udp_encap_1.get_stats()['packets'], 130)
 
 
 class TestUDP(VppTestCase):
index e926c46..92173ef 100644 (file)
@@ -1150,14 +1150,12 @@ class VppPapiProvider(object):
         )
 
     def udp_encap_add(self,
-                      id,
                       src_ip,
                       dst_ip,
                       src_port,
                       dst_port,
                       table_id=0):
         """ Add a GRE tunnel
-        :param id: user provided ID
         :param src_ip:
         :param dst_ip:
         :param src_port:
@@ -1169,7 +1167,6 @@ class VppPapiProvider(object):
             self.papi.udp_encap_add,
             {
                 'udp_encap': {
-                    'id': id,
                     'src_ip': src_ip,
                     'dst_ip': dst_ip,
                     'src_port': src_port,
index 826378b..209115f 100644 (file)
@@ -25,14 +25,12 @@ class VppUdpEncap(VppObject):
 
     def __init__(self,
                  test,
-                 id,
                  src_ip,
                  dst_ip,
                  src_port,
                  dst_port,
                  table_id=0):
         self._test = test
-        self.id = id
         self.table_id = table_id
         self.src_ip_s = src_ip
         self.dst_ip_s = dst_ip
@@ -42,13 +40,13 @@ class VppUdpEncap(VppObject):
         self.dst_port = dst_port
 
     def add_vpp_config(self):
-        self._test.vapi.udp_encap_add(
-            self.id,
+        r = self._test.vapi.udp_encap_add(
             self.src_ip.encode(),
             self.dst_ip.encode(),
             self.src_port,
             self.dst_port,
             self.table_id)
+        self.id = r.id
         self._test.registry.register(self, self._test.logger)
 
     def remove_vpp_config(self):
@@ -62,3 +60,7 @@ class VppUdpEncap(VppObject):
 
     def object_id(self):
         return ("udp-encap-%d" % self.id)
+
+    def get_stats(self):
+        c = self._test.statistics.get_counter("/net/udp-encap")
+        return c[0][self.id]