aboutsummaryrefslogtreecommitdiff
path: root/test/validation/api/classification
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2022-05-25 12:50:34 +0300
committerGitHub <noreply@github.com>2022-05-25 12:50:34 +0300
commit9951d549ce6c8dec08af9ab04ae2bd61cf489855 (patch)
tree50c987b4844596abe30134000c4a77ad469cd0ee /test/validation/api/classification
parent2f869d2698349bf75ec2404d4ab7d7f3b5b4c88b (diff)
parent62c95b2e71aab0e3af543e0df55ebf14ea306a11 (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')
-rw-r--r--test/validation/api/classification/classification.h7
-rw-r--r--test/validation/api/classification/odp_classification_basic.c45
-rw-r--r--test/validation/api/classification/odp_classification_tests.c76
-rw-r--r--test/validation/api/classification/odp_classification_testsuites.h3
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);