From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id F28F44302D; Thu, 10 Aug 2023 20:06:58 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id DFBB640FAE; Thu, 10 Aug 2023 20:06:58 +0200 (CEST) Received: from agw.arknetworks.am (agw.arknetworks.am [79.141.165.80]) by mails.dpdk.org (Postfix) with ESMTP id A13FC406BC for ; Thu, 10 Aug 2023 20:06:57 +0200 (CEST) Received: from localhost.localdomain (unknown [78.109.70.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by agw.arknetworks.am (Postfix) with ESMTPSA id E697BE1181; Thu, 10 Aug 2023 22:06:56 +0400 (+04) From: Ivan Malov To: dev@dpdk.org Cc: Andrew Rybchenko , Ferruh Yigit , Andy Moreton Subject: [PATCH 1/2] net/sfc: offer indirect VXLAN encap action in transfer flows Date: Thu, 10 Aug 2023 22:06:55 +0400 Message-Id: <20230810180656.6046-1-ivan.malov@arknetworks.am> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Parsing inline action VXLAN_ENCAP repeating in many flows is expensive, so offer support for its indirect version. Query operation is not supported for this action. The next patch will add a means to update the encapsulation header data. Signed-off-by: Ivan Malov Reviewed-by: Andy Moreton --- .mailmap | 2 +- doc/guides/rel_notes/release_23_11.rst | 4 ++ drivers/net/sfc/sfc_flow.h | 1 + drivers/net/sfc/sfc_mae.c | 51 ++++++++++++++++++++++++++ drivers/net/sfc/sfc_mae.h | 1 + 5 files changed, 58 insertions(+), 1 deletion(-) diff --git a/.mailmap b/.mailmap index 864d33ee46..ec31ab8bd0 100644 --- a/.mailmap +++ b/.mailmap @@ -106,7 +106,7 @@ Andriy Berestovskyy Andrzej Ostruszka Andy Gospodarek Andy Green -Andy Moreton +Andy Moreton Andy Pei Anirudh Venkataramanan Ankur Dwivedi diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst index 6b4dd21fd0..dd10110fff 100644 --- a/doc/guides/rel_notes/release_23_11.rst +++ b/doc/guides/rel_notes/release_23_11.rst @@ -55,6 +55,10 @@ New Features Also, make sure to start the actual text at the margin. ======================================================= +* **Updated Solarflare network PMD.** + + * Added support for transfer flow action INDIRECT with subtype VXLAN_ENCAP. + Removed Items ------------- diff --git a/drivers/net/sfc/sfc_flow.h b/drivers/net/sfc/sfc_flow.h index 601f93e540..95fcb5abe0 100644 --- a/drivers/net/sfc/sfc_flow.h +++ b/drivers/net/sfc/sfc_flow.h @@ -98,6 +98,7 @@ struct rte_flow_action_handle { enum rte_flow_action_type type; union { + struct sfc_mae_encap_header *encap_header; struct sfc_mae_counter *counter; }; }; diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index f5fe55b46f..45a66307d2 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -663,6 +663,9 @@ sfc_mae_encap_header_attach(struct sfc_adapter *sa, SFC_ASSERT(sfc_adapter_is_locked(sa)); TAILQ_FOREACH(encap_header, &mae->encap_headers, entries) { + if (encap_header->indirect) + continue; + if (encap_header->size == bounce_eh->size && memcmp(encap_header->buf, bounce_eh->buf, bounce_eh->size) == 0) { @@ -4057,6 +4060,9 @@ sfc_mae_rule_parse_action_vxlan_encap( /* Take care of the masks. */ sfc_mae_header_force_item_masks(buf, parsed_items, nb_parsed_items); + if (spec == NULL) + return 0; + rc = efx_mae_action_set_populate_encap(spec); if (rc != 0) { rc = rte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_ACTION, @@ -4160,6 +4166,23 @@ sfc_mae_rule_parse_action_indirect(struct sfc_adapter *sa, sfc_dbg(sa, "attaching to indirect_action=%p", entry); switch (entry->type) { + case RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP: + if (ctx->encap_header != NULL) { + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, + "cannot have multiple actions VXLAN_ENCAP in one flow"); + } + + rc = efx_mae_action_set_populate_encap(ctx->spec); + if (rc != 0) { + return rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, + "failed to add ENCAP to MAE action set"); + } + + ctx->encap_header = entry->encap_header; + ++(ctx->encap_header->refcnt); + break; case RTE_FLOW_ACTION_TYPE_COUNT: if (ft_rule_type != SFC_FT_RULE_NONE) { return rte_flow_error_set(error, EINVAL, @@ -5182,12 +5205,31 @@ sfc_mae_indir_action_create(struct sfc_adapter *sa, struct rte_flow_action_handle *handle, struct rte_flow_error *error) { + struct sfc_mae *mae = &sa->mae; + bool custom_error = false; int ret; SFC_ASSERT(sfc_adapter_is_locked(sa)); SFC_ASSERT(handle != NULL); switch (action->type) { + case RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP: + /* Cleanup after previous encap. header bounce buffer usage. */ + sfc_mae_bounce_eh_invalidate(&mae->bounce_eh); + + ret = sfc_mae_rule_parse_action_vxlan_encap(mae, action->conf, + NULL, error); + if (ret != 0) { + custom_error = true; + break; + } + + ret = sfc_mae_encap_header_add(sa, &mae->bounce_eh, + &handle->encap_header); + if (ret == 0) + handle->encap_header->indirect = true; + break; + case RTE_FLOW_ACTION_TYPE_COUNT: ret = sfc_mae_rule_parse_action_count(sa, action->conf, EFX_COUNTER_TYPE_ACTION, @@ -5199,6 +5241,9 @@ sfc_mae_indir_action_create(struct sfc_adapter *sa, ret = ENOTSUP; } + if (custom_error) + return ret; + if (ret != 0) { return rte_flow_error_set(error, ret, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, @@ -5219,6 +5264,12 @@ sfc_mae_indir_action_destroy(struct sfc_adapter *sa, SFC_ASSERT(handle != NULL); switch (handle->type) { + case RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP: + if (handle->encap_header->refcnt != 1) + goto fail; + + sfc_mae_encap_header_del(sa, handle->encap_header); + break; case RTE_FLOW_ACTION_TYPE_COUNT: if (handle->counter->refcnt != 1) goto fail; diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index 059718e383..4b928f876b 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -60,6 +60,7 @@ TAILQ_HEAD(sfc_mae_mac_addrs, sfc_mae_mac_addr); struct sfc_mae_encap_header { TAILQ_ENTRY(sfc_mae_encap_header) entries; unsigned int refcnt; + bool indirect; uint8_t *buf; size_t size; efx_tunnel_protocol_t type; -- 2.31.1