]> git.droids-corp.org - dpdk.git/commitdiff
common/sfc_efx/base: support recirculation ID in outer rules
authorIvan Malov <ivan.malov@oktetlabs.ru>
Wed, 13 Oct 2021 13:15:05 +0000 (16:15 +0300)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 13 Oct 2021 14:39:11 +0000 (16:39 +0200)
When an outer rule is hit, it can pass recirculation ID down
to action rule lookup, and action rules can match on this ID
instead of matching on the outer rule allocation handle.
By default, recirculation ID is assumed to be zero.

Add an API to set recirculation ID in outer rules.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Acked-by: Ray Kinsella <mdr@ashroe.eu>
drivers/common/sfc_efx/base/efx.h
drivers/common/sfc_efx/base/efx_impl.h
drivers/common/sfc_efx/base/efx_mae.c
drivers/common/sfc_efx/version.map

index e05261218b789e5677f767aa32e73eb2f81e3216..c835b6749c5d6a3ae5d5b5e2a92f9432cc333084 100644 (file)
@@ -4507,6 +4507,15 @@ typedef struct efx_mae_rule_id_s {
        uint32_t id;
 } efx_mae_rule_id_t;
 
+/*
+ * Set the initial recirculation ID. It goes to action rule (AR) lookup.
+ */
+LIBEFX_API
+extern __checkReturn                   efx_rc_t
+efx_mae_outer_rule_recirc_id_set(
+       __in                            efx_mae_match_spec_t *spec,
+       __in                            uint8_t recirc_id);
+
 LIBEFX_API
 extern __checkReturn           efx_rc_t
 efx_mae_outer_rule_insert(
index e0efbb8cdd2a9ecc91550bed1e4f403f2f966e7f..5dcdb9c78d8fa1f0babfb00f7ea063fb98d5ddac 100644 (file)
@@ -1733,6 +1733,7 @@ struct efx_mae_match_spec_s {
                                            MAE_FIELD_MASK_VALUE_PAIRS_V2_LEN];
                uint8_t                 outer[MAE_ENC_FIELD_PAIRS_LEN];
        } emms_mask_value_pairs;
+       uint8_t                         emms_outer_rule_recirc_id;
 };
 
 typedef enum efx_mae_action_e {
index 110addd92db620847b39eed2c9e54a3e95f8e051..d87949a6c56abb66702af24dc948c6e6ce59179f 100644 (file)
@@ -2111,6 +2111,27 @@ done:
 
 fail2:
        EFSYS_PROBE(fail2);
+fail1:
+       EFSYS_PROBE1(fail1, efx_rc_t, rc);
+       return (rc);
+}
+
+       __checkReturn                   efx_rc_t
+efx_mae_outer_rule_recirc_id_set(
+       __in                            efx_mae_match_spec_t *spec,
+       __in                            uint8_t recirc_id)
+{
+       efx_rc_t rc;
+
+       if (spec->emms_type != EFX_MAE_RULE_OUTER) {
+               rc = EINVAL;
+               goto fail1;
+       }
+
+       spec->emms_outer_rule_recirc_id = recirc_id;
+
+       return (0);
+
 fail1:
        EFSYS_PROBE1(fail1, efx_rc_t, rc);
        return (rc);
@@ -2189,6 +2210,9 @@ efx_mae_outer_rule_insert(
        memcpy(payload + offset, spec->emms_mask_value_pairs.outer,
            MAE_ENC_FIELD_PAIRS_LEN);
 
+       MCDI_IN_SET_BYTE(req, MAE_OUTER_RULE_INSERT_IN_RECIRC_ID,
+           spec->emms_outer_rule_recirc_id);
+
        efx_mcdi_execute(enp, &req);
 
        if (req.emr_rc != 0) {
index 346deb4b122971152e0e80036841c91f3dded739..e728ea3e02bedeff1b991d3acfbb6f167dc641a7 100644 (file)
@@ -132,6 +132,7 @@ INTERNAL {
        efx_mae_mport_id_by_selector;
        efx_mae_mport_invalid;
        efx_mae_outer_rule_insert;
+       efx_mae_outer_rule_recirc_id_set;
        efx_mae_outer_rule_remove;
        efx_mae_read_mport_journal;