[v4,26/34] common/sfc_efx/base: support NAT edits in MAE

Message ID 20230607130245.8048-27-ivan.malov@arknetworks.am (mailing list archive)
State Accepted, archived
Delegated to: Ferruh Yigit
Headers
Series net/sfc: support HW conntrack assistance |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Ivan Malov June 7, 2023, 1:02 p.m. UTC
  NAT goes after IP TTL decrement. It can operate
on the outermost frame only. In the case of
prior decapsulation, that maps to the frame
which was (originally) the inner one. Input
data for the action comes from the response
of the HW conntrack assistance table hit.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h      | 13 +++++++++++++
 drivers/common/sfc_efx/base/efx_impl.h |  1 +
 drivers/common/sfc_efx/base/efx_mae.c  | 17 +++++++++++++++++
 drivers/common/sfc_efx/version.map     |  1 +
 4 files changed, 32 insertions(+)
  

Patch

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 5e3718050d..a296d34f29 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -4560,6 +4560,19 @@  extern	__checkReturn			efx_rc_t
 efx_mae_action_set_populate_decr_ip_ttl(
 	__in				efx_mae_actions_t *spec);
 
+/*
+ * This only requests NAT action. The replacement IP address and
+ * L4 port number, as well as the edit direction (DST/SRC), come
+ * from the response to a hit in the conntrack assistance table.
+ *
+ * The action amends the outermost frame. In the case of prior
+ * decapsulation, that maps to the (originally) inner frame.
+ */
+LIBEFX_API
+extern	__checkReturn			efx_rc_t
+efx_mae_action_set_populate_nat(
+	__in				efx_mae_actions_t *spec);
+
 LIBEFX_API
 extern	__checkReturn			efx_rc_t
 efx_mae_action_set_populate_vlan_push(
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 0a6a489d2c..e978ad0de8 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1771,6 +1771,7 @@  typedef enum efx_mae_action_e {
 	EFX_MAE_ACTION_SET_DST_MAC,
 	EFX_MAE_ACTION_SET_SRC_MAC,
 	EFX_MAE_ACTION_DECR_IP_TTL,
+	EFX_MAE_ACTION_NAT,
 	EFX_MAE_ACTION_VLAN_PUSH,
 	EFX_MAE_ACTION_COUNT,
 	EFX_MAE_ACTION_ENCAP,
diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c
index 546c743a02..aaea38c933 100644
--- a/drivers/common/sfc_efx/base/efx_mae.c
+++ b/drivers/common/sfc_efx/base/efx_mae.c
@@ -1837,6 +1837,9 @@  static const efx_mae_action_desc_t efx_mae_actions[EFX_MAE_NACTIONS] = {
 	[EFX_MAE_ACTION_DECR_IP_TTL] = {
 		.emad_add = efx_mae_action_set_no_op
 	},
+	[EFX_MAE_ACTION_NAT] = {
+		.emad_add = efx_mae_action_set_no_op
+	},
 	[EFX_MAE_ACTION_VLAN_PUSH] = {
 		.emad_add = efx_mae_action_set_add_vlan_push
 	},
@@ -1863,6 +1866,7 @@  static const uint32_t efx_mae_action_ordered_map =
 	(1U << EFX_MAE_ACTION_SET_DST_MAC) |
 	(1U << EFX_MAE_ACTION_SET_SRC_MAC) |
 	(1U << EFX_MAE_ACTION_DECR_IP_TTL) |
+	(1U << EFX_MAE_ACTION_NAT) |
 	(1U << EFX_MAE_ACTION_VLAN_PUSH) |
 	/*
 	 * HW will conduct action COUNT after
@@ -2038,6 +2042,14 @@  efx_mae_action_set_populate_decr_ip_ttl(
 	return (rc);
 }
 
+	__checkReturn			efx_rc_t
+efx_mae_action_set_populate_nat(
+	__in				efx_mae_actions_t *spec)
+{
+	return (efx_mae_action_set_spec_populate(spec,
+	    EFX_MAE_ACTION_NAT, 0, NULL));
+}
+
 	__checkReturn			efx_rc_t
 efx_mae_action_set_populate_vlan_push(
 	__in				efx_mae_actions_t *spec,
@@ -3093,6 +3105,11 @@  efx_mae_action_set_alloc(
 		    MAE_ACTION_SET_ALLOC_IN_DO_DECR_IP_TTL, 1);
 	}
 
+	if ((spec->ema_actions & (1U << EFX_MAE_ACTION_NAT)) != 0) {
+		MCDI_IN_SET_DWORD_FIELD(req, MAE_ACTION_SET_ALLOC_IN_FLAGS,
+		    MAE_ACTION_SET_ALLOC_IN_DO_NAT, 1);
+	}
+
 	if (spec->ema_n_vlan_tags_to_push > 0) {
 		unsigned int outer_tag_idx;
 
diff --git a/drivers/common/sfc_efx/version.map b/drivers/common/sfc_efx/version.map
index 28a2be0a95..1ff760a024 100644
--- a/drivers/common/sfc_efx/version.map
+++ b/drivers/common/sfc_efx/version.map
@@ -104,6 +104,7 @@  INTERNAL {
 	efx_mae_action_set_populate_flag;
 	efx_mae_action_set_populate_mark;
 	efx_mae_action_set_populate_mark_reset;
+	efx_mae_action_set_populate_nat;
 	efx_mae_action_set_populate_set_dst_mac;
 	efx_mae_action_set_populate_set_src_mac;
 	efx_mae_action_set_populate_vlan_pop;