aboutsummaryrefslogtreecommitdiff
path: root/test/validation/api/classification
diff options
context:
space:
mode:
Diffstat (limited to 'test/validation/api/classification')
-rw-r--r--test/validation/api/classification/odp_classification_common.c5
-rw-r--r--test/validation/api/classification/odp_classification_test_pmr.c119
-rw-r--r--test/validation/api/classification/odp_classification_testsuites.h3
3 files changed, 121 insertions, 6 deletions
diff --git a/test/validation/api/classification/odp_classification_common.c b/test/validation/api/classification/odp_classification_common.c
index dd8373b04..8eac41a1e 100644
--- a/test/validation/api/classification/odp_classification_common.c
+++ b/test/validation/api/classification/odp_classification_common.c
@@ -417,7 +417,7 @@ odp_packet_t create_packet(cls_packet_info_t pkt_info)
ip->tot_len = odp_cpu_to_be_16(l3_len);
ip->ttl = DEFAULT_TTL;
ip->frag_offset = 0;
- ip->tos = 0;
+ ip->tos = pkt_info.dscp << ODPH_IP_TOS_DSCP_SHIFT;
odp_packet_has_ipv4_set(pkt, 1);
odph_ipv4_csum_update(pkt);
} else {
@@ -425,7 +425,8 @@ odp_packet_t create_packet(cls_packet_info_t pkt_info)
odp_packet_has_ipv6_set(pkt, 1);
ipv6 = (odph_ipv6hdr_t *)odp_packet_l3_ptr(pkt, NULL);
version = ODPH_IPV6 << ODPH_IPV6HDR_VERSION_SHIFT;
- tc = DEFAULT_TOS << ODPH_IPV6HDR_TC_SHIFT;
+ tc = pkt_info.dscp << ODPH_IP_TOS_DSCP_SHIFT;
+ tc <<= ODPH_IPV6HDR_TC_SHIFT;
flow = seqno << ODPH_IPV6HDR_FLOW_LABEL_SHIFT;
ver_tc_flow = version | tc | flow;
diff --git a/test/validation/api/classification/odp_classification_test_pmr.c b/test/validation/api/classification/odp_classification_test_pmr.c
index 068e2112c..e69f077a2 100644
--- a/test/validation/api/classification/odp_classification_test_pmr.c
+++ b/test/validation/api/classification/odp_classification_test_pmr.c
@@ -13,6 +13,8 @@
#define MAX_NUM_UDP 4
#define MARK_IP 1
#define MARK_UDP 2
+#define TEST_IPV4 false
+#define TEST_IPV6 true
static odp_pool_t pkt_pool;
/** sequence number of IP packets */
@@ -560,7 +562,7 @@ static void classification_test_pmr_term_udp_sport(void)
test_pmr(&pmr_param, pkt, NO_MATCH);
}
-static void classification_test_pmr_term_ipproto(void)
+static void classification_test_pmr_term_proto(odp_bool_t ipv6)
{
odp_packet_t pkt;
uint8_t val;
@@ -578,18 +580,73 @@ static void classification_test_pmr_term_ipproto(void)
pmr_param.val_sz = sizeof(val);
pkt_info = default_pkt_info;
+ pkt_info.ipv6 = ipv6;
pkt_info.l4_type = CLS_PKT_L4_UDP;
pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
test_pmr(&pmr_param, pkt, MATCH);
- pkt = create_packet(default_pkt_info);
+ pkt_info.l4_type = CLS_PKT_L4_TCP;
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
test_pmr(&pmr_param, pkt, NO_MATCH);
}
+static void classification_test_pmr_term_ipv4_proto(void)
+{
+ classification_test_pmr_term_proto(TEST_IPV4);
+}
+
+static void classification_test_pmr_term_ipv6_proto(void)
+{
+ classification_test_pmr_term_proto(TEST_IPV6);
+}
+
+static void classification_test_pmr_term_dscp(odp_bool_t ipv6)
+{
+ odp_packet_t pkt;
+ uint8_t val;
+ uint8_t mask;
+ odp_pmr_param_t pmr_param;
+ cls_packet_info_t pkt_info;
+
+ val = DSCP_CLASS4;
+ mask = 0x3f;
+
+ odp_cls_pmr_param_init(&pmr_param);
+ pmr_param.term = ODP_PMR_IP_DSCP;
+ pmr_param.match.value = &val;
+ pmr_param.match.mask = &mask;
+ pmr_param.val_sz = sizeof(val);
+
+ pkt_info = default_pkt_info;
+ pkt_info.ipv6 = ipv6;
+ pkt_info.l4_type = CLS_PKT_L4_UDP;
+ pkt_info.dscp = DSCP_CLASS4;
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+
+ test_pmr(&pmr_param, pkt, MATCH);
+
+ pkt_info.dscp = 0;
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+
+ test_pmr(&pmr_param, pkt, NO_MATCH);
+}
+
+static void classification_test_pmr_term_ipv4_dscp(void)
+{
+ classification_test_pmr_term_dscp(TEST_IPV4);
+}
+
+static void classification_test_pmr_term_ipv6_dscp(void)
+{
+ classification_test_pmr_term_dscp(TEST_IPV6);
+}
+
static void classification_test_pmr_term_dmac(void)
{
odp_packet_t pkt;
@@ -797,6 +854,44 @@ static void classification_test_pmr_term_vlan_id_x(void)
test_pmr(&pmr_param, pkt, NO_MATCH);
}
+static void classification_test_pmr_term_vlan_pcp_0(void)
+{
+ odp_packet_t pkt;
+ uint8_t val;
+ uint8_t mask;
+ uint16_t tci;
+ odp_pmr_param_t pmr_param;
+ odph_ethhdr_t *eth;
+ odph_vlanhdr_t *vlan_0;
+ cls_packet_info_t pkt_info;
+
+ val = 5;
+ mask = 0x7;
+ tci = ((uint16_t)val) << ODPH_VLANHDR_PCP_SHIFT;
+ tci |= 0x123;
+
+ odp_cls_pmr_param_init(&pmr_param);
+ pmr_param.term = ODP_PMR_VLAN_PCP_0;
+ pmr_param.match.value = &val;
+ pmr_param.match.mask = &mask;
+ pmr_param.val_sz = sizeof(val);
+
+ pkt_info = default_pkt_info;
+ pkt_info.vlan = true;
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ vlan_0 = (odph_vlanhdr_t *)(eth + 1);
+ vlan_0->tci = odp_cpu_to_be_16(tci);
+
+ test_pmr(&pmr_param, pkt, MATCH);
+
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+
+ test_pmr(&pmr_param, pkt, NO_MATCH);
+}
+
static void classification_test_pmr_term_eth_type_0(void)
{
odp_packet_t pkt;
@@ -1803,6 +1898,11 @@ static int check_capa_ip_proto(void)
return cls_capa.supported_terms.bit.ip_proto;
}
+static int check_capa_ip_dscp(void)
+{
+ return cls_capa.supported_terms.bit.ip_dscp;
+}
+
static int check_capa_dmac(void)
{
return cls_capa.supported_terms.bit.dmac;
@@ -1843,6 +1943,11 @@ static int check_capa_vlan_id_x(void)
return cls_capa.supported_terms.bit.vlan_id_x;
}
+static int check_capa_vlan_pcp_0(void)
+{
+ return cls_capa.supported_terms.bit.vlan_pcp_0;
+}
+
static int check_capa_ethtype_0(void)
{
return cls_capa.supported_terms.bit.ethtype_0;
@@ -1945,8 +2050,14 @@ odp_testinfo_t classification_suite_pmr[] = {
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,
+ ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_ipv4_proto,
+ check_capa_ip_proto),
+ ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_ipv6_proto,
check_capa_ip_proto),
+ ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_ipv4_dscp,
+ check_capa_ip_dscp),
+ ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_ipv6_dscp,
+ check_capa_ip_dscp),
ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_dmac,
check_capa_dmac),
ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_pool_set,
@@ -1967,6 +2078,8 @@ odp_testinfo_t classification_suite_pmr[] = {
check_capa_vlan_id_0),
ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_vlan_id_x,
check_capa_vlan_id_x),
+ ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_vlan_pcp_0,
+ check_capa_vlan_pcp_0),
ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_eth_type_0,
check_capa_ethtype_0),
ODP_TEST_INFO_CONDITIONAL(classification_test_pmr_term_eth_type_x,
diff --git a/test/validation/api/classification/odp_classification_testsuites.h b/test/validation/api/classification/odp_classification_testsuites.h
index 6b00e138b..592f37cd6 100644
--- a/test/validation/api/classification/odp_classification_testsuites.h
+++ b/test/validation/api/classification/odp_classification_testsuites.h
@@ -27,7 +27,8 @@ typedef struct cls_packet_info {
bool vlan_qinq;
odp_atomic_u32_t *seq;
cls_packet_l4_info l4_type;
- bool ipv6;
+ odp_bool_t ipv6;
+ uint8_t dscp;
uint32_t len;
} cls_packet_info_t;