diff options
Diffstat (limited to 'test/validation/api')
21 files changed, 1417 insertions, 381 deletions
diff --git a/test/validation/api/atomic/atomic.c b/test/validation/api/atomic/atomic.c index 5a1fdf11b..d4329bc6b 100644 --- a/test/validation/api/atomic/atomic.c +++ b/test/validation/api/atomic/atomic.c @@ -1276,7 +1276,7 @@ static void test_atomic_functional(int test_fn(void *), void validate_fn(void)) test_atomic_init(); test_atomic_store(); - odp_cunit_thread_create(num, test_fn, NULL, 0); + odp_cunit_thread_create(num, test_fn, NULL, 0, 0); odp_cunit_thread_join(num); validate_fn(); } diff --git a/test/validation/api/barrier/barrier.c b/test/validation/api/barrier/barrier.c index 710947997..ce52fd2d7 100644 --- a/test/validation/api/barrier/barrier.c +++ b/test/validation/api/barrier/barrier.c @@ -404,7 +404,7 @@ static void barrier_test_no_barrier_functional(void) int num = global_mem->g_num_threads; barrier_test_init(); - odp_cunit_thread_create(num, no_barrier_functional_test, NULL, 0); + odp_cunit_thread_create(num, no_barrier_functional_test, NULL, 0, 0); odp_cunit_thread_join(num); } @@ -413,7 +413,7 @@ static void barrier_test_barrier_functional(void) int num = global_mem->g_num_threads; barrier_test_init(); - odp_cunit_thread_create(num, barrier_functional_test, NULL, 0); + odp_cunit_thread_create(num, barrier_functional_test, NULL, 0, 0); odp_cunit_thread_join(num); } diff --git a/test/validation/api/buffer/buffer.c b/test/validation/api/buffer/buffer.c index 19f39e1d3..c3484e14a 100644 --- a/test/validation/api/buffer/buffer.c +++ b/test/validation/api/buffer/buffer.c @@ -1,5 +1,5 @@ /* Copyright (c) 2014-2018, Linaro Limited - * Copyright (c) 2019, Nokia + * Copyright (c) 2019-2022, Nokia * Copyright (c) 2022, Marvell * All rights reserved. * @@ -7,6 +7,7 @@ */ #include <odp_api.h> +#include <odp/helper/odph_debug.h> #include "odp_cunit_common.h" #define BUF_ALIGN ODP_CACHE_LINE_SIZE @@ -491,6 +492,58 @@ static void buffer_test_pool_max_pools_max_cache(void) test_pool_max_pools(¶m); } +static void buffer_test_user_area(void) +{ + odp_pool_t pool; + odp_pool_param_t param; + uint32_t i, num; + void *addr; + void *prev = NULL; + uint32_t num_alloc = 0; + uint32_t size = 1024; + const uint32_t max_size = pool_capa.buf.max_uarea_size; + + if (max_size == 0) { + ODPH_DBG("Buffer user area not supported\n"); + return; + } + + if (size > max_size) + size = max_size; + + memcpy(¶m, &default_param, sizeof(odp_pool_param_t)); + param.buf.uarea_size = size; + + num = param.buf.num; + + odp_buffer_t buffer[num]; + + pool = odp_pool_create("test_user_area", ¶m); + CU_ASSERT_FATAL(pool != ODP_POOL_INVALID); + + for (i = 0; i < num; i++) { + buffer[i] = odp_buffer_alloc(pool); + + if (buffer[i] == ODP_BUFFER_INVALID) + break; + num_alloc++; + + addr = odp_buffer_user_area(buffer[i]); + CU_ASSERT_FATAL(addr != NULL); + CU_ASSERT(prev != addr); + + prev = addr; + memset(addr, 0, size); + } + + CU_ASSERT(i == num); + + if (num_alloc) + odp_buffer_free_multi(buffer, num_alloc); + + CU_ASSERT_FATAL(odp_pool_destroy(pool) == 0); +} + odp_testinfo_t buffer_suite[] = { ODP_TEST_INFO(buffer_test_pool_alloc_free), ODP_TEST_INFO(buffer_test_pool_alloc_free_min_cache), @@ -507,6 +560,7 @@ odp_testinfo_t buffer_suite[] = { ODP_TEST_INFO(buffer_test_pool_max_pools), ODP_TEST_INFO(buffer_test_pool_max_pools_min_cache), ODP_TEST_INFO(buffer_test_pool_max_pools_max_cache), + ODP_TEST_INFO(buffer_test_user_area), ODP_TEST_INFO_NULL, }; diff --git a/test/validation/api/classification/odp_classification_basic.c b/test/validation/api/classification/odp_classification_basic.c index 4fecba1e2..f914ea2ec 100644 --- a/test/validation/api/classification/odp_classification_basic.c +++ b/test/validation/api/classification/odp_classification_basic.c @@ -18,7 +18,10 @@ static void test_defaults(uint8_t fill) memset(&cos_param, fill, sizeof(cos_param)); odp_cls_cos_param_init(&cos_param); - CU_ASSERT_EQUAL(cos_param.num_queue, 1); + + CU_ASSERT(cos_param.action == ODP_COS_ACTION_ENQUEUE); + CU_ASSERT(cos_param.num_queue == 1); + CU_ASSERT_EQUAL(cos_param.stats_enable, false); CU_ASSERT_EQUAL(cos_param.red.enable, false); CU_ASSERT_EQUAL(cos_param.bp.enable, false); CU_ASSERT_EQUAL(cos_param.vector.enable, false); @@ -392,6 +395,49 @@ static void classification_test_pmr_composite_create(void) odp_pktio_close(pktio); } +static void classification_test_create_cos_with_hash_queues(void) +{ + odp_pool_t pool; + odp_cls_capability_t capa; + int ret; + odp_queue_param_t q_param; + odp_cls_cos_param_t cls_param; + odp_cos_t cos; + + pool = pool_create("cls_basic_pool"); + CU_ASSERT_FATAL(pool != ODP_POOL_INVALID); + + ret = odp_cls_capability(&capa); + CU_ASSERT_FATAL(ret == 0); + CU_ASSERT_FATAL(capa.hash_protocols.all_bits != 0); + + odp_queue_param_init(&q_param); + q_param.type = ODP_QUEUE_TYPE_SCHED; + odp_cls_cos_param_init(&cls_param); + cls_param.num_queue = capa.max_hash_queues; + cls_param.queue_param = q_param; + cls_param.hash_proto.all_bits = capa.hash_protocols.all_bits; + cls_param.pool = pool; + + cos = odp_cls_cos_create(NULL, &cls_param); + CU_ASSERT_FATAL(cos != ODP_COS_INVALID); + + ret = odp_cos_destroy(cos); + CU_ASSERT(ret == 0); + + odp_pool_destroy(pool); +} + +static int check_capa_cos_hashing(void) +{ + odp_cls_capability_t capa; + + if (odp_cls_capability(&capa) < 0) + return ODP_TEST_INACTIVE; + + return capa.max_hash_queues > 1 ? ODP_TEST_ACTIVE : ODP_TEST_INACTIVE; +} + odp_testinfo_t classification_suite_basic[] = { ODP_TEST_INFO(classification_test_default_values), ODP_TEST_INFO(classification_test_create_cos), @@ -403,5 +449,7 @@ odp_testinfo_t classification_suite_basic[] = { ODP_TEST_INFO(classification_test_cos_set_drop), ODP_TEST_INFO(classification_test_cos_set_pool), ODP_TEST_INFO(classification_test_pmr_composite_create), + ODP_TEST_INFO_CONDITIONAL(classification_test_create_cos_with_hash_queues, + check_capa_cos_hashing), ODP_TEST_INFO_NULL, }; diff --git a/test/validation/api/classification/odp_classification_common.c b/test/validation/api/classification/odp_classification_common.c index 8eac41a1e..4c24099a5 100644 --- a/test/validation/api/classification/odp_classification_common.c +++ b/test/validation/api/classification/odp_classification_common.c @@ -26,6 +26,7 @@ static uint8_t IPV6_DST_ADDR[ODPH_IPV6ADDR_LEN] = { }; #define ODP_GTPU_UDP_PORT 2152 +#define AH_HDR_LEN 24 odp_pktio_t create_pktio(odp_queue_type_t q_type, odp_pool_t pool, odp_bool_t cls_enable) @@ -306,6 +307,8 @@ odp_packet_t create_packet(cls_packet_info_t pkt_info) odph_ipv6hdr_t *ipv6; odph_gtphdr_t *gtpu; odph_igmphdr_t *igmp; + odph_ahhdr_t *ah; + odph_esphdr_t *esp; uint8_t *hlen = 0; uint16_t payload_len; uint32_t addr = 0; @@ -359,6 +362,14 @@ odp_packet_t create_packet(cls_packet_info_t pkt_info) next_hdr = ODPH_IPPROTO_IGMP; l4_hdr_len = ODP_IGMP_HLEN; break; + case CLS_PKT_L4_AH: + next_hdr = ODPH_IPPROTO_AH; + l4_hdr_len = AH_HDR_LEN; + break; + case CLS_PKT_L4_ESP: + next_hdr = ODPH_IPPROTO_ESP; + l4_hdr_len = ODPH_ESPHDR_LEN; + break; default: ODPH_ASSERT(0); } @@ -444,9 +455,11 @@ odp_packet_t create_packet(cls_packet_info_t pkt_info) udp = (odph_udphdr_t *)(buf + l4_offset); sctp = (odph_sctphdr_t *)(buf + l4_offset); icmp = (odph_icmphdr_t *)(buf + l4_offset); + igmp = (odph_igmphdr_t *)(buf + l4_offset); + ah = (odph_ahhdr_t *)(buf + l4_offset); + esp = (odph_esphdr_t *)(buf + l4_offset); if (pkt_info.l4_type == CLS_PKT_L4_IGMP) { - igmp = (odph_igmphdr_t *)odp_packet_l4_ptr(pkt, NULL); igmp->group = odp_cpu_to_be_32(CLS_MAGIC_VAL); igmp->type = 0x12; igmp->code = 0; @@ -496,6 +509,15 @@ odp_packet_t create_packet(cls_packet_info_t pkt_info) ODPH_ERR("odph_udp_tcp_chksum failed\n"); return ODP_PACKET_INVALID; } + } else if (pkt_info.l4_type == CLS_PKT_L4_AH) { + ah->next_header = ODPH_IPV4; + ah->ah_len = AH_HDR_LEN / 4 - 2; + ah->pad = 0; + ah->spi = 256; + ah->seq_no = 1; + } else if (pkt_info.l4_type == CLS_PKT_L4_ESP) { + esp->spi = 256; + esp->seq_no = 1; } else { tcp->src_port = odp_cpu_to_be_16(CLS_DEFAULT_SPORT); tcp->dst_port = odp_cpu_to_be_16(CLS_DEFAULT_DPORT); diff --git a/test/validation/api/classification/odp_classification_test_pmr.c b/test/validation/api/classification/odp_classification_test_pmr.c index e69f077a2..9a2e32f4b 100644 --- a/test/validation/api/classification/odp_classification_test_pmr.c +++ b/test/validation/api/classification/odp_classification_test_pmr.c @@ -1873,6 +1873,98 @@ static void classification_test_pmr_term_custom_l3(void) test_pmr_term_custom(1); } +static void test_pmr_term_ipsec_spi_ah(odp_bool_t is_ipv6) +{ + uint32_t val; + uint32_t mask; + odp_pmr_param_t pmr_param; + cls_packet_info_t pkt_info; + odp_packet_t pkt; + odph_ahhdr_t *ah; + + val = odp_cpu_to_be_32(0x11223344); + mask = odp_cpu_to_be_32(0xffffffff); + + odp_cls_pmr_param_init(&pmr_param); + pmr_param.term = ODP_PMR_IPSEC_SPI; + pmr_param.match.value = &val; + pmr_param.match.mask = &mask; + pmr_param.val_sz = sizeof(val); + + pkt_info = default_pkt_info; + pkt_info.l4_type = CLS_PKT_L4_AH; + pkt_info.ipv6 = is_ipv6; + pkt = create_packet(pkt_info); + CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID); + ah = (odph_ahhdr_t *)odp_packet_l4_ptr(pkt, NULL); + ah->spi = val; + + test_pmr(&pmr_param, pkt, MATCH); + + pkt = create_packet(pkt_info); + CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID); + ah = (odph_ahhdr_t *)odp_packet_l4_ptr(pkt, NULL); + ah->spi = val + 1; + + test_pmr(&pmr_param, pkt, NO_MATCH); +} + +static void classification_test_pmr_term_ipsec_spi_ah_ipv4(void) +{ + test_pmr_term_ipsec_spi_ah(TEST_IPV4); +} + +static void test_pmr_term_ipsec_spi_esp(odp_bool_t is_ipv6) +{ + uint32_t val; + uint32_t mask; + odp_pmr_param_t pmr_param; + cls_packet_info_t pkt_info; + odp_packet_t pkt; + odph_esphdr_t *esp; + + val = odp_cpu_to_be_32(0x11223344); + mask = odp_cpu_to_be_32(0xffffffff); + + odp_cls_pmr_param_init(&pmr_param); + pmr_param.term = ODP_PMR_IPSEC_SPI; + pmr_param.match.value = &val; + pmr_param.match.mask = &mask; + pmr_param.val_sz = sizeof(val); + + pkt_info = default_pkt_info; + pkt_info.l4_type = CLS_PKT_L4_ESP; + pkt_info.ipv6 = is_ipv6; + pkt = create_packet(pkt_info); + CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID); + esp = (odph_esphdr_t *)odp_packet_l4_ptr(pkt, NULL); + esp->spi = val; + + test_pmr(&pmr_param, pkt, MATCH); + + pkt = create_packet(pkt_info); + CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID); + esp = (odph_esphdr_t *)odp_packet_l4_ptr(pkt, NULL); + esp->spi = val + 1; + + test_pmr(&pmr_param, pkt, NO_MATCH); +} + +static void classification_test_pmr_term_ipsec_spi_esp_ipv4(void) +{ + test_pmr_term_ipsec_spi_esp(TEST_IPV4); +} + +static void classification_test_pmr_term_ipsec_spi_ah_ipv6(void) +{ + test_pmr_term_ipsec_spi_ah(TEST_IPV6); +} + +static void classification_test_pmr_term_ipsec_spi_esp_ipv6(void) +{ + test_pmr_term_ipsec_spi_esp(TEST_IPV6); +} + static int check_capa_tcp_dport(void) { return cls_capa.supported_terms.bit.tcp_dport; @@ -1968,6 +2060,11 @@ static int check_capa_custom_l3(void) return cls_capa.supported_terms.bit.custom_l3; } +static int check_capa_ipsec_spi(void) +{ + return cls_capa.supported_terms.bit.ipsec_spi; +} + static int check_capa_pmr_series(void) { uint64_t support; @@ -2088,6 +2185,14 @@ odp_testinfo_t classification_suite_pmr[] = { check_capa_custom_frame), ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_custom_l3, check_capa_custom_l3), + ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_ipsec_spi_ah_ipv4, + check_capa_ipsec_spi), + ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_ipsec_spi_esp_ipv4, + check_capa_ipsec_spi), + ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_ipsec_spi_ah_ipv6, + check_capa_ipsec_spi), + ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_ipsec_spi_esp_ipv6, + check_capa_ipsec_spi), ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_serial, check_capa_pmr_series), ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_parallel, diff --git a/test/validation/api/classification/odp_classification_testsuites.h b/test/validation/api/classification/odp_classification_testsuites.h index 592f37cd6..8fa43099d 100644 --- a/test/validation/api/classification/odp_classification_testsuites.h +++ b/test/validation/api/classification/odp_classification_testsuites.h @@ -19,6 +19,8 @@ typedef enum cls_packet_l4_info { CLS_PKT_L4_ICMP, CLS_PKT_L4_GTP, CLS_PKT_L4_IGMP, + CLS_PKT_L4_AH, + CLS_PKT_L4_ESP } cls_packet_l4_info; typedef struct cls_packet_info { diff --git a/test/validation/api/crypto/odp_crypto_test_inp.c b/test/validation/api/crypto/odp_crypto_test_inp.c index 0112bf27a..150a470ec 100644 --- a/test/validation/api/crypto/odp_crypto_test_inp.c +++ b/test/validation/api/crypto/odp_crypto_test_inp.c @@ -1342,12 +1342,11 @@ static void test_auth_hashes_in_auth_range(void) odp_auth_alg_t auth = auth_algs[n]; int num; - if (check_alg_support(ODP_CIPHER_ALG_NULL, auth) - == ODP_TEST_INACTIVE) + if (check_alg_support(ODP_CIPHER_ALG_NULL, auth) == ODP_TEST_INACTIVE) continue; num = odp_crypto_auth_capability(auth, NULL, 0); - CU_ASSERT(num > 0); + CU_ASSERT_FATAL(num > 0); odp_crypto_auth_capability_t capa[num]; diff --git a/test/validation/api/crypto/test_vectors.h b/test/validation/api/crypto/test_vectors.h index c07be12f7..b9a9c2f06 100644 --- a/test/validation/api/crypto/test_vectors.h +++ b/test/validation/api/crypto/test_vectors.h @@ -2493,7 +2493,7 @@ static crypto_test_reference_t aes_eia2_reference[] = { */ static crypto_test_reference_t zuc_eea3_reference[] = { { - .cipher_key_length = ZUC_EIA3_KEY_LEN, + .cipher_key_length = ZUC_EEA3_KEY_LEN, .cipher_key = { 0xe5, 0xbd, 0x3e, 0xa0, 0xeb, 0x55, 0xad, 0xe8, 0x66, 0xc6, 0xac, 0x58, 0xbd, 0x54, 0x30, 0x2a}, .cipher_iv_length = ZUC_EEA3_IV_LEN, @@ -2527,7 +2527,132 @@ static crypto_test_reference_t zuc_eea3_reference[] = { 0xdf, 0x5a, 0x47, 0x3a, 0x57, 0xa4, 0xa0, 0x0d, 0x98, 0x5e, 0xba, 0xd8, 0x80, 0xd6, 0xf2, 0x38, 0x64, 0xa0, 0x7b, 0x01 } - } + }, + + /* Privately generated test data */ + { + .cipher_key_length = ZUC_EEA3_256_KEY_LEN, + .cipher_key = { 0xf7, 0xb4, 0x04, 0x5a, 0x81, 0x5c, 0x1b, 0x01, + 0x82, 0xf9, 0xf4, 0x26, 0x80, 0xd4, 0x56, 0x26, + 0xd5, 0xf7, 0x4b, 0x68, 0x48, 0x6b, 0x92, 0x6a, + 0x34, 0x1f, 0x86, 0x66, 0x60, 0x0a, 0xfc, 0x57}, + .cipher_iv_length = ZUC_EEA3_256_IV_LEN, + .cipher_iv = { 0x8e, 0x5d, 0xbc, 0x3f, 0xb9, 0xae, 0x66, 0xa3, + 0xb9, 0x5c, 0x12, 0x14, 0xdb, 0xc5, 0xbc, 0x18, + 0x48, 0x12, 0x09, 0x06, 0x25, 0x33, 0x2e, 0x12, + 0x12 }, + .length = 1024, + .is_length_in_bits = true, + .plaintext = { 0x36, 0xdb, 0x63, 0x68, 0xb5, 0x1f, 0x4e, 0x92, + 0x46, 0x1f, 0xde, 0xdb, 0xc2, 0xec, 0xfa, 0x7e, + 0x49, 0x85, 0x77, 0xaa, 0x46, 0x98, 0x30, 0x2d, + 0x3b, 0xc4, 0x11, 0x24, 0x98, 0x20, 0xa9, 0xce, + 0xfb, 0x0d, 0x36, 0xb0, 0x2c, 0x85, 0x42, 0x72, + 0xa4, 0x21, 0x4e, 0x66, 0x0d, 0x48, 0xe4, 0x57, + 0xce, 0x5b, 0x01, 0x14, 0xf3, 0x31, 0x42, 0x2e, + 0xf5, 0x53, 0x52, 0x8d, 0x73, 0xfc, 0x5c, 0x6e, + 0x09, 0x92, 0x1e, 0x35, 0x17, 0x60, 0xa8, 0xbb, + 0x81, 0xf6, 0x21, 0x8f, 0x3e, 0x05, 0xe6, 0x0c, + 0x60, 0xe7, 0x21, 0x53, 0x18, 0x63, 0x81, 0x0d, + 0xb6, 0xd4, 0x9a, 0x29, 0xd0, 0xf6, 0x97, 0xd9, + 0x89, 0xb5, 0x0e, 0xa0, 0x15, 0xb6, 0x5c, 0x97, + 0xac, 0x7d, 0x26, 0xeb, 0x83, 0x0c, 0xf7, 0xe3, + 0xf3, 0x18, 0x37, 0x0b, 0x7b, 0xb8, 0x18, 0x31, + 0x8c, 0xb2, 0x5a, 0x5c, 0xa9, 0xf1, 0x35, 0x32 }, + .ciphertext = { 0xa6, 0xe5, 0x71, 0x58, 0x5c, 0xcf, 0x5d, 0x0d, + 0x59, 0xb5, 0x51, 0xab, 0xf5, 0xfa, 0x31, 0xf9, + 0x8d, 0x4f, 0xf0, 0x3c, 0x7d, 0x61, 0x8d, 0x7a, + 0x6b, 0xcb, 0x2c, 0x79, 0xca, 0x99, 0x06, 0x6f, + 0xff, 0x5d, 0x12, 0x5f, 0x0e, 0x7a, 0x33, 0x6b, + 0x51, 0xbc, 0x58, 0x53, 0xff, 0xbd, 0x85, 0xc9, + 0xac, 0x5f, 0x33, 0xc2, 0xa2, 0xf1, 0x17, 0x7a, + 0xd9, 0x3f, 0x81, 0x82, 0x2f, 0x0a, 0xb0, 0xaf, + 0xb9, 0x19, 0x3b, 0xfa, 0xcd, 0xa4, 0x06, 0x81, + 0x2a, 0x7a, 0xbf, 0x2c, 0x07, 0xde, 0xc1, 0xa4, + 0x8c, 0x15, 0x85, 0x81, 0xa6, 0xd3, 0x73, 0x1c, + 0x29, 0x0b, 0xee, 0x3c, 0x57, 0xfa, 0x82, 0xad, + 0x6f, 0xe0, 0xa1, 0x54, 0x8d, 0xa4, 0x92, 0x29, + 0xf4, 0xfa, 0x6d, 0x01, 0xe3, 0x6c, 0xb9, 0x76, + 0x80, 0x53, 0xbb, 0x27, 0xb8, 0x18, 0x47, 0x6c, + 0xae, 0xb5, 0x44, 0x60, 0x43, 0x9d, 0xa7, 0x3f } + }, + /* Privately generated test data */ + { + .cipher_key_length = ZUC_EEA3_256_KEY_LEN, + .cipher_key = { 0x1d, 0x0f, 0x0e, 0x75, 0x86, 0xb3, 0xfc, 0x65, + 0x94, 0xbf, 0xaa, 0xa8, 0xf5, 0xd0, 0x0f, 0xe8, + 0x14, 0x7a, 0x96, 0x61, 0x15, 0x49, 0x79, 0x71, + 0x13, 0x82, 0xb4, 0xae, 0x34, 0x04, 0x75, 0x51 }, + .cipher_iv_length = ZUC_EEA3_256_IV_LEN, + .cipher_iv = { 0x98, 0xcc, 0x89, 0x9f, 0xaf, 0x6d, 0x64, 0xb6, + 0xb1, 0xe8, 0x21, 0x72, 0xee, 0xb6, 0xcc, 0xe3, + 0xcf, 0x32, 0x28, 0x21, 0x21, 0x0d, 0x1e, 0x1c, + 0x34 }, + .length = 1928, + .is_length_in_bits = true, + .plaintext = { 0xa4, 0xcb, 0x6e, 0x76, 0x99, 0xfb, 0x0c, 0xab, + 0x6d, 0x57, 0xb1, 0x69, 0xc0, 0x47, 0x80, 0x63, + 0x00, 0xe1, 0xf9, 0x51, 0x10, 0xbe, 0xc0, 0x0f, + 0x99, 0x62, 0x2d, 0x71, 0xca, 0x75, 0xa0, 0x6e, + 0x41, 0x0e, 0xe4, 0xda, 0x09, 0xf1, 0x86, 0x76, + 0x48, 0x37, 0xe0, 0x08, 0x7e, 0x60, 0x6c, 0x7f, + 0x41, 0x65, 0xd0, 0x51, 0x24, 0x91, 0x61, 0xbd, + 0xf3, 0x8e, 0x2e, 0xbd, 0x04, 0xce, 0x2b, 0x45, + 0xdc, 0x0f, 0x1f, 0xe5, 0x00, 0xa5, 0x5c, 0x48, + 0xdd, 0x3c, 0x51, 0x5b, 0x9c, 0xbd, 0xda, 0xde, + 0x22, 0xab, 0x2f, 0x46, 0x3c, 0x90, 0x03, 0x2f, + 0x1f, 0x31, 0xec, 0x23, 0xff, 0x17, 0x68, 0xdb, + 0x26, 0x87, 0xc1, 0x27, 0x2d, 0x1d, 0x6f, 0x0a, + 0x59, 0xc0, 0x65, 0xf5, 0x7d, 0x40, 0xd3, 0xa0, + 0xeb, 0x03, 0xe6, 0x27, 0x93, 0xea, 0x56, 0xb2, + 0x1b, 0x42, 0xd5, 0x1b, 0x59, 0x3d, 0xf6, 0x7f, + 0xc5, 0xb7, 0xa6, 0xf2, 0xd4, 0x16, 0xfc, 0x2d, + 0xd6, 0x61, 0x23, 0x54, 0xa1, 0xf6, 0xf4, 0x8c, + 0xf9, 0xda, 0xb3, 0x8d, 0xc4, 0x09, 0x3f, 0xe0, + 0x4b, 0x15, 0xfb, 0xa4, 0x52, 0xf1, 0x24, 0x17, + 0xa9, 0xca, 0x09, 0x7d, 0xe0, 0x05, 0xab, 0xb7, + 0x67, 0xce, 0x0b, 0x08, 0xc4, 0xff, 0x95, 0xbe, + 0xd9, 0x48, 0x4b, 0x9e, 0x52, 0x8a, 0x7e, 0x9d, + 0x9f, 0x79, 0x42, 0xf2, 0x6a, 0x66, 0x09, 0x13, + 0x30, 0x13, 0x91, 0x11, 0x18, 0x3c, 0xc8, 0x7f, + 0x0a, 0xd3, 0x88, 0xce, 0xd2, 0x1d, 0x8c, 0xab, + 0x65, 0xd7, 0x49, 0xb7, 0x62, 0xc7, 0x55, 0x01, + 0x40, 0x97, 0xf3, 0xab, 0xfd, 0xfd, 0xbe, 0x2d, + 0x10, 0x4f, 0x3e, 0x28, 0x8b, 0x06, 0xa8, 0x95, + 0xd9, 0x30, 0x64, 0xab, 0x4d, 0xf0, 0x57, 0xb2, + 0xc8 }, + .ciphertext = { 0xd0, 0xf9, 0xff, 0xce, 0x03, 0x81, 0x14, 0x9c, + 0xd5, 0xf2, 0xbf, 0xe5, 0xff, 0xc8, 0x15, 0x4a, + 0x9c, 0x06, 0x2b, 0x17, 0x99, 0xe3, 0x48, 0x70, + 0x37, 0x01, 0x5e, 0x24, 0x80, 0x9a, 0x46, 0x4e, + 0xa8, 0xc0, 0x59, 0xd7, 0x03, 0x74, 0x28, 0x91, + 0x79, 0xb4, 0xb5, 0xd6, 0x52, 0x92, 0x04, 0x77, + 0x5b, 0x4f, 0x34, 0xd1, 0xbe, 0xaa, 0x74, 0xd9, + 0x01, 0x40, 0x24, 0xc7, 0x8c, 0x62, 0x2a, 0x51, + 0x5a, 0x58, 0x0e, 0xc8, 0x70, 0x12, 0x06, 0x1c, + 0x62, 0x7f, 0xf5, 0x23, 0xcb, 0x3c, 0xc1, 0xbe, + 0x8b, 0x7f, 0x9d, 0x12, 0xb8, 0x26, 0xc8, 0xa3, + 0x77, 0x7e, 0x83, 0xda, 0x83, 0xe1, 0x9f, 0xef, + 0x33, 0x62, 0x17, 0xa7, 0x74, 0x68, 0x34, 0x5e, + 0x16, 0xcc, 0xbc, 0x6c, 0x33, 0x2f, 0x73, 0xf0, + 0xfc, 0xe5, 0x2c, 0x2d, 0xfb, 0x81, 0xbe, 0x1e, + 0x6e, 0x4f, 0xf4, 0x14, 0x37, 0x7c, 0x97, 0xac, + 0xa9, 0xac, 0x68, 0x95, 0xf3, 0x55, 0xb3, 0xfb, + 0xf6, 0x64, 0xd9, 0x1b, 0xe1, 0x54, 0x79, 0x6e, + 0xfa, 0x21, 0xa4, 0x19, 0x9f, 0xb4, 0x4b, 0xb7, + 0xef, 0x52, 0xd8, 0x44, 0x75, 0x99, 0x07, 0x6d, + 0xa9, 0xcf, 0x32, 0xc5, 0xc1, 0x31, 0x0c, 0xa8, + 0x86, 0x40, 0x75, 0xeb, 0x12, 0xcf, 0x26, 0x5c, + 0x5f, 0xa3, 0x3c, 0xb6, 0x12, 0x45, 0xf3, 0x0a, + 0x38, 0x09, 0xa8, 0x36, 0x32, 0x4a, 0x2f, 0xad, + 0x50, 0x11, 0x38, 0xba, 0x8f, 0xdd, 0xd1, 0x58, + 0xd7, 0x3d, 0x3a, 0x40, 0x7c, 0x3f, 0xa7, 0x98, + 0xf3, 0x12, 0x7f, 0x9f, 0x89, 0xcf, 0x48, 0x58, + 0x01, 0xeb, 0x98, 0x7c, 0x59, 0x11, 0x9f, 0x57, + 0x74, 0x5f, 0x70, 0x72, 0x74, 0xa4, 0x82, 0x3c, + 0x36, 0xe6, 0x31, 0x9e, 0xba, 0x7b, 0x53, 0xfc, + 0x56 } + }, }; static crypto_test_reference_t zuc_eia3_reference[] = { @@ -2562,7 +2687,143 @@ static crypto_test_reference_t zuc_eia3_reference[] = { 0x00, 0x00, 0x00, 0x00 }, .digest_length = ZUC_EIA3_DIGEST_LEN, .digest = { 0x24, 0xa8, 0x42, 0xb3 } - } + }, + /* Privately generated test data */ + { + .auth_key_length = ZUC_EIA3_256_KEY_LEN, + .auth_key = { 0xe3, 0x8e, 0xaf, 0x08, 0xde, 0x8c, 0x08, 0x41, + 0x7f, 0x2b, 0x97, 0x20, 0x10, 0x87, 0xc7, 0xf7, + 0xbe, 0x3c, 0xd2, 0x68, 0x80, 0x10, 0x1e, 0x71, + 0xfd, 0xb2, 0xbb, 0xad, 0x25, 0x0f, 0x06, 0x08 }, + .auth_iv_length = ZUC_EIA3_256_IV_LEN, + .auth_iv = { 0xf5, 0x8d, 0x08, 0x26, 0x94, 0x14, 0xc7, 0x4d, + 0xf5, 0x7c, 0x9c, 0xaa, 0x45, 0x53, 0xfd, 0x85, + 0x23, 0x0b, 0x00, 0x0e, 0x26, 0x2b, 0x0f, 0x01, + 0x26 }, + .length = 360, + .is_length_in_bits = true, + .plaintext = { 0x08, 0xba, 0x8d, 0xf1, 0xf8, 0x62, 0xa6, 0xaf, + 0xf9, 0x03, 0x88, 0x9c, 0xa3, 0x68, 0x6b, 0x87, + 0xb6, 0x92, 0xd1, 0x47, 0x3e, 0x54, 0xaf, 0x46, + 0x07, 0x8f, 0x89, 0xea, 0x26, 0x9d, 0x0e, 0x2f, + 0x57, 0x9b, 0x20, 0x4f, 0xfe, 0xc7, 0xfe, 0xf7, + 0xca, 0x86, 0x93, 0x6d, 0xee }, + .ciphertext = { 0x08, 0xba, 0x8d, 0xf1, 0xf8, 0x62, 0xa6, 0xaf, + 0xf9, 0x03, 0x88, 0x9c, 0xa3, 0x68, 0x6b, 0x87, + 0xb6, 0x92, 0xd1, 0x47, 0x3e, 0x54, 0xaf, 0x46, + 0x07, 0x8f, 0x89, 0xea, 0x26, 0x9d, 0x0e, 0x2f, + 0x57, 0x9b, 0x20, 0x4f, 0xfe, 0xc7, 0xfe, 0xf7, + 0xca, 0x86, 0x93, 0x6d, 0xee }, + .digest_length = ZUC_EIA3_DIGEST_LEN, + .digest = {0x58, 0x19, 0xab, 0xa5} + }, + /* Privately generated test data */ + { + .auth_key_length = ZUC_EIA3_256_KEY_LEN, + .auth_key = { 0x6a, 0x7e, 0x4c, 0x7e, 0x51, 0x25, 0xb3, 0x48, + 0x84, 0x53, 0x3a, 0x94, 0xfb, 0x31, 0x99, 0x90, + 0x32, 0x57, 0x44, 0xee, 0x9b, 0xbc, 0xe9, 0xe5, + 0x25, 0xcf, 0x08, 0xf5, 0xe9, 0xe2, 0x5e, 0x53 }, + .auth_iv_length = ZUC_EIA3_256_IV_LEN, + .auth_iv = { 0x60, 0xaa, 0xd2, 0xb2, 0xd0, 0x85, 0xfa, 0x54, + 0xd8, 0x35, 0xe8, 0xd4, 0x66, 0x82, 0x64, 0x98, + 0xd9, 0x2a, 0x08, 0x1d, 0x35, 0x19, 0x17, 0x01, + 0x1A }, + .length = 2872, + .is_length_in_bits = true, + .plaintext = { 0xc6, 0x69, 0x73, 0x51, 0xff, 0x4a, 0xec, 0x29, + 0xcd, 0xba, 0xab, 0xf2, 0xfb, 0xe3, 0x46, 0x7c, + 0xc2, 0x54, 0xf8, 0x1b, 0xe8, 0xe7, 0x8d, 0x76, + 0x5a, 0x2e, 0x63, 0x33, 0x9f, 0xc9, 0x9a, 0x66, + 0x32, 0x0d, 0xb7, 0x31, 0x58, 0xa3, 0x5a, 0x25, + 0x5d, 0x05, 0x17, 0x58, 0xe9, 0x5e, 0xd4, 0xab, + 0xb2, 0xcd, 0xc6, 0x9b, 0xb4, 0x54, 0x11, 0x0e, + 0x82, 0x74, 0x41, 0x21, 0x3d, 0xdc, 0x87, 0x70, + 0xe9, 0x3e, 0xa1, 0x41, 0xe1, 0xfc, 0x67, 0x3e, + 0x01, 0x7e, 0x97, 0xea, 0xdc, 0x6b, 0x96, 0x8f, + 0x38, 0x5c, 0x2a, 0xec, 0xb0, 0x3b, 0xfb, 0x32, + 0xaf, 0x3c, 0x54, 0xec, 0x18, 0xdb, 0x5c, 0x02, + 0x1a, 0xfe, 0x43, 0xfb, 0xfa, 0xaa, 0x3a, 0xfb, + 0x29, 0xd1, 0xe6, 0x05, 0x3c, 0x7c, 0x94, 0x75, + 0xd8, 0xbe, 0x61, 0x89, 0xf9, 0x5c, 0xbb, 0xa8, + 0x99, 0x0f, 0x95, 0xb1, 0xeb, 0xf1, 0xb3, 0x05, + 0xef, 0xf7, 0x00, 0xe9, 0xa1, 0x3a, 0xe5, 0xca, + 0x0b, 0xcb, 0xd0, 0x48, 0x47, 0x64, 0xbd, 0x1f, + 0x23, 0x1e, 0xa8, 0x1c, 0x7b, 0x64, 0xc5, 0x14, + 0x73, 0x5a, 0xc5, 0x5e, 0x4b, 0x79, 0x63, 0x3b, + 0x70, 0x64, 0x24, 0x11, 0x9e, 0x09, 0xdc, 0xaa, + 0xd4, 0xac, 0xf2, 0x1b, 0x10, 0xaf, 0x3b, 0x33, + 0xcd, 0xe3, 0x50, 0x48, 0x47, 0x15, 0x5c, 0xbb, + 0x6f, 0x22, 0x19, 0xba, 0x9b, 0x7d, 0xf5, 0x0b, + 0xe1, 0x1a, 0x1c, 0x7f, 0x23, 0xf8, 0x29, 0xf8, + 0xa4, 0x1b, 0x13, 0xb5, 0xca, 0x4e, 0xe8, 0x98, + 0x32, 0x38, 0xe0, 0x79, 0x4d, 0x3d, 0x34, 0xbc, + 0x5f, 0x4e, 0x77, 0xfa, 0xcb, 0x6c, 0x05, 0xac, + 0x86, 0x21, 0x2b, 0xaa, 0x1a, 0x55, 0xa2, 0xbe, + 0x70, 0xb5, 0x73, 0x3b, 0x04, 0x5c, 0xd3, 0x36, + 0x94, 0xb3, 0xaf, 0xe2, 0xf0, 0xe4, 0x9e, 0x4f, + 0x32, 0x15, 0x49, 0xfd, 0x82, 0x4e, 0xa9, 0x08, + 0x70, 0xd4, 0xb2, 0x8a, 0x29, 0x54, 0x48, 0x9a, + 0x0a, 0xbc, 0xd5, 0x0e, 0x18, 0xa8, 0x44, 0xac, + 0x5b, 0xf3, 0x8e, 0x4c, 0xd7, 0x2d, 0x9b, 0x09, + 0x42, 0xe5, 0x06, 0xc4, 0x33, 0xaf, 0xcd, 0xa3, + 0x84, 0x7f, 0x2d, 0xad, 0xd4, 0x76, 0x47, 0xde, + 0x32, 0x1c, 0xec, 0x4a, 0xc4, 0x30, 0xf6, 0x20, + 0x23, 0x85, 0x6c, 0xfb, 0xb2, 0x07, 0x04, 0xf4, + 0xec, 0x0b, 0xb9, 0x20, 0xba, 0x86, 0xc3, 0x3e, + 0x05, 0xf1, 0xec, 0xd9, 0x67, 0x33, 0xb7, 0x99, + 0x50, 0xa3, 0xe3, 0x14, 0xd3, 0xd9, 0x34, 0xf7, + 0x5e, 0xa0, 0xf2, 0x10, 0xa8, 0xf6, 0x05, 0x94, + 0x01, 0xbe, 0xb4, 0xbc, 0x44, 0x78, 0xfa, 0x49, + 0x69, 0xe6, 0x23, 0xd0, 0x1a, 0xda, 0x69 }, + .ciphertext = { 0xc6, 0x69, 0x73, 0x51, 0xff, 0x4a, 0xec, 0x29, + 0xcd, 0xba, 0xab, 0xf2, 0xfb, 0xe3, 0x46, 0x7c, + 0xc2, 0x54, 0xf8, 0x1b, 0xe8, 0xe7, 0x8d, 0x76, + 0x5a, 0x2e, 0x63, 0x33, 0x9f, 0xc9, 0x9a, 0x66, + 0x32, 0x0d, 0xb7, 0x31, 0x58, 0xa3, 0x5a, 0x25, + 0x5d, 0x05, 0x17, 0x58, 0xe9, 0x5e, 0xd4, 0xab, + 0xb2, 0xcd, 0xc6, 0x9b, 0xb4, 0x54, 0x11, 0x0e, + 0x82, 0x74, 0x41, 0x21, 0x3d, 0xdc, 0x87, 0x70, + 0xe9, 0x3e, 0xa1, 0x41, 0xe1, 0xfc, 0x67, 0x3e, + 0x01, 0x7e, 0x97, 0xea, 0xdc, 0x6b, 0x96, 0x8f, + 0x38, 0x5c, 0x2a, 0xec, 0xb0, 0x3b, 0xfb, 0x32, + 0xaf, 0x3c, 0x54, 0xec, 0x18, 0xdb, 0x5c, 0x02, + 0x1a, 0xfe, 0x43, 0xfb, 0xfa, 0xaa, 0x3a, 0xfb, + 0x29, 0xd1, 0xe6, 0x05, 0x3c, 0x7c, 0x94, 0x75, + 0xd8, 0xbe, 0x61, 0x89, 0xf9, 0x5c, 0xbb, 0xa8, + 0x99, 0x0f, 0x95, 0xb1, 0xeb, 0xf1, 0xb3, 0x05, + 0xef, 0xf7, 0x00, 0xe9, 0xa1, 0x3a, 0xe5, 0xca, + 0x0b, 0xcb, 0xd0, 0x48, 0x47, 0x64, 0xbd, 0x1f, + 0x23, 0x1e, 0xa8, 0x1c, 0x7b, 0x64, 0xc5, 0x14, + 0x73, 0x5a, 0xc5, 0x5e, 0x4b, 0x79, 0x63, 0x3b, + 0x70, 0x64, 0x24, 0x11, 0x9e, 0x09, 0xdc, 0xaa, + 0xd4, 0xac, 0xf2, 0x1b, 0x10, 0xaf, 0x3b, 0x33, + 0xcd, 0xe3, 0x50, 0x48, 0x47, 0x15, 0x5c, 0xbb, + 0x6f, 0x22, 0x19, 0xba, 0x9b, 0x7d, 0xf5, 0x0b, + 0xe1, 0x1a, 0x1c, 0x7f, 0x23, 0xf8, 0x29, 0xf8, + 0xa4, 0x1b, 0x13, 0xb5, 0xca, 0x4e, 0xe8, 0x98, + 0x32, 0x38, 0xe0, 0x79, 0x4d, 0x3d, 0x34, 0xbc, + 0x5f, 0x4e, 0x77, 0xfa, 0xcb, 0x6c, 0x05, 0xac, + 0x86, 0x21, 0x2b, 0xaa, 0x1a, 0x55, 0xa2, 0xbe, + 0x70, 0xb5, 0x73, 0x3b, 0x04, 0x5c, 0xd3, 0x36, + 0x94, 0xb3, 0xaf, 0xe2, 0xf0, 0xe4, 0x9e, 0x4f, + 0x32, 0x15, 0x49, 0xfd, 0x82, 0x4e, 0xa9, 0x08, + 0x70, 0xd4, 0xb2, 0x8a, 0x29, 0x54, 0x48, 0x9a, + 0x0a, 0xbc, 0xd5, 0x0e, 0x18, 0xa8, 0x44, 0xac, + 0x5b, 0xf3, 0x8e, 0x4c, 0xd7, 0x2d, 0x9b, 0x09, + 0x42, 0xe5, 0x06, 0xc4, 0x33, 0xaf, 0xcd, 0xa3, + 0x84, 0x7f, 0x2d, 0xad, 0xd4, 0x76, 0x47, 0xde, + 0x32, 0x1c, 0xec, 0x4a, 0xc4, 0x30, 0xf6, 0x20, + 0x23, 0x85, 0x6c, 0xfb, 0xb2, 0x07, 0x04, 0xf4, + 0xec, 0x0b, 0xb9, 0x20, 0xba, 0x86, 0xc3, 0x3e, + 0x05, 0xf1, 0xec, 0xd9, 0x67, 0x33, 0xb7, 0x99, + 0x50, 0xa3, 0xe3, 0x14, 0xd3, 0xd9, 0x34, 0xf7, + 0x5e, 0xa0, 0xf2, 0x10, 0xa8, 0xf6, 0x05, 0x94, + 0x01, 0xbe, 0xb4, 0xbc, 0x44, 0x78, 0xfa, 0x49, + 0x69, 0xe6, 0x23, 0xd0, 0x1a, 0xda, 0x69 }, + .digest_length = ZUC_EIA3_DIGEST_LEN, + .digest = {0xd1, 0x1e, 0x33, 0xf6} + }, }; /* diff --git a/test/validation/api/crypto/test_vectors_len.h b/test/validation/api/crypto/test_vectors_len.h index 9edf2999e..3818b57a0 100644 --- a/test/validation/api/crypto/test_vectors_len.h +++ b/test/validation/api/crypto/test_vectors_len.h @@ -8,7 +8,7 @@ /* Maximum */ #define MAX_KEY_LEN 64 -#define MAX_IV_LEN 16 +#define MAX_IV_LEN 32 #define MAX_DATA_LEN 1000 #define MAX_AAD_LEN 12 #define MAX_DIGEST_LEN 64 @@ -101,6 +101,10 @@ #define ZUC_EEA3_KEY_LEN 16 #define ZUC_EEA3_IV_LEN 16 +/* ZUC_EEA3_256 */ +#define ZUC_EEA3_256_KEY_LEN 32 +#define ZUC_EEA3_256_IV_LEN 25 + /* KASUMI_F9 */ #define KASUMI_F9_KEY_LEN 16 #define KASUMI_F9_IV_LEN 9 @@ -121,6 +125,10 @@ #define ZUC_EIA3_IV_LEN 16 #define ZUC_EIA3_DIGEST_LEN 4 +/* ZUC_EIA3_256 */ +#define ZUC_EIA3_256_KEY_LEN 32 +#define ZUC_EIA3_256_IV_LEN 25 + /* MD5 */ #define MD5_DIGEST_LEN 16 diff --git a/test/validation/api/ipsec/ipsec.c b/test/validation/api/ipsec/ipsec.c index d12234a5a..c98afae4e 100644 --- a/test/validation/api/ipsec/ipsec.c +++ b/test/validation/api/ipsec/ipsec.c @@ -614,6 +614,7 @@ static int recv_pkts_inline(const ipsec_test_part *part, num_pkts = 1; break; case ODP_PACKET_REASS_INCOMPLETE: + reass_state.num_frags = 0; CU_ASSERT(0 == odp_packet_reass_partial_state(pkt, frags, &reass_state)); num_pkts = reass_state.num_frags; diff --git a/test/validation/api/lock/lock.c b/test/validation/api/lock/lock.c index c5e07c776..bf9318e76 100644 --- a/test/validation/api/lock/lock.c +++ b/test/validation/api/lock/lock.c @@ -1007,7 +1007,7 @@ static void lock_test_no_lock_functional(void) { int num = global_mem->g_num_threads; - odp_cunit_thread_create(num, no_lock_functional_test, NULL, 0); + odp_cunit_thread_create(num, no_lock_functional_test, NULL, 0, 0); odp_cunit_thread_join(num); } @@ -1021,7 +1021,7 @@ static void lock_test_spinlock_api(void) { int num = global_mem->g_num_threads; - odp_cunit_thread_create(num, spinlock_api_tests, NULL, 0); + odp_cunit_thread_create(num, spinlock_api_tests, NULL, 0, 0); odp_cunit_thread_join(num); } @@ -1030,7 +1030,7 @@ static void lock_test_spinlock_functional(void) int num = global_mem->g_num_threads; odp_spinlock_init(&global_mem->global_spinlock); - odp_cunit_thread_create(num, spinlock_functional_test, NULL, 0); + odp_cunit_thread_create(num, spinlock_functional_test, NULL, 0, 0); odp_cunit_thread_join(num); } @@ -1038,7 +1038,7 @@ static void lock_test_spinlock_recursive_api(void) { int num = global_mem->g_num_threads; - odp_cunit_thread_create(num, spinlock_recursive_api_tests, NULL, 0); + odp_cunit_thread_create(num, spinlock_recursive_api_tests, NULL, 0, 0); odp_cunit_thread_join(num); } @@ -1047,7 +1047,7 @@ static void lock_test_spinlock_recursive_functional(void) int num = global_mem->g_num_threads; odp_spinlock_recursive_init(&global_mem->global_recursive_spinlock); - odp_cunit_thread_create(num, spinlock_recursive_functional_test, NULL, 0); + odp_cunit_thread_create(num, spinlock_recursive_functional_test, NULL, 0, 0); odp_cunit_thread_join(num); } @@ -1068,7 +1068,7 @@ static void lock_test_ticketlock_api(void) { int num = global_mem->g_num_threads; - odp_cunit_thread_create(num, ticketlock_api_tests, NULL, 0); + odp_cunit_thread_create(num, ticketlock_api_tests, NULL, 0, 0); odp_cunit_thread_join(num); } @@ -1077,7 +1077,7 @@ static void lock_test_ticketlock_functional(void) int num = global_mem->g_num_threads; odp_ticketlock_init(&global_mem->global_ticketlock); - odp_cunit_thread_create(num, ticketlock_functional_test, NULL, 0); + odp_cunit_thread_create(num, ticketlock_functional_test, NULL, 0, 0); odp_cunit_thread_join(num); } @@ -1092,7 +1092,7 @@ static void lock_test_rwlock_api(void) { int num = global_mem->g_num_threads; - odp_cunit_thread_create(num, rwlock_api_tests, NULL, 0); + odp_cunit_thread_create(num, rwlock_api_tests, NULL, 0, 0); odp_cunit_thread_join(num); } @@ -1101,7 +1101,7 @@ static void lock_test_rwlock_functional(void) int num = global_mem->g_num_threads; odp_rwlock_init(&global_mem->global_rwlock); - odp_cunit_thread_create(num, rwlock_functional_test, NULL, 0); + odp_cunit_thread_create(num, rwlock_functional_test, NULL, 0, 0); odp_cunit_thread_join(num); } @@ -1115,7 +1115,7 @@ static void lock_test_rwlock_recursive_api(void) { int num = global_mem->g_num_threads; - odp_cunit_thread_create(num, rwlock_recursive_api_tests, NULL, 0); + odp_cunit_thread_create(num, rwlock_recursive_api_tests, NULL, 0, 0); odp_cunit_thread_join(num); } @@ -1124,7 +1124,7 @@ static void lock_test_rwlock_recursive_functional(void) int num = global_mem->g_num_threads; odp_rwlock_recursive_init(&global_mem->global_recursive_rwlock); - odp_cunit_thread_create(num, rwlock_recursive_functional_test, NULL, 0); + odp_cunit_thread_create(num, rwlock_recursive_functional_test, NULL, 0, 0); odp_cunit_thread_join(num); } diff --git a/test/validation/api/packet/packet.c b/test/validation/api/packet/packet.c index 1ddff1ae1..d81fba3de 100644 --- a/test/validation/api/packet/packet.c +++ b/test/validation/api/packet/packet.c @@ -1,5 +1,5 @@ /* Copyright (c) 2014-2018, Linaro Limited - * Copyright (c) 2019-2020, Nokia + * Copyright (c) 2019-2022, Nokia * Copyright (c) 2020, Marvell * All rights reserved. * @@ -189,7 +189,7 @@ static int packet_suite_init(void) odp_pool_param_t params; odp_packet_t pkt_tbl[PACKET_POOL_NUM_SEG]; struct udata_struct *udat; - uint32_t udat_size; + uint32_t uarea_size; uint8_t data = 0; uint32_t i; uint32_t num = PACKET_POOL_NUM; @@ -201,6 +201,10 @@ static int packet_suite_init(void) printf("pool_capability failed\n"); return -1; } + + if (pool_capa.pkt.max_uarea_size == 0) + printf("Warning: Packet user area not supported\n"); + if (pool_capa.pkt.max_segs_per_pkt == 0) pool_capa.pkt.max_segs_per_pkt = 10; @@ -232,6 +236,10 @@ static int packet_suite_init(void) params.pkt.num = num; params.pkt.uarea_size = sizeof(struct udata_struct); + if (params.pkt.uarea_size > pool_capa.pkt.max_uarea_size) + params.pkt.uarea_size = pool_capa.pkt.max_uarea_size; + + uarea_size = params.pkt.uarea_size; memcpy(&default_param, ¶ms, sizeof(odp_pool_param_t)); default_pool = odp_pool_create("default_pool", ¶ms); @@ -288,23 +296,22 @@ static int packet_suite_init(void) } udat = odp_packet_user_area(test_packet); - udat_size = odp_packet_user_area_size(test_packet); - if (!udat || udat_size != sizeof(struct udata_struct)) { - printf("packet_user_area failed: 1\n"); + if (odp_packet_user_area_size(test_packet) < uarea_size) { + printf("Bad packet user area size %u\n", odp_packet_user_area_size(test_packet)); return -1; } odp_pool_print(default_pool); - memcpy(udat, &test_packet_udata, sizeof(struct udata_struct)); + memcpy(udat, &test_packet_udata, uarea_size); udat = odp_packet_user_area(segmented_test_packet); - udat_size = odp_packet_user_area_size(segmented_test_packet); - if (udat == NULL || udat_size != sizeof(struct udata_struct)) { - printf("packet_user_area failed: 2\n"); + if (odp_packet_user_area_size(segmented_test_packet) < uarea_size) { + printf("Bad segmented packet user area size %u\n", + odp_packet_user_area_size(segmented_test_packet)); return -1; } - memcpy(udat, &test_packet_udata, sizeof(struct udata_struct)); + memcpy(udat, &test_packet_udata, uarea_size); return 0; } @@ -320,6 +327,58 @@ static int packet_suite_term(void) return 0; } +static void packet_set_inflags(odp_packet_t pkt, int val) +{ + odp_packet_has_l2_set(pkt, val); + odp_packet_has_l3_set(pkt, val); + odp_packet_has_l4_set(pkt, val); + odp_packet_has_eth_set(pkt, val); + odp_packet_has_eth_bcast_set(pkt, val); + odp_packet_has_eth_mcast_set(pkt, val); + odp_packet_has_jumbo_set(pkt, val); + odp_packet_has_vlan_set(pkt, val); + odp_packet_has_vlan_qinq_set(pkt, val); + odp_packet_has_arp_set(pkt, val); + odp_packet_has_ipv4_set(pkt, val); + odp_packet_has_ipv6_set(pkt, val); + odp_packet_has_ip_bcast_set(pkt, val); + odp_packet_has_ip_mcast_set(pkt, val); + odp_packet_has_ipfrag_set(pkt, val); + odp_packet_has_ipopt_set(pkt, val); + odp_packet_has_ipsec_set(pkt, val); + odp_packet_has_udp_set(pkt, val); + odp_packet_has_tcp_set(pkt, val); + odp_packet_has_sctp_set(pkt, val); + odp_packet_has_icmp_set(pkt, val); + odp_packet_user_flag_set(pkt, val); +} + +static void packet_check_inflags(odp_packet_t pkt, int val) +{ + CU_ASSERT(odp_packet_has_l2(pkt) == !!val); + CU_ASSERT(odp_packet_has_l3(pkt) == !!val); + CU_ASSERT(odp_packet_has_l4(pkt) == !!val); + CU_ASSERT(odp_packet_has_eth(pkt) == !!val); + CU_ASSERT(odp_packet_has_eth_bcast(pkt) == !!val); + CU_ASSERT(odp_packet_has_eth_mcast(pkt) == !!val); + CU_ASSERT(odp_packet_has_jumbo(pkt) == !!val); + CU_ASSERT(odp_packet_has_vlan(pkt) == !!val); + CU_ASSERT(odp_packet_has_vlan_qinq(pkt) == !!val); + CU_ASSERT(odp_packet_has_arp(pkt) == !!val); + CU_ASSERT(odp_packet_has_ipv4(pkt) == !!val); + CU_ASSERT(odp_packet_has_ipv6(pkt) == !!val); + CU_ASSERT(odp_packet_has_ip_bcast(pkt) == !!val); + CU_ASSERT(odp_packet_has_ip_mcast(pkt) == !!val); + CU_ASSERT(odp_packet_has_ipfrag(pkt) == !!val); + CU_ASSERT(odp_packet_has_ipopt(pkt) == !!val); + CU_ASSERT(odp_packet_has_ipsec(pkt) == !!val); + CU_ASSERT(odp_packet_has_udp(pkt) == !!val); + CU_ASSERT(odp_packet_has_tcp(pkt) == !!val); + CU_ASSERT(odp_packet_has_sctp(pkt) == !!val); + CU_ASSERT(odp_packet_has_icmp(pkt) == !!val); + CU_ASSERT(odp_packet_user_flag(pkt) == !!val); +} + static void packet_test_alloc_free(void) { odp_pool_t pool; @@ -356,6 +415,9 @@ static void packet_test_alloc_free(void) /* User pointer should be NULL after alloc */ CU_ASSERT(odp_packet_user_ptr(packet) == NULL); + /* Packet flags should be zero */ + packet_check_inflags(packet, 0); + /* Pool should have only one packet */ CU_ASSERT_FATAL(odp_packet_alloc(pool, packet_len) == ODP_PACKET_INVALID); @@ -873,11 +935,10 @@ static void packet_test_reset(void) CU_ASSERT(odp_packet_reset(pkt, len) == 0); CU_ASSERT(odp_packet_len(pkt) == len); - CU_ASSERT(odp_packet_has_udp(pkt) == 0); - odp_packet_has_udp_set(pkt, 1); - CU_ASSERT(odp_packet_has_udp(pkt) != 0); + packet_set_inflags(pkt, 1); + packet_check_inflags(pkt, 1); CU_ASSERT(odp_packet_reset(pkt, len) == 0); - CU_ASSERT(odp_packet_has_udp(pkt) == 0); + packet_check_inflags(pkt, 0); CU_ASSERT(odp_packet_reset(pkt, len - 1) == 0); CU_ASSERT(odp_packet_len(pkt) == (len - 1)); @@ -906,10 +967,11 @@ static void packet_test_debug(void) static void packet_test_context(void) { - odp_packet_t pkt = test_packet; - char ptr_test_value = 2; void *prev_ptr; struct udata_struct *udat; + uint32_t uarea_size; + odp_packet_t pkt = test_packet; + char ptr_test_value = 2; prev_ptr = odp_packet_user_ptr(pkt); odp_packet_user_ptr_set(pkt, &ptr_test_value); @@ -917,11 +979,15 @@ static void packet_test_context(void) odp_packet_user_ptr_set(pkt, prev_ptr); udat = odp_packet_user_area(pkt); - CU_ASSERT_PTR_NOT_NULL(udat); - CU_ASSERT(odp_packet_user_area_size(pkt) == - sizeof(struct udata_struct)); - CU_ASSERT(memcmp(udat, &test_packet_udata, sizeof(struct udata_struct)) - == 0); + uarea_size = odp_packet_user_area_size(pkt); + CU_ASSERT(uarea_size >= default_param.pkt.uarea_size); + + if (uarea_size) { + CU_ASSERT(udat != NULL); + CU_ASSERT(memcmp(udat, &test_packet_udata, default_param.pkt.uarea_size) == 0); + } else { + CU_ASSERT(udat == NULL); + } odp_packet_user_ptr_set(pkt, NULL); CU_ASSERT(odp_packet_user_ptr(pkt) == NULL); @@ -1296,37 +1362,46 @@ static void packet_test_segment_last(void) #define TEST_INFLAG(packet, flag) \ do { \ - odp_packet_has_##flag##_set(packet, 0); \ - CU_ASSERT(odp_packet_has_##flag(packet) == 0); \ - odp_packet_has_##flag##_set(packet, 1); \ - CU_ASSERT(odp_packet_has_##flag(packet) != 0); \ + odp_packet_##flag##_set(packet, 0); \ + CU_ASSERT(odp_packet_##flag(packet) == 0); \ + odp_packet_##flag##_set(packet, 1); \ + CU_ASSERT(odp_packet_##flag(packet) != 0); \ } while (0) static void packet_test_in_flags(void) { odp_packet_t pkt = test_packet; - TEST_INFLAG(pkt, l2); - TEST_INFLAG(pkt, l3); - TEST_INFLAG(pkt, l4); - TEST_INFLAG(pkt, eth); - TEST_INFLAG(pkt, eth_bcast); - TEST_INFLAG(pkt, eth_mcast); - TEST_INFLAG(pkt, jumbo); - TEST_INFLAG(pkt, vlan); - TEST_INFLAG(pkt, vlan_qinq); - TEST_INFLAG(pkt, arp); - TEST_INFLAG(pkt, ipv4); - TEST_INFLAG(pkt, ipv6); - TEST_INFLAG(pkt, ip_bcast); - TEST_INFLAG(pkt, ip_mcast); - TEST_INFLAG(pkt, ipfrag); - TEST_INFLAG(pkt, ipopt); - TEST_INFLAG(pkt, ipsec); - TEST_INFLAG(pkt, udp); - TEST_INFLAG(pkt, tcp); - TEST_INFLAG(pkt, sctp); - TEST_INFLAG(pkt, icmp); + packet_set_inflags(pkt, 0); + packet_check_inflags(pkt, 0); + packet_set_inflags(pkt, 1); + packet_check_inflags(pkt, 1); + + TEST_INFLAG(pkt, has_l2); + TEST_INFLAG(pkt, has_l3); + TEST_INFLAG(pkt, has_l4); + TEST_INFLAG(pkt, has_eth); + TEST_INFLAG(pkt, has_eth_bcast); + TEST_INFLAG(pkt, has_eth_mcast); + TEST_INFLAG(pkt, has_jumbo); + TEST_INFLAG(pkt, has_vlan); + TEST_INFLAG(pkt, has_vlan_qinq); + TEST_INFLAG(pkt, has_arp); + TEST_INFLAG(pkt, has_ipv4); + TEST_INFLAG(pkt, has_ipv6); + TEST_INFLAG(pkt, has_ip_bcast); + TEST_INFLAG(pkt, has_ip_mcast); + TEST_INFLAG(pkt, has_ipfrag); + TEST_INFLAG(pkt, has_ipopt); + TEST_INFLAG(pkt, has_ipsec); + TEST_INFLAG(pkt, has_udp); + TEST_INFLAG(pkt, has_tcp); + TEST_INFLAG(pkt, has_sctp); + TEST_INFLAG(pkt, has_icmp); + TEST_INFLAG(pkt, user_flag); + + packet_set_inflags(pkt, 0); + packet_check_inflags(pkt, 0); } static void packet_test_error_flags(void) @@ -1364,9 +1439,10 @@ static void packet_test_add_rem_data(void) odp_packet_t pkt, new_pkt; uint32_t pkt_len, offset, add_len; void *usr_ptr; - struct udata_struct *udat, *new_udat; + struct udata_struct *udat; int ret; uint32_t min_seg_len; + uint32_t uarea_size = default_param.pkt.uarea_size; min_seg_len = pool_capa.pkt.min_seg_len; @@ -1375,10 +1451,14 @@ static void packet_test_add_rem_data(void) pkt_len = odp_packet_len(pkt); usr_ptr = odp_packet_user_ptr(pkt); - udat = odp_packet_user_area(pkt); - CU_ASSERT(odp_packet_user_area_size(pkt) == - sizeof(struct udata_struct)); - memcpy(udat, &test_packet_udata, sizeof(struct udata_struct)); + + if (uarea_size) { + udat = odp_packet_user_area(pkt); + + CU_ASSERT_FATAL(udat != NULL); + CU_ASSERT_FATAL(odp_packet_user_area_size(pkt) >= uarea_size); + memcpy(udat, &test_packet_udata, uarea_size); + } offset = pkt_len / 2; @@ -1401,13 +1481,14 @@ static void packet_test_add_rem_data(void) /* Verify that user metadata is preserved */ CU_ASSERT(odp_packet_user_ptr(new_pkt) == usr_ptr); - /* Verify that user metadata has been preserved */ - new_udat = odp_packet_user_area(new_pkt); - CU_ASSERT_PTR_NOT_NULL(new_udat); - CU_ASSERT(odp_packet_user_area_size(new_pkt) == - sizeof(struct udata_struct)); - CU_ASSERT(memcmp(new_udat, &test_packet_udata, - sizeof(struct udata_struct)) == 0); + if (uarea_size) { + /* Verify that user metadata has been preserved */ + udat = odp_packet_user_area(new_pkt); + + CU_ASSERT_FATAL(udat != NULL); + CU_ASSERT(odp_packet_user_area_size(new_pkt) >= uarea_size); + CU_ASSERT(memcmp(udat, &test_packet_udata, uarea_size) == 0); + } pkt = new_pkt; @@ -1422,13 +1503,14 @@ static void packet_test_add_rem_data(void) CU_ASSERT(odp_packet_len(new_pkt) == pkt_len - add_len); CU_ASSERT(odp_packet_user_ptr(new_pkt) == usr_ptr); - /* Verify that user metadata has been preserved */ - new_udat = odp_packet_user_area(new_pkt); - CU_ASSERT_PTR_NOT_NULL(new_udat); - CU_ASSERT(odp_packet_user_area_size(new_pkt) == - sizeof(struct udata_struct)); - CU_ASSERT(memcmp(new_udat, &test_packet_udata, - sizeof(struct udata_struct)) == 0); + if (uarea_size) { + /* Verify that user metadata has been preserved */ + udat = odp_packet_user_area(new_pkt); + + CU_ASSERT(udat != NULL); + CU_ASSERT(odp_packet_user_area_size(new_pkt) >= uarea_size); + CU_ASSERT(memcmp(udat, &test_packet_udata, uarea_size) == 0); + } pkt = new_pkt; @@ -1436,44 +1518,42 @@ free_packet: odp_packet_free(pkt); } -#define COMPARE_HAS_INFLAG(p1, p2, flag) \ - CU_ASSERT(odp_packet_has_##flag(p1) == odp_packet_has_##flag(p2)) - #define COMPARE_INFLAG(p1, p2, flag) \ CU_ASSERT(odp_packet_##flag(p1) == odp_packet_##flag(p2)) -static void _packet_compare_inflags(odp_packet_t pkt1, odp_packet_t pkt2) +static void packet_compare_inflags(odp_packet_t pkt1, odp_packet_t pkt2) { - COMPARE_HAS_INFLAG(pkt1, pkt2, l2); - COMPARE_HAS_INFLAG(pkt1, pkt2, l3); - COMPARE_HAS_INFLAG(pkt1, pkt2, l4); - COMPARE_HAS_INFLAG(pkt1, pkt2, eth); - COMPARE_HAS_INFLAG(pkt1, pkt2, eth_bcast); - COMPARE_HAS_INFLAG(pkt1, pkt2, eth_mcast); - COMPARE_HAS_INFLAG(pkt1, pkt2, jumbo); - COMPARE_HAS_INFLAG(pkt1, pkt2, vlan); - COMPARE_HAS_INFLAG(pkt1, pkt2, vlan_qinq); - COMPARE_HAS_INFLAG(pkt1, pkt2, arp); - COMPARE_HAS_INFLAG(pkt1, pkt2, ipv4); - COMPARE_HAS_INFLAG(pkt1, pkt2, ipv6); - COMPARE_HAS_INFLAG(pkt1, pkt2, ip_bcast); - COMPARE_HAS_INFLAG(pkt1, pkt2, ip_mcast); - COMPARE_HAS_INFLAG(pkt1, pkt2, ipfrag); - COMPARE_HAS_INFLAG(pkt1, pkt2, ipopt); - COMPARE_HAS_INFLAG(pkt1, pkt2, ipsec); - COMPARE_HAS_INFLAG(pkt1, pkt2, udp); - COMPARE_HAS_INFLAG(pkt1, pkt2, tcp); - COMPARE_HAS_INFLAG(pkt1, pkt2, sctp); - COMPARE_HAS_INFLAG(pkt1, pkt2, icmp); - COMPARE_HAS_INFLAG(pkt1, pkt2, flow_hash); - COMPARE_HAS_INFLAG(pkt1, pkt2, ts); + COMPARE_INFLAG(pkt1, pkt2, has_l2); + COMPARE_INFLAG(pkt1, pkt2, has_l3); + COMPARE_INFLAG(pkt1, pkt2, has_l4); + COMPARE_INFLAG(pkt1, pkt2, has_eth); + COMPARE_INFLAG(pkt1, pkt2, has_eth_bcast); + COMPARE_INFLAG(pkt1, pkt2, has_eth_mcast); + COMPARE_INFLAG(pkt1, pkt2, has_jumbo); + COMPARE_INFLAG(pkt1, pkt2, has_vlan); + COMPARE_INFLAG(pkt1, pkt2, has_vlan_qinq); + COMPARE_INFLAG(pkt1, pkt2, has_arp); + COMPARE_INFLAG(pkt1, pkt2, has_ipv4); + COMPARE_INFLAG(pkt1, pkt2, has_ipv6); + COMPARE_INFLAG(pkt1, pkt2, has_ip_bcast); + COMPARE_INFLAG(pkt1, pkt2, has_ip_mcast); + COMPARE_INFLAG(pkt1, pkt2, has_ipfrag); + COMPARE_INFLAG(pkt1, pkt2, has_ipopt); + COMPARE_INFLAG(pkt1, pkt2, has_ipsec); + COMPARE_INFLAG(pkt1, pkt2, has_udp); + COMPARE_INFLAG(pkt1, pkt2, has_tcp); + COMPARE_INFLAG(pkt1, pkt2, has_sctp); + COMPARE_INFLAG(pkt1, pkt2, has_icmp); + COMPARE_INFLAG(pkt1, pkt2, user_flag); + COMPARE_INFLAG(pkt1, pkt2, has_flow_hash); + COMPARE_INFLAG(pkt1, pkt2, has_ts); COMPARE_INFLAG(pkt1, pkt2, color); COMPARE_INFLAG(pkt1, pkt2, drop_eligible); COMPARE_INFLAG(pkt1, pkt2, shaper_len_adjust); } -static void _packet_compare_udata(odp_packet_t pkt1, odp_packet_t pkt2) +static void packet_compare_udata(odp_packet_t pkt1, odp_packet_t pkt2) { uint32_t usize1 = odp_packet_user_area_size(pkt1); uint32_t usize2 = odp_packet_user_area_size(pkt2); @@ -1545,53 +1625,16 @@ static void packet_test_meta_data_copy(void) pkt = odp_packet_alloc(pool, packet_len); CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID); - CU_ASSERT(odp_packet_has_l2(pkt) == 0); - CU_ASSERT(odp_packet_has_l3(pkt) == 0); - CU_ASSERT(odp_packet_has_l4(pkt) == 0); - CU_ASSERT(odp_packet_has_eth(pkt) == 0); - CU_ASSERT(odp_packet_has_eth_bcast(pkt) == 0); - CU_ASSERT(odp_packet_has_eth_mcast(pkt) == 0); - CU_ASSERT(odp_packet_has_jumbo(pkt) == 0); - CU_ASSERT(odp_packet_has_vlan(pkt) == 0); - CU_ASSERT(odp_packet_has_vlan_qinq(pkt) == 0); - CU_ASSERT(odp_packet_has_arp(pkt) == 0); - CU_ASSERT(odp_packet_has_ipv4(pkt) == 0); - CU_ASSERT(odp_packet_has_ipv6(pkt) == 0); - CU_ASSERT(odp_packet_has_ip_bcast(pkt) == 0); - CU_ASSERT(odp_packet_has_ip_mcast(pkt) == 0); - CU_ASSERT(odp_packet_has_ipfrag(pkt) == 0); - CU_ASSERT(odp_packet_has_ipopt(pkt) == 0); - CU_ASSERT(odp_packet_has_ipsec(pkt) == 0); - CU_ASSERT(odp_packet_has_udp(pkt) == 0); - CU_ASSERT(odp_packet_has_tcp(pkt) == 0); - CU_ASSERT(odp_packet_has_sctp(pkt) == 0); - CU_ASSERT(odp_packet_has_icmp(pkt) == 0); + + packet_check_inflags(pkt, 0); + CU_ASSERT(odp_packet_input(pkt) == ODP_PKTIO_INVALID); CU_ASSERT(odp_packet_l3_offset(pkt) == ODP_PACKET_OFFSET_INVALID); CU_ASSERT(odp_packet_l4_offset(pkt) == ODP_PACKET_OFFSET_INVALID); CU_ASSERT(odp_packet_payload_offset(pkt) == ODP_PACKET_OFFSET_INVALID); - odp_packet_has_l2_set(pkt, 1); - odp_packet_has_l3_set(pkt, 1); - odp_packet_has_l4_set(pkt, 1); - odp_packet_has_eth_set(pkt, 1); - odp_packet_has_eth_bcast_set(pkt, 1); - odp_packet_has_eth_mcast_set(pkt, 1); - odp_packet_has_jumbo_set(pkt, 1); - odp_packet_has_vlan_set(pkt, 1); - odp_packet_has_vlan_qinq_set(pkt, 1); - odp_packet_has_arp_set(pkt, 1); - odp_packet_has_ipv4_set(pkt, 1); - odp_packet_has_ipv6_set(pkt, 1); - odp_packet_has_ip_bcast_set(pkt, 1); - odp_packet_has_ip_mcast_set(pkt, 1); - odp_packet_has_ipfrag_set(pkt, 1); - odp_packet_has_ipopt_set(pkt, 1); - odp_packet_has_ipsec_set(pkt, 1); - odp_packet_has_udp_set(pkt, 1); - odp_packet_has_tcp_set(pkt, 1); - odp_packet_has_sctp_set(pkt, 1); - odp_packet_has_icmp_set(pkt, 1); + packet_set_inflags(pkt, 1); + packet_check_inflags(pkt, 1); odp_packet_input_set(pkt, pktio); odp_packet_user_ptr_set(pkt, (void *)(uintptr_t)0xdeadbeef); @@ -1609,7 +1652,7 @@ static void packet_test_meta_data_copy(void) copy = odp_packet_copy(pkt, pool); CU_ASSERT_FATAL(copy != ODP_PACKET_INVALID); - _packet_compare_inflags(pkt, copy); + packet_compare_inflags(pkt, copy); CU_ASSERT(odp_packet_input(copy) == pktio); CU_ASSERT(odp_packet_user_ptr(copy) == (void *)(uintptr_t)0xdeadbeef); CU_ASSERT(odp_packet_l2_offset(copy) == 20); @@ -1633,69 +1676,73 @@ static void packet_test_meta_data_copy(void) static void packet_test_copy(void) { odp_packet_t pkt; - odp_packet_t pkt_copy, pkt_part; + odp_packet_t pkt_part; odp_pool_param_t param; - odp_pool_t pool, pool_double_uarea, pool_no_uarea; - uint32_t i, plen, src_offset, dst_offset; - uint32_t seg_len = 0; + odp_pool_t pool, pool_min_uarea, pool_large_uarea; void *pkt_data; + uint32_t i, plen, src_offset, dst_offset, uarea_size; + uint32_t seg_len = 0; memcpy(¶m, &default_param, sizeof(odp_pool_param_t)); param.pkt.uarea_size = 0; - pool_no_uarea = odp_pool_create("no_uarea", ¶m); - CU_ASSERT_FATAL(pool_no_uarea != ODP_POOL_INVALID); + pool_min_uarea = odp_pool_create("min_uarea", ¶m); + CU_ASSERT_FATAL(pool_min_uarea != ODP_POOL_INVALID); + + uarea_size = 2 * sizeof(struct udata_struct); + if (uarea_size > pool_capa.pkt.max_uarea_size) + uarea_size = pool_capa.pkt.max_uarea_size; + + param.pkt.uarea_size = uarea_size; + + pool_large_uarea = odp_pool_create("large_uarea", ¶m); + CU_ASSERT_FATAL(pool_large_uarea != ODP_POOL_INVALID); + + /* Pool with minimal user area */ + pkt = odp_packet_copy(test_packet, pool_min_uarea); + if (pkt != ODP_PACKET_INVALID) { + /* Pool has enough user area also when zero was requested */ + CU_ASSERT(odp_packet_user_area_size(pkt) >= sizeof(struct udata_struct)); - param.pkt.uarea_size = 2 * sizeof(struct udata_struct); - pool_double_uarea = odp_pool_create("double_uarea", ¶m); - CU_ASSERT_FATAL(pool_double_uarea != ODP_POOL_INVALID); + packet_compare_inflags(pkt, test_packet); + packet_compare_udata(pkt, test_packet); + packet_compare_data(pkt, test_packet); - pkt = odp_packet_copy(test_packet, pool_no_uarea); - CU_ASSERT(pkt == ODP_PACKET_INVALID); - if (pkt != ODP_PACKET_INVALID) odp_packet_free(pkt); + } + /* The same pool */ pkt = odp_packet_copy(test_packet, odp_packet_pool(test_packet)); CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID); + CU_ASSERT(pkt != test_packet); + CU_ASSERT(odp_packet_pool(pkt) == odp_packet_pool(test_packet)); + CU_ASSERT(odp_packet_user_area(pkt) != odp_packet_user_area(test_packet)); + CU_ASSERT(odp_packet_user_area_size(pkt) == odp_packet_user_area_size(test_packet)); + CU_ASSERT(odp_packet_data(pkt) != odp_packet_data(test_packet)); + CU_ASSERT(odp_packet_len(pkt) == odp_packet_len(test_packet)); + + packet_compare_inflags(pkt, test_packet); + packet_compare_udata(pkt, test_packet); packet_compare_data(pkt, test_packet); - pool = odp_packet_pool(pkt); - CU_ASSERT_FATAL(pool != ODP_POOL_INVALID); - pkt_copy = odp_packet_copy(pkt, pool); - CU_ASSERT_FATAL(pkt_copy != ODP_PACKET_INVALID); - - CU_ASSERT(pkt != pkt_copy); - CU_ASSERT(odp_packet_data(pkt) != odp_packet_data(pkt_copy)); - CU_ASSERT(odp_packet_len(pkt) == odp_packet_len(pkt_copy)); - - _packet_compare_inflags(pkt, pkt_copy); - packet_compare_data(pkt, pkt_copy); - CU_ASSERT(odp_packet_user_area_size(pkt) == - odp_packet_user_area_size(test_packet)); - _packet_compare_udata(pkt, pkt_copy); - odp_packet_free(pkt_copy); + odp_packet_free(pkt); - pkt = odp_packet_copy(test_packet, pool_double_uarea); + /* Pool with larger user area */ + pkt = odp_packet_copy(test_packet, pool_large_uarea); CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID); + CU_ASSERT(pkt != test_packet); + CU_ASSERT(odp_packet_pool(pkt) == pool_large_uarea); + CU_ASSERT(odp_packet_user_area(pkt) != odp_packet_user_area(test_packet)); + CU_ASSERT(odp_packet_user_area_size(pkt) >= uarea_size); + CU_ASSERT(odp_packet_data(pkt) != odp_packet_data(test_packet)); + CU_ASSERT(odp_packet_len(pkt) == odp_packet_len(test_packet)); + + packet_compare_inflags(pkt, test_packet); + packet_compare_udata(pkt, test_packet); packet_compare_data(pkt, test_packet); - pool = odp_packet_pool(pkt); - CU_ASSERT_FATAL(pool != ODP_POOL_INVALID); - pkt_copy = odp_packet_copy(pkt, pool); - CU_ASSERT_FATAL(pkt_copy != ODP_PACKET_INVALID); - - CU_ASSERT(pkt != pkt_copy); - CU_ASSERT(odp_packet_data(pkt) != odp_packet_data(pkt_copy)); - CU_ASSERT(odp_packet_len(pkt) == odp_packet_len(pkt_copy)); - - _packet_compare_inflags(pkt, pkt_copy); - packet_compare_data(pkt, pkt_copy); - CU_ASSERT(odp_packet_user_area_size(pkt) == - 2 * odp_packet_user_area_size(test_packet)); - _packet_compare_udata(pkt, pkt_copy); - _packet_compare_udata(pkt, test_packet); - odp_packet_free(pkt_copy); /* Now test copy_part */ + pool = pool_large_uarea; pkt_part = odp_packet_copy_part(pkt, 0, odp_packet_len(pkt) + 1, pool); CU_ASSERT(pkt_part == ODP_PACKET_INVALID); pkt_part = odp_packet_copy_part(pkt, odp_packet_len(pkt), 1, pool); @@ -1743,8 +1790,8 @@ static void packet_test_copy(void) odp_packet_free(pkt_part); odp_packet_free(pkt); - CU_ASSERT(odp_pool_destroy(pool_no_uarea) == 0); - CU_ASSERT(odp_pool_destroy(pool_double_uarea) == 0); + CU_ASSERT(odp_pool_destroy(pool_min_uarea) == 0); + CU_ASSERT(odp_pool_destroy(pool_large_uarea) == 0); } static void packet_test_copydata(void) @@ -3049,6 +3096,19 @@ static void packet_vector_test_alloc_free(void) CU_ASSERT(odp_packet_vector_to_u64(pktv) != odp_packet_vector_to_u64(ODP_PACKET_VECTOR_INVALID)); + /* User flag should be initially zero */ + CU_ASSERT(odp_packet_vector_user_flag(pktv) == 0); + odp_packet_vector_user_flag_set(pktv, 1); + CU_ASSERT(odp_packet_vector_user_flag(pktv) != 0); + odp_packet_vector_user_flag_set(pktv, 0); + CU_ASSERT(odp_packet_vector_user_flag(pktv) == 0); + + /* Free with flag still set, alloc should clear it. */ + odp_packet_vector_user_flag_set(pktv, 1); + odp_packet_vector_free(pktv); + pktv = odp_packet_vector_alloc(pool); + CU_ASSERT(odp_packet_vector_user_flag(pktv) == 0); + /* Since it was only one buffer pool, more vector packets can't be * allocated. */ @@ -3111,6 +3171,60 @@ static void packet_vector_basic_test(void) CU_ASSERT(odp_packet_vector_valid(pktv_default) == 1); } +static void packet_vector_test_user_area(void) +{ + odp_pool_param_t param; + odp_pool_t pool; + uint32_t i; + void *addr; + uint32_t num = 10; + void *prev = NULL; + uint32_t num_alloc = 0; + uint32_t size = 1024; + const uint32_t max_size = pool_capa.vector.max_uarea_size; + + if (max_size == 0) { + ODPH_DBG("Packet vector user area not supported\n"); + return; + } + + if (size > max_size) + size = max_size; + + odp_pool_param_init(¶m); + param.type = ODP_POOL_VECTOR; + param.vector.num = num; + param.vector.max_size = pool_capa.vector.max_size; + param.vector.uarea_size = size; + + odp_packet_vector_t pktv[num]; + + pool = odp_pool_create("test_user_area", ¶m); + CU_ASSERT_FATAL(pool != ODP_POOL_INVALID); + + for (i = 0; i < num; i++) { + pktv[i] = odp_packet_vector_alloc(pool); + + if (pktv[i] == ODP_PACKET_VECTOR_INVALID) + break; + num_alloc++; + + addr = odp_packet_vector_user_area(pktv[i]); + CU_ASSERT_FATAL(addr != NULL); + CU_ASSERT(prev != addr); + + prev = addr; + memset(addr, 0, size); + } + + CU_ASSERT(i == num); + + for (i = 0; i < num_alloc; i++) + odp_packet_vector_free(pktv[i]); + + CU_ASSERT_FATAL(odp_pool_destroy(pool) == 0); +} + static int packet_vector_suite_init(void) { uint32_t num_pkt = PKT_VEC_PACKET_NUM; @@ -3278,27 +3392,33 @@ static void packet_test_user_area(void) CU_ASSERT_FATAL(pool != ODP_POOL_INVALID); pkt = odp_packet_alloc(pool, param.pkt.len); CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID); - CU_ASSERT(odp_packet_user_area(pkt) == NULL); - CU_ASSERT(odp_packet_user_area_size(pkt) == 0); + CU_ASSERT(odp_packet_user_area_size(pkt) <= pool_capa.pkt.max_uarea_size); + if (odp_packet_user_area_size(pkt)) { + /* CU_ASSERT needs these extra bracets */ + CU_ASSERT(odp_packet_user_area(pkt) != NULL); + } else { + CU_ASSERT(odp_packet_user_area(pkt) == NULL); + } + odp_packet_free(pkt); CU_ASSERT(odp_pool_destroy(pool) == 0); + if (pool_capa.pkt.max_uarea_size == 0) + return; + param.pkt.uarea_size = 1; pool = odp_pool_create("one_uarea", ¶m); CU_ASSERT_FATAL(pool != ODP_POOL_INVALID); pkt = odp_packet_alloc(pool, param.pkt.len); CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID); CU_ASSERT_FATAL(odp_packet_user_area(pkt) != NULL); - CU_ASSERT(odp_packet_user_area_size(pkt) == 1); + CU_ASSERT(odp_packet_user_area_size(pkt) >= 1); *(char *)odp_packet_user_area(pkt) = 0; CU_ASSERT_FATAL(odp_packet_is_valid(pkt) == 1); odp_packet_free(pkt); CU_ASSERT(odp_pool_destroy(pool) == 0); - if (pool_capa.pkt.max_uarea_size) - param.pkt.uarea_size = pool_capa.pkt.max_uarea_size; - else - param.pkt.uarea_size = 512; + param.pkt.uarea_size = pool_capa.pkt.max_uarea_size; pool = odp_pool_create("max_uarea", ¶m); CU_ASSERT_FATAL(pool != ODP_POOL_INVALID); pkt = odp_packet_alloc(pool, param.pkt.len); @@ -4309,6 +4429,7 @@ odp_testinfo_t packet_vector_parse_suite[] = { ODP_TEST_INFO(packet_vector_basic_test), ODP_TEST_INFO(packet_vector_test_alloc_free), ODP_TEST_INFO(packet_vector_test_tbl), + ODP_TEST_INFO(packet_vector_test_user_area), ODP_TEST_INFO(packet_vector_test_event_conversion), ODP_TEST_INFO_NULL, }; diff --git a/test/validation/api/pktio/pktio.c b/test/validation/api/pktio/pktio.c index 84fad32b6..2eb1a5a28 100644 --- a/test/validation/api/pktio/pktio.c +++ b/test/validation/api/pktio/pktio.c @@ -695,6 +695,7 @@ static int get_packets(pktio_info_t *pktio_rx, odp_packet_t pkt_tbl[], pktv = odp_packet_vector_from_event(evt_tbl[i]); pktv_len = odp_packet_vector_tbl(pktv, &pkts); + CU_ASSERT(odp_packet_vector_user_flag(pktv) == 0); /* Make sure too many packets are not received */ if (num_pkts + pktv_len > num) { @@ -996,6 +997,7 @@ static void pktio_txrx_multi(pktio_info_t *pktio_info_a, CU_ASSERT(odp_packet_has_udp(pkt)); } + CU_ASSERT(odp_packet_user_flag(pkt) == 0); CU_ASSERT(odp_packet_user_ptr(pkt) == NULL); CU_ASSERT(odp_packet_cls_mark(pkt) == 0); diff --git a/test/validation/api/pool/pool.c b/test/validation/api/pool/pool.c index c5f57d17f..e8bf38c9d 100644 --- a/test/validation/api/pool/pool.c +++ b/test/validation/api/pool/pool.c @@ -51,17 +51,21 @@ static void test_param_init(uint8_t fill) memset(¶m, fill, sizeof(param)); odp_pool_param_init(¶m); + CU_ASSERT(param.buf.uarea_size == 0); CU_ASSERT(param.buf.cache_size >= global_pool_capa.buf.min_cache_size && param.buf.cache_size <= global_pool_capa.buf.max_cache_size); CU_ASSERT(param.pkt.max_num == 0); CU_ASSERT(param.pkt.num_subparam == 0); + CU_ASSERT(param.pkt.uarea_size == 0); CU_ASSERT(param.pkt.cache_size >= global_pool_capa.pkt.min_cache_size && param.pkt.cache_size <= global_pool_capa.pkt.max_cache_size); + CU_ASSERT(param.tmo.uarea_size == 0); CU_ASSERT(param.tmo.cache_size >= global_pool_capa.tmo.min_cache_size && param.tmo.cache_size <= global_pool_capa.tmo.max_cache_size); + CU_ASSERT(param.vector.uarea_size == 0); CU_ASSERT(param.vector.cache_size >= global_pool_capa.vector.min_cache_size && param.vector.cache_size <= global_pool_capa.vector.max_cache_size); } @@ -915,7 +919,7 @@ static void pool_test_create_after_fork(void) odp_atomic_init_u32(&global_mem->index, 0); /* Fork here */ - odp_cunit_thread_create(num, run_pool_test_create_after_fork, NULL, 0); + odp_cunit_thread_create(num, run_pool_test_create_after_fork, NULL, 0, 0); /* Wait until thread 0 has created the test pool */ odp_barrier_wait(&global_mem->init_barrier); @@ -1027,7 +1031,7 @@ static void pool_test_create_max_pkt_pools(void) CU_ASSERT(num_shm == shm_capa.max_blocks); /* Create maximum number of packet pools */ - if (global_pool_capa.pkt.max_uarea_size && global_pool_capa.pkt.max_uarea_size < uarea_size) + if (uarea_size > global_pool_capa.pkt.max_uarea_size) uarea_size = global_pool_capa.pkt.max_uarea_size; odp_pool_param_init(¶m); @@ -1656,6 +1660,8 @@ static void packet_pool_ext_alloc(int len_test) if (pkt[i] == ODP_PACKET_INVALID) break; + CU_ASSERT(odp_packet_is_valid(pkt[i]) == 1); + CU_ASSERT(odp_event_is_valid(odp_packet_to_event(pkt[i])) == 1); CU_ASSERT(odp_packet_len(pkt[i]) == pkt_len); CU_ASSERT(odp_packet_headroom(pkt[i]) >= headroom); buf_index = find_buf(pkt[i], buf, num_buf, head_offset); @@ -1683,7 +1689,7 @@ static void packet_pool_ext_alloc(int len_test) if (uarea_size) { CU_ASSERT(odp_packet_user_area(pkt[i]) != NULL); - CU_ASSERT(odp_packet_user_area_size(pkt[i]) == uarea_size); + CU_ASSERT(odp_packet_user_area_size(pkt[i]) >= uarea_size); } /* Check that application header content has not changed */ diff --git a/test/validation/api/queue/queue.c b/test/validation/api/queue/queue.c index 8f1278f61..f661da075 100644 --- a/test/validation/api/queue/queue.c +++ b/test/validation/api/queue/queue.c @@ -547,7 +547,7 @@ static void test_pair(odp_nonblocking_t nonblocking, /* Create one worker thread */ arg = globals; - odp_cunit_thread_create(1, queue_pair_work_loop, &arg, 0); + odp_cunit_thread_create(1, queue_pair_work_loop, &arg, 0, 0); /* Run this thread as the second thread */ CU_ASSERT(queue_pair_work_loop(globals) == 0); @@ -1018,7 +1018,7 @@ static void multithread_test(odp_nonblocking_t nonblocking) CU_ASSERT(alloc_and_enqueue(queue, pool, num) == num); arg = globals; - odp_cunit_thread_create(num_workers, queue_test_worker, &arg, 0); + odp_cunit_thread_create(num_workers, queue_test_worker, &arg, 0, 0); /* Wait for worker threads to terminate */ odp_cunit_thread_join(num_workers); diff --git a/test/validation/api/scheduler/scheduler.c b/test/validation/api/scheduler/scheduler.c index 878e99e07..cd9ad1ac1 100644 --- a/test/validation/api/scheduler/scheduler.c +++ b/test/validation/api/scheduler/scheduler.c @@ -1422,7 +1422,7 @@ static void chaos_run(unsigned int qtype) num_thr = globals->num_workers - 1; arg_ptr = args; if (num_thr > 0) - odp_cunit_thread_create(num_thr, chaos_thread, &arg_ptr, 0); + odp_cunit_thread_create(num_thr, chaos_thread, &arg_ptr, 0, 0); chaos_thread(args); @@ -1865,7 +1865,7 @@ static void parallel_execute(odp_schedule_sync_t sync, int num_queues, num = globals->num_workers - 1; arg_ptr = args; if (num > 0) - odp_cunit_thread_create(num, schedule_common_, &arg_ptr, 0); + odp_cunit_thread_create(num, schedule_common_, &arg_ptr, 0, 0); schedule_common_(args); @@ -2426,7 +2426,7 @@ static void scheduler_test_order_wait_2_threads(void) odp_atomic_init_u32(&globals->order_wait.helper_ready, 0); odp_atomic_init_u32(&globals->order_wait.helper_active, 0); - ret = odp_cunit_thread_create(num, order_wait_helper, NULL, 0); + ret = odp_cunit_thread_create(num, order_wait_helper, NULL, 0, 0); CU_ASSERT_FATAL(ret == num); /* Send an event to the helper thread */ @@ -2677,7 +2677,7 @@ static void scheduler_test_sched_and_plain(odp_schedule_sync_t sync) num = globals->num_workers - 1; arg_ptr = args; if (num > 0) - odp_cunit_thread_create(num, sched_and_plain_thread, &arg_ptr, 0); + odp_cunit_thread_create(num, sched_and_plain_thread, &arg_ptr, 0, 0); sched_and_plain_thread(args); @@ -2980,7 +2980,7 @@ static void scheduler_fifo_mt(odp_schedule_sync_t sync, int multi) arg[i] = i; if (num_thr > 1) - odp_cunit_thread_create(num_thr - 1, scheduler_fifo_test, (void **)&arg[1], 1); + odp_cunit_thread_create(num_thr - 1, scheduler_fifo_test, (void **)&arg[1], 1, 0); /* Main thread runs as thread 0 */ scheduler_fifo_test(0); @@ -3126,7 +3126,7 @@ static void scheduler_test_atomicity(void) num = globals->num_workers - 1; arg_ptr = args; if (num > 0) - odp_cunit_thread_create(num, atomicity_test_run, &arg_ptr, 0); + odp_cunit_thread_create(num, atomicity_test_run, &arg_ptr, 0, 0); atomicity_test_run(args); diff --git a/test/validation/api/shmem/shmem.c b/test/validation/api/shmem/shmem.c index f68021310..a10e7d1d9 100644 --- a/test/validation/api/shmem/shmem.c +++ b/test/validation/api/shmem/shmem.c @@ -207,7 +207,7 @@ static void shmem_test_multi_thread(void) num = MAX_WORKERS; odp_barrier_init(&shared_test_data->test_barrier1, num); - odp_cunit_thread_create(num, run_test_basic_thread, NULL, 0); + odp_cunit_thread_create(num, run_test_basic_thread, NULL, 0, 0); CU_ASSERT(odp_cunit_thread_join(num) >= 0); odp_shm_print(shm); @@ -561,7 +561,7 @@ static void shmem_test_reserve_after_fork(void) odp_barrier_init(&glob_data->test_barrier2, num + 1); odp_atomic_store_u32(&glob_data->index, 0); - odp_cunit_thread_create(num, run_test_reserve_after_fork, NULL, 0); + odp_cunit_thread_create(num, run_test_reserve_after_fork, NULL, 0, 0); /* wait until all threads have made their shm_reserve: */ odp_barrier_wait(&glob_data->test_barrier1); @@ -756,7 +756,7 @@ static void shmem_test_singleva_after_fork(void) odp_barrier_init(&glob_data->test_barrier4, num + 1); odp_atomic_store_u32(&glob_data->index, 0); - odp_cunit_thread_create(num, run_test_singleva_after_fork, NULL, 0); + odp_cunit_thread_create(num, run_test_singleva_after_fork, NULL, 0, 0); /* wait until all threads have made their shm_reserve: */ odp_barrier_wait(&glob_data->test_barrier1); @@ -994,7 +994,7 @@ static void shmem_test_stress(void) glob_data->stress[i].state = STRESS_FREE; /* create threads */ - odp_cunit_thread_create(num, run_test_stress, NULL, 0); + odp_cunit_thread_create(num, run_test_stress, NULL, 0, 0); /* wait for all thread endings: */ CU_ASSERT(odp_cunit_thread_join(num) >= 0); diff --git a/test/validation/api/stash/stash.c b/test/validation/api/stash/stash.c index f1de7ec00..f4ddfa2e1 100644 --- a/test/validation/api/stash/stash.c +++ b/test/validation/api/stash/stash.c @@ -24,6 +24,7 @@ #define CACHE_SIZE 8 #define BURST 32 +#define BATCH 16 #define MAX_RETRY 1024 #define RETRY_MSEC 100 @@ -118,6 +119,8 @@ static void stash_capability(void) CU_ASSERT(capa.max_stashes > 0); CU_ASSERT(capa.max_num_obj > 0); CU_ASSERT(capa.max_obj_size >= sizeof(uint32_t)); + CU_ASSERT(capa.max_get_batch >= 1); + CU_ASSERT(capa.max_put_batch >= 1); memset(&capa, 0, sizeof(odp_stash_capability_t)); ret = odp_stash_capability(&capa, ODP_STASH_TYPE_FIFO); @@ -126,6 +129,8 @@ static void stash_capability(void) if (ret == 0 && capa.max_stashes) { CU_ASSERT(capa.max_num_obj > 0); CU_ASSERT(capa.max_obj_size >= sizeof(uint32_t)); + CU_ASSERT(capa.max_get_batch >= 1); + CU_ASSERT(capa.max_put_batch >= 1); } } @@ -444,13 +449,24 @@ static void stash_stats_u32(void) CU_ASSERT_FATAL(odp_stash_destroy(stash) == 0); } -static void stash_default_put(uint32_t size, int32_t burst, stash_op_t op) +static void stash_default_put(uint32_t size, int32_t burst, stash_op_t op, int batch) { odp_stash_t stash; odp_stash_param_t param; int32_t i, ret, retry, num_left; - int32_t num; + int32_t num, max_burst; void *input, *output; + + if (batch) { + CU_ASSERT_FATAL(global.capa_default.max_get_batch >= 1); + CU_ASSERT_FATAL(global.capa_default.max_put_batch >= 1); + + if (burst > (int32_t)global.capa_default.max_get_batch) + burst = global.capa_default.max_get_batch; + if (burst > (int32_t)global.capa_default.max_put_batch) + burst = global.capa_default.max_put_batch; + } + uint64_t input_u64[burst]; uint64_t output_u64[burst + 2]; uint32_t input_u32[burst]; @@ -499,19 +515,38 @@ static void stash_default_put(uint32_t size, int32_t burst, stash_op_t op) retry = MAX_RETRY; num_left = num; - while (num_left) { - if (op == STASH_GEN) - ret = odp_stash_put(stash, input, burst); - else if (op == STASH_U32) - ret = odp_stash_put_u32(stash, input_u32, burst); - else if (op == STASH_U64) - ret = odp_stash_put_u64(stash, input_u64, burst); - else if (op == STASH_PTR) - ret = odp_stash_put_ptr(stash, input, burst); - else + max_burst = burst; + while (num_left > 0) { + if (op == STASH_GEN) { + if (batch) + ret = odp_stash_put_batch(stash, input, burst); + else + ret = odp_stash_put(stash, input, burst); + } else if (op == STASH_U32) { + if (batch) + ret = odp_stash_put_u32_batch(stash, input_u32, burst); + else + ret = odp_stash_put_u32(stash, input_u32, burst); + } else if (op == STASH_U64) { + if (batch) + ret = odp_stash_put_u64_batch(stash, input_u64, burst); + else + ret = odp_stash_put_u64(stash, input_u64, burst); + } else if (op == STASH_PTR) { + if (batch) + ret = odp_stash_put_ptr_batch(stash, input, burst); + else + ret = odp_stash_put_ptr(stash, input, burst); + } else { ret = -1; + } CU_ASSERT_FATAL(ret >= 0); CU_ASSERT_FATAL(ret <= burst); + if (batch) { + CU_ASSERT(ret == 0 || ret == burst); + if (num_left - ret < burst) + burst = num_left - ret; + } if (ret) { num_left -= ret; @@ -522,9 +557,10 @@ static void stash_default_put(uint32_t size, int32_t burst, stash_op_t op) } } + burst = max_burst; retry = MAX_RETRY; num_left = num; - while (num_left) { + while (num_left > 0) { memset(output, 0, burst * size); /* Init first and last array element for under-/overflow checking */ @@ -541,16 +577,29 @@ static void stash_default_put(uint32_t size, int32_t burst, stash_op_t op) output_u8[0] = MAGIC_U8; output_u8[burst + 1] = MAGIC_U8; } - if (op == STASH_GEN) - ret = odp_stash_get(stash, output, burst); - else if (op == STASH_U32) - ret = odp_stash_get_u32(stash, &output_u32[1], burst); - else if (op == STASH_U64) - ret = odp_stash_get_u64(stash, &output_u64[1], burst); - else if (op == STASH_PTR) - ret = odp_stash_get_ptr(stash, output, burst); - else + if (op == STASH_GEN) { + if (batch) + ret = odp_stash_get_batch(stash, output, burst); + else + ret = odp_stash_get(stash, output, burst); + } else if (op == STASH_U32) { + if (batch) + ret = odp_stash_get_u32_batch(stash, &output_u32[1], burst); + else + ret = odp_stash_get_u32(stash, &output_u32[1], burst); + } else if (op == STASH_U64) { + if (batch) + ret = odp_stash_get_u64_batch(stash, &output_u64[1], burst); + else + ret = odp_stash_get_u64(stash, &output_u64[1], burst); + } else if (op == STASH_PTR) { + if (batch) + ret = odp_stash_get_ptr_batch(stash, output, burst); + else + ret = odp_stash_get_ptr(stash, output, burst); + } else { ret = -1; + } CU_ASSERT_FATAL(ret >= 0); CU_ASSERT_FATAL(ret <= burst); @@ -568,6 +617,12 @@ static void stash_default_put(uint32_t size, int32_t burst, stash_op_t op) CU_ASSERT_FATAL(output_u8[burst + 1] == MAGIC_U8); } + if (batch) { + CU_ASSERT(ret == 0 || ret == burst); + if (num_left - ret < burst) + burst = num_left - ret; + } + if (ret) { for (i = 0; i < ret; i++) { if (size == sizeof(uint64_t)) { @@ -597,13 +652,24 @@ static void stash_default_put(uint32_t size, int32_t burst, stash_op_t op) CU_ASSERT_FATAL(odp_stash_destroy(stash) == 0); } -static void stash_fifo_put(uint32_t size, int32_t burst, stash_op_t op) +static void stash_fifo_put(uint32_t size, int32_t burst, stash_op_t op, int batch) { odp_stash_t stash; odp_stash_param_t param; int32_t i, ret, retry, num_left; - int32_t num; + int32_t num, max_burst; void *input, *output; + + if (batch) { + CU_ASSERT_FATAL(global.capa_fifo.max_get_batch >= 1); + CU_ASSERT_FATAL(global.capa_fifo.max_put_batch >= 1); + + if (burst > (int32_t)global.capa_fifo.max_get_batch) + burst = global.capa_fifo.max_get_batch; + if (burst > (int32_t)global.capa_fifo.max_put_batch) + burst = global.capa_fifo.max_put_batch; + } + uint64_t input_u64[burst]; uint64_t output_u64[burst + 2]; uint32_t input_u32[burst]; @@ -645,7 +711,8 @@ static void stash_fifo_put(uint32_t size, int32_t burst, stash_op_t op) retry = MAX_RETRY; num_left = num; - while (num_left) { + max_burst = burst; + while (num_left > 0) { for (i = 0; i < burst; i++) { if (size == sizeof(uint64_t)) input_u64[i] = VAL_U64 + num_left - i; @@ -656,20 +723,40 @@ static void stash_fifo_put(uint32_t size, int32_t burst, stash_op_t op) else input_u8[i] = VAL_U8 + num_left - i; } - if (op == STASH_GEN) - ret = odp_stash_put(stash, input, burst); - else if (op == STASH_U32) - ret = odp_stash_put_u32(stash, input_u32, burst); - else if (op == STASH_U64) - ret = odp_stash_put_u64(stash, input_u64, burst); - else if (op == STASH_PTR) - ret = odp_stash_put_ptr(stash, input, burst); - else + if (op == STASH_GEN) { + if (batch) + ret = odp_stash_put_batch(stash, input, burst); + else + ret = odp_stash_put(stash, input, burst); + } else if (op == STASH_U32) { + if (batch) + ret = odp_stash_put_u32_batch(stash, input_u32, burst); + else + ret = odp_stash_put_u32(stash, input_u32, burst); + } else if (op == STASH_U64) { + if (batch) + ret = odp_stash_put_u64_batch(stash, input_u64, burst); + else + ret = odp_stash_put_u64(stash, input_u64, burst); + + } else if (op == STASH_PTR) { + if (batch) + ret = odp_stash_put_ptr_batch(stash, input, burst); + else + ret = odp_stash_put_ptr(stash, input, burst); + } else { ret = -1; + } CU_ASSERT_FATAL(ret >= 0); + CU_ASSERT_FATAL(ret <= burst); + + if (batch) { + CU_ASSERT(ret == 0 || ret == burst); + if (num_left - ret < burst) + burst = num_left - ret; + } if (ret) { - CU_ASSERT_FATAL(ret <= burst); num_left -= ret; retry = MAX_RETRY; } else { @@ -678,9 +765,10 @@ static void stash_fifo_put(uint32_t size, int32_t burst, stash_op_t op) } } + burst = max_burst; retry = MAX_RETRY; num_left = num; - while (num_left) { + while (num_left > 0) { memset(output, 0, burst * size); /* Init first and last array element for under-/overflow checking */ @@ -698,17 +786,31 @@ static void stash_fifo_put(uint32_t size, int32_t burst, stash_op_t op) output_u8[burst + 1] = MAGIC_U8; } - if (op == STASH_GEN) - ret = odp_stash_get(stash, output, burst); - else if (op == STASH_U32) - ret = odp_stash_get_u32(stash, &output_u32[1], burst); - else if (op == STASH_U64) - ret = odp_stash_get_u64(stash, &output_u64[1], burst); - else if (op == STASH_PTR) - ret = odp_stash_get_ptr(stash, output, burst); - else + if (op == STASH_GEN) { + if (batch) + ret = odp_stash_get_batch(stash, output, burst); + else + ret = odp_stash_get(stash, output, burst); + } else if (op == STASH_U32) { + if (batch) + ret = odp_stash_get_u32_batch(stash, &output_u32[1], burst); + else + ret = odp_stash_get_u32(stash, &output_u32[1], burst); + } else if (op == STASH_U64) { + if (batch) + ret = odp_stash_get_u64_batch(stash, &output_u64[1], burst); + else + ret = odp_stash_get_u64(stash, &output_u64[1], burst); + } else if (op == STASH_PTR) { + if (batch) + ret = odp_stash_get_ptr_batch(stash, output, burst); + else + ret = odp_stash_get_ptr(stash, output, burst); + } else { ret = -1; + } CU_ASSERT_FATAL(ret >= 0); + CU_ASSERT_FATAL(ret <= burst); if (size == sizeof(uint64_t)) { CU_ASSERT_FATAL(output_u64[0] == MAGIC_U64); @@ -724,8 +826,13 @@ static void stash_fifo_put(uint32_t size, int32_t burst, stash_op_t op) CU_ASSERT_FATAL(output_u8[burst + 1] == MAGIC_U8); } + if (batch) { + CU_ASSERT(ret == 0 || ret == burst); + if (num_left - ret < burst) + burst = num_left - ret; + } + if (ret) { - CU_ASSERT_FATAL(ret <= burst); for (i = 0; i < ret; i++) { if (size == sizeof(uint64_t)) { uint64_t val = VAL_U64 + num_left - i; @@ -805,142 +912,282 @@ static int check_support_fifo(void) static void stash_default_put_u64_1(void) { - stash_default_put(sizeof(uint64_t), 1, STASH_GEN); + stash_default_put(sizeof(uint64_t), 1, STASH_GEN, 0); } static void stash_default_put_u64_n(void) { - stash_default_put(sizeof(uint64_t), BURST, STASH_GEN); + stash_default_put(sizeof(uint64_t), BURST, STASH_GEN, 0); } static void stash_default_u64_put_u64_1(void) { - stash_default_put(sizeof(uint64_t), 1, STASH_U64); + stash_default_put(sizeof(uint64_t), 1, STASH_U64, 0); } static void stash_default_u64_put_u64_n(void) { - stash_default_put(sizeof(uint64_t), BURST, STASH_U64); + stash_default_put(sizeof(uint64_t), BURST, STASH_U64, 0); } static void stash_default_put_ptr_1(void) { - stash_default_put(sizeof(uintptr_t), 1, STASH_PTR); + stash_default_put(sizeof(uintptr_t), 1, STASH_PTR, 0); } static void stash_default_put_ptr_n(void) { - stash_default_put(sizeof(uintptr_t), BURST, STASH_PTR); + stash_default_put(sizeof(uintptr_t), BURST, STASH_PTR, 0); +} + +static void stash_default_put_u64_1_batch(void) +{ + stash_default_put(sizeof(uint64_t), 1, STASH_GEN, 1); +} + +static void stash_default_put_u64_n_batch(void) +{ + stash_default_put(sizeof(uint64_t), BATCH, STASH_GEN, 1); +} + +static void stash_default_u64_put_u64_1_batch(void) +{ + stash_default_put(sizeof(uint64_t), 1, STASH_U64, 1); +} + +static void stash_default_u64_put_u64_n_batch(void) +{ + stash_default_put(sizeof(uint64_t), BATCH, STASH_U64, 1); +} + +static void stash_default_put_ptr_1_batch(void) +{ + stash_default_put(sizeof(uintptr_t), 1, STASH_PTR, 1); +} + +static void stash_default_put_ptr_n_batch(void) +{ + stash_default_put(sizeof(uintptr_t), BATCH, STASH_PTR, 1); } static void stash_default_put_u32_1(void) { - stash_default_put(sizeof(uint32_t), 1, STASH_GEN); + stash_default_put(sizeof(uint32_t), 1, STASH_GEN, 0); } static void stash_default_put_u32_n(void) { - stash_default_put(sizeof(uint32_t), BURST, STASH_GEN); + stash_default_put(sizeof(uint32_t), BURST, STASH_GEN, 0); } static void stash_default_u32_put_u32_1(void) { - stash_default_put(sizeof(uint32_t), 1, STASH_U32); + stash_default_put(sizeof(uint32_t), 1, STASH_U32, 0); } static void stash_default_u32_put_u32_n(void) { - stash_default_put(sizeof(uint32_t), BURST, STASH_U32); + stash_default_put(sizeof(uint32_t), BURST, STASH_U32, 0); } static void stash_default_put_u16_1(void) { - stash_default_put(sizeof(uint16_t), 1, STASH_GEN); + stash_default_put(sizeof(uint16_t), 1, STASH_GEN, 0); } static void stash_default_put_u16_n(void) { - stash_default_put(sizeof(uint16_t), BURST, STASH_GEN); + stash_default_put(sizeof(uint16_t), BURST, STASH_GEN, 0); } static void stash_default_put_u8_1(void) { - stash_default_put(sizeof(uint8_t), 1, STASH_GEN); + stash_default_put(sizeof(uint8_t), 1, STASH_GEN, 0); } static void stash_default_put_u8_n(void) { - stash_default_put(sizeof(uint8_t), BURST, STASH_GEN); + stash_default_put(sizeof(uint8_t), BURST, STASH_GEN, 0); +} + +static void stash_default_put_u32_1_batch(void) +{ + stash_default_put(sizeof(uint32_t), 1, STASH_GEN, 1); +} + +static void stash_default_put_u32_n_batch(void) +{ + stash_default_put(sizeof(uint32_t), BATCH, STASH_GEN, 1); +} + +static void stash_default_u32_put_u32_1_batch(void) +{ + stash_default_put(sizeof(uint32_t), 1, STASH_U32, 1); +} + +static void stash_default_u32_put_u32_n_batch(void) +{ + stash_default_put(sizeof(uint32_t), BATCH, STASH_U32, 1); +} + +static void stash_default_put_u16_1_batch(void) +{ + stash_default_put(sizeof(uint16_t), 1, STASH_GEN, 1); +} + +static void stash_default_put_u16_n_batch(void) +{ + stash_default_put(sizeof(uint16_t), BATCH, STASH_GEN, 1); +} + +static void stash_default_put_u8_1_batch(void) +{ + stash_default_put(sizeof(uint8_t), 1, STASH_GEN, 1); +} + +static void stash_default_put_u8_n_batch(void) +{ + stash_default_put(sizeof(uint8_t), BATCH, STASH_GEN, 1); } static void stash_fifo_put_u64_1(void) { - stash_fifo_put(sizeof(uint64_t), 1, STASH_GEN); + stash_fifo_put(sizeof(uint64_t), 1, STASH_GEN, 0); } static void stash_fifo_put_u64_n(void) { - stash_fifo_put(sizeof(uint64_t), BURST, STASH_GEN); + stash_fifo_put(sizeof(uint64_t), BURST, STASH_GEN, 0); } static void stash_fifo_u64_put_u64_1(void) { - stash_fifo_put(sizeof(uint64_t), 1, STASH_U64); + stash_fifo_put(sizeof(uint64_t), 1, STASH_U64, 0); } static void stash_fifo_u64_put_u64_n(void) { - stash_fifo_put(sizeof(uint64_t), BURST, STASH_U64); + stash_fifo_put(sizeof(uint64_t), BURST, STASH_U64, 0); } static void stash_fifo_put_ptr_1(void) { - stash_fifo_put(sizeof(uintptr_t), 1, STASH_PTR); + stash_fifo_put(sizeof(uintptr_t), 1, STASH_PTR, 0); } static void stash_fifo_put_ptr_n(void) { - stash_fifo_put(sizeof(uintptr_t), BURST, STASH_PTR); + stash_fifo_put(sizeof(uintptr_t), BURST, STASH_PTR, 0); } static void stash_fifo_put_u32_1(void) { - stash_fifo_put(sizeof(uint32_t), 1, STASH_GEN); + stash_fifo_put(sizeof(uint32_t), 1, STASH_GEN, 0); } static void stash_fifo_put_u32_n(void) { - stash_fifo_put(sizeof(uint32_t), BURST, STASH_GEN); + stash_fifo_put(sizeof(uint32_t), BURST, STASH_GEN, 0); } static void stash_fifo_u32_put_u32_1(void) { - stash_fifo_put(sizeof(uint32_t), 1, STASH_U32); + stash_fifo_put(sizeof(uint32_t), 1, STASH_U32, 0); } static void stash_fifo_u32_put_u32_n(void) { - stash_fifo_put(sizeof(uint32_t), BURST, STASH_U32); + stash_fifo_put(sizeof(uint32_t), BURST, STASH_U32, 0); } static void stash_fifo_put_u16_1(void) { - stash_fifo_put(sizeof(uint16_t), 1, STASH_GEN); + stash_fifo_put(sizeof(uint16_t), 1, STASH_GEN, 0); } static void stash_fifo_put_u16_n(void) { - stash_fifo_put(sizeof(uint16_t), BURST, STASH_GEN); + stash_fifo_put(sizeof(uint16_t), BURST, STASH_GEN, 0); } static void stash_fifo_put_u8_1(void) { - stash_fifo_put(sizeof(uint8_t), 1, STASH_GEN); + stash_fifo_put(sizeof(uint8_t), 1, STASH_GEN, 0); } static void stash_fifo_put_u8_n(void) { - stash_fifo_put(sizeof(uint8_t), BURST, STASH_GEN); + stash_fifo_put(sizeof(uint8_t), BURST, STASH_GEN, 0); +} + +static void stash_fifo_put_u64_1_batch(void) +{ + stash_fifo_put(sizeof(uint64_t), 1, STASH_GEN, 1); +} + +static void stash_fifo_put_u64_n_batch(void) +{ + stash_fifo_put(sizeof(uint64_t), BATCH, STASH_GEN, 1); +} + +static void stash_fifo_u64_put_u64_1_batch(void) +{ + stash_fifo_put(sizeof(uint64_t), 1, STASH_U64, 1); +} + +static void stash_fifo_u64_put_u64_n_batch(void) +{ + stash_fifo_put(sizeof(uint64_t), BATCH, STASH_U64, 1); +} + +static void stash_fifo_put_ptr_1_batch(void) +{ + stash_fifo_put(sizeof(uintptr_t), 1, STASH_PTR, 1); +} + +static void stash_fifo_put_ptr_n_batch(void) +{ + stash_fifo_put(sizeof(uintptr_t), BATCH, STASH_PTR, 1); +} + +static void stash_fifo_put_u32_1_batch(void) +{ + stash_fifo_put(sizeof(uint32_t), 1, STASH_GEN, 1); +} + +static void stash_fifo_put_u32_n_batch(void) +{ + stash_fifo_put(sizeof(uint32_t), BATCH, STASH_GEN, 1); +} + +static void stash_fifo_u32_put_u32_1_batch(void) +{ + stash_fifo_put(sizeof(uint32_t), 1, STASH_U32, 1); +} + +static void stash_fifo_u32_put_u32_n_batch(void) +{ + stash_fifo_put(sizeof(uint32_t), BATCH, STASH_U32, 1); +} + +static void stash_fifo_put_u16_1_batch(void) +{ + stash_fifo_put(sizeof(uint16_t), 1, STASH_GEN, 1); +} + +static void stash_fifo_put_u16_n_batch(void) +{ + stash_fifo_put(sizeof(uint16_t), BATCH, STASH_GEN, 1); +} + +static void stash_fifo_put_u8_1_batch(void) +{ + stash_fifo_put(sizeof(uint8_t), 1, STASH_GEN, 1); +} + +static void stash_fifo_put_u8_n_batch(void) +{ + stash_fifo_put(sizeof(uint8_t), BATCH, STASH_GEN, 1); } odp_testinfo_t stash_suite[] = { @@ -954,6 +1201,12 @@ odp_testinfo_t stash_suite[] = { ODP_TEST_INFO_CONDITIONAL(stash_default_u64_put_u64_n, check_support_64), ODP_TEST_INFO_CONDITIONAL(stash_default_put_ptr_1, check_support_ptr), ODP_TEST_INFO_CONDITIONAL(stash_default_put_ptr_n, check_support_ptr), + ODP_TEST_INFO_CONDITIONAL(stash_default_put_u64_1_batch, check_support_64), + ODP_TEST_INFO_CONDITIONAL(stash_default_put_u64_n_batch, check_support_64), + ODP_TEST_INFO_CONDITIONAL(stash_default_u64_put_u64_1_batch, check_support_64), + ODP_TEST_INFO_CONDITIONAL(stash_default_u64_put_u64_n_batch, check_support_64), + ODP_TEST_INFO_CONDITIONAL(stash_default_put_ptr_1_batch, check_support_ptr), + ODP_TEST_INFO_CONDITIONAL(stash_default_put_ptr_n_batch, check_support_ptr), ODP_TEST_INFO(stash_default_put_u32_1), ODP_TEST_INFO(stash_default_put_u32_n), ODP_TEST_INFO(stash_default_u32_put_u32_1), @@ -962,6 +1215,14 @@ odp_testinfo_t stash_suite[] = { ODP_TEST_INFO(stash_default_put_u16_n), ODP_TEST_INFO(stash_default_put_u8_1), ODP_TEST_INFO(stash_default_put_u8_n), + ODP_TEST_INFO(stash_default_put_u32_1_batch), + ODP_TEST_INFO(stash_default_put_u32_n_batch), + ODP_TEST_INFO(stash_default_u32_put_u32_1_batch), + ODP_TEST_INFO(stash_default_u32_put_u32_n_batch), + ODP_TEST_INFO(stash_default_put_u16_1_batch), + ODP_TEST_INFO(stash_default_put_u16_n_batch), + ODP_TEST_INFO(stash_default_put_u8_1_batch), + ODP_TEST_INFO(stash_default_put_u8_n_batch), ODP_TEST_INFO_CONDITIONAL(stash_create_u64_all, check_support_64), ODP_TEST_INFO(stash_create_u32_all), ODP_TEST_INFO(stash_stats_u32), @@ -979,6 +1240,20 @@ odp_testinfo_t stash_suite[] = { ODP_TEST_INFO_CONDITIONAL(stash_fifo_put_u16_n, check_support_fifo), ODP_TEST_INFO_CONDITIONAL(stash_fifo_put_u8_1, check_support_fifo), ODP_TEST_INFO_CONDITIONAL(stash_fifo_put_u8_n, check_support_fifo), + ODP_TEST_INFO_CONDITIONAL(stash_fifo_put_u64_1_batch, check_support_fifo_64), + ODP_TEST_INFO_CONDITIONAL(stash_fifo_put_u64_n_batch, check_support_fifo_64), + ODP_TEST_INFO_CONDITIONAL(stash_fifo_u64_put_u64_1_batch, check_support_fifo_64), + ODP_TEST_INFO_CONDITIONAL(stash_fifo_u64_put_u64_n_batch, check_support_fifo_64), + ODP_TEST_INFO_CONDITIONAL(stash_fifo_put_ptr_1_batch, check_support_fifo_ptr), + ODP_TEST_INFO_CONDITIONAL(stash_fifo_put_ptr_n_batch, check_support_fifo_ptr), + ODP_TEST_INFO_CONDITIONAL(stash_fifo_put_u32_1_batch, check_support_fifo), + ODP_TEST_INFO_CONDITIONAL(stash_fifo_put_u32_n_batch, check_support_fifo), + ODP_TEST_INFO_CONDITIONAL(stash_fifo_u32_put_u32_1_batch, check_support_fifo), + ODP_TEST_INFO_CONDITIONAL(stash_fifo_u32_put_u32_n_batch, check_support_fifo), + ODP_TEST_INFO_CONDITIONAL(stash_fifo_put_u16_1_batch, check_support_fifo), + ODP_TEST_INFO_CONDITIONAL(stash_fifo_put_u16_n_batch, check_support_fifo), + ODP_TEST_INFO_CONDITIONAL(stash_fifo_put_u8_1_batch, check_support_fifo), + ODP_TEST_INFO_CONDITIONAL(stash_fifo_put_u8_n_batch, check_support_fifo), ODP_TEST_INFO_CONDITIONAL(stash_create_fifo_u64_all, check_support_fifo_64), ODP_TEST_INFO_CONDITIONAL(stash_create_fifo_u32_all, diff --git a/test/validation/api/thread/thread.c b/test/validation/api/thread/thread.c index f279dd16f..2dc799c2a 100644 --- a/test/validation/api/thread/thread.c +++ b/test/validation/api/thread/thread.c @@ -16,6 +16,9 @@ typedef struct { /* Test thread entry and exit synchronization barriers */ odp_barrier_t bar_entry; odp_barrier_t bar_exit; + + /* Storage for thread ID assignment order test */ + int thread_id[ODP_THREAD_COUNT_MAX]; } global_shared_mem_t; static global_shared_mem_t *global_mem; @@ -89,6 +92,9 @@ static void thread_test_odp_thread_id(void) { int id = odp_thread_id(); + /* First thread which called odp_init_local() */ + CU_ASSERT(id == 0); + CU_ASSERT(id >= 0); CU_ASSERT(id < odp_thread_count_max()); CU_ASSERT(id < ODP_THREAD_COUNT_MAX); @@ -107,14 +113,22 @@ static void thread_test_odp_thread_count(void) CU_ASSERT(odp_thread_count_max() <= ODP_THREAD_COUNT_MAX); } -static int thread_func(void *arg ODP_UNUSED) +static int thread_func(void *arg) { - /* indicate that thread has started */ + int *id_ptr = arg; + + /* Indicate that thread has started */ odp_barrier_wait(&global_mem->bar_entry); + /* Record thread identifier for ID assignment order check */ + *id_ptr = odp_thread_id(); + + CU_ASSERT(*id_ptr > 0); + CU_ASSERT(*id_ptr < odp_thread_count_max()); + CU_ASSERT(odp_thread_type() == ODP_THREAD_WORKER); - /* wait for indication that we can exit */ + /* Wait for indication that we can exit */ odp_barrier_wait(&global_mem->bar_exit); return CU_get_number_of_failures(); @@ -124,10 +138,22 @@ static void thread_test_odp_thrmask_worker(void) { odp_thrmask_t mask; int ret; - int num = 1; + int num = odp_cpumask_default_worker(NULL, 0); + CU_ASSERT_FATAL(num > 0); CU_ASSERT_FATAL(odp_thread_type() == ODP_THREAD_CONTROL); + /* Control and worker threads may share CPUs */ + if (num > 1) + num--; + + void *args[num]; + + for (int i = 0; i < num; i++) { + global_mem->thread_id[i] = -1; + args[i] = &global_mem->thread_id[i]; + } + odp_barrier_init(&global_mem->bar_entry, num + 1); odp_barrier_init(&global_mem->bar_exit, num + 1); @@ -137,7 +163,7 @@ static void thread_test_odp_thrmask_worker(void) CU_ASSERT(ret == 0); /* start the test thread(s) */ - ret = odp_cunit_thread_create(num, thread_func, NULL, 0); + ret = odp_cunit_thread_create(num, thread_func, args, 1, 1); CU_ASSERT(ret == num); if (ret != num) @@ -154,6 +180,10 @@ static void thread_test_odp_thrmask_worker(void) /* allow thread(s) to exit */ odp_barrier_wait(&global_mem->bar_exit); + /* Thread ID 0 is used by this control thread */ + for (int i = 0; i < num; i++) + CU_ASSERT(global_mem->thread_id[i] == i + 1); + odp_cunit_thread_join(num); } diff --git a/test/validation/api/timer/timer.c b/test/validation/api/timer/timer.c index bf0fd3baf..1c0a16349 100644 --- a/test/validation/api/timer/timer.c +++ b/test/validation/api/timer/timer.c @@ -33,6 +33,7 @@ #define EXTRA_TIMERS 256 #define NAME "timer_pool" +#define MSEC ODP_TIME_MSEC_IN_NS #define THREE_POINT_THREE_MSEC (10 * ODP_TIME_MSEC_IN_NS / 3) #define USER_PTR ((void *)0xdead) #define TICK_INVALID (~(uint64_t)0) @@ -40,10 +41,19 @@ /* Test case options */ #define PRIV 1 #define EXP_RELAX 1 -#define WAIT 0 -#define CANCEL 1 -#define RESTART 1 #define FIRST_TICK 1 +#define RELATIVE ODP_TIMER_TICK_REL +#define ABSOLUTE ODP_TIMER_TICK_ABS + +enum { + TIMEOUT = 0, + CANCEL +}; + +enum { + START = 0, + RESTART +}; /* Timer helper structure */ struct test_timer { @@ -441,6 +451,62 @@ static void timer_test_timeout_pool_free(void) CU_ASSERT(odp_pool_destroy(pool) == 0); } +static void timer_test_timeout_user_area(void) +{ + odp_pool_t pool; + odp_pool_capability_t pool_capa; + odp_pool_param_t param; + uint32_t i, max_size; + void *addr; + void *prev = NULL; + const uint32_t num = 10; + uint32_t num_alloc = 0; + uint32_t size = 1024; + odp_timeout_t tmo[num]; + + CU_ASSERT_FATAL(!odp_pool_capability(&pool_capa)); + max_size = pool_capa.tmo.max_uarea_size; + + if (max_size == 0) { + ODPH_DBG("Timeout user area not supported\n"); + return; + } + + if (size > max_size) + size = max_size; + + odp_pool_param_init(¶m); + param.type = ODP_POOL_TIMEOUT; + param.tmo.num = num; + param.tmo.uarea_size = size; + + pool = odp_pool_create("test_user_area", ¶m); + CU_ASSERT_FATAL(pool != ODP_POOL_INVALID); + + for (i = 0; i < num; i++) { + tmo[i] = odp_timeout_alloc(pool); + + if (tmo[i] == ODP_TIMEOUT_INVALID) + break; + + num_alloc++; + + addr = odp_timeout_user_area(tmo[i]); + CU_ASSERT_FATAL(addr != NULL); + CU_ASSERT(prev != addr); + + prev = addr; + memset(addr, 0, size); + } + + CU_ASSERT(i == num); + + for (i = 0; i < num_alloc; i++) + odp_timeout_free(tmo[i]); + + CU_ASSERT_FATAL(odp_pool_destroy(pool) == 0); +} + static void timer_pool_create_destroy(void) { odp_timer_pool_param_t tparam; @@ -729,9 +795,10 @@ static void free_schedule_context(odp_queue_type_t queue_type) } static void timer_single_shot(odp_queue_type_t queue_type, odp_timer_tick_type_t tick_type, - int restart, int cancel) + int restart, int cancel, int rounds, uint64_t tmo_ns) { odp_timer_capability_t capa; + odp_timer_res_capability_t res_capa; odp_timer_pool_param_t tp_param; odp_queue_param_t queue_param; odp_pool_param_t pool_param; @@ -743,20 +810,36 @@ static void timer_single_shot(odp_queue_type_t queue_type, odp_timer_tick_type_t odp_timeout_t tmo; odp_event_t ev; odp_time_t t1, t2; - uint64_t tick, nsec; - int ret; - uint64_t tmo_ns = ODP_TIME_SEC_IN_NS; - uint64_t res_ns = ODP_TIME_SEC_IN_NS / 10; + uint64_t tick, nsec, res_ns, min_tmo; + int ret, i; memset(&capa, 0, sizeof(capa)); ret = odp_timer_capability(ODP_CLOCK_DEFAULT, &capa); CU_ASSERT_FATAL(ret == 0); CU_ASSERT_FATAL(capa.max_tmo.max_tmo > 0); - if (capa.max_tmo.max_tmo < tmo_ns) { + /* Use timeout and resolution values that are within capability limits */ + if (capa.max_tmo.max_tmo < tmo_ns) tmo_ns = capa.max_tmo.max_tmo; - res_ns = capa.max_tmo.res_ns; - } + + memset(&res_capa, 0, sizeof(res_capa)); + res_capa.max_tmo = tmo_ns; + + ret = odp_timer_res_capability(ODP_CLOCK_DEFAULT, &res_capa); + CU_ASSERT_FATAL(ret == 0); + CU_ASSERT_FATAL(res_capa.res_ns > 0); + + res_ns = tmo_ns / 10; + + if (res_ns < res_capa.res_ns) + res_ns = res_capa.res_ns; + + /* Test expects better resolution than 0.5x timeout */ + CU_ASSERT_FATAL(res_ns < tmo_ns / 2); + + min_tmo = tmo_ns / 4; + if (min_tmo < res_capa.min_tmo) + min_tmo = res_capa.min_tmo; odp_pool_param_init(&pool_param); pool_param.type = ODP_POOL_TIMEOUT; @@ -776,7 +859,7 @@ static void timer_single_shot(odp_queue_type_t queue_type, odp_timer_tick_type_t odp_timer_pool_param_init(&tp_param); tp_param.res_ns = res_ns; - tp_param.min_tmo = tmo_ns / 4; + tp_param.min_tmo = min_tmo; tp_param.max_tmo = tmo_ns; tp_param.num_timers = 1; @@ -796,67 +879,73 @@ static void timer_single_shot(odp_queue_type_t queue_type, odp_timer_tick_type_t if (restart) nsec = tmo_ns / 2; - tick = odp_timer_ns_to_tick(tp, nsec); - if (tick_type == ODP_TIMER_TICK_ABS) - tick += odp_timer_current_tick(tp); - - start_param.tick_type = tick_type; - start_param.tick = tick; - start_param.tmo_ev = ev; - - ret = odp_timer_start(timer, &start_param); - CU_ASSERT_FATAL(ret == ODP_TIMER_SUCCESS); - - if (restart) { - tick = odp_timer_ns_to_tick(tp, tmo_ns); + for (i = 0; i < rounds; i++) { + tick = odp_timer_ns_to_tick(tp, nsec); if (tick_type == ODP_TIMER_TICK_ABS) tick += odp_timer_current_tick(tp); - start_param.tick = tick; - start_param.tmo_ev = ODP_EVENT_INVALID; + start_param.tick_type = tick_type; + start_param.tick = tick; + start_param.tmo_ev = ev; - ret = odp_timer_restart(timer, &start_param); + ret = odp_timer_start(timer, &start_param); CU_ASSERT_FATAL(ret == ODP_TIMER_SUCCESS); - } - ev = ODP_EVENT_INVALID; + if (restart) { + tick = odp_timer_ns_to_tick(tp, tmo_ns); + if (tick_type == ODP_TIMER_TICK_ABS) + tick += odp_timer_current_tick(tp); - if (cancel) { - ret = odp_timer_cancel(timer, &ev); - CU_ASSERT(ret == 0); + start_param.tick = tick; + start_param.tmo_ev = ODP_EVENT_INVALID; - if (ret == 0) - CU_ASSERT(ev != ODP_EVENT_INVALID); - } else { - uint64_t diff_ns; + ret = odp_timer_restart(timer, &start_param); + CU_ASSERT_FATAL(ret == ODP_TIMER_SUCCESS); + } - t1 = odp_time_global(); - ev = wait_event(queue_type, queue, t1, 10 * tmo_ns); - t2 = odp_time_global(); - diff_ns = odp_time_diff_ns(t2, t1); + ev = ODP_EVENT_INVALID; - CU_ASSERT(ev != ODP_EVENT_INVALID); - CU_ASSERT(diff_ns < 2 * tmo_ns); - CU_ASSERT((double)diff_ns > 0.5 * tmo_ns); - } + if (cancel) { + ret = odp_timer_cancel(timer, &ev); + CU_ASSERT(ret == 0); - if (ev != ODP_EVENT_INVALID) { - CU_ASSERT_FATAL(odp_event_type(ev) == ODP_EVENT_TIMEOUT); - tmo = odp_timeout_from_event(ev); - CU_ASSERT(odp_timeout_user_ptr(tmo) == USER_PTR); - CU_ASSERT(odp_timeout_timer(tmo) == timer); + if (ret == 0) + CU_ASSERT(ev != ODP_EVENT_INVALID); + } else { + uint64_t diff_ns; - if (!cancel) { - if (tick_type == ODP_TIMER_TICK_ABS) { - /* CU_ASSERT needs these extra brackets */ - CU_ASSERT(odp_timeout_tick(tmo) == tick); - } else { - CU_ASSERT(odp_timeout_tick(tmo) > tick); + t1 = odp_time_global(); + ev = wait_event(queue_type, queue, t1, 10 * tmo_ns); + t2 = odp_time_global(); + diff_ns = odp_time_diff_ns(t2, t1); + + CU_ASSERT(ev != ODP_EVENT_INVALID); + CU_ASSERT(diff_ns < 2 * tmo_ns); + CU_ASSERT((double)diff_ns > 0.5 * tmo_ns); + } + + if (ev != ODP_EVENT_INVALID) { + CU_ASSERT_FATAL(odp_event_type(ev) == ODP_EVENT_TIMEOUT); + tmo = odp_timeout_from_event(ev); + CU_ASSERT(odp_timeout_user_ptr(tmo) == USER_PTR); + CU_ASSERT(odp_timeout_timer(tmo) == timer); + + if (!cancel) { + if (tick_type == ODP_TIMER_TICK_ABS) { + /* CU_ASSERT needs these extra brackets */ + CU_ASSERT(odp_timeout_tick(tmo) == tick); + } else { + CU_ASSERT(odp_timeout_tick(tmo) > tick); + } } + } else { + ODPH_DBG("Event missing\n"); + break; } + } + if (ev != ODP_EVENT_INVALID) odp_event_free(ev); - } free_schedule_context(queue_type); @@ -869,82 +958,92 @@ static void timer_single_shot(odp_queue_type_t queue_type, odp_timer_tick_type_t static void timer_plain_rel_wait(void) { - timer_single_shot(ODP_QUEUE_TYPE_PLAIN, ODP_TIMER_TICK_REL, 0, WAIT); + timer_single_shot(ODP_QUEUE_TYPE_PLAIN, RELATIVE, START, TIMEOUT, 2, 500 * MSEC); } static void timer_plain_abs_wait(void) { - timer_single_shot(ODP_QUEUE_TYPE_PLAIN, ODP_TIMER_TICK_ABS, 0, WAIT); + timer_single_shot(ODP_QUEUE_TYPE_PLAIN, ABSOLUTE, START, TIMEOUT, 2, 500 * MSEC); } static void timer_plain_rel_cancel(void) { - timer_single_shot(ODP_QUEUE_TYPE_PLAIN, ODP_TIMER_TICK_REL, 0, CANCEL); + timer_single_shot(ODP_QUEUE_TYPE_PLAIN, RELATIVE, START, CANCEL, 5, 1000 * MSEC); } static void timer_plain_abs_cancel(void) { - timer_single_shot(ODP_QUEUE_TYPE_PLAIN, ODP_TIMER_TICK_ABS, 0, CANCEL); + timer_single_shot(ODP_QUEUE_TYPE_PLAIN, ABSOLUTE, START, CANCEL, 5, 1000 * MSEC); } static void timer_plain_rel_restart_wait(void) { - timer_single_shot(ODP_QUEUE_TYPE_PLAIN, ODP_TIMER_TICK_REL, RESTART, WAIT); + timer_single_shot(ODP_QUEUE_TYPE_PLAIN, RELATIVE, RESTART, TIMEOUT, 2, 600 * MSEC); } static void timer_plain_abs_restart_wait(void) { - timer_single_shot(ODP_QUEUE_TYPE_PLAIN, ODP_TIMER_TICK_ABS, RESTART, WAIT); + timer_single_shot(ODP_QUEUE_TYPE_PLAIN, ABSOLUTE, RESTART, TIMEOUT, 2, 600 * MSEC); } static void timer_plain_rel_restart_cancel(void) { - timer_single_shot(ODP_QUEUE_TYPE_PLAIN, ODP_TIMER_TICK_REL, RESTART, CANCEL); + timer_single_shot(ODP_QUEUE_TYPE_PLAIN, RELATIVE, RESTART, CANCEL, 5, 1000 * MSEC); } static void timer_plain_abs_restart_cancel(void) { - timer_single_shot(ODP_QUEUE_TYPE_PLAIN, ODP_TIMER_TICK_ABS, RESTART, CANCEL); + timer_single_shot(ODP_QUEUE_TYPE_PLAIN, ABSOLUTE, RESTART, CANCEL, 5, 1000 * MSEC); +} + +static void timer_plain_abs_wait_3sec(void) +{ + timer_single_shot(ODP_QUEUE_TYPE_PLAIN, ABSOLUTE, START, TIMEOUT, 30, 110 * MSEC); } static void timer_sched_rel_wait(void) { - timer_single_shot(ODP_QUEUE_TYPE_SCHED, ODP_TIMER_TICK_REL, 0, WAIT); + timer_single_shot(ODP_QUEUE_TYPE_SCHED, RELATIVE, START, TIMEOUT, 2, 500 * MSEC); } static void timer_sched_abs_wait(void) { - timer_single_shot(ODP_QUEUE_TYPE_SCHED, ODP_TIMER_TICK_ABS, 0, WAIT); + timer_single_shot(ODP_QUEUE_TYPE_SCHED, ABSOLUTE, START, TIMEOUT, 2, 500 * MSEC); } static void timer_sched_rel_cancel(void) { - timer_single_shot(ODP_QUEUE_TYPE_SCHED, ODP_TIMER_TICK_REL, 0, CANCEL); + timer_single_shot(ODP_QUEUE_TYPE_SCHED, RELATIVE, START, CANCEL, 5, 1000 * MSEC); } static void timer_sched_abs_cancel(void) { - timer_single_shot(ODP_QUEUE_TYPE_SCHED, ODP_TIMER_TICK_ABS, 0, CANCEL); + timer_single_shot(ODP_QUEUE_TYPE_SCHED, ABSOLUTE, START, CANCEL, 5, 1000 * MSEC); } static void timer_sched_rel_restart_wait(void) { - timer_single_shot(ODP_QUEUE_TYPE_SCHED, ODP_TIMER_TICK_REL, RESTART, WAIT); + timer_single_shot(ODP_QUEUE_TYPE_SCHED, RELATIVE, RESTART, TIMEOUT, 2, 600 * MSEC); } static void timer_sched_abs_restart_wait(void) { - timer_single_shot(ODP_QUEUE_TYPE_SCHED, ODP_TIMER_TICK_ABS, RESTART, WAIT); + timer_single_shot(ODP_QUEUE_TYPE_SCHED, ABSOLUTE, RESTART, TIMEOUT, 2, 600 * MSEC); } static void timer_sched_rel_restart_cancel(void) { - timer_single_shot(ODP_QUEUE_TYPE_SCHED, ODP_TIMER_TICK_REL, RESTART, CANCEL); + timer_single_shot(ODP_QUEUE_TYPE_SCHED, RELATIVE, RESTART, CANCEL, 5, 1000 * MSEC); } static void timer_sched_abs_restart_cancel(void) { - timer_single_shot(ODP_QUEUE_TYPE_SCHED, ODP_TIMER_TICK_ABS, RESTART, CANCEL); + timer_single_shot(ODP_QUEUE_TYPE_SCHED, ABSOLUTE, RESTART, CANCEL, 5, 1000 * MSEC); +} + +static void timer_sched_abs_wait_3sec(void) +{ + timer_single_shot(ODP_QUEUE_TYPE_SCHED, ABSOLUTE, START, TIMEOUT, 30, 110 * MSEC); } static void timer_pool_tick_info_run(odp_timer_clk_src_t clk_src) @@ -2200,7 +2299,7 @@ static void timer_test_all(odp_queue_type_t queue_type) /* Create and start worker threads */ global_mem->test_queue_type = queue_type; - odp_cunit_thread_create(num_workers, worker_entrypoint, NULL, 0); + odp_cunit_thread_create(num_workers, worker_entrypoint, NULL, 0, 0); /* Wait for worker threads to exit */ odp_cunit_thread_join(num_workers); @@ -2503,6 +2602,7 @@ odp_testinfo_t timer_suite[] = { ODP_TEST_INFO(timer_test_param_init), ODP_TEST_INFO(timer_test_timeout_pool_alloc), ODP_TEST_INFO(timer_test_timeout_pool_free), + ODP_TEST_INFO(timer_test_timeout_user_area), ODP_TEST_INFO(timer_pool_create_destroy), ODP_TEST_INFO(timer_pool_create_max), ODP_TEST_INFO(timer_pool_max_res), @@ -2515,6 +2615,7 @@ odp_testinfo_t timer_suite[] = { ODP_TEST_INFO_CONDITIONAL(timer_plain_abs_restart_wait, check_plain_queue_support), ODP_TEST_INFO_CONDITIONAL(timer_plain_rel_restart_cancel, check_plain_queue_support), ODP_TEST_INFO_CONDITIONAL(timer_plain_abs_restart_cancel, check_plain_queue_support), + ODP_TEST_INFO_CONDITIONAL(timer_plain_abs_wait_3sec, check_plain_queue_support), ODP_TEST_INFO_CONDITIONAL(timer_sched_rel_wait, check_sched_queue_support), ODP_TEST_INFO_CONDITIONAL(timer_sched_abs_wait, check_sched_queue_support), ODP_TEST_INFO_CONDITIONAL(timer_sched_rel_cancel, check_sched_queue_support), @@ -2523,6 +2624,7 @@ odp_testinfo_t timer_suite[] = { ODP_TEST_INFO_CONDITIONAL(timer_sched_abs_restart_wait, check_sched_queue_support), ODP_TEST_INFO_CONDITIONAL(timer_sched_rel_restart_cancel, check_sched_queue_support), ODP_TEST_INFO_CONDITIONAL(timer_sched_abs_restart_cancel, check_sched_queue_support), + ODP_TEST_INFO_CONDITIONAL(timer_sched_abs_wait_3sec, check_sched_queue_support), ODP_TEST_INFO_CONDITIONAL(timer_test_tmo_event_plain, check_plain_queue_support), ODP_TEST_INFO_CONDITIONAL(timer_test_tmo_event_sched, |