From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 3E61DA09E8 for ; Tue, 8 Dec 2020 13:47:22 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 27CF372D9; Tue, 8 Dec 2020 13:47:21 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id 962B872D9 for ; Tue, 8 Dec 2020 13:47:18 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from viacheslavo@nvidia.com) with SMTP; 8 Dec 2020 14:47:17 +0200 Received: from nvidia.com (pegasus12.mtr.labs.mlnx [10.210.17.40]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 0B8ClGPk018285; Tue, 8 Dec 2020 14:47:17 +0200 From: Viacheslav Ovsiienko To: stable@dpdk.org Cc: ktraynor@redhat.com, orika@nvidia.com, Ori Kam Date: Tue, 8 Dec 2020 12:47:15 +0000 Message-Id: <1607431635-3030-1-git-send-email-viacheslavo@nvidia.com> X-Mailer: git-send-email 1.8.3.1 Subject: [dpdk-stable] [PATCH v2] [18.11] net/mlx5: fix selection between encap and decap X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" From: Ori Kam [ upstream commit 9e0d81c1a13cac520a535f259e7d3c9132770e14 ] The current raw_encap function selects if to decap or encap based on the egress/ingress attribute. This concepts doesn't work in case of FDB since all flows are considered ingress. To solve this issue we moved to check the encap size. if the encap size is larger then eth + ipv4 it means we are trying to encap. Fixes: 8ba9eee4ce32 ("net/mlx5: add raw data encap/decap to Direct Verbs") Signed-off-by: Ori Kam Acked-by: Matan Azrad --- drivers/net/mlx5/mlx5_flow_dv.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index 17a298e..3363f90 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -37,6 +37,8 @@ #ifdef HAVE_IBV_FLOW_DV_SUPPORT +#define MLX5_ENCAPSULATION_DECISION_SIZE (sizeof(struct ether_hdr) + \ + sizeof(struct ipv4_hdr)) /** * Validate VLAN item. * @@ -302,6 +304,8 @@ const struct rte_flow_attr *attr, struct rte_flow_error *error) { + const struct rte_flow_action_raw_decap *decap = action->conf; + if (action_flags & MLX5_FLOW_ACTION_DROP) return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, NULL, @@ -317,22 +321,16 @@ "can only have a single decap" " action in a flow"); /* decap action is valid on egress only if it is followed by encap */ - if (attr->egress) { - for (; action->type != RTE_FLOW_ACTION_TYPE_END && - action->type != RTE_FLOW_ACTION_TYPE_RAW_ENCAP; - action++) { - } - if (action->type != RTE_FLOW_ACTION_TYPE_RAW_ENCAP) - return rte_flow_error_set - (error, ENOTSUP, - RTE_FLOW_ERROR_TYPE_ATTR_EGRESS, - NULL, "decap action not supported" - " for egress"); + if (attr->egress && decap && + decap->size > MLX5_ENCAPSULATION_DECISION_SIZE) { + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ATTR_EGRESS, + NULL, "decap action not supported" + " for egress"); } return 0; } - /** * Find existing encap/decap resource or create and register a new one. * @@ -749,9 +747,9 @@ encap_data = (const struct rte_flow_action_raw_encap *)action->conf; res.size = encap_data->size; memcpy(res.buf, encap_data->data, res.size); - res.reformat_type = attr->egress ? - MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TO_L3_TUNNEL : - MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L3_TUNNEL_TO_L2; + res.reformat_type = res.size < MLX5_ENCAPSULATION_DECISION_SIZE ? + MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L3_TUNNEL_TO_L2 : + MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TO_L3_TUNNEL; res.ft_type = attr->egress ? MLX5DV_FLOW_TABLE_TYPE_NIC_TX : MLX5DV_FLOW_TABLE_TYPE_NIC_RX; if (flow_dv_encap_decap_resource_register(dev, &res, dev_flow, error)) -- 1.8.3.1