net/mlx5: fix RSS validation function
authorOri Kam <orika@mellanox.com>
Sun, 14 Apr 2019 07:05:21 +0000 (07:05 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 19 Apr 2019 12:51:54 +0000 (14:51 +0200)
The RSS validation function was missing the verifcation that
if RSS is requested on inner packet, the flow must have tunnel data.

Fixes: 23c1d42c7138 ("net/mlx5: split flow validation to dedicated function")
Cc: stable@dpdk.org
Signed-off-by: Ori Kam <orika@mellanox.com>
Acked-by: Yongseok Koh <yskoh@mellanox.com>
drivers/net/mlx5/mlx5_flow.c
drivers/net/mlx5/mlx5_flow.h
drivers/net/mlx5/mlx5_flow_dv.c
drivers/net/mlx5/mlx5_flow_verbs.c

index 1c78a5f..a0683ee 100644 (file)
@@ -882,6 +882,8 @@ mlx5_flow_validate_action_queue(const struct rte_flow_action *action,
  *   Pointer to the Ethernet device structure.
  * @param[in] attr
  *   Attributes of flow that includes this action.
+ * @param[in] item_flags
+ *   Items that were detected.
  * @param[out] error
  *   Pointer to error structure.
  *
@@ -893,10 +895,12 @@ mlx5_flow_validate_action_rss(const struct rte_flow_action *action,
                              uint64_t action_flags,
                              struct rte_eth_dev *dev,
                              const struct rte_flow_attr *attr,
+                             uint64_t item_flags,
                              struct rte_flow_error *error)
 {
        struct mlx5_priv *priv = dev->data->dev_private;
        const struct rte_flow_action_rss *rss = action->conf;
+       int tunnel = !!(item_flags & MLX5_FLOW_LAYER_TUNNEL);
        unsigned int i;
 
        if (action_flags & MLX5_FLOW_FATE_ACTIONS)
@@ -965,6 +969,11 @@ mlx5_flow_validate_action_rss(const struct rte_flow_action *action,
                                          RTE_FLOW_ERROR_TYPE_ATTR_EGRESS, NULL,
                                          "rss action not supported for "
                                          "egress");
+       if (rss->level > 1 &&  !tunnel)
+               return rte_flow_error_set(error, EINVAL,
+                                         RTE_FLOW_ERROR_TYPE_ACTION_CONF, NULL,
+                                         "inner RSS is not supported for "
+                                         "non-tunnel flows");
        return 0;
 }
 
index 622e305..9f47fd4 100644 (file)
@@ -443,6 +443,7 @@ int mlx5_flow_validate_action_rss(const struct rte_flow_action *action,
                                  uint64_t action_flags,
                                  struct rte_eth_dev *dev,
                                  const struct rte_flow_attr *attr,
+                                 uint64_t item_flags,
                                  struct rte_flow_error *error);
 int mlx5_flow_validate_attributes(struct rte_eth_dev *dev,
                                  const struct rte_flow_attr *attributes,
index ccb2f75..3862b26 100644 (file)
@@ -1799,7 +1799,6 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
        uint64_t action_flags = 0;
        uint64_t item_flags = 0;
        uint64_t last_item = 0;
-       int tunnel = 0;
        uint8_t next_protocol = 0xff;
        int actions_n = 0;
 
@@ -1809,7 +1808,7 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
        if (ret < 0)
                return ret;
        for (; items->type != RTE_FLOW_ITEM_TYPE_END; items++) {
-               tunnel = !!(item_flags & MLX5_FLOW_LAYER_TUNNEL);
+               int tunnel = !!(item_flags & MLX5_FLOW_LAYER_TUNNEL);
                switch (items->type) {
                case RTE_FLOW_ITEM_TYPE_VOID:
                        break;
@@ -1981,7 +1980,8 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
                case RTE_FLOW_ACTION_TYPE_RSS:
                        ret = mlx5_flow_validate_action_rss(actions,
                                                            action_flags, dev,
-                                                           attr, error);
+                                                           attr, item_flags,
+                                                           error);
                        if (ret < 0)
                                return ret;
                        action_flags |= MLX5_FLOW_ACTION_RSS;
index 3956df1..773213e 100644 (file)
@@ -1194,7 +1194,7 @@ flow_verbs_validate(struct rte_eth_dev *dev,
                case RTE_FLOW_ACTION_TYPE_RSS:
                        ret = mlx5_flow_validate_action_rss(actions,
                                                            action_flags, dev,
-                                                           attr,
+                                                           attr, item_flags,
                                                            error);
                        if (ret < 0)
                                return ret;