From ba459fad12aa5475e859ce071966c4cacc3c31f0 Mon Sep 17 00:00:00 2001 From: Igor Romanov Date: Mon, 11 Oct 2021 17:48:31 +0300 Subject: [PATCH] common/sfc_efx/base: add filter ingress mport matching field The field changes the mport for which the filter is created. It is required to filter traffic from VF on an alias mport. Signed-off-by: Igor Romanov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton Reviewed-by: Ivan Malov --- drivers/common/sfc_efx/base/ef10_filter.c | 11 +++++++++-- drivers/common/sfc_efx/base/efx.h | 3 +++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/common/sfc_efx/base/ef10_filter.c b/drivers/common/sfc_efx/base/ef10_filter.c index ac6006c9b4..6d19797d16 100644 --- a/drivers/common/sfc_efx/base/ef10_filter.c +++ b/drivers/common/sfc_efx/base/ef10_filter.c @@ -171,6 +171,7 @@ efx_mcdi_filter_op_add( EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FILTER_OP_V3_IN_LEN, MC_CMD_FILTER_OP_EXT_OUT_LEN); efx_filter_match_flags_t match_flags; + uint32_t port_id; efx_rc_t rc; req.emr_cmd = MC_CMD_FILTER_OP; @@ -180,10 +181,11 @@ efx_mcdi_filter_op_add( req.emr_out_length = MC_CMD_FILTER_OP_EXT_OUT_LEN; /* - * Remove match flag for encapsulated filters that does not correspond + * Remove EFX match flags that do not correspond * to the MCDI match flags */ match_flags = spec->efs_match_flags & ~EFX_FILTER_MATCH_ENCAP_TYPE; + match_flags &= ~EFX_FILTER_MATCH_MPORT; switch (filter_op) { case MC_CMD_FILTER_OP_IN_OP_REPLACE: @@ -202,7 +204,12 @@ efx_mcdi_filter_op_add( goto fail1; } - MCDI_IN_SET_DWORD(req, FILTER_OP_EXT_IN_PORT_ID, enp->en_vport_id); + if (spec->efs_match_flags & EFX_FILTER_MATCH_MPORT) + port_id = spec->efs_ingress_mport; + else + port_id = enp->en_vport_id; + + MCDI_IN_SET_DWORD(req, FILTER_OP_EXT_IN_PORT_ID, port_id); MCDI_IN_SET_DWORD(req, FILTER_OP_EXT_IN_MATCH_FIELDS, match_flags); if (spec->efs_dmaq_id == EFX_FILTER_SPEC_RX_DMAQ_ID_DROP) { diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index c0d1535017..7f04b42bae 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -3389,6 +3389,8 @@ typedef uint8_t efx_filter_flags_t; #define EFX_FILTER_MATCH_OUTER_VID 0x00000100 /* Match by IP transport protocol */ #define EFX_FILTER_MATCH_IP_PROTO 0x00000200 +/* Match by ingress MPORT */ +#define EFX_FILTER_MATCH_MPORT 0x00000400 /* Match by VNI or VSID */ #define EFX_FILTER_MATCH_VNI_OR_VSID 0x00000800 /* For encapsulated packets, match by inner frame local MAC address */ @@ -3451,6 +3453,7 @@ typedef struct efx_filter_spec_s { efx_oword_t efs_loc_host; uint8_t efs_vni_or_vsid[EFX_VNI_OR_VSID_LEN]; uint8_t efs_ifrm_loc_mac[EFX_MAC_ADDR_LEN]; + uint32_t efs_ingress_mport; } efx_filter_spec_t; -- 2.20.1