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 8DB7CA0563 for ; Wed, 15 Apr 2020 23:00:16 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 5246F1DA1B; Wed, 15 Apr 2020 23:00:16 +0200 (CEST) Received: from rcdn-iport-3.cisco.com (rcdn-iport-3.cisco.com [173.37.86.74]) by dpdk.org (Postfix) with ESMTP id 2066C1DA1B for ; Wed, 15 Apr 2020 23:00:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=3540; q=dns/txt; s=iport; t=1586984415; x=1588194015; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=4OeCbWu/c2aNnI3aufox8MnzNl6lHk+1TETkcAHdk24=; b=co7WdkCIAGs4lfM3qsF0Qc+ahCsnqNXLttXZ3ua+Ao6OgK68G0HXS0VB XxtxR+XVTeViLYco0Aus6HbCmfopeOER5G0qAnIelrJ2fSmQScZU2JV/G KLoduSqMs70jWLiOaB8CGnYn4s6NXPAhKPJol1dpQ+rkKGA7luWi7XZIU I=; X-IronPort-AV: E=Sophos;i="5.72,388,1580774400"; d="scan'208";a="739273899" Received: from rcdn-core-7.cisco.com ([173.37.93.143]) by rcdn-iport-3.cisco.com with ESMTP/TLS/DHE-RSA-SEED-SHA; 15 Apr 2020 21:00:13 +0000 Received: from cisco.com (savbu-usnic-a.cisco.com [10.193.184.48]) by rcdn-core-7.cisco.com (8.15.2/8.15.2) with ESMTP id 03FL09Ij028827; Wed, 15 Apr 2020 21:00:13 GMT Received: by cisco.com (Postfix, from userid 392789) id 527F220F2003; Wed, 15 Apr 2020 14:00:09 -0700 (PDT) From: John Daley To: stable@dpdk.org Cc: Hyong Youb Kim , John Daley Date: Wed, 15 Apr 2020 13:59:53 -0700 Message-Id: <20200415205953.28536-1-johndale@cisco.com> X-Mailer: git-send-email 2.22.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Outbound-SMTP-Client: 10.193.184.48, savbu-usnic-a.cisco.com X-Outbound-Node: rcdn-core-7.cisco.com Subject: [dpdk-stable] [PATCH 19.11] net/enic: fix action reordering 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: Hyong Youb Kim The current implementation produces wrong ordering for several cases like these: 1. mark, decap, steer Current: steer, mark, decap Correct: mark, steer, decap 2. decap, steer, steer Current: steer, steer, decap Correct: steer, decap, steer Simplify the logic and swap 1st steer and decap. Also, allow just one decap action per flow. Fixes: ea7768b5bba8 ("net/enic: add flow implementation based on Flow Manager API") Cc: stable@dpdk.org Signed-off-by: Hyong Youb Kim Signed-off-by: John Daley --- drivers/net/enic/enic_fm_flow.c | 63 +++++++++++++++------------------ 1 file changed, 29 insertions(+), 34 deletions(-) diff --git a/drivers/net/enic/enic_fm_flow.c b/drivers/net/enic/enic_fm_flow.c index d815f369ed..8d715fc436 100644 --- a/drivers/net/enic/enic_fm_flow.c +++ b/drivers/net/enic/enic_fm_flow.c @@ -870,46 +870,36 @@ enic_fm_append_action_op(struct enic_flowman *fm, return 0; } -/* Steer operations need to appear before other ops */ +/* NIC requires that 1st steer appear before decap. + * Correct example: steer, decap, steer, steer, ... + */ static void enic_fm_reorder_action_op(struct enic_flowman *fm) { - struct fm_action_op *dst, *dst_head, *src, *src_head; + struct fm_action_op *op, *steer, *decap; + struct fm_action_op tmp_op; ENICPMD_FUNC_TRACE(); - /* Move steer ops to the front. */ - src = fm->action.fma_action_ops; - src_head = src; - dst = fm->action_tmp.fma_action_ops; - dst_head = dst; - /* Copy steer ops to tmp */ - while (src->fa_op != FMOP_END) { - if (src->fa_op == FMOP_RQ_STEER) { - ENICPMD_LOG(DEBUG, "move op: %ld -> dst %ld", - (long)(src - src_head), - (long)(dst - dst_head)); - *dst = *src; - dst++; - } - src++; - } - /* Then append non-steer ops */ - src = src_head; - while (src->fa_op != FMOP_END) { - if (src->fa_op != FMOP_RQ_STEER) { - ENICPMD_LOG(DEBUG, "move op: %ld -> dst %ld", - (long)(src - src_head), - (long)(dst - dst_head)); - *dst = *src; - dst++; - } - src++; + /* Find 1st steer and decap */ + op = fm->action.fma_action_ops; + steer = NULL; + decap = NULL; + while (op->fa_op != FMOP_END) { + if (!decap && op->fa_op == FMOP_DECAP_NOSTRIP) + decap = op; + else if (!steer && op->fa_op == FMOP_RQ_STEER) + steer = op; + op++; + } + /* If decap is before steer, swap */ + if (steer && decap && decap < steer) { + op = fm->action.fma_action_ops; + ENICPMD_LOG(DEBUG, "swap decap %ld <-> steer %ld", + (long)(decap - op), (long)(steer - op)); + tmp_op = *decap; + *decap = *steer; + *steer = tmp_op; } - /* Copy END */ - *dst = *src; - /* Finally replace the original action with the reordered one */ - memcpy(fm->action.fma_action_ops, fm->action_tmp.fma_action_ops, - sizeof(fm->action.fma_action_ops)); } /* VXLAN decap is done via flowman compound action */ @@ -1100,6 +1090,7 @@ enic_fm_copy_action(struct enic_flowman *fm, PASSTHRU = 1 << 2, COUNT = 1 << 3, ENCAP = 1 << 4, + DECAP = 1 << 5, }; struct fm_tcam_match_entry *fmt; struct fm_action_op fm_op; @@ -1282,6 +1273,10 @@ enic_fm_copy_action(struct enic_flowman *fm, break; } case RTE_FLOW_ACTION_TYPE_VXLAN_DECAP: { + if (overlap & DECAP) + goto unsupported; + overlap |= DECAP; + ret = enic_fm_copy_vxlan_decap(fm, fmt, actions, error); if (ret != 0) -- 2.22.0