diff options
Diffstat (limited to 'test/validation/api/classification')
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; |