diff options
-rw-r--r-- | src/vnet/bier/bier_fmask.c | 6 | ||||
-rw-r--r-- | src/vnet/bier/bier_fmask_db.h | 2 | ||||
-rw-r--r-- | src/vnet/bier/bier_output.c | 6 | ||||
-rw-r--r-- | src/vnet/fib/fib_path.c | 2 | ||||
-rw-r--r-- | src/vnet/udp/udp.api | 20 | ||||
-rw-r--r-- | src/vnet/udp/udp_api.c | 24 | ||||
-rw-r--r-- | src/vnet/udp/udp_encap.c | 276 | ||||
-rw-r--r-- | src/vnet/udp/udp_encap.h | 17 | ||||
-rw-r--r-- | src/vpp/stats/stats.c | 4 | ||||
-rw-r--r-- | test/test_bier.py | 6 | ||||
-rw-r--r-- | test/test_udp.py | 21 | ||||
-rw-r--r-- | test/vpp_papi_provider.py | 3 | ||||
-rw-r--r-- | 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,7 +51,7 @@ 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; @@ -59,6 +59,20 @@ autoreply define udp_encap_add }; /** + * @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 * @param context - sender context, to match reply w/ request 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 @@ -24,11 +24,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 */ udp_encap_t *udp_encap_pool; @@ -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 @@ -93,12 +93,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 */ fib_node_index_t ue_fib_entry_index; @@ -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] |