aboutsummaryrefslogtreecommitdiff
path: root/test/validation/api/classification
diff options
context:
space:
mode:
authorKiran Kumar K <kirankumark@marvell.com>2020-10-05 09:45:36 +0530
committerPetri Savolainen <petri.savolainen@nokia.com>2020-12-21 12:42:26 +0200
commitc1087239ffdc72996bb0376788a41eadadc8a46f (patch)
tree58a603696607d5e649aaa9c7b55b4ae1866305c6 /test/validation/api/classification
parent16b8f94ffd4b0600645c7f71183e72d41630ed33 (diff)
validation: cls: add validation test cases for pmr types icmp
Adding validation test cases to test PMR types ICMP TYPE, ICMP CODE and ICMP ID. Signed-off-by: Kiran Kumar K <kirankumark@marvell.com> Reviewed-by: Janne Peltonen <janne.peltonen@nokia.com>
Diffstat (limited to 'test/validation/api/classification')
-rw-r--r--test/validation/api/classification/odp_classification_common.c26
-rw-r--r--test/validation/api/classification/odp_classification_test_pmr.c369
-rw-r--r--test/validation/api/classification/odp_classification_testsuites.h1
3 files changed, 392 insertions, 4 deletions
diff --git a/test/validation/api/classification/odp_classification_common.c b/test/validation/api/classification/odp_classification_common.c
index 1592a6bb0..8d738f382 100644
--- a/test/validation/api/classification/odp_classification_common.c
+++ b/test/validation/api/classification/odp_classification_common.c
@@ -105,7 +105,10 @@ int cls_pkt_set_seq(odp_packet_t pkt)
offset = odp_packet_l4_offset(pkt);
CU_ASSERT_FATAL(offset != ODP_PACKET_OFFSET_INVALID);
- if (ip->proto == ODPH_IPPROTO_SCTP) {
+ if (ip->proto == ODPH_IPPROTO_ICMPV4) {
+ status = odp_packet_copy_from_mem(pkt, offset + ODPH_ICMPHDR_LEN,
+ sizeof(data), &data);
+ } else if (ip->proto == ODPH_IPPROTO_SCTP) {
/* Create some invalid SCTP packet for testing under the assumption that
* no implementation really cares
*/
@@ -135,7 +138,10 @@ uint32_t cls_pkt_get_seq(odp_packet_t pkt)
if (offset == ODP_PACKET_OFFSET_INVALID || ip == NULL)
return TEST_SEQ_INVALID;
- if (ip->proto == ODPH_IPPROTO_SCTP) {
+ if (ip->proto == ODPH_IPPROTO_ICMPV4) {
+ odp_packet_copy_to_mem(pkt, offset + ODPH_ICMPHDR_LEN,
+ sizeof(data), &data);
+ } else if (ip->proto == ODPH_IPPROTO_SCTP) {
odp_packet_copy_to_mem(pkt, offset + ODPH_SCTPHDR_LEN,
sizeof(data), &data);
} else if (ip->proto == ODPH_IPPROTO_UDP)
@@ -302,6 +308,7 @@ odp_packet_t create_packet(cls_packet_info_t pkt_info)
odph_udphdr_t *udp;
odph_tcphdr_t *tcp;
odph_sctphdr_t *sctp;
+ odph_icmphdr_t *icmp;
odph_ipv4hdr_t *ip;
odph_ipv6hdr_t *ipv6;
uint16_t payload_len;
@@ -344,6 +351,10 @@ odp_packet_t create_packet(cls_packet_info_t pkt_info)
next_hdr = ODPH_IPPROTO_SCTP;
l4_hdr_len = ODPH_SCTPHDR_LEN;
break;
+ case CLS_PKT_L4_ICMP:
+ next_hdr = ODPH_IPPROTO_ICMPV4;
+ l4_hdr_len = ODPH_ICMPHDR_LEN;
+ break;
default:
ODPH_ASSERT(0);
}
@@ -427,8 +438,15 @@ odp_packet_t create_packet(cls_packet_info_t pkt_info)
tcp = (odph_tcphdr_t *)(buf + l4_offset);
udp = (odph_udphdr_t *)(buf + l4_offset);
sctp = (odph_sctphdr_t *)(buf + l4_offset);
-
- if (pkt_info.l4_type == CLS_PKT_L4_SCTP) {
+ icmp = (odph_icmphdr_t *)(buf + l4_offset);
+
+ if (pkt_info.l4_type == CLS_PKT_L4_ICMP) {
+ icmp->type = ICMP_ECHO;
+ icmp->code = 0;
+ icmp->un.echo.id = 0;
+ icmp->un.echo.sequence = 0;
+ icmp->chksum = 0;
+ } else if (pkt_info.l4_type == CLS_PKT_L4_SCTP) {
sctp->src_port = odp_cpu_to_be_16(CLS_DEFAULT_SPORT);
sctp->dst_port = odp_cpu_to_be_16(CLS_DEFAULT_DPORT);
sctp->tag = 0;
diff --git a/test/validation/api/classification/odp_classification_test_pmr.c b/test/validation/api/classification/odp_classification_test_pmr.c
index 331190b0b..da92e3c14 100644
--- a/test/validation/api/classification/odp_classification_test_pmr.c
+++ b/test/validation/api/classification/odp_classification_test_pmr.c
@@ -2544,6 +2544,354 @@ static void classification_test_pmr_term_sctp_dport(void)
classification_test_pmr_term_sctp(1);
}
+static void classification_test_pmr_term_icmp_type(void)
+{
+ odp_packet_t pkt;
+ odph_icmphdr_t *icmp;
+ uint8_t val;
+ uint8_t mask;
+ uint32_t seqno;
+ 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 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_pmr_param_t pmr_param;
+ odph_ethhdr_t *eth;
+ cls_packet_info_t pkt_info;
+
+ val = ICMP_ECHO;
+ mask = 0xff;
+ seqno = 0;
+
+ pktio = create_pktio(ODP_QUEUE_TYPE_SCHED, pkt_pool, true);
+ CU_ASSERT_FATAL(pktio != ODP_PKTIO_INVALID);
+ retval = start_pktio(pktio);
+ CU_ASSERT(retval == 0);
+
+ configure_default_cos(pktio, &default_cos,
+ &default_queue, &default_pool);
+
+ queue = queue_create("icmp_type", true);
+ CU_ASSERT_FATAL(queue != ODP_QUEUE_INVALID);
+
+ pool = pool_create("icmp_type");
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+ sprintf(cosname, "icmp_type");
+ 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_FATAL(cos != ODP_COS_INVALID);
+
+ odp_cls_pmr_param_init(&pmr_param);
+ pmr_param.term = ODP_PMR_ICMP_TYPE;
+ pmr_param.match.value = &val;
+ pmr_param.match.mask = &mask;
+ pmr_param.val_sz = sizeof(val);
+
+ pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
+ CU_ASSERT(pmr != ODP_PMR_INVALID);
+
+ pkt_info = default_pkt_info;
+ pkt_info.l4_type = CLS_PKT_L4_ICMP;
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+
+ icmp = (odph_icmphdr_t *)odp_packet_l4_ptr(pkt, NULL);
+ icmp->type = val;
+
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS, false);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+ CU_ASSERT(retqueue == queue);
+ recvpool = odp_packet_pool(pkt);
+ CU_ASSERT(recvpool == pool);
+ odp_packet_free(pkt);
+
+ /* Other packets should goto default queue */
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+
+ icmp = (odph_icmphdr_t *)odp_packet_l4_ptr(pkt, NULL);
+ icmp->type = ICMP_ECHOREPLY;
+
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS, false);
+ 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_cls_pmr_destroy(pmr);
+ stop_pktio(pktio);
+ odp_pool_destroy(default_pool);
+ odp_pool_destroy(pool);
+ odp_queue_destroy(queue);
+ odp_queue_destroy(default_queue);
+ odp_pktio_close(pktio);
+}
+
+static void classification_test_pmr_term_icmp_code(void)
+{
+ odp_packet_t pkt;
+ odph_icmphdr_t *icmp;
+ uint8_t val;
+ uint8_t mask;
+ uint32_t seqno;
+ 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 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_pmr_param_t pmr_param;
+ odph_ethhdr_t *eth;
+ cls_packet_info_t pkt_info;
+
+ val = 0x1;
+ mask = 0xff;
+ seqno = 0;
+
+ pktio = create_pktio(ODP_QUEUE_TYPE_SCHED, pkt_pool, true);
+ CU_ASSERT_FATAL(pktio != ODP_PKTIO_INVALID);
+ retval = start_pktio(pktio);
+ CU_ASSERT(retval == 0);
+
+ configure_default_cos(pktio, &default_cos,
+ &default_queue, &default_pool);
+
+ queue = queue_create("icmp_code", true);
+ CU_ASSERT_FATAL(queue != ODP_QUEUE_INVALID);
+
+ pool = pool_create("icmp_code");
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+ sprintf(cosname, "icmp_code");
+ 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_FATAL(cos != ODP_COS_INVALID);
+
+ odp_cls_pmr_param_init(&pmr_param);
+ pmr_param.term = ODP_PMR_ICMP_CODE;
+ pmr_param.match.value = &val;
+ pmr_param.match.mask = &mask;
+ pmr_param.val_sz = sizeof(val);
+
+ pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
+ CU_ASSERT(pmr != ODP_PMR_INVALID);
+
+ pkt_info = default_pkt_info;
+ pkt_info.l4_type = CLS_PKT_L4_ICMP;
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+
+ icmp = (odph_icmphdr_t *)odp_packet_l4_ptr(pkt, NULL);
+ icmp->code = 0x1;
+
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS, false);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+ CU_ASSERT(retqueue == queue);
+ recvpool = odp_packet_pool(pkt);
+ CU_ASSERT(recvpool == pool);
+ odp_packet_free(pkt);
+
+ /* Other packets should goto default queue */
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+
+ icmp = (odph_icmphdr_t *)odp_packet_l4_ptr(pkt, NULL);
+ icmp->code = 0;
+
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS, false);
+ 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_cls_pmr_destroy(pmr);
+ stop_pktio(pktio);
+ odp_pool_destroy(default_pool);
+ odp_pool_destroy(pool);
+ odp_queue_destroy(queue);
+ odp_queue_destroy(default_queue);
+ odp_pktio_close(pktio);
+}
+
+static void classification_test_pmr_term_icmp_id(void)
+{
+ odp_packet_t pkt;
+ odph_icmphdr_t *icmp;
+ uint16_t val;
+ uint16_t mask;
+ uint32_t seqno;
+ 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 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_pmr_param_t pmr_param;
+ odph_ethhdr_t *eth;
+ cls_packet_info_t pkt_info;
+
+ val = odp_cpu_to_be_16(0x1234);
+ mask = odp_cpu_to_be_16(0xffff);
+ seqno = 0;
+
+ pktio = create_pktio(ODP_QUEUE_TYPE_SCHED, pkt_pool, true);
+ CU_ASSERT_FATAL(pktio != ODP_PKTIO_INVALID);
+ retval = start_pktio(pktio);
+ CU_ASSERT(retval == 0);
+
+ configure_default_cos(pktio, &default_cos,
+ &default_queue, &default_pool);
+
+ queue = queue_create("icmp_id", true);
+ CU_ASSERT_FATAL(queue != ODP_QUEUE_INVALID);
+
+ pool = pool_create("icmp_id");
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+ sprintf(cosname, "icmp_id");
+ 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_FATAL(cos != ODP_COS_INVALID);
+
+ odp_cls_pmr_param_init(&pmr_param);
+ pmr_param.term = ODP_PMR_ICMP_ID;
+ pmr_param.match.value = &val;
+ pmr_param.match.mask = &mask;
+ pmr_param.val_sz = sizeof(val);
+
+ pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
+ CU_ASSERT(pmr != ODP_PMR_INVALID);
+
+ pkt_info = default_pkt_info;
+ pkt_info.l4_type = CLS_PKT_L4_ICMP;
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+
+ icmp = (odph_icmphdr_t *)odp_packet_l4_ptr(pkt, NULL);
+ icmp->un.echo.id = odp_cpu_to_be_16(0x1234);
+
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS, false);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+ CU_ASSERT(retqueue == queue);
+ recvpool = odp_packet_pool(pkt);
+ CU_ASSERT(recvpool == pool);
+ odp_packet_free(pkt);
+
+ /* Other packets should goto default queue */
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+
+ icmp = (odph_icmphdr_t *)odp_packet_l4_ptr(pkt, NULL);
+ icmp->un.echo.id = 0x4567;
+
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS, false);
+ 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_cls_pmr_destroy(pmr);
+ stop_pktio(pktio);
+ odp_pool_destroy(default_pool);
+ odp_pool_destroy(pool);
+ odp_queue_destroy(queue);
+ odp_queue_destroy(default_queue);
+ odp_pktio_close(pktio);
+}
+
static void classification_test_pmr_serial(void)
{
test_pmr_series(1, 0);
@@ -2688,6 +3036,21 @@ static int check_capa_sctp_dport(void)
return cls_capa.supported_terms.bit.sctp_dport;
}
+static int check_capa_icmp_type(void)
+{
+ return cls_capa.supported_terms.bit.icmp_type;
+}
+
+static int check_capa_icmp_code(void)
+{
+ return cls_capa.supported_terms.bit.icmp_code;
+}
+
+static int check_capa_icmp_id(void)
+{
+ return cls_capa.supported_terms.bit.icmp_id;
+}
+
odp_testinfo_t classification_suite_pmr[] = {
ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_tcp_dport,
check_capa_tcp_dport),
@@ -2701,6 +3064,12 @@ odp_testinfo_t classification_suite_pmr[] = {
check_capa_sctp_sport),
ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_sctp_dport,
check_capa_sctp_dport),
+ ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_icmp_type,
+ check_capa_icmp_type),
+ ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_icmp_code,
+ check_capa_icmp_code),
+ ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_icmp_id,
+ check_capa_icmp_id),
ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_ipproto,
check_capa_ip_proto),
ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_dmac,
diff --git a/test/validation/api/classification/odp_classification_testsuites.h b/test/validation/api/classification/odp_classification_testsuites.h
index 2aedcb86d..73961597a 100644
--- a/test/validation/api/classification/odp_classification_testsuites.h
+++ b/test/validation/api/classification/odp_classification_testsuites.h
@@ -16,6 +16,7 @@ typedef enum cls_packet_l4_info {
CLS_PKT_L4_TCP,
CLS_PKT_L4_UDP,
CLS_PKT_L4_SCTP,
+ CLS_PKT_L4_ICMP,
} cls_packet_l4_info;
typedef struct cls_packet_info {