On 14 October 2015 at 01:03, Balasubramanian Manoharan <
bala.manoha...@linaro.org> wrote:

> Additional test suite is added to classification validation suite to test
> individual PMRs. This suite will test the defined PMRs by configuring
> pktio separately for every test case.
>
> Fixes:
> https://bugs.linaro.org/show_bug.cgi?id=1542
> https://bugs.linaro.org/show_bug.cgi?id=1544
> https://bugs.linaro.org/show_bug.cgi?id=1545
> https://bugs.linaro.org/show_bug.cgi?id=1546
>
> Signed-off-by: Balasubramanian Manoharan <bala.manoha...@linaro.org>
>


Reviewed-by: Mike Holmes <mike.hol...@linaro.org>



> ---
> v5: rebase on latest api-next
>
>  helper/include/odp/helper/tcp.h                    |   1 +
>  test/validation/classification/Makefile.am         |   2 +
>  test/validation/classification/classification.c    |   5 +
>  test/validation/classification/classification.h    |  44 ++
>  .../classification/odp_classification_common.c     | 252 +++++++++
>  .../classification/odp_classification_test_pmr.c   | 579
> +++++++++++++++++++++
>  .../classification/odp_classification_tests.c      | 309 ++---------
>  .../classification/odp_classification_testsuites.h |  15 +-
>  8 files changed, 948 insertions(+), 259 deletions(-)
>  create mode 100644
> test/validation/classification/odp_classification_common.c
>  create mode 100644
> test/validation/classification/odp_classification_test_pmr.c
>
> diff --git a/helper/include/odp/helper/tcp.h
> b/helper/include/odp/helper/tcp.h
> index defe422..42f0cbe 100644
> --- a/helper/include/odp/helper/tcp.h
> +++ b/helper/include/odp/helper/tcp.h
> @@ -26,6 +26,7 @@ extern "C" {
>   *  @{
>   */
>
> +#define ODPH_TCPHDR_LEN 20 /**< Min length of TCP header (no options) */
>
>  /** TCP header */
>  typedef struct ODP_PACKED {
> diff --git a/test/validation/classification/Makefile.am
> b/test/validation/classification/Makefile.am
> index 5881665..4235309 100644
> --- a/test/validation/classification/Makefile.am
> +++ b/test/validation/classification/Makefile.am
> @@ -3,6 +3,8 @@ include ../Makefile.inc
>  noinst_LTLIBRARIES = libtestclassification.la
>  libtestclassification_la_SOURCES = odp_classification_basic.c \
>                                odp_classification_tests.c \
> +                              odp_classification_test_pmr.c \
> +                              odp_classification_common.c \
>                                classification.c
>
>  bin_PROGRAMS = classification_main$(EXEEXT)
> diff --git a/test/validation/classification/classification.c
> b/test/validation/classification/classification.c
> index d0fef93..6641893 100644
> --- a/test/validation/classification/classification.c
> +++ b/test/validation/classification/classification.c
> @@ -13,6 +13,11 @@ CU_SuiteInfo classification_suites[] = {
>         { .pName = "classification basic",
>                         .pTests = classification_suite_basic,
>         },
> +       { .pName = "classification pmr tests",
> +                       .pTests = classification_suite_pmr,
> +                       .pInitFunc = classification_suite_pmr_init,
> +                       .pCleanupFunc = classification_suite_pmr_term,
> +       },
>         { .pName = "classification tests",
>                         .pTests = classification_suite,
>                         .pInitFunc = classification_suite_init,
> diff --git a/test/validation/classification/classification.h
> b/test/validation/classification/classification.h
> index d2847e5..de9c37e 100644
> --- a/test/validation/classification/classification.h
> +++ b/test/validation/classification/classification.h
> @@ -9,6 +9,50 @@
>
>  #include <CUnit/Basic.h>
>
> +#define SHM_PKT_NUM_BUFS        32
> +#define SHM_PKT_BUF_SIZE        1024
> +
> +/* Config values for Default CoS */
> +#define TEST_DEFAULT           1
> +#define        CLS_DEFAULT             0
> +#define CLS_DEFAULT_SADDR      "10.0.0.1/32"
> +#define CLS_DEFAULT_DADDR      "10.0.0.100/32"
> +#define CLS_DEFAULT_SPORT      1024
> +#define CLS_DEFAULT_DPORT      2048
> +
> +/* Config values for Error CoS */
> +#define TEST_ERROR             1
> +#define CLS_ERROR              1
> +
> +/* Config values for PMR_CHAIN */
> +#define TEST_PMR_CHAIN         1
> +#define CLS_PMR_CHAIN_SRC      2
> +#define CLS_PMR_CHAIN_DST      3
> +#define CLS_PMR_CHAIN_SADDR    "10.0.0.5/32"
> +#define CLS_PMR_CHAIN_SPORT    3000
> +
> +/* Config values for PMR */
> +#define TEST_PMR               1
> +#define CLS_PMR                        4
> +#define CLS_PMR_SPORT          4000
> +
> +/* Config values for PMR SET */
> +#define TEST_PMR_SET           1
> +#define CLS_PMR_SET            5
> +#define CLS_PMR_SET_SADDR      "10.0.0.6/32"
> +#define CLS_PMR_SET_SPORT      5000
> +
> +/* Config values for CoS L2 Priority */
> +#define TEST_L2_QOS            1
> +#define CLS_L2_QOS_0           6
> +#define CLS_L2_QOS_MAX         5
> +
> +#define CLS_ENTRIES            (CLS_L2_QOS_0 + CLS_L2_QOS_MAX)
> +
> +/* Test Packet values */
> +#define DATA_MAGIC             0x01020304
> +#define TEST_SEQ_INVALID       ((uint32_t)~0)
> +
>  /* test functions: */
>  void classification_test_create_cos(void);
>  void classification_test_destroy_cos(void);
> diff --git a/test/validation/classification/odp_classification_common.c
> b/test/validation/classification/odp_classification_common.c
> new file mode 100644
> index 0000000..b975dfb
> --- /dev/null
> +++ b/test/validation/classification/odp_classification_common.c
> @@ -0,0 +1,252 @@
> +/* Copyright (c) 2015, Linaro Limited
> + * All rights reserved.
> + *
> + * SPDX-License-Identifier:    BSD-3-Clause
> + */
> +
> +#include "odp_classification_testsuites.h"
> +#include "classification.h"
> +#include <odp_cunit_common.h>
> +#include <odp/helper/eth.h>
> +#include <odp/helper/ip.h>
> +#include <odp/helper/udp.h>
> +#include <odp/helper/tcp.h>
> +
> +typedef struct cls_test_packet {
> +       uint32be_t magic;
> +       uint32be_t seq;
> +} cls_test_packet_t;
> +
> +int cls_pkt_set_seq(odp_packet_t pkt)
> +{
> +       static uint32_t seq;
> +       cls_test_packet_t data;
> +       uint32_t offset;
> +       odph_ipv4hdr_t *ip;
> +       int status;
> +
> +       data.magic = DATA_MAGIC;
> +       data.seq = ++seq;
> +
> +       ip = (odph_ipv4hdr_t *)odp_packet_l3_ptr(pkt, NULL);
> +       offset = odp_packet_l4_offset(pkt);
> +       CU_ASSERT_FATAL(offset != 0);
> +
> +       if (ip->proto == ODPH_IPPROTO_UDP)
> +               status = odp_packet_copydata_in(pkt, offset +
> ODPH_UDPHDR_LEN,
> +                                               sizeof(data), &data);
> +       else
> +               status = odp_packet_copydata_in(pkt, offset +
> ODPH_TCPHDR_LEN,
> +                                               sizeof(data), &data);
> +
> +       return status;
> +}
> +
> +uint32_t cls_pkt_get_seq(odp_packet_t pkt)
> +{
> +       uint32_t offset;
> +       cls_test_packet_t data;
> +       odph_ipv4hdr_t *ip;
> +
> +       ip = (odph_ipv4hdr_t *)odp_packet_l3_ptr(pkt, NULL);
> +       offset = odp_packet_l4_offset(pkt);
> +
> +       if (!offset && !ip)
> +               return TEST_SEQ_INVALID;
> +
> +       if (ip->proto == ODPH_IPPROTO_UDP)
> +               odp_packet_copydata_out(pkt, offset + ODPH_UDPHDR_LEN,
> +                                       sizeof(data), &data);
> +       else
> +               odp_packet_copydata_out(pkt, offset + ODPH_TCPHDR_LEN,
> +                                       sizeof(data), &data);
> +
> +       if (data.magic == DATA_MAGIC)
> +               return data.seq;
> +
> +       return TEST_SEQ_INVALID;
> +}
> +
> +int parse_ipv4_string(const char *ipaddress, uint32_t *addr, uint32_t
> *mask)
> +{
> +       int b[4];
> +       int qualifier = 32;
> +       int converted;
> +
> +       if (strchr(ipaddress, '/')) {
> +               converted = sscanf(ipaddress, "%d.%d.%d.%d/%d",
> +                                  &b[3], &b[2], &b[1], &b[0],
> +                                  &qualifier);
> +               if (5 != converted)
> +                       return -1;
> +       } else {
> +               converted = sscanf(ipaddress, "%d.%d.%d.%d",
> +                                  &b[3], &b[2], &b[1], &b[0]);
> +               if (4 != converted)
> +                       return -1;
> +       }
> +
> +       if ((b[0] > 255) || (b[1] > 255) || (b[2] > 255) || (b[3] > 255))
> +               return -1;
> +       if (!qualifier || (qualifier > 32))
> +               return -1;
> +
> +       *addr = b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24;
> +       if (mask)
> +               *mask = ~(0xFFFFFFFF & ((1ULL << (32 - qualifier)) - 1));
> +
> +       return 0;
> +}
> +
> +void enqueue_pktio_interface(odp_packet_t pkt, odp_pktio_t pktio)
> +{
> +       odp_event_t ev;
> +       odp_queue_t defqueue;
> +
> +       defqueue  = odp_pktio_outq_getdef(pktio);
> +       CU_ASSERT(defqueue != ODP_QUEUE_INVALID);
> +
> +       ev = odp_packet_to_event(pkt);
> +       CU_ASSERT(odp_queue_enq(defqueue, ev) == 0);
> +}
> +
> +odp_packet_t receive_packet(odp_queue_t *queue, uint64_t ns)
> +{
> +       odp_event_t ev;
> +
> +       ev = odp_schedule(queue, ns);
> +       return odp_packet_from_event(ev);
> +}
> +
> +odp_queue_t queue_create(char *queuename, bool sched)
> +{
> +       odp_queue_t queue;
> +       odp_queue_param_t qparam;
> +
> +       if (sched) {
> +               odp_queue_param_init(&qparam);
> +               qparam.sched.prio = ODP_SCHED_PRIO_HIGHEST;
> +               qparam.sched.sync = ODP_SCHED_SYNC_NONE;
> +               qparam.sched.group = ODP_SCHED_GROUP_ALL;
> +
> +               queue = odp_queue_create(queuename,
> +                                        ODP_QUEUE_TYPE_SCHED,
> +                                        &qparam);
> +       } else {
> +               queue = odp_queue_create(queuename,
> +                                        ODP_QUEUE_TYPE_POLL,
> +                                        NULL);
> +       }
> +
> +       return queue;
> +}
> +
> +odp_packet_t create_packet(odp_pool_t pool, bool vlan,
> +                          odp_atomic_u32_t *seq, bool flag_udp)
> +{
> +       uint32_t seqno;
> +       odph_ethhdr_t *ethhdr;
> +       odph_udphdr_t *udp;
> +       odph_tcphdr_t *tcp;
> +       odph_ipv4hdr_t *ip;
> +       uint8_t payload_len;
> +       char src_mac[ODPH_ETHADDR_LEN]  = {0};
> +       char dst_mac[ODPH_ETHADDR_LEN] = {0};
> +       uint32_t addr = 0;
> +       uint32_t mask;
> +       int offset;
> +       odp_packet_t pkt;
> +       int packet_len = 0;
> +
> +       payload_len = sizeof(cls_test_packet_t);
> +       packet_len += ODPH_ETHHDR_LEN;
> +       packet_len += ODPH_IPV4HDR_LEN;
> +       if (flag_udp)
> +               packet_len += ODPH_UDPHDR_LEN;
> +       else
> +               packet_len += ODPH_TCPHDR_LEN;
> +       packet_len += payload_len;
> +
> +       if (vlan)
> +               packet_len += ODPH_VLANHDR_LEN;
> +
> +       pkt = odp_packet_alloc(pool, packet_len);
> +       CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
> +
> +       /* Ethernet Header */
> +       offset = 0;
> +       odp_packet_l2_offset_set(pkt, offset);
> +       ethhdr = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
> +       memcpy(ethhdr->src.addr, src_mac, ODPH_ETHADDR_LEN);
> +       memcpy(ethhdr->dst.addr, dst_mac, ODPH_ETHADDR_LEN);
> +       offset += sizeof(odph_ethhdr_t);
> +       if (vlan) {
> +               /* Default vlan header */
> +               uint8_t *parseptr;
> +               odph_vlanhdr_t *vlan;
> +
> +               vlan = (odph_vlanhdr_t *)(&ethhdr->type);
> +               parseptr = (uint8_t *)vlan;
> +               vlan->tci = odp_cpu_to_be_16(0);
> +               vlan->tpid = odp_cpu_to_be_16(ODPH_ETHTYPE_VLAN);
> +               offset += sizeof(odph_vlanhdr_t);
> +               parseptr += sizeof(odph_vlanhdr_t);
> +               uint16be_t *type = (uint16be_t *)(void *)parseptr;
> +               *type = odp_cpu_to_be_16(ODPH_ETHTYPE_IPV4);
> +       } else {
> +               ethhdr->type =  odp_cpu_to_be_16(ODPH_ETHTYPE_IPV4);
> +       }
> +
> +       odp_packet_l3_offset_set(pkt, offset);
> +
> +       /* ipv4 */
> +       ip = (odph_ipv4hdr_t *)odp_packet_l3_ptr(pkt, NULL);
> +
> +       parse_ipv4_string(CLS_DEFAULT_SADDR, &addr, &mask);
> +       ip->dst_addr = odp_cpu_to_be_32(addr);
> +
> +       parse_ipv4_string(CLS_DEFAULT_DADDR, &addr, &mask);
> +       ip->src_addr = odp_cpu_to_be_32(addr);
> +       ip->ver_ihl = ODPH_IPV4 << 4 | ODPH_IPV4HDR_IHL_MIN;
> +       if (flag_udp)
> +               ip->tot_len = odp_cpu_to_be_16(ODPH_UDPHDR_LEN +
> payload_len +
> +                                              ODPH_IPV4HDR_LEN);
> +       else
> +               ip->tot_len = odp_cpu_to_be_16(ODPH_TCPHDR_LEN +
> payload_len +
> +                                              ODPH_IPV4HDR_LEN);
> +
> +       ip->ttl = 128;
> +       if (flag_udp)
> +               ip->proto = ODPH_IPPROTO_UDP;
> +       else
> +               ip->proto = ODPH_IPPROTO_TCP;
> +
> +       seqno = odp_atomic_fetch_inc_u32(seq);
> +       ip->id = odp_cpu_to_be_16(seqno);
> +       ip->chksum = 0;
> +       ip->chksum = odp_cpu_to_be_16(odph_ipv4_csum_update(pkt));
> +       offset += ODPH_IPV4HDR_LEN;
> +
> +       /* udp */
> +       if (flag_udp) {
> +               odp_packet_l4_offset_set(pkt, offset);
> +               udp = (odph_udphdr_t *)odp_packet_l4_ptr(pkt, NULL);
> +               udp->src_port = odp_cpu_to_be_16(CLS_DEFAULT_SPORT);
> +               udp->dst_port = odp_cpu_to_be_16(CLS_DEFAULT_DPORT);
> +               udp->length = odp_cpu_to_be_16(payload_len +
> ODPH_UDPHDR_LEN);
> +               udp->chksum = 0;
> +       } else {
> +               odp_packet_l4_offset_set(pkt, offset);
> +               tcp = (odph_tcphdr_t *)odp_packet_l4_ptr(pkt, NULL);
> +               tcp->src_port = odp_cpu_to_be_16(CLS_DEFAULT_SPORT);
> +               tcp->dst_port = odp_cpu_to_be_16(CLS_DEFAULT_DPORT);
> +               tcp->hl = ODPH_TCPHDR_LEN / 4;
> +               /* TODO: checksum field has to be updated */
> +               tcp->cksm = 0;
> +       }
> +
> +       /* set pkt sequence number */
> +       cls_pkt_set_seq(pkt);
> +
> +       return pkt;
> +}
> diff --git a/test/validation/classification/odp_classification_test_pmr.c
> b/test/validation/classification/odp_classification_test_pmr.c
> new file mode 100644
> index 0000000..37de892
> --- /dev/null
> +++ b/test/validation/classification/odp_classification_test_pmr.c
> @@ -0,0 +1,579 @@
> +/* Copyright (c) 2015, Linaro Limited
> + * All rights reserved.
> + *
> + * SPDX-License-Identifier:    BSD-3-Clause
> + */
> +
> +#include "odp_classification_testsuites.h"
> +#include "classification.h"
> +#include <odp_cunit_common.h>
> +#include <odp/helper/eth.h>
> +#include <odp/helper/ip.h>
> +#include <odp/helper/udp.h>
> +#include <odp/helper/tcp.h>
> +
> +static odp_pool_t pool_default;
> +
> +/** sequence number of IP packets */
> +odp_atomic_u32_t seq;
> +
> +static int destroy_inq(odp_pktio_t pktio)
> +{
> +       odp_queue_t inq;
> +       odp_event_t ev;
> +
> +       inq = odp_pktio_inq_getdef(pktio);
> +
> +       if (inq == ODP_QUEUE_INVALID) {
> +               CU_FAIL("attempting to destroy invalid inq");
> +               return -1;
> +       }
> +
> +       if (0 > odp_pktio_inq_remdef(pktio))
> +               return -1;
> +
> +       while (1) {
> +               ev = odp_schedule(NULL, ODP_SCHED_NO_WAIT);
> +
> +               if (ev != ODP_EVENT_INVALID)
> +                       odp_buffer_free(odp_buffer_from_event(ev));
> +               else
> +                       break;
> +       }
> +
> +       return odp_queue_destroy(inq);
> +}
> +
> +int classification_suite_pmr_init(void)
> +{
> +       odp_pool_t pool;
> +       odp_pool_param_t param;
> +
> +       odp_pool_param_init(&param);
> +       param.pkt.seg_len = SHM_PKT_BUF_SIZE;
> +       param.pkt.len     = SHM_PKT_BUF_SIZE;
> +       param.pkt.num     = SHM_PKT_NUM_BUFS;
> +       param.type        = ODP_POOL_PACKET;
> +
> +       pool = odp_pool_create("classification_pmr_pool", &param);
> +       if (ODP_POOL_INVALID == pool) {
> +               fprintf(stderr, "Packet pool creation failed.\n");
> +               return -1;
> +       }
> +
> +       pool_default = odp_pool_lookup("classification_pmr_pool");
> +       if (pool_default == ODP_POOL_INVALID)
> +               return -1;
> +
> +       odp_atomic_init_u32(&seq, 0);
> +       return 0;
> +}
> +
> +odp_pktio_t create_pktio(odp_queue_type_t q_type)
> +{
> +       odp_pktio_t pktio;
> +       odp_pktio_param_t pktio_param;
> +       odp_pool_t pool;
> +       int ret;
> +
> +       pool = odp_pool_lookup("classification_pmr_pool");
> +       if (pool == ODP_POOL_INVALID)
> +               return ODP_PKTIO_INVALID;
> +
> +       memset(&pktio_param, 0, sizeof(pktio_param));
> +       if (q_type == ODP_QUEUE_TYPE_POLL)
> +               pktio_param.in_mode = ODP_PKTIN_MODE_POLL;
> +       else
> +               pktio_param.in_mode = ODP_PKTIN_MODE_SCHED;
> +
> +       pktio = odp_pktio_open("loop", pool, &pktio_param);
> +       if (pktio == ODP_PKTIO_INVALID) {
> +               ret = odp_pool_destroy(pool);
> +               if (ret)
> +                       fprintf(stderr, "unable to destroy pool.\n");
> +               return ODP_PKTIO_INVALID;
> +       }
> +
> +       ret = odp_pktio_start(pktio);
> +       if (ret) {
> +               fprintf(stderr, "unable to start loop\n");
> +               return ODP_PKTIO_INVALID;
> +       }
> +
> +       return pktio;
> +}
> +
> +odp_queue_t create_default_inq(odp_pktio_t pktio, odp_queue_type_t qtype)
> +{
> +       odp_queue_param_t qparam;
> +       odp_queue_t inq_def;
> +       char inq_name[ODP_QUEUE_NAME_LEN];
> +
> +       odp_queue_param_init(&qparam);
> +       qparam.sched.prio  = ODP_SCHED_PRIO_DEFAULT;
> +       qparam.sched.sync  = ODP_SCHED_SYNC_ATOMIC;
> +       qparam.sched.group = ODP_SCHED_GROUP_ALL;
> +
> +       snprintf(inq_name, sizeof(inq_name), "inq-pktio-%" PRIu64,
> +                odp_pktio_to_u64(pktio));
> +       inq_def = odp_queue_lookup(inq_name);
> +       if (inq_def == ODP_QUEUE_INVALID)
> +               inq_def = odp_queue_create(
> +                               inq_name,
> +                               ODP_QUEUE_TYPE_PKTIN,
> +                               qtype == ODP_QUEUE_TYPE_POLL ? NULL :
> &qparam);
> +
> +       CU_ASSERT(inq_def != ODP_QUEUE_INVALID);
> +
> +       if (0 > odp_pktio_inq_setdef(pktio, inq_def))
> +               return ODP_QUEUE_INVALID;
> +
> +       return inq_def;
> +}
> +
> +int classification_suite_pmr_term(void)
> +{
> +       int retcode = 0;
> +
> +       if (0 != odp_pool_destroy(pool_default)) {
> +               fprintf(stderr, "pool_default destroy failed.\n");
> +               retcode = -1;
> +       }
> +
> +       return retcode;
> +}
> +
> +static void classification_test_pmr_term_tcp_dport(void)
> +{
> +       odp_packet_t pkt;
> +       odph_tcphdr_t *tcp;
> +       uint32_t seqno;
> +       uint16_t val;
> +       uint16_t mask;
> +       int retval;
> +       odp_pktio_t pktio;
> +       odp_queue_t queue;
> +       odp_queue_t retqueue;
> +       odp_queue_t defqueue;
> +       odp_pmr_t pmr;
> +       odp_cos_t cos;
> +       char cosname[ODP_QUEUE_NAME_LEN];
> +       char queuename[ODP_QUEUE_NAME_LEN];
> +       odp_pmr_match_t match;
> +
> +       val = CLS_DEFAULT_DPORT;
> +       mask = 0xffff;
> +       seqno = 0;
> +
> +       pktio = create_pktio(ODP_QUEUE_TYPE_SCHED);
> +       CU_ASSERT(pktio != ODP_PKTIO_INVALID);
> +       defqueue = create_default_inq(pktio, ODP_QUEUE_TYPE_SCHED);
> +       CU_ASSERT(defqueue != ODP_QUEUE_INVALID);
> +
> +       match.term = ODP_PMR_TCP_DPORT;
> +       match.val = &val;
> +       match.mask = &mask;
> +       match.val_sz = sizeof(val);
> +
> +       pmr = odp_pmr_create(&match);
> +       CU_ASSERT(pmr != ODP_PMR_INVAL);
> +
> +       sprintf(cosname, "tcp_dport");
> +       cos = odp_cos_create(cosname);
> +       CU_ASSERT(cos != ODP_COS_INVALID);
> +
> +       sprintf(queuename, "%s", "tcp_dport1");
> +
> +       queue = queue_create(queuename, true);
> +       CU_ASSERT(queue != ODP_QUEUE_INVALID);
> +
> +       retval = odp_cos_queue_set(cos, queue);
> +       CU_ASSERT(retval == 0);
> +
> +       retval = odp_pktio_pmr_cos(pmr, pktio, cos);
> +       CU_ASSERT(retval == 0);
> +
> +       pkt = create_packet(pool_default, false, &seq, false);
> +       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);
> +
> +       enqueue_pktio_interface(pkt, pktio);
> +
> +       pkt = receive_packet(&retqueue, ODP_TIME_SEC);
> +       CU_ASSERT(pkt != ODP_PACKET_INVALID);
> +       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(pool_default, false, &seq, false);
> +       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 + 1);
> +
> +       enqueue_pktio_interface(pkt, pktio);
> +
> +       pkt = receive_packet(&retqueue, ODP_TIME_SEC);
> +       CU_ASSERT(pkt != ODP_PACKET_INVALID);
> +       CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
> +       CU_ASSERT(retqueue == defqueue);
> +
> +       odp_packet_free(pkt);
> +       odp_cos_destroy(cos);
> +       odp_pmr_destroy(pmr);
> +       destroy_inq(pktio);
> +       odp_queue_destroy(queue);
> +       odp_pktio_close(pktio);
> +}
> +
> +static void classification_test_pmr_term_tcp_sport(void)
> +{
> +       odp_packet_t pkt;
> +       odph_tcphdr_t *tcp;
> +       uint32_t seqno;
> +       uint16_t val;
> +       uint16_t mask;
> +       int retval;
> +       odp_pktio_t pktio;
> +       odp_queue_t queue;
> +       odp_queue_t retqueue;
> +       odp_queue_t defqueue;
> +       odp_pmr_t pmr;
> +       odp_cos_t cos;
> +       char cosname[ODP_QUEUE_NAME_LEN];
> +       char queuename[ODP_QUEUE_NAME_LEN];
> +       odp_pmr_match_t match;
> +
> +       val = CLS_DEFAULT_SPORT;
> +       mask = 0xffff;
> +       seqno = 0;
> +
> +       pktio = create_pktio(ODP_QUEUE_TYPE_SCHED);
> +       defqueue = create_default_inq(pktio, ODP_QUEUE_TYPE_SCHED);
> +
> +       match.term = ODP_PMR_TCP_SPORT;
> +       match.val = &val;
> +       match.mask = &mask;
> +       match.val_sz = sizeof(val);
> +
> +       pmr = odp_pmr_create(&match);
> +       CU_ASSERT(pmr != ODP_PMR_INVAL);
> +
> +       sprintf(cosname, "tcp_sport");
> +       cos = odp_cos_create(cosname);
> +       CU_ASSERT_FATAL(cos != ODP_COS_INVALID);
> +
> +       sprintf(queuename, "%s", "tcp_sport");
> +
> +       queue = queue_create(queuename, true);
> +       CU_ASSERT_FATAL(queue != ODP_QUEUE_INVALID);
> +
> +       retval = odp_cos_queue_set(cos, queue);
> +       CU_ASSERT(retval == 0);
> +
> +       retval = odp_pktio_pmr_cos(pmr, pktio, cos);
> +       CU_ASSERT(retval == 0);
> +
> +       pkt = create_packet(pool_default, false, &seq, false);
> +       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(CLS_DEFAULT_SPORT);
> +
> +       enqueue_pktio_interface(pkt, pktio);
> +
> +       pkt = receive_packet(&retqueue, ODP_TIME_SEC);
> +       CU_ASSERT(pkt != ODP_PACKET_INVALID);
> +       CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
> +       CU_ASSERT(retqueue == queue);
> +       odp_packet_free(pkt);
> +
> +       pkt = create_packet(pool_default, false, &seq, false);
> +       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(CLS_DEFAULT_SPORT + 1);
> +
> +       enqueue_pktio_interface(pkt, pktio);
> +
> +       pkt = receive_packet(&retqueue, ODP_TIME_SEC);
> +       CU_ASSERT(pkt != ODP_PACKET_INVALID);
> +       CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
> +       CU_ASSERT(retqueue == defqueue);
> +
> +       odp_packet_free(pkt);
> +       odp_cos_destroy(cos);
> +       odp_pmr_destroy(pmr);
> +       destroy_inq(pktio);
> +       odp_queue_destroy(queue);
> +       odp_pktio_close(pktio);
> +}
> +
> +static void classification_test_pmr_term_udp_dport(void)
> +{
> +       odp_packet_t pkt;
> +       odph_udphdr_t *udp;
> +       uint32_t seqno;
> +       uint16_t val;
> +       uint16_t mask;
> +       int retval;
> +       odp_pktio_t pktio;
> +       odp_queue_t queue;
> +       odp_queue_t retqueue;
> +       odp_queue_t defqueue;
> +       odp_pmr_t pmr;
> +       odp_cos_t cos;
> +       char cosname[ODP_QUEUE_NAME_LEN];
> +       char queuename[ODP_QUEUE_NAME_LEN];
> +       odp_pmr_match_t match;
> +
> +       val = CLS_DEFAULT_DPORT;
> +       mask = 0xffff;
> +       seqno = 0;
> +
> +       pktio = create_pktio(ODP_QUEUE_TYPE_SCHED);
> +       defqueue = create_default_inq(pktio, ODP_QUEUE_TYPE_SCHED);
> +
> +       match.term = ODP_PMR_UDP_DPORT;
> +       match.val = &val;
> +       match.mask = &mask;
> +       match.val_sz = sizeof(val);
> +
> +       pmr = odp_pmr_create(&match);
> +       CU_ASSERT(pmr != ODP_PMR_INVAL);
> +
> +       sprintf(cosname, "udp_dport");
> +       cos = odp_cos_create(cosname);
> +       CU_ASSERT_FATAL(cos != ODP_COS_INVALID);
> +
> +       sprintf(queuename, "%s", "udp_dport");
> +
> +       queue = queue_create(queuename, true);
> +       CU_ASSERT_FATAL(queue != ODP_QUEUE_INVALID);
> +
> +       retval = odp_cos_queue_set(cos, queue);
> +       CU_ASSERT(retval == 0);
> +
> +       retval = odp_pktio_pmr_cos(pmr, pktio, cos);
> +       CU_ASSERT(retval == 0);
> +
> +       pkt = create_packet(pool_default, false, &seq, true);
> +       seqno = cls_pkt_get_seq(pkt);
> +       CU_ASSERT(seqno != TEST_SEQ_INVALID);
> +
> +       udp = (odph_udphdr_t *)odp_packet_l4_ptr(pkt, NULL);
> +       udp->dst_port = odp_cpu_to_be_16(CLS_DEFAULT_DPORT);
> +
> +       enqueue_pktio_interface(pkt, pktio);
> +
> +       pkt = receive_packet(&retqueue, ODP_TIME_SEC);
> +       CU_ASSERT(pkt != ODP_PACKET_INVALID);
> +       CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
> +       CU_ASSERT(retqueue == queue);
> +       odp_packet_free(pkt);
> +
> +       /* Other packets received in default queue */
> +       pkt = create_packet(pool_default, false, &seq, true);
> +       seqno = cls_pkt_get_seq(pkt);
> +       CU_ASSERT(seqno != TEST_SEQ_INVALID);
> +
> +       udp = (odph_udphdr_t *)odp_packet_l4_ptr(pkt, NULL);
> +       udp->dst_port = odp_cpu_to_be_16(CLS_DEFAULT_DPORT + 1);
> +
> +       enqueue_pktio_interface(pkt, pktio);
> +
> +       pkt = receive_packet(&retqueue, ODP_TIME_SEC);
> +       CU_ASSERT(pkt != ODP_PACKET_INVALID);
> +       CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
> +       CU_ASSERT(retqueue == defqueue);
> +
> +       odp_packet_free(pkt);
> +       odp_cos_destroy(cos);
> +       odp_pmr_destroy(pmr);
> +       destroy_inq(pktio);
> +       odp_queue_destroy(queue);
> +       odp_pktio_close(pktio);
> +}
> +
> +static void classification_test_pmr_term_udp_sport(void)
> +{
> +       odp_packet_t pkt;
> +       odph_udphdr_t *udp;
> +       uint32_t seqno;
> +       uint16_t val;
> +       uint16_t mask;
> +       int retval;
> +       odp_pktio_t pktio;
> +       odp_queue_t queue;
> +       odp_queue_t retqueue;
> +       odp_queue_t defqueue;
> +       odp_pmr_t pmr;
> +       odp_cos_t cos;
> +       char cosname[ODP_QUEUE_NAME_LEN];
> +       char queuename[ODP_QUEUE_NAME_LEN];
> +       odp_pmr_match_t match;
> +
> +       val = CLS_DEFAULT_SPORT;
> +       mask = 0xffff;
> +       seqno = 0;
> +
> +       pktio = create_pktio(ODP_QUEUE_TYPE_SCHED);
> +       defqueue = create_default_inq(pktio, ODP_QUEUE_TYPE_SCHED);
> +
> +       match.term = ODP_PMR_UDP_SPORT;
> +       match.val = &val;
> +       match.mask = &mask;
> +       match.val_sz = sizeof(val);
> +
> +       pmr = odp_pmr_create(&match);
> +       CU_ASSERT(pmr != ODP_PMR_INVAL);
> +
> +       sprintf(cosname, "udp_sport");
> +       cos = odp_cos_create(cosname);
> +       CU_ASSERT_FATAL(cos != ODP_COS_INVALID);
> +
> +       sprintf(queuename, "%s", "udp_sport");
> +
> +       queue = queue_create(queuename, true);
> +       CU_ASSERT_FATAL(queue != ODP_QUEUE_INVALID);
> +
> +       retval = odp_cos_queue_set(cos, queue);
> +       CU_ASSERT(retval == 0);
> +
> +       retval = odp_pktio_pmr_cos(pmr, pktio, cos);
> +       CU_ASSERT(retval == 0);
> +
> +       pkt = create_packet(pool_default, false, &seq, true);
> +       seqno = cls_pkt_get_seq(pkt);
> +       CU_ASSERT(seqno != TEST_SEQ_INVALID);
> +
> +       udp = (odph_udphdr_t *)odp_packet_l4_ptr(pkt, NULL);
> +       udp->src_port = odp_cpu_to_be_16(CLS_DEFAULT_SPORT);
> +
> +       enqueue_pktio_interface(pkt, pktio);
> +
> +       pkt = receive_packet(&retqueue, ODP_TIME_SEC);
> +       CU_ASSERT(pkt != ODP_PACKET_INVALID);
> +       CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
> +       CU_ASSERT(retqueue == queue);
> +       odp_packet_free(pkt);
> +
> +       pkt = create_packet(pool_default, false, &seq, true);
> +       seqno = cls_pkt_get_seq(pkt);
> +       CU_ASSERT(seqno != TEST_SEQ_INVALID);
> +
> +       udp = (odph_udphdr_t *)odp_packet_l4_ptr(pkt, NULL);
> +       udp->src_port = odp_cpu_to_be_16(CLS_DEFAULT_SPORT + 1);
> +
> +       enqueue_pktio_interface(pkt, pktio);
> +
> +       pkt = receive_packet(&retqueue, ODP_TIME_SEC);
> +       CU_ASSERT(pkt != ODP_PACKET_INVALID);
> +       CU_ASSERT(cls_pkt_get_seq(pkt) != TEST_SEQ_INVALID);
> +       CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
> +       CU_ASSERT(retqueue == defqueue);
> +       odp_packet_free(pkt);
> +
> +       odp_cos_destroy(cos);
> +       odp_pmr_destroy(pmr);
> +       destroy_inq(pktio);
> +       odp_queue_destroy(queue);
> +       odp_pktio_close(pktio);
> +}
> +
> +static void classification_test_pmr_term_ipproto(void)
> +{
> +       odp_packet_t pkt;
> +       uint32_t seqno;
> +       uint8_t val;
> +       uint8_t mask;
> +       int retval;
> +       odp_pktio_t pktio;
> +       odp_queue_t queue;
> +       odp_queue_t retqueue;
> +       odp_queue_t defqueue;
> +       odp_pmr_t pmr;
> +       odp_cos_t cos;
> +       char cosname[ODP_QUEUE_NAME_LEN];
> +       char queuename[ODP_QUEUE_NAME_LEN];
> +       odp_pmr_match_t match;
> +
> +       val = ODPH_IPPROTO_UDP;
> +       mask = 0xff;
> +       seqno = 0;
> +
> +       pktio = create_pktio(ODP_QUEUE_TYPE_SCHED);
> +       defqueue = create_default_inq(pktio, ODP_QUEUE_TYPE_SCHED);
> +
> +       match.term = ODP_PMR_IPPROTO;
> +       match.val = &val;
> +       match.mask = &mask;
> +       match.val_sz = sizeof(val);
> +
> +       pmr = odp_pmr_create(&match);
> +       CU_ASSERT(pmr != ODP_PMR_INVAL);
> +
> +       sprintf(cosname, "ipproto");
> +       cos = odp_cos_create(cosname);
> +       CU_ASSERT_FATAL(cos != ODP_COS_INVALID);
> +
> +       sprintf(queuename, "%s", "ipproto");
> +
> +       queue = queue_create(queuename, true);
> +       CU_ASSERT_FATAL(queue != ODP_QUEUE_INVALID);
> +
> +       retval = odp_cos_queue_set(cos, queue);
> +       CU_ASSERT(retval == 0);
> +
> +       retval = odp_pktio_pmr_cos(pmr, pktio, cos);
> +       CU_ASSERT(retval == 0);
> +
> +       pkt = create_packet(pool_default, false, &seq, true);
> +       seqno = cls_pkt_get_seq(pkt);
> +       CU_ASSERT(seqno != TEST_SEQ_INVALID);
> +
> +       enqueue_pktio_interface(pkt, pktio);
> +
> +       pkt = receive_packet(&retqueue, ODP_TIME_SEC);
> +       CU_ASSERT(pkt != ODP_PACKET_INVALID);
> +       CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
> +       CU_ASSERT(retqueue == queue);
> +       odp_packet_free(pkt);
> +
> +       /* Other packets delivered to default queue */
> +       pkt = create_packet(pool_default, false, &seq, false);
> +       seqno = cls_pkt_get_seq(pkt);
> +       CU_ASSERT(seqno != TEST_SEQ_INVALID);
> +
> +       enqueue_pktio_interface(pkt, pktio);
> +
> +       pkt = receive_packet(&retqueue, ODP_TIME_SEC);
> +       CU_ASSERT(pkt != ODP_PACKET_INVALID);
> +       CU_ASSERT(cls_pkt_get_seq(pkt) != TEST_SEQ_INVALID);
> +       CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
> +       CU_ASSERT(retqueue == defqueue);
> +
> +       odp_cos_destroy(cos);
> +       odp_pmr_destroy(pmr);
> +       odp_packet_free(pkt);
> +       destroy_inq(pktio);
> +       odp_queue_destroy(queue);
> +       odp_pktio_close(pktio);
> +}
> +
> +CU_TestInfo classification_suite_pmr[] = {
> +       _CU_TEST_INFO(classification_test_pmr_term_tcp_dport),
> +       _CU_TEST_INFO(classification_test_pmr_term_tcp_sport),
> +       _CU_TEST_INFO(classification_test_pmr_term_udp_dport),
> +       _CU_TEST_INFO(classification_test_pmr_term_udp_sport),
> +       _CU_TEST_INFO(classification_test_pmr_term_ipproto),
> +       CU_TEST_INFO_NULL,
> +};
> diff --git a/test/validation/classification/odp_classification_tests.c
> b/test/validation/classification/odp_classification_tests.c
> index 8840e53..74d1060 100644
> --- a/test/validation/classification/odp_classification_tests.c
> +++ b/test/validation/classification/odp_classification_tests.c
> @@ -11,50 +11,6 @@
>  #include <odp/helper/ip.h>
>  #include <odp/helper/udp.h>
>
> -#define SHM_PKT_NUM_BUFS        32
> -#define SHM_PKT_BUF_SIZE        1024
> -
> -/* Config values for Default CoS */
> -#define TEST_DEFAULT           1
> -#define        CLS_DEFAULT             0
> -#define CLS_DEFAULT_SADDR      "10.0.0.1/32"
> -#define CLS_DEFAULT_DADDR      "10.0.0.100/32"
> -#define CLS_DEFAULT_SPORT      1024
> -#define CLS_DEFAULT_DPORT      2048
> -
> -/* Config values for Error CoS */
> -#define TEST_ERROR             1
> -#define CLS_ERROR              1
> -
> -/* Config values for PMR_CHAIN */
> -#define TEST_PMR_CHAIN         1
> -#define CLS_PMR_CHAIN_SRC      2
> -#define CLS_PMR_CHAIN_DST      3
> -#define CLS_PMR_CHAIN_SADDR    "10.0.0.5/32"
> -#define CLS_PMR_CHAIN_SPORT    3000
> -
> -/* Config values for PMR */
> -#define TEST_PMR               1
> -#define CLS_PMR                        4
> -#define CLS_PMR_SPORT          4000
> -
> -/* Config values for PMR SET */
> -#define TEST_PMR_SET           1
> -#define CLS_PMR_SET            5
> -#define CLS_PMR_SET_SADDR      "10.0.0.6/32"
> -#define CLS_PMR_SET_SPORT      5000
> -
> -/* Config values for CoS L2 Priority */
> -#define TEST_L2_QOS            1
> -#define CLS_L2_QOS_0           6
> -#define CLS_L2_QOS_MAX         5
> -
> -#define CLS_ENTRIES            (CLS_L2_QOS_0 + CLS_L2_QOS_MAX)
> -
> -/* Test Packet values */
> -#define DATA_MAGIC             0x01020304
> -#define TEST_SEQ_INVALID       ((uint32_t)~0)
> -
>  static odp_cos_t cos_list[CLS_ENTRIES];
>  static odp_pmr_t pmr_list[CLS_ENTRIES];
>  static odp_queue_t queue_list[CLS_ENTRIES];
> @@ -66,99 +22,6 @@ static odp_pktio_t pktio_loop;
>  /** sequence number of IP packets */
>  odp_atomic_u32_t seq;
>
> -typedef struct cls_test_packet {
> -       uint32be_t magic;
> -       uint32be_t seq;
> -} cls_test_packet_t;
> -
> -static inline
> -int parse_ipv4_string(const char *ipaddress, uint32_t *addr, uint32_t
> *mask)
> -{
> -       int b[4];
> -       int qualifier = 32;
> -       int converted;
> -
> -       if (strchr(ipaddress, '/')) {
> -               converted = sscanf(ipaddress, "%d.%d.%d.%d/%d",
> -                               &b[3], &b[2], &b[1], &b[0],
> -                               &qualifier);
> -               if (5 != converted)
> -                       return -1;
> -       } else {
> -               converted = sscanf(ipaddress, "%d.%d.%d.%d",
> -                               &b[3], &b[2], &b[1], &b[0]);
> -               if (4 != converted)
> -                       return -1;
> -       }
> -
> -       if ((b[0] > 255) || (b[1] > 255) || (b[2] > 255) || (b[3] > 255))
> -               return -1;
> -       if (!qualifier || (qualifier > 32))
> -               return -1;
> -
> -       *addr = b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24;
> -       if (mask)
> -               *mask = ~(0xFFFFFFFF & ((1ULL << (32 - qualifier)) - 1));
> -
> -       return 0;
> -}
> -
> -static inline
> -void enqueue_loop_interface(odp_packet_t pkt)
> -{
> -       odp_event_t ev;
> -       odp_queue_t defqueue = odp_pktio_outq_getdef(pktio_loop);
> -
> -       ev = odp_packet_to_event(pkt);
> -       if (!(CU_ASSERT(odp_queue_enq(defqueue, ev) == 0)))
> -               odp_packet_free(pkt);
> -}
> -
> -static inline
> -odp_packet_t receive_packet(odp_queue_t *queue, uint64_t ns)
> -{
> -       odp_event_t ev;
> -
> -       ev = odp_schedule(queue, ns);
> -       return odp_packet_from_event(ev);
> -}
> -
> -static int cls_pkt_set_seq(odp_packet_t pkt)
> -{
> -       static uint32_t seq;
> -       cls_test_packet_t data;
> -       uint32_t offset;
> -       int status;
> -
> -       data.magic = DATA_MAGIC;
> -       data.seq = ++seq;
> -
> -       offset = odp_packet_l4_offset(pkt);
> -       CU_ASSERT_FATAL(offset != 0);
> -
> -       status = odp_packet_copydata_in(pkt, offset + ODPH_UDPHDR_LEN,
> -                                       sizeof(data), &data);
> -
> -       return status;
> -}
> -
> -static uint32_t cls_pkt_get_seq(odp_packet_t pkt)
> -{
> -       uint32_t offset;
> -       cls_test_packet_t data;
> -
> -       offset = odp_packet_l4_offset(pkt);
> -       if (offset) {
> -               odp_packet_copydata_out(pkt, offset + ODPH_UDPHDR_LEN,
> -                                       sizeof(data), &data);
> -
> -               if (data.magic == DATA_MAGIC)
> -                       return data.seq;
> -       }
> -
> -       return TEST_SEQ_INVALID;
> -}
> -
>  static int destroy_inq(odp_pktio_t pktio)
>  {
>         odp_queue_t inq;
> @@ -185,93 +48,9 @@ static int destroy_inq(odp_pktio_t pktio)
>
>         return odp_queue_destroy(inq);
>  }
> -odp_packet_t create_packet(bool vlan)
> -{
> -       uint32_t seqno;
> -       odph_ethhdr_t *ethhdr;
> -       odph_udphdr_t *udp;
> -       odph_ipv4hdr_t *ip;
> -       uint8_t payload_len;
> -       char src_mac[ODPH_ETHADDR_LEN]  = {0};
> -       char dst_mac[ODPH_ETHADDR_LEN] = {0};
> -       uint32_t addr = 0;
> -       uint32_t mask;
> -       int offset;
> -       odp_packet_t pkt;
> -       int packet_len = 0;
> -
> -       payload_len = sizeof(cls_test_packet_t);
> -       packet_len += ODPH_ETHHDR_LEN;
> -       packet_len += ODPH_IPV4HDR_LEN;
> -       packet_len += ODPH_UDPHDR_LEN;
> -       packet_len += payload_len;
> -
> -       if (vlan)
> -               packet_len += ODPH_VLANHDR_LEN;
> -
> -       pkt = odp_packet_alloc(pool_default, packet_len);
> -       CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
> -
> -       /* Ethernet Header */
> -       offset = 0;
> -       odp_packet_l2_offset_set(pkt, offset);
> -       ethhdr = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
> -       memcpy(ethhdr->src.addr, src_mac, ODPH_ETHADDR_LEN);
> -       memcpy(ethhdr->dst.addr, dst_mac, ODPH_ETHADDR_LEN);
> -       offset += sizeof(odph_ethhdr_t);
> -       if (vlan) {
> -               /* Default vlan header */
> -               uint8_t *parseptr;
> -               odph_vlanhdr_t *vlan = (odph_vlanhdr_t *)(&ethhdr->type);
> -               parseptr = (uint8_t *)vlan;
> -               vlan->tci = odp_cpu_to_be_16(0);
> -               vlan->tpid = odp_cpu_to_be_16(ODPH_ETHTYPE_VLAN);
> -               offset += sizeof(odph_vlanhdr_t);
> -               parseptr += sizeof(odph_vlanhdr_t);
> -               uint16be_t *type = (uint16be_t *)(void *)parseptr;
> -               *type = odp_cpu_to_be_16(ODPH_ETHTYPE_IPV4);
> -       } else {
> -               ethhdr->type =  odp_cpu_to_be_16(ODPH_ETHTYPE_IPV4);
> -       }
> -
> -       odp_packet_l3_offset_set(pkt, offset);
> -
> -       /* ipv4 */
> -       ip = (odph_ipv4hdr_t *)odp_packet_l3_ptr(pkt, NULL);
> -
> -       parse_ipv4_string(CLS_DEFAULT_SADDR, &addr, &mask);
> -       ip->dst_addr = odp_cpu_to_be_32(addr);
> -
> -       parse_ipv4_string(CLS_DEFAULT_DADDR, &addr, &mask);
> -       ip->src_addr = odp_cpu_to_be_32(addr);
> -       ip->ver_ihl = ODPH_IPV4 << 4 | ODPH_IPV4HDR_IHL_MIN;
> -       ip->tot_len = odp_cpu_to_be_16(ODPH_UDPHDR_LEN + payload_len +
> -                       ODPH_IPV4HDR_LEN);
> -       ip->ttl = 128;
> -       ip->proto = ODPH_IPPROTO_UDP;
> -       seqno = odp_atomic_fetch_inc_u32(&seq);
> -       ip->id = odp_cpu_to_be_16(seqno);
> -       ip->chksum = 0;
> -       ip->chksum = odp_cpu_to_be_16(odph_ipv4_csum_update(pkt));
> -       offset += ODPH_IPV4HDR_LEN;
> -
> -       /* udp */
> -       odp_packet_l4_offset_set(pkt, offset);
> -       udp = (odph_udphdr_t *)odp_packet_l4_ptr(pkt, NULL);
> -       udp->src_port = odp_cpu_to_be_16(CLS_DEFAULT_SPORT);
> -       udp->dst_port = odp_cpu_to_be_16(CLS_DEFAULT_DPORT);
> -       udp->length = odp_cpu_to_be_16(payload_len + ODPH_UDPHDR_LEN);
> -       udp->chksum = 0;
> -
> -       /* set pkt sequence number */
> -       cls_pkt_set_seq(pkt);
> -
> -       return pkt;
> -}
>
>  int classification_suite_init(void)
>  {
> -       odp_pool_t pool;
>         odp_pool_param_t param;
>         odp_queue_t inq_def;
>         odp_queue_param_t qparam;
> @@ -286,16 +65,12 @@ int classification_suite_init(void)
>         param.pkt.num     = SHM_PKT_NUM_BUFS;
>         param.type        = ODP_POOL_PACKET;
>
> -       pool = odp_pool_create("classification_pool", &param);
> -       if (ODP_POOL_INVALID == pool) {
> +       pool_default = odp_pool_create("classification_pool", &param);
> +       if (ODP_POOL_INVALID == pool_default) {
>                 fprintf(stderr, "Packet pool creation failed.\n");
>                 return -1;
>         }
>
> -       pool_default = odp_pool_lookup("classification_pool");
> -       if (pool_default == ODP_POOL_INVALID)
> -               return -1;
> -
>         memset(&pktio_param, 0, sizeof(pktio_param));
>         pktio_param.in_mode = ODP_PKTIN_MODE_SCHED;
>
> @@ -394,6 +169,7 @@ void configure_cls_pmr_chain(void)
>         qparam.sched.prio = ODP_SCHED_PRIO_NORMAL;
>         qparam.sched.sync = ODP_SCHED_SYNC_NONE;
>         qparam.sched.group = ODP_SCHED_GROUP_ALL;
> +       qparam.sched.lock_count = ODP_CONFIG_MAX_ORDERED_LOCKS_PER_QUEUE;
>         sprintf(queuename, "%s", "SrcQueue");
>
>         queue_list[CLS_PMR_CHAIN_SRC] = odp_queue_create(queuename,
> @@ -459,10 +235,12 @@ void test_cls_pmr_chain(void)
>         odp_queue_t queue;
>         uint32_t addr = 0;
>         uint32_t mask;
> -       uint32_t seq;
> +       uint32_t seqno = 0;
> +
> +       pkt = create_packet(pool_default, false, &seq, true);
> +       seqno = cls_pkt_get_seq(pkt);
> +       CU_ASSERT(seqno != TEST_SEQ_INVALID);
>
> -       pkt = create_packet(false);
> -       seq = cls_pkt_get_seq(pkt);
>         ip = (odph_ipv4hdr_t *)odp_packet_l3_ptr(pkt, NULL);
>         parse_ipv4_string(CLS_PMR_CHAIN_SADDR, &addr, &mask);
>         ip->src_addr = odp_cpu_to_be_32(addr);
> @@ -472,25 +250,29 @@ void test_cls_pmr_chain(void)
>         udp = (odph_udphdr_t *)odp_packet_l4_ptr(pkt, NULL);
>         udp->src_port = odp_cpu_to_be_16(CLS_PMR_CHAIN_SPORT);
>
> -       enqueue_loop_interface(pkt);
> +       enqueue_pktio_interface(pkt, pktio_loop);
>
>         pkt = receive_packet(&queue, ODP_TIME_SEC);
> +       CU_ASSERT(pkt != ODP_PACKET_INVALID);
>         CU_ASSERT(queue == queue_list[CLS_PMR_CHAIN_DST]);
> -       CU_ASSERT(seq == cls_pkt_get_seq(pkt));
> +       CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
>         odp_packet_free(pkt);
>
> -       pkt = create_packet(false);
> -       seq = cls_pkt_get_seq(pkt);
> +       pkt = create_packet(pool_default, false, &seq, true);
> +       seqno = cls_pkt_get_seq(pkt);
> +       CU_ASSERT(seqno != TEST_SEQ_INVALID);
> +
>         ip = (odph_ipv4hdr_t *)odp_packet_l3_ptr(pkt, NULL);
>         parse_ipv4_string(CLS_PMR_CHAIN_SADDR, &addr, &mask);
>         ip->src_addr = odp_cpu_to_be_32(addr);
>         ip->chksum = 0;
>         ip->chksum = odp_cpu_to_be_16(odph_ipv4_csum_update(pkt));
>
> -       enqueue_loop_interface(pkt);
> +       enqueue_pktio_interface(pkt, pktio_loop);
>         pkt = receive_packet(&queue, ODP_TIME_SEC);
> +       CU_ASSERT(pkt != ODP_PACKET_INVALID);
>         CU_ASSERT(queue == queue_list[CLS_PMR_CHAIN_SRC]);
> -       CU_ASSERT(seq == cls_pkt_get_seq(pkt));
> +       CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
>         odp_packet_free(pkt);
>  }
>
> @@ -526,16 +308,19 @@ void test_pktio_default_cos(void)
>  {
>         odp_packet_t pkt;
>         odp_queue_t queue;
> -       uint32_t seq;
> +       uint32_t seqno = 0;
>         /* create a default packet */
> -       pkt = create_packet(false);
> -       seq = cls_pkt_get_seq(pkt);
> -       enqueue_loop_interface(pkt);
> +       pkt = create_packet(pool_default, false, &seq, true);
> +       seqno = cls_pkt_get_seq(pkt);
> +       CU_ASSERT(seqno != TEST_SEQ_INVALID);
> +
> +       enqueue_pktio_interface(pkt, pktio_loop);
>
>         pkt = receive_packet(&queue, ODP_TIME_SEC);
> +       CU_ASSERT(pkt != ODP_PACKET_INVALID);
>         /* Default packet should be received in default queue */
>         CU_ASSERT(queue == queue_list[CLS_DEFAULT]);
> -       CU_ASSERT(seq == cls_pkt_get_seq(pkt));
> +       CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
>
>         odp_packet_free(pkt);
>  }
> @@ -575,15 +360,16 @@ void test_pktio_error_cos(void)
>         odp_packet_t pkt;
>
>         /*Create an error packet */
> -       pkt = create_packet(false);
> +       pkt = create_packet(pool_default, false, &seq, true);
>         odph_ipv4hdr_t *ip = (odph_ipv4hdr_t *)odp_packet_l3_ptr(pkt,
> NULL);
>
>         /* Incorrect IpV4 version */
>         ip->ver_ihl = 8 << 4 | ODPH_IPV4HDR_IHL_MIN;
>         ip->chksum = 0;
> -       enqueue_loop_interface(pkt);
> +       enqueue_pktio_interface(pkt, pktio_loop);
>
>         pkt = receive_packet(&queue, ODP_TIME_SEC);
> +       CU_ASSERT(pkt != ODP_PACKET_INVALID);
>         /* Error packet should be received in error queue */
>         CU_ASSERT(queue == queue_list[CLS_ERROR]);
>         odp_packet_free(pkt);
> @@ -666,19 +452,21 @@ void test_cos_with_l2_priority(void)
>         odph_ethhdr_t *ethhdr;
>         odph_vlanhdr_t *vlan;
>         odp_queue_t queue;
> -       uint32_t seq;
> +       uint32_t seqno = 0;
>
>         uint8_t i;
>         for (i = 0; i < CLS_L2_QOS_MAX; i++) {
> -               pkt = create_packet(true);
> -               seq = cls_pkt_get_seq(pkt);
> +               pkt = create_packet(pool_default, true, &seq, true);
> +               seqno = cls_pkt_get_seq(pkt);
> +               CU_ASSERT(seqno != TEST_SEQ_INVALID);
>                 ethhdr = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
>                 vlan = (odph_vlanhdr_t *)(&ethhdr->type);
>                 vlan->tci = odp_cpu_to_be_16(i << 13);
> -               enqueue_loop_interface(pkt);
> +               enqueue_pktio_interface(pkt, pktio_loop);
>                 pkt = receive_packet(&queue, ODP_TIME_SEC);
> +               CU_ASSERT(pkt != ODP_PACKET_INVALID);
>                 CU_ASSERT(queue == queue_list[CLS_L2_QOS_0 + i]);
> -               CU_ASSERT(seq == cls_pkt_get_seq(pkt));
> +               CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
>                 odp_packet_free(pkt);
>         }
>  }
> @@ -732,16 +520,18 @@ void test_pmr_cos(void)
>         odp_packet_t pkt;
>         odph_udphdr_t *udp;
>         odp_queue_t queue;
> -       uint32_t seq;
> +       uint32_t seqno = 0;
>
> -       pkt = create_packet(false);
> -       seq = cls_pkt_get_seq(pkt);
> +       pkt = create_packet(pool_default, false, &seq, true);
> +       seqno = cls_pkt_get_seq(pkt);
> +       CU_ASSERT(seqno != TEST_SEQ_INVALID);
>         udp = (odph_udphdr_t *)odp_packet_l4_ptr(pkt, NULL);
>         udp->src_port = odp_cpu_to_be_16(CLS_PMR_SPORT);
> -       enqueue_loop_interface(pkt);
> +       enqueue_pktio_interface(pkt, pktio_loop);
>         pkt = receive_packet(&queue, ODP_TIME_SEC);
> +       CU_ASSERT(pkt != ODP_PACKET_INVALID);
>         CU_ASSERT(queue == queue_list[CLS_PMR]);
> -       CU_ASSERT(seq == cls_pkt_get_seq(pkt));
> +       CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
>         odp_packet_free(pkt);
>  }
>
> @@ -807,10 +597,12 @@ void test_pktio_pmr_match_set_cos(void)
>         odph_udphdr_t *udp;
>         odp_packet_t pkt;
>         odp_queue_t queue;
> -       uint32_t seq;
> +       uint32_t seqno = 0;
> +
> +       pkt = create_packet(pool_default, false, &seq, true);
> +       seqno = cls_pkt_get_seq(pkt);
> +       CU_ASSERT(seqno != TEST_SEQ_INVALID);
>
> -       pkt = create_packet(false);
> -       seq = cls_pkt_get_seq(pkt);
>         ip = (odph_ipv4hdr_t *)odp_packet_l3_ptr(pkt, NULL);
>         parse_ipv4_string(CLS_PMR_SET_SADDR, &addr, &mask);
>         ip->src_addr = odp_cpu_to_be_32(addr);
> @@ -819,10 +611,11 @@ void test_pktio_pmr_match_set_cos(void)
>
>         udp = (odph_udphdr_t *)odp_packet_l4_ptr(pkt, NULL);
>         udp->src_port = odp_cpu_to_be_16(CLS_PMR_SET_SPORT);
> -       enqueue_loop_interface(pkt);
> +       enqueue_pktio_interface(pkt, pktio_loop);
>         pkt = receive_packet(&queue, ODP_TIME_SEC);
> +       CU_ASSERT(pkt != ODP_PACKET_INVALID);
>         CU_ASSERT(queue == queue_list[CLS_PMR_SET]);
> -       CU_ASSERT(seq == cls_pkt_get_seq(pkt));
> +       CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
>         odp_packet_free(pkt);
>  }
>
> diff --git
> a/test/validation/classification/odp_classification_testsuites.h
> b/test/validation/classification/odp_classification_testsuites.h
> index 37c019d..33547a7 100644
> --- a/test/validation/classification/odp_classification_testsuites.h
> +++ b/test/validation/classification/odp_classification_testsuites.h
> @@ -13,11 +13,24 @@
>
>  extern CU_TestInfo classification_suite[];
>  extern CU_TestInfo classification_suite_basic[];
> +extern CU_TestInfo classification_suite_pmr[];
>
>  int classification_suite_init(void);
>  int classification_suite_term(void);
>
> -odp_packet_t create_packet(bool vlan);
> +int classification_suite_pmr_term(void);
> +int classification_suite_pmr_init(void);
> +
> +odp_packet_t create_packet(odp_pool_t pool, bool vlan,
> +                          odp_atomic_u32_t *seq, bool udp);
> +int cls_pkt_set_seq(odp_packet_t pkt);
> +uint32_t cls_pkt_get_seq(odp_packet_t pkt);
> +odp_pktio_t create_pktio(odp_queue_type_t q_type);
> +odp_queue_t create_default_inq(odp_pktio_t pktio, odp_queue_type_t qtype);
> +int parse_ipv4_string(const char *ipaddress, uint32_t *addr, uint32_t
> *mask);
> +void enqueue_pktio_interface(odp_packet_t pkt, odp_pktio_t pktio);
> +odp_packet_t receive_packet(odp_queue_t *queue, uint64_t ns);
> +odp_queue_t queue_create(char *queuename, bool sched);
>  void configure_pktio_default_cos(void);
>  void test_pktio_default_cos(void);
>  void configure_pktio_error_cos(void);
> --
> 1.9.1
>
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> https://lists.linaro.org/mailman/listinfo/lng-odp
>



-- 
Mike Holmes
Technical Manager - Linaro Networking Group
Linaro.org <http://www.linaro.org/> *│ *Open source software for ARM SoCs
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to