From: Chaoyong He <chaoyong...@corigine.com>

Add the support of offload of set IPv4 DSCP action.

Signed-off-by: Chaoyong He <chaoyong...@corigine.com>
Reviewed-by: Louis Peens <louis.pe...@corigine.com>
Signed-off-by: Simon Horman <simon.hor...@corigine.com>
---
 lib/netdev-offload-dpdk.c | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
index cceefbc50751..53d22b9bb0b2 100644
--- a/lib/netdev-offload-dpdk.c
+++ b/lib/netdev-offload-dpdk.c
@@ -770,6 +770,14 @@ dump_flow_action(struct ds *s, struct ds *s_extra,
                           IP_ARGS(set_ipv4->ipv4_addr));
         }
         ds_put_cstr(s, "/ ");
+    } else if (actions->type == RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP) {
+        const struct rte_flow_action_set_dscp *set_dscp = actions->conf;
+
+        ds_put_cstr(s, "set_dscp ");
+        if (set_dscp) {
+            ds_put_format(s, "dscp_value %d ", set_dscp->dscp);
+        }
+        ds_put_cstr(s, "/ ");
     } else if (actions->type == RTE_FLOW_ACTION_TYPE_SET_TTL) {
         const struct rte_flow_action_set_ttl *set_ttl = actions->conf;
 
@@ -1813,7 +1821,8 @@ add_output_action(struct netdev *netdev,
 static int
 add_set_flow_action__(struct flow_actions *actions,
                       const void *value, void *mask,
-                      const size_t size, const int attr)
+                      const size_t size, const int attr,
+                      bool dscp_flag)
 {
     void *spec;
 
@@ -1824,7 +1833,7 @@ add_set_flow_action__(struct flow_actions *actions,
         if (is_all_zeros(mask, size)) {
             return 0;
         }
-        if (!is_all_ones(mask, size)) {
+        if (!dscp_flag && !is_all_ones(mask, size)) {
             VLOG_DBG_RL(&rl, "Partial mask is not supported");
             return -1;
         }
@@ -1849,6 +1858,8 @@ BUILD_ASSERT_DECL(sizeof(struct rte_flow_action_set_ipv4) 
==
                   MEMBER_SIZEOF(struct ovs_key_ipv4, ipv4_src));
 BUILD_ASSERT_DECL(sizeof(struct rte_flow_action_set_ipv4) ==
                   MEMBER_SIZEOF(struct ovs_key_ipv4, ipv4_dst));
+BUILD_ASSERT_DECL(sizeof(struct rte_flow_action_set_dscp) ==
+                  MEMBER_SIZEOF(struct ovs_key_ipv4, ipv4_tos));
 BUILD_ASSERT_DECL(sizeof(struct rte_flow_action_set_ttl) ==
                   MEMBER_SIZEOF(struct ovs_key_ipv4, ipv4_ttl));
 BUILD_ASSERT_DECL(sizeof(struct rte_flow_action_set_ipv6) ==
@@ -1874,11 +1885,16 @@ parse_set_actions(struct flow_actions *actions,
 {
     const struct nlattr *sa;
     unsigned int sleft;
+    bool dscp_flag;
 
 #define add_set_flow_action(field, type)                                      \
+    dscp_flag = false;                                                        \
+    if (type == RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP) {                         \
+        dscp_flag = true;                                                     \
+    }                                                                         \
     if (add_set_flow_action__(actions, &key->field,                           \
                               mask ? CONST_CAST(void *, &mask->field) : NULL, \
-                              sizeof key->field, type)) {                     \
+                              sizeof key->field, type, dscp_flag)) {          \
         return -1;                                                            \
     }
 
@@ -1900,6 +1916,7 @@ parse_set_actions(struct flow_actions *actions,
 
             add_set_flow_action(ipv4_src, RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC);
             add_set_flow_action(ipv4_dst, RTE_FLOW_ACTION_TYPE_SET_IPV4_DST);
+            add_set_flow_action(ipv4_tos, RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP);
             add_set_flow_action(ipv4_ttl, RTE_FLOW_ACTION_TYPE_SET_TTL);
 
             if (mask && !is_all_zeros(mask, sizeof *mask)) {
-- 
2.30.2

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to