diff options
author | Matias Elo <matias.elo@nokia.com> | 2022-05-25 12:50:34 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-25 12:50:34 +0300 |
commit | 9951d549ce6c8dec08af9ab04ae2bd61cf489855 (patch) | |
tree | 50c987b4844596abe30134000c4a77ad469cd0ee /test/validation/api/classification | |
parent | 2f869d2698349bf75ec2404d4ab7d7f3b5b4c88b (diff) | |
parent | 62c95b2e71aab0e3af543e0df55ebf14ea306a11 (diff) |
Merge ODP v1.36.0.0v1.36.0.0_DPDK_19.11
Merge ODP linux-generic v1.36.0.0 into linux-dpdk
Diffstat (limited to 'test/validation/api/classification')
4 files changed, 130 insertions, 1 deletions
diff --git a/test/validation/api/classification/classification.h b/test/validation/api/classification/classification.h index 4c8613555..70dcc6230 100644 --- a/test/validation/api/classification/classification.h +++ b/test/validation/api/classification/classification.h @@ -23,6 +23,11 @@ #define CLS_DEFAULT_SMAC {0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c} #define CLS_MAGIC_VAL 0xdeadbeef +/* Config values for Drop CoS */ +#define TEST_DROP 1 +#define CLS_DROP 6 +#define CLS_DROP_PORT 4001 + /* Config values for Error CoS */ #define TEST_ERROR 1 #define CLS_ERROR 1 @@ -47,7 +52,7 @@ /* Config values for CoS L2 Priority */ #define TEST_L2_QOS 1 -#define CLS_L2_QOS_0 6 +#define CLS_L2_QOS_0 7 #define CLS_L2_QOS_MAX 5 #define CLS_ENTRIES (CLS_L2_QOS_0 + CLS_L2_QOS_MAX) diff --git a/test/validation/api/classification/odp_classification_basic.c b/test/validation/api/classification/odp_classification_basic.c index 3aeb89462..fb5ec4ed0 100644 --- a/test/validation/api/classification/odp_classification_basic.c +++ b/test/validation/api/classification/odp_classification_basic.c @@ -52,6 +52,49 @@ static void classification_test_create_cos(void) odp_queue_destroy(queue); } +static void classification_test_create_cos_max_common(odp_bool_t stats) +{ + uint32_t i; + odp_cls_cos_param_t cls_param; + odp_cls_capability_t capa; + + CU_ASSERT_FATAL(odp_cls_capability(&capa) == 0); + + uint32_t num = capa.max_cos; + + if (stats && capa.max_cos_stats < num) + num = capa.max_cos_stats; + + odp_cos_t cos[num]; + + for (i = 0; i < num; i++) { + odp_cls_cos_param_init(&cls_param); + cls_param.action = ODP_COS_ACTION_DROP; + cls_param.stats_enable = stats; + + cos[i] = odp_cls_cos_create(NULL, &cls_param); + if (cos[i] == ODP_COS_INVALID) { + ODPH_ERR("odp_cls_cos_create() failed at CoS %u out of %u.\n", i + 1, num); + break; + } + } + + CU_ASSERT(i == num); + + for (uint32_t j = 0; j < i; j++) + CU_ASSERT(!odp_cos_destroy(cos[j])); +} + +static void classification_test_create_cos_max(void) +{ + classification_test_create_cos_max_common(false); +} + +static void classification_test_create_cos_max_stats(void) +{ + classification_test_create_cos_max_common(true); +} + static void classification_test_destroy_cos(void) { odp_cos_t cos; @@ -345,6 +388,8 @@ static void classification_test_pmr_composite_create(void) odp_testinfo_t classification_suite_basic[] = { ODP_TEST_INFO(classification_test_default_values), ODP_TEST_INFO(classification_test_create_cos), + ODP_TEST_INFO(classification_test_create_cos_max), + ODP_TEST_INFO(classification_test_create_cos_max_stats), ODP_TEST_INFO(classification_test_destroy_cos), ODP_TEST_INFO(classification_test_create_pmr_match), ODP_TEST_INFO(classification_test_cos_set_queue), diff --git a/test/validation/api/classification/odp_classification_tests.c b/test/validation/api/classification/odp_classification_tests.c index 41b4ab02f..4511fc1d7 100644 --- a/test/validation/api/classification/odp_classification_tests.c +++ b/test/validation/api/classification/odp_classification_tests.c @@ -23,6 +23,7 @@ static int global_num_l2_qos; #define NUM_COS_PMR_CHAIN 2 #define NUM_COS_DEFAULT 1 +#define NUM_COS_DROP 1 #define NUM_COS_ERROR 1 #define NUM_COS_L2_PRIO CLS_L2_QOS_MAX #define NUM_COS_PMR 1 @@ -453,6 +454,74 @@ void test_pktio_default_cos(odp_bool_t enable_pktv) odp_packet_free(pkt); } +void configure_pktio_drop_cos(odp_bool_t enable_pktv, uint32_t max_cos_stats) +{ + uint16_t val; + uint16_t mask; + odp_pmr_param_t pmr_param; + odp_cls_cos_param_t cls_param; + char cosname[ODP_COS_NAME_LEN]; + + sprintf(cosname, "DropCoS"); + odp_cls_cos_param_init(&cls_param); + + cls_param.action = ODP_COS_ACTION_DROP; + cls_param.stats_enable = max_cos_stats > 0; + + if (enable_pktv) { + cls_param.vector.enable = true; + cls_param.vector.pool = pktv_config.pool; + cls_param.vector.max_size = pktv_config.max_size; + cls_param.vector.max_tmo_ns = pktv_config.max_tmo_ns; + } + + cos_list[CLS_DROP] = odp_cls_cos_create(cosname, &cls_param); + CU_ASSERT_FATAL(cos_list[CLS_DROP] != ODP_COS_INVALID); + + val = odp_cpu_to_be_16(CLS_DROP_PORT); + mask = odp_cpu_to_be_16(0xffff); + odp_cls_pmr_param_init(&pmr_param); + pmr_param.term = find_first_supported_l3_pmr(); + pmr_param.match.value = &val; + pmr_param.match.mask = &mask; + pmr_param.val_sz = sizeof(val); + + pmr_list[CLS_DROP] = odp_cls_pmr_create(&pmr_param, 1, + cos_list[CLS_DEFAULT], + cos_list[CLS_DROP]); + CU_ASSERT_FATAL(pmr_list[CLS_DROP] != ODP_PMR_INVALID); +} + +void test_pktio_drop_cos(odp_bool_t enable_pktv) +{ + odp_packet_t pkt; + odp_queue_t queue; + uint32_t seqno = 0; + cls_packet_info_t pkt_info; + odp_cls_capability_t capa; + odp_cls_cos_stats_t start, stop; + + CU_ASSERT_FATAL(odp_cls_capability(&capa) == 0); + pkt_info = default_pkt_info; + pkt_info.l4_type = CLS_PKT_L4_UDP; + pkt = create_packet(pkt_info); + CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID); + seqno = cls_pkt_get_seq(pkt); + CU_ASSERT(seqno != TEST_SEQ_INVALID); + set_first_supported_pmr_port(pkt, CLS_DROP_PORT); + CU_ASSERT(odp_cls_cos_stats(cos_list[CLS_DROP], &start) == 0); + enqueue_pktio_interface(pkt, pktio_loop); + pkt = receive_packet(&queue, ODP_TIME_SEC_IN_NS, enable_pktv); + CU_ASSERT(odp_cls_cos_stats(cos_list[CLS_DROP], &stop) == 0); + CU_ASSERT_FATAL(pkt == ODP_PACKET_INVALID); + if (capa.stats.cos.counter.packets) + CU_ASSERT((stop.packets - start.packets) == 1); + if (capa.stats.cos.counter.discards) + CU_ASSERT((stop.discards - start.discards) == 0); + if (capa.stats.cos.counter.errors) + CU_ASSERT((stop.errors - start.errors) == 0); +} + static int classification_check_queue_stats(void) { odp_cls_capability_t capa; @@ -926,6 +995,11 @@ static void classification_test_pktio_configure_common(odp_bool_t enable_pktv) tc.default_cos = 1; num_cos -= NUM_COS_DEFAULT; } + if (num_cos >= NUM_COS_DEFAULT && TEST_DROP) { + configure_pktio_drop_cos(enable_pktv, capa.max_cos_stats); + tc.drop_cos = 1; + num_cos -= NUM_COS_DROP; + } if (num_cos >= NUM_COS_ERROR && TEST_ERROR) { configure_pktio_error_cos(enable_pktv); tc.error_cos = 1; @@ -969,6 +1043,8 @@ static void classification_test_pktio_test_common(odp_bool_t enable_pktv) /* Test Different CoS on the pktio interface */ if (tc.default_cos && TEST_DEFAULT) test_pktio_default_cos(enable_pktv); + if (tc.drop_cos && TEST_DROP) + test_pktio_drop_cos(enable_pktv); if (tc.error_cos && TEST_ERROR) test_pktio_error_cos(enable_pktv); if (tc.pmr_chain && TEST_PMR_CHAIN) diff --git a/test/validation/api/classification/odp_classification_testsuites.h b/test/validation/api/classification/odp_classification_testsuites.h index 2b5da94e2..6b00e138b 100644 --- a/test/validation/api/classification/odp_classification_testsuites.h +++ b/test/validation/api/classification/odp_classification_testsuites.h @@ -34,6 +34,7 @@ typedef struct cls_packet_info { typedef union odp_cls_testcase { struct { uint32_t default_cos:1; + uint32_t drop_cos:1; uint32_t error_cos:1; uint32_t pmr_chain:1; uint32_t l2_priority:1; @@ -72,6 +73,8 @@ odp_pool_t pktv_pool_create(const char *poolname); odp_queue_t queue_create(const char *queuename, bool sched); void configure_pktio_default_cos(odp_bool_t enable_pktv); void test_pktio_default_cos(odp_bool_t enable_pktv); +void configure_pktio_drop_cos(odp_bool_t enable_pktv, uint32_t max_cos_stats); +void test_pktio_drop_cos(odp_bool_t enable_pktv); void configure_pktio_error_cos(odp_bool_t enable_pktv); void test_pktio_error_cos(odp_bool_t enable_pktv); void configure_cls_pmr_chain(odp_bool_t enable_pktv); |