diff options
author | Petri Savolainen <petri.savolainen@nokia.com> | 2022-04-19 14:51:38 +0300 |
---|---|---|
committer | Petri Savolainen <petri.savolainen@nokia.com> | 2022-05-06 10:56:16 +0300 |
commit | 8318b923246d72f071f318bf3de5d62553f34884 (patch) | |
tree | 4dd680e6ecbc8f5e34c0d63eb58131ce6d0d7e4d /platform | |
parent | fc3109170e2612de503916b8b1bd2b4c18b7685d (diff) |
linux-gen: cls: implement ODP_PMR_IP_DSCP
Implemented the new IP DSCP packet matching rule.
Signed-off-by: Petri Savolainen <petri.savolainen@nokia.com>
Reviewed-by: Tuomas Taipale <tuomas.taipale@nokia.com>
Diffstat (limited to 'platform')
-rw-r--r-- | platform/linux-generic/odp_classification.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/platform/linux-generic/odp_classification.c b/platform/linux-generic/odp_classification.c index cee8ef1fd..b87610f87 100644 --- a/platform/linux-generic/odp_classification.c +++ b/platform/linux-generic/odp_classification.c @@ -171,6 +171,7 @@ int odp_cls_capability(odp_cls_capability_t *capability) capability->supported_terms.bit.vlan_id_x = 1; capability->supported_terms.bit.dmac = 1; capability->supported_terms.bit.ip_proto = 1; + capability->supported_terms.bit.ip_dscp = 1; capability->supported_terms.bit.udp_dport = 1; capability->supported_terms.bit.udp_sport = 1; capability->supported_terms.bit.tcp_dport = 1; @@ -645,6 +646,8 @@ static int pmr_create_term(pmr_term_value_t *value, switch (term) { case ODP_PMR_IPPROTO: + /* Fall through */ + case ODP_PMR_IP_DSCP: size = 1; break; @@ -878,6 +881,28 @@ static inline int verify_pmr_ipv6_next_hdr(const _odp_ipv6hdr_t *ipv6, pmr_term_ return 0; } +static inline int verify_pmr_ipv4_dscp(const _odp_ipv4hdr_t *ipv4, pmr_term_value_t *term_value) +{ + uint8_t dscp; + + dscp = _ODP_IPV4HDR_DSCP(ipv4->tos); + if (term_value->match.value == (dscp & term_value->match.mask)) + return 1; + + return 0; +} + +static inline int verify_pmr_ipv6_dscp(const _odp_ipv6hdr_t *ipv6, pmr_term_value_t *term_value) +{ + uint8_t dscp; + + dscp = _ODP_IPV6HDR_DSCP(odp_be_to_cpu_32(ipv6->ver_tc_flow)); + if (term_value->match.value == (dscp & term_value->match.mask)) + return 1; + + return 0; +} + static inline int verify_pmr_ipv4_saddr(const uint8_t *pkt_addr, odp_packet_hdr_t *pkt_hdr, pmr_term_value_t *term_value) @@ -1305,6 +1330,17 @@ static int verify_pmr(pmr_t *pmr, const uint8_t *pkt_addr, pmr_failure = 1; } break; + case ODP_PMR_IP_DSCP: + if (ipv4) { + if (!verify_pmr_ipv4_dscp(ipv4, term_value)) + pmr_failure = 1; + } else if (ipv6) { + if (!verify_pmr_ipv6_dscp(ipv6, term_value)) + pmr_failure = 1; + } else { + pmr_failure = 1; + } + break; case ODP_PMR_UDP_DPORT: if (!verify_pmr_udp_dport(pkt_addr, pkt_hdr, term_value)) @@ -1405,6 +1441,9 @@ static const char *format_pmr_name(odp_cls_pmr_term_t pmr_term) case ODP_PMR_IPPROTO: name = "PMR_IPPROTO"; break; + case ODP_PMR_IP_DSCP: + name = "PMR_IP_DSCP"; + break; case ODP_PMR_UDP_DPORT: name = "PMR_UDP_DPORT"; break; |