Signed-off-by: huanggaoyang <[email protected]>
---
 test/validation/classification/classification.h    |   1 +
 .../classification/odp_classification_test_pmr.c   | 114 ++++++++++++++++++++-
 2 files changed, 113 insertions(+), 2 deletions(-)

diff --git a/test/validation/classification/classification.h 
b/test/validation/classification/classification.h
index a186339..81540f6 100644
--- a/test/validation/classification/classification.h
+++ b/test/validation/classification/classification.h
@@ -76,6 +76,7 @@ void classification_test_pmr_term_tcp_sport(void);
 void classification_test_pmr_term_udp_dport(void);
 void classification_test_pmr_term_udp_sport(void);
 void classification_test_pmr_term_ipproto(void);
+void classification_test_pmr_term_custom_frame(void);
 
 /* test arrays: */
 extern odp_testinfo_t classification_suite_basic[];
diff --git a/test/validation/classification/odp_classification_test_pmr.c 
b/test/validation/classification/odp_classification_test_pmr.c
index 53b9620..a227278 100644
--- a/test/validation/classification/odp_classification_test_pmr.c
+++ b/test/validation/classification/odp_classification_test_pmr.c
@@ -119,7 +119,6 @@ void configure_default_cos(odp_pktio_t pktio, odp_cos_t 
*cos,
        *cos = default_cos;
        *queue = default_queue;
        *pool = default_pool;
-       return;
 }
 
 int classification_suite_pmr_term(void)
@@ -174,7 +173,6 @@ void classification_test_pmr_term_tcp_dport(void)
        pmr = odp_pmr_create(&match);
        CU_ASSERT(pmr != ODP_PMR_INVAL);
 
-
        queue = queue_create("tcp_dport1", true);
        CU_ASSERT(queue != ODP_QUEUE_INVALID);
 
@@ -663,6 +661,117 @@ void classification_test_pmr_term_ipproto(void)
        odp_pktio_close(pktio);
 }
 
+void classification_test_pmr_term_custom_frame(void)
+{
+       odp_packet_t pkt;
+       odph_tcphdr_t *tcp;
+       uint32_t seqno;
+       uint32_t val;
+       uint32_t mask;
+       int retval;
+       odp_pktio_t pktio;
+       odp_queue_t queue;
+       odp_queue_t retqueue;
+       odp_queue_t default_queue;
+       odp_cos_t default_cos;
+       odp_pool_t default_pool;
+       odp_pool_t recvpool;
+       odp_pmr_t pmr;
+       odp_cos_t cos;
+       char cosname[ODP_COS_NAME_LEN];
+       odp_cls_cos_param_t cls_param;
+       odp_pool_t pool;
+       odp_pool_t pool_recv;
+       odp_pmr_match_t match;
+
+       val = 0x12345678;
+       mask = 0xffffffff;
+       seqno = 0;
+
+       pktio = create_pktio(ODP_QUEUE_TYPE_SCHED);
+       CU_ASSERT_FATAL(pktio != ODP_PKTIO_INVALID);
+       retval = create_default_inq(pktio, ODP_QUEUE_TYPE_SCHED);
+       CU_ASSERT(retval == 0);
+
+       match.term = ODP_PMR_CUSTOM_FRAME;
+       match.val = &val;
+       match.mask = &mask;
+       match.val_sz = sizeof(val);
+       match.offset = 34;
+
+       pmr = odp_pmr_create(&match);
+       CU_ASSERT(pmr != ODP_PMR_INVAL);
+
+       queue = queue_create("sdport_frame", true);
+       CU_ASSERT(queue != ODP_QUEUE_INVALID);
+
+       pool = pool_create("sdport_frame");
+       CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+       sprintf(cosname, "sdport_frame");
+       odp_cls_cos_param_init(&cls_param);
+       cls_param.pool = pool;
+       cls_param.queue = queue;
+       cls_param.drop_policy = ODP_COS_DROP_POOL;
+
+       cos = odp_cls_cos_create(cosname, &cls_param);
+       CU_ASSERT(cos != ODP_COS_INVALID);
+
+       retval = odp_pktio_pmr_cos(pmr, pktio, cos);
+       CU_ASSERT(retval == 0);
+
+       configure_default_cos(pktio, &default_cos,
+                             &default_queue, &default_pool);
+       pkt = create_packet(pkt_pool, false, &seq, false);
+       CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+       seqno = cls_pkt_get_seq(pkt);
+       CU_ASSERT(seqno != TEST_SEQ_INVALID);
+
+       tcp = (odph_tcphdr_t *)odp_packet_l4_ptr(pkt, NULL);
+       tcp->src_port = odp_cpu_to_be_16(0x1234);
+       tcp->dst_port = odp_cpu_to_be_16(0x5678);
+
+       enqueue_pktio_interface(pkt, pktio);
+
+       pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS);
+       CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+       pool_recv = odp_packet_pool(pkt);
+       CU_ASSERT(pool == pool_recv);
+       CU_ASSERT(retqueue == queue);
+       CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+
+       odp_packet_free(pkt);
+
+       /* Other packets are delivered to default queue */
+       pkt = create_packet(pkt_pool, false, &seq, false);
+       CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+       seqno = cls_pkt_get_seq(pkt);
+       CU_ASSERT(seqno != TEST_SEQ_INVALID);
+
+       tcp = (odph_tcphdr_t *)odp_packet_l4_ptr(pkt, NULL);
+       tcp->dst_port = odp_cpu_to_be_16(CLS_DEFAULT_DPORT + 21);
+
+       enqueue_pktio_interface(pkt, pktio);
+
+       pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS);
+       CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+       CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+       CU_ASSERT(retqueue == default_queue);
+       recvpool = odp_packet_pool(pkt);
+       CU_ASSERT(recvpool == default_pool);
+
+       odp_packet_free(pkt);
+       odp_cos_destroy(cos);
+       odp_cos_destroy(default_cos);
+       odp_pmr_destroy(pmr);
+       destroy_inq(pktio);
+       odp_queue_destroy(queue);
+       odp_queue_destroy(default_queue);
+       odp_pool_destroy(pool);
+       odp_pool_destroy(default_pool);
+       odp_pktio_close(pktio);
+}
+
 static void classification_test_pmr_pool_set(void)
 {
        odp_packet_t pkt;
@@ -855,6 +964,7 @@ odp_testinfo_t classification_suite_pmr[] = {
        ODP_TEST_INFO(classification_test_pmr_term_udp_dport),
        ODP_TEST_INFO(classification_test_pmr_term_udp_sport),
        ODP_TEST_INFO(classification_test_pmr_term_ipproto),
+       ODP_TEST_INFO(classification_test_pmr_term_custom_frame),
        ODP_TEST_INFO(classification_test_pmr_pool_set),
        ODP_TEST_INFO(classification_test_pmr_queue_set),
        ODP_TEST_INFO_NULL,
-- 
1.9.1


_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to