From 9c0a3c423ee0b9326f600a00c1bd46fef45d4975 Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Fri, 7 Sep 2018 08:57:41 -0700 Subject: UDP-Encap: name counters for the stats segment 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 --- src/vnet/bier/bier_fmask.c | 6 +- src/vnet/bier/bier_fmask_db.h | 2 +- src/vnet/bier/bier_output.c | 6 +- src/vnet/fib/fib_path.c | 2 +- src/vnet/udp/udp.api | 20 ++- src/vnet/udp/udp_api.c | 24 ++-- src/vnet/udp/udp_encap.c | 276 +++++++++++++++--------------------------- src/vnet/udp/udp_encap.h | 17 +-- src/vpp/stats/stats.c | 4 +- test/test_bier.py | 6 +- test/test_udp.py | 21 ++-- test/vpp_papi_provider.py | 3 - test/vpp_udp_encap.py | 10 +- 13 files changed, 165 insertions(+), 232 deletions(-) diff --git a/src/vnet/bier/bier_fmask.c b/src/vnet/bier/bier_fmask.c index cb61681385d..3370d5a88e8 100644 --- a/src/vnet/bier/bier_fmask.c +++ b/src/vnet/bier/bier_fmask.c @@ -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; } diff --git a/src/vnet/bier/bier_fmask_db.h b/src/vnet/bier/bier_fmask_db.h index 36e555f8680..cf78bdae4eb 100644 --- a/src/vnet/bier/bier_fmask_db.h +++ b/src/vnet/bier/bier_fmask_db.h @@ -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; diff --git a/src/vnet/bier/bier_output.c b/src/vnet/bier/bier_output.c index 16c1d8e1543..e2cf7d62cee 100644 --- a/src/vnet/bier/bier_output.c +++ b/src/vnet/bier/bier_output.c @@ -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; } diff --git a/src/vnet/fib/fib_path.c b/src/vnet/fib/fib_path.c index 47142284202..226de2a1ddd 100644 --- a/src/vnet/fib/fib_path.c +++ b/src/vnet/fib/fib_path.c @@ -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); diff --git a/src/vnet/udp/udp.api b/src/vnet/udp/udp.api index 8788fba162d..193b577ad3b 100644 --- a/src/vnet/udp/udp.api +++ b/src/vnet/udp/udp.api @@ -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 diff --git a/src/vnet/udp/udp_api.c b/src/vnet/udp/udp_api.c index 43a39b82ef0..d00d74e27d5 100644 --- a/src/vnet/udp/udp_api.c +++ b/src/vnet/udp/udp_api.c @@ -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 diff --git a/src/vnet/udp/udp_encap.c b/src/vnet/udp/udp_encap.c index 914680f98a2..072bc79c8af 100644 --- a/src/vnet/udp/udp_encap.c +++ b/src/vnet/udp/udp_encap.c @@ -23,11 +23,6 @@ */ 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; diff --git a/src/vnet/udp/udp_encap.h b/src/vnet/udp/udp_encap.h index e2d652775bc..ac8e88b9643 100644 --- a/src/vnet/udp/udp_encap.h +++ b/src/vnet/udp/udp_encap.h @@ -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); diff --git a/src/vpp/stats/stats.c b/src/vpp/stats/stats.c index 5eea25e4464..25b8c184546 100644 --- a/src/vpp/stats/stats.c +++ b/src/vpp/stats/stats.c @@ -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); } diff --git a/test/test_bier.py b/test/test_bier.py index 9a1967cc459..b719f0cfbf6 100644 --- a/test/test_bier.py +++ b/test/test_bier.py @@ -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) diff --git a/test/test_udp.py b/test/test_udp.py index b0c6ee9c46a..e04d7beaf06 100644 --- a/test/test_udp.py +++ b/test/test_udp.py @@ -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): diff --git a/test/vpp_papi_provider.py b/test/vpp_papi_provider.py index e926c46f550..92173ef9a64 100644 --- a/test/vpp_papi_provider.py +++ b/test/vpp_papi_provider.py @@ -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, diff --git a/test/vpp_udp_encap.py b/test/vpp_udp_encap.py index 826378b4de8..209115f2c3f 100644 --- a/test/vpp_udp_encap.py +++ b/test/vpp_udp_encap.py @@ -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] -- cgit 1.2.3-korg