]> git.droids-corp.org - dpdk.git/commitdiff
net/mlx5: fix layer validation with decapsulation
authorSuanming Mou <suanmingm@mellanox.com>
Wed, 19 Feb 2020 14:26:19 +0000 (16:26 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 21 Feb 2020 10:41:20 +0000 (11:41 +0100)
Currently, the flow validate function only validate the outermost layer
with the header modify actions. If there is decapsulation action before
the header modify action, the validation should choose the inner layer
for validation.

Add decapsulation check when validate with the header modify actions.
Choose the inner layer once there is decapsulation action.

Fixes: 4bb14c83df95 ("net/mlx5: support modify header using Direct Verbs")
Cc: stable@dpdk.org
Signed-off-by: Suanming Mou <suanmingm@mellanox.com>
Acked-by: Matan Azrad <matan@mellanox.com>
drivers/net/mlx5/mlx5_flow_dv.c

index 99d668f5d35840cf117c63389e87e1c6342f0a2f..caa0ff8badeb024904ec8e4f9577bbd5b24f940f 100644 (file)
@@ -3096,10 +3096,14 @@ flow_dv_validate_action_modify_ipv4(const uint64_t action_flags,
                                    struct rte_flow_error *error)
 {
        int ret = 0;
+       uint64_t layer;
 
        ret = flow_dv_validate_action_modify_hdr(action_flags, action, error);
        if (!ret) {
-               if (!(item_flags & MLX5_FLOW_LAYER_L3_IPV4))
+               layer = (action_flags & MLX5_FLOW_ACTION_DECAP) ?
+                                MLX5_FLOW_LAYER_INNER_L3_IPV4 :
+                                MLX5_FLOW_LAYER_OUTER_L3_IPV4;
+               if (!(item_flags & layer))
                        return rte_flow_error_set(error, EINVAL,
                                                  RTE_FLOW_ERROR_TYPE_ACTION,
                                                  NULL,
@@ -3130,10 +3134,14 @@ flow_dv_validate_action_modify_ipv6(const uint64_t action_flags,
                                    struct rte_flow_error *error)
 {
        int ret = 0;
+       uint64_t layer;
 
        ret = flow_dv_validate_action_modify_hdr(action_flags, action, error);
        if (!ret) {
-               if (!(item_flags & MLX5_FLOW_LAYER_L3_IPV6))
+               layer = (action_flags & MLX5_FLOW_ACTION_DECAP) ?
+                                MLX5_FLOW_LAYER_INNER_L3_IPV6 :
+                                MLX5_FLOW_LAYER_OUTER_L3_IPV6;
+               if (!(item_flags & layer))
                        return rte_flow_error_set(error, EINVAL,
                                                  RTE_FLOW_ERROR_TYPE_ACTION,
                                                  NULL,
@@ -3164,10 +3172,14 @@ flow_dv_validate_action_modify_tp(const uint64_t action_flags,
                                  struct rte_flow_error *error)
 {
        int ret = 0;
+       uint64_t layer;
 
        ret = flow_dv_validate_action_modify_hdr(action_flags, action, error);
        if (!ret) {
-               if (!(item_flags & MLX5_FLOW_LAYER_L4))
+               layer = (action_flags & MLX5_FLOW_ACTION_DECAP) ?
+                                MLX5_FLOW_LAYER_INNER_L4 :
+                                MLX5_FLOW_LAYER_OUTER_L4;
+               if (!(item_flags & layer))
                        return rte_flow_error_set(error, EINVAL,
                                                  RTE_FLOW_ERROR_TYPE_ACTION,
                                                  NULL, "no transport layer "
@@ -3199,10 +3211,14 @@ flow_dv_validate_action_modify_tcp_seq(const uint64_t action_flags,
                                       struct rte_flow_error *error)
 {
        int ret = 0;
+       uint64_t layer;
 
        ret = flow_dv_validate_action_modify_hdr(action_flags, action, error);
        if (!ret) {
-               if (!(item_flags & MLX5_FLOW_LAYER_OUTER_L4_TCP))
+               layer = (action_flags & MLX5_FLOW_ACTION_DECAP) ?
+                                MLX5_FLOW_LAYER_INNER_L4_TCP :
+                                MLX5_FLOW_LAYER_OUTER_L4_TCP;
+               if (!(item_flags & layer))
                        return rte_flow_error_set(error, EINVAL,
                                                  RTE_FLOW_ERROR_TYPE_ACTION,
                                                  NULL, "no TCP item in"
@@ -3244,10 +3260,14 @@ flow_dv_validate_action_modify_tcp_ack(const uint64_t action_flags,
                                       struct rte_flow_error *error)
 {
        int ret = 0;
+       uint64_t layer;
 
        ret = flow_dv_validate_action_modify_hdr(action_flags, action, error);
        if (!ret) {
-               if (!(item_flags & MLX5_FLOW_LAYER_OUTER_L4_TCP))
+               layer = (action_flags & MLX5_FLOW_ACTION_DECAP) ?
+                                MLX5_FLOW_LAYER_INNER_L4_TCP :
+                                MLX5_FLOW_LAYER_OUTER_L4_TCP;
+               if (!(item_flags & layer))
                        return rte_flow_error_set(error, EINVAL,
                                                  RTE_FLOW_ERROR_TYPE_ACTION,
                                                  NULL, "no TCP item in"
@@ -3288,10 +3308,14 @@ flow_dv_validate_action_modify_ttl(const uint64_t action_flags,
                                   struct rte_flow_error *error)
 {
        int ret = 0;
+       uint64_t layer;
 
        ret = flow_dv_validate_action_modify_hdr(action_flags, action, error);
        if (!ret) {
-               if (!(item_flags & MLX5_FLOW_LAYER_L3))
+               layer = (action_flags & MLX5_FLOW_ACTION_DECAP) ?
+                                MLX5_FLOW_LAYER_INNER_L3 :
+                                MLX5_FLOW_LAYER_OUTER_L3;
+               if (!(item_flags & layer))
                        return rte_flow_error_set(error, EINVAL,
                                                  RTE_FLOW_ERROR_TYPE_ACTION,
                                                  NULL,