Counters that can be referenced by HW conntrack assistance table work similar to those of the action rules. However, their IDs belong to a separate (CT-specific) namespace.
These are 1-bit saturating counters with no byte count. Signed-off-by: Ivan Malov <ivan.ma...@arknetworks.am> Reviewed-by: Andy Moreton <amore...@xilinx.com> --- drivers/common/sfc_efx/base/efx.h | 2 ++ drivers/common/sfc_efx/base/efx_impl.h | 1 + drivers/common/sfc_efx/base/efx_mae.c | 35 +++++++++++++++++++++++--- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 10908d97ef..0534179381 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4195,6 +4195,7 @@ typedef struct efx_mae_limits_s { uint32_t eml_max_n_counters; uint32_t eml_max_n_action_counters; }; + uint32_t eml_max_n_conntrack_counters; } efx_mae_limits_t; LIBEFX_API @@ -4789,6 +4790,7 @@ efx_mae_action_set_fill_in_eh_id( */ typedef enum efx_counter_type_e { EFX_COUNTER_TYPE_ACTION = 0, + EFX_COUNTER_TYPE_CONNTRACK, } efx_counter_type_t; typedef struct efx_counter_s { diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h index 7e5701e801..09b1e95c59 100644 --- a/drivers/common/sfc_efx/base/efx_impl.h +++ b/drivers/common/sfc_efx/base/efx_impl.h @@ -842,6 +842,7 @@ typedef struct efx_mae_s { efx_mae_field_cap_t *em_outer_rule_field_caps; size_t em_outer_rule_field_caps_size; uint32_t em_max_n_action_counters; + uint32_t em_max_n_conntrack_counters; } efx_mae_t; #endif /* EFSYS_OPT_MAE */ diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index eddba0e71c..9ff887e04b 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -16,7 +16,7 @@ efx_mae_get_capabilities( efx_mcdi_req_t req; EFX_MCDI_DECLARE_BUF(payload, MC_CMD_MAE_GET_CAPS_IN_LEN, - MC_CMD_MAE_GET_CAPS_OUT_LEN); + MC_CMD_MAE_GET_CAPS_V2_OUT_LEN); struct efx_mae_s *maep = enp->en_maep; efx_rc_t rc; @@ -24,7 +24,7 @@ efx_mae_get_capabilities( req.emr_in_buf = payload; req.emr_in_length = MC_CMD_MAE_GET_CAPS_IN_LEN; req.emr_out_buf = payload; - req.emr_out_length = MC_CMD_MAE_GET_CAPS_OUT_LEN; + req.emr_out_length = MC_CMD_MAE_GET_CAPS_V2_OUT_LEN; efx_mcdi_execute(enp, &req); @@ -70,6 +70,13 @@ efx_mae_get_capabilities( maep->em_max_n_action_counters = MCDI_OUT_DWORD(req, MAE_GET_CAPS_OUT_AR_COUNTERS); + if (req.emr_out_length_used >= MC_CMD_MAE_GET_CAPS_V2_OUT_LEN) { + maep->em_max_n_conntrack_counters = + MCDI_OUT_DWORD(req, MAE_GET_CAPS_V2_OUT_CT_COUNTERS); + } else { + maep->em_max_n_conntrack_counters = 0; + } + return (0); fail2: @@ -375,6 +382,7 @@ efx_mae_get_limits( emlp->eml_encap_header_size_limit = MC_CMD_MAE_ENCAP_HEADER_ALLOC_IN_HDR_DATA_MAXNUM_MCDI2; emlp->eml_max_n_action_counters = maep->em_max_n_action_counters; + emlp->eml_max_n_conntrack_counters = maep->em_max_n_conntrack_counters; return (0); @@ -3282,11 +3290,15 @@ efx_mae_counters_alloc_type( efx_rc_t rc; EFX_STATIC_ASSERT(EFX_COUNTER_TYPE_ACTION == MAE_COUNTER_TYPE_AR); + EFX_STATIC_ASSERT(EFX_COUNTER_TYPE_CONNTRACK == MAE_COUNTER_TYPE_CT); switch (type) { case EFX_COUNTER_TYPE_ACTION: max_n_counters = maep->em_max_n_action_counters; break; + case EFX_COUNTER_TYPE_CONNTRACK: + max_n_counters = maep->em_max_n_conntrack_counters; + break; default: rc = EINVAL; goto fail1; @@ -3403,6 +3415,9 @@ efx_mae_counters_free_type( case EFX_COUNTER_TYPE_ACTION: max_n_counters = maep->em_max_n_action_counters; break; + case EFX_COUNTER_TYPE_CONNTRACK: + max_n_counters = maep->em_max_n_conntrack_counters; + break; default: rc = EINVAL; goto fail1; @@ -3505,8 +3520,11 @@ efx_mae_counters_stream_start( __out uint32_t *flags_out) { efx_mcdi_req_t req; - EFX_MCDI_DECLARE_BUF(payload, MC_CMD_MAE_COUNTERS_STREAM_START_IN_LEN, + EFX_MCDI_DECLARE_BUF(payload, + MC_CMD_MAE_COUNTERS_STREAM_START_V2_IN_LEN, MC_CMD_MAE_COUNTERS_STREAM_START_OUT_LEN); + struct efx_mae_s *maep = enp->en_maep; + uint32_t counter_types; efx_rc_t rc; EFX_STATIC_ASSERT(EFX_MAE_COUNTERS_STREAM_IN_ZERO_SQUASH_DISABLE == @@ -3517,7 +3535,7 @@ efx_mae_counters_stream_start( req.emr_cmd = MC_CMD_MAE_COUNTERS_STREAM_START; req.emr_in_buf = payload; - req.emr_in_length = MC_CMD_MAE_COUNTERS_STREAM_START_IN_LEN; + req.emr_in_length = MC_CMD_MAE_COUNTERS_STREAM_START_V2_IN_LEN; req.emr_out_buf = payload; req.emr_out_length = MC_CMD_MAE_COUNTERS_STREAM_START_OUT_LEN; @@ -3526,6 +3544,15 @@ efx_mae_counters_stream_start( packet_size); MCDI_IN_SET_DWORD(req, MAE_COUNTERS_STREAM_START_IN_FLAGS, flags_in); + counter_types = (1U << MAE_COUNTER_TYPE_AR); + + if (maep->em_max_n_conntrack_counters != 0) + counter_types |= (1U << MAE_COUNTER_TYPE_CT); + + MCDI_IN_SET_DWORD(req, + MAE_COUNTERS_STREAM_START_V2_IN_COUNTER_TYPES_MASK, + counter_types); + efx_mcdi_execute(enp, &req); if (req.emr_rc != 0) { -- 2.30.2