The DPDK driver would like to have a means to make a copy of
the action rule match specification before trying to dissect
it to possibly move out the per-connection 5-tuple data from
it to build up an entry in the HW conntrack assistance table.
Making such a copy at the end of parsing should be preferred
over maintaining DPDK-level structures because the resulting
code is easier on eyes and less prone to errors in this case.
Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
drivers/common/sfc_efx/base/efx.h | 7 +++++++
drivers/common/sfc_efx/base/efx_mae.c | 26 ++++++++++++++++++++++++++
drivers/common/sfc_efx/version.map | 1 +
3 files changed, 34 insertions(+)
@@ -4452,6 +4452,13 @@ efx_mae_match_spec_recirc_id_set(
__in efx_mae_match_spec_t *spec,
__in uint8_t recirc_id);
+LIBEFX_API
+extern __checkReturn efx_rc_t
+efx_mae_match_spec_clone(
+ __in efx_nic_t *enp,
+ __in efx_mae_match_spec_t *orig,
+ __out efx_mae_match_spec_t **clonep);
+
LIBEFX_API
extern __checkReturn boolean_t
efx_mae_match_specs_equal(
@@ -1163,6 +1163,32 @@ efx_mae_match_spec_mport_set(
fail2:
EFSYS_PROBE(fail2);
+fail1:
+ EFSYS_PROBE1(fail1, efx_rc_t, rc);
+ return (rc);
+}
+
+ __checkReturn efx_rc_t
+efx_mae_match_spec_clone(
+ __in efx_nic_t *enp,
+ __in efx_mae_match_spec_t *orig,
+ __out efx_mae_match_spec_t **clonep)
+{
+ efx_mae_match_spec_t *clone;
+ efx_rc_t rc;
+
+ EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (*clone), clone);
+ if (clone == NULL) {
+ rc = ENOMEM;
+ goto fail1;
+ }
+
+ memcpy(clone, orig, sizeof (efx_mae_match_spec_t));
+
+ *clonep = clone;
+
+ return (0);
+
fail1:
EFSYS_PROBE1(fail1, efx_rc_t, rc);
return (rc);
@@ -124,6 +124,7 @@ INTERNAL {
efx_mae_mac_addr_alloc;
efx_mae_mac_addr_free;
efx_mae_match_spec_bit_set;
+ efx_mae_match_spec_clone;
efx_mae_match_spec_field_set;
efx_mae_match_spec_fini;
efx_mae_match_spec_init;