aboutsummaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorPetri Savolainen <petri.savolainen@nokia.com>2022-04-19 14:51:38 +0300
committerPetri Savolainen <petri.savolainen@nokia.com>2022-05-06 10:56:16 +0300
commit8318b923246d72f071f318bf3de5d62553f34884 (patch)
tree4dd680e6ecbc8f5e34c0d63eb58131ce6d0d7e4d /platform
parentfc3109170e2612de503916b8b1bd2b4c18b7685d (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.c39
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;