From patchwork Tue Oct 20 08:47:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81466 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 64D8CA04DD; Tue, 20 Oct 2020 10:57:33 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 65929BDD1; Tue, 20 Oct 2020 10:49:39 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id E0E30AD31 for ; Tue, 20 Oct 2020 10:49:02 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id AFDF660072 for ; Tue, 20 Oct 2020 08:49:02 +0000 (UTC) Received: from us4-mdac16-34.ut7.mdlocal (unknown [10.7.66.153]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id AE99D2009A for ; Tue, 20 Oct 2020 08:49:02 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id AF4271C0052 for ; Tue, 20 Oct 2020 08:49:01 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 43AA0800058 for ; Tue, 20 Oct 2020 08:49:01 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:49 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mlWQ030781; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id B285A1613AB; Tue, 20 Oct 2020 09:48:47 +0100 (BST) From: Andrew Rybchenko To: CC: Date: Tue, 20 Oct 2020 09:47:28 +0100 Message-ID: <1603183709-23420-2-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-8.318700-8.000000-10 X-TMASE-MatchedRID: nqTfqdy9M36ly3dXM0lKB6iUivh0j2PvhVDnkfzD7uYHZBaLwEXlKIpb wG9fIuITHebbkc89dEwhoTAGY824W+yeWPPgrMIYh2VzUlo4HVMrU8f3oY88YHT7g/hbrl6O/YV dpWbTtm547GweXS1KXV2Z08i5P5U5rYQtKUgtKHt0MmXend7y+QILzOoe9wba6RNIxUAxRZUFMR sHQxcbHDanEBya9eQtV+wLeGLmWlILfKDZOEp85mCRdM7s1cEUHxfSqP7l10w7OtcKFS0EBKTAV MIKlsVHB+X4plgLh5vviy2cibg/wKM80IzerXKHMy+jMkhCdFY9KBt6tnyFcr+Z3Zp2Td1E9WXm +yhJKyjpRDkvyUzUl4mbvuoYZl9cyhs+gnQcjAJvwVJGkXUdCQeCHewokHM/j6Xh9k1IeO4f9eu Hcx8uYpghffuIWz8Amtk6mLR4ImdLF43MnY8dliYac9U7dCKf9wXxnluKnXudzjX37VUcWkRXbl yzWMGt1ZsoV3KwJdpI8iEzK7lCGLWQaypdnXaBGLet1ulBcPsTcSAXT4xW4GKuDy0kKGx0aJp4a jE5mvK55esTdqddrRz2hE5OocQmgu5ly6Nrcn/98X1Z7McbyeU9R6b8nlzkl23GX7Au7dQmDp3G Egik5i3Oea0Vks5u6KtHTudAdNONTCl4ZDDq7JixDyZ4rnsHA96VLx8Kcq6MUViaYYbK3P7SGZ5 JTlJIsetPWXeY7o10rt7vXLWAnm/cHuU/JlpMyq0aou1D6Wz+IchFbM0oo6tkcxxU6EVI/+9HBw 3oLFxpZ3KY9716rXF1RziwF2Z/TWQjyUs6+bKeAiCmPx4NwGmRqNBHmBveg6X7YSXnSlqO0wnpR A5PLLxAi7jPoeEQftwZ3X11IV0= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--8.318700-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183742-o4LB8wiln2E6 X-PPE-DISP: 1603183742;o4LB8wiln2E6 Subject: [dpdk-dev] [PATCH 01/62] common/sfc_efx/base: add MAE definitions to MCDI X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" MAE stands for Match-Action-Engine and will be used to support rte_flow API transfer rules. Signed-off-by: Andrew Rybchenko --- drivers/common/sfc_efx/base/efx_regs_mcdi.h | 2232 +++++++++++++++++++ 1 file changed, 2232 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx_regs_mcdi.h b/drivers/common/sfc_efx/base/efx_regs_mcdi.h index f31a25e4ff..7125d053e8 100644 --- a/drivers/common/sfc_efx/base/efx_regs_mcdi.h +++ b/drivers/common/sfc_efx/base/efx_regs_mcdi.h @@ -410,6 +410,151 @@ #define MC_CMD_RESOURCE_INSTANCE_ANY 0xffffffff #define MC_CMD_RESOURCE_INSTANCE_NONE 0xfffffffe /* enum */ +/* MAE_FIELD_SUPPORT_STATUS enum */ +/* enum: The NIC does not support this field. The driver must ensure that any + * mask associated with this field in a match rule is zeroed. The NIC may + * either reject requests with an invalid mask for such a field, or may assume + * that the mask is zero. (This category only exists to describe behaviour for + * fields that a newer driver might know about but that older firmware does + * not. It is recommended that firmware report MAE_FIELD_FIELD_MATCH_NEVER for + * all match fields defined at the time of its compilation. If a driver see a + * field support status value that it does not recognise, it must treat that + * field as thought the field was reported as MAE_FIELD_SUPPORTED_MATCH_NEVER, + * and must never set a non-zero mask value for this field. + */ +#define MAE_FIELD_UNSUPPORTED 0x0 +/* enum: The NIC supports this field, but cannot use it in a match rule. The + * driver must ensure that any mask for such a field in a match rule is zeroed. + * The NIC will reject requests with an invalid mask for such a field. + */ +#define MAE_FIELD_SUPPORTED_MATCH_NEVER 0x1 +/* enum: The NIC supports this field, and must use it in all match rules. The + * driver must ensure that any mask for such a field is all ones. The NIC will + * reject requests with an invalid mask for such a field. + */ +#define MAE_FIELD_SUPPORTED_MATCH_ALWAYS 0x2 +/* enum: The NIC supports this field, and may optionally use it in match rules. + * The driver must ensure that any mask for such a field is either all zeroes + * or all ones. The NIC will reject requests with an invalid mask for such a + * field. + */ +#define MAE_FIELD_SUPPORTED_MATCH_OPTIONAL 0x3 +/* enum: The NIC supports this field, and may optionally use it in match rules. + * The driver must ensure that any mask for such a field is either all zeroes + * or a consecutive set of ones following by all zeroes (starting from MSB). + * The NIC will reject requests with an invalid mask for such a field. + */ +#define MAE_FIELD_SUPPORTED_MATCH_PREFIX 0x4 +/* enum: The NIC supports this field, and may optionally use it in match rules. + * The driver may provide an arbitrary mask for such a field. + */ +#define MAE_FIELD_SUPPORTED_MATCH_MASK 0x5 + +/* MAE_FIELD enum: NB: this enum shares namespace with the support status enum. + */ +/* enum: Source mport upon entering the MAE. */ +#define MAE_FIELD_INGRESS_PORT 0x0 +#define MAE_FIELD_MARK 0x1 /* enum */ +/* enum: Table ID used in action rule. Initially zero, can be changed in action + * rule response. + */ +#define MAE_FIELD_RECIRC_ID 0x2 +#define MAE_FIELD_IS_IP_FRAG 0x3 /* enum */ +#define MAE_FIELD_DO_CT 0x4 /* enum */ +#define MAE_FIELD_CT_HIT 0x5 /* enum */ +/* enum: Undefined unless CT_HIT=1. */ +#define MAE_FIELD_CT_MARK 0x6 +/* enum: Undefined unless DO_CT=1. */ +#define MAE_FIELD_CT_DOMAIN 0x7 +/* enum: Undefined unless CT_HIT=1. */ +#define MAE_FIELD_CT_PRIVATE_FLAGS 0x8 +/* enum: 1 if the packet ingressed the NIC from one of the MACs, else 0. */ +#define MAE_FIELD_IS_FROM_NETWORK 0x9 +#define MAE_FIELD_ETHER_TYPE 0x21 /* enum */ +#define MAE_FIELD_VLAN0_TCI 0x22 /* enum */ +#define MAE_FIELD_VLAN0_PROTO 0x23 /* enum */ +#define MAE_FIELD_VLAN1_TCI 0x24 /* enum */ +#define MAE_FIELD_VLAN1_PROTO 0x25 /* enum */ +/* enum: Inner when encap */ +#define MAE_FIELD_ETH_SADDR 0x28 +/* enum: Inner when encap */ +#define MAE_FIELD_ETH_DADDR 0x29 +/* enum: Inner when encap. NB: IPv4 and IPv6 fields are mutually exclusive. */ +#define MAE_FIELD_SRC_IP4 0x2a +/* enum: Inner when encap */ +#define MAE_FIELD_SRC_IP6 0x2b +/* enum: Inner when encap */ +#define MAE_FIELD_DST_IP4 0x2c +/* enum: Inner when encap */ +#define MAE_FIELD_DST_IP6 0x2d +/* enum: Inner when encap */ +#define MAE_FIELD_IP_PROTO 0x2e +/* enum: Inner when encap */ +#define MAE_FIELD_IP_TOS 0x2f +/* enum: Inner when encap */ +#define MAE_FIELD_IP_TTL 0x30 +/* enum: Inner when encap TODO: how this is defined? The raw flags + + * frag_offset from the packet, or some derived value more amenable to ternary + * matching? TODO: there was a proposal for driver-allocation fields. The + * driver would provide some instruction for how to extract given field values, + * and would be given a field id in return. It could then use that field id in + * its matches. This feels like it would be extremely hard to implement in + * hardware, but I mention it for completeness. + */ +#define MAE_FIELD_IP_FLAGS 0x31 +/* enum: Ports (UDP, TCP) Inner when encap */ +#define MAE_FIELD_L4_SPORT 0x32 +/* enum: Ports (UDP, TCP) Inner when encap */ +#define MAE_FIELD_L4_DPORT 0x33 +/* enum: Inner when encap */ +#define MAE_FIELD_TCP_FLAGS 0x34 +/* enum: The type of encapsulated used for this packet. Value as per + * ENCAP_TYPE_*. + */ +#define MAE_FIELD_ENCAP_TYPE 0x3f +/* enum: The ID of the outer rule that marked this packet as encapsulated. + * Useful for implicitly matching on outer fields. + */ +#define MAE_FIELD_OUTER_RULE_ID 0x40 +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_ETHER_TYPE 0x41 +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_VLAN0_TCI 0x42 +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_VLAN0_PROTO 0x43 +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_VLAN1_TCI 0x44 +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_VLAN1_PROTO 0x45 +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_ETH_SADDR 0x48 +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_ETH_DADDR 0x49 +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_SRC_IP4 0x4a +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_SRC_IP6 0x4b +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_DST_IP4 0x4c +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_DST_IP6 0x4d +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_IP_PROTO 0x4e +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_IP_TOS 0x4f +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_IP_TTL 0x50 +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_IP_FLAGS 0x51 +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_L4_SPORT 0x52 +/* enum: Outer; only present when encap */ +#define MAE_FIELD_ENC_L4_DPORT 0x53 +/* enum: VNI (when VXLAN or GENEVE) VSID (when NVGRE) Outer; only present when + * encap + */ +#define MAE_FIELD_ENC_VNET_ID 0x54 + /* MAE_MCDI_ENCAP_TYPE enum: Encapsulation type. Defines how the payload will * be parsed to an inner frame. Other values are reserved. Unknown values * should be treated same as NONE. @@ -25644,6 +25789,900 @@ #define MC_CMD_GET_ADDR_SPC_ID_OUT_ADDR_SPC_ID_LO_OFST 0 #define MC_CMD_GET_ADDR_SPC_ID_OUT_ADDR_SPC_ID_HI_OFST 4 +/* MAE_FIELD_FLAGS structuredef */ +#define MAE_FIELD_FLAGS_LEN 4 +#define MAE_FIELD_FLAGS_FLAT_OFST 0 +#define MAE_FIELD_FLAGS_FLAT_LEN 4 +#define MAE_FIELD_FLAGS_SUPPORT_STATUS_OFST 0 +#define MAE_FIELD_FLAGS_SUPPORT_STATUS_LBN 0 +#define MAE_FIELD_FLAGS_SUPPORT_STATUS_WIDTH 6 +#define MAE_FIELD_FLAGS_MASK_AFFECTS_CLASS_OFST 0 +#define MAE_FIELD_FLAGS_MASK_AFFECTS_CLASS_LBN 6 +#define MAE_FIELD_FLAGS_MASK_AFFECTS_CLASS_WIDTH 1 +#define MAE_FIELD_FLAGS_MATCH_AFFECTS_CLASS_OFST 0 +#define MAE_FIELD_FLAGS_MATCH_AFFECTS_CLASS_LBN 7 +#define MAE_FIELD_FLAGS_MATCH_AFFECTS_CLASS_WIDTH 1 +#define MAE_FIELD_FLAGS_FLAT_LBN 0 +#define MAE_FIELD_FLAGS_FLAT_WIDTH 32 + +/* MAE_ENC_FIELD_PAIRS structuredef: Mask and value pairs for all fields that + * it makes sense to use to determine the encapsulation type of a packet. Its + * intended use is to keep a common packing of fields across multiple MCDI + * commands, keeping things inherently sychronised and allowing code shared. To + * use in an MCDI command, the command should end with a variable length byte + * array populated with this structure. Do not extend this structure. Instead, + * create _Vx versions with the necessary fields appended. That way, the + * existing semantics for extending MCDI commands are preserved. + */ +#define MAE_ENC_FIELD_PAIRS_LEN 156 +#define MAE_ENC_FIELD_PAIRS_INGRESS_MPORT_SELECTOR_OFST 0 +#define MAE_ENC_FIELD_PAIRS_INGRESS_MPORT_SELECTOR_LEN 4 +#define MAE_ENC_FIELD_PAIRS_INGRESS_MPORT_SELECTOR_LBN 0 +#define MAE_ENC_FIELD_PAIRS_INGRESS_MPORT_SELECTOR_WIDTH 32 +#define MAE_ENC_FIELD_PAIRS_INGRESS_MPORT_SELECTOR_MASK_OFST 4 +#define MAE_ENC_FIELD_PAIRS_INGRESS_MPORT_SELECTOR_MASK_LEN 4 +#define MAE_ENC_FIELD_PAIRS_INGRESS_MPORT_SELECTOR_MASK_LBN 32 +#define MAE_ENC_FIELD_PAIRS_INGRESS_MPORT_SELECTOR_MASK_WIDTH 32 +#define MAE_ENC_FIELD_PAIRS_ENC_ETHER_TYPE_BE_OFST 8 +#define MAE_ENC_FIELD_PAIRS_ENC_ETHER_TYPE_BE_LEN 2 +#define MAE_ENC_FIELD_PAIRS_ENC_ETHER_TYPE_BE_LBN 64 +#define MAE_ENC_FIELD_PAIRS_ENC_ETHER_TYPE_BE_WIDTH 16 +#define MAE_ENC_FIELD_PAIRS_ENC_ETHER_TYPE_BE_MASK_OFST 10 +#define MAE_ENC_FIELD_PAIRS_ENC_ETHER_TYPE_BE_MASK_LEN 2 +#define MAE_ENC_FIELD_PAIRS_ENC_ETHER_TYPE_BE_MASK_LBN 80 +#define MAE_ENC_FIELD_PAIRS_ENC_ETHER_TYPE_BE_MASK_WIDTH 16 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN0_TCI_BE_OFST 12 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN0_TCI_BE_LEN 2 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN0_TCI_BE_LBN 96 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN0_TCI_BE_WIDTH 16 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN0_TCI_BE_MASK_OFST 14 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN0_TCI_BE_MASK_LEN 2 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN0_TCI_BE_MASK_LBN 112 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN0_TCI_BE_MASK_WIDTH 16 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN0_PROTO_BE_OFST 16 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN0_PROTO_BE_LEN 2 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN0_PROTO_BE_LBN 128 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN0_PROTO_BE_WIDTH 16 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN0_PROTO_BE_MASK_OFST 18 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN0_PROTO_BE_MASK_LEN 2 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN0_PROTO_BE_MASK_LBN 144 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN0_PROTO_BE_MASK_WIDTH 16 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN1_TCI_BE_OFST 20 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN1_TCI_BE_LEN 2 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN1_TCI_BE_LBN 160 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN1_TCI_BE_WIDTH 16 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN1_TCI_BE_MASK_OFST 22 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN1_TCI_BE_MASK_LEN 2 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN1_TCI_BE_MASK_LBN 176 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN1_TCI_BE_MASK_WIDTH 16 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN1_PROTO_BE_OFST 24 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN1_PROTO_BE_LEN 2 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN1_PROTO_BE_LBN 192 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN1_PROTO_BE_WIDTH 16 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN1_PROTO_BE_MASK_OFST 26 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN1_PROTO_BE_MASK_LEN 2 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN1_PROTO_BE_MASK_LBN 208 +#define MAE_ENC_FIELD_PAIRS_ENC_VLAN1_PROTO_BE_MASK_WIDTH 16 +#define MAE_ENC_FIELD_PAIRS_ENC_ETH_SADDR_BE_OFST 28 +#define MAE_ENC_FIELD_PAIRS_ENC_ETH_SADDR_BE_LEN 6 +#define MAE_ENC_FIELD_PAIRS_ENC_ETH_SADDR_BE_LBN 224 +#define MAE_ENC_FIELD_PAIRS_ENC_ETH_SADDR_BE_WIDTH 48 +#define MAE_ENC_FIELD_PAIRS_ENC_ETH_SADDR_BE_MASK_OFST 34 +#define MAE_ENC_FIELD_PAIRS_ENC_ETH_SADDR_BE_MASK_LEN 6 +#define MAE_ENC_FIELD_PAIRS_ENC_ETH_SADDR_BE_MASK_LBN 272 +#define MAE_ENC_FIELD_PAIRS_ENC_ETH_SADDR_BE_MASK_WIDTH 48 +#define MAE_ENC_FIELD_PAIRS_ENC_ETH_DADDR_BE_OFST 40 +#define MAE_ENC_FIELD_PAIRS_ENC_ETH_DADDR_BE_LEN 6 +#define MAE_ENC_FIELD_PAIRS_ENC_ETH_DADDR_BE_LBN 320 +#define MAE_ENC_FIELD_PAIRS_ENC_ETH_DADDR_BE_WIDTH 48 +#define MAE_ENC_FIELD_PAIRS_ENC_ETH_DADDR_BE_MASK_OFST 46 +#define MAE_ENC_FIELD_PAIRS_ENC_ETH_DADDR_BE_MASK_LEN 6 +#define MAE_ENC_FIELD_PAIRS_ENC_ETH_DADDR_BE_MASK_LBN 368 +#define MAE_ENC_FIELD_PAIRS_ENC_ETH_DADDR_BE_MASK_WIDTH 48 +#define MAE_ENC_FIELD_PAIRS_ENC_SRC_IP4_BE_OFST 52 +#define MAE_ENC_FIELD_PAIRS_ENC_SRC_IP4_BE_LEN 4 +#define MAE_ENC_FIELD_PAIRS_ENC_SRC_IP4_BE_LBN 416 +#define MAE_ENC_FIELD_PAIRS_ENC_SRC_IP4_BE_WIDTH 32 +#define MAE_ENC_FIELD_PAIRS_ENC_SRC_IP4_BE_MASK_OFST 56 +#define MAE_ENC_FIELD_PAIRS_ENC_SRC_IP4_BE_MASK_LEN 4 +#define MAE_ENC_FIELD_PAIRS_ENC_SRC_IP4_BE_MASK_LBN 448 +#define MAE_ENC_FIELD_PAIRS_ENC_SRC_IP4_BE_MASK_WIDTH 32 +#define MAE_ENC_FIELD_PAIRS_ENC_SRC_IP6_BE_OFST 60 +#define MAE_ENC_FIELD_PAIRS_ENC_SRC_IP6_BE_LEN 16 +#define MAE_ENC_FIELD_PAIRS_ENC_SRC_IP6_BE_LBN 480 +#define MAE_ENC_FIELD_PAIRS_ENC_SRC_IP6_BE_WIDTH 128 +#define MAE_ENC_FIELD_PAIRS_ENC_SRC_IP6_BE_MASK_OFST 76 +#define MAE_ENC_FIELD_PAIRS_ENC_SRC_IP6_BE_MASK_LEN 16 +#define MAE_ENC_FIELD_PAIRS_ENC_SRC_IP6_BE_MASK_LBN 608 +#define MAE_ENC_FIELD_PAIRS_ENC_SRC_IP6_BE_MASK_WIDTH 128 +#define MAE_ENC_FIELD_PAIRS_ENC_DST_IP4_BE_OFST 92 +#define MAE_ENC_FIELD_PAIRS_ENC_DST_IP4_BE_LEN 4 +#define MAE_ENC_FIELD_PAIRS_ENC_DST_IP4_BE_LBN 736 +#define MAE_ENC_FIELD_PAIRS_ENC_DST_IP4_BE_WIDTH 32 +#define MAE_ENC_FIELD_PAIRS_ENC_DST_IP4_BE_MASK_OFST 96 +#define MAE_ENC_FIELD_PAIRS_ENC_DST_IP4_BE_MASK_LEN 4 +#define MAE_ENC_FIELD_PAIRS_ENC_DST_IP4_BE_MASK_LBN 768 +#define MAE_ENC_FIELD_PAIRS_ENC_DST_IP4_BE_MASK_WIDTH 32 +#define MAE_ENC_FIELD_PAIRS_ENC_DST_IP6_BE_OFST 100 +#define MAE_ENC_FIELD_PAIRS_ENC_DST_IP6_BE_LEN 16 +#define MAE_ENC_FIELD_PAIRS_ENC_DST_IP6_BE_LBN 800 +#define MAE_ENC_FIELD_PAIRS_ENC_DST_IP6_BE_WIDTH 128 +#define MAE_ENC_FIELD_PAIRS_ENC_DST_IP6_BE_MASK_OFST 116 +#define MAE_ENC_FIELD_PAIRS_ENC_DST_IP6_BE_MASK_LEN 16 +#define MAE_ENC_FIELD_PAIRS_ENC_DST_IP6_BE_MASK_LBN 928 +#define MAE_ENC_FIELD_PAIRS_ENC_DST_IP6_BE_MASK_WIDTH 128 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_PROTO_OFST 132 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_PROTO_LEN 1 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_PROTO_LBN 1056 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_PROTO_WIDTH 8 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_PROTO_MASK_OFST 133 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_PROTO_MASK_LEN 1 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_PROTO_MASK_LBN 1064 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_PROTO_MASK_WIDTH 8 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_TOS_OFST 134 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_TOS_LEN 1 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_TOS_LBN 1072 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_TOS_WIDTH 8 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_TOS_MASK_OFST 135 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_TOS_MASK_LEN 1 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_TOS_MASK_LBN 1080 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_TOS_MASK_WIDTH 8 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_TTL_OFST 136 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_TTL_LEN 1 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_TTL_LBN 1088 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_TTL_WIDTH 8 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_TTL_MASK_OFST 137 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_TTL_MASK_LEN 1 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_TTL_MASK_LBN 1096 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_TTL_MASK_WIDTH 8 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_FLAGS_BE_OFST 140 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_FLAGS_BE_LEN 4 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_FLAGS_BE_LBN 1120 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_FLAGS_BE_WIDTH 32 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_FLAGS_BE_MASK_OFST 144 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_FLAGS_BE_MASK_LEN 4 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_FLAGS_BE_MASK_LBN 1152 +#define MAE_ENC_FIELD_PAIRS_ENC_IP_FLAGS_BE_MASK_WIDTH 32 +#define MAE_ENC_FIELD_PAIRS_ENC_L4_SPORT_BE_OFST 148 +#define MAE_ENC_FIELD_PAIRS_ENC_L4_SPORT_BE_LEN 2 +#define MAE_ENC_FIELD_PAIRS_ENC_L4_SPORT_BE_LBN 1184 +#define MAE_ENC_FIELD_PAIRS_ENC_L4_SPORT_BE_WIDTH 16 +#define MAE_ENC_FIELD_PAIRS_ENC_L4_SPORT_BE_MASK_OFST 150 +#define MAE_ENC_FIELD_PAIRS_ENC_L4_SPORT_BE_MASK_LEN 2 +#define MAE_ENC_FIELD_PAIRS_ENC_L4_SPORT_BE_MASK_LBN 1200 +#define MAE_ENC_FIELD_PAIRS_ENC_L4_SPORT_BE_MASK_WIDTH 16 +#define MAE_ENC_FIELD_PAIRS_ENC_L4_DPORT_BE_OFST 152 +#define MAE_ENC_FIELD_PAIRS_ENC_L4_DPORT_BE_LEN 2 +#define MAE_ENC_FIELD_PAIRS_ENC_L4_DPORT_BE_LBN 1216 +#define MAE_ENC_FIELD_PAIRS_ENC_L4_DPORT_BE_WIDTH 16 +#define MAE_ENC_FIELD_PAIRS_ENC_L4_DPORT_BE_MASK_OFST 154 +#define MAE_ENC_FIELD_PAIRS_ENC_L4_DPORT_BE_MASK_LEN 2 +#define MAE_ENC_FIELD_PAIRS_ENC_L4_DPORT_BE_MASK_LBN 1232 +#define MAE_ENC_FIELD_PAIRS_ENC_L4_DPORT_BE_MASK_WIDTH 16 + +/* MAE_FIELD_MASK_VALUE_PAIRS structuredef: Mask and value pairs for all fields + * currently defined. Same semantics as MAE_ENC_FIELD_PAIRS. + */ +#define MAE_FIELD_MASK_VALUE_PAIRS_LEN 344 +#define MAE_FIELD_MASK_VALUE_PAIRS_INGRESS_MPORT_SELECTOR_OFST 0 +#define MAE_FIELD_MASK_VALUE_PAIRS_INGRESS_MPORT_SELECTOR_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_INGRESS_MPORT_SELECTOR_LBN 0 +#define MAE_FIELD_MASK_VALUE_PAIRS_INGRESS_MPORT_SELECTOR_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_INGRESS_MPORT_SELECTOR_MASK_OFST 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_INGRESS_MPORT_SELECTOR_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_INGRESS_MPORT_SELECTOR_MASK_LBN 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_INGRESS_MPORT_SELECTOR_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_MARK_OFST 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_MARK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_MARK_LBN 64 +#define MAE_FIELD_MASK_VALUE_PAIRS_MARK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_MARK_MASK_OFST 12 +#define MAE_FIELD_MASK_VALUE_PAIRS_MARK_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_MARK_MASK_LBN 96 +#define MAE_FIELD_MASK_VALUE_PAIRS_MARK_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETHER_TYPE_BE_OFST 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETHER_TYPE_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETHER_TYPE_BE_LBN 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETHER_TYPE_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETHER_TYPE_BE_MASK_OFST 18 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETHER_TYPE_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETHER_TYPE_BE_MASK_LBN 144 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETHER_TYPE_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN0_TCI_BE_OFST 20 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN0_TCI_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN0_TCI_BE_LBN 160 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN0_TCI_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN0_TCI_BE_MASK_OFST 22 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN0_TCI_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN0_TCI_BE_MASK_LBN 176 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN0_TCI_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN0_PROTO_BE_OFST 24 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN0_PROTO_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN0_PROTO_BE_LBN 192 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN0_PROTO_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN0_PROTO_BE_MASK_OFST 26 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN0_PROTO_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN0_PROTO_BE_MASK_LBN 208 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN0_PROTO_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN1_TCI_BE_OFST 28 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN1_TCI_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN1_TCI_BE_LBN 224 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN1_TCI_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN1_TCI_BE_MASK_OFST 30 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN1_TCI_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN1_TCI_BE_MASK_LBN 240 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN1_TCI_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN1_PROTO_BE_OFST 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN1_PROTO_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN1_PROTO_BE_LBN 256 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN1_PROTO_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN1_PROTO_BE_MASK_OFST 34 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN1_PROTO_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN1_PROTO_BE_MASK_LBN 272 +#define MAE_FIELD_MASK_VALUE_PAIRS_VLAN1_PROTO_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETH_SADDR_BE_OFST 36 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETH_SADDR_BE_LEN 6 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETH_SADDR_BE_LBN 288 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETH_SADDR_BE_WIDTH 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETH_SADDR_BE_MASK_OFST 42 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETH_SADDR_BE_MASK_LEN 6 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETH_SADDR_BE_MASK_LBN 336 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETH_SADDR_BE_MASK_WIDTH 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETH_DADDR_BE_OFST 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETH_DADDR_BE_LEN 6 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETH_DADDR_BE_LBN 384 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETH_DADDR_BE_WIDTH 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETH_DADDR_BE_MASK_OFST 54 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETH_DADDR_BE_MASK_LEN 6 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETH_DADDR_BE_MASK_LBN 432 +#define MAE_FIELD_MASK_VALUE_PAIRS_ETH_DADDR_BE_MASK_WIDTH 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_SRC_IP4_BE_OFST 60 +#define MAE_FIELD_MASK_VALUE_PAIRS_SRC_IP4_BE_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_SRC_IP4_BE_LBN 480 +#define MAE_FIELD_MASK_VALUE_PAIRS_SRC_IP4_BE_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_SRC_IP4_BE_MASK_OFST 64 +#define MAE_FIELD_MASK_VALUE_PAIRS_SRC_IP4_BE_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_SRC_IP4_BE_MASK_LBN 512 +#define MAE_FIELD_MASK_VALUE_PAIRS_SRC_IP4_BE_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_SRC_IP6_BE_OFST 68 +#define MAE_FIELD_MASK_VALUE_PAIRS_SRC_IP6_BE_LEN 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_SRC_IP6_BE_LBN 544 +#define MAE_FIELD_MASK_VALUE_PAIRS_SRC_IP6_BE_WIDTH 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_SRC_IP6_BE_MASK_OFST 84 +#define MAE_FIELD_MASK_VALUE_PAIRS_SRC_IP6_BE_MASK_LEN 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_SRC_IP6_BE_MASK_LBN 672 +#define MAE_FIELD_MASK_VALUE_PAIRS_SRC_IP6_BE_MASK_WIDTH 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_DST_IP4_BE_OFST 100 +#define MAE_FIELD_MASK_VALUE_PAIRS_DST_IP4_BE_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_DST_IP4_BE_LBN 800 +#define MAE_FIELD_MASK_VALUE_PAIRS_DST_IP4_BE_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_DST_IP4_BE_MASK_OFST 104 +#define MAE_FIELD_MASK_VALUE_PAIRS_DST_IP4_BE_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_DST_IP4_BE_MASK_LBN 832 +#define MAE_FIELD_MASK_VALUE_PAIRS_DST_IP4_BE_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_DST_IP6_BE_OFST 108 +#define MAE_FIELD_MASK_VALUE_PAIRS_DST_IP6_BE_LEN 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_DST_IP6_BE_LBN 864 +#define MAE_FIELD_MASK_VALUE_PAIRS_DST_IP6_BE_WIDTH 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_DST_IP6_BE_MASK_OFST 124 +#define MAE_FIELD_MASK_VALUE_PAIRS_DST_IP6_BE_MASK_LEN 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_DST_IP6_BE_MASK_LBN 992 +#define MAE_FIELD_MASK_VALUE_PAIRS_DST_IP6_BE_MASK_WIDTH 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_PROTO_OFST 140 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_PROTO_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_PROTO_LBN 1120 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_PROTO_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_PROTO_MASK_OFST 141 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_PROTO_MASK_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_PROTO_MASK_LBN 1128 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_PROTO_MASK_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_TOS_OFST 142 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_TOS_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_TOS_LBN 1136 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_TOS_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_TOS_MASK_OFST 143 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_TOS_MASK_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_TOS_MASK_LBN 1144 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_TOS_MASK_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_TTL_OFST 144 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_TTL_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_TTL_LBN 1152 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_TTL_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_TTL_MASK_OFST 145 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_TTL_MASK_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_TTL_MASK_LBN 1160 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_TTL_MASK_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_FLAGS_BE_OFST 148 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_FLAGS_BE_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_FLAGS_BE_LBN 1184 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_FLAGS_BE_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_FLAGS_BE_MASK_OFST 152 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_FLAGS_BE_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_FLAGS_BE_MASK_LBN 1216 +#define MAE_FIELD_MASK_VALUE_PAIRS_IP_FLAGS_BE_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_L4_SPORT_BE_OFST 156 +#define MAE_FIELD_MASK_VALUE_PAIRS_L4_SPORT_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_L4_SPORT_BE_LBN 1248 +#define MAE_FIELD_MASK_VALUE_PAIRS_L4_SPORT_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_L4_SPORT_BE_MASK_OFST 158 +#define MAE_FIELD_MASK_VALUE_PAIRS_L4_SPORT_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_L4_SPORT_BE_MASK_LBN 1264 +#define MAE_FIELD_MASK_VALUE_PAIRS_L4_SPORT_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_L4_DPORT_BE_OFST 160 +#define MAE_FIELD_MASK_VALUE_PAIRS_L4_DPORT_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_L4_DPORT_BE_LBN 1280 +#define MAE_FIELD_MASK_VALUE_PAIRS_L4_DPORT_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_L4_DPORT_BE_MASK_OFST 162 +#define MAE_FIELD_MASK_VALUE_PAIRS_L4_DPORT_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_L4_DPORT_BE_MASK_LBN 1296 +#define MAE_FIELD_MASK_VALUE_PAIRS_L4_DPORT_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_TCP_FLAGS_BE_OFST 164 +#define MAE_FIELD_MASK_VALUE_PAIRS_TCP_FLAGS_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_TCP_FLAGS_BE_LBN 1312 +#define MAE_FIELD_MASK_VALUE_PAIRS_TCP_FLAGS_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_TCP_FLAGS_BE_MASK_OFST 166 +#define MAE_FIELD_MASK_VALUE_PAIRS_TCP_FLAGS_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_TCP_FLAGS_BE_MASK_LBN 1328 +#define MAE_FIELD_MASK_VALUE_PAIRS_TCP_FLAGS_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENCAP_TYPE_OFST 168 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENCAP_TYPE_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENCAP_TYPE_LBN 1344 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENCAP_TYPE_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENCAP_TYPE_MASK_OFST 172 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENCAP_TYPE_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENCAP_TYPE_MASK_LBN 1376 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENCAP_TYPE_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_OUTER_RULE_ID_OFST 176 +#define MAE_FIELD_MASK_VALUE_PAIRS_OUTER_RULE_ID_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_OUTER_RULE_ID_LBN 1408 +#define MAE_FIELD_MASK_VALUE_PAIRS_OUTER_RULE_ID_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_OUTER_RULE_ID_MASK_OFST 180 +#define MAE_FIELD_MASK_VALUE_PAIRS_OUTER_RULE_ID_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_OUTER_RULE_ID_MASK_LBN 1440 +#define MAE_FIELD_MASK_VALUE_PAIRS_OUTER_RULE_ID_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETHER_TYPE_BE_OFST 184 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETHER_TYPE_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETHER_TYPE_BE_LBN 1472 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETHER_TYPE_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETHER_TYPE_BE_MASK_OFST 188 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETHER_TYPE_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETHER_TYPE_BE_MASK_LBN 1504 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETHER_TYPE_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN0_TCI_BE_OFST 192 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN0_TCI_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN0_TCI_BE_LBN 1536 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN0_TCI_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN0_TCI_BE_MASK_OFST 194 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN0_TCI_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN0_TCI_BE_MASK_LBN 1552 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN0_TCI_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN0_PROTO_BE_OFST 196 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN0_PROTO_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN0_PROTO_BE_LBN 1568 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN0_PROTO_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN0_PROTO_BE_MASK_OFST 198 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN0_PROTO_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN0_PROTO_BE_MASK_LBN 1584 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN0_PROTO_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN1_TCI_BE_OFST 200 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN1_TCI_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN1_TCI_BE_LBN 1600 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN1_TCI_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN1_TCI_BE_MASK_OFST 202 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN1_TCI_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN1_TCI_BE_MASK_LBN 1616 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN1_TCI_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN1_PROTO_BE_OFST 204 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN1_PROTO_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN1_PROTO_BE_LBN 1632 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN1_PROTO_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN1_PROTO_BE_MASK_OFST 206 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN1_PROTO_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN1_PROTO_BE_MASK_LBN 1648 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VLAN1_PROTO_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETH_SADDR_BE_OFST 208 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETH_SADDR_BE_LEN 6 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETH_SADDR_BE_LBN 1664 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETH_SADDR_BE_WIDTH 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETH_SADDR_BE_MASK_OFST 214 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETH_SADDR_BE_MASK_LEN 6 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETH_SADDR_BE_MASK_LBN 1712 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETH_SADDR_BE_MASK_WIDTH 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETH_DADDR_BE_OFST 220 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETH_DADDR_BE_LEN 6 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETH_DADDR_BE_LBN 1760 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETH_DADDR_BE_WIDTH 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETH_DADDR_BE_MASK_OFST 226 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETH_DADDR_BE_MASK_LEN 6 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETH_DADDR_BE_MASK_LBN 1808 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_ETH_DADDR_BE_MASK_WIDTH 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_SRC_IP4_BE_OFST 232 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_SRC_IP4_BE_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_SRC_IP4_BE_LBN 1856 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_SRC_IP4_BE_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_SRC_IP4_BE_MASK_OFST 236 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_SRC_IP4_BE_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_SRC_IP4_BE_MASK_LBN 1888 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_SRC_IP4_BE_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_SRC_IP6_BE_OFST 240 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_SRC_IP6_BE_LEN 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_SRC_IP6_BE_LBN 1920 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_SRC_IP6_BE_WIDTH 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_SRC_IP6_BE_MASK_OFST 256 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_SRC_IP6_BE_MASK_LEN 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_SRC_IP6_BE_MASK_LBN 2048 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_SRC_IP6_BE_MASK_WIDTH 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_DST_IP4_BE_OFST 272 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_DST_IP4_BE_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_DST_IP4_BE_LBN 2176 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_DST_IP4_BE_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_DST_IP4_BE_MASK_OFST 276 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_DST_IP4_BE_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_DST_IP4_BE_MASK_LBN 2208 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_DST_IP4_BE_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_DST_IP6_BE_OFST 280 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_DST_IP6_BE_LEN 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_DST_IP6_BE_LBN 2240 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_DST_IP6_BE_WIDTH 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_DST_IP6_BE_MASK_OFST 296 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_DST_IP6_BE_MASK_LEN 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_DST_IP6_BE_MASK_LBN 2368 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_DST_IP6_BE_MASK_WIDTH 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_PROTO_OFST 312 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_PROTO_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_PROTO_LBN 2496 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_PROTO_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_PROTO_MASK_OFST 313 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_PROTO_MASK_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_PROTO_MASK_LBN 2504 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_PROTO_MASK_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_TOS_OFST 314 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_TOS_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_TOS_LBN 2512 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_TOS_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_TOS_MASK_OFST 315 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_TOS_MASK_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_TOS_MASK_LBN 2520 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_TOS_MASK_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_TTL_OFST 316 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_TTL_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_TTL_LBN 2528 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_TTL_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_TTL_MASK_OFST 317 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_TTL_MASK_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_TTL_MASK_LBN 2536 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_TTL_MASK_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_FLAGS_BE_OFST 320 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_FLAGS_BE_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_FLAGS_BE_LBN 2560 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_FLAGS_BE_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_FLAGS_BE_MASK_OFST 324 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_FLAGS_BE_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_FLAGS_BE_MASK_LBN 2592 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_IP_FLAGS_BE_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_L4_SPORT_BE_OFST 328 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_L4_SPORT_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_L4_SPORT_BE_LBN 2624 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_L4_SPORT_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_L4_SPORT_BE_MASK_OFST 330 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_L4_SPORT_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_L4_SPORT_BE_MASK_LBN 2640 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_L4_SPORT_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_L4_DPORT_BE_OFST 332 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_L4_DPORT_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_L4_DPORT_BE_LBN 2656 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_L4_DPORT_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_L4_DPORT_BE_MASK_OFST 334 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_L4_DPORT_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_L4_DPORT_BE_MASK_LBN 2672 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_L4_DPORT_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VNET_ID_BE_OFST 336 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VNET_ID_BE_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VNET_ID_BE_LBN 2688 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VNET_ID_BE_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VNET_ID_BE_MASK_OFST 340 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VNET_ID_BE_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VNET_ID_BE_MASK_LBN 2720 +#define MAE_FIELD_MASK_VALUE_PAIRS_ENC_VNET_ID_BE_MASK_WIDTH 32 + +/* MAE_FIELD_MASK_VALUE_PAIRS_V2 structuredef */ +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_LEN 372 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_INGRESS_MPORT_SELECTOR_OFST 0 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_INGRESS_MPORT_SELECTOR_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_INGRESS_MPORT_SELECTOR_LBN 0 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_INGRESS_MPORT_SELECTOR_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_INGRESS_MPORT_SELECTOR_MASK_OFST 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_INGRESS_MPORT_SELECTOR_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_INGRESS_MPORT_SELECTOR_MASK_LBN 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_INGRESS_MPORT_SELECTOR_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_MARK_OFST 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_MARK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_MARK_LBN 64 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_MARK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_MARK_MASK_OFST 12 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_MARK_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_MARK_MASK_LBN 96 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_MARK_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETHER_TYPE_BE_OFST 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETHER_TYPE_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETHER_TYPE_BE_LBN 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETHER_TYPE_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETHER_TYPE_BE_MASK_OFST 18 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETHER_TYPE_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETHER_TYPE_BE_MASK_LBN 144 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETHER_TYPE_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN0_TCI_BE_OFST 20 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN0_TCI_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN0_TCI_BE_LBN 160 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN0_TCI_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN0_TCI_BE_MASK_OFST 22 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN0_TCI_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN0_TCI_BE_MASK_LBN 176 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN0_TCI_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN0_PROTO_BE_OFST 24 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN0_PROTO_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN0_PROTO_BE_LBN 192 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN0_PROTO_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN0_PROTO_BE_MASK_OFST 26 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN0_PROTO_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN0_PROTO_BE_MASK_LBN 208 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN0_PROTO_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN1_TCI_BE_OFST 28 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN1_TCI_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN1_TCI_BE_LBN 224 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN1_TCI_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN1_TCI_BE_MASK_OFST 30 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN1_TCI_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN1_TCI_BE_MASK_LBN 240 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN1_TCI_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN1_PROTO_BE_OFST 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN1_PROTO_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN1_PROTO_BE_LBN 256 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN1_PROTO_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN1_PROTO_BE_MASK_OFST 34 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN1_PROTO_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN1_PROTO_BE_MASK_LBN 272 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_VLAN1_PROTO_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETH_SADDR_BE_OFST 36 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETH_SADDR_BE_LEN 6 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETH_SADDR_BE_LBN 288 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETH_SADDR_BE_WIDTH 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETH_SADDR_BE_MASK_OFST 42 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETH_SADDR_BE_MASK_LEN 6 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETH_SADDR_BE_MASK_LBN 336 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETH_SADDR_BE_MASK_WIDTH 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETH_DADDR_BE_OFST 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETH_DADDR_BE_LEN 6 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETH_DADDR_BE_LBN 384 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETH_DADDR_BE_WIDTH 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETH_DADDR_BE_MASK_OFST 54 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETH_DADDR_BE_MASK_LEN 6 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETH_DADDR_BE_MASK_LBN 432 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ETH_DADDR_BE_MASK_WIDTH 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_SRC_IP4_BE_OFST 60 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_SRC_IP4_BE_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_SRC_IP4_BE_LBN 480 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_SRC_IP4_BE_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_SRC_IP4_BE_MASK_OFST 64 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_SRC_IP4_BE_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_SRC_IP4_BE_MASK_LBN 512 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_SRC_IP4_BE_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_SRC_IP6_BE_OFST 68 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_SRC_IP6_BE_LEN 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_SRC_IP6_BE_LBN 544 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_SRC_IP6_BE_WIDTH 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_SRC_IP6_BE_MASK_OFST 84 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_SRC_IP6_BE_MASK_LEN 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_SRC_IP6_BE_MASK_LBN 672 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_SRC_IP6_BE_MASK_WIDTH 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DST_IP4_BE_OFST 100 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DST_IP4_BE_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DST_IP4_BE_LBN 800 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DST_IP4_BE_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DST_IP4_BE_MASK_OFST 104 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DST_IP4_BE_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DST_IP4_BE_MASK_LBN 832 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DST_IP4_BE_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DST_IP6_BE_OFST 108 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DST_IP6_BE_LEN 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DST_IP6_BE_LBN 864 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DST_IP6_BE_WIDTH 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DST_IP6_BE_MASK_OFST 124 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DST_IP6_BE_MASK_LEN 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DST_IP6_BE_MASK_LBN 992 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DST_IP6_BE_MASK_WIDTH 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_PROTO_OFST 140 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_PROTO_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_PROTO_LBN 1120 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_PROTO_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_PROTO_MASK_OFST 141 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_PROTO_MASK_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_PROTO_MASK_LBN 1128 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_PROTO_MASK_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_TOS_OFST 142 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_TOS_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_TOS_LBN 1136 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_TOS_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_TOS_MASK_OFST 143 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_TOS_MASK_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_TOS_MASK_LBN 1144 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_TOS_MASK_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_TTL_OFST 144 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_TTL_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_TTL_LBN 1152 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_TTL_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_TTL_MASK_OFST 145 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_TTL_MASK_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_TTL_MASK_LBN 1160 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_TTL_MASK_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_FLAGS_BE_OFST 148 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_FLAGS_BE_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_FLAGS_BE_LBN 1184 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_FLAGS_BE_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_FLAGS_BE_MASK_OFST 152 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_FLAGS_BE_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_FLAGS_BE_MASK_LBN 1216 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_FLAGS_BE_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_L4_SPORT_BE_OFST 156 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_L4_SPORT_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_L4_SPORT_BE_LBN 1248 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_L4_SPORT_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_L4_SPORT_BE_MASK_OFST 158 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_L4_SPORT_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_L4_SPORT_BE_MASK_LBN 1264 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_L4_SPORT_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_L4_DPORT_BE_OFST 160 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_L4_DPORT_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_L4_DPORT_BE_LBN 1280 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_L4_DPORT_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_L4_DPORT_BE_MASK_OFST 162 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_L4_DPORT_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_L4_DPORT_BE_MASK_LBN 1296 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_L4_DPORT_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_TCP_FLAGS_BE_OFST 164 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_TCP_FLAGS_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_TCP_FLAGS_BE_LBN 1312 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_TCP_FLAGS_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_TCP_FLAGS_BE_MASK_OFST 166 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_TCP_FLAGS_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_TCP_FLAGS_BE_MASK_LBN 1328 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_TCP_FLAGS_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENCAP_TYPE_OFST 168 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENCAP_TYPE_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENCAP_TYPE_LBN 1344 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENCAP_TYPE_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENCAP_TYPE_MASK_OFST 172 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENCAP_TYPE_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENCAP_TYPE_MASK_LBN 1376 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENCAP_TYPE_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_OUTER_RULE_ID_OFST 176 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_OUTER_RULE_ID_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_OUTER_RULE_ID_LBN 1408 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_OUTER_RULE_ID_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_OUTER_RULE_ID_MASK_OFST 180 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_OUTER_RULE_ID_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_OUTER_RULE_ID_MASK_LBN 1440 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_OUTER_RULE_ID_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETHER_TYPE_BE_OFST 184 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETHER_TYPE_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETHER_TYPE_BE_LBN 1472 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETHER_TYPE_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETHER_TYPE_BE_MASK_OFST 188 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETHER_TYPE_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETHER_TYPE_BE_MASK_LBN 1504 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETHER_TYPE_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN0_TCI_BE_OFST 192 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN0_TCI_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN0_TCI_BE_LBN 1536 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN0_TCI_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN0_TCI_BE_MASK_OFST 194 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN0_TCI_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN0_TCI_BE_MASK_LBN 1552 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN0_TCI_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN0_PROTO_BE_OFST 196 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN0_PROTO_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN0_PROTO_BE_LBN 1568 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN0_PROTO_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN0_PROTO_BE_MASK_OFST 198 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN0_PROTO_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN0_PROTO_BE_MASK_LBN 1584 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN0_PROTO_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN1_TCI_BE_OFST 200 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN1_TCI_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN1_TCI_BE_LBN 1600 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN1_TCI_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN1_TCI_BE_MASK_OFST 202 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN1_TCI_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN1_TCI_BE_MASK_LBN 1616 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN1_TCI_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN1_PROTO_BE_OFST 204 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN1_PROTO_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN1_PROTO_BE_LBN 1632 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN1_PROTO_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN1_PROTO_BE_MASK_OFST 206 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN1_PROTO_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN1_PROTO_BE_MASK_LBN 1648 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VLAN1_PROTO_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETH_SADDR_BE_OFST 208 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETH_SADDR_BE_LEN 6 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETH_SADDR_BE_LBN 1664 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETH_SADDR_BE_WIDTH 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETH_SADDR_BE_MASK_OFST 214 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETH_SADDR_BE_MASK_LEN 6 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETH_SADDR_BE_MASK_LBN 1712 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETH_SADDR_BE_MASK_WIDTH 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETH_DADDR_BE_OFST 220 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETH_DADDR_BE_LEN 6 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETH_DADDR_BE_LBN 1760 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETH_DADDR_BE_WIDTH 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETH_DADDR_BE_MASK_OFST 226 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETH_DADDR_BE_MASK_LEN 6 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETH_DADDR_BE_MASK_LBN 1808 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_ETH_DADDR_BE_MASK_WIDTH 48 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_SRC_IP4_BE_OFST 232 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_SRC_IP4_BE_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_SRC_IP4_BE_LBN 1856 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_SRC_IP4_BE_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_SRC_IP4_BE_MASK_OFST 236 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_SRC_IP4_BE_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_SRC_IP4_BE_MASK_LBN 1888 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_SRC_IP4_BE_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_SRC_IP6_BE_OFST 240 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_SRC_IP6_BE_LEN 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_SRC_IP6_BE_LBN 1920 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_SRC_IP6_BE_WIDTH 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_SRC_IP6_BE_MASK_OFST 256 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_SRC_IP6_BE_MASK_LEN 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_SRC_IP6_BE_MASK_LBN 2048 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_SRC_IP6_BE_MASK_WIDTH 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_DST_IP4_BE_OFST 272 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_DST_IP4_BE_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_DST_IP4_BE_LBN 2176 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_DST_IP4_BE_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_DST_IP4_BE_MASK_OFST 276 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_DST_IP4_BE_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_DST_IP4_BE_MASK_LBN 2208 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_DST_IP4_BE_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_DST_IP6_BE_OFST 280 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_DST_IP6_BE_LEN 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_DST_IP6_BE_LBN 2240 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_DST_IP6_BE_WIDTH 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_DST_IP6_BE_MASK_OFST 296 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_DST_IP6_BE_MASK_LEN 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_DST_IP6_BE_MASK_LBN 2368 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_DST_IP6_BE_MASK_WIDTH 128 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_PROTO_OFST 312 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_PROTO_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_PROTO_LBN 2496 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_PROTO_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_PROTO_MASK_OFST 313 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_PROTO_MASK_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_PROTO_MASK_LBN 2504 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_PROTO_MASK_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_TOS_OFST 314 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_TOS_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_TOS_LBN 2512 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_TOS_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_TOS_MASK_OFST 315 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_TOS_MASK_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_TOS_MASK_LBN 2520 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_TOS_MASK_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_TTL_OFST 316 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_TTL_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_TTL_LBN 2528 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_TTL_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_TTL_MASK_OFST 317 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_TTL_MASK_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_TTL_MASK_LBN 2536 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_TTL_MASK_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_FLAGS_BE_OFST 320 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_FLAGS_BE_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_FLAGS_BE_LBN 2560 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_FLAGS_BE_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_FLAGS_BE_MASK_OFST 324 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_FLAGS_BE_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_FLAGS_BE_MASK_LBN 2592 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_IP_FLAGS_BE_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_L4_SPORT_BE_OFST 328 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_L4_SPORT_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_L4_SPORT_BE_LBN 2624 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_L4_SPORT_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_L4_SPORT_BE_MASK_OFST 330 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_L4_SPORT_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_L4_SPORT_BE_MASK_LBN 2640 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_L4_SPORT_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_L4_DPORT_BE_OFST 332 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_L4_DPORT_BE_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_L4_DPORT_BE_LBN 2656 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_L4_DPORT_BE_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_L4_DPORT_BE_MASK_OFST 334 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_L4_DPORT_BE_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_L4_DPORT_BE_MASK_LBN 2672 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_L4_DPORT_BE_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VNET_ID_BE_OFST 336 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VNET_ID_BE_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VNET_ID_BE_LBN 2688 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VNET_ID_BE_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VNET_ID_BE_MASK_OFST 340 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VNET_ID_BE_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VNET_ID_BE_MASK_LBN 2720 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_ENC_VNET_ID_BE_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_FLAGS_OFST 344 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_FLAGS_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IS_IP_FRAG_OFST 344 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IS_IP_FRAG_LBN 0 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IS_IP_FRAG_WIDTH 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DO_CT_OFST 344 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DO_CT_LBN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_DO_CT_WIDTH 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_HIT_OFST 344 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_HIT_LBN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_HIT_WIDTH 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IS_FROM_NETWORK_OFST 344 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IS_FROM_NETWORK_LBN 3 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_IS_FROM_NETWORK_WIDTH 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD_OFST 344 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD_LBN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD_WIDTH 28 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_FLAGS_LBN 2752 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_FLAGS_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_FLAGS_MASK_OFST 348 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_FLAGS_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_FLAGS_MASK_LBN 2784 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_FLAGS_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_DOMAIN_OFST 352 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_DOMAIN_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_DOMAIN_LBN 2816 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_DOMAIN_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_DOMAIN_MASK_OFST 354 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_DOMAIN_MASK_LEN 2 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_DOMAIN_MASK_LBN 2832 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_DOMAIN_MASK_WIDTH 16 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_MARK_OFST 356 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_MARK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_MARK_LBN 2848 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_MARK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_MARK_MASK_OFST 360 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_MARK_MASK_LEN 4 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_MARK_MASK_LBN 2880 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_MARK_MASK_WIDTH 32 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_PRIVATE_FLAGS_OFST 364 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_PRIVATE_FLAGS_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_PRIVATE_FLAGS_LBN 2912 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_PRIVATE_FLAGS_WIDTH 8 +/* Set to zero. */ +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD2_OFST 365 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD2_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD2_LBN 2920 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD2_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_PRIVATE_FLAGS_MASK_OFST 366 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_PRIVATE_FLAGS_MASK_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_PRIVATE_FLAGS_MASK_LBN 2928 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_CT_PRIVATE_FLAGS_MASK_WIDTH 8 +/* Set to zero. */ +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD3_OFST 367 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD3_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD3_LBN 2936 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD3_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RECIRC_ID_OFST 368 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RECIRC_ID_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RECIRC_ID_LBN 2944 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RECIRC_ID_WIDTH 8 +/* Set to zero */ +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD4_OFST 369 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD4_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD4_LBN 2952 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD4_WIDTH 8 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RECIRC_ID_MASK_OFST 370 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RECIRC_ID_MASK_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RECIRC_ID_MASK_LBN 2960 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RECIRC_ID_MASK_WIDTH 8 +/* Set to zero */ +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD5_OFST 371 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD5_LEN 1 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD5_LBN 2968 +#define MAE_FIELD_MASK_VALUE_PAIRS_V2_RSVD5_WIDTH 8 + /* MAE_MPORT_SELECTOR structuredef: MPORTS are identified by an opaque unsigned * integer value (mport_id) that is guaranteed to be representable within * 32-bits or within any NIC interface field that needs store the value @@ -25699,4 +26738,1197 @@ #define MAE_MPORT_SELECTOR_FLAT_LBN 0 #define MAE_MPORT_SELECTOR_FLAT_WIDTH 32 + +/***********************************/ +/* MC_CMD_MAE_GET_CAPS + * Describes capabilities of the MAE (Match-Action Engine) + */ +#define MC_CMD_MAE_GET_CAPS 0x140 +#undef MC_CMD_0x140_PRIVILEGE_CTG + +#define MC_CMD_0x140_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_GET_CAPS_IN msgrequest */ +#define MC_CMD_MAE_GET_CAPS_IN_LEN 0 + +/* MC_CMD_MAE_GET_CAPS_OUT msgresponse */ +#define MC_CMD_MAE_GET_CAPS_OUT_LEN 52 +/* The number of field IDs that the NIC supports. Any field with a ID greater + * than or equal to the value returned in this field must be treated as having + * a support level of MAE_FIELD_UNSUPPORTED in all requests. + */ +#define MC_CMD_MAE_GET_CAPS_OUT_MATCH_FIELD_COUNT_OFST 0 +#define MC_CMD_MAE_GET_CAPS_OUT_MATCH_FIELD_COUNT_LEN 4 +#define MC_CMD_MAE_GET_CAPS_OUT_ENCAP_TYPES_SUPPORTED_OFST 4 +#define MC_CMD_MAE_GET_CAPS_OUT_ENCAP_TYPES_SUPPORTED_LEN 4 +#define MC_CMD_MAE_GET_CAPS_OUT_ENCAP_TYPE_VXLAN_OFST 4 +#define MC_CMD_MAE_GET_CAPS_OUT_ENCAP_TYPE_VXLAN_LBN 0 +#define MC_CMD_MAE_GET_CAPS_OUT_ENCAP_TYPE_VXLAN_WIDTH 1 +#define MC_CMD_MAE_GET_CAPS_OUT_ENCAP_TYPE_NVGRE_OFST 4 +#define MC_CMD_MAE_GET_CAPS_OUT_ENCAP_TYPE_NVGRE_LBN 1 +#define MC_CMD_MAE_GET_CAPS_OUT_ENCAP_TYPE_NVGRE_WIDTH 1 +#define MC_CMD_MAE_GET_CAPS_OUT_ENCAP_TYPE_GENEVE_OFST 4 +#define MC_CMD_MAE_GET_CAPS_OUT_ENCAP_TYPE_GENEVE_LBN 2 +#define MC_CMD_MAE_GET_CAPS_OUT_ENCAP_TYPE_GENEVE_WIDTH 1 +/* The total number of counters available to allocate. */ +#define MC_CMD_MAE_GET_CAPS_OUT_COUNTERS_OFST 8 +#define MC_CMD_MAE_GET_CAPS_OUT_COUNTERS_LEN 4 +/* The total number of counters lists available to allocate. A value of zero + * indicates that counter lists are not supported by the NIC. (But single + * counters may still be.) + */ +#define MC_CMD_MAE_GET_CAPS_OUT_COUNTER_LISTS_OFST 12 +#define MC_CMD_MAE_GET_CAPS_OUT_COUNTER_LISTS_LEN 4 +/* The total number of encap header structures available to allocate. */ +#define MC_CMD_MAE_GET_CAPS_OUT_ENCAP_HEADER_LIMIT_OFST 16 +#define MC_CMD_MAE_GET_CAPS_OUT_ENCAP_HEADER_LIMIT_LEN 4 +/* Reserved. Should be zero. */ +#define MC_CMD_MAE_GET_CAPS_OUT_RSVD_OFST 20 +#define MC_CMD_MAE_GET_CAPS_OUT_RSVD_LEN 4 +/* The total number of action sets available to allocate. */ +#define MC_CMD_MAE_GET_CAPS_OUT_ACTION_SETS_OFST 24 +#define MC_CMD_MAE_GET_CAPS_OUT_ACTION_SETS_LEN 4 +/* The total number of action set lists available to allocate. */ +#define MC_CMD_MAE_GET_CAPS_OUT_ACTION_SET_LISTS_OFST 28 +#define MC_CMD_MAE_GET_CAPS_OUT_ACTION_SET_LISTS_LEN 4 +/* The total number of outer rules available to allocate. */ +#define MC_CMD_MAE_GET_CAPS_OUT_OUTER_RULES_OFST 32 +#define MC_CMD_MAE_GET_CAPS_OUT_OUTER_RULES_LEN 4 +/* The total number of action rules available to allocate. */ +#define MC_CMD_MAE_GET_CAPS_OUT_ACTION_RULES_OFST 36 +#define MC_CMD_MAE_GET_CAPS_OUT_ACTION_RULES_LEN 4 +/* The number of priorities available for ACTION_RULE filters. It is invalid to + * install a MATCH_ACTION filter with a priority number >= ACTION_PRIOS. + */ +#define MC_CMD_MAE_GET_CAPS_OUT_ACTION_PRIOS_OFST 40 +#define MC_CMD_MAE_GET_CAPS_OUT_ACTION_PRIOS_LEN 4 +/* The number of priorities available for OUTER_RULE filters. It is invalid to + * install an OUTER_RULE filter with a priority number >= OUTER_PRIOS. + */ +#define MC_CMD_MAE_GET_CAPS_OUT_OUTER_PRIOS_OFST 44 +#define MC_CMD_MAE_GET_CAPS_OUT_OUTER_PRIOS_LEN 4 +/* MAE API major version. Currently 1. If this field is not present in the + * response (i.e. response shorter than 384 bits), then its value is zero. If + * the value does not match the client's expectations, the client should raise + * a fatal error. + */ +#define MC_CMD_MAE_GET_CAPS_OUT_API_VER_OFST 48 +#define MC_CMD_MAE_GET_CAPS_OUT_API_VER_LEN 4 + + +/***********************************/ +/* MC_CMD_MAE_GET_AR_CAPS + * Get a level of support for match fields when used in match-action rules + */ +#define MC_CMD_MAE_GET_AR_CAPS 0x141 +#undef MC_CMD_0x141_PRIVILEGE_CTG + +#define MC_CMD_0x141_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_GET_AR_CAPS_IN msgrequest */ +#define MC_CMD_MAE_GET_AR_CAPS_IN_LEN 0 + +/* MC_CMD_MAE_GET_AR_CAPS_OUT msgresponse */ +#define MC_CMD_MAE_GET_AR_CAPS_OUT_LENMIN 4 +#define MC_CMD_MAE_GET_AR_CAPS_OUT_LENMAX 252 +#define MC_CMD_MAE_GET_AR_CAPS_OUT_LENMAX_MCDI2 1020 +#define MC_CMD_MAE_GET_AR_CAPS_OUT_LEN(num) (4+4*(num)) +#define MC_CMD_MAE_GET_AR_CAPS_OUT_FIELD_FLAGS_NUM(len) (((len)-4)/4) +/* Number of fields actually returned in FIELD_FLAGS. */ +#define MC_CMD_MAE_GET_AR_CAPS_OUT_COUNT_OFST 0 +#define MC_CMD_MAE_GET_AR_CAPS_OUT_COUNT_LEN 4 +/* Array of values indicating the NIC's support for a given field, indexed by + * field id. The driver must ensure space for + * MC_CMD_MAE_GET_CAPS.MATCH_FIELD_COUNT entries in the array.. + */ +#define MC_CMD_MAE_GET_AR_CAPS_OUT_FIELD_FLAGS_OFST 4 +#define MC_CMD_MAE_GET_AR_CAPS_OUT_FIELD_FLAGS_LEN 4 +#define MC_CMD_MAE_GET_AR_CAPS_OUT_FIELD_FLAGS_MINNUM 0 +#define MC_CMD_MAE_GET_AR_CAPS_OUT_FIELD_FLAGS_MAXNUM 62 +#define MC_CMD_MAE_GET_AR_CAPS_OUT_FIELD_FLAGS_MAXNUM_MCDI2 254 + + +/***********************************/ +/* MC_CMD_MAE_GET_OR_CAPS + * Get a level of support for fields used in outer rule keys. + */ +#define MC_CMD_MAE_GET_OR_CAPS 0x142 +#undef MC_CMD_0x142_PRIVILEGE_CTG + +#define MC_CMD_0x142_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_GET_OR_CAPS_IN msgrequest */ +#define MC_CMD_MAE_GET_OR_CAPS_IN_LEN 0 + +/* MC_CMD_MAE_GET_OR_CAPS_OUT msgresponse */ +#define MC_CMD_MAE_GET_OR_CAPS_OUT_LENMIN 4 +#define MC_CMD_MAE_GET_OR_CAPS_OUT_LENMAX 252 +#define MC_CMD_MAE_GET_OR_CAPS_OUT_LENMAX_MCDI2 1020 +#define MC_CMD_MAE_GET_OR_CAPS_OUT_LEN(num) (4+4*(num)) +#define MC_CMD_MAE_GET_OR_CAPS_OUT_FIELD_FLAGS_NUM(len) (((len)-4)/4) +/* Number of fields actually returned in FIELD_FLAGS. */ +#define MC_CMD_MAE_GET_OR_CAPS_OUT_COUNT_OFST 0 +#define MC_CMD_MAE_GET_OR_CAPS_OUT_COUNT_LEN 4 +/* Same semantics as MC_CMD_MAE_GET_AR_CAPS.MAE_FIELD_FLAGS */ +#define MC_CMD_MAE_GET_OR_CAPS_OUT_FIELD_FLAGS_OFST 4 +#define MC_CMD_MAE_GET_OR_CAPS_OUT_FIELD_FLAGS_LEN 4 +#define MC_CMD_MAE_GET_OR_CAPS_OUT_FIELD_FLAGS_MINNUM 0 +#define MC_CMD_MAE_GET_OR_CAPS_OUT_FIELD_FLAGS_MAXNUM 62 +#define MC_CMD_MAE_GET_OR_CAPS_OUT_FIELD_FLAGS_MAXNUM_MCDI2 254 + + +/***********************************/ +/* MC_CMD_MAE_COUNTER_ALLOC + * Allocate match-action-engine counters, which can be referenced in Action + * Rules. + */ +#define MC_CMD_MAE_COUNTER_ALLOC 0x143 +#undef MC_CMD_0x143_PRIVILEGE_CTG + +#define MC_CMD_0x143_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_COUNTER_ALLOC_IN msgrequest */ +#define MC_CMD_MAE_COUNTER_ALLOC_IN_LEN 4 +/* The number of counters that the driver would like allocated */ +#define MC_CMD_MAE_COUNTER_ALLOC_IN_REQUESTED_COUNT_OFST 0 +#define MC_CMD_MAE_COUNTER_ALLOC_IN_REQUESTED_COUNT_LEN 4 + +/* MC_CMD_MAE_COUNTER_ALLOC_OUT msgresponse */ +#define MC_CMD_MAE_COUNTER_ALLOC_OUT_LENMIN 12 +#define MC_CMD_MAE_COUNTER_ALLOC_OUT_LENMAX 252 +#define MC_CMD_MAE_COUNTER_ALLOC_OUT_LENMAX_MCDI2 1020 +#define MC_CMD_MAE_COUNTER_ALLOC_OUT_LEN(num) (8+4*(num)) +#define MC_CMD_MAE_COUNTER_ALLOC_OUT_COUNTER_ID_NUM(len) (((len)-8)/4) +/* Generation count. Packets with generation count >= GENERATION_COUNT will + * contain valid counter values for counter IDs allocated in this call, unless + * the counter values are zero and zero squash is enabled. + */ +#define MC_CMD_MAE_COUNTER_ALLOC_OUT_GENERATION_COUNT_OFST 0 +#define MC_CMD_MAE_COUNTER_ALLOC_OUT_GENERATION_COUNT_LEN 4 +/* The number of counter IDs that the NIC allocated. It is never less than 1; + * failure to allocate a single counter will cause an error to be returned. It + * is never greater than REQUESTED_COUNT, but may be less. + */ +#define MC_CMD_MAE_COUNTER_ALLOC_OUT_COUNTER_ID_COUNT_OFST 4 +#define MC_CMD_MAE_COUNTER_ALLOC_OUT_COUNTER_ID_COUNT_LEN 4 +/* An array containing the IDs for the counters allocated. */ +#define MC_CMD_MAE_COUNTER_ALLOC_OUT_COUNTER_ID_OFST 8 +#define MC_CMD_MAE_COUNTER_ALLOC_OUT_COUNTER_ID_LEN 4 +#define MC_CMD_MAE_COUNTER_ALLOC_OUT_COUNTER_ID_MINNUM 1 +#define MC_CMD_MAE_COUNTER_ALLOC_OUT_COUNTER_ID_MAXNUM 61 +#define MC_CMD_MAE_COUNTER_ALLOC_OUT_COUNTER_ID_MAXNUM_MCDI2 253 +/* enum: A counter ID that is guaranteed never to represent a real counter */ +#define MC_CMD_MAE_COUNTER_ALLOC_OUT_COUNTER_ID_NULL 0xffffffff + + +/***********************************/ +/* MC_CMD_MAE_COUNTER_FREE + * Free match-action-engine counters + */ +#define MC_CMD_MAE_COUNTER_FREE 0x144 +#undef MC_CMD_0x144_PRIVILEGE_CTG + +#define MC_CMD_0x144_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_COUNTER_FREE_IN msgrequest */ +#define MC_CMD_MAE_COUNTER_FREE_IN_LENMIN 8 +#define MC_CMD_MAE_COUNTER_FREE_IN_LENMAX 132 +#define MC_CMD_MAE_COUNTER_FREE_IN_LENMAX_MCDI2 132 +#define MC_CMD_MAE_COUNTER_FREE_IN_LEN(num) (4+4*(num)) +#define MC_CMD_MAE_COUNTER_FREE_IN_FREE_COUNTER_ID_NUM(len) (((len)-4)/4) +/* The number of counter IDs to be freed. */ +#define MC_CMD_MAE_COUNTER_FREE_IN_COUNTER_ID_COUNT_OFST 0 +#define MC_CMD_MAE_COUNTER_FREE_IN_COUNTER_ID_COUNT_LEN 4 +/* An array containing the counter IDs to be freed. */ +#define MC_CMD_MAE_COUNTER_FREE_IN_FREE_COUNTER_ID_OFST 4 +#define MC_CMD_MAE_COUNTER_FREE_IN_FREE_COUNTER_ID_LEN 4 +#define MC_CMD_MAE_COUNTER_FREE_IN_FREE_COUNTER_ID_MINNUM 1 +#define MC_CMD_MAE_COUNTER_FREE_IN_FREE_COUNTER_ID_MAXNUM 32 +#define MC_CMD_MAE_COUNTER_FREE_IN_FREE_COUNTER_ID_MAXNUM_MCDI2 32 + +/* MC_CMD_MAE_COUNTER_FREE_OUT msgresponse */ +#define MC_CMD_MAE_COUNTER_FREE_OUT_LENMIN 12 +#define MC_CMD_MAE_COUNTER_FREE_OUT_LENMAX 136 +#define MC_CMD_MAE_COUNTER_FREE_OUT_LENMAX_MCDI2 136 +#define MC_CMD_MAE_COUNTER_FREE_OUT_LEN(num) (8+4*(num)) +#define MC_CMD_MAE_COUNTER_FREE_OUT_FREED_COUNTER_ID_NUM(len) (((len)-8)/4) +/* Generation count. A packet with generation count == GENERATION_COUNT will + * contain the final values for these counter IDs, unless the counter values + * are zero and zero squash is enabled. Receiving a packet with generation + * count > GENERATION_COUNT guarantees that no more values will be written for + * these counters. If values for these counter IDs are present, the counter ID + * has been reallocated. A counter ID will not be reallocated within a single + * read cycle as this would merge increments from the 'old' and 'new' counters. + */ +#define MC_CMD_MAE_COUNTER_FREE_OUT_GENERATION_COUNT_OFST 0 +#define MC_CMD_MAE_COUNTER_FREE_OUT_GENERATION_COUNT_LEN 4 +/* The number of counter IDs actually freed. It is never less than 1; failure + * to free a single counter will cause an error to be returned. It is never + * greater than the number that were requested to be freed, but may be less if + * counters could not be freed. + */ +#define MC_CMD_MAE_COUNTER_FREE_OUT_COUNTER_ID_COUNT_OFST 4 +#define MC_CMD_MAE_COUNTER_FREE_OUT_COUNTER_ID_COUNT_LEN 4 +/* An array containing the IDs for the counters to that were freed. Note, + * failure to free a counter can only occur on incorrect driver behaviour, so + * asserting that the expected counters were freed is reasonable. When + * debugging, attempting to free a single counter at a time will provide a + * reason for the failure to free said counter. + */ +#define MC_CMD_MAE_COUNTER_FREE_OUT_FREED_COUNTER_ID_OFST 8 +#define MC_CMD_MAE_COUNTER_FREE_OUT_FREED_COUNTER_ID_LEN 4 +#define MC_CMD_MAE_COUNTER_FREE_OUT_FREED_COUNTER_ID_MINNUM 1 +#define MC_CMD_MAE_COUNTER_FREE_OUT_FREED_COUNTER_ID_MAXNUM 32 +#define MC_CMD_MAE_COUNTER_FREE_OUT_FREED_COUNTER_ID_MAXNUM_MCDI2 32 + + +/***********************************/ +/* MC_CMD_MAE_COUNTERS_STREAM_START + * Start streaming counter values, specifying an RxQ to deliver packets to. + * Counters allocated to the calling function will be written in a round robin + * at a fixed cycle rate, assuming sufficient credits are available. The driver + * may cause the counter values to be written at a slower rate by constraining + * the availability of credits. Note that if the driver wishes to deliver + * packets to a different queue, it must call MAE_COUNTERS_STREAM_STOP to stop + * delivering packets to the current queue first. + */ +#define MC_CMD_MAE_COUNTERS_STREAM_START 0x151 + +/* MC_CMD_MAE_COUNTERS_STREAM_START_IN msgrequest */ +#define MC_CMD_MAE_COUNTERS_STREAM_START_IN_LEN 8 +/* The RxQ to write packets to. */ +#define MC_CMD_MAE_COUNTERS_STREAM_START_IN_QID_OFST 0 +#define MC_CMD_MAE_COUNTERS_STREAM_START_IN_QID_LEN 2 +/* Maximum size in bytes of packets that may be written to the RxQ. */ +#define MC_CMD_MAE_COUNTERS_STREAM_START_IN_PACKET_SIZE_OFST 2 +#define MC_CMD_MAE_COUNTERS_STREAM_START_IN_PACKET_SIZE_LEN 2 +/* Optional flags. */ +#define MC_CMD_MAE_COUNTERS_STREAM_START_IN_FLAGS_OFST 4 +#define MC_CMD_MAE_COUNTERS_STREAM_START_IN_FLAGS_LEN 4 +#define MC_CMD_MAE_COUNTERS_STREAM_START_IN_ZERO_SQUASH_DISABLE_OFST 4 +#define MC_CMD_MAE_COUNTERS_STREAM_START_IN_ZERO_SQUASH_DISABLE_LBN 0 +#define MC_CMD_MAE_COUNTERS_STREAM_START_IN_ZERO_SQUASH_DISABLE_WIDTH 1 +#define MC_CMD_MAE_COUNTERS_STREAM_START_IN_COUNTER_STALL_EN_OFST 4 +#define MC_CMD_MAE_COUNTERS_STREAM_START_IN_COUNTER_STALL_EN_LBN 1 +#define MC_CMD_MAE_COUNTERS_STREAM_START_IN_COUNTER_STALL_EN_WIDTH 1 + +/* MC_CMD_MAE_COUNTERS_STREAM_START_OUT msgresponse */ +#define MC_CMD_MAE_COUNTERS_STREAM_START_OUT_LEN 4 +#define MC_CMD_MAE_COUNTERS_STREAM_START_OUT_FLAGS_OFST 0 +#define MC_CMD_MAE_COUNTERS_STREAM_START_OUT_FLAGS_LEN 4 +#define MC_CMD_MAE_COUNTERS_STREAM_START_OUT_USES_CREDITS_OFST 0 +#define MC_CMD_MAE_COUNTERS_STREAM_START_OUT_USES_CREDITS_LBN 0 +#define MC_CMD_MAE_COUNTERS_STREAM_START_OUT_USES_CREDITS_WIDTH 1 + + +/***********************************/ +/* MC_CMD_MAE_COUNTERS_STREAM_STOP + * Stop streaming counter values to the specified RxQ. + */ +#define MC_CMD_MAE_COUNTERS_STREAM_STOP 0x152 + +/* MC_CMD_MAE_COUNTERS_STREAM_STOP_IN msgrequest */ +#define MC_CMD_MAE_COUNTERS_STREAM_STOP_IN_LEN 2 +/* The RxQ to stop writing packets to. */ +#define MC_CMD_MAE_COUNTERS_STREAM_STOP_IN_QID_OFST 0 +#define MC_CMD_MAE_COUNTERS_STREAM_STOP_IN_QID_LEN 2 + +/* MC_CMD_MAE_COUNTERS_STREAM_STOP_OUT msgresponse */ +#define MC_CMD_MAE_COUNTERS_STREAM_STOP_OUT_LEN 4 +/* Generation count. The final set of counter values will be written out in + * packets with count == GENERATION_COUNT. An empty packet with count > + * GENERATION_COUNT indicates that no more counter values will be written to + * this stream. + */ +#define MC_CMD_MAE_COUNTERS_STREAM_STOP_OUT_GENERATION_COUNT_OFST 0 +#define MC_CMD_MAE_COUNTERS_STREAM_STOP_OUT_GENERATION_COUNT_LEN 4 + + +/***********************************/ +/* MC_CMD_MAE_COUNTERS_STREAM_GIVE_CREDITS + * Give a number of credits to the packetiser. Each credit received allows the + * MC to write one packet to the RxQ, therefore for each credit the driver must + * have written sufficient descriptors for a packet of length + * MAE_COUNTERS_PACKETISER_STREAM_START/PACKET_SIZE and rung the doorbell. + */ +#define MC_CMD_MAE_COUNTERS_STREAM_GIVE_CREDITS 0x153 + +/* MC_CMD_MAE_COUNTERS_STREAM_GIVE_CREDITS_IN msgrequest */ +#define MC_CMD_MAE_COUNTERS_STREAM_GIVE_CREDITS_IN_LEN 4 +/* Number of credits to give to the packetiser. */ +#define MC_CMD_MAE_COUNTERS_STREAM_GIVE_CREDITS_IN_NUM_CREDITS_OFST 0 +#define MC_CMD_MAE_COUNTERS_STREAM_GIVE_CREDITS_IN_NUM_CREDITS_LEN 4 + +/* MC_CMD_MAE_COUNTERS_STREAM_GIVE_CREDITS_OUT msgresponse */ +#define MC_CMD_MAE_COUNTERS_STREAM_GIVE_CREDITS_OUT_LEN 0 + + +/***********************************/ +/* MC_CMD_MAE_ENCAP_HEADER_ALLOC + * Allocate encap action metadata + */ +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC 0x148 +#undef MC_CMD_0x148_PRIVILEGE_CTG + +#define MC_CMD_0x148_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_ENCAP_HEADER_ALLOC_IN msgrequest */ +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC_IN_LENMIN 4 +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC_IN_LENMAX 252 +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC_IN_LENMAX_MCDI2 1020 +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC_IN_LEN(num) (4+1*(num)) +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC_IN_HDR_DATA_NUM(len) (((len)-4)/1) +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC_IN_ENCAP_TYPE_OFST 0 +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC_IN_ENCAP_TYPE_LEN 4 +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC_IN_HDR_DATA_OFST 4 +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC_IN_HDR_DATA_LEN 1 +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC_IN_HDR_DATA_MINNUM 0 +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC_IN_HDR_DATA_MAXNUM 248 +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC_IN_HDR_DATA_MAXNUM_MCDI2 1016 + +/* MC_CMD_MAE_ENCAP_HEADER_ALLOC_OUT msgresponse */ +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC_OUT_LEN 4 +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC_OUT_ENCAP_HEADER_ID_OFST 0 +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC_OUT_ENCAP_HEADER_ID_LEN 4 +/* enum: An encap metadata ID that is guaranteed never to represent real encap + * metadata + */ +#define MC_CMD_MAE_ENCAP_HEADER_ALLOC_OUT_ENCAP_HEADER_ID_NULL 0xffffffff + + +/***********************************/ +/* MC_CMD_MAE_ENCAP_HEADER_UPDATE + * Update encap action metadata + */ +#define MC_CMD_MAE_ENCAP_HEADER_UPDATE 0x149 +#undef MC_CMD_0x149_PRIVILEGE_CTG + +#define MC_CMD_0x149_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_ENCAP_HEADER_UPDATE_IN msgrequest */ +#define MC_CMD_MAE_ENCAP_HEADER_UPDATE_IN_LENMIN 8 +#define MC_CMD_MAE_ENCAP_HEADER_UPDATE_IN_LENMAX 252 +#define MC_CMD_MAE_ENCAP_HEADER_UPDATE_IN_LENMAX_MCDI2 1020 +#define MC_CMD_MAE_ENCAP_HEADER_UPDATE_IN_LEN(num) (8+1*(num)) +#define MC_CMD_MAE_ENCAP_HEADER_UPDATE_IN_HDR_DATA_NUM(len) (((len)-8)/1) +#define MC_CMD_MAE_ENCAP_HEADER_UPDATE_IN_EH_ID_OFST 0 +#define MC_CMD_MAE_ENCAP_HEADER_UPDATE_IN_EH_ID_LEN 4 +#define MC_CMD_MAE_ENCAP_HEADER_UPDATE_IN_ENCAP_TYPE_OFST 4 +#define MC_CMD_MAE_ENCAP_HEADER_UPDATE_IN_ENCAP_TYPE_LEN 4 +#define MC_CMD_MAE_ENCAP_HEADER_UPDATE_IN_HDR_DATA_OFST 8 +#define MC_CMD_MAE_ENCAP_HEADER_UPDATE_IN_HDR_DATA_LEN 1 +#define MC_CMD_MAE_ENCAP_HEADER_UPDATE_IN_HDR_DATA_MINNUM 0 +#define MC_CMD_MAE_ENCAP_HEADER_UPDATE_IN_HDR_DATA_MAXNUM 244 +#define MC_CMD_MAE_ENCAP_HEADER_UPDATE_IN_HDR_DATA_MAXNUM_MCDI2 1012 + +/* MC_CMD_MAE_ENCAP_HEADER_UPDATE_OUT msgresponse */ +#define MC_CMD_MAE_ENCAP_HEADER_UPDATE_OUT_LEN 0 + + +/***********************************/ +/* MC_CMD_MAE_ENCAP_HEADER_FREE + * Free encap action metadata + */ +#define MC_CMD_MAE_ENCAP_HEADER_FREE 0x14a +#undef MC_CMD_0x14a_PRIVILEGE_CTG + +#define MC_CMD_0x14a_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_ENCAP_HEADER_FREE_IN msgrequest */ +#define MC_CMD_MAE_ENCAP_HEADER_FREE_IN_LENMIN 4 +#define MC_CMD_MAE_ENCAP_HEADER_FREE_IN_LENMAX 128 +#define MC_CMD_MAE_ENCAP_HEADER_FREE_IN_LENMAX_MCDI2 128 +#define MC_CMD_MAE_ENCAP_HEADER_FREE_IN_LEN(num) (0+4*(num)) +#define MC_CMD_MAE_ENCAP_HEADER_FREE_IN_EH_ID_NUM(len) (((len)-0)/4) +/* Same semantics as MC_CMD_MAE_COUNTER_FREE */ +#define MC_CMD_MAE_ENCAP_HEADER_FREE_IN_EH_ID_OFST 0 +#define MC_CMD_MAE_ENCAP_HEADER_FREE_IN_EH_ID_LEN 4 +#define MC_CMD_MAE_ENCAP_HEADER_FREE_IN_EH_ID_MINNUM 1 +#define MC_CMD_MAE_ENCAP_HEADER_FREE_IN_EH_ID_MAXNUM 32 +#define MC_CMD_MAE_ENCAP_HEADER_FREE_IN_EH_ID_MAXNUM_MCDI2 32 + +/* MC_CMD_MAE_ENCAP_HEADER_FREE_OUT msgresponse */ +#define MC_CMD_MAE_ENCAP_HEADER_FREE_OUT_LENMIN 4 +#define MC_CMD_MAE_ENCAP_HEADER_FREE_OUT_LENMAX 128 +#define MC_CMD_MAE_ENCAP_HEADER_FREE_OUT_LENMAX_MCDI2 128 +#define MC_CMD_MAE_ENCAP_HEADER_FREE_OUT_LEN(num) (0+4*(num)) +#define MC_CMD_MAE_ENCAP_HEADER_FREE_OUT_FREED_EH_ID_NUM(len) (((len)-0)/4) +/* Same semantics as MC_CMD_MAE_COUNTER_FREE */ +#define MC_CMD_MAE_ENCAP_HEADER_FREE_OUT_FREED_EH_ID_OFST 0 +#define MC_CMD_MAE_ENCAP_HEADER_FREE_OUT_FREED_EH_ID_LEN 4 +#define MC_CMD_MAE_ENCAP_HEADER_FREE_OUT_FREED_EH_ID_MINNUM 1 +#define MC_CMD_MAE_ENCAP_HEADER_FREE_OUT_FREED_EH_ID_MAXNUM 32 +#define MC_CMD_MAE_ENCAP_HEADER_FREE_OUT_FREED_EH_ID_MAXNUM_MCDI2 32 + + +/***********************************/ +/* MC_CMD_MAE_MAC_ADDR_ALLOC + * Allocate MAC address. Hardware implementations have MAC addresses programmed + * into an indirection table, and clients should take care not to allocate the + * same MAC address twice (but instead reuse its ID). + */ +#define MC_CMD_MAE_MAC_ADDR_ALLOC 0x15e +#undef MC_CMD_0x15e_PRIVILEGE_CTG + +#define MC_CMD_0x15e_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_MAC_ADDR_ALLOC_IN msgrequest */ +#define MC_CMD_MAE_MAC_ADDR_ALLOC_IN_LEN 6 +/* MAC address as bytes in network order. */ +#define MC_CMD_MAE_MAC_ADDR_ALLOC_IN_MAC_ADDR_OFST 0 +#define MC_CMD_MAE_MAC_ADDR_ALLOC_IN_MAC_ADDR_LEN 6 + +/* MC_CMD_MAE_MAC_ADDR_ALLOC_OUT msgresponse */ +#define MC_CMD_MAE_MAC_ADDR_ALLOC_OUT_LEN 4 +#define MC_CMD_MAE_MAC_ADDR_ALLOC_OUT_MAC_ID_OFST 0 +#define MC_CMD_MAE_MAC_ADDR_ALLOC_OUT_MAC_ID_LEN 4 +/* enum: An MAC address ID that is guaranteed never to represent a real MAC + * address. + */ +#define MC_CMD_MAE_MAC_ADDR_ALLOC_OUT_MAC_ID_NULL 0xffffffff + + +/***********************************/ +/* MC_CMD_MAE_MAC_ADDR_FREE + * Free MAC address. + */ +#define MC_CMD_MAE_MAC_ADDR_FREE 0x15f +#undef MC_CMD_0x15f_PRIVILEGE_CTG + +#define MC_CMD_0x15f_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_MAC_ADDR_FREE_IN msgrequest */ +#define MC_CMD_MAE_MAC_ADDR_FREE_IN_LENMIN 4 +#define MC_CMD_MAE_MAC_ADDR_FREE_IN_LENMAX 128 +#define MC_CMD_MAE_MAC_ADDR_FREE_IN_LENMAX_MCDI2 128 +#define MC_CMD_MAE_MAC_ADDR_FREE_IN_LEN(num) (0+4*(num)) +#define MC_CMD_MAE_MAC_ADDR_FREE_IN_MAC_ID_NUM(len) (((len)-0)/4) +/* Same semantics as MC_CMD_MAE_COUNTER_FREE */ +#define MC_CMD_MAE_MAC_ADDR_FREE_IN_MAC_ID_OFST 0 +#define MC_CMD_MAE_MAC_ADDR_FREE_IN_MAC_ID_LEN 4 +#define MC_CMD_MAE_MAC_ADDR_FREE_IN_MAC_ID_MINNUM 1 +#define MC_CMD_MAE_MAC_ADDR_FREE_IN_MAC_ID_MAXNUM 32 +#define MC_CMD_MAE_MAC_ADDR_FREE_IN_MAC_ID_MAXNUM_MCDI2 32 + +/* MC_CMD_MAE_MAC_ADDR_FREE_OUT msgresponse */ +#define MC_CMD_MAE_MAC_ADDR_FREE_OUT_LENMIN 4 +#define MC_CMD_MAE_MAC_ADDR_FREE_OUT_LENMAX 128 +#define MC_CMD_MAE_MAC_ADDR_FREE_OUT_LENMAX_MCDI2 128 +#define MC_CMD_MAE_MAC_ADDR_FREE_OUT_LEN(num) (0+4*(num)) +#define MC_CMD_MAE_MAC_ADDR_FREE_OUT_FREED_MAC_ID_NUM(len) (((len)-0)/4) +/* Same semantics as MC_CMD_MAE_COUNTER_FREE */ +#define MC_CMD_MAE_MAC_ADDR_FREE_OUT_FREED_MAC_ID_OFST 0 +#define MC_CMD_MAE_MAC_ADDR_FREE_OUT_FREED_MAC_ID_LEN 4 +#define MC_CMD_MAE_MAC_ADDR_FREE_OUT_FREED_MAC_ID_MINNUM 1 +#define MC_CMD_MAE_MAC_ADDR_FREE_OUT_FREED_MAC_ID_MAXNUM 32 +#define MC_CMD_MAE_MAC_ADDR_FREE_OUT_FREED_MAC_ID_MAXNUM_MCDI2 32 + + +/***********************************/ +/* MC_CMD_MAE_ACTION_SET_ALLOC + * Allocate an action set, which can be referenced either in response to an + * Action Rule, or as part of an Action Set List. + */ +#define MC_CMD_MAE_ACTION_SET_ALLOC 0x14d +#undef MC_CMD_0x14d_PRIVILEGE_CTG + +#define MC_CMD_0x14d_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_ACTION_SET_ALLOC_IN msgrequest */ +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_LEN 44 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_FLAGS_OFST 0 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_FLAGS_LEN 4 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_VLAN_PUSH_OFST 0 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_VLAN_PUSH_LBN 0 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_VLAN_PUSH_WIDTH 2 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_VLAN_POP_OFST 0 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_VLAN_POP_LBN 4 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_VLAN_POP_WIDTH 2 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_DECAP_OFST 0 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_DECAP_LBN 8 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_DECAP_WIDTH 1 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_MARK_OFST 0 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_MARK_LBN 9 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_MARK_WIDTH 1 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_FLAG_OFST 0 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_FLAG_LBN 10 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_FLAG_WIDTH 1 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_DO_NAT_OFST 0 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_DO_NAT_LBN 11 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_DO_NAT_WIDTH 1 +/* If VLAN_PUSH >= 1, TCI value to be inserted as outermost VLAN. */ +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_VLAN0_TCI_BE_OFST 4 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_VLAN0_TCI_BE_LEN 2 +/* If VLAN_PUSH >= 1, TPID value to be inserted as outermost VLAN. */ +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_VLAN0_PROTO_BE_OFST 6 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_VLAN0_PROTO_BE_LEN 2 +/* If VLAN_PUSH == 2, inner TCI value to be inserted. */ +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_VLAN1_TCI_BE_OFST 8 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_VLAN1_TCI_BE_LEN 2 +/* If VLAN_PUSH == 2, inner TPID value to be inserted. */ +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_VLAN1_PROTO_BE_OFST 10 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_VLAN1_PROTO_BE_LEN 2 +/* Reserved. Ignored by firmware. Should be set to zero or 0xffffffff. */ +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_RSVD_OFST 12 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_RSVD_LEN 4 +/* Set to ENCAP_HEADER_ID_NULL to request no encap action */ +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_ENCAP_HEADER_ID_OFST 16 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_ENCAP_HEADER_ID_LEN 4 +/* An m-port selector identifying the m-port that the modified packet should be + * delivered to. Set to MPORT_SELECTOR_NULL to request no delivery of the + * packet. + */ +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_DELIVER_OFST 20 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_DELIVER_LEN 4 +/* Allows an action set to trigger several counter updates. Set to + * COUNTER_LIST_ID_NULL to request no counter action. + */ +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_COUNTER_LIST_ID_OFST 24 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_COUNTER_LIST_ID_LEN 4 +/* If a driver only wished to update one counter within this action set, then + * it can supply a COUNTER_ID instead of allocating a single-element counter + * list. This field should be set to COUNTER_ID_NULL if this behaviour is not + * required. It is not valid to supply a non-NULL value for both + * COUNTER_LIST_ID and COUNTER_ID. + */ +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_COUNTER_ID_OFST 28 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_COUNTER_ID_LEN 4 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_MARK_VALUE_OFST 32 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_MARK_VALUE_LEN 4 +/* Set to MAC_ID_NULL to request no source MAC replacement. */ +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_SRC_MAC_ID_OFST 36 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_SRC_MAC_ID_LEN 4 +/* Set to MAC_ID_NULL to request no destination MAC replacement. */ +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_DST_MAC_ID_OFST 40 +#define MC_CMD_MAE_ACTION_SET_ALLOC_IN_DST_MAC_ID_LEN 4 + +/* MC_CMD_MAE_ACTION_SET_ALLOC_OUT msgresponse */ +#define MC_CMD_MAE_ACTION_SET_ALLOC_OUT_LEN 4 +#define MC_CMD_MAE_ACTION_SET_ALLOC_OUT_AS_ID_OFST 0 +#define MC_CMD_MAE_ACTION_SET_ALLOC_OUT_AS_ID_LEN 4 +/* enum: An action set ID that is guaranteed never to represent an action set + */ +#define MC_CMD_MAE_ACTION_SET_ALLOC_OUT_ACTION_SET_ID_NULL 0xffffffff + + +/***********************************/ +/* MC_CMD_MAE_ACTION_SET_FREE + */ +#define MC_CMD_MAE_ACTION_SET_FREE 0x14e +#undef MC_CMD_0x14e_PRIVILEGE_CTG + +#define MC_CMD_0x14e_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_ACTION_SET_FREE_IN msgrequest */ +#define MC_CMD_MAE_ACTION_SET_FREE_IN_LENMIN 4 +#define MC_CMD_MAE_ACTION_SET_FREE_IN_LENMAX 128 +#define MC_CMD_MAE_ACTION_SET_FREE_IN_LENMAX_MCDI2 128 +#define MC_CMD_MAE_ACTION_SET_FREE_IN_LEN(num) (0+4*(num)) +#define MC_CMD_MAE_ACTION_SET_FREE_IN_AS_ID_NUM(len) (((len)-0)/4) +/* Same semantics as MC_CMD_MAE_COUNTER_FREE */ +#define MC_CMD_MAE_ACTION_SET_FREE_IN_AS_ID_OFST 0 +#define MC_CMD_MAE_ACTION_SET_FREE_IN_AS_ID_LEN 4 +#define MC_CMD_MAE_ACTION_SET_FREE_IN_AS_ID_MINNUM 1 +#define MC_CMD_MAE_ACTION_SET_FREE_IN_AS_ID_MAXNUM 32 +#define MC_CMD_MAE_ACTION_SET_FREE_IN_AS_ID_MAXNUM_MCDI2 32 + +/* MC_CMD_MAE_ACTION_SET_FREE_OUT msgresponse */ +#define MC_CMD_MAE_ACTION_SET_FREE_OUT_LENMIN 4 +#define MC_CMD_MAE_ACTION_SET_FREE_OUT_LENMAX 128 +#define MC_CMD_MAE_ACTION_SET_FREE_OUT_LENMAX_MCDI2 128 +#define MC_CMD_MAE_ACTION_SET_FREE_OUT_LEN(num) (0+4*(num)) +#define MC_CMD_MAE_ACTION_SET_FREE_OUT_FREED_AS_ID_NUM(len) (((len)-0)/4) +/* Same semantics as MC_CMD_MAE_COUNTER_FREE */ +#define MC_CMD_MAE_ACTION_SET_FREE_OUT_FREED_AS_ID_OFST 0 +#define MC_CMD_MAE_ACTION_SET_FREE_OUT_FREED_AS_ID_LEN 4 +#define MC_CMD_MAE_ACTION_SET_FREE_OUT_FREED_AS_ID_MINNUM 1 +#define MC_CMD_MAE_ACTION_SET_FREE_OUT_FREED_AS_ID_MAXNUM 32 +#define MC_CMD_MAE_ACTION_SET_FREE_OUT_FREED_AS_ID_MAXNUM_MCDI2 32 + + +/***********************************/ +/* MC_CMD_MAE_ACTION_SET_LIST_ALLOC + * Allocate an action set list (ASL) that can be referenced by an ID. The ASL + * ID can be used when inserting an action rule, so that for each packet + * matching the rule every action set in the list is applied. + */ +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC 0x14f +#undef MC_CMD_0x14f_PRIVILEGE_CTG + +#define MC_CMD_0x14f_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_ACTION_SET_LIST_ALLOC_IN msgrequest */ +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC_IN_LENMIN 8 +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC_IN_LENMAX 252 +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC_IN_LENMAX_MCDI2 1020 +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC_IN_LEN(num) (4+4*(num)) +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC_IN_AS_IDS_NUM(len) (((len)-4)/4) +/* Number of elements in the AS_IDS field. */ +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC_IN_COUNT_OFST 0 +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC_IN_COUNT_LEN 4 +/* The IDs of the action sets in this list. The last element of this list may + * be the ID of an already allocated ASL. In this case the action sets from the + * already allocated ASL will be applied after the action sets supplied by this + * request. This mechanism can be used to reduce resource usage in the case + * where one ASL is a sublist of another ASL. The sublist should be allocated + * first, then the superlist should be allocated by supplying all required + * action set IDs that are not in the sublist followed by the ID of the + * sublist. One sublist can be referenced by multiple superlists. + */ +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC_IN_AS_IDS_OFST 4 +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC_IN_AS_IDS_LEN 4 +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC_IN_AS_IDS_MINNUM 1 +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC_IN_AS_IDS_MAXNUM 62 +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC_IN_AS_IDS_MAXNUM_MCDI2 254 + +/* MC_CMD_MAE_ACTION_SET_LIST_ALLOC_OUT msgresponse */ +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC_OUT_LEN 4 +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC_OUT_ASL_ID_OFST 0 +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC_OUT_ASL_ID_LEN 4 +/* enum: An action set list ID that is guaranteed never to represent an action + * set list + */ +#define MC_CMD_MAE_ACTION_SET_LIST_ALLOC_OUT_ACTION_SET_LIST_ID_NULL 0xffffffff + + +/***********************************/ +/* MC_CMD_MAE_ACTION_SET_LIST_FREE + * Free match-action-engine redirect_lists + */ +#define MC_CMD_MAE_ACTION_SET_LIST_FREE 0x150 +#undef MC_CMD_0x150_PRIVILEGE_CTG + +#define MC_CMD_0x150_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_ACTION_SET_LIST_FREE_IN msgrequest */ +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_IN_LENMIN 4 +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_IN_LENMAX 128 +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_IN_LENMAX_MCDI2 128 +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_IN_LEN(num) (0+4*(num)) +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_IN_ASL_ID_NUM(len) (((len)-0)/4) +/* Same semantics as MC_CMD_MAE_COUNTER_FREE */ +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_IN_ASL_ID_OFST 0 +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_IN_ASL_ID_LEN 4 +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_IN_ASL_ID_MINNUM 1 +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_IN_ASL_ID_MAXNUM 32 +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_IN_ASL_ID_MAXNUM_MCDI2 32 + +/* MC_CMD_MAE_ACTION_SET_LIST_FREE_OUT msgresponse */ +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_OUT_LENMIN 4 +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_OUT_LENMAX 128 +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_OUT_LENMAX_MCDI2 128 +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_OUT_LEN(num) (0+4*(num)) +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_OUT_FREED_ASL_ID_NUM(len) (((len)-0)/4) +/* Same semantics as MC_CMD_MAE_COUNTER_FREE */ +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_OUT_FREED_ASL_ID_OFST 0 +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_OUT_FREED_ASL_ID_LEN 4 +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_OUT_FREED_ASL_ID_MINNUM 1 +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_OUT_FREED_ASL_ID_MAXNUM 32 +#define MC_CMD_MAE_ACTION_SET_LIST_FREE_OUT_FREED_ASL_ID_MAXNUM_MCDI2 32 + + +/***********************************/ +/* MC_CMD_MAE_OUTER_RULE_INSERT + * Inserts an Outer Rule, which controls encapsulation parsing, and may + * influence the Lookup Sequence. + */ +#define MC_CMD_MAE_OUTER_RULE_INSERT 0x15a +#undef MC_CMD_0x15a_PRIVILEGE_CTG + +#define MC_CMD_0x15a_PRIVILEGE_CTG SRIOV_CTG_ADMIN + +/* MC_CMD_MAE_OUTER_RULE_INSERT_IN msgrequest */ +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_LENMIN 16 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_LENMAX 252 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_LENMAX_MCDI2 1020 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_LEN(num) (16+1*(num)) +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_FIELD_MATCH_CRITERIA_NUM(len) (((len)-16)/1) +/* Packets matching the rule will be parsed with this encapsulation. */ +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_ENCAP_TYPE_OFST 0 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_ENCAP_TYPE_LEN 4 +/* Enum values, see field(s): */ +/* MAE_MCDI_ENCAP_TYPE */ +/* Match priority. Lower values have higher priority. Must be less than + * MC_CMD_MAE_GET_CAPS_OUT.ENCAP_PRIOS If a packet matches two filters with + * equal priority then it is unspecified which takes priority. + */ +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_PRIO_OFST 4 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_PRIO_LEN 4 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_LOOKUP_CONTROL_OFST 8 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_LOOKUP_CONTROL_LEN 4 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_DO_CT_OFST 8 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_DO_CT_LBN 0 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_DO_CT_WIDTH 1 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_CT_VNI_MODE_OFST 8 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_CT_VNI_MODE_LBN 1 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_CT_VNI_MODE_WIDTH 2 +/* Enum values, see field(s): */ +/* MAE_CT_VNI_MODE */ +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_RECIRC_ID_OFST 8 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_RECIRC_ID_LBN 8 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_RECIRC_ID_WIDTH 8 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_CT_DOMAIN_OFST 8 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_CT_DOMAIN_LBN 16 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_CT_DOMAIN_WIDTH 16 +/* Reserved for future use. Must be set to zero. */ +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_RSVD_OFST 12 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_RSVD_LEN 4 +/* Structure of the format MAE_ENC_FIELD_PAIRS. */ +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_FIELD_MATCH_CRITERIA_OFST 16 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_FIELD_MATCH_CRITERIA_LEN 1 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_FIELD_MATCH_CRITERIA_MINNUM 0 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_FIELD_MATCH_CRITERIA_MAXNUM 236 +#define MC_CMD_MAE_OUTER_RULE_INSERT_IN_FIELD_MATCH_CRITERIA_MAXNUM_MCDI2 1004 + +/* MC_CMD_MAE_OUTER_RULE_INSERT_OUT msgresponse */ +#define MC_CMD_MAE_OUTER_RULE_INSERT_OUT_LEN 4 +#define MC_CMD_MAE_OUTER_RULE_INSERT_OUT_OR_ID_OFST 0 +#define MC_CMD_MAE_OUTER_RULE_INSERT_OUT_OR_ID_LEN 4 +/* enum: An outer match ID that is guaranteed never to represent an outer match + */ +#define MC_CMD_MAE_OUTER_RULE_INSERT_OUT_OUTER_RULE_ID_NULL 0xffffffff + + +/***********************************/ +/* MC_CMD_MAE_OUTER_RULE_REMOVE + */ +#define MC_CMD_MAE_OUTER_RULE_REMOVE 0x15b +#undef MC_CMD_0x15b_PRIVILEGE_CTG + +#define MC_CMD_0x15b_PRIVILEGE_CTG SRIOV_CTG_ADMIN + +/* MC_CMD_MAE_OUTER_RULE_REMOVE_IN msgrequest */ +#define MC_CMD_MAE_OUTER_RULE_REMOVE_IN_LENMIN 4 +#define MC_CMD_MAE_OUTER_RULE_REMOVE_IN_LENMAX 128 +#define MC_CMD_MAE_OUTER_RULE_REMOVE_IN_LENMAX_MCDI2 128 +#define MC_CMD_MAE_OUTER_RULE_REMOVE_IN_LEN(num) (0+4*(num)) +#define MC_CMD_MAE_OUTER_RULE_REMOVE_IN_OR_ID_NUM(len) (((len)-0)/4) +/* Same semantics as MC_CMD_MAE_COUNTER_FREE */ +#define MC_CMD_MAE_OUTER_RULE_REMOVE_IN_OR_ID_OFST 0 +#define MC_CMD_MAE_OUTER_RULE_REMOVE_IN_OR_ID_LEN 4 +#define MC_CMD_MAE_OUTER_RULE_REMOVE_IN_OR_ID_MINNUM 1 +#define MC_CMD_MAE_OUTER_RULE_REMOVE_IN_OR_ID_MAXNUM 32 +#define MC_CMD_MAE_OUTER_RULE_REMOVE_IN_OR_ID_MAXNUM_MCDI2 32 + +/* MC_CMD_MAE_OUTER_RULE_REMOVE_OUT msgresponse */ +#define MC_CMD_MAE_OUTER_RULE_REMOVE_OUT_LENMIN 4 +#define MC_CMD_MAE_OUTER_RULE_REMOVE_OUT_LENMAX 128 +#define MC_CMD_MAE_OUTER_RULE_REMOVE_OUT_LENMAX_MCDI2 128 +#define MC_CMD_MAE_OUTER_RULE_REMOVE_OUT_LEN(num) (0+4*(num)) +#define MC_CMD_MAE_OUTER_RULE_REMOVE_OUT_REMOVED_OR_ID_NUM(len) (((len)-0)/4) +/* Same semantics as MC_CMD_MAE_COUNTER_FREE */ +#define MC_CMD_MAE_OUTER_RULE_REMOVE_OUT_REMOVED_OR_ID_OFST 0 +#define MC_CMD_MAE_OUTER_RULE_REMOVE_OUT_REMOVED_OR_ID_LEN 4 +#define MC_CMD_MAE_OUTER_RULE_REMOVE_OUT_REMOVED_OR_ID_MINNUM 1 +#define MC_CMD_MAE_OUTER_RULE_REMOVE_OUT_REMOVED_OR_ID_MAXNUM 32 +#define MC_CMD_MAE_OUTER_RULE_REMOVE_OUT_REMOVED_OR_ID_MAXNUM_MCDI2 32 + +/* MAE_ACTION_RULE_RESPONSE structuredef */ +#define MAE_ACTION_RULE_RESPONSE_LEN 16 +#define MAE_ACTION_RULE_RESPONSE_ASL_ID_OFST 0 +#define MAE_ACTION_RULE_RESPONSE_ASL_ID_LEN 4 +#define MAE_ACTION_RULE_RESPONSE_ASL_ID_LBN 0 +#define MAE_ACTION_RULE_RESPONSE_ASL_ID_WIDTH 32 +/* Only one of ASL_ID or AS_ID may have a non-NULL value. */ +#define MAE_ACTION_RULE_RESPONSE_AS_ID_OFST 4 +#define MAE_ACTION_RULE_RESPONSE_AS_ID_LEN 4 +#define MAE_ACTION_RULE_RESPONSE_AS_ID_LBN 32 +#define MAE_ACTION_RULE_RESPONSE_AS_ID_WIDTH 32 +/* Controls lookup flow when this rule is hit. See sub-fields for details. More + * info on the lookup sequence can be found in SF-122976-TC. It is an error to + * set both DO_CT and DO_RECIRC. + */ +#define MAE_ACTION_RULE_RESPONSE_LOOKUP_CONTROL_OFST 8 +#define MAE_ACTION_RULE_RESPONSE_LOOKUP_CONTROL_LEN 4 +#define MAE_ACTION_RULE_RESPONSE_DO_CT_OFST 8 +#define MAE_ACTION_RULE_RESPONSE_DO_CT_LBN 0 +#define MAE_ACTION_RULE_RESPONSE_DO_CT_WIDTH 1 +#define MAE_ACTION_RULE_RESPONSE_DO_RECIRC_OFST 8 +#define MAE_ACTION_RULE_RESPONSE_DO_RECIRC_LBN 1 +#define MAE_ACTION_RULE_RESPONSE_DO_RECIRC_WIDTH 1 +#define MAE_ACTION_RULE_RESPONSE_CT_VNI_MODE_OFST 8 +#define MAE_ACTION_RULE_RESPONSE_CT_VNI_MODE_LBN 2 +#define MAE_ACTION_RULE_RESPONSE_CT_VNI_MODE_WIDTH 2 +/* Enum values, see field(s): */ +/* MAE_CT_VNI_MODE */ +#define MAE_ACTION_RULE_RESPONSE_RECIRC_ID_OFST 8 +#define MAE_ACTION_RULE_RESPONSE_RECIRC_ID_LBN 8 +#define MAE_ACTION_RULE_RESPONSE_RECIRC_ID_WIDTH 8 +#define MAE_ACTION_RULE_RESPONSE_CT_DOMAIN_OFST 8 +#define MAE_ACTION_RULE_RESPONSE_CT_DOMAIN_LBN 16 +#define MAE_ACTION_RULE_RESPONSE_CT_DOMAIN_WIDTH 16 +#define MAE_ACTION_RULE_RESPONSE_LOOKUP_CONTROL_LBN 64 +#define MAE_ACTION_RULE_RESPONSE_LOOKUP_CONTROL_WIDTH 32 +/* Counter ID to increment if DO_CT or DO_RECIRC is set. Must be set to + * COUNTER_ID_NULL otherwise. + */ +#define MAE_ACTION_RULE_RESPONSE_COUNTER_ID_OFST 12 +#define MAE_ACTION_RULE_RESPONSE_COUNTER_ID_LEN 4 +#define MAE_ACTION_RULE_RESPONSE_COUNTER_ID_LBN 96 +#define MAE_ACTION_RULE_RESPONSE_COUNTER_ID_WIDTH 32 + + +/***********************************/ +/* MC_CMD_MAE_ACTION_RULE_INSERT + * Insert a rule specify that packets matching a filter be processed according + * to a previous allocated action. Masks can be set as indicated by + * MC_CMD_MAE_GET_MATCH_FIELD_CAPABILITIES. + */ +#define MC_CMD_MAE_ACTION_RULE_INSERT 0x15c +#undef MC_CMD_0x15c_PRIVILEGE_CTG + +#define MC_CMD_0x15c_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_ACTION_RULE_INSERT_IN msgrequest */ +#define MC_CMD_MAE_ACTION_RULE_INSERT_IN_LENMIN 28 +#define MC_CMD_MAE_ACTION_RULE_INSERT_IN_LENMAX 252 +#define MC_CMD_MAE_ACTION_RULE_INSERT_IN_LENMAX_MCDI2 1020 +#define MC_CMD_MAE_ACTION_RULE_INSERT_IN_LEN(num) (28+1*(num)) +#define MC_CMD_MAE_ACTION_RULE_INSERT_IN_MATCH_CRITERIA_NUM(len) (((len)-28)/1) +/* See MC_CMD_MAE_OUTER_RULE_REGISTER_IN/PRIO. */ +#define MC_CMD_MAE_ACTION_RULE_INSERT_IN_PRIO_OFST 0 +#define MC_CMD_MAE_ACTION_RULE_INSERT_IN_PRIO_LEN 4 +/* Structure of the format MAE_ACTION_RULE_RESPONSE */ +#define MC_CMD_MAE_ACTION_RULE_INSERT_IN_RESPONSE_OFST 4 +#define MC_CMD_MAE_ACTION_RULE_INSERT_IN_RESPONSE_LEN 20 +/* Reserved for future use. Must be set to zero. */ +#define MC_CMD_MAE_ACTION_RULE_INSERT_IN_RSVD_OFST 24 +#define MC_CMD_MAE_ACTION_RULE_INSERT_IN_RSVD_LEN 4 +/* Structure of the format MAE_FIELD_MASK_VALUE_PAIRS */ +#define MC_CMD_MAE_ACTION_RULE_INSERT_IN_MATCH_CRITERIA_OFST 28 +#define MC_CMD_MAE_ACTION_RULE_INSERT_IN_MATCH_CRITERIA_LEN 1 +#define MC_CMD_MAE_ACTION_RULE_INSERT_IN_MATCH_CRITERIA_MINNUM 0 +#define MC_CMD_MAE_ACTION_RULE_INSERT_IN_MATCH_CRITERIA_MAXNUM 224 +#define MC_CMD_MAE_ACTION_RULE_INSERT_IN_MATCH_CRITERIA_MAXNUM_MCDI2 992 + +/* MC_CMD_MAE_ACTION_RULE_INSERT_OUT msgresponse */ +#define MC_CMD_MAE_ACTION_RULE_INSERT_OUT_LEN 4 +#define MC_CMD_MAE_ACTION_RULE_INSERT_OUT_AR_ID_OFST 0 +#define MC_CMD_MAE_ACTION_RULE_INSERT_OUT_AR_ID_LEN 4 +/* enum: An action rule ID that is guaranteed never to represent an action rule + */ +#define MC_CMD_MAE_ACTION_RULE_INSERT_OUT_ACTION_RULE_ID_NULL 0xffffffff + + +/***********************************/ +/* MC_CMD_MAE_ACTION_RULE_UPDATE + * Atomically change the response of an action rule. Firmware may return + * ENOTSUP, in which case the driver should DELETE/INSERT. + */ +#define MC_CMD_MAE_ACTION_RULE_UPDATE 0x15d +#undef MC_CMD_0x15d_PRIVILEGE_CTG + +#define MC_CMD_0x15d_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_ACTION_RULE_UPDATE_IN msgrequest */ +#define MC_CMD_MAE_ACTION_RULE_UPDATE_IN_LEN 24 +/* ID of action rule to update */ +#define MC_CMD_MAE_ACTION_RULE_UPDATE_IN_AR_ID_OFST 0 +#define MC_CMD_MAE_ACTION_RULE_UPDATE_IN_AR_ID_LEN 4 +/* Structure of the format MAE_ACTION_RULE_RESPONSE */ +#define MC_CMD_MAE_ACTION_RULE_UPDATE_IN_RESPONSE_OFST 4 +#define MC_CMD_MAE_ACTION_RULE_UPDATE_IN_RESPONSE_LEN 20 + +/* MC_CMD_MAE_ACTION_RULE_UPDATE_OUT msgresponse */ +#define MC_CMD_MAE_ACTION_RULE_UPDATE_OUT_LEN 0 + + +/***********************************/ +/* MC_CMD_MAE_ACTION_RULE_DELETE + */ +#define MC_CMD_MAE_ACTION_RULE_DELETE 0x155 +#undef MC_CMD_0x155_PRIVILEGE_CTG + +#define MC_CMD_0x155_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_ACTION_RULE_DELETE_IN msgrequest */ +#define MC_CMD_MAE_ACTION_RULE_DELETE_IN_LENMIN 4 +#define MC_CMD_MAE_ACTION_RULE_DELETE_IN_LENMAX 128 +#define MC_CMD_MAE_ACTION_RULE_DELETE_IN_LENMAX_MCDI2 128 +#define MC_CMD_MAE_ACTION_RULE_DELETE_IN_LEN(num) (0+4*(num)) +#define MC_CMD_MAE_ACTION_RULE_DELETE_IN_AR_ID_NUM(len) (((len)-0)/4) +/* Same semantics as MC_CMD_MAE_COUNTER_FREE */ +#define MC_CMD_MAE_ACTION_RULE_DELETE_IN_AR_ID_OFST 0 +#define MC_CMD_MAE_ACTION_RULE_DELETE_IN_AR_ID_LEN 4 +#define MC_CMD_MAE_ACTION_RULE_DELETE_IN_AR_ID_MINNUM 1 +#define MC_CMD_MAE_ACTION_RULE_DELETE_IN_AR_ID_MAXNUM 32 +#define MC_CMD_MAE_ACTION_RULE_DELETE_IN_AR_ID_MAXNUM_MCDI2 32 + +/* MC_CMD_MAE_ACTION_RULE_DELETE_OUT msgresponse */ +#define MC_CMD_MAE_ACTION_RULE_DELETE_OUT_LENMIN 4 +#define MC_CMD_MAE_ACTION_RULE_DELETE_OUT_LENMAX 128 +#define MC_CMD_MAE_ACTION_RULE_DELETE_OUT_LENMAX_MCDI2 128 +#define MC_CMD_MAE_ACTION_RULE_DELETE_OUT_LEN(num) (0+4*(num)) +#define MC_CMD_MAE_ACTION_RULE_DELETE_OUT_DELETED_AR_ID_NUM(len) (((len)-0)/4) +/* Same semantics as MC_CMD_MAE_COUNTER_FREE */ +#define MC_CMD_MAE_ACTION_RULE_DELETE_OUT_DELETED_AR_ID_OFST 0 +#define MC_CMD_MAE_ACTION_RULE_DELETE_OUT_DELETED_AR_ID_LEN 4 +#define MC_CMD_MAE_ACTION_RULE_DELETE_OUT_DELETED_AR_ID_MINNUM 1 +#define MC_CMD_MAE_ACTION_RULE_DELETE_OUT_DELETED_AR_ID_MAXNUM 32 +#define MC_CMD_MAE_ACTION_RULE_DELETE_OUT_DELETED_AR_ID_MAXNUM_MCDI2 32 + + +/***********************************/ +/* MC_CMD_MAE_MPORT_LOOKUP + * Return the m-port corresponding to a selector. + */ +#define MC_CMD_MAE_MPORT_LOOKUP 0x160 +#undef MC_CMD_0x160_PRIVILEGE_CTG + +#define MC_CMD_0x160_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_MPORT_LOOKUP_IN msgrequest */ +#define MC_CMD_MAE_MPORT_LOOKUP_IN_LEN 4 +#define MC_CMD_MAE_MPORT_LOOKUP_IN_MPORT_SELECTOR_OFST 0 +#define MC_CMD_MAE_MPORT_LOOKUP_IN_MPORT_SELECTOR_LEN 4 + +/* MC_CMD_MAE_MPORT_LOOKUP_OUT msgresponse */ +#define MC_CMD_MAE_MPORT_LOOKUP_OUT_LEN 4 +#define MC_CMD_MAE_MPORT_LOOKUP_OUT_MPORT_ID_OFST 0 +#define MC_CMD_MAE_MPORT_LOOKUP_OUT_MPORT_ID_LEN 4 + + +/***********************************/ +/* MC_CMD_MAE_MPORT_ALLOC + * Allocates a m-port, which can subsequently be used in action rules as a + * match or delivery argument. + */ +#define MC_CMD_MAE_MPORT_ALLOC 0x163 +#undef MC_CMD_0x163_PRIVILEGE_CTG + +#define MC_CMD_0x163_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_MPORT_ALLOC_IN msgrequest */ +#define MC_CMD_MAE_MPORT_ALLOC_IN_LEN 20 +/* The type of m-port to allocate. Firmware may return ENOTSUP for certain + * types. + */ +#define MC_CMD_MAE_MPORT_ALLOC_IN_TYPE_OFST 0 +#define MC_CMD_MAE_MPORT_ALLOC_IN_TYPE_LEN 4 +/* enum: Traffic can be sent to this type of m-port using an override + * descriptor. Traffic received on this type of m-port will go to the VNIC on a + * nominated m-port, and will be delivered with metadata identifying the alias + * m-port. + */ +#define MC_CMD_MAE_MPORT_ALLOC_IN_MPORT_TYPE_ALIAS 0x1 +/* enum: This type of m-port has a VNIC attached. Queues can be created on this + * VNIC by specifying the created m-port as an m-port selector at queue + * creation time. + */ +#define MC_CMD_MAE_MPORT_ALLOC_IN_MPORT_TYPE_VNIC 0x2 +/* 128-bit value for use by the driver. */ +#define MC_CMD_MAE_MPORT_ALLOC_IN_UUID_OFST 4 +#define MC_CMD_MAE_MPORT_ALLOC_IN_UUID_LEN 16 + +/* MC_CMD_MAE_MPORT_ALLOC_ALIAS_IN msgrequest */ +#define MC_CMD_MAE_MPORT_ALLOC_ALIAS_IN_LEN 24 +/* The type of m-port to allocate. Firmware may return ENOTSUP for certain + * types. + */ +#define MC_CMD_MAE_MPORT_ALLOC_ALIAS_IN_TYPE_OFST 0 +#define MC_CMD_MAE_MPORT_ALLOC_ALIAS_IN_TYPE_LEN 4 +/* enum: Traffic can be sent to this type of m-port using an override + * descriptor. Traffic received on this type of m-port will go to the VNIC on a + * nominated m-port, and will be delivered with metadata identifying the alias + * m-port. + */ +#define MC_CMD_MAE_MPORT_ALLOC_ALIAS_IN_MPORT_TYPE_ALIAS 0x1 +/* enum: This type of m-port has a VNIC attached. Queues can be created on this + * VNIC by specifying the created m-port as an m-port selector at queue + * creation time. + */ +#define MC_CMD_MAE_MPORT_ALLOC_ALIAS_IN_MPORT_TYPE_VNIC 0x2 +/* 128-bit value for use by the driver. */ +#define MC_CMD_MAE_MPORT_ALLOC_ALIAS_IN_UUID_OFST 4 +#define MC_CMD_MAE_MPORT_ALLOC_ALIAS_IN_UUID_LEN 16 +/* An m-port selector identifying the VNIC to which traffic should be + * delivered. This must currently be set to MAE_MPORT_SELECTOR_ASSIGNED (i.e. + * the m-port assigned to the calling client). + */ +#define MC_CMD_MAE_MPORT_ALLOC_ALIAS_IN_DELIVER_MPORT_OFST 20 +#define MC_CMD_MAE_MPORT_ALLOC_ALIAS_IN_DELIVER_MPORT_LEN 4 + +/* MC_CMD_MAE_MPORT_ALLOC_VNIC_IN msgrequest */ +#define MC_CMD_MAE_MPORT_ALLOC_VNIC_IN_LEN 20 +/* The type of m-port to allocate. Firmware may return ENOTSUP for certain + * types. + */ +#define MC_CMD_MAE_MPORT_ALLOC_VNIC_IN_TYPE_OFST 0 +#define MC_CMD_MAE_MPORT_ALLOC_VNIC_IN_TYPE_LEN 4 +/* enum: Traffic can be sent to this type of m-port using an override + * descriptor. Traffic received on this type of m-port will go to the VNIC on a + * nominated m-port, and will be delivered with metadata identifying the alias + * m-port. + */ +#define MC_CMD_MAE_MPORT_ALLOC_VNIC_IN_MPORT_TYPE_ALIAS 0x1 +/* enum: This type of m-port has a VNIC attached. Queues can be created on this + * VNIC by specifying the created m-port as an m-port selector at queue + * creation time. + */ +#define MC_CMD_MAE_MPORT_ALLOC_VNIC_IN_MPORT_TYPE_VNIC 0x2 +/* 128-bit value for use by the driver. */ +#define MC_CMD_MAE_MPORT_ALLOC_VNIC_IN_UUID_OFST 4 +#define MC_CMD_MAE_MPORT_ALLOC_VNIC_IN_UUID_LEN 16 + +/* MC_CMD_MAE_MPORT_ALLOC_OUT msgresponse */ +#define MC_CMD_MAE_MPORT_ALLOC_OUT_LEN 4 +/* ID of newly-allocated m-port. */ +#define MC_CMD_MAE_MPORT_ALLOC_OUT_MPORT_ID_OFST 0 +#define MC_CMD_MAE_MPORT_ALLOC_OUT_MPORT_ID_LEN 4 + +/* MC_CMD_MAE_MPORT_ALLOC_ALIAS_OUT msgrequest */ +#define MC_CMD_MAE_MPORT_ALLOC_ALIAS_OUT_LEN 24 +/* ID of newly-allocated m-port. */ +#define MC_CMD_MAE_MPORT_ALLOC_ALIAS_OUT_MPORT_ID_OFST 0 +#define MC_CMD_MAE_MPORT_ALLOC_ALIAS_OUT_MPORT_ID_LEN 4 +/* A value that will appear in the packet metadata for any packets delivered + * using an alias type m-port. This value is guaranteed unique on the VNIC + * being delivered to, and is guaranteed not to exceed the range of values + * representable in the relevant metadata field. + */ +#define MC_CMD_MAE_MPORT_ALLOC_ALIAS_OUT_LABEL_OFST 20 +#define MC_CMD_MAE_MPORT_ALLOC_ALIAS_OUT_LABEL_LEN 4 + +/* MC_CMD_MAE_MPORT_ALLOC_VNIC_OUT msgrequest */ +#define MC_CMD_MAE_MPORT_ALLOC_VNIC_OUT_LEN 4 +/* ID of newly-allocated m-port. */ +#define MC_CMD_MAE_MPORT_ALLOC_VNIC_OUT_MPORT_ID_OFST 0 +#define MC_CMD_MAE_MPORT_ALLOC_VNIC_OUT_MPORT_ID_LEN 4 + + +/***********************************/ +/* MC_CMD_MAE_MPORT_FREE + * Free a m-port which was previously allocated by the driver. + */ +#define MC_CMD_MAE_MPORT_FREE 0x164 +#undef MC_CMD_0x164_PRIVILEGE_CTG + +#define MC_CMD_0x164_PRIVILEGE_CTG SRIOV_CTG_GENERAL + +/* MC_CMD_MAE_MPORT_FREE_IN msgrequest */ +#define MC_CMD_MAE_MPORT_FREE_IN_LEN 4 +/* MPORT_ID as returned by MC_CMD_MAE_MPORT_ALLOC. */ +#define MC_CMD_MAE_MPORT_FREE_IN_MPORT_ID_OFST 0 +#define MC_CMD_MAE_MPORT_FREE_IN_MPORT_ID_LEN 4 + +/* MC_CMD_MAE_MPORT_FREE_OUT msgresponse */ +#define MC_CMD_MAE_MPORT_FREE_OUT_LEN 0 + +/* MAE_MPORT_DESC structuredef */ +#define MAE_MPORT_DESC_LEN 52 +#define MAE_MPORT_DESC_MPORT_ID_OFST 0 +#define MAE_MPORT_DESC_MPORT_ID_LEN 4 +#define MAE_MPORT_DESC_MPORT_ID_LBN 0 +#define MAE_MPORT_DESC_MPORT_ID_WIDTH 32 +/* Reserved for future purposes, contains information independent of caller */ +#define MAE_MPORT_DESC_FLAGS_OFST 4 +#define MAE_MPORT_DESC_FLAGS_LEN 4 +#define MAE_MPORT_DESC_FLAGS_LBN 32 +#define MAE_MPORT_DESC_FLAGS_WIDTH 32 +#define MAE_MPORT_DESC_CALLER_FLAGS_OFST 8 +#define MAE_MPORT_DESC_CALLER_FLAGS_LEN 4 +#define MAE_MPORT_DESC_CAN_RECEIVE_ON_OFST 8 +#define MAE_MPORT_DESC_CAN_RECEIVE_ON_LBN 0 +#define MAE_MPORT_DESC_CAN_RECEIVE_ON_WIDTH 1 +#define MAE_MPORT_DESC_CAN_DELIVER_TO_OFST 8 +#define MAE_MPORT_DESC_CAN_DELIVER_TO_LBN 1 +#define MAE_MPORT_DESC_CAN_DELIVER_TO_WIDTH 1 +#define MAE_MPORT_DESC_CAN_DELETE_OFST 8 +#define MAE_MPORT_DESC_CAN_DELETE_LBN 2 +#define MAE_MPORT_DESC_CAN_DELETE_WIDTH 1 +#define MAE_MPORT_DESC_CALLER_FLAGS_LBN 64 +#define MAE_MPORT_DESC_CALLER_FLAGS_WIDTH 32 +/* Not the ideal name; it's really the type of thing connected to the m-port */ +#define MAE_MPORT_DESC_MPORT_TYPE_OFST 12 +#define MAE_MPORT_DESC_MPORT_TYPE_LEN 4 +/* enum: Connected to a MAC... */ +#define MAE_MPORT_DESC_MPORT_TYPE_NET_PORT 0x0 +/* enum: Adds metadata and delivers to another m-port */ +#define MAE_MPORT_DESC_MPORT_TYPE_ALIAS 0x1 +/* enum: Connected to a VNIC. */ +#define MAE_MPORT_DESC_MPORT_TYPE_VNIC 0x2 +#define MAE_MPORT_DESC_MPORT_TYPE_LBN 96 +#define MAE_MPORT_DESC_MPORT_TYPE_WIDTH 32 +/* 128-bit value available to drivers for m-port identification. */ +#define MAE_MPORT_DESC_UUID_OFST 16 +#define MAE_MPORT_DESC_UUID_LEN 16 +#define MAE_MPORT_DESC_UUID_LBN 128 +#define MAE_MPORT_DESC_UUID_WIDTH 128 +/* Big wadge of space reserved for other common properties */ +#define MAE_MPORT_DESC_RESERVED_OFST 32 +#define MAE_MPORT_DESC_RESERVED_LEN 8 +#define MAE_MPORT_DESC_RESERVED_LO_OFST 32 +#define MAE_MPORT_DESC_RESERVED_HI_OFST 36 +#define MAE_MPORT_DESC_RESERVED_LBN 256 +#define MAE_MPORT_DESC_RESERVED_WIDTH 64 +/* Logical port index. Only valid when type NET Port. */ +#define MAE_MPORT_DESC_NET_PORT_IDX_OFST 40 +#define MAE_MPORT_DESC_NET_PORT_IDX_LEN 4 +#define MAE_MPORT_DESC_NET_PORT_IDX_LBN 320 +#define MAE_MPORT_DESC_NET_PORT_IDX_WIDTH 32 +/* The m-port delivered to */ +#define MAE_MPORT_DESC_ALIAS_DELIVER_MPORT_ID_OFST 40 +#define MAE_MPORT_DESC_ALIAS_DELIVER_MPORT_ID_LEN 4 +#define MAE_MPORT_DESC_ALIAS_DELIVER_MPORT_ID_LBN 320 +#define MAE_MPORT_DESC_ALIAS_DELIVER_MPORT_ID_WIDTH 32 +/* The type of thing that owns the VNIC */ +#define MAE_MPORT_DESC_VNIC_CLIENT_TYPE_OFST 40 +#define MAE_MPORT_DESC_VNIC_CLIENT_TYPE_LEN 4 +#define MAE_MPORT_DESC_VNIC_CLIENT_TYPE_FUNCTION 0x1 /* enum */ +#define MAE_MPORT_DESC_VNIC_CLIENT_TYPE_PLUGIN 0x2 /* enum */ +#define MAE_MPORT_DESC_VNIC_CLIENT_TYPE_LBN 320 +#define MAE_MPORT_DESC_VNIC_CLIENT_TYPE_WIDTH 32 +/* The PCIe interface on which the funcion lives. CJK: We need an enumeration + * of interfaces that we extend as new interface (types) appear. This belongs + * elsewhere and should be referenced from here + */ +#define MAE_MPORT_DESC_VNIC_FUNCTION_INTERFACE_OFST 44 +#define MAE_MPORT_DESC_VNIC_FUNCTION_INTERFACE_LEN 4 +#define MAE_MPORT_DESC_VNIC_FUNCTION_INTERFACE_LBN 352 +#define MAE_MPORT_DESC_VNIC_FUNCTION_INTERFACE_WIDTH 32 +#define MAE_MPORT_DESC_VNIC_FUNCTION_PF_IDX_OFST 48 +#define MAE_MPORT_DESC_VNIC_FUNCTION_PF_IDX_LEN 2 +#define MAE_MPORT_DESC_VNIC_FUNCTION_PF_IDX_LBN 384 +#define MAE_MPORT_DESC_VNIC_FUNCTION_PF_IDX_WIDTH 16 +#define MAE_MPORT_DESC_VNIC_FUNCTION_VF_IDX_OFST 50 +#define MAE_MPORT_DESC_VNIC_FUNCTION_VF_IDX_LEN 2 +/* enum: Indicates that the function is a PF */ +#define MAE_MPORT_DESC_VF_IDX_NULL 0xffff +#define MAE_MPORT_DESC_VNIC_FUNCTION_VF_IDX_LBN 400 +#define MAE_MPORT_DESC_VNIC_FUNCTION_VF_IDX_WIDTH 16 +/* Reserved. Should be ignored for now. */ +#define MAE_MPORT_DESC_VNIC_PLUGIN_TBD_OFST 44 +#define MAE_MPORT_DESC_VNIC_PLUGIN_TBD_LEN 4 +#define MAE_MPORT_DESC_VNIC_PLUGIN_TBD_LBN 352 +#define MAE_MPORT_DESC_VNIC_PLUGIN_TBD_WIDTH 32 + + +/***********************************/ +/* MC_CMD_MAE_MPORT_ENUMERATE + */ +#define MC_CMD_MAE_MPORT_ENUMERATE 0x17c + +/* MC_CMD_MAE_MPORT_ENUMERATE_IN msgrequest */ +#define MC_CMD_MAE_MPORT_ENUMERATE_IN_LEN 0 + +/* MC_CMD_MAE_MPORT_ENUMERATE_OUT msgresponse */ +#define MC_CMD_MAE_MPORT_ENUMERATE_OUT_LENMIN 8 +#define MC_CMD_MAE_MPORT_ENUMERATE_OUT_LENMAX 252 +#define MC_CMD_MAE_MPORT_ENUMERATE_OUT_LENMAX_MCDI2 1020 +#define MC_CMD_MAE_MPORT_ENUMERATE_OUT_LEN(num) (8+1*(num)) +#define MC_CMD_MAE_MPORT_ENUMERATE_OUT_MPORT_DESC_DATA_NUM(len) (((len)-8)/1) +#define MC_CMD_MAE_MPORT_ENUMERATE_OUT_MPORT_DESC_COUNT_OFST 0 +#define MC_CMD_MAE_MPORT_ENUMERATE_OUT_MPORT_DESC_COUNT_LEN 4 +#define MC_CMD_MAE_MPORT_ENUMERATE_OUT_SIZEOF_MPORT_DESC_OFST 4 +#define MC_CMD_MAE_MPORT_ENUMERATE_OUT_SIZEOF_MPORT_DESC_LEN 4 +/* Any array of MAE_MPORT_DESC structures. The MAE_MPORT_DESC structure may + * grow in future version of this command. Drivers should use a stride of + * SIZEOF_MPORT_DESC. Fields beyond SIZEOF_MPORT_DESC are not present. + */ +#define MC_CMD_MAE_MPORT_ENUMERATE_OUT_MPORT_DESC_DATA_OFST 8 +#define MC_CMD_MAE_MPORT_ENUMERATE_OUT_MPORT_DESC_DATA_LEN 1 +#define MC_CMD_MAE_MPORT_ENUMERATE_OUT_MPORT_DESC_DATA_MINNUM 0 +#define MC_CMD_MAE_MPORT_ENUMERATE_OUT_MPORT_DESC_DATA_MAXNUM 244 +#define MC_CMD_MAE_MPORT_ENUMERATE_OUT_MPORT_DESC_DATA_MAXNUM_MCDI2 1012 + #endif /* _SIENA_MC_DRIVER_PCOL_H */ From patchwork Tue Oct 20 08:47:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81447 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6DE93A04DD; Tue, 20 Oct 2020 10:50:22 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D242BBBC4; Tue, 20 Oct 2020 10:49:10 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 539A8ACC9 for ; Tue, 20 Oct 2020 10:48:57 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id D04C76006E for ; Tue, 20 Oct 2020 08:48:55 +0000 (UTC) Received: from us4-mdac16-15.ut7.mdlocal (unknown [10.7.65.239]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id CF79F2009A for ; Tue, 20 Oct 2020 08:48:55 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 5E2B31C0051 for ; Tue, 20 Oct 2020 08:48:55 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 147F8A8006D for ; Tue, 20 Oct 2020 08:48:55 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:49 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mlxM030782; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id C2A541613BE; Tue, 20 Oct 2020 09:48:47 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:29 +0100 Message-ID: <1603183709-23420-3-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-3.189700-8.000000-10 X-TMASE-MatchedRID: FLoUJm/U+M3IVeuQnVnkwONI3Mct2lzaWw/S0HB7eoNm9YF/kMfubVsl /aNichJzn1jRdwXXFJxlk+8lAsWWM0WSfdP0PEqZnFVnNmvv47tLXPA26IG0hN9RlPzeVuQQk4Z Foyo7DXj5ZsqO5ZgLGfZQEJE/IcGkKBrAiA/1x+VlpwNsTvdlKdxWLypmYlZzwCTIeJgMBBsqYJ zZpmg4uEdmWxcr+6zRuC2c3pw4Rj8fE8yM4pjsDwtuKBGekqUpm+MB6kaZ2g5qv9PWBGeyEpw+e N+dP0Z1qY1XYzJyk9/ABZBg3rnX3ReR30l28EAf8dtXG167hkt5xA6DQh0dZynF4zf9ILSuT5Ge gwhIlUnkA8OrYHdwDGfYlY/yoV/0Up6EHOb2+c7kHZDO53QSwuPlwCWV27Nr X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-3.189700-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183735-bHXVD534rdls X-PPE-DISP: 1603183735;bHXVD534rdls Subject: [dpdk-dev] [PATCH 02/62] common/sfc_efx/base: indicate support for MAE X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Riverhead boards maintain support for MAE, a low-level Match-Action Engine. The feature is documented in SF-122526-TC. The new field will help client drivers to test NIC support for MAE status. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/ef10_nic.c | 15 +++++++++++++++ drivers/common/sfc_efx/base/efx.h | 2 ++ drivers/common/sfc_efx/base/efx_check.h | 6 ++++++ drivers/common/sfc_efx/base/siena_nic.c | 2 ++ drivers/common/sfc_efx/efsys.h | 2 ++ 5 files changed, 27 insertions(+) diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c index df7db6a803..68414d9fa9 100644 --- a/drivers/common/sfc_efx/base/ef10_nic.c +++ b/drivers/common/sfc_efx/base/ef10_nic.c @@ -1421,8 +1421,23 @@ ef10_get_datapath_caps( else encp->enc_filter_action_mark_max = 0; +#if EFSYS_OPT_MAE + /* + * Indicate support for MAE. + * MAE is supported by Riverhead boards starting with R2, + * and it is required that FW is built with MAE support, too. + */ + if (CAP_FLAGS3(req, MAE_SUPPORTED)) + encp->enc_mae_supported = B_TRUE; + else + encp->enc_mae_supported = B_FALSE; +#else + encp->enc_mae_supported = B_FALSE; +#endif /* EFSYS_OPT_MAE */ + #undef CAP_FLAGS1 #undef CAP_FLAGS2 +#undef CAP_FLAGS3 return (0); diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index bd1ac303b1..9947882d26 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -1593,6 +1593,8 @@ typedef struct efx_nic_cfg_s { uint32_t enc_mac_stats_nstats; boolean_t enc_fec_counters; boolean_t enc_hlb_counters; + /* NIC support for Match-Action Engine (MAE). */ + boolean_t enc_mae_supported; /* Firmware support for "FLAG" and "MARK" filter actions */ boolean_t enc_filter_action_flag_supported; boolean_t enc_filter_action_mark_supported; diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h index 8f42d87a04..078e5b9811 100644 --- a/drivers/common/sfc_efx/base/efx_check.h +++ b/drivers/common/sfc_efx/base/efx_check.h @@ -401,4 +401,10 @@ # endif #endif /* EFSYS_OPT_DESC_PROXY */ +#if EFSYS_OPT_MAE +# if !EFSYS_OPT_RIVERHEAD +# error "MAE requires RIVERHEAD" +# endif +#endif /* EFSYS_OPT_MAE */ + #endif /* _SYS_EFX_CHECK_H */ diff --git a/drivers/common/sfc_efx/base/siena_nic.c b/drivers/common/sfc_efx/base/siena_nic.c index 4137c1e245..e2af0ff3dc 100644 --- a/drivers/common/sfc_efx/base/siena_nic.c +++ b/drivers/common/sfc_efx/base/siena_nic.c @@ -196,6 +196,8 @@ siena_board_cfg( encp->enc_filter_action_mark_supported = B_FALSE; encp->enc_filter_action_mark_max = 0; + encp->enc_mae_supported = B_FALSE; + return (0); fail2: diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h index f7d5f8a060..8636e73b68 100644 --- a/drivers/common/sfc_efx/efsys.h +++ b/drivers/common/sfc_efx/efsys.h @@ -167,6 +167,8 @@ prefetch_read_once(const volatile void *addr) #define EFSYS_OPT_DESC_PROXY 0 +#define EFSYS_OPT_MAE 0 + /* ID */ typedef struct __efsys_identifier_s efsys_identifier_t; From patchwork Tue Oct 20 08:47:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81443 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 98982A04DD; Tue, 20 Oct 2020 10:49:00 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 06076AD33; Tue, 20 Oct 2020 10:48:59 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id B896EACC9 for ; Tue, 20 Oct 2020 10:48:55 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 4027460080 for ; Tue, 20 Oct 2020 08:48:54 +0000 (UTC) Received: from us4-mdac16-35.ut7.mdlocal (unknown [10.7.66.154]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 40C048009E for ; Tue, 20 Oct 2020 08:48:54 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id BBFE180051 for ; Tue, 20 Oct 2020 08:48:53 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 5376EA80070 for ; Tue, 20 Oct 2020 08:48:53 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:49 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mlAh030783; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id D06331613CB; Tue, 20 Oct 2020 09:48:47 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:30 +0100 Message-ID: <1603183709-23420-4-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.336900-8.000000-10 X-TMASE-MatchedRID: 0mQrXAq7vOW2eGGESuJjBy2416nc3bQleouvej40T4gd0WOKRkwsh0wS eVQnSS/F/SrcY9Zl4TqPQi9XuOWoODXklYhiubw4R/j040fRFpLZywDYifSetubnFWpNX1DBu/q +tuzAwMydg+/kDYdnnC8tLtg8xOnDCxMfqrnN4/cSpHTeye7cTydXh9h8+3X2bpP1MXIEsoYECR puTNFoleLzNWBegCW2wgn7iDBesS0nRE+fI6etkhX6hngTAdwoPBn1MmW2fsm+RVW19KKK8XanX 4Thsd9e62MGhQYeH7pfd+gfOLmaUcFhX9t3PwBMGkJFRuxGLIVaeaUjbTBWuL1NuKS30BZnQIFI ZLtsgG0DUH+nVLNyiCsqIP9TxvtJMb6p570ilnc= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--1.336900-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183734-7BESPw6CdpD9 X-PPE-DISP: 1603183734;7BESPw6CdpD9 Subject: [dpdk-dev] [PATCH 03/62] net/sfc: add a stub for attaching to MAE X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add a stub for MAE attach / detach path and introduce MAE-specific context. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/net/sfc/meson.build | 1 + drivers/net/sfc/sfc.c | 8 ++++++ drivers/net/sfc/sfc.h | 2 ++ drivers/net/sfc/sfc_mae.c | 49 +++++++++++++++++++++++++++++++++++++ drivers/net/sfc/sfc_mae.h | 41 +++++++++++++++++++++++++++++++ 5 files changed, 101 insertions(+) create mode 100644 drivers/net/sfc/sfc_mae.c create mode 100644 drivers/net/sfc/sfc_mae.h diff --git a/drivers/net/sfc/meson.build b/drivers/net/sfc/meson.build index 589f7863ae..7a893080cb 100644 --- a/drivers/net/sfc/meson.build +++ b/drivers/net/sfc/meson.build @@ -47,6 +47,7 @@ sources = files( 'sfc_tx.c', 'sfc_tso.c', 'sfc_filter.c', + 'sfc_mae.c', 'sfc_flow.c', 'sfc_dp.c', 'sfc_ef10_rx.c', diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c index 8fa790da55..3b896490f7 100644 --- a/drivers/net/sfc/sfc.c +++ b/drivers/net/sfc/sfc.c @@ -857,6 +857,10 @@ sfc_attach(struct sfc_adapter *sa) if (rc != 0) goto fail_filter_attach; + rc = sfc_mae_attach(sa); + if (rc != 0) + goto fail_mae_attach; + sfc_log_init(sa, "fini nic"); efx_nic_fini(enp); @@ -878,6 +882,9 @@ sfc_attach(struct sfc_adapter *sa) fail_sriov_vswitch_create: sfc_flow_fini(sa); + sfc_mae_detach(sa); + +fail_mae_attach: sfc_filter_detach(sa); fail_filter_attach: @@ -918,6 +925,7 @@ sfc_detach(struct sfc_adapter *sa) sfc_flow_fini(sa); + sfc_mae_detach(sa); sfc_filter_detach(sa); sfc_rss_detach(sa); sfc_port_detach(sa); diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h index 047ca64de7..4b5d687108 100644 --- a/drivers/net/sfc/sfc.h +++ b/drivers/net/sfc/sfc.h @@ -27,6 +27,7 @@ #include "sfc_log.h" #include "sfc_filter.h" #include "sfc_sriov.h" +#include "sfc_mae.h" #ifdef __cplusplus extern "C" { @@ -233,6 +234,7 @@ struct sfc_adapter { struct sfc_intr intr; struct sfc_port port; struct sfc_filter filter; + struct sfc_mae mae; struct sfc_flow_list flow_list; diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c new file mode 100644 index 0000000000..3ce654c19b --- /dev/null +++ b/drivers/net/sfc/sfc_mae.c @@ -0,0 +1,49 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * + * Copyright(c) 2019-2020 Xilinx, Inc. + * Copyright(c) 2019 Solarflare Communications Inc. + * + * This software was jointly developed between OKTET Labs (under contract + * for Solarflare) and Solarflare Communications, Inc. + */ + +#include + +#include + +#include "efx.h" + +#include "sfc.h" +#include "sfc_log.h" + +int +sfc_mae_attach(struct sfc_adapter *sa) +{ + const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic); + struct sfc_mae *mae = &sa->mae; + + sfc_log_init(sa, "entry"); + + if (!encp->enc_mae_supported) { + mae->status = SFC_MAE_STATUS_UNSUPPORTED; + return 0; + } + + mae->status = SFC_MAE_STATUS_SUPPORTED; + + sfc_log_init(sa, "done"); + + return 0; +} + +void +sfc_mae_detach(struct sfc_adapter *sa) +{ + struct sfc_mae *mae = &sa->mae; + + sfc_log_init(sa, "entry"); + + mae->status = SFC_MAE_STATUS_UNKNOWN; + + sfc_log_init(sa, "done"); +} diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h new file mode 100644 index 0000000000..d7821e71cc --- /dev/null +++ b/drivers/net/sfc/sfc_mae.h @@ -0,0 +1,41 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * + * Copyright(c) 2019-2020 Xilinx, Inc. + * Copyright(c) 2019 Solarflare Communications Inc. + * + * This software was jointly developed between OKTET Labs (under contract + * for Solarflare) and Solarflare Communications, Inc. + */ + +#ifndef _SFC_MAE_H +#define _SFC_MAE_H + +#include + +#include "efx.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Options for MAE support status */ +enum sfc_mae_status { + SFC_MAE_STATUS_UNKNOWN = 0, + SFC_MAE_STATUS_UNSUPPORTED, + SFC_MAE_STATUS_SUPPORTED +}; + +struct sfc_mae { + /** NIC support for MAE status */ + enum sfc_mae_status status; +}; + +struct sfc_adapter; + +int sfc_mae_attach(struct sfc_adapter *sa); +void sfc_mae_detach(struct sfc_adapter *sa); + +#ifdef __cplusplus +} +#endif +#endif /* _SFC_MAE_H */ From patchwork Tue Oct 20 08:47:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81444 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 52992A04DD; Tue, 20 Oct 2020 10:49:19 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 108FCBAF2; Tue, 20 Oct 2020 10:49:02 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 291A8AD28 for ; Tue, 20 Oct 2020 10:48:56 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id A407260061 for ; Tue, 20 Oct 2020 08:48:54 +0000 (UTC) Received: from us4-mdac16-60.ut7.mdlocal (unknown [10.7.66.51]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id A48BC2009A for ; Tue, 20 Oct 2020 08:48:54 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 297D81C004F for ; Tue, 20 Oct 2020 08:48:54 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id D3117A80070 for ; Tue, 20 Oct 2020 08:48:53 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:49 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mla0030784; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id DE12C1616D5; Tue, 20 Oct 2020 09:48:47 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:31 +0100 Message-ID: <1603183709-23420-5-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-2.153100-8.000000-10 X-TMASE-MatchedRID: AIIoHeHuMVU1GZ9TGM7jyKiUivh0j2PvCiTOKJLx+V7bUorR2XNnulBx JMU6DzjRkk084sJF0CZA08Pbjdhi2R1YpEPWJiyziJwEp8weVXxSQLJ/PYofeAaYevV4zG3ZgHn DooEQJbXrqKfrtXP7ijM1InEjg+54B47Cx1EiwG3/V0SDC1Do0KIik2/euMx1SnXYhdlqPHm7+r 627MDAzJ2D7+QNh2ec7DhyKqQbJQc5hou9z/6pqQlpVkdtt3WuuoYFb0nRiqM8WRRd/XXhhw0/c jFmbp1nzlscswoi8f3rixWWWJYrHx8TzIzimOwPC24oEZ6SpSmcfuxsiY4QFDORuSfSHu96emcZ unpo0EGoVuNaERakmIjL7bdeNewX+wA1fED82dS9DmbWx5Ay76smnjy4g+1tOY3mcjZb5qf0eCO cGDbYy+QDw6tgd3AMZ9iVj/KhX/RSnoQc5vb5zuQdkM7ndBLCYDttQUGqHZU= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--2.153100-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183734-qQe7eP7KE8dL X-PPE-DISP: 1603183734;qQe7eP7KE8dL Subject: [dpdk-dev] [PATCH 04/62] common/sfc_efx/base: add MAE init/fini APIs X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov The patch adds APIs for client drivers to initialise / finalise MAE-specific context in NIC control structure. The context itself will be used by the follow-up patches to store supportive data for library-internal consumers. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 14 +++++ drivers/common/sfc_efx/base/efx_impl.h | 10 ++++ drivers/common/sfc_efx/base/efx_mae.c | 57 +++++++++++++++++++ drivers/common/sfc_efx/base/meson.build | 1 + .../sfc_efx/rte_common_sfc_efx_version.map | 3 + 5 files changed, 85 insertions(+) create mode 100644 drivers/common/sfc_efx/base/efx_mae.c diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 9947882d26..f109c8e332 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4036,6 +4036,20 @@ efx_proxy_auth_privilege_modify( #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */ +#if EFSYS_OPT_MAE + +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_init( + __in efx_nic_t *enp); + +LIBEFX_API +extern void +efx_mae_fini( + __in efx_nic_t *enp); + +#endif /* EFSYS_OPT_MAE */ + #ifdef __cplusplus } #endif diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h index 196fd4a79c..8e72796acf 100644 --- a/drivers/common/sfc_efx/base/efx_impl.h +++ b/drivers/common/sfc_efx/base/efx_impl.h @@ -780,6 +780,13 @@ typedef struct efx_proxy_ops_s { #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */ +#if EFSYS_OPT_MAE + +typedef struct efx_mae_s { +} efx_mae_t; + +#endif /* EFSYS_OPT_MAE */ + #define EFX_DRV_VER_MAX 20 typedef struct efx_drv_cfg_s { @@ -886,6 +893,9 @@ struct efx_nic_s { #if EFSYS_OPT_MCDI_PROXY_AUTH_SERVER const efx_proxy_ops_t *en_epop; #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */ +#if EFSYS_OPT_MAE + efx_mae_t *en_maep; +#endif /* EFSYS_OPT_MAE */ }; #define EFX_FAMILY_IS_EF10(_enp) \ diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c new file mode 100644 index 0000000000..0de9ccb2e0 --- /dev/null +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -0,0 +1,57 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * + * Copyright(c) 2019 Xilinx, Inc. All rights reserved. + * All rights reserved. + */ + +#include "efx.h" +#include "efx_impl.h" + + +#if EFSYS_OPT_MAE + + __checkReturn efx_rc_t +efx_mae_init( + __in efx_nic_t *enp) +{ + const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp); + efx_mae_t *maep; + efx_rc_t rc; + + if (encp->enc_mae_supported == B_FALSE) { + rc = ENOTSUP; + goto fail1; + } + + EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (*maep), maep); + if (maep == NULL) { + rc = ENOMEM; + goto fail2; + } + + enp->en_maep = maep; + + return (0); + +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + + void +efx_mae_fini( + __in efx_nic_t *enp) +{ + const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp); + efx_mae_t *maep = enp->en_maep; + + if (encp->enc_mae_supported == B_FALSE) + return; + + EFSYS_KMEM_FREE(enp->en_esip, sizeof (*maep), maep); + enp->en_maep = NULL; +} + +#endif /* EFSYS_OPT_MAE */ diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build index e0acbda993..2016346eb5 100644 --- a/drivers/common/sfc_efx/base/meson.build +++ b/drivers/common/sfc_efx/base/meson.build @@ -15,6 +15,7 @@ sources = [ 'efx_intr.c', 'efx_lic.c', 'efx_mac.c', + 'efx_mae.c', 'efx_mcdi.c', 'efx_mon.c', 'efx_nic.c', diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index f656d5b644..c76dfe1e45 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -85,6 +85,9 @@ INTERNAL { efx_mac_stats_upload; efx_mac_up; + efx_mae_fini; + efx_mae_init; + efx_mcdi_fini; efx_mcdi_get_proxy_handle; efx_mcdi_get_timeout; From patchwork Tue Oct 20 08:47:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81445 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id BC3F5A04DD; Tue, 20 Oct 2020 10:49:39 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E2F23BBB8; Tue, 20 Oct 2020 10:49:05 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 912F7ACC9 for ; Tue, 20 Oct 2020 10:48:56 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.62]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 194B960051 for ; Tue, 20 Oct 2020 08:48:55 +0000 (UTC) Received: from us4-mdac16-30.ut7.mdlocal (unknown [10.7.66.140]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 188328009B for ; Tue, 20 Oct 2020 08:48:55 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 87D6828004D for ; Tue, 20 Oct 2020 08:48:54 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 3EA01A80071 for ; Tue, 20 Oct 2020 08:48:54 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnHn030800; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id EBA891616E3; Tue, 20 Oct 2020 09:48:47 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:32 +0100 Message-ID: <1603183709-23420-6-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.175400-8.000000-10 X-TMASE-MatchedRID: 1DmCryjwV2XabBVcqlDcF7sHVDDM5xAPP6Tki+9nU39YwVHjLI3nekAc 6DyoS2rIrXMOxnDE+MQzbI1E6WnGTk4l7sir0CBC/bV/VOhrmoqByxVkfd04JMLlYljmBfZco8W MkQWv6iUoTQl7wNH8Po2j49Ftap9Ero1URZJFbJtrfft55rUxllvGCZxC1c9glo/yFibJ7GXOIV CKtNnYWbAmjnsVNiz6Qo41jQgk7qUphba8lPe+b9oVs05KV5nOVr9TVCbQbPvw7JxwU0EvZMqER OLb/+yO4/0Jvn0rwAJmtL4Dw+zNb0D/MIf9Orkd X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-1.175400-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183735-BneXZ7yQ7NE2 X-PPE-DISP: 1603183735;BneXZ7yQ7NE2 Subject: [dpdk-dev] [PATCH 05/62] drivers: init/fini MAE on attach/detach X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov These actions affect MAE supplementary resources which are libefx-internal. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/efsys.h | 2 +- drivers/net/sfc/sfc_mae.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h index 8636e73b68..bbe9f2ef12 100644 --- a/drivers/common/sfc_efx/efsys.h +++ b/drivers/common/sfc_efx/efsys.h @@ -167,7 +167,7 @@ prefetch_read_once(const volatile void *addr) #define EFSYS_OPT_DESC_PROXY 0 -#define EFSYS_OPT_MAE 0 +#define EFSYS_OPT_MAE 1 /* ID */ diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 3ce654c19b..2a7ed6377a 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -21,6 +21,7 @@ sfc_mae_attach(struct sfc_adapter *sa) { const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic); struct sfc_mae *mae = &sa->mae; + int rc; sfc_log_init(sa, "entry"); @@ -29,21 +30,37 @@ sfc_mae_attach(struct sfc_adapter *sa) return 0; } + sfc_log_init(sa, "init MAE"); + rc = efx_mae_init(sa->nic); + if (rc != 0) + goto fail_mae_init; + mae->status = SFC_MAE_STATUS_SUPPORTED; sfc_log_init(sa, "done"); return 0; + +fail_mae_init: + sfc_log_init(sa, "failed %d", rc); + + return rc; } void sfc_mae_detach(struct sfc_adapter *sa) { struct sfc_mae *mae = &sa->mae; + enum sfc_mae_status status_prev = mae->status; sfc_log_init(sa, "entry"); mae->status = SFC_MAE_STATUS_UNKNOWN; + if (status_prev != SFC_MAE_STATUS_SUPPORTED) + return; + + efx_mae_fini(sa->nic); + sfc_log_init(sa, "done"); } From patchwork Tue Oct 20 08:47:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81446 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id BA663A04DD; Tue, 20 Oct 2020 10:49:57 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 908B3BBAA; Tue, 20 Oct 2020 10:49:08 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id E73C2AD28 for ; Tue, 20 Oct 2020 10:48:56 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 7080A60065 for ; Tue, 20 Oct 2020 08:48:55 +0000 (UTC) Received: from us4-mdac16-64.ut7.mdlocal (unknown [10.7.66.63]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 711958009E for ; Tue, 20 Oct 2020 08:48:55 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id F29A380051 for ; Tue, 20 Oct 2020 08:48:54 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 9D838A8006D for ; Tue, 20 Oct 2020 08:48:54 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnmI030803; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 041F31616ED; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:33 +0100 Message-ID: <1603183709-23420-7-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.516000-8.000000-10 X-TMASE-MatchedRID: pm5esiOnALWioKUtUDGXZVH6kd/WWyJVaeMaKzvXUpkOW0St5DT4VNnf JrUSEbFDMdqMWOXDAJRA+I8ifrgnnSHhSBQfglfsx5sgyUhLCNurlTqw7wfC0+MjEVIO/sdOZd0 GRVurhXHXKTbTa66f9mN0jvDhpUVG++XBDev6r0wPe5gzF3TVt1BijjE0XjY+eoHKBqqMb3GjxY yRBa/qJcFwgTvxipFajoczmuoPCq1nSgmzdTvBkY0u9j5IZFXbhL21g1HCvv/qjBBBl0JtStcCM mCrASy7KzVNYYm/dZyov9YDULidiWAmlRoH0vpE8dF7rotrHveF15h6/oibNbKsWJ44GuEGPNxa u39/BitFwHZmk+dWMlDn6t9UOCUflExlQIQeRG0= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-0.516000-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183735-3-F-g-MXarN4 X-PPE-DISP: 1603183735;3-F-g-MXarN4 Subject: [dpdk-dev] [PATCH 06/62] common/sfc_efx/base: add an MAE limit query API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add an API for client drivers to query the engine limits. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 10 +++ drivers/common/sfc_efx/base/efx_impl.h | 1 + drivers/common/sfc_efx/base/efx_mae.c | 72 +++++++++++++++++++ .../sfc_efx/rte_common_sfc_efx_version.map | 1 + 4 files changed, 84 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index f109c8e332..db66be0faf 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4048,6 +4048,16 @@ extern void efx_mae_fini( __in efx_nic_t *enp); +typedef struct efx_mae_limits_s { + uint32_t eml_max_n_action_prios; +} efx_mae_limits_t; + +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_get_limits( + __in efx_nic_t *enp, + __out efx_mae_limits_t *emlp); + #endif /* EFSYS_OPT_MAE */ #ifdef __cplusplus diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h index 8e72796acf..6e9329c203 100644 --- a/drivers/common/sfc_efx/base/efx_impl.h +++ b/drivers/common/sfc_efx/base/efx_impl.h @@ -783,6 +783,7 @@ typedef struct efx_proxy_ops_s { #if EFSYS_OPT_MAE typedef struct efx_mae_s { + uint32_t em_max_n_action_prios; } 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 0de9ccb2e0..c93342de15 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -10,6 +10,47 @@ #if EFSYS_OPT_MAE +static __checkReturn efx_rc_t +efx_mae_get_capabilities( + __in efx_nic_t *enp) +{ + efx_mcdi_req_t req; + EFX_MCDI_DECLARE_BUF(payload, + MC_CMD_MAE_GET_CAPS_IN_LEN, + MC_CMD_MAE_GET_CAPS_OUT_LEN); + struct efx_mae_s *maep = enp->en_maep; + efx_rc_t rc; + + req.emr_cmd = MC_CMD_MAE_GET_CAPS; + 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; + + efx_mcdi_execute(enp, &req); + + if (req.emr_rc != 0) { + rc = req.emr_rc; + goto fail1; + } + + if (req.emr_out_length_used < MC_CMD_MAE_GET_CAPS_OUT_LEN) { + rc = EMSGSIZE; + goto fail2; + } + + maep->em_max_n_action_prios = + MCDI_OUT_DWORD(req, MAE_GET_CAPS_OUT_ACTION_PRIOS); + + return (0); + +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + __checkReturn efx_rc_t efx_mae_init( __in efx_nic_t *enp) @@ -31,8 +72,16 @@ efx_mae_init( enp->en_maep = maep; + rc = efx_mae_get_capabilities(enp); + if (rc != 0) + goto fail3; + return (0); +fail3: + EFSYS_PROBE(fail3); + EFSYS_KMEM_FREE(enp->en_esip, sizeof (struct efx_mae_s), enp->en_maep); + enp->en_maep = NULL; fail2: EFSYS_PROBE(fail2); fail1: @@ -54,4 +103,27 @@ efx_mae_fini( enp->en_maep = NULL; } + __checkReturn efx_rc_t +efx_mae_get_limits( + __in efx_nic_t *enp, + __out efx_mae_limits_t *emlp) +{ + const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp); + struct efx_mae_s *maep = enp->en_maep; + efx_rc_t rc; + + if (encp->enc_mae_supported == B_FALSE) { + rc = ENOTSUP; + goto fail1; + } + + emlp->eml_max_n_action_prios = maep->em_max_n_action_prios; + + return (0); + +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + #endif /* EFSYS_OPT_MAE */ diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index c76dfe1e45..4b500b646a 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -86,6 +86,7 @@ INTERNAL { efx_mac_up; efx_mae_fini; + efx_mae_get_limits; efx_mae_init; efx_mcdi_fini; From patchwork Tue Oct 20 08:47:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81448 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 218F9A04DD; Tue, 20 Oct 2020 10:50:40 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 92B4DBBCC; Tue, 20 Oct 2020 10:49:12 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 9755AAD28 for ; Tue, 20 Oct 2020 10:48:58 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.62]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 25A636007A for ; Tue, 20 Oct 2020 08:48:57 +0000 (UTC) Received: from us4-mdac16-34.ut7.mdlocal (unknown [10.7.66.153]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 24ECB8009E for ; Tue, 20 Oct 2020 08:48:57 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 86CC8280050 for ; Tue, 20 Oct 2020 08:48:56 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 3DD88A80061 for ; Tue, 20 Oct 2020 08:48:56 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnEB030805; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 10B391616FF; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:34 +0100 Message-ID: <1603183709-23420-8-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.590700-8.000000-10 X-TMASE-MatchedRID: 9+vAdSePT9pcN4Yc45F7ZR5dqSUtZTxbvvkzqYJBDFaRoQLwUmtov4TZ RPOp2cAoFfpc/lC98DwWsp6eJb7A26H2g9syPs88nFVnNmvv47tLXPA26IG0hN9RlPzeVuQQJPU KiLeLtT/lbE1XrIJXPbQHaFNPaJ+oRRCzDlgXi1gaPMGCcVm9DoLsLasl5ROh9gQ08tNoyG8VLG IPVP4OQVSMP30ASix4Gh0ehw7l3kJdwbDa/5b0bWLiVenyedyja01mhnn7t6Tm5xVqTV9QwQQJG m5M0WiV4vM1YF6AJbbCCfuIMF6xLSdET58jp62SfdYTdp1V+i9UivibKL7SI2//TI5vKwiIrx33 PIFfjPlodGG5NBGWSEOrH4K/J8rNoyb+4oySoDv2ev7TpEjkITwyQw+LBwEfvU24pLfQFmdAgUh ku2yAbQNQf6dUs3KIKyog/1PG+0kxvqnnvSKWdw== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--0.590700-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183737-NGYkHVEiJBVz X-PPE-DISP: 1603183737;NGYkHVEiJBVz Subject: [dpdk-dev] [PATCH 07/62] net/sfc: add the concept of MAE (transfer) rules X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Define the corresponding specification structure and make the code identify MAE rules by testing transfer attribute presence. Also, add a priority level check. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 5 +++-- drivers/net/sfc/sfc_flow.c | 26 ++++++++++++++++++++------ drivers/net/sfc/sfc_flow.h | 9 +++++++++ drivers/net/sfc/sfc_mae.c | 11 +++++++++++ drivers/net/sfc/sfc_mae.h | 2 ++ 5 files changed, 45 insertions(+), 8 deletions(-) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index 959b52c1c3..7a5aff79f9 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -144,8 +144,9 @@ Flow API support Supported attributes: - Ingress +- Transfer -Supported pattern items: +Supported pattern items (***non-transfer*** rules): - VOID @@ -173,7 +174,7 @@ Supported pattern items: - NVGRE (exact match of virtual subnet ID) -Supported actions: +Supported actions (***non-transfer*** rules): - VOID diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c index cb802d7991..86082208d0 100644 --- a/drivers/net/sfc/sfc_flow.c +++ b/drivers/net/sfc/sfc_flow.c @@ -1124,12 +1124,15 @@ static const struct sfc_flow_item sfc_flow_items[] = { * Protocol-independent flow API support */ static int -sfc_flow_parse_attr(const struct rte_flow_attr *attr, +sfc_flow_parse_attr(struct sfc_adapter *sa, + const struct rte_flow_attr *attr, struct rte_flow *flow, struct rte_flow_error *error) { struct sfc_flow_spec *spec = &flow->spec; struct sfc_flow_spec_filter *spec_filter = &spec->filter; + struct sfc_flow_spec_mae *spec_mae = &spec->mae; + struct sfc_mae *mae = &sa->mae; if (attr == NULL) { rte_flow_error_set(error, EINVAL, @@ -1167,10 +1170,20 @@ sfc_flow_parse_attr(const struct rte_flow_attr *attr, spec_filter->template.efs_rss_context = EFX_RSS_CONTEXT_DEFAULT; spec_filter->template.efs_priority = EFX_FILTER_PRI_MANUAL; } else { - rte_flow_error_set(error, ENOTSUP, - RTE_FLOW_ERROR_TYPE_ATTR_TRANSFER, attr, - "Transfer is not supported"); - return -rte_errno; + if (mae->status != SFC_MAE_STATUS_SUPPORTED) { + rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ATTR_TRANSFER, + attr, "Transfer is not supported"); + return -rte_errno; + } + if (attr->priority > mae->nb_action_rule_prios_max) { + rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY, + attr, "Unsupported priority level"); + return -rte_errno; + } + spec->type = SFC_FLOW_SPEC_MAE; + spec_mae->priority = attr->priority; } return 0; @@ -2403,10 +2416,11 @@ sfc_flow_parse(struct rte_eth_dev *dev, struct rte_flow *flow, struct rte_flow_error *error) { + struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev); const struct sfc_flow_ops_by_spec *ops; int rc; - rc = sfc_flow_parse_attr(attr, flow, error); + rc = sfc_flow_parse_attr(sa, attr, flow, error); if (rc != 0) return rc; diff --git a/drivers/net/sfc/sfc_flow.h b/drivers/net/sfc/sfc_flow.h index 433c7a31e9..1fbcb878d1 100644 --- a/drivers/net/sfc/sfc_flow.h +++ b/drivers/net/sfc/sfc_flow.h @@ -38,6 +38,7 @@ struct sfc_flow_rss { /* Flow engines supported by the implementation */ enum sfc_flow_spec_type { SFC_FLOW_SPEC_FILTER = 0, + SFC_FLOW_SPEC_MAE, SFC_FLOW_SPEC_NTYPES }; @@ -58,6 +59,12 @@ struct sfc_flow_spec_filter { struct sfc_flow_rss rss_conf; }; +/* MAE-specific flow specification */ +struct sfc_flow_spec_mae { + /* Desired priority level */ + unsigned int priority; +}; + /* Flow specification */ struct sfc_flow_spec { /* Flow specification type (engine-based) */ @@ -67,6 +74,8 @@ struct sfc_flow_spec { union { /* Filter-based (VNIC level flows) specification */ struct sfc_flow_spec_filter filter; + /* MAE-based (lower-level HW switch flows) specification */ + struct sfc_flow_spec_mae mae; }; }; diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 2a7ed6377a..487bd61f76 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -21,6 +21,7 @@ sfc_mae_attach(struct sfc_adapter *sa) { const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic); struct sfc_mae *mae = &sa->mae; + efx_mae_limits_t limits; int rc; sfc_log_init(sa, "entry"); @@ -35,12 +36,21 @@ sfc_mae_attach(struct sfc_adapter *sa) if (rc != 0) goto fail_mae_init; + sfc_log_init(sa, "get MAE limits"); + rc = efx_mae_get_limits(sa->nic, &limits); + if (rc != 0) + goto fail_mae_get_limits; + mae->status = SFC_MAE_STATUS_SUPPORTED; + mae->nb_action_rule_prios_max = limits.eml_max_n_action_prios; sfc_log_init(sa, "done"); return 0; +fail_mae_get_limits: + efx_mae_fini(sa->nic); + fail_mae_init: sfc_log_init(sa, "failed %d", rc); @@ -55,6 +65,7 @@ sfc_mae_detach(struct sfc_adapter *sa) sfc_log_init(sa, "entry"); + mae->nb_action_rule_prios_max = 0; mae->status = SFC_MAE_STATUS_UNKNOWN; if (status_prev != SFC_MAE_STATUS_SUPPORTED) diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index d7821e71cc..dd9ca07d15 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -28,6 +28,8 @@ enum sfc_mae_status { struct sfc_mae { /** NIC support for MAE status */ enum sfc_mae_status status; + /** Priority level limit for MAE action rules */ + unsigned int nb_action_rule_prios_max; }; struct sfc_adapter; From patchwork Tue Oct 20 08:47:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81453 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id E0628A04DD; Tue, 20 Oct 2020 10:52:41 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 616E8BC08; Tue, 20 Oct 2020 10:49:20 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id BCADDAD3C for ; Tue, 20 Oct 2020 10:49:00 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.64]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 4D7C960055 for ; Tue, 20 Oct 2020 08:48:59 +0000 (UTC) Received: from us4-mdac16-6.ut7.mdlocal (unknown [10.7.65.74]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 4BA602009B for ; Tue, 20 Oct 2020 08:48:59 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id C6A5622004D for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 7D8E7800058 for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnWD030802; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 1DA98161711; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:35 +0100 Message-ID: <1603183709-23420-9-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.924100-8.000000-10 X-TMASE-MatchedRID: joDPjHIAhMJEJxhN6FUHdZCYtcHXhxbamdrHMkUHHq/6dwaYkcj1la+X 0GkMw17YkpsU2cOjMqFVwC6U6YW0/7a6/BliGsjAsFkCLeeufNvBknKaYrutknCR0itW3xfVXY5 FfQHz6pNPV+yNmYX6rOb1L/R4hBRv6jHbEaTIvGE/ApMPW/xhXquVOrDvB8LT27KSseGDg90nOW hZYy8qHbltJQY4FJPn6ahUvNzUOyf75cEN6/qvTNE+Q9UKuqQnfS0Ip2eEHnz3IzXlXlpamPoLR 4+zsDTts9zZIznkhZN/443wofcQYQOw9otiz8Zv5YKFwFZCQFQ5zzZy99DD9JsAYX4P7xdXnTix +p0hrY28vlyc3kHB2ZqEEgaXNh1SO9tPIm6/FPXaQLtLC8aUqEPBvsmCWGHWUWQ7Bol0IqC+I8S pxyUS3FXK9tOD+u6c X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-1.924100-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183739-s_244kqazvbM X-PPE-DISP: 1603183739;s_244kqazvbM Subject: [dpdk-dev] [PATCH 08/62] common/sfc_efx/base: add match spec init/fini APIs X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov An MAE rule is a function of match criteria and a priority. The said match criteria have to be provided using "mask-value pairs" packing format which on its own should not be exposed to client drivers. The latter have to use a functional interface of sorts in order to generate a match specification. Define an EFX match specification and implement initialise / finalise APIs. The "mask-value pairs" buffer itself is not used in this particular patch, so the corresponding struct member will be added in the follow-up patch. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 22 +++++++++ drivers/common/sfc_efx/base/efx_impl.h | 9 ++++ drivers/common/sfc_efx/base/efx_mae.c | 46 +++++++++++++++++++ .../sfc_efx/rte_common_sfc_efx_version.map | 2 + 4 files changed, 79 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index db66be0faf..40c5968ea9 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4058,6 +4058,28 @@ efx_mae_get_limits( __in efx_nic_t *enp, __out efx_mae_limits_t *emlp); +typedef enum efx_mae_rule_type_e { + EFX_MAE_RULE_ACTION = 0, + + EFX_MAE_RULE_NTYPES +} efx_mae_rule_type_t; + +typedef struct efx_mae_match_spec_s efx_mae_match_spec_t; + +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_match_spec_init( + __in efx_nic_t *enp, + __in efx_mae_rule_type_t type, + __in uint32_t prio, + __out efx_mae_match_spec_t **specp); + +LIBEFX_API +extern void +efx_mae_match_spec_fini( + __in efx_nic_t *enp, + __in efx_mae_match_spec_t *spec); + #endif /* EFSYS_OPT_MAE */ #ifdef __cplusplus diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h index 6e9329c203..931989f17a 100644 --- a/drivers/common/sfc_efx/base/efx_impl.h +++ b/drivers/common/sfc_efx/base/efx_impl.h @@ -1675,6 +1675,15 @@ efx_pci_xilinx_cap_tbl_find( #endif /* EFSYS_OPT_PCI */ +#if EFSYS_OPT_MAE + +struct efx_mae_match_spec_s { + efx_mae_rule_type_t emms_type; + uint32_t emms_prio; +}; + +#endif /* EFSYS_OPT_MAE */ + #ifdef __cplusplus } #endif diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index c93342de15..b1ebc93714 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -126,4 +126,50 @@ efx_mae_get_limits( return (rc); } + __checkReturn efx_rc_t +efx_mae_match_spec_init( + __in efx_nic_t *enp, + __in efx_mae_rule_type_t type, + __in uint32_t prio, + __out efx_mae_match_spec_t **specp) +{ + efx_mae_match_spec_t *spec; + efx_rc_t rc; + + switch (type) { + case EFX_MAE_RULE_ACTION: + break; + default: + rc = ENOTSUP; + goto fail1; + } + + EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (*spec), spec); + if (spec == NULL) { + rc = ENOMEM; + goto fail2; + } + + spec->emms_type = type; + spec->emms_prio = prio; + + *specp = spec; + + return (0); + +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + + void +efx_mae_match_spec_fini( + __in efx_nic_t *enp, + __in efx_mae_match_spec_t *spec) +{ + EFSYS_KMEM_FREE(enp->en_esip, sizeof (*spec), spec); +} + #endif /* EFSYS_OPT_MAE */ diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index 4b500b646a..57a6c96b3e 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -88,6 +88,8 @@ INTERNAL { efx_mae_fini; efx_mae_get_limits; efx_mae_init; + efx_mae_match_spec_fini; + efx_mae_match_spec_init; efx_mcdi_fini; efx_mcdi_get_proxy_handle; From patchwork Tue Oct 20 08:47:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81456 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 91B06A04DD; Tue, 20 Oct 2020 10:53:42 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D1AA9BC56; Tue, 20 Oct 2020 10:49:24 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 6173CAD3C for ; Tue, 20 Oct 2020 10:49:00 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id E212160062 for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) Received: from us4-mdac16-71.ut7.mdlocal (unknown [10.7.64.190]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id E14E48009E for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 67FEC80051 for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id F2F21800058 for ; Tue, 20 Oct 2020 08:48:57 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mn1M030804; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 2B06D16172C; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:36 +0100 Message-ID: <1603183709-23420-10-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.160300-8.000000-10 X-TMASE-MatchedRID: EKKc/431jqX8lEotUf/ZlDIHIyLCTr7ep5HLLTy++LOk+oW3oLzmHu/y RkWfD4An9cMrDdv2FUoWsp6eJb7A26H2g9syPs88nFVnNmvv47uWODD/yzpvdwdkFovAReUoilv Ab18i4hPZ0cSyucj+2hQfw+ZajaGFFUPnz5fE4uMPe5gzF3TVtwKflB9+9kWVvGAx/1ATZ5vNap M94+SzbOr9+n4qMZcckII+BsKkYBAdAyevMk7vZ0aMPBFKXyAUfLNHMurfykjm5xVqTV9Qwbqjm k4TdfSm2E6HipP5OtKAMuqetGVetnyef22ep6XYro1URZJFbJsuqecCzEZT/uxThEaCtKZVrlsm 5NZNfH70M+u7zdPp/2BqX3RCS4zgNVK/iHXnGXJjRJA9Ku756PhFUezPWSS7xlklxORbxgTw7Jx wU0EvZMqEROLb/+yO4/0Jvn0rwAJmtL4Dw+zNb0D/MIf9Orkd X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-1.160300-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183738-wJCpKSbwNv5L X-PPE-DISP: 1603183738;wJCpKSbwNv5L Subject: [dpdk-dev] [PATCH 09/62] net/sfc: add pattern parsing stub to MAE backend X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add pattern parsing stub, define and implement flow cleanup method. The latter is needed to free any dynamic structures allocated during flow parsing. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/net/sfc/sfc_flow.c | 41 +++++++++++++++++++++++- drivers/net/sfc/sfc_flow.h | 8 +++++ drivers/net/sfc/sfc_mae.c | 65 ++++++++++++++++++++++++++++++++++++++ drivers/net/sfc/sfc_mae.h | 10 ++++++ 4 files changed, 123 insertions(+), 1 deletion(-) diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c index 86082208d0..634818cdf2 100644 --- a/drivers/net/sfc/sfc_flow.c +++ b/drivers/net/sfc/sfc_flow.c @@ -27,20 +27,30 @@ struct sfc_flow_ops_by_spec { sfc_flow_parse_cb_t *parse; + sfc_flow_cleanup_cb_t *cleanup; sfc_flow_insert_cb_t *insert; sfc_flow_remove_cb_t *remove; }; static sfc_flow_parse_cb_t sfc_flow_parse_rte_to_filter; +static sfc_flow_parse_cb_t sfc_flow_parse_rte_to_mae; static sfc_flow_insert_cb_t sfc_flow_filter_insert; static sfc_flow_remove_cb_t sfc_flow_filter_remove; static const struct sfc_flow_ops_by_spec sfc_flow_ops_filter = { .parse = sfc_flow_parse_rte_to_filter, + .cleanup = NULL, .insert = sfc_flow_filter_insert, .remove = sfc_flow_filter_remove, }; +static const struct sfc_flow_ops_by_spec sfc_flow_ops_mae = { + .parse = sfc_flow_parse_rte_to_mae, + .cleanup = sfc_mae_flow_cleanup, + .insert = NULL, + .remove = NULL, +}; + static const struct sfc_flow_ops_by_spec * sfc_flow_get_ops_by_spec(struct rte_flow *flow) { @@ -51,6 +61,9 @@ sfc_flow_get_ops_by_spec(struct rte_flow *flow) case SFC_FLOW_SPEC_FILTER: ops = &sfc_flow_ops_filter; break; + case SFC_FLOW_SPEC_MAE: + ops = &sfc_flow_ops_mae; + break; default: SFC_ASSERT(false); break; @@ -1184,6 +1197,7 @@ sfc_flow_parse_attr(struct sfc_adapter *sa, } spec->type = SFC_FLOW_SPEC_MAE; spec_mae->priority = attr->priority; + spec_mae->match_spec = NULL; } return 0; @@ -2408,6 +2422,25 @@ sfc_flow_parse_rte_to_filter(struct rte_eth_dev *dev, return rc; } +static int +sfc_flow_parse_rte_to_mae(struct rte_eth_dev *dev, + const struct rte_flow_item pattern[], + __rte_unused const struct rte_flow_action actions[], + struct rte_flow *flow, + struct rte_flow_error *error) +{ + struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev); + struct sfc_flow_spec *spec = &flow->spec; + struct sfc_flow_spec_mae *spec_mae = &spec->mae; + int rc; + + rc = sfc_mae_rule_parse_pattern(sa, pattern, spec_mae, error); + if (rc != 0) + return rc; + + return 0; +} + static int sfc_flow_parse(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, @@ -2451,8 +2484,14 @@ sfc_flow_zmalloc(struct rte_flow_error *error) } static void -sfc_flow_free(__rte_unused struct sfc_adapter *sa, struct rte_flow *flow) +sfc_flow_free(struct sfc_adapter *sa, struct rte_flow *flow) { + const struct sfc_flow_ops_by_spec *ops; + + ops = sfc_flow_get_ops_by_spec(flow); + if (ops != NULL && ops->cleanup != NULL) + ops->cleanup(sa, flow); + rte_free(flow); } diff --git a/drivers/net/sfc/sfc_flow.h b/drivers/net/sfc/sfc_flow.h index 1fbcb878d1..03a68d8633 100644 --- a/drivers/net/sfc/sfc_flow.h +++ b/drivers/net/sfc/sfc_flow.h @@ -63,6 +63,8 @@ struct sfc_flow_spec_filter { struct sfc_flow_spec_mae { /* Desired priority level */ unsigned int priority; + /* EFX match specification */ + efx_mae_match_spec_t *match_spec; }; /* Flow specification */ @@ -100,6 +102,7 @@ enum sfc_flow_item_layers { /* Flow parse context types */ enum sfc_flow_parse_ctx_type { SFC_FLOW_PARSE_CTX_FILTER = 0, + SFC_FLOW_PARSE_CTX_MAE, SFC_FLOW_PARSE_CTX_NTYPES }; @@ -112,6 +115,8 @@ struct sfc_flow_parse_ctx { union { /* Context pointer valid for filter-based (VNIC) flows */ efx_filter_spec_t *filter; + /* Context pointer valid for MAE-based flows */ + struct sfc_mae_parse_ctx *mae; }; }; @@ -154,6 +159,9 @@ typedef int (sfc_flow_parse_cb_t)(struct rte_eth_dev *dev, struct rte_flow *flow, struct rte_flow_error *error); +typedef void (sfc_flow_cleanup_cb_t)(struct sfc_adapter *sa, + struct rte_flow *flow); + typedef int (sfc_flow_insert_cb_t)(struct sfc_adapter *sa, struct rte_flow *flow); diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 487bd61f76..53e141775a 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -75,3 +75,68 @@ sfc_mae_detach(struct sfc_adapter *sa) sfc_log_init(sa, "done"); } + +void +sfc_mae_flow_cleanup(struct sfc_adapter *sa, + struct rte_flow *flow) +{ + struct sfc_flow_spec *spec; + struct sfc_flow_spec_mae *spec_mae; + + if (flow == NULL) + return; + + spec = &flow->spec; + + if (spec == NULL) + return; + + spec_mae = &spec->mae; + + if (spec_mae->match_spec != NULL) + efx_mae_match_spec_fini(sa->nic, spec_mae->match_spec); +} + +static const struct sfc_flow_item sfc_flow_items[] = { +}; + +int +sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, + const struct rte_flow_item pattern[], + struct sfc_flow_spec_mae *spec, + struct rte_flow_error *error) +{ + struct sfc_mae_parse_ctx ctx_mae; + struct sfc_flow_parse_ctx ctx; + int rc; + + memset(&ctx_mae, 0, sizeof(ctx_mae)); + + rc = efx_mae_match_spec_init(sa->nic, EFX_MAE_RULE_ACTION, + spec->priority, + &ctx_mae.match_spec_action); + if (rc != 0) { + rc = rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, + "Failed to initialise action rule match specification"); + goto fail_init_match_spec_action; + } + + ctx.type = SFC_FLOW_PARSE_CTX_MAE; + ctx.mae = &ctx_mae; + + rc = sfc_flow_parse_pattern(sfc_flow_items, RTE_DIM(sfc_flow_items), + pattern, &ctx, error); + if (rc != 0) + goto fail_parse_pattern; + + spec->match_spec = ctx_mae.match_spec_action; + + return 0; + +fail_parse_pattern: + efx_mae_match_spec_fini(sa->nic, ctx_mae.match_spec_action); + +fail_init_match_spec_action: + return rc; +} diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index dd9ca07d15..536dadd092 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -33,9 +33,19 @@ struct sfc_mae { }; struct sfc_adapter; +struct sfc_flow_spec; + +struct sfc_mae_parse_ctx { + efx_mae_match_spec_t *match_spec_action; +}; int sfc_mae_attach(struct sfc_adapter *sa); void sfc_mae_detach(struct sfc_adapter *sa); +sfc_flow_cleanup_cb_t sfc_mae_flow_cleanup; +int sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, + const struct rte_flow_item pattern[], + struct sfc_flow_spec_mae *spec, + struct rte_flow_error *error); #ifdef __cplusplus } From patchwork Tue Oct 20 08:47:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81450 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id F21C5A04DD; Tue, 20 Oct 2020 10:51:26 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 85361BBE2; Tue, 20 Oct 2020 10:49:15 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 00189AD31 for ; Tue, 20 Oct 2020 10:48:58 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.62]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 83BB160052 for ; Tue, 20 Oct 2020 08:48:57 +0000 (UTC) Received: from us4-mdac16-33.ut7.mdlocal (unknown [10.7.66.150]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 82FEE8009B for ; Tue, 20 Oct 2020 08:48:57 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id E6807280053 for ; Tue, 20 Oct 2020 08:48:56 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 9CE23A80061 for ; Tue, 20 Oct 2020 08:48:56 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnvQ030801; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 38749161748; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:37 +0100 Message-ID: <1603183709-23420-11-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-2.366400-8.000000-10 X-TMASE-MatchedRID: XrR3/qg0KnOB3AuymGAHRA9rVnOZ7Na2NV9S7O+u3KbEn6NODkzh6NAO OSAF0cTNJ4gUb5AkMXB1ssuldf62Xquhcc3IU+0WamOGWbsSIFcpWss5kPUFdHy/Hx1AgJrrwLd Z11vLmrV2u73/E7CHL0DTw9uN2GLZHVikQ9YmLLOInASnzB5VfFJAsn89ih94Bph69XjMbdn47X v617HbR53qDY7kD1WqNnxQQrlyFHBOJe7Iq9AgQv9XRIMLUOjQIPwiH5Xl/Q+o8aocg8ZmI124Y vC9/lw+C7dFQIvqCd+KGUoOUuWu8vmDLiOWM9q5CWlWR223da7YuVu0X/rOkHYJ8h0rMOWe9OlN 7uqXW49Pncvnf9/rJzvY+SL/TlWxsiLUMHgAKawmtTGirqG/D+BefETzWLKxOzrXChUtBARud6F XK/oTcEfivM8BUT0xvWvtbBh8hO2A1Eegw1mh2KchFrOB9kanIrMoP5XxqGeMLFaovouN0KPFjJ EFr+olwXCBO/GKkVqOhzOa6g8KrfkNIaNO51G9GH32/XuhRhcb0nM6g5itkCI2AAI3wPFC99qtH hwrlAsGv+LD0Oo6YOHYFq8ng2NUBDd0++DcHl795q0pW49U04XXmHr+iJs1sqxYnjga4QY83Fq7 f38GK0XAdmaT51YybiPTBhvbLhaUTGVAhB5EbQ== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--2.366400-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183737-SfDMk1S5ZfSg X-PPE-DISP: 1603183737;SfDMk1S5ZfSg Subject: [dpdk-dev] [PATCH 10/62] common/sfc_efx/base: add a match spec validate API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov MAE has restrictions on what kind of mask a particular field can have in a match specification. Add an API for client drivers to check specifications. The patch defines a field description list, whilst the list itself is left empty. This is to provide a general idea of how field properties will be used to validate a match specification. Particular fields will be added to the list by follow-up patches. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 18 ++ drivers/common/sfc_efx/base/efx_impl.h | 17 ++ drivers/common/sfc_efx/base/efx_mae.c | 262 ++++++++++++++++++ drivers/common/sfc_efx/base/efx_mcdi.h | 4 + .../sfc_efx/rte_common_sfc_efx_version.map | 1 + 5 files changed, 302 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 40c5968ea9..094fad6367 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4080,6 +4080,24 @@ efx_mae_match_spec_fini( __in efx_nic_t *enp, __in efx_mae_match_spec_t *spec); +typedef enum efx_mae_field_id_e { + EFX_MAE_FIELD_NIDS +} efx_mae_field_id_t; + +/* + * Make sure that match fields known by EFX have proper masks set + * in the match specification as per requirements of SF-122526-TC. + * + * In the case efx_mae_field_id_t lacks named identifiers for any + * fields which the FW maintains with support status MATCH_ALWAYS, + * the validation result may not be accurate. + */ +LIBEFX_API +extern __checkReturn boolean_t +efx_mae_match_spec_is_valid( + __in efx_nic_t *enp, + __in const efx_mae_match_spec_t *spec); + #endif /* EFSYS_OPT_MAE */ #ifdef __cplusplus diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h index 931989f17a..2b872bb62e 100644 --- a/drivers/common/sfc_efx/base/efx_impl.h +++ b/drivers/common/sfc_efx/base/efx_impl.h @@ -782,8 +782,22 @@ typedef struct efx_proxy_ops_s { #if EFSYS_OPT_MAE +typedef struct efx_mae_field_cap_s { + uint32_t emfc_support; + boolean_t emfc_mask_affects_class; + boolean_t emfc_match_affects_class; +} efx_mae_field_cap_t; + typedef struct efx_mae_s { uint32_t em_max_n_action_prios; + /* + * The number of MAE field IDs recognised by the FW implementation. + * Any field ID greater than or equal to this value is unsupported. + */ + uint32_t em_max_nfields; + /** Action rule match field capabilities. */ + efx_mae_field_cap_t *em_action_rule_field_caps; + size_t em_action_rule_field_caps_size; } efx_mae_t; #endif /* EFSYS_OPT_MAE */ @@ -1680,6 +1694,9 @@ efx_pci_xilinx_cap_tbl_find( struct efx_mae_match_spec_s { efx_mae_rule_type_t emms_type; uint32_t emms_prio; + union emms_mask_value_pairs { + uint8_t action[MAE_FIELD_MASK_VALUE_PAIRS_LEN]; + } emms_mask_value_pairs; }; #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 b1ebc93714..9e22c3d507 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -42,8 +42,93 @@ efx_mae_get_capabilities( maep->em_max_n_action_prios = MCDI_OUT_DWORD(req, MAE_GET_CAPS_OUT_ACTION_PRIOS); + maep->em_max_nfields = + MCDI_OUT_DWORD(req, MAE_GET_CAPS_OUT_MATCH_FIELD_COUNT); + + return (0); + +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + +static __checkReturn efx_rc_t +efx_mae_get_action_rule_caps( + __in efx_nic_t *enp, + __in unsigned int field_ncaps, + __out_ecount(field_ncaps) efx_mae_field_cap_t *field_caps) +{ + efx_mcdi_req_t req; + EFX_MCDI_DECLARE_BUF(payload, + MC_CMD_MAE_GET_AR_CAPS_IN_LEN, + MC_CMD_MAE_GET_AR_CAPS_OUT_LENMAX_MCDI2); + unsigned int mcdi_field_ncaps; + unsigned int i; + efx_rc_t rc; + + if (MC_CMD_MAE_GET_AR_CAPS_OUT_LEN(field_ncaps) > + MC_CMD_MAE_GET_AR_CAPS_OUT_LENMAX_MCDI2) { + rc = EINVAL; + goto fail1; + } + + req.emr_cmd = MC_CMD_MAE_GET_AR_CAPS; + req.emr_in_buf = payload; + req.emr_in_length = MC_CMD_MAE_GET_AR_CAPS_IN_LEN; + req.emr_out_buf = payload; + req.emr_out_length = MC_CMD_MAE_GET_AR_CAPS_OUT_LEN(field_ncaps); + + efx_mcdi_execute(enp, &req); + + if (req.emr_rc != 0) { + rc = req.emr_rc; + goto fail2; + } + + mcdi_field_ncaps = MCDI_OUT_DWORD(req, MAE_GET_OR_CAPS_OUT_COUNT); + + if (req.emr_out_length_used < + MC_CMD_MAE_GET_AR_CAPS_OUT_LEN(mcdi_field_ncaps)) { + rc = EMSGSIZE; + goto fail3; + } + + if (mcdi_field_ncaps > field_ncaps) { + rc = EMSGSIZE; + goto fail4; + } + + for (i = 0; i < mcdi_field_ncaps; ++i) { + uint32_t match_flag; + uint32_t mask_flag; + + field_caps[i].emfc_support = MCDI_OUT_INDEXED_DWORD_FIELD(req, + MAE_GET_AR_CAPS_OUT_FIELD_FLAGS, i, + MAE_FIELD_FLAGS_SUPPORT_STATUS); + + match_flag = MCDI_OUT_INDEXED_DWORD_FIELD(req, + MAE_GET_AR_CAPS_OUT_FIELD_FLAGS, i, + MAE_FIELD_FLAGS_MATCH_AFFECTS_CLASS); + + field_caps[i].emfc_match_affects_class = + (match_flag != 0) ? B_TRUE : B_FALSE; + + mask_flag = MCDI_OUT_INDEXED_DWORD_FIELD(req, + MAE_GET_AR_CAPS_OUT_FIELD_FLAGS, i, + MAE_FIELD_FLAGS_MASK_AFFECTS_CLASS); + + field_caps[i].emfc_mask_affects_class = + (mask_flag != 0) ? B_TRUE : B_FALSE; + } + return (0); +fail4: + EFSYS_PROBE(fail4); +fail3: + EFSYS_PROBE(fail3); fail2: EFSYS_PROBE(fail2); fail1: @@ -56,6 +141,8 @@ efx_mae_init( __in efx_nic_t *enp) { const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp); + efx_mae_field_cap_t *ar_fcaps; + size_t ar_fcaps_size; efx_mae_t *maep; efx_rc_t rc; @@ -76,8 +163,27 @@ efx_mae_init( if (rc != 0) goto fail3; + ar_fcaps_size = maep->em_max_nfields * sizeof (*ar_fcaps); + EFSYS_KMEM_ALLOC(enp->en_esip, ar_fcaps_size, ar_fcaps); + if (ar_fcaps == NULL) { + rc = ENOMEM; + goto fail4; + } + + maep->em_action_rule_field_caps_size = ar_fcaps_size; + maep->em_action_rule_field_caps = ar_fcaps; + + rc = efx_mae_get_action_rule_caps(enp, maep->em_max_nfields, ar_fcaps); + if (rc != 0) + goto fail5; + return (0); +fail5: + EFSYS_PROBE(fail5); + EFSYS_KMEM_FREE(enp->en_esip, ar_fcaps_size, ar_fcaps); +fail4: + EFSYS_PROBE(fail4); fail3: EFSYS_PROBE(fail3); EFSYS_KMEM_FREE(enp->en_esip, sizeof (struct efx_mae_s), enp->en_maep); @@ -99,6 +205,8 @@ efx_mae_fini( if (encp->enc_mae_supported == B_FALSE) return; + EFSYS_KMEM_FREE(enp->en_esip, maep->em_action_rule_field_caps_size, + maep->em_action_rule_field_caps); EFSYS_KMEM_FREE(enp->en_esip, sizeof (*maep), maep); enp->en_maep = NULL; } @@ -172,4 +280,158 @@ efx_mae_match_spec_fini( EFSYS_KMEM_FREE(enp->en_esip, sizeof (*spec), spec); } +/* Named identifiers which are valid indices to efx_mae_field_cap_t */ +typedef enum efx_mae_field_cap_id_e { + EFX_MAE_FIELD_CAP_NIDS +} efx_mae_field_cap_id_t; + +typedef enum efx_mae_field_endianness_e { + EFX_MAE_FIELD_LE = 0, + EFX_MAE_FIELD_BE, + + EFX_MAE_FIELD_ENDIANNESS_NTYPES +} efx_mae_field_endianness_t; + +/* + * The following structure is a means to describe an MAE field. + * The information in it is meant to be used internally by + * APIs for addressing a given field in a mask-value pairs + * structure and for validation purposes. + */ +typedef struct efx_mae_mv_desc_s { + efx_mae_field_cap_id_t emmd_field_cap_id; + + size_t emmd_value_size; + size_t emmd_value_offset; + size_t emmd_mask_size; + size_t emmd_mask_offset; + + efx_mae_field_endianness_t emmd_endianness; +} efx_mae_mv_desc_t; + +/* Indices to this array are provided by efx_mae_field_id_t */ +static const efx_mae_mv_desc_t __efx_mae_action_rule_mv_desc_set[] = { +}; + +#define EFX_MASK_BIT_IS_SET(_mask, _mask_page_nbits, _bit) \ + ((_mask)[(_bit) / (_mask_page_nbits)] & \ + (1ULL << ((_bit) & ((_mask_page_nbits) - 1)))) + +static inline boolean_t +efx_mask_is_prefix( + __in size_t mask_nbytes, + __in_bcount(mask_nbytes) const uint8_t *maskp) +{ + boolean_t prev_bit_is_set = B_TRUE; + unsigned int i; + + for (i = 0; i < 8 * mask_nbytes; ++i) { + boolean_t bit_is_set = EFX_MASK_BIT_IS_SET(maskp, 8, i); + + if (!prev_bit_is_set && bit_is_set) + return B_FALSE; + + prev_bit_is_set = bit_is_set; + } + + return B_TRUE; +} + +static inline boolean_t +efx_mask_is_all_ones( + __in size_t mask_nbytes, + __in_bcount(mask_nbytes) const uint8_t *maskp) +{ + unsigned int i; + uint8_t t = ~0; + + for (i = 0; i < mask_nbytes; ++i) + t &= maskp[i]; + + return (t == (uint8_t)(~0)); +} + +static inline boolean_t +efx_mask_is_all_zeros( + __in size_t mask_nbytes, + __in_bcount(mask_nbytes) const uint8_t *maskp) +{ + unsigned int i; + uint8_t t = 0; + + for (i = 0; i < mask_nbytes; ++i) + t |= maskp[i]; + + return (t == 0); +} + + __checkReturn boolean_t +efx_mae_match_spec_is_valid( + __in efx_nic_t *enp, + __in const efx_mae_match_spec_t *spec) +{ + efx_mae_t *maep = enp->en_maep; + unsigned int field_ncaps = maep->em_max_nfields; + const efx_mae_field_cap_t *field_caps; + const efx_mae_mv_desc_t *desc_setp; + unsigned int desc_set_nentries; + boolean_t is_valid = B_TRUE; + efx_mae_field_id_t field_id; + const uint8_t *mvp; + + switch (spec->emms_type) { + case EFX_MAE_RULE_ACTION: + field_caps = maep->em_action_rule_field_caps; + desc_setp = __efx_mae_action_rule_mv_desc_set; + desc_set_nentries = + EFX_ARRAY_SIZE(__efx_mae_action_rule_mv_desc_set); + mvp = spec->emms_mask_value_pairs.action; + break; + default: + return (B_FALSE); + } + + if (field_caps == NULL) + return (B_FALSE); + + for (field_id = 0; field_id < desc_set_nentries; ++field_id) { + const efx_mae_mv_desc_t *descp = &desc_setp[field_id]; + efx_mae_field_cap_id_t field_cap_id = descp->emmd_field_cap_id; + const uint8_t *m_buf = mvp + descp->emmd_mask_offset; + size_t m_size = descp->emmd_mask_size; + + if (m_size == 0) + continue; /* Skip array gap */ + + if (field_cap_id >= field_ncaps) + break; + + switch (field_caps[field_cap_id].emfc_support) { + case MAE_FIELD_SUPPORTED_MATCH_MASK: + is_valid = B_TRUE; + break; + case MAE_FIELD_SUPPORTED_MATCH_PREFIX: + is_valid = efx_mask_is_prefix(m_size, m_buf); + break; + case MAE_FIELD_SUPPORTED_MATCH_OPTIONAL: + is_valid = (efx_mask_is_all_ones(m_size, m_buf) || + efx_mask_is_all_zeros(m_size, m_buf)); + break; + case MAE_FIELD_SUPPORTED_MATCH_ALWAYS: + is_valid = efx_mask_is_all_ones(m_size, m_buf); + break; + case MAE_FIELD_SUPPORTED_MATCH_NEVER: + case MAE_FIELD_UNSUPPORTED: + default: + is_valid = efx_mask_is_all_zeros(m_size, m_buf); + break; + } + + if (is_valid == B_FALSE) + break; + } + + return (is_valid); +} + #endif /* EFSYS_OPT_MAE */ diff --git a/drivers/common/sfc_efx/base/efx_mcdi.h b/drivers/common/sfc_efx/base/efx_mcdi.h index 77a3d636e2..9dd0a23862 100644 --- a/drivers/common/sfc_efx/base/efx_mcdi.h +++ b/drivers/common/sfc_efx/base/efx_mcdi.h @@ -421,6 +421,10 @@ efx_mcdi_phy_module_get_info( EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst), \ MC_CMD_ ## _field) +#define MCDI_OUT_INDEXED_DWORD_FIELD(_emr, _ofst, _idx, _field) \ + EFX_DWORD_FIELD(*(MCDI_OUT2(_emr, efx_dword_t, _ofst) + \ + (_idx)), _field) + #define MCDI_EV_FIELD(_eqp, _field) \ EFX_QWORD_FIELD(*_eqp, MCDI_EVENT_ ## _field) diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index 57a6c96b3e..0e6d44b6dc 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -90,6 +90,7 @@ INTERNAL { efx_mae_init; efx_mae_match_spec_fini; efx_mae_match_spec_init; + efx_mae_match_spec_is_valid; efx_mcdi_fini; efx_mcdi_get_proxy_handle; From patchwork Tue Oct 20 08:47:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81461 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id AB0D4A04DD; Tue, 20 Oct 2020 10:55:35 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 7D91BBCC6; Tue, 20 Oct 2020 10:49:32 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id D6258BADE for ; Tue, 20 Oct 2020 10:49:00 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 511896005F for ; Tue, 20 Oct 2020 08:48:59 +0000 (UTC) Received: from us4-mdac16-62.ut7.mdlocal (unknown [10.7.66.61]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 4D5F72009A for ; Tue, 20 Oct 2020 08:48:59 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id DD37B1C0051 for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 92F19A80061 for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnHp030800; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 45E4E16176C; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:38 +0100 Message-ID: <1603183709-23420-12-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.536400-8.000000-10 X-TMASE-MatchedRID: +AidzxpkJ3+sue+K4hesazIHIyLCTr7eaeMaKzvXUpljLp8Cm8vwFz6P hj6DfZCErdoLblq9S5o1LfSblo+MR6o9NRZVgWnangIgpj8eDcAZ1CdBJOsoY8RB0bsfrpPIcSq bxBgG0w76A+QMx7z2iD8dEiaE4JHrWJ6i68YdyAjyr+sULATnp3PO5AYP0oMY44ZxNlShMPEdJ/ 08jJP7VaAUDI3aKfuRQjcC+ZMyFdOTdSRXlCnjBIjjlF305EnAWUm8SESyzd/NBqGt1DPvvA== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--0.536400-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183739-S5SMsscN1fC2 X-PPE-DISP: 1603183739;S5SMsscN1fC2 Subject: [dpdk-dev] [PATCH 11/62] net/sfc: validate match spec in MAE backend X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Validate the match specification resulting from pattern parsing within MAE backend in RTE flow implementation. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/net/sfc/sfc_mae.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 53e141775a..7e4397762b 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -130,10 +130,18 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, if (rc != 0) goto fail_parse_pattern; + if (!efx_mae_match_spec_is_valid(sa->nic, ctx_mae.match_spec_action)) { + rc = rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ITEM, NULL, + "Inconsistent pattern"); + goto fail_validate_match_spec_action; + } + spec->match_spec = ctx_mae.match_spec_action; return 0; +fail_validate_match_spec_action: fail_parse_pattern: efx_mae_match_spec_fini(sa->nic, ctx_mae.match_spec_action); From patchwork Tue Oct 20 08:47:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81463 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id A82DDA04DD; Tue, 20 Oct 2020 10:56:21 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2EFA3BCE0; Tue, 20 Oct 2020 10:49:35 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 4B012BBA2 for ; Tue, 20 Oct 2020 10:49:01 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.64]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id BBFAA60081 for ; Tue, 20 Oct 2020 08:48:59 +0000 (UTC) Received: from us4-mdac16-10.ut7.mdlocal (unknown [10.7.65.180]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id BB8CC2009B for ; Tue, 20 Oct 2020 08:48:59 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 47AEE220052 for ; Tue, 20 Oct 2020 08:48:59 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id F2F19A80061 for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnWF030802; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 52823161789; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:39 +0100 Message-ID: <1603183709-23420-13-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-2.975200-8.000000-10 X-TMASE-MatchedRID: fPU3ZRMebCv5s5ZGHFKFGDQ60lWQoG0rKVrLOZD1BXQOkJQR4QWbsLBZ szSz1qeiqucwHXTsrX/cJxdWvjKQ3yiq3P159fwpqg0gbtLVIa96i696PjRPiNWO4MK8ycTFH8M UR/9vnkerO5PmBFOASkDTw9uN2GLZHVikQ9YmLLOInASnzB5VfFJAsn89ih94Bph69XjMbdlSkV 47LHGpi2b7tdoOCN42itqmw2mRWTOiwCaYPn5sJltTO+xodboGAp+UH372RZVHZg0gWH5yUdNVR hry6jgeuW0lBjgUk+dW1Uyf/vuKAOcYCqaThQZTt0cS/uxH87CWGk93C/VnSuy9vsxhLmzehnOL yflyxrMf9OAqZEL+UoAy6p60ZV62fJ5/bZ6npdiujVRFkkVsm5pFQJ/p5Nu32//BiXwu3rJ2HkB h36F2JFsU/6sZL7aV6S6RqbiHkfMf1hYTrHRVsdQGB+u1ogfeLXpd6HTgbX6DlWNaESsm5/DsnH BTQS9kyoRE4tv/7I7j/Qm+fSvAAma0vgPD7M1vmFd/HOChTo8= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--2.975200-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183739-ELDCZJ3UCZLe X-PPE-DISP: 1603183739;ELDCZJ3UCZLe Subject: [dpdk-dev] [PATCH 12/62] common/sfc_efx/base: add a match specs class comparison API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov From MAE standpoint, a flow rule belongs to some class. Field capabilities advertised by the FW provide a hint on whether changing a particular match field value or its mask will affect the class of the rule. A client driver can make use of the concept of a class by comparing a rule being validated with already inserted ones so that if an existing rule with the same class is encountered, it will become possible to skip making an explicit request to the FW because the class of an already inserted rule is wittingly valid. Implement an API for client drivers to carry out the said class comparison. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 13 +++ drivers/common/sfc_efx/base/efx_mae.c | 96 +++++++++++++++++++ .../sfc_efx/rte_common_sfc_efx_version.map | 1 + 3 files changed, 110 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 094fad6367..c91f7948a0 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4098,6 +4098,19 @@ efx_mae_match_spec_is_valid( __in efx_nic_t *enp, __in const efx_mae_match_spec_t *spec); +/* + * Conduct a comparison to check whether two match specifications + * of equal rule type (action / outer) and priority would map to + * the very same rule class from the firmware's standpoint. + */ +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_match_specs_class_cmp( + __in efx_nic_t *enp, + __in const efx_mae_match_spec_t *left, + __in const efx_mae_match_spec_t *right, + __out boolean_t *have_same_classp); + #endif /* EFSYS_OPT_MAE */ #ifdef __cplusplus diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index 9e22c3d507..a126cba37f 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -434,4 +434,100 @@ efx_mae_match_spec_is_valid( return (is_valid); } + __checkReturn efx_rc_t +efx_mae_match_specs_class_cmp( + __in efx_nic_t *enp, + __in const efx_mae_match_spec_t *left, + __in const efx_mae_match_spec_t *right, + __out boolean_t *have_same_classp) +{ + efx_mae_t *maep = enp->en_maep; + unsigned int field_ncaps = maep->em_max_nfields; + const efx_mae_field_cap_t *field_caps; + const efx_mae_mv_desc_t *desc_setp; + unsigned int desc_set_nentries; + boolean_t have_same_class = B_TRUE; + efx_mae_field_id_t field_id; + const uint8_t *mvpl; + const uint8_t *mvpr; + efx_rc_t rc; + + switch (left->emms_type) { + case EFX_MAE_RULE_ACTION: + field_caps = maep->em_action_rule_field_caps; + desc_setp = __efx_mae_action_rule_mv_desc_set; + desc_set_nentries = + EFX_ARRAY_SIZE(__efx_mae_action_rule_mv_desc_set); + mvpl = left->emms_mask_value_pairs.action; + mvpr = right->emms_mask_value_pairs.action; + break; + default: + rc = ENOTSUP; + goto fail1; + } + + if (field_caps == NULL) { + rc = EAGAIN; + goto fail2; + } + + if (left->emms_type != right->emms_type || + left->emms_prio != right->emms_prio) { + /* + * Rules of different types can never map to the same class. + * + * The FW can support some set of match criteria for one + * priority and not support the very same set for + * another priority. Thus, two rules which have + * different priorities can never map to + * the same class. + */ + *have_same_classp = B_FALSE; + return (0); + } + + for (field_id = 0; field_id < desc_set_nentries; ++field_id) { + const efx_mae_mv_desc_t *descp = &desc_setp[field_id]; + efx_mae_field_cap_id_t field_cap_id = descp->emmd_field_cap_id; + + if (descp->emmd_mask_size == 0) + continue; /* Skip array gap */ + + if (field_cap_id >= field_ncaps) + break; + + if (field_caps[field_cap_id].emfc_mask_affects_class) { + const uint8_t *lmaskp = mvpl + descp->emmd_mask_offset; + const uint8_t *rmaskp = mvpr + descp->emmd_mask_offset; + size_t mask_size = descp->emmd_mask_size; + + if (memcmp(lmaskp, rmaskp, mask_size) != 0) { + have_same_class = B_FALSE; + break; + } + } + + if (field_caps[field_cap_id].emfc_match_affects_class) { + const uint8_t *lvalp = mvpl + descp->emmd_value_offset; + const uint8_t *rvalp = mvpr + descp->emmd_value_offset; + size_t value_size = descp->emmd_value_size; + + if (memcmp(lvalp, rvalp, value_size) != 0) { + have_same_class = B_FALSE; + break; + } + } + } + + *have_same_classp = have_same_class; + + return (0); + +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + #endif /* EFSYS_OPT_MAE */ diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index 0e6d44b6dc..aeb6f4d134 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -91,6 +91,7 @@ INTERNAL { efx_mae_match_spec_fini; efx_mae_match_spec_init; efx_mae_match_spec_is_valid; + efx_mae_match_specs_class_cmp; efx_mcdi_fini; efx_mcdi_get_proxy_handle; From patchwork Tue Oct 20 08:47:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81462 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 76122A04DD; Tue, 20 Oct 2020 10:55:58 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CD403BCD2; Tue, 20 Oct 2020 10:49:33 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 78E9EBBA6 for ; Tue, 20 Oct 2020 10:49:02 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 3736760058 for ; Tue, 20 Oct 2020 08:49:02 +0000 (UTC) Received: from us4-mdac16-27.ut7.mdlocal (unknown [10.7.66.59]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 369652009A for ; Tue, 20 Oct 2020 08:49:02 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 287631C004F for ; Tue, 20 Oct 2020 08:48:56 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id D30C9A80070 for ; Tue, 20 Oct 2020 08:48:55 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnmK030803; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 622CF161978; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:40 +0100 Message-ID: <1603183709-23420-14-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.558600-8.000000-10 X-TMASE-MatchedRID: Fq9/SvL6Kz48h5fiCCMPpCfa1HFVDArQqLKYlTwO0TVV1lQ/Hn0TOo10 Z1sGBhM6FA1eIuuV70Xm6gCNYEXf0if9wxvvYmtJsFkCLeeufNtMhH/KpYxyu3CR0itW3xfVyJN a6DYLgM0003R2T+VvjnDlPghqPnfyYlldA0POS1L/V0SDC1Do0KNeL/tbjwkH0qkUgB4fU1D9cw QgLdEm+bEwnnFnQnmn/X61PWt0t3wI9OW4GjlDnomR/mpCAiHdAzwceAn9JLO6pZ/o2Hu2YaHD1 a7PvZdlwA+RVu6JmDZUgpn09r97XslxOpZvztj9caD+wPaBYtbqobkz1A0A7TbpMgyAfh26166X b3/Hw4PMJufbBoyPldx6P1iG7NuXxqbzNYweGDsQcA6La5GzvRC26qzoFs8nq4++j0vqJohT/40 CMa1mSHT3Tly2WlgffjWeJX0rKbMfE8yM4pjsDwtuKBGekqUpnH7sbImOEBTUNd10cXjhG/HizZ Ksb3ldFC2CbN0TjUDbc9IwzDzDICNHkXbxTtuLhMWn7XyH8+z8voBIh1RMGoK8f7jcr319NcHSV m1uzr3kA8OrYHdwDGfYlY/yoV/0Up6EHOb2+c7kHZDO53QSwmA7bUFBqh2V X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--1.558600-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183736-kRAO9xx290JP X-PPE-DISP: 1603183736;kRAO9xx290JP Subject: [dpdk-dev] [PATCH 13/62] net/sfc: add verify method to flow validate path X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov The new method is needed to make sure that a flow being validated will have a chance to be accepted by the FW. MAE-specific implementation of the method should compare the class of a rule being validated with the corresponding classes of active rules, and, if no matches found, make a request to the FW. Support for the latter will be added in future. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/net/sfc/sfc_flow.c | 40 ++++++++++++++++++++ drivers/net/sfc/sfc_flow.h | 3 ++ drivers/net/sfc/sfc_mae.c | 75 ++++++++++++++++++++++++++++++++++++++ drivers/net/sfc/sfc_mae.h | 1 + 4 files changed, 119 insertions(+) diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c index 634818cdf2..f69dd6ac5d 100644 --- a/drivers/net/sfc/sfc_flow.c +++ b/drivers/net/sfc/sfc_flow.c @@ -27,6 +27,7 @@ struct sfc_flow_ops_by_spec { sfc_flow_parse_cb_t *parse; + sfc_flow_verify_cb_t *verify; sfc_flow_cleanup_cb_t *cleanup; sfc_flow_insert_cb_t *insert; sfc_flow_remove_cb_t *remove; @@ -39,6 +40,7 @@ static sfc_flow_remove_cb_t sfc_flow_filter_remove; static const struct sfc_flow_ops_by_spec sfc_flow_ops_filter = { .parse = sfc_flow_parse_rte_to_filter, + .verify = NULL, .cleanup = NULL, .insert = sfc_flow_filter_insert, .remove = sfc_flow_filter_remove, @@ -46,6 +48,7 @@ static const struct sfc_flow_ops_by_spec sfc_flow_ops_filter = { static const struct sfc_flow_ops_by_spec sfc_flow_ops_mae = { .parse = sfc_flow_parse_rte_to_mae, + .verify = sfc_mae_flow_verify, .cleanup = sfc_mae_flow_cleanup, .insert = NULL, .remove = NULL, @@ -2543,6 +2546,41 @@ sfc_flow_remove(struct sfc_adapter *sa, struct rte_flow *flow, return rc; } +static int +sfc_flow_verify(struct sfc_adapter *sa, struct rte_flow *flow, + struct rte_flow_error *error) +{ + const struct sfc_flow_ops_by_spec *ops; + int rc = 0; + + ops = sfc_flow_get_ops_by_spec(flow); + if (ops == NULL) { + rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, + "No backend to handle this flow"); + return -rte_errno; + } + + if (ops->verify != NULL) { + /* + * Use locking since verify method may need to + * access the list of already created rules. + */ + sfc_adapter_lock(sa); + rc = ops->verify(sa, flow); + sfc_adapter_unlock(sa); + } + + if (rc != 0) { + rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, + "Failed to verify flow validity with FW"); + return -rte_errno; + } + + return 0; +} + static int sfc_flow_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, @@ -2559,6 +2597,8 @@ sfc_flow_validate(struct rte_eth_dev *dev, return -rte_errno; rc = sfc_flow_parse(dev, attr, pattern, actions, flow, error); + if (rc == 0) + rc = sfc_flow_verify(sa, flow, error); sfc_flow_free(sa, flow); diff --git a/drivers/net/sfc/sfc_flow.h b/drivers/net/sfc/sfc_flow.h index 03a68d8633..164e9f9a9a 100644 --- a/drivers/net/sfc/sfc_flow.h +++ b/drivers/net/sfc/sfc_flow.h @@ -159,6 +159,9 @@ typedef int (sfc_flow_parse_cb_t)(struct rte_eth_dev *dev, struct rte_flow *flow, struct rte_flow_error *error); +typedef int (sfc_flow_verify_cb_t)(struct sfc_adapter *sa, + struct rte_flow *flow); + typedef void (sfc_flow_cleanup_cb_t)(struct sfc_adapter *sa, struct rte_flow *flow); diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 7e4397762b..42200c3f7e 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -148,3 +148,78 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, fail_init_match_spec_action: return rc; } + +static bool +sfc_mae_rules_class_cmp(struct sfc_adapter *sa, + const efx_mae_match_spec_t *left, + const efx_mae_match_spec_t *right) +{ + bool have_same_class; + int rc; + + rc = efx_mae_match_specs_class_cmp(sa->nic, left, right, + &have_same_class); + + return (rc == 0) ? have_same_class : false; +} + +static int +sfc_mae_action_rule_class_verify(struct sfc_adapter *sa, + struct sfc_flow_spec_mae *spec) +{ + const struct rte_flow *entry; + + TAILQ_FOREACH_REVERSE(entry, &sa->flow_list, sfc_flow_list, entries) { + const struct sfc_flow_spec *entry_spec = &entry->spec; + const struct sfc_flow_spec_mae *es_mae = &entry_spec->mae; + const efx_mae_match_spec_t *left = es_mae->match_spec; + const efx_mae_match_spec_t *right = spec->match_spec; + + switch (entry_spec->type) { + case SFC_FLOW_SPEC_FILTER: + /* Ignore VNIC-level flows */ + break; + case SFC_FLOW_SPEC_MAE: + if (sfc_mae_rules_class_cmp(sa, left, right)) + return 0; + break; + default: + SFC_ASSERT(false); + } + } + + sfc_info(sa, "for now, the HW doesn't support rule validation, and HW " + "support for inner frame pattern items is not guaranteed; " + "other than that, the items are valid from SW standpoint"); + return 0; +} + +/** + * Confirm that a given flow can be accepted by the FW. + * + * @param sa + * Software adapter context + * @param flow + * Flow to be verified + * @return + * Zero on success and non-zero in the case of error. + * A special value of EAGAIN indicates that the adapter is + * not in started state. This state is compulsory because + * it only makes sense to compare the rule class of the flow + * being validated with classes of the active rules. + * Such classes are wittingly supported by the FW. + */ +int +sfc_mae_flow_verify(struct sfc_adapter *sa, + struct rte_flow *flow) +{ + struct sfc_flow_spec *spec = &flow->spec; + struct sfc_flow_spec_mae *spec_mae = &spec->mae; + + SFC_ASSERT(sfc_adapter_is_locked(sa)); + + if (sa->state != SFC_ADAPTER_STARTED) + return EAGAIN; + + return sfc_mae_action_rule_class_verify(sa, spec_mae); +} diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index 536dadd092..4c5bc4c6ce 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -46,6 +46,7 @@ int sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, const struct rte_flow_item pattern[], struct sfc_flow_spec_mae *spec, struct rte_flow_error *error); +sfc_flow_verify_cb_t sfc_mae_flow_verify; #ifdef __cplusplus } From patchwork Tue Oct 20 08:47:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81480 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9C04BA04DD; Tue, 20 Oct 2020 11:02:53 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E0486C862; Tue, 20 Oct 2020 10:49:58 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 6713DAD31 for ; Tue, 20 Oct 2020 10:49:05 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 3741A6005C for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) Received: from us4-mdac16-14.ut7.mdlocal (unknown [10.7.65.238]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 37FBB2009A for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.199]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id B90481C0051 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 6899018005B for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnFx030820; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 6EB6916198B; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:41 +0100 Message-ID: <1603183709-23420-15-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-2.513500-8.000000-10 X-TMASE-MatchedRID: YKoie7Yrv/Ej6Wp8EiYV2G/BUkaRdR0JhO/3bCc4wl9GMe+tDjQ3FroT xgoDFSNYoqweJNiofMgKumdKE9waERlsiwH2NvdjeWgJLNowHdU1X1Ls767cpnCR0itW3xfVUNM prKLZkXqlUbQd5K36vJYZEKz74UzS3VGQScEUC76cVWc2a+/ju+vcTjVWUqx9e7ijHq7g9oYeYu RqwkgIgiUU0Q3EwNK5a4c+GRhi2wc1JHytUxkfUw97mDMXdNW3uoYFb0nRiqPsvb7MYS5s3oIoV xJqL3uZ58EykvLuSMDrixWWWJYrHx8TzIzimOwPC24oEZ6SpSmb4wHqRpnaDhJLGQ3jMMYnYjUf bDlB7MU9M52HKrihrG56GvAUtpSK3NUIBav+YjOqUqZvHKQLlylZuFbY33xRf/jOfhELVRxktgO mJgale+QDw6tgd3AMZ9iVj/KhX/RSnoQc5vb5zuQdkM7ndBLC4+XAJZXbs2s= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-2.513500-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183745-UOljG-aIzDZT X-PPE-DISP: 1603183745;UOljG-aIzDZT Subject: [dpdk-dev] [PATCH 14/62] common/sfc_efx/base: add action set spec init/fini APIs X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov The engine is only able to carry out chosen actions on matching packets in a strict order. No MCDI exists to identify supported actions and the order. Still, the definition of the latter is available from the FW documentation. The general idea is to define an action specification structure and supply a client driver with APIs for adding actions individually, order-dependent. A client driver is supposed to invoke an API on every action passed by the application, and if an out-of-order action follows, the API will reject it. Add an action set specification stub and supply initialise / finalise APIs. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 20 ++++++++++ drivers/common/sfc_efx/base/efx_impl.h | 3 ++ drivers/common/sfc_efx/base/efx_mae.c | 39 +++++++++++++++++++ .../sfc_efx/rte_common_sfc_efx_version.map | 3 ++ 4 files changed, 65 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index c91f7948a0..cd0b22d43a 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4098,6 +4098,26 @@ efx_mae_match_spec_is_valid( __in efx_nic_t *enp, __in const efx_mae_match_spec_t *spec); +typedef struct efx_mae_actions_s efx_mae_actions_t; + +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_action_set_spec_init( + __in efx_nic_t *enp, + __out efx_mae_actions_t **specp); + +LIBEFX_API +extern void +efx_mae_action_set_spec_fini( + __in efx_nic_t *enp, + __in efx_mae_actions_t *spec); + +LIBEFX_API +extern __checkReturn boolean_t +efx_mae_action_set_specs_equal( + __in const efx_mae_actions_t *left, + __in const efx_mae_actions_t *right); + /* * Conduct a comparison to check whether two match specifications * of equal rule type (action / outer) and priority would map to diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h index 2b872bb62e..86ef8e1b92 100644 --- a/drivers/common/sfc_efx/base/efx_impl.h +++ b/drivers/common/sfc_efx/base/efx_impl.h @@ -1699,6 +1699,9 @@ struct efx_mae_match_spec_s { } emms_mask_value_pairs; }; +typedef struct efx_mae_actions_s { +} efx_mae_actions_t; + #endif /* EFSYS_OPT_MAE */ #ifdef __cplusplus diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index a126cba37f..81c586dfe8 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -434,6 +434,45 @@ efx_mae_match_spec_is_valid( return (is_valid); } + __checkReturn efx_rc_t +efx_mae_action_set_spec_init( + __in efx_nic_t *enp, + __out efx_mae_actions_t **specp) +{ + efx_mae_actions_t *spec; + efx_rc_t rc; + + EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (*spec), spec); + if (spec == NULL) { + rc = ENOMEM; + goto fail1; + } + + *specp = spec; + + return (0); + +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + + void +efx_mae_action_set_spec_fini( + __in efx_nic_t *enp, + __in efx_mae_actions_t *spec) +{ + EFSYS_KMEM_FREE(enp->en_esip, sizeof (*spec), spec); +} + + __checkReturn boolean_t +efx_mae_action_set_specs_equal( + __in const efx_mae_actions_t *left, + __in const efx_mae_actions_t *right) +{ + return ((memcmp(left, right, sizeof (*left)) == 0) ? B_TRUE : B_FALSE); +} + __checkReturn efx_rc_t efx_mae_match_specs_class_cmp( __in efx_nic_t *enp, diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index aeb6f4d134..8a4d2b2fff 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -85,6 +85,9 @@ INTERNAL { efx_mac_stats_upload; efx_mac_up; + efx_mae_action_set_spec_fini; + efx_mae_action_set_spec_init; + efx_mae_action_set_specs_equal; efx_mae_fini; efx_mae_get_limits; efx_mae_init; From patchwork Tue Oct 20 08:47:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81454 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id C0569A04DD; Tue, 20 Oct 2020 10:53:02 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CF9A0BC14; Tue, 20 Oct 2020 10:49:21 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 6BBF8AD31 for ; Tue, 20 Oct 2020 10:49:00 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.62]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id F031E6007B for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) Received: from us4-mdac16-25.ut7.mdlocal (unknown [10.7.65.251]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id F0B118009B for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 7D099280053 for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 32F81A80061 for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mn1O030804; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 7DD051619C0; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:42 +0100 Message-ID: <1603183709-23420-16-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.462400-8.000000-10 X-TMASE-MatchedRID: s4SlA1o/QeqvddsITeyYIA9rVnOZ7Na29l9p8mNlkgn5BgEebZ/Id92I 5lCpZsGnSU+/BVsfN4xsu9NQ2X6vHgXjSpVHn22DqJSK+HSPY+/pVMb1xnESMgaYevV4zG3ZUx7 kGWSmvLut2gtuWr1LmjUt9JuWj4xHqj01FlWBadoaPMGCcVm9DhQEj9RZgbsWqPGqHIPGZiNcLC J/KjH2+fENLDkevvRYfVkdlGqLoLaEQeXrAUW/pxIRh9wkXSlFuoYFb0nRiqPSqRSAHh9TUIk+J GTs+SgTuW0lBjgUk+f0RAJjMpMwivq1PT1fWLFicaD+wPaBYtYOROc6V2b9xpsoi2XrUn/Jn6Kd MrRsL14qtq5d3cxkNaIBjL0CQ2REDbLtTFChLUp7UmoA+n8lk5o7vPKPqgVvEZT73Il4h6p2Haz DE/4ydD3gQ4Z8FpQbGHhbAlQ4GxxU/9hXOAmyk1Lp4hUUe2ehOKBkFAm8GOUPoO5ncI6OuehbQ2 QpmASdyky8P5TYMPI= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--0.462400-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183739-iAoPuGm54bOm X-PPE-DISP: 1603183739;iAoPuGm54bOm Subject: [dpdk-dev] [PATCH 15/62] net/sfc: add actions parsing stub to MAE backend X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov If parsing a flow results in an action set specification identical to an already existing one, duplication will be avoided by reusing the list entry of the latter. Using an attach helper and a reference counter is meant to serve the said purpose. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/net/sfc/sfc_flow.c | 8 ++- drivers/net/sfc/sfc_flow.h | 2 + drivers/net/sfc/sfc_mae.c | 133 +++++++++++++++++++++++++++++++++++++ drivers/net/sfc/sfc_mae.h | 15 +++++ 4 files changed, 157 insertions(+), 1 deletion(-) diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c index f69dd6ac5d..f4d53bf770 100644 --- a/drivers/net/sfc/sfc_flow.c +++ b/drivers/net/sfc/sfc_flow.c @@ -1201,6 +1201,7 @@ sfc_flow_parse_attr(struct sfc_adapter *sa, spec->type = SFC_FLOW_SPEC_MAE; spec_mae->priority = attr->priority; spec_mae->match_spec = NULL; + spec_mae->action_set = NULL; } return 0; @@ -2428,7 +2429,7 @@ sfc_flow_parse_rte_to_filter(struct rte_eth_dev *dev, static int sfc_flow_parse_rte_to_mae(struct rte_eth_dev *dev, const struct rte_flow_item pattern[], - __rte_unused const struct rte_flow_action actions[], + const struct rte_flow_action actions[], struct rte_flow *flow, struct rte_flow_error *error) { @@ -2441,6 +2442,11 @@ sfc_flow_parse_rte_to_mae(struct rte_eth_dev *dev, if (rc != 0) return rc; + rc = sfc_mae_rule_parse_actions(sa, actions, &spec_mae->action_set, + error); + if (rc != 0) + return rc; + return 0; } diff --git a/drivers/net/sfc/sfc_flow.h b/drivers/net/sfc/sfc_flow.h index 164e9f9a9a..7d15f47e60 100644 --- a/drivers/net/sfc/sfc_flow.h +++ b/drivers/net/sfc/sfc_flow.h @@ -65,6 +65,8 @@ struct sfc_flow_spec_mae { unsigned int priority; /* EFX match specification */ efx_mae_match_spec_t *match_spec; + /* Action set registry entry */ + struct sfc_mae_action_set *action_set; }; /* Flow specification */ diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 42200c3f7e..de2c6b26e4 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -43,6 +43,7 @@ sfc_mae_attach(struct sfc_adapter *sa) mae->status = SFC_MAE_STATUS_SUPPORTED; mae->nb_action_rule_prios_max = limits.eml_max_n_action_prios; + TAILQ_INIT(&mae->action_sets); sfc_log_init(sa, "done"); @@ -76,6 +77,68 @@ sfc_mae_detach(struct sfc_adapter *sa) sfc_log_init(sa, "done"); } +static struct sfc_mae_action_set * +sfc_mae_action_set_attach(struct sfc_adapter *sa, + const efx_mae_actions_t *spec) +{ + struct sfc_mae_action_set *action_set; + struct sfc_mae *mae = &sa->mae; + + SFC_ASSERT(sfc_adapter_is_locked(sa)); + + TAILQ_FOREACH(action_set, &mae->action_sets, entries) { + if (efx_mae_action_set_specs_equal(action_set->spec, spec)) { + ++(action_set->refcnt); + return action_set; + } + } + + return NULL; +} + +static int +sfc_mae_action_set_add(struct sfc_adapter *sa, + efx_mae_actions_t *spec, + struct sfc_mae_action_set **action_setp) +{ + struct sfc_mae_action_set *action_set; + struct sfc_mae *mae = &sa->mae; + + SFC_ASSERT(sfc_adapter_is_locked(sa)); + + action_set = rte_zmalloc("sfc_mae_action_set", sizeof(*action_set), 0); + if (action_set == NULL) + return ENOMEM; + + action_set->refcnt = 1; + action_set->spec = spec; + + TAILQ_INSERT_TAIL(&mae->action_sets, action_set, entries); + + *action_setp = action_set; + + return 0; +} + +static void +sfc_mae_action_set_del(struct sfc_adapter *sa, + struct sfc_mae_action_set *action_set) +{ + struct sfc_mae *mae = &sa->mae; + + SFC_ASSERT(sfc_adapter_is_locked(sa)); + SFC_ASSERT(action_set->refcnt != 0); + + --(action_set->refcnt); + + if (action_set->refcnt != 0) + return; + + efx_mae_action_set_spec_fini(sa->nic, action_set->spec); + TAILQ_REMOVE(&mae->action_sets, action_set, entries); + rte_free(action_set); +} + void sfc_mae_flow_cleanup(struct sfc_adapter *sa, struct rte_flow *flow) @@ -93,6 +156,9 @@ sfc_mae_flow_cleanup(struct sfc_adapter *sa, spec_mae = &spec->mae; + if (spec_mae->action_set != NULL) + sfc_mae_action_set_del(sa, spec_mae->action_set); + if (spec_mae->match_spec != NULL) efx_mae_match_spec_fini(sa->nic, spec_mae->match_spec); } @@ -149,6 +215,73 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, return rc; } +static int +sfc_mae_rule_parse_action(const struct rte_flow_action *action, + __rte_unused efx_mae_actions_t *spec, + struct rte_flow_error *error) +{ + switch (action->type) { + default: + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ACTION, NULL, + "Unsupported action"); + } + + return 0; +} + +int +sfc_mae_rule_parse_actions(struct sfc_adapter *sa, + const struct rte_flow_action actions[], + struct sfc_mae_action_set **action_setp, + struct rte_flow_error *error) +{ + const struct rte_flow_action *action; + efx_mae_actions_t *spec; + int rc; + + if (actions == NULL) { + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ACTION_NUM, NULL, + "NULL actions"); + } + + rc = efx_mae_action_set_spec_init(sa->nic, &spec); + if (rc != 0) + goto fail_action_set_spec_init; + + for (action = actions; + action->type != RTE_FLOW_ACTION_TYPE_END; ++action) { + rc = sfc_mae_rule_parse_action(action, spec, error); + if (rc != 0) + goto fail_rule_parse_action; + } + + *action_setp = sfc_mae_action_set_attach(sa, spec); + if (*action_setp != NULL) { + efx_mae_action_set_spec_fini(sa->nic, spec); + return 0; + } + + rc = sfc_mae_action_set_add(sa, spec, action_setp); + if (rc != 0) + goto fail_action_set_add; + + return 0; + +fail_action_set_add: +fail_rule_parse_action: + efx_mae_action_set_spec_fini(sa->nic, spec); + +fail_action_set_spec_init: + if (rc > 0) { + rc = rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, "Failed to process the action"); + } + return rc; +} + static bool sfc_mae_rules_class_cmp(struct sfc_adapter *sa, const efx_mae_match_spec_t *left, diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index 4c5bc4c6ce..5727962a0b 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -18,6 +18,15 @@ extern "C" { #endif +/** Action set registry entry */ +struct sfc_mae_action_set { + TAILQ_ENTRY(sfc_mae_action_set) entries; + unsigned int refcnt; + efx_mae_actions_t *spec; +}; + +TAILQ_HEAD(sfc_mae_action_sets, sfc_mae_action_set); + /** Options for MAE support status */ enum sfc_mae_status { SFC_MAE_STATUS_UNKNOWN = 0, @@ -30,6 +39,8 @@ struct sfc_mae { enum sfc_mae_status status; /** Priority level limit for MAE action rules */ unsigned int nb_action_rule_prios_max; + /** Action set registry */ + struct sfc_mae_action_sets action_sets; }; struct sfc_adapter; @@ -46,6 +57,10 @@ int sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, const struct rte_flow_item pattern[], struct sfc_flow_spec_mae *spec, struct rte_flow_error *error); +int sfc_mae_rule_parse_actions(struct sfc_adapter *sa, + const struct rte_flow_action actions[], + struct sfc_mae_action_set **action_setp, + struct rte_flow_error *error); sfc_flow_verify_cb_t sfc_mae_flow_verify; #ifdef __cplusplus From patchwork Tue Oct 20 08:47:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81452 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id D7C79A04DD; Tue, 20 Oct 2020 10:52:15 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C00A5BBFE; Tue, 20 Oct 2020 10:49:18 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 0D068AD39 for ; Tue, 20 Oct 2020 10:49:00 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 9244760070 for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) Received: from us4-mdac16-62.ut7.mdlocal (unknown [10.7.66.61]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 930912009A for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 1DB611C0051 for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id C810AA80061 for ; Tue, 20 Oct 2020 08:48:57 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnHr030800; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 8A7191619C2; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:43 +0100 Message-ID: <1603183709-23420-17-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.594800-8.000000-10 X-TMASE-MatchedRID: BSJVbXLvFVBnbxlBLir0nMewkPVzkoGNYERxjzVaKh1wkdIrVt8X1VDT Kayi2ZF6pVG0HeSt+ryWGRCs++FM0t1RkEnBFAu+nFVnNmvv47vr3E41VlKsfXy/Hx1AgJrr3JM PHOsk+bidssHnNcMsHYQSjqSszbEGo1mG+FX/1/DMujzyu+W9gfngX/aL8PCNkY8eITaSJPhrcD qFw27ycG4nw1WMWtJw172j5rbqYvoVQ+fPl8Ti482CuVPkCNzua01mhnn7t6QELMPQNzyJSwHvY yr9Z+5lpX3VmKF8bKR2fWCrneqDG72Px8mW2XSIaFAKyqG5M2LiNs6hPZAKV5soi2XrUn/Jn6Kd MrRsL14qtq5d3cxkNQwWxr7XDKH8SaskcvCSHSCmtEij7nbzjaZ/NvLJaD4HNlbeyLzexm7hYGC dZ4ouMalHrHhe5Pl9NZnHadsmEs7HyLo5zqOExIDbjUmI9TWghdeYev6ImzWyrFieOBrhBjzcWr t/fwYrRcB2ZpPnVjJoZ1Aq3A7VZw== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--0.594800-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183738-IeGdhdKC3Q-K X-PPE-DISP: 1603183738;IeGdhdKC3Q-K Subject: [dpdk-dev] [PATCH 16/62] common/sfc_efx/base: support setting a PPORT in a match spec X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add an API for setting mask-value pairs in a match specification structure and add support for MAE field INGRESS_PORT of type PPORT. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 48 +++++ drivers/common/sfc_efx/base/efx_mae.c | 170 ++++++++++++++++++ .../sfc_efx/rte_common_sfc_efx_version.map | 3 + 3 files changed, 221 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index cd0b22d43a..4fb3b02aa8 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4081,9 +4081,57 @@ efx_mae_match_spec_fini( __in efx_mae_match_spec_t *spec); typedef enum efx_mae_field_id_e { + EFX_MAE_FIELD_INGRESS_MPORT_SELECTOR = 0, + EFX_MAE_FIELD_NIDS } efx_mae_field_id_t; +/* MPORT selector. Used to refer to MPORTs in match/action rules. */ +typedef struct efx_mport_sel_s { + uint32_t sel; +} efx_mport_sel_t; + +/* + * Get MPORT selector of a physical port. + * + * The resulting MPORT selector is opaque to the caller and can be + * passed as an argument to efx_mae_match_spec_mport_set(). + */ +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_mport_by_phy_port( + __in uint32_t phy_port, + __out efx_mport_sel_t *mportp); + +/* + * Fields which have BE postfix in their named constants are expected + * to be passed by callers in big-endian byte order. They will appear + * in the MCDI buffer, which is a part of the match specification, in + * the very same byte order, that is, no conversion will be performed. + * + * Fields which don't have BE postfix in their named constants are in + * host byte order. MCDI expects them to be little-endian, so the API + * will take care to carry out conversion to little-endian byte order. + * At the moment, the only field in host byte order is MPORT selector. + */ +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_match_spec_field_set( + __in efx_mae_match_spec_t *spec, + __in efx_mae_field_id_t field_id, + __in size_t value_size, + __in_bcount(value_size) const uint8_t *value, + __in size_t mask_size, + __in_bcount(mask_size) const uint8_t *mask); + +/* If the mask argument is NULL, the API will use full mask by default. */ +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_match_spec_mport_set( + __in efx_mae_match_spec_t *spec, + __in const efx_mport_sel_t *valuep, + __in_opt const efx_mport_sel_t *maskp); + /* * Make sure that match fields known by EFX have proper masks set * in the match specification as per requirements of SF-122526-TC. diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index 81c586dfe8..4e6ae2227d 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -282,6 +282,8 @@ efx_mae_match_spec_fini( /* Named identifiers which are valid indices to efx_mae_field_cap_t */ typedef enum efx_mae_field_cap_id_e { + EFX_MAE_FIELD_ID_INGRESS_MPORT_SELECTOR = MAE_FIELD_INGRESS_PORT, + EFX_MAE_FIELD_CAP_NIDS } efx_mae_field_cap_id_t; @@ -311,8 +313,176 @@ typedef struct efx_mae_mv_desc_s { /* Indices to this array are provided by efx_mae_field_id_t */ static const efx_mae_mv_desc_t __efx_mae_action_rule_mv_desc_set[] = { +#define EFX_MAE_MV_DESC(_name, _endianness) \ + [EFX_MAE_FIELD_##_name] = \ + { \ + EFX_MAE_FIELD_ID_##_name, \ + MAE_FIELD_MASK_VALUE_PAIRS_##_name##_LEN, \ + MAE_FIELD_MASK_VALUE_PAIRS_##_name##_OFST, \ + MAE_FIELD_MASK_VALUE_PAIRS_##_name##_MASK_LEN, \ + MAE_FIELD_MASK_VALUE_PAIRS_##_name##_MASK_OFST, \ + _endianness \ + } + + EFX_MAE_MV_DESC(INGRESS_MPORT_SELECTOR, EFX_MAE_FIELD_LE), + +#undef EFX_MAE_MV_DESC }; + __checkReturn efx_rc_t +efx_mae_mport_by_phy_port( + __in uint32_t phy_port, + __out efx_mport_sel_t *mportp) +{ + efx_dword_t dword; + efx_rc_t rc; + + if (phy_port > EFX_MASK32(MAE_MPORT_SELECTOR_PPORT_ID)) { + rc = EINVAL; + goto fail1; + } + + EFX_POPULATE_DWORD_2(dword, + MAE_MPORT_SELECTOR_TYPE, MAE_MPORT_SELECTOR_TYPE_PPORT, + MAE_MPORT_SELECTOR_PPORT_ID, phy_port); + + memset(mportp, 0, sizeof (*mportp)); + mportp->sel = dword.ed_u32[0]; + + return (0); + +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + + __checkReturn efx_rc_t +efx_mae_match_spec_field_set( + __in efx_mae_match_spec_t *spec, + __in efx_mae_field_id_t field_id, + __in size_t value_size, + __in_bcount(value_size) const uint8_t *value, + __in size_t mask_size, + __in_bcount(mask_size) const uint8_t *mask) +{ + const efx_mae_mv_desc_t *descp; + uint8_t *mvp; + efx_rc_t rc; + + if (field_id >= EFX_MAE_FIELD_NIDS) { + rc = EINVAL; + goto fail1; + } + + switch (spec->emms_type) { + case EFX_MAE_RULE_ACTION: + descp = &__efx_mae_action_rule_mv_desc_set[field_id]; + mvp = spec->emms_mask_value_pairs.action; + break; + default: + rc = ENOTSUP; + goto fail2; + } + + if (value_size != descp->emmd_value_size) { + rc = EINVAL; + goto fail3; + } + + if (mask_size != descp->emmd_mask_size) { + rc = EINVAL; + goto fail4; + } + + if (descp->emmd_endianness == EFX_MAE_FIELD_BE) { + /* + * The mask/value are in network (big endian) order. + * The MCDI request field is also big endian. + */ + memcpy(mvp + descp->emmd_value_offset, value, value_size); + memcpy(mvp + descp->emmd_mask_offset, mask, mask_size); + } else { + efx_dword_t dword; + + /* + * The mask/value are in host byte order. + * The MCDI request field is little endian. + */ + switch (value_size) { + case 4: + EFX_POPULATE_DWORD_1(dword, + EFX_DWORD_0, *(const uint32_t *)value); + + memcpy(mvp + descp->emmd_value_offset, + &dword, sizeof (dword)); + break; + default: + EFSYS_ASSERT(B_FALSE); + } + + switch (mask_size) { + case 4: + EFX_POPULATE_DWORD_1(dword, + EFX_DWORD_0, *(const uint32_t *)mask); + + memcpy(mvp + descp->emmd_mask_offset, + &dword, sizeof (dword)); + break; + default: + EFSYS_ASSERT(B_FALSE); + } + } + + return (0); + +fail4: + EFSYS_PROBE(fail4); +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + + __checkReturn efx_rc_t +efx_mae_match_spec_mport_set( + __in efx_mae_match_spec_t *spec, + __in const efx_mport_sel_t *valuep, + __in_opt const efx_mport_sel_t *maskp) +{ + uint32_t full_mask = UINT32_MAX; + const uint8_t *vp; + const uint8_t *mp; + efx_rc_t rc; + + if (valuep == NULL) { + rc = EINVAL; + goto fail1; + } + + vp = (const uint8_t *)&valuep->sel; + if (maskp != NULL) + mp = (const uint8_t *)&maskp->sel; + else + mp = (const uint8_t *)&full_mask; + + rc = efx_mae_match_spec_field_set(spec, + EFX_MAE_FIELD_INGRESS_MPORT_SELECTOR, + sizeof (valuep->sel), vp, sizeof (maskp->sel), mp); + if (rc != 0) + goto fail2; + + return (0); + +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + #define EFX_MASK_BIT_IS_SET(_mask, _mask_page_nbits, _bit) \ ((_mask)[(_bit) / (_mask_page_nbits)] & \ (1ULL << ((_bit) & ((_mask_page_nbits) - 1)))) diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index 8a4d2b2fff..86ed437e8d 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -91,10 +91,13 @@ INTERNAL { efx_mae_fini; efx_mae_get_limits; efx_mae_init; + efx_mae_match_spec_field_set; efx_mae_match_spec_fini; efx_mae_match_spec_init; efx_mae_match_spec_is_valid; + efx_mae_match_spec_mport_set; efx_mae_match_specs_class_cmp; + efx_mae_mport_by_phy_port; efx_mcdi_fini; efx_mcdi_get_proxy_handle; From patchwork Tue Oct 20 08:47:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81499 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 94623A04DD; Tue, 20 Oct 2020 11:09:47 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 6975FCB34; Tue, 20 Oct 2020 10:50:29 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 2594EAD31 for ; Tue, 20 Oct 2020 10:49:08 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 62E146008C for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from us4-mdac16-41.ut7.mdlocal (unknown [10.7.64.23]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 634C78009E for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.199]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id E1FF780056 for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 9877F18005C for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnWH030802; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 973FA1619F5; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:44 +0100 Message-ID: <1603183709-23420-18-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-2.441700-8.000000-10 X-TMASE-MatchedRID: xNyt3d70ywyqfSQfLa/SN6iUivh0j2Pv6VTG9cZxEjIGmHr1eMxt2UAc 6DyoS2rIzFlXLlUThJU2varlbSSzl2owheuziK0qR/j040fRFpIUBI/UWYG7Fm+arpqBxtz8KKb M5Q4DbH9N9XVFzHGStAC5tSYXAMeQvgJhgunlKsvnvg/SfqXd/dnLANiJ9J62VWQnHKxp38hCZn 37VQFgvZ3B/CendwLbRQq6I/z93yVJI5ZUl647UBRFJJyf5BJe3QfwsVk0UbsIoUKaF27lxf2vy Qh3a+J6d60Nxl+VEPhajLI6kawbXbMbby/KWwIgCDir6MaPzzhTJhATzQKBJBOXWNbsga/GnEjm yz4KDiU1Ubs5jKswrQ9cvEd/Et5dVEc5IqztENReYfSkFq6uAb7jE6+wkCSe+rL5VW+ofZc= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-2.441700-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183746-iiW_NrMB4YSB X-PPE-DISP: 1603183746;iiW_NrMB4YSB Subject: [dpdk-dev] [PATCH 17/62] net/sfc: support flow item PHY PORT in MAE backend X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add support for this flow item to MAE-specific RTE flow implementation. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 4 +++ drivers/net/sfc/sfc_mae.c | 69 +++++++++++++++++++++++++++++++++++++ drivers/net/sfc/sfc_mae.h | 1 + 3 files changed, 74 insertions(+) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index 7a5aff79f9..b12e93180e 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -188,6 +188,10 @@ Supported actions (***non-transfer*** rules): - MARK (supported only with ef10_essb Rx datapath) +Supported pattern items (***transfer*** rules): + +- PHY_PORT (cannot repeat; conflicts with other traffic source items) + Validating flow rules depends on the firmware variant. The :ref:`flow_isolated_mode` is supported. diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index de2c6b26e4..87d2e15d29 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -163,7 +163,76 @@ sfc_mae_flow_cleanup(struct sfc_adapter *sa, efx_mae_match_spec_fini(sa->nic, spec_mae->match_spec); } +static int +sfc_mae_rule_parse_item_phy_port(const struct rte_flow_item *item, + struct sfc_flow_parse_ctx *ctx, + struct rte_flow_error *error) +{ + struct sfc_mae_parse_ctx *ctx_mae = ctx->mae; + const struct rte_flow_item_phy_port supp_mask = { + .index = 0xffffffff, + }; + const void *def_mask = &rte_flow_item_phy_port_mask; + const struct rte_flow_item_phy_port *spec = NULL; + const struct rte_flow_item_phy_port *mask = NULL; + efx_mport_sel_t mport_v; + int rc; + + if (ctx_mae->match_mport_set) { + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Can't handle multiple traffic source items"); + } + + rc = sfc_flow_parse_init(item, + (const void **)&spec, (const void **)&mask, + (const void *)&supp_mask, def_mask, + sizeof(struct rte_flow_item_phy_port), error); + if (rc != 0) + return rc; + + if (mask->index != supp_mask.index) { + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Bad mask in the PHY_PORT pattern item"); + } + + /* If "spec" is not set, could be any physical port */ + if (spec == NULL) + return 0; + + rc = efx_mae_mport_by_phy_port(spec->index, &mport_v); + if (rc != 0) { + return rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Failed to convert the PHY_PORT index"); + } + + rc = efx_mae_match_spec_mport_set(ctx_mae->match_spec_action, + &mport_v, NULL); + if (rc != 0) { + return rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Failed to set MPORT for the PHY_PORT"); + } + + ctx_mae->match_mport_set = B_TRUE; + + return 0; +} + static const struct sfc_flow_item sfc_flow_items[] = { + { + .type = RTE_FLOW_ITEM_TYPE_PHY_PORT, + /* + * In terms of RTE flow, this item is a META one, + * and its position in the pattern is don't care. + */ + .prev_layer = SFC_FLOW_ITEM_ANY_LAYER, + .layer = SFC_FLOW_ITEM_ANY_LAYER, + .ctx_type = SFC_FLOW_PARSE_CTX_MAE, + .parse = sfc_mae_rule_parse_item_phy_port, + }, }; int diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index 5727962a0b..1ef582e82b 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -48,6 +48,7 @@ struct sfc_flow_spec; struct sfc_mae_parse_ctx { efx_mae_match_spec_t *match_spec_action; + bool match_mport_set; }; int sfc_mae_attach(struct sfc_adapter *sa); From patchwork Tue Oct 20 08:47:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81473 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id A9A23A04DD; Tue, 20 Oct 2020 11:00:07 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0EA93C7EE; Tue, 20 Oct 2020 10:49:49 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 4E518BBAA for ; Tue, 20 Oct 2020 10:49:03 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 1EB286007C for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) Received: from us4-mdac16-75.ut7.mdlocal (unknown [10.7.64.194]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 1F4F78009E for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 7A7CE8005C for ; Tue, 20 Oct 2020 08:49:02 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 2FFEC800058 for ; Tue, 20 Oct 2020 08:49:02 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnmM030803; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id A43B0161A01; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:45 +0100 Message-ID: <1603183709-23420-19-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.291200-8.000000-10 X-TMASE-MatchedRID: zyhNn9BFHvhIm8dlggjEyIdlc1JaOB1T3aHfGa/QuY9wkdIrVt8X1VDT Kayi2ZF6Ko7X68Rw9F5w5T4Iaj538mJZXQNDzktS9DGkDtq4vAxnAst8At+c3Zsoi2XrUn/Jn6K dMrRsL14qtq5d3cxkNY2zfR26HRPMXomxcmWBlSqKgtdw5SBdvMCMytePWiuewuyMwmwzOKfyFA cHnJdFOkKPoJtKaT50TMG2goI6y08My2/MPAEdycCGzXCiH+kqOKBkFAm8GOUPoO5ncI6OuehbQ 2QpmASdWPKWiAlNtI7vdCUIFuasqw== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-0.291200-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183743-O1i1NJfGnjKJ X-PPE-DISP: 1603183743;O1i1NJfGnjKJ Subject: [dpdk-dev] [PATCH 18/62] common/sfc_efx/base: add MAE match fields for Ethernet X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add MCDI-compatible enumeration for these fields and provide necessary mappings for them to be inserted directly into mask-value pairs buffer. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 3 +++ drivers/common/sfc_efx/base/efx_mae.c | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 4fb3b02aa8..8d88834c30 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4082,6 +4082,9 @@ efx_mae_match_spec_fini( typedef enum efx_mae_field_id_e { EFX_MAE_FIELD_INGRESS_MPORT_SELECTOR = 0, + EFX_MAE_FIELD_ETHER_TYPE_BE, + EFX_MAE_FIELD_ETH_SADDR_BE, + EFX_MAE_FIELD_ETH_DADDR_BE, EFX_MAE_FIELD_NIDS } efx_mae_field_id_t; diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index 4e6ae2227d..01b2e311a5 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -283,6 +283,9 @@ efx_mae_match_spec_fini( /* Named identifiers which are valid indices to efx_mae_field_cap_t */ typedef enum efx_mae_field_cap_id_e { EFX_MAE_FIELD_ID_INGRESS_MPORT_SELECTOR = MAE_FIELD_INGRESS_PORT, + EFX_MAE_FIELD_ID_ETHER_TYPE_BE = MAE_FIELD_ETHER_TYPE, + EFX_MAE_FIELD_ID_ETH_SADDR_BE = MAE_FIELD_ETH_SADDR, + EFX_MAE_FIELD_ID_ETH_DADDR_BE = MAE_FIELD_ETH_DADDR, EFX_MAE_FIELD_CAP_NIDS } efx_mae_field_cap_id_t; @@ -325,6 +328,9 @@ static const efx_mae_mv_desc_t __efx_mae_action_rule_mv_desc_set[] = { } EFX_MAE_MV_DESC(INGRESS_MPORT_SELECTOR, EFX_MAE_FIELD_LE), + EFX_MAE_MV_DESC(ETHER_TYPE_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ETH_SADDR_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ETH_DADDR_BE, EFX_MAE_FIELD_BE), #undef EFX_MAE_MV_DESC }; From patchwork Tue Oct 20 08:47:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81468 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id D6F14A04DD; Tue, 20 Oct 2020 10:58:22 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2D9FEBE2F; Tue, 20 Oct 2020 10:49:42 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 884CEBBA0 for ; Tue, 20 Oct 2020 10:49:03 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 5846D60065 for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) Received: from us4-mdac16-62.ut7.mdlocal (unknown [10.7.66.61]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 58F112009A for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.41]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id D843A1C004F for ; Tue, 20 Oct 2020 08:49:02 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 6CB624C0059 for ; Tue, 20 Oct 2020 08:49:02 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnvU030801; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id B1850161A0A; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:46 +0100 Message-ID: <1603183709-23420-20-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.355500-8.000000-10 X-TMASE-MatchedRID: pm5esiOnALWqfSQfLa/SN6iUivh0j2Pv6VTG9cZxEjIGmHr1eMxt2UAc 6DyoS2rIEcE+LOiKuIt27cZtoykdFo9y28rShcKqRpZ38TWrY5yoSgRE9rhqi08iLpubparmku+ GdcB8c5O+9mDuGGWszi83jj4qEbKvxz6opuAAUJIPe5gzF3TVt9ST/TZ3TTpFbdiWoEZixCujxY yRBa/qJcFwgTvxipFajoczmuoPCq2TinQiJ4LphjPnD9L3bIRZjt+BvEYBmOOpyJ8n9mqyBGJBT U6nDmRgIZinM5iiFn4uPYpo5rd4OnMsjZzimveuNMpshF9F2MGF15h6/oibNbKsWJ44GuEGPNxa u39/BitFwHZmk+dWMmhnUCrcDtVn X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--1.355500-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183743-SevSCiCBNykg X-PPE-DISP: 1603183743;SevSCiCBNykg Subject: [dpdk-dev] [PATCH 19/62] net/sfc: support flow item ETH in MAE backend X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add support for this flow item to MAE-specific RTE flow implementation. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 2 + drivers/net/sfc/sfc_mae.c | 106 ++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index b12e93180e..65d52d5551 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -192,6 +192,8 @@ Supported pattern items (***transfer*** rules): - PHY_PORT (cannot repeat; conflicts with other traffic source items) +- ETH + Validating flow rules depends on the firmware variant. The :ref:`flow_isolated_mode` is supported. diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 87d2e15d29..95f8cffc27 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -221,6 +221,105 @@ sfc_mae_rule_parse_item_phy_port(const struct rte_flow_item *item, return 0; } +struct sfc_mae_field_locator { + efx_mae_field_id_t field_id; + size_t size; + /* Field offset in the corresponding rte_flow_item_ struct */ + size_t ofst; +}; + +static void +sfc_mae_item_build_supp_mask(const struct sfc_mae_field_locator *field_locators, + unsigned int nb_field_locators, void *mask_ptr, + size_t mask_size) +{ + unsigned int i; + + memset(mask_ptr, 0, mask_size); + + for (i = 0; i < nb_field_locators; ++i) { + const struct sfc_mae_field_locator *fl = &field_locators[i]; + + SFC_ASSERT(fl->ofst + fl->size <= mask_size); + memset(RTE_PTR_ADD(mask_ptr, fl->ofst), 0xff, fl->size); + } +} + +static int +sfc_mae_parse_item(const struct sfc_mae_field_locator *field_locators, + unsigned int nb_field_locators, const uint8_t *spec, + const uint8_t *mask, efx_mae_match_spec_t *efx_spec, + struct rte_flow_error *error) +{ + unsigned int i; + int rc = 0; + + for (i = 0; i < nb_field_locators; ++i) { + const struct sfc_mae_field_locator *fl = &field_locators[i]; + + rc = efx_mae_match_spec_field_set(efx_spec, fl->field_id, + fl->size, spec + fl->ofst, + fl->size, mask + fl->ofst); + if (rc != 0) + break; + } + + if (rc != 0) { + rc = rte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_ITEM, + NULL, "Failed to process item fields"); + } + + return rc; +} + +static const struct sfc_mae_field_locator flocs_eth[] = { + { + EFX_MAE_FIELD_ETHER_TYPE_BE, + RTE_SIZEOF_FIELD(struct rte_flow_item_eth, type), + offsetof(struct rte_flow_item_eth, type), + }, + { + EFX_MAE_FIELD_ETH_DADDR_BE, + RTE_SIZEOF_FIELD(struct rte_flow_item_eth, dst), + offsetof(struct rte_flow_item_eth, dst), + }, + { + EFX_MAE_FIELD_ETH_SADDR_BE, + RTE_SIZEOF_FIELD(struct rte_flow_item_eth, src), + offsetof(struct rte_flow_item_eth, src), + }, +}; + +static int +sfc_mae_rule_parse_item_eth(const struct rte_flow_item *item, + struct sfc_flow_parse_ctx *ctx, + struct rte_flow_error *error) +{ + struct sfc_mae_parse_ctx *ctx_mae = ctx->mae; + struct rte_flow_item_eth supp_mask; + const uint8_t *spec = NULL; + const uint8_t *mask = NULL; + int rc; + + sfc_mae_item_build_supp_mask(flocs_eth, RTE_DIM(flocs_eth), + &supp_mask, sizeof(supp_mask)); + + rc = sfc_flow_parse_init(item, + (const void **)&spec, (const void **)&mask, + (const void *)&supp_mask, + &rte_flow_item_eth_mask, + sizeof(struct rte_flow_item_eth), error); + if (rc != 0) + return rc; + + /* If "spec" is not set, could be any Ethernet */ + if (spec == NULL) + return 0; + + return sfc_mae_parse_item(flocs_eth, RTE_DIM(flocs_eth), spec, mask, + ctx_mae->match_spec_action, error); +} + static const struct sfc_flow_item sfc_flow_items[] = { { .type = RTE_FLOW_ITEM_TYPE_PHY_PORT, @@ -233,6 +332,13 @@ static const struct sfc_flow_item sfc_flow_items[] = { .ctx_type = SFC_FLOW_PARSE_CTX_MAE, .parse = sfc_mae_rule_parse_item_phy_port, }, + { + .type = RTE_FLOW_ITEM_TYPE_ETH, + .prev_layer = SFC_FLOW_ITEM_START_LAYER, + .layer = SFC_FLOW_ITEM_L2, + .ctx_type = SFC_FLOW_PARSE_CTX_MAE, + .parse = sfc_mae_rule_parse_item_eth, + }, }; int From patchwork Tue Oct 20 08:47:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81459 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4E41CA04DD; Tue, 20 Oct 2020 10:54:50 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 69803BCA8; Tue, 20 Oct 2020 10:49:29 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 38745BBA0 for ; Tue, 20 Oct 2020 10:49:01 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.62]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id AE5A36006D for ; Tue, 20 Oct 2020 08:48:59 +0000 (UTC) Received: from us4-mdac16-29.ut7.mdlocal (unknown [10.7.66.139]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id AD98D8009B for ; Tue, 20 Oct 2020 08:48:59 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 32D64280050 for ; Tue, 20 Oct 2020 08:48:59 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id DD5FB800058 for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnvS030801; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id BEA87161A17; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:47 +0100 Message-ID: <1603183709-23420-21-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.032200-8.000000-10 X-TMASE-MatchedRID: qT3lr2YLwToZbIsB9jb3Y26HurDH4PpP6KbGBEfATCZwkdIrVt8X1VDT Kayi2ZF6pVG0HeSt+ryWGRCs++FM0t1RkEnBFAu+nFVnNmvv47uWODD/yzpvd7Zk7gsuflVKFQL H9fnGRScEURg1j2RVWB0HR7lIrhJk24NXD3gRmYDN+qWlu2ZxaNi5W7Rf+s6QR2YNIFh+clGGc4 vJ+XLGs+qdK1begbbxbgyxO8sQKN8K9DOkPuNII7dHEv7sR/OwfglgnB0nDhN7uKMeruD2hrBXu d9Ra+w0tk2AwjDNBTuAMuqetGVetnyef22ep6XYxlblqLlYqXIRvQlel5Wbwj2ppL+O5aOxnqxQ Z6OEQ8DJibW/yIPDduygLTPX5amJxhj3j1MW6TyUhH8b6j2vAHEu4PVSZXBnayrPn5ppScvw7Jx wU0EvZMqEROLb/+yO4/0Jvn0rwAJmtL4Dw+zNb9T2H03zzU1J X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--1.032200-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183739-t4XWZJKljOA9 X-PPE-DISP: 1603183739;t4XWZJKljOA9 Subject: [dpdk-dev] [PATCH 20/62] common/sfc_efx/base: support adding DELIVER action to a set X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Introduce a mechanism for adding actions to an action set and add support for DELIVER action. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 11 +- drivers/common/sfc_efx/base/efx_impl.h | 11 ++ drivers/common/sfc_efx/base/efx_mae.c | 141 ++++++++++++++++++ .../sfc_efx/rte_common_sfc_efx_version.map | 1 + 4 files changed, 163 insertions(+), 1 deletion(-) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 8d88834c30..6f63a6ecd0 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4094,11 +4094,14 @@ typedef struct efx_mport_sel_s { uint32_t sel; } efx_mport_sel_t; +#define EFX_MPORT_NULL (0U) + /* * Get MPORT selector of a physical port. * * The resulting MPORT selector is opaque to the caller and can be - * passed as an argument to efx_mae_match_spec_mport_set(). + * passed as an argument to efx_mae_match_spec_mport_set() + * and efx_mae_action_set_populate_deliver(). */ LIBEFX_API extern __checkReturn efx_rc_t @@ -4163,6 +4166,12 @@ efx_mae_action_set_spec_fini( __in efx_nic_t *enp, __in efx_mae_actions_t *spec); +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_action_set_populate_deliver( + __in efx_mae_actions_t *spec, + __in const efx_mport_sel_t *mportp); + LIBEFX_API extern __checkReturn boolean_t efx_mae_action_set_specs_equal( diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h index 86ef8e1b92..927324c85c 100644 --- a/drivers/common/sfc_efx/base/efx_impl.h +++ b/drivers/common/sfc_efx/base/efx_impl.h @@ -1699,7 +1699,18 @@ struct efx_mae_match_spec_s { } emms_mask_value_pairs; }; +typedef enum efx_mae_action_e { + /* DELIVER is always the last action. */ + EFX_MAE_ACTION_DELIVER, + + EFX_MAE_NACTIONS +} efx_mae_action_t; + typedef struct efx_mae_actions_s { + /* Bitmap of actions in spec, indexed by action type */ + uint32_t emass_actions; + + efx_mport_sel_t emass_deliver_mport; } efx_mae_actions_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 01b2e311a5..47611c4397 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -641,6 +641,147 @@ efx_mae_action_set_spec_fini( EFSYS_KMEM_FREE(enp->en_esip, sizeof (*spec), spec); } +static __checkReturn efx_rc_t +efx_mae_action_set_add_deliver( + __in efx_mae_actions_t *spec, + __in size_t arg_size, + __in_bcount(arg_size) const uint8_t *arg) +{ + efx_rc_t rc; + + if (arg_size != sizeof (spec->emass_deliver_mport)) { + rc = EINVAL; + goto fail1; + } + + if (arg == NULL) { + rc = EINVAL; + goto fail2; + } + + memcpy(&spec->emass_deliver_mport, arg, arg_size); + + return (0); + +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + +typedef struct efx_mae_action_desc_s { + /* Action specific handler */ + efx_rc_t (*emad_add)(efx_mae_actions_t *, + size_t, const uint8_t *); +} efx_mae_action_desc_t; + +static const efx_mae_action_desc_t efx_mae_actions[EFX_MAE_NACTIONS] = { + [EFX_MAE_ACTION_DELIVER] = { + .emad_add = efx_mae_action_set_add_deliver + } +}; + +static const uint32_t efx_mae_action_ordered_map = + (1U << EFX_MAE_ACTION_DELIVER); + +static const uint32_t efx_mae_action_repeat_map = 0; + +/* + * Add an action to an action set. + * + * This has to be invoked in the desired action order. + * An out-of-order action request will be turned down. + */ +static __checkReturn efx_rc_t +efx_mae_action_set_spec_populate( + __in efx_mae_actions_t *spec, + __in efx_mae_action_t type, + __in size_t arg_size, + __in_bcount(arg_size) const uint8_t *arg) +{ + uint32_t action_mask; + efx_rc_t rc; + + EFX_STATIC_ASSERT(EFX_MAE_NACTIONS <= + (sizeof (efx_mae_action_ordered_map) * 8)); + EFX_STATIC_ASSERT(EFX_MAE_NACTIONS <= + (sizeof (efx_mae_action_repeat_map) * 8)); + + EFX_STATIC_ASSERT(EFX_MAE_ACTION_DELIVER + 1 == EFX_MAE_NACTIONS); + + if (type >= EFX_ARRAY_SIZE(efx_mae_actions)) { + rc = EINVAL; + goto fail1; + } + + action_mask = (1U << type); + + if ((spec->emass_actions & action_mask) != 0) { + /* The action set already contains this action. */ + if ((efx_mae_action_repeat_map & action_mask) == 0) { + /* Cannot add another non-repeatable action. */ + rc = ENOTSUP; + goto fail2; + } + } + + if ((efx_mae_action_ordered_map & action_mask) != 0) { + uint32_t later_actions_mask = + efx_mae_action_ordered_map & + ~(action_mask | (action_mask - 1)); + + if ((spec->emass_actions & later_actions_mask) != 0) { + /* Cannot add an action after later ordered actions. */ + rc = ENOTSUP; + goto fail3; + } + } + + if (efx_mae_actions[type].emad_add != NULL) { + rc = efx_mae_actions[type].emad_add(spec, arg_size, arg); + if (rc != 0) + goto fail4; + } + + spec->emass_actions |= action_mask; + + return (0); + +fail4: + EFSYS_PROBE(fail4); +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + + __checkReturn efx_rc_t +efx_mae_action_set_populate_deliver( + __in efx_mae_actions_t *spec, + __in const efx_mport_sel_t *mportp) +{ + const uint8_t *arg; + efx_rc_t rc; + + if (mportp == NULL) { + rc = EINVAL; + goto fail1; + } + + arg = (const uint8_t *)&mportp->sel; + + return (efx_mae_action_set_spec_populate(spec, + EFX_MAE_ACTION_DELIVER, sizeof (mportp->sel), arg)); + +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + __checkReturn boolean_t efx_mae_action_set_specs_equal( __in const efx_mae_actions_t *left, diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index 86ed437e8d..d2a5d58ae8 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -85,6 +85,7 @@ INTERNAL { efx_mac_stats_upload; efx_mac_up; + efx_mae_action_set_populate_deliver; efx_mae_action_set_spec_fini; efx_mae_action_set_spec_init; efx_mae_action_set_specs_equal; From patchwork Tue Oct 20 08:47:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81451 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id D861CA04DD; Tue, 20 Oct 2020 10:51:55 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0D31FBBF0; Tue, 20 Oct 2020 10:49:17 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 9F357AD31 for ; Tue, 20 Oct 2020 10:48:59 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 3231E6007D for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) Received: from us4-mdac16-14.ut7.mdlocal (unknown [10.7.65.238]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 317DE2009A for ; Tue, 20 Oct 2020 08:48:58 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id B22241C0052 for ; Tue, 20 Oct 2020 08:48:57 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 69166A80061 for ; Tue, 20 Oct 2020 08:48:57 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnHv030800; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id CDDAB161A22; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:48 +0100 Message-ID: <1603183709-23420-22-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.344200-8.000000-10 X-TMASE-MatchedRID: 5A8hgJTIs0fbiFIWuP4ar6iUivh0j2Pv6VTG9cZxEjIGmHr1eMxt2UAc 6DyoS2rIEcE+LOiKuIt27cZtoykdFo9y28rShcKqcvVMncWChZnLvfc3C6SWwvYENPLTaMhvj78 +1uscT5Knpp75HenHO1SCmfT2v3te3qZ3A4FG8d0Pe5gzF3TVtxisibaaFAhmmyiLZetSf8mfop 0ytGwvXiq2rl3dzGQ1LyUV9bAUSPxiq5o2dm5vq4dBBnrMGv35arek3NZtcgYM3B3UjkTO20iUx Z5MSMJsl8ibHv3/cAp1BkkntnUIO7cEV2SxXhYSsaGCK1PGkPg4oGQUCbwY5Q+g7mdwjo656FtD ZCmYBJ3KTLw/lNgw8g== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--0.344200-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183738-vRRAulXtT1eu X-PPE-DISP: 1603183738;vRRAulXtT1eu Subject: [dpdk-dev] [PATCH 21/62] net/sfc: support flow action PHY PORT in MAE backend X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov The action handler will use MAE action DELIVER with MPORT of a given physical port. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 4 ++++ drivers/net/sfc/sfc_mae.c | 40 +++++++++++++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index 65d52d5551..e367ddd6e6 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -194,6 +194,10 @@ Supported pattern items (***transfer*** rules): - ETH +Supported actions (***transfer*** rules): + +- PHY_PORT + Validating flow rules depends on the firmware variant. The :ref:`flow_isolated_mode` is supported. diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 95f8cffc27..057eef537b 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -391,18 +391,50 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, } static int -sfc_mae_rule_parse_action(const struct rte_flow_action *action, - __rte_unused efx_mae_actions_t *spec, +sfc_mae_rule_parse_action_phy_port(struct sfc_adapter *sa, + const struct rte_flow_action_phy_port *conf, + efx_mae_actions_t *spec) +{ + efx_mport_sel_t mport; + uint32_t phy_port; + int rc; + + if (conf->original != 0) + phy_port = efx_nic_cfg_get(sa->nic)->enc_assigned_port; + else + phy_port = conf->index; + + rc = efx_mae_mport_by_phy_port(phy_port, &mport); + if (rc != 0) + return rc; + + return efx_mae_action_set_populate_deliver(spec, &mport); +} + +static int +sfc_mae_rule_parse_action(struct sfc_adapter *sa, + const struct rte_flow_action *action, + efx_mae_actions_t *spec, struct rte_flow_error *error) { + int rc; + switch (action->type) { + case RTE_FLOW_ACTION_TYPE_PHY_PORT: + rc = sfc_mae_rule_parse_action_phy_port(sa, action->conf, spec); + break; default: return rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION, NULL, "Unsupported action"); } - return 0; + if (rc != 0) { + rc = rte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_ACTION, + NULL, "Failed to request the action"); + } + + return rc; } int @@ -427,7 +459,7 @@ sfc_mae_rule_parse_actions(struct sfc_adapter *sa, for (action = actions; action->type != RTE_FLOW_ACTION_TYPE_END; ++action) { - rc = sfc_mae_rule_parse_action(action, spec, error); + rc = sfc_mae_rule_parse_action(sa, action, spec, error); if (rc != 0) goto fail_rule_parse_action; } From patchwork Tue Oct 20 08:47:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81457 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id D978AA04DD; Tue, 20 Oct 2020 10:54:11 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 5F5FCBC70; Tue, 20 Oct 2020 10:49:26 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id ED3DBBAE8 for ; Tue, 20 Oct 2020 10:49:01 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.64]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 6D6D760065 for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from us4-mdac16-7.ut7.mdlocal (unknown [10.7.65.75]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 6D2362009B for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 93CC1220059 for ; Tue, 20 Oct 2020 08:48:59 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 4AD35800062 for ; Tue, 20 Oct 2020 08:48:59 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnED030805; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id DC401161A29; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:49 +0100 Message-ID: <1603183709-23420-23-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.680600-8.000000-10 X-TMASE-MatchedRID: gHywlMxUaS81GZ9TGM7jyNn6L+08IS/JaeMaKzvXUpljLp8Cm8vwF12O RX0B8+qTT1fsjZmF+qzm9S/0eIQUb+ox2xGkyLxhPwKTD1v8YV4g/CIfleX9D4u6fTXJM2TrnwU 5R7PZjEDlYBLfdrVGsrhBG67QbFtPiY0ks2jt4DUSEYfcJF0pRVM8G40owbvKmHjEz2gByy0gn/ O0NIpJQharc1A+dQFXmgkBQZxiv26gydWvvusR8Q97mDMXdNW3XGjQf7uckKsj/yLgNf/wtqPFj JEFr+olwXCBO/GKkVqOhzOa6g8KrRXw1IZPH7ExGiwbeeKdGafy1369J6Jr77mvuMrZEk59/IwH UI7Tc71zeiBqgfeCGH8kLlzlordGwWVPeiZIToDzBIoA/oOCxoXXmHr+iJs1sqxYnjga4QY83Fq 7f38GK0XAdmaT51YyUOfq31Q4JR+UTGVAhB5EbQ== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-1.680600-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183740-FcvzayEiOCT8 X-PPE-DISP: 1603183740;FcvzayEiOCT8 Subject: [dpdk-dev] [PATCH 22/62] common/sfc_efx/base: add MAE action set provisioning APIs X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov The patch adds APIs for action set allocation / release. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 20 +++ drivers/common/sfc_efx/base/efx_mae.c | 128 ++++++++++++++++++ .../sfc_efx/rte_common_sfc_efx_version.map | 2 + 3 files changed, 150 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 6f63a6ecd0..3053da75f8 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4191,6 +4191,26 @@ efx_mae_match_specs_class_cmp( __in const efx_mae_match_spec_t *right, __out boolean_t *have_same_classp); +#define EFX_MAE_RSRC_ID_INVALID UINT32_MAX + +/* Action set ID */ +typedef struct efx_mae_aset_id_s { + uint32_t id; +} efx_mae_aset_id_t; + +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_action_set_alloc( + __in efx_nic_t *enp, + __in const efx_mae_actions_t *spec, + __out efx_mae_aset_id_t *aset_idp); + +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_action_set_free( + __in efx_nic_t *enp, + __in const efx_mae_aset_id_t *aset_idp); + #endif /* EFSYS_OPT_MAE */ #ifdef __cplusplus diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index 47611c4397..2626710216 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -886,4 +886,132 @@ efx_mae_match_specs_class_cmp( return (rc); } + __checkReturn efx_rc_t +efx_mae_action_set_alloc( + __in efx_nic_t *enp, + __in const efx_mae_actions_t *spec, + __out efx_mae_aset_id_t *aset_idp) +{ + const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp); + efx_mcdi_req_t req; + EFX_MCDI_DECLARE_BUF(payload, + MC_CMD_MAE_ACTION_SET_ALLOC_IN_LEN, + MC_CMD_MAE_ACTION_SET_ALLOC_OUT_LEN); + efx_mae_aset_id_t aset_id; + efx_rc_t rc; + + if (encp->enc_mae_supported == B_FALSE) { + rc = ENOTSUP; + goto fail1; + } + + req.emr_cmd = MC_CMD_MAE_ACTION_SET_ALLOC; + req.emr_in_buf = payload; + req.emr_in_length = MC_CMD_MAE_ACTION_SET_ALLOC_IN_LEN; + req.emr_out_buf = payload; + req.emr_out_length = MC_CMD_MAE_ACTION_SET_ALLOC_OUT_LEN; + + /* + * TODO: Remove these EFX_MAE_RSRC_ID_INVALID assignments once the + * corresponding resource types are supported by the implementation. + * Use proper resource ID assignments instead. + */ + MCDI_IN_SET_DWORD(req, + MAE_ACTION_SET_ALLOC_IN_COUNTER_LIST_ID, EFX_MAE_RSRC_ID_INVALID); + MCDI_IN_SET_DWORD(req, + MAE_ACTION_SET_ALLOC_IN_COUNTER_ID, EFX_MAE_RSRC_ID_INVALID); + MCDI_IN_SET_DWORD(req, + MAE_ACTION_SET_ALLOC_IN_ENCAP_HEADER_ID, EFX_MAE_RSRC_ID_INVALID); + + MCDI_IN_SET_DWORD(req, + MAE_ACTION_SET_ALLOC_IN_DELIVER, spec->emass_deliver_mport.sel); + + MCDI_IN_SET_DWORD(req, MAE_ACTION_SET_ALLOC_IN_SRC_MAC_ID, + MC_CMD_MAE_MAC_ADDR_ALLOC_OUT_MAC_ID_NULL); + MCDI_IN_SET_DWORD(req, MAE_ACTION_SET_ALLOC_IN_DST_MAC_ID, + MC_CMD_MAE_MAC_ADDR_ALLOC_OUT_MAC_ID_NULL); + + efx_mcdi_execute(enp, &req); + + if (req.emr_rc != 0) { + rc = req.emr_rc; + goto fail2; + } + + if (req.emr_out_length_used < MC_CMD_MAE_ACTION_SET_ALLOC_OUT_LEN) { + rc = EMSGSIZE; + goto fail3; + } + + aset_id.id = MCDI_OUT_DWORD(req, MAE_ACTION_SET_ALLOC_OUT_AS_ID); + if (aset_id.id == EFX_MAE_RSRC_ID_INVALID) { + rc = ENOENT; + goto fail4; + } + + aset_idp->id = aset_id.id; + + return (0); + +fail4: + EFSYS_PROBE(fail4); +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + + __checkReturn efx_rc_t +efx_mae_action_set_free( + __in efx_nic_t *enp, + __in const efx_mae_aset_id_t *aset_idp) +{ + const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp); + efx_mcdi_req_t req; + EFX_MCDI_DECLARE_BUF(payload, + MC_CMD_MAE_ACTION_SET_FREE_IN_LEN(1), + MC_CMD_MAE_ACTION_SET_FREE_OUT_LEN(1)); + efx_rc_t rc; + + if (encp->enc_mae_supported == B_FALSE) { + rc = ENOTSUP; + goto fail1; + } + + req.emr_cmd = MC_CMD_MAE_ACTION_SET_FREE; + req.emr_in_buf = payload; + req.emr_in_length = MC_CMD_MAE_ACTION_SET_FREE_IN_LEN(1); + req.emr_out_buf = payload; + req.emr_out_length = MC_CMD_MAE_ACTION_SET_FREE_OUT_LEN(1); + + MCDI_IN_SET_DWORD(req, MAE_ACTION_SET_FREE_IN_AS_ID, aset_idp->id); + + efx_mcdi_execute(enp, &req); + + if (req.emr_rc != 0) { + rc = req.emr_rc; + goto fail2; + } + + if (MCDI_OUT_DWORD(req, MAE_ACTION_SET_FREE_OUT_FREED_AS_ID) != + aset_idp->id) { + /* Firmware failed to free the action set. */ + rc = EAGAIN; + goto fail3; + } + + return (0); + +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + #endif /* EFSYS_OPT_MAE */ diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index d2a5d58ae8..643b3bab52 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -85,6 +85,8 @@ INTERNAL { efx_mac_stats_upload; efx_mac_up; + efx_mae_action_set_alloc; + efx_mae_action_set_free; efx_mae_action_set_populate_deliver; efx_mae_action_set_spec_fini; efx_mae_action_set_spec_init; From patchwork Tue Oct 20 08:47:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81455 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 00C9DA04DD; Tue, 20 Oct 2020 10:53:25 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 46458BC4A; Tue, 20 Oct 2020 10:49:23 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id B72EFAD3B for ; Tue, 20 Oct 2020 10:49:00 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 891D46007D for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from us4-mdac16-62.ut7.mdlocal (unknown [10.7.66.61]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 886982009A for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 14EDE1C0052 for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id BF149A80061 for ; Tue, 20 Oct 2020 08:48:59 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mn1Q030804; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id E9E25161A2F; Tue, 20 Oct 2020 09:48:48 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:50 +0100 Message-ID: <1603183709-23420-24-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.765400-8.000000-10 X-TMASE-MatchedRID: qR7nF2Wf8maEQeXrAUW/pxIRh9wkXSlFE02Pr4CkNSNwkdIrVt8X1VDT Kayi2ZF6pVG0HeSt+ryWGRCs++FM0t1RkEnBFAu+nFVnNmvv47vr3E41VlKsfazG9MIKeG/GOvC 9T24J5iZONuFTUFBeosbWIXMKWGPD0rn1NhBG2mEJaVZHbbd1rlQhqd4OP4Y7R2YNIFh+clHT/p FzauZLmV963OSi68sDFYtQn4h9SJQE7MuQrZP2o8ewkPVzkoGNqb3/o5s+OcO1E+HbdRuHYHd7b ci/LVuNdR9IuTvvB94PtqKIlA3hYsP8NSaeQRaaF9p7X9UAWGXcVi8qZmJWcxyFieO3WgdPThZS O8+zLqri8zVgXoAltsIJ+4gwXrEtWBd6ltyXuvujVG9LmisBxiFPLfnXbHE3XVNNLRBUfo1NlL6 BDHKPHE1HNRS7aAPNxQ+L0GDp1PKSsD7S3Gb632eM/fhCMOLfrJ/dTZLPtW69Tbikt9AWZ0CBSG S7bIBtA1B/p1SzcogrKiD/U8b7SaNbPJBuvLaLftwZ3X11IV0= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-0.765400-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183740-sFvHcfi11y70 X-PPE-DISP: 1603183740;sFvHcfi11y70 Subject: [dpdk-dev] [PATCH 23/62] common/sfc_efx/base: add MAE action rule provisioning APIs X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add APIs for action rule insert / remove operations. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 29 ++++ drivers/common/sfc_efx/base/efx_mae.c | 150 ++++++++++++++++++ .../sfc_efx/rte_common_sfc_efx_version.map | 2 + 3 files changed, 181 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 3053da75f8..d37850eda6 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4193,6 +4193,11 @@ efx_mae_match_specs_class_cmp( #define EFX_MAE_RSRC_ID_INVALID UINT32_MAX +/* Rule ID */ +typedef struct efx_mae_rule_id_s { + uint32_t id; +} efx_mae_rule_id_t; + /* Action set ID */ typedef struct efx_mae_aset_id_s { uint32_t id; @@ -4211,6 +4216,30 @@ efx_mae_action_set_free( __in efx_nic_t *enp, __in const efx_mae_aset_id_t *aset_idp); +/* Action set list ID */ +typedef struct efx_mae_aset_list_id_s { + uint32_t id; +} efx_mae_aset_list_id_t; + +/* + * Either action set list ID or action set ID must be passed to this API, + * but not both. + */ +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_action_rule_insert( + __in efx_nic_t *enp, + __in const efx_mae_match_spec_t *spec, + __in const efx_mae_aset_list_id_t *asl_idp, + __in const efx_mae_aset_id_t *as_idp, + __out efx_mae_rule_id_t *ar_idp); + +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_action_rule_remove( + __in efx_nic_t *enp, + __in const efx_mae_rule_id_t *ar_idp); + #endif /* EFSYS_OPT_MAE */ #ifdef __cplusplus diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index 2626710216..1715cdc4fb 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -1005,6 +1005,156 @@ efx_mae_action_set_free( return (0); +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + + __checkReturn efx_rc_t +efx_mae_action_rule_insert( + __in efx_nic_t *enp, + __in const efx_mae_match_spec_t *spec, + __in const efx_mae_aset_list_id_t *asl_idp, + __in const efx_mae_aset_id_t *as_idp, + __out efx_mae_rule_id_t *ar_idp) +{ + const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp); + efx_mcdi_req_t req; + EFX_MCDI_DECLARE_BUF(payload, + MC_CMD_MAE_ACTION_RULE_INSERT_IN_LENMAX_MCDI2, + MC_CMD_MAE_ACTION_RULE_INSERT_OUT_LEN); + efx_oword_t *rule_response; + efx_mae_rule_id_t ar_id; + size_t offset; + efx_rc_t rc; + + EFX_STATIC_ASSERT(sizeof (ar_idp->id) == + MC_CMD_MAE_ACTION_RULE_INSERT_OUT_AR_ID_LEN); + + EFX_STATIC_ASSERT(EFX_MAE_RSRC_ID_INVALID == + MC_CMD_MAE_ACTION_RULE_INSERT_OUT_ACTION_RULE_ID_NULL); + + if (encp->enc_mae_supported == B_FALSE) { + rc = ENOTSUP; + goto fail1; + } + + if (spec->emms_type != EFX_MAE_RULE_ACTION || + (asl_idp != NULL && as_idp != NULL) || + (asl_idp == NULL && as_idp == NULL)) { + rc = EINVAL; + goto fail2; + } + + req.emr_cmd = MC_CMD_MAE_ACTION_RULE_INSERT; + req.emr_in_buf = payload; + req.emr_in_length = MC_CMD_MAE_ACTION_RULE_INSERT_IN_LENMAX_MCDI2; + req.emr_out_buf = payload; + req.emr_out_length = MC_CMD_MAE_ACTION_RULE_INSERT_OUT_LEN; + + EFX_STATIC_ASSERT(sizeof (*rule_response) <= + MC_CMD_MAE_ACTION_RULE_INSERT_IN_RESPONSE_LEN); + offset = MC_CMD_MAE_ACTION_RULE_INSERT_IN_RESPONSE_OFST; + rule_response = (efx_oword_t *)(payload + offset); + EFX_POPULATE_OWORD_3(*rule_response, + MAE_ACTION_RULE_RESPONSE_ASL_ID, + (asl_idp != NULL) ? asl_idp->id : EFX_MAE_RSRC_ID_INVALID, + MAE_ACTION_RULE_RESPONSE_AS_ID, + (as_idp != NULL) ? as_idp->id : EFX_MAE_RSRC_ID_INVALID, + MAE_ACTION_RULE_RESPONSE_COUNTER_ID, EFX_MAE_RSRC_ID_INVALID); + + MCDI_IN_SET_DWORD(req, MAE_ACTION_RULE_INSERT_IN_PRIO, spec->emms_prio); + + /* + * Mask-value pairs have been stored in the byte order needed for the + * MCDI request and are thus safe to be copied directly to the buffer. + */ + EFX_STATIC_ASSERT(sizeof (spec->emms_mask_value_pairs.action) >= + MAE_FIELD_MASK_VALUE_PAIRS_LEN); + offset = MC_CMD_MAE_ACTION_RULE_INSERT_IN_MATCH_CRITERIA_OFST; + memcpy(payload + offset, spec->emms_mask_value_pairs.action, + MAE_FIELD_MASK_VALUE_PAIRS_LEN); + + efx_mcdi_execute(enp, &req); + + if (req.emr_rc != 0) { + rc = req.emr_rc; + goto fail3; + } + + if (req.emr_out_length_used < MC_CMD_MAE_ACTION_RULE_INSERT_OUT_LEN) { + rc = EMSGSIZE; + goto fail4; + } + + ar_id.id = MCDI_OUT_DWORD(req, MAE_ACTION_RULE_INSERT_OUT_AR_ID); + if (ar_id.id == EFX_MAE_RSRC_ID_INVALID) { + rc = ENOENT; + goto fail5; + } + + ar_idp->id = ar_id.id; + + return (0); + +fail5: + EFSYS_PROBE(fail5); +fail4: + EFSYS_PROBE(fail4); +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + + __checkReturn efx_rc_t +efx_mae_action_rule_remove( + __in efx_nic_t *enp, + __in const efx_mae_rule_id_t *ar_idp) +{ + const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp); + efx_mcdi_req_t req; + EFX_MCDI_DECLARE_BUF(payload, + MC_CMD_MAE_ACTION_RULE_DELETE_IN_LEN(1), + MC_CMD_MAE_ACTION_RULE_DELETE_OUT_LEN(1)); + efx_rc_t rc; + + if (encp->enc_mae_supported == B_FALSE) { + rc = ENOTSUP; + goto fail1; + } + + req.emr_cmd = MC_CMD_MAE_ACTION_RULE_DELETE; + req.emr_in_buf = payload; + req.emr_in_length = MC_CMD_MAE_ACTION_RULE_DELETE_IN_LEN(1); + req.emr_out_buf = payload; + req.emr_out_length = MC_CMD_MAE_ACTION_RULE_DELETE_OUT_LEN(1); + + MCDI_IN_SET_DWORD(req, MAE_ACTION_RULE_DELETE_IN_AR_ID, ar_idp->id); + + efx_mcdi_execute(enp, &req); + + if (req.emr_rc != 0) { + rc = req.emr_rc; + goto fail2; + } + + if (MCDI_OUT_DWORD(req, MAE_ACTION_RULE_DELETE_OUT_DELETED_AR_ID) != + ar_idp->id) { + /* Firmware failed to delete the action rule. */ + rc = EAGAIN; + goto fail3; + } + + return (0); + fail3: EFSYS_PROBE(fail3); fail2: diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index 643b3bab52..0e0d058c8f 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -85,6 +85,8 @@ INTERNAL { efx_mac_stats_upload; efx_mac_up; + efx_mae_action_rule_insert; + efx_mae_action_rule_remove; efx_mae_action_set_alloc; efx_mae_action_set_free; efx_mae_action_set_populate_deliver; From patchwork Tue Oct 20 08:47:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81465 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id CBC42A04DD; Tue, 20 Oct 2020 10:57:08 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id DCDF4BCF7; Tue, 20 Oct 2020 10:49:37 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id EFAC0BAE8 for ; Tue, 20 Oct 2020 10:49:01 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.62]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 7B8A96006B for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from us4-mdac16-29.ut7.mdlocal (unknown [10.7.66.139]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 7BE3C8009B for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 0103B280050 for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id AAD03800060 for ; Tue, 20 Oct 2020 08:48:59 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnHt030800; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 02FB9161A60; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:51 +0100 Message-ID: <1603183709-23420-25-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-2.982400-8.000000-10 X-TMASE-MatchedRID: dVzadZCF5tYlz4C9OtA2e5gGnz93PV93BGwExtNOAA9wkdIrVt8X1ciT Wug2C4DNNNN0dk/lb45w5T4Iaj538mJZXQNDzktSGjzBgnFZvQ7DAPSbMWlGt1FbgxCd+zKGPrj aiRilgiwMZr+lYNb/8r63P8J12sUXOEtsg517d6TnZxuPj9aY+2BEcY81WiodkaEC8FJraL9EVs 72CfOZxwwWw3YfEYiZM28UTYAOM135s5ZGHFKFGFPYbfHD41eOCiTOKJLx+V5PVK5ftmf2maPFj JEFr+olwXCBO/GKkVqOhzOa6g8Krc1kOIDM//a900biN6gSpxWpzOixtNvOCnUihSSgJn/Y49tz u/xkfOID0yiSYmyK5oxGLNNcqzA5Ci1Ldcdy6zi0LcoC+AhqUoXXmHr+iJs1sqxYnjga4QY83Fq 7f38GK0XAdmaT51YyUOfq31Q4JR9nIxZyJs78kg== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-2.982400-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183740-nVI3s5o9iPsJ X-PPE-DISP: 1603183740;nVI3s5o9iPsJ Subject: [dpdk-dev] [PATCH 24/62] net/sfc: implement flow insert/remove in MAE backend X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Exercise action set allocation / release and action rule insertion / removal in order to let flow API callers actually get created flows functioning. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/net/sfc/sfc_flow.c | 5 +- drivers/net/sfc/sfc_flow.h | 2 + drivers/net/sfc/sfc_mae.c | 108 +++++++++++++++++++++++++++++++++++++ drivers/net/sfc/sfc_mae.h | 12 +++++ 4 files changed, 125 insertions(+), 2 deletions(-) diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c index f4d53bf770..3af95ac8ee 100644 --- a/drivers/net/sfc/sfc_flow.c +++ b/drivers/net/sfc/sfc_flow.c @@ -50,8 +50,8 @@ static const struct sfc_flow_ops_by_spec sfc_flow_ops_mae = { .parse = sfc_flow_parse_rte_to_mae, .verify = sfc_mae_flow_verify, .cleanup = sfc_mae_flow_cleanup, - .insert = NULL, - .remove = NULL, + .insert = sfc_mae_flow_insert, + .remove = sfc_mae_flow_remove, }; static const struct sfc_flow_ops_by_spec * @@ -1202,6 +1202,7 @@ sfc_flow_parse_attr(struct sfc_adapter *sa, spec_mae->priority = attr->priority; spec_mae->match_spec = NULL; spec_mae->action_set = NULL; + spec_mae->rule_id.id = EFX_MAE_RSRC_ID_INVALID; } return 0; diff --git a/drivers/net/sfc/sfc_flow.h b/drivers/net/sfc/sfc_flow.h index 7d15f47e60..d3bdbd5f75 100644 --- a/drivers/net/sfc/sfc_flow.h +++ b/drivers/net/sfc/sfc_flow.h @@ -67,6 +67,8 @@ struct sfc_flow_spec_mae { efx_mae_match_spec_t *match_spec; /* Action set registry entry */ struct sfc_mae_action_set *action_set; + /* Firmware-allocated rule ID */ + efx_mae_rule_id_t rule_id; }; /* Flow specification */ diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 057eef537b..ea15ccaedb 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -113,6 +113,8 @@ sfc_mae_action_set_add(struct sfc_adapter *sa, action_set->refcnt = 1; action_set->spec = spec; + action_set->fw_rsrc.aset_id.id = EFX_MAE_RSRC_ID_INVALID; + TAILQ_INSERT_TAIL(&mae->action_sets, action_set, entries); *action_setp = action_set; @@ -134,11 +136,62 @@ sfc_mae_action_set_del(struct sfc_adapter *sa, if (action_set->refcnt != 0) return; + SFC_ASSERT(action_set->fw_rsrc.aset_id.id == EFX_MAE_RSRC_ID_INVALID); + SFC_ASSERT(action_set->fw_rsrc.refcnt == 0); + efx_mae_action_set_spec_fini(sa->nic, action_set->spec); TAILQ_REMOVE(&mae->action_sets, action_set, entries); rte_free(action_set); } +static int +sfc_mae_action_set_enable(struct sfc_adapter *sa, + struct sfc_mae_action_set *action_set) +{ + struct sfc_mae_fw_rsrc *fw_rsrc = &action_set->fw_rsrc; + int rc; + + SFC_ASSERT(sfc_adapter_is_locked(sa)); + + if (fw_rsrc->refcnt == 0) { + SFC_ASSERT(fw_rsrc->aset_id.id == EFX_MAE_RSRC_ID_INVALID); + SFC_ASSERT(action_set->spec != NULL); + + rc = efx_mae_action_set_alloc(sa->nic, action_set->spec, + &fw_rsrc->aset_id); + if (rc != 0) + return rc; + } + + ++(fw_rsrc->refcnt); + + return 0; +} + +static int +sfc_mae_action_set_disable(struct sfc_adapter *sa, + struct sfc_mae_action_set *action_set) +{ + struct sfc_mae_fw_rsrc *fw_rsrc = &action_set->fw_rsrc; + int rc; + + SFC_ASSERT(sfc_adapter_is_locked(sa)); + SFC_ASSERT(fw_rsrc->aset_id.id != EFX_MAE_RSRC_ID_INVALID); + SFC_ASSERT(fw_rsrc->refcnt != 0); + + if (fw_rsrc->refcnt == 1) { + rc = efx_mae_action_set_free(sa->nic, &fw_rsrc->aset_id); + if (rc != 0) + return rc; + + fw_rsrc->aset_id.id = EFX_MAE_RSRC_ID_INVALID; + } + + --(fw_rsrc->refcnt); + + return 0; +} + void sfc_mae_flow_cleanup(struct sfc_adapter *sa, struct rte_flow *flow) @@ -156,6 +209,8 @@ sfc_mae_flow_cleanup(struct sfc_adapter *sa, spec_mae = &spec->mae; + SFC_ASSERT(spec_mae->rule_id.id == EFX_MAE_RSRC_ID_INVALID); + if (spec_mae->action_set != NULL) sfc_mae_action_set_del(sa, spec_mae->action_set); @@ -563,3 +618,56 @@ sfc_mae_flow_verify(struct sfc_adapter *sa, return sfc_mae_action_rule_class_verify(sa, spec_mae); } + +int +sfc_mae_flow_insert(struct sfc_adapter *sa, + struct rte_flow *flow) +{ + struct sfc_flow_spec *spec = &flow->spec; + struct sfc_flow_spec_mae *spec_mae = &spec->mae; + struct sfc_mae_action_set *action_set = spec_mae->action_set; + struct sfc_mae_fw_rsrc *fw_rsrc = &action_set->fw_rsrc; + int rc; + + SFC_ASSERT(spec_mae->rule_id.id == EFX_MAE_RSRC_ID_INVALID); + SFC_ASSERT(action_set != NULL); + + rc = sfc_mae_action_set_enable(sa, action_set); + if (rc != 0) + goto fail_action_set_enable; + + rc = efx_mae_action_rule_insert(sa->nic, spec_mae->match_spec, + NULL, &fw_rsrc->aset_id, + &spec_mae->rule_id); + if (rc != 0) + goto fail_action_rule_insert; + + return 0; + +fail_action_rule_insert: + (void)sfc_mae_action_set_disable(sa, action_set); + +fail_action_set_enable: + return rc; +} + +int +sfc_mae_flow_remove(struct sfc_adapter *sa, + struct rte_flow *flow) +{ + struct sfc_flow_spec *spec = &flow->spec; + struct sfc_flow_spec_mae *spec_mae = &spec->mae; + struct sfc_mae_action_set *action_set = spec_mae->action_set; + int rc; + + SFC_ASSERT(spec_mae->rule_id.id != EFX_MAE_RSRC_ID_INVALID); + SFC_ASSERT(action_set != NULL); + + rc = efx_mae_action_rule_remove(sa->nic, &spec_mae->rule_id); + if (rc != 0) + return rc; + + spec_mae->rule_id.id = EFX_MAE_RSRC_ID_INVALID; + + return sfc_mae_action_set_disable(sa, action_set); +} diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index 1ef582e82b..d9f0ee3cbc 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -18,11 +18,21 @@ extern "C" { #endif +/** FW-allocatable resource context */ +struct sfc_mae_fw_rsrc { + unsigned int refcnt; + RTE_STD_C11 + union { + efx_mae_aset_id_t aset_id; + }; +}; + /** Action set registry entry */ struct sfc_mae_action_set { TAILQ_ENTRY(sfc_mae_action_set) entries; unsigned int refcnt; efx_mae_actions_t *spec; + struct sfc_mae_fw_rsrc fw_rsrc; }; TAILQ_HEAD(sfc_mae_action_sets, sfc_mae_action_set); @@ -63,6 +73,8 @@ int sfc_mae_rule_parse_actions(struct sfc_adapter *sa, struct sfc_mae_action_set **action_setp, struct rte_flow_error *error); sfc_flow_verify_cb_t sfc_mae_flow_verify; +sfc_flow_insert_cb_t sfc_mae_flow_insert; +sfc_flow_remove_cb_t sfc_mae_flow_remove; #ifdef __cplusplus } From patchwork Tue Oct 20 08:47:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81458 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 41125A04DD; Tue, 20 Oct 2020 10:54:31 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D9473BC9E; Tue, 20 Oct 2020 10:49:27 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 967A5AD31 for ; Tue, 20 Oct 2020 10:49:01 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.62]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 275DB6004F for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from us4-mdac16-25.ut7.mdlocal (unknown [10.7.65.251]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 280EA8009B for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id A906128004D for ; Tue, 20 Oct 2020 08:48:59 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 5F2DBA80061 for ; Tue, 20 Oct 2020 08:48:59 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnHx030800; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 0FF83161D42; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:52 +0100 Message-ID: <1603183709-23420-26-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-3.402300-8.000000-10 X-TMASE-MatchedRID: S7VGIvJZFFl1zuUvhONl81ftSkmEYHZiWNbBpQ++I1lwkdIrVt8X1VDT Kayi2ZF6pVG0HeSt+ryWGRCs++FM0t1RkEnBFAu+nFVnNmvv47uWODD/yzpvd7Zk7gsuflVKajy hX70MWYEaArPy7J2TRUQAYu+Zw/VJ0ywZEqbRuQQaPMGCcVm9DjVfUuzvrtymR2YNIFh+clFwmP /re/Fv5vtPFmJbG+2sXJFotwJumW5kihO6QdpZxZ4CIKY/Hg3AGdQnQSTrKGPEQdG7H66TyHEqm 8QYBtMO4O/iGw8qRmQJQheewnrWPK2gVRXQiAPDumqcaPkiPDv4MQw3pXdafVJ+vnzb7hsYR8ba 7yWJKLC33T9ZB6r8Qvv0bC9D3tKsk3UkV5Qp4wSI45Rd9ORJwFlJvEhEss3fzQahrdQz77w= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--3.402300-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183740-JWubr8X-1n-V X-PPE-DISP: 1603183740;JWubr8X-1n-V Subject: [dpdk-dev] [PATCH 25/62] common/sfc_efx/base: support adding VLAN POP action to a set X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov MAE supports stripping two tags, so this action can be requested once or twice. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 5 ++ drivers/common/sfc_efx/base/efx_impl.h | 7 +++ drivers/common/sfc_efx/base/efx_mae.c | 54 ++++++++++++++++++- .../sfc_efx/rte_common_sfc_efx_version.map | 1 + 4 files changed, 66 insertions(+), 1 deletion(-) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index d37850eda6..17bfc6fdfd 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4166,6 +4166,11 @@ efx_mae_action_set_spec_fini( __in efx_nic_t *enp, __in efx_mae_actions_t *spec); +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_action_set_populate_vlan_pop( + __in efx_mae_actions_t *spec); + LIBEFX_API extern __checkReturn efx_rc_t efx_mae_action_set_populate_deliver( diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h index 927324c85c..abd7f78cc2 100644 --- a/drivers/common/sfc_efx/base/efx_impl.h +++ b/drivers/common/sfc_efx/base/efx_impl.h @@ -1700,16 +1700,23 @@ struct efx_mae_match_spec_s { }; typedef enum efx_mae_action_e { + /* These actions are strictly ordered. */ + EFX_MAE_ACTION_VLAN_POP, + /* DELIVER is always the last action. */ EFX_MAE_ACTION_DELIVER, EFX_MAE_NACTIONS } efx_mae_action_t; +/* MAE VLAN_POP action can handle 1 or 2 tags. */ +#define EFX_MAE_VLAN_POP_MAX_NTAGS (2) + typedef struct efx_mae_actions_s { /* Bitmap of actions in spec, indexed by action type */ uint32_t emass_actions; + unsigned int emass_n_vlan_tags_to_pop; efx_mport_sel_t emass_deliver_mport; } efx_mae_actions_t; diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index 1715cdc4fb..0465ddf923 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -641,6 +641,42 @@ efx_mae_action_set_spec_fini( EFSYS_KMEM_FREE(enp->en_esip, sizeof (*spec), spec); } +static __checkReturn efx_rc_t +efx_mae_action_set_add_vlan_pop( + __in efx_mae_actions_t *spec, + __in size_t arg_size, + __in_bcount(arg_size) const uint8_t *arg) +{ + efx_rc_t rc; + + if (arg_size != 0) { + rc = EINVAL; + goto fail1; + } + + if (arg != NULL) { + rc = EINVAL; + goto fail2; + } + + if (spec->emass_n_vlan_tags_to_pop == EFX_MAE_VLAN_POP_MAX_NTAGS) { + rc = ENOTSUP; + goto fail3; + } + + ++spec->emass_n_vlan_tags_to_pop; + + return (0); + +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + static __checkReturn efx_rc_t efx_mae_action_set_add_deliver( __in efx_mae_actions_t *spec, @@ -677,15 +713,20 @@ typedef struct efx_mae_action_desc_s { } efx_mae_action_desc_t; static const efx_mae_action_desc_t efx_mae_actions[EFX_MAE_NACTIONS] = { + [EFX_MAE_ACTION_VLAN_POP] = { + .emad_add = efx_mae_action_set_add_vlan_pop + }, [EFX_MAE_ACTION_DELIVER] = { .emad_add = efx_mae_action_set_add_deliver } }; static const uint32_t efx_mae_action_ordered_map = + (1U << EFX_MAE_ACTION_VLAN_POP) | (1U << EFX_MAE_ACTION_DELIVER); -static const uint32_t efx_mae_action_repeat_map = 0; +static const uint32_t efx_mae_action_repeat_map = + (1U << EFX_MAE_ACTION_VLAN_POP); /* * Add an action to an action set. @@ -759,6 +800,14 @@ efx_mae_action_set_spec_populate( return (rc); } + __checkReturn efx_rc_t +efx_mae_action_set_populate_vlan_pop( + __in efx_mae_actions_t *spec) +{ + return (efx_mae_action_set_spec_populate(spec, + EFX_MAE_ACTION_VLAN_POP, 0, NULL)); +} + __checkReturn efx_rc_t efx_mae_action_set_populate_deliver( __in efx_mae_actions_t *spec, @@ -923,6 +972,9 @@ efx_mae_action_set_alloc( MCDI_IN_SET_DWORD(req, MAE_ACTION_SET_ALLOC_IN_ENCAP_HEADER_ID, EFX_MAE_RSRC_ID_INVALID); + MCDI_IN_SET_DWORD_FIELD(req, MAE_ACTION_SET_ALLOC_IN_FLAGS, + MAE_ACTION_SET_ALLOC_IN_VLAN_POP, spec->emass_n_vlan_tags_to_pop); + MCDI_IN_SET_DWORD(req, MAE_ACTION_SET_ALLOC_IN_DELIVER, spec->emass_deliver_mport.sel); diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index 0e0d058c8f..41c14c6451 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -90,6 +90,7 @@ INTERNAL { efx_mae_action_set_alloc; efx_mae_action_set_free; efx_mae_action_set_populate_deliver; + efx_mae_action_set_populate_vlan_pop; efx_mae_action_set_spec_fini; efx_mae_action_set_spec_init; efx_mae_action_set_specs_equal; From patchwork Tue Oct 20 08:47:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81464 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id C4669A04DD; Tue, 20 Oct 2020 10:56:44 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 87B2ABCED; Tue, 20 Oct 2020 10:49:36 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 918BBBBAC for ; Tue, 20 Oct 2020 10:49:01 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 59F4E6007D for ; Tue, 20 Oct 2020 08:49:01 +0000 (UTC) Received: from us4-mdac16-2.ut7.mdlocal (unknown [10.7.65.70]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 592148009E for ; Tue, 20 Oct 2020 08:49:01 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id D676F80058 for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 8AFBCA8006D for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mn1S030804; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 1D1D0161FED; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:53 +0100 Message-ID: <1603183709-23420-27-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.067200-8.000000-10 X-TMASE-MatchedRID: XMfli/cuq0HdIRGyAS5sdS2416nc3bQleouvej40T4gd0WOKRkwsh3Io zGa69omdrdoLblq9S5oV+ztbPoSlM0jn8cIz0h4xz/7rpiFAj3/a7cYOG/sK7PYENPLTaMhvg7l N9LOvFDvgqJdxbFFLCoAy6p60ZV62fJ5/bZ6npdiujVRFkkVsm27e9AUnq8AZXVJ4nsSYzb7RWM xRezdqyg67qdZjgJpna2HotMZ0GXdzkFE209/UHsAbGNP26M+3aDetRkH5ikNpCNFzpNRBRPDsn HBTQS9kyoRE4tv/7I7j/Qm+fSvAAma0vgPD7M1vQP8wh/06uR0= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-0.067200-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183741-STQgxOXXndj8 X-PPE-DISP: 1603183741;STQgxOXXndj8 Subject: [dpdk-dev] [PATCH 26/62] net/sfc: support flow action OF POP VLAN in MAE backend X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov This action is supported only for rules which have transfer attribute, and can be requested once or twice per a rule. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 2 ++ drivers/net/sfc/sfc_mae.c | 3 +++ 2 files changed, 5 insertions(+) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index e367ddd6e6..ed9fc9d845 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -196,6 +196,8 @@ Supported pattern items (***transfer*** rules): Supported actions (***transfer*** rules): +- OF_POP_VLAN + - PHY_PORT Validating flow rules depends on the firmware variant. diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index ea15ccaedb..a86a22ad8f 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -475,6 +475,9 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa, int rc; switch (action->type) { + case RTE_FLOW_ACTION_TYPE_OF_POP_VLAN: + rc = efx_mae_action_set_populate_vlan_pop(spec); + break; case RTE_FLOW_ACTION_TYPE_PHY_PORT: rc = sfc_mae_rule_parse_action_phy_port(sa, action->conf, spec); break; From patchwork Tue Oct 20 08:47:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81460 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 76E80A04DD; Tue, 20 Oct 2020 10:55:16 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id ED4FCBCB8; Tue, 20 Oct 2020 10:49:30 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 8B223BBAA for ; Tue, 20 Oct 2020 10:49:01 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 55E5260064 for ; Tue, 20 Oct 2020 08:49:01 +0000 (UTC) Received: from us4-mdac16-58.ut7.mdlocal (unknown [10.7.66.29]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 54AD08009E for ; Tue, 20 Oct 2020 08:49:01 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id C1DA080057 for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 778E0800058 for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnEF030805; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 2A4771626D6; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:54 +0100 Message-ID: <1603183709-23420-28-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-2.796200-8.000000-10 X-TMASE-MatchedRID: Dii45QCc2NPH5iAYeUHi/ttuAjgC5ilXaeMaKzvXUpljLp8Cm8vwF12O RX0B8+qTT1fsjZmF+qzm9S/0eIQUb+ox2xGkyLxhfJy8LojR0kjr3E41VlKsfSWNjqqHuDcwYX+ IyAfItNG327df8AumkfVfwaij2mkDcj8zE1EjtSTJ1E/nrJFED6LwP+jjbL9KGlfXMQvierdnj1 T6aiJbiTxOxTEbgyTygDLqnrRlXrZ8nn9tnqel2MZW5ai5WKly6A5JxZfWar4OVYgg/wEijrUop RlZNGnwxxjQ24oPSXZfZjHUNbp9+QKViM8Od6AtdUpw8qdCaF3hb3AVhSCVwQpZzc5ufJRN8Oyc cFNBL2TKhETi2//sjuP9Cb59K8ACZrS+A8PszW/U9h9N881NSQ== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--2.796200-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183741-a7SByNyPsoyL X-PPE-DISP: 1603183741;a7SByNyPsoyL Subject: [dpdk-dev] [PATCH 27/62] common/sfc_efx/base: support adding VLAN PUSH action X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov MAE supports pushing two tags, so this action can be requested once or twice. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 7 ++ drivers/common/sfc_efx/base/efx_impl.h | 12 +++ drivers/common/sfc_efx/base/efx_mae.c | 86 ++++++++++++++++++- .../sfc_efx/rte_common_sfc_efx_version.map | 1 + 4 files changed, 105 insertions(+), 1 deletion(-) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 17bfc6fdfd..193ffff14c 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4171,6 +4171,13 @@ extern __checkReturn efx_rc_t efx_mae_action_set_populate_vlan_pop( __in efx_mae_actions_t *spec); +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_action_set_populate_vlan_push( + __in efx_mae_actions_t *spec, + __in uint16_t tpid_be, + __in uint16_t tci_be); + LIBEFX_API extern __checkReturn efx_rc_t efx_mae_action_set_populate_deliver( diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h index abd7f78cc2..cefbcac93e 100644 --- a/drivers/common/sfc_efx/base/efx_impl.h +++ b/drivers/common/sfc_efx/base/efx_impl.h @@ -1702,6 +1702,7 @@ struct efx_mae_match_spec_s { typedef enum efx_mae_action_e { /* These actions are strictly ordered. */ EFX_MAE_ACTION_VLAN_POP, + EFX_MAE_ACTION_VLAN_PUSH, /* DELIVER is always the last action. */ EFX_MAE_ACTION_DELIVER, @@ -1712,11 +1713,22 @@ typedef enum efx_mae_action_e { /* MAE VLAN_POP action can handle 1 or 2 tags. */ #define EFX_MAE_VLAN_POP_MAX_NTAGS (2) +/* MAE VLAN_PUSH action can handle 1 or 2 tags. */ +#define EFX_MAE_VLAN_PUSH_MAX_NTAGS (2) + +typedef struct efx_mae_action_vlan_push_s { + uint16_t emavp_tpid_be; + uint16_t emavp_tci_be; +} efx_mae_action_vlan_push_t; + typedef struct efx_mae_actions_s { /* Bitmap of actions in spec, indexed by action type */ uint32_t emass_actions; unsigned int emass_n_vlan_tags_to_pop; + unsigned int emass_n_vlan_tags_to_push; + efx_mae_action_vlan_push_t emass_vlan_push_descs[ + EFX_MAE_VLAN_PUSH_MAX_NTAGS]; efx_mport_sel_t emass_deliver_mport; } efx_mae_actions_t; diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index 0465ddf923..b631487645 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -677,6 +677,44 @@ efx_mae_action_set_add_vlan_pop( return (rc); } +static __checkReturn efx_rc_t +efx_mae_action_set_add_vlan_push( + __in efx_mae_actions_t *spec, + __in size_t arg_size, + __in_bcount(arg_size) const uint8_t *arg) +{ + unsigned int n_tags = spec->emass_n_vlan_tags_to_push; + efx_rc_t rc; + + if (arg_size != sizeof (*spec->emass_vlan_push_descs)) { + rc = EINVAL; + goto fail1; + } + + if (arg == NULL) { + rc = EINVAL; + goto fail2; + } + + if (n_tags == EFX_MAE_VLAN_PUSH_MAX_NTAGS) { + rc = ENOTSUP; + goto fail3; + } + + memcpy(&spec->emass_vlan_push_descs[n_tags], arg, arg_size); + ++(spec->emass_n_vlan_tags_to_push); + + return (0); + +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + static __checkReturn efx_rc_t efx_mae_action_set_add_deliver( __in efx_mae_actions_t *spec, @@ -716,6 +754,9 @@ static const efx_mae_action_desc_t efx_mae_actions[EFX_MAE_NACTIONS] = { [EFX_MAE_ACTION_VLAN_POP] = { .emad_add = efx_mae_action_set_add_vlan_pop }, + [EFX_MAE_ACTION_VLAN_PUSH] = { + .emad_add = efx_mae_action_set_add_vlan_push + }, [EFX_MAE_ACTION_DELIVER] = { .emad_add = efx_mae_action_set_add_deliver } @@ -723,10 +764,12 @@ static const efx_mae_action_desc_t efx_mae_actions[EFX_MAE_NACTIONS] = { static const uint32_t efx_mae_action_ordered_map = (1U << EFX_MAE_ACTION_VLAN_POP) | + (1U << EFX_MAE_ACTION_VLAN_PUSH) | (1U << EFX_MAE_ACTION_DELIVER); static const uint32_t efx_mae_action_repeat_map = - (1U << EFX_MAE_ACTION_VLAN_POP); + (1U << EFX_MAE_ACTION_VLAN_POP) | + (1U << EFX_MAE_ACTION_VLAN_PUSH); /* * Add an action to an action set. @@ -808,6 +851,22 @@ efx_mae_action_set_populate_vlan_pop( EFX_MAE_ACTION_VLAN_POP, 0, NULL)); } + __checkReturn efx_rc_t +efx_mae_action_set_populate_vlan_push( + __in efx_mae_actions_t *spec, + __in uint16_t tpid_be, + __in uint16_t tci_be) +{ + efx_mae_action_vlan_push_t action; + const uint8_t *arg = (const uint8_t *)&action; + + action.emavp_tpid_be = tpid_be; + action.emavp_tci_be = tci_be; + + return (efx_mae_action_set_spec_populate(spec, + EFX_MAE_ACTION_VLAN_PUSH, sizeof (action), arg)); +} + __checkReturn efx_rc_t efx_mae_action_set_populate_deliver( __in efx_mae_actions_t *spec, @@ -975,6 +1034,31 @@ efx_mae_action_set_alloc( MCDI_IN_SET_DWORD_FIELD(req, MAE_ACTION_SET_ALLOC_IN_FLAGS, MAE_ACTION_SET_ALLOC_IN_VLAN_POP, spec->emass_n_vlan_tags_to_pop); + if (spec->emass_n_vlan_tags_to_push > 0) { + unsigned int outer_tag_idx; + + MCDI_IN_SET_DWORD_FIELD(req, MAE_ACTION_SET_ALLOC_IN_FLAGS, + MAE_ACTION_SET_ALLOC_IN_VLAN_PUSH, + spec->emass_n_vlan_tags_to_push); + + if (spec->emass_n_vlan_tags_to_push == + EFX_MAE_VLAN_PUSH_MAX_NTAGS) { + MCDI_IN_SET_WORD(req, + MAE_ACTION_SET_ALLOC_IN_VLAN1_PROTO_BE, + spec->emass_vlan_push_descs[0].emavp_tpid_be); + MCDI_IN_SET_WORD(req, + MAE_ACTION_SET_ALLOC_IN_VLAN1_TCI_BE, + spec->emass_vlan_push_descs[0].emavp_tci_be); + } + + outer_tag_idx = spec->emass_n_vlan_tags_to_push - 1; + + MCDI_IN_SET_WORD(req, MAE_ACTION_SET_ALLOC_IN_VLAN0_PROTO_BE, + spec->emass_vlan_push_descs[outer_tag_idx].emavp_tpid_be); + MCDI_IN_SET_WORD(req, MAE_ACTION_SET_ALLOC_IN_VLAN0_TCI_BE, + spec->emass_vlan_push_descs[outer_tag_idx].emavp_tci_be); + } + MCDI_IN_SET_DWORD(req, MAE_ACTION_SET_ALLOC_IN_DELIVER, spec->emass_deliver_mport.sel); diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index 41c14c6451..be11b6ad3c 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -91,6 +91,7 @@ INTERNAL { efx_mae_action_set_free; efx_mae_action_set_populate_deliver; efx_mae_action_set_populate_vlan_pop; + efx_mae_action_set_populate_vlan_push; efx_mae_action_set_spec_fini; efx_mae_action_set_spec_init; efx_mae_action_set_specs_equal; From patchwork Tue Oct 20 08:47:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81483 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 2B6A9A04DD; Tue, 20 Oct 2020 11:04:05 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 749B5C8D4; Tue, 20 Oct 2020 10:50:03 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id B743ABBB4 for ; Tue, 20 Oct 2020 10:49:04 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.62]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 8879360066 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from us4-mdac16-25.ut7.mdlocal (unknown [10.7.65.251]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 87A4D8009B for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.41]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 10B3028004D for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id B82974C0059 for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnmO030803; Tue, 20 Oct 2020 09:48:49 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 3701A1626D8; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:55 +0100 Message-ID: <1603183709-23420-29-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-6.694700-8.000000-10 X-TMASE-MatchedRID: 06MbsPpyjR8jNucrJ/Da40Qiyd+xo4asAPiR4btCEeaRoQLwUmtov+Z5 Gn23AeDZ8XVI39JCRnRuL3ESIrARlyHhSBQfglfsA9lly13c/gFe392/7zQs4B//bz4/xYKAg7l N9LOvFDvbKZq4ZwZRTVeJGcgaXvUTKjPlgWuJZGx0+657dxGJGFm0RpxOMxmR5lhx0mBJyPG9DD 1najpyL0FLaJMiMk4ci/W2oLMQ0YUEGNruDgdTzb09KAokwDFUBtG6netTkaWudK6ZkaOfBPyqd p7+4Qj9KexaoH99e/Qwg/gpNb2sRwXa2B9iG+md+4Fj9EzRyxxgRHGPNVoqHYpc3JtqeiRPeKaj vO6uWnCCukcfrdcoGfibKkET0a8ctLD+nJjWKTgjRwcsjqWGAgEFZ4PF7UrQbRmE6L06upYlXnw 1RqSfcI3FtUIcHUfM/vt4tYKcjeI6NBdUxznZvZCB65RjRY3sjlaPgQwpjaybKItl61J/yZ+inT K0bC9eKrauXd3MZDWg42+KMinH0UFnvntw+nrLyXgwBKCerXIGQ9s44ZGcccCdJ4a5sUpK X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--6.694700-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183744-m2s0K0Iu-HsQ X-PPE-DISP: 1603183744;m2s0K0Iu-HsQ Subject: [dpdk-dev] [PATCH 28/62] net/sfc: add facilities to handle bundles of actions X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov There are MAE actions which do not have uniform counterparts in terms of RTE flow. However, there are bundles of RTE flow actions which can be considered as such counterparts. Implement facilities to handle related RTE flow actions as parts of a whole. These facilities will be used by a later patch to add support for VLAN PUSH actions bundle. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/net/sfc/sfc_flow.c | 4 -- drivers/net/sfc/sfc_flow.h | 4 ++ drivers/net/sfc/sfc_mae.c | 112 ++++++++++++++++++++++++++++++++++++- 3 files changed, 115 insertions(+), 5 deletions(-) diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c index 3af95ac8ee..6ccefef477 100644 --- a/drivers/net/sfc/sfc_flow.c +++ b/drivers/net/sfc/sfc_flow.c @@ -1679,9 +1679,6 @@ sfc_flow_parse_actions(struct sfc_adapter *sa, return -rte_errno; } -#define SFC_BUILD_SET_OVERFLOW(_action, _set) \ - RTE_BUILD_BUG_ON(_action >= sizeof(_set) * CHAR_BIT) - for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) { switch (actions->type) { case RTE_FLOW_ACTION_TYPE_VOID: @@ -1777,7 +1774,6 @@ sfc_flow_parse_actions(struct sfc_adapter *sa, actions_set |= (1UL << actions->type); } -#undef SFC_BUILD_SET_OVERFLOW /* When fate is unknown, drop traffic. */ if ((actions_set & fate_actions_mask) == 0) { diff --git a/drivers/net/sfc/sfc_flow.h b/drivers/net/sfc/sfc_flow.h index d3bdbd5f75..e991ae132c 100644 --- a/drivers/net/sfc/sfc_flow.h +++ b/drivers/net/sfc/sfc_flow.h @@ -26,6 +26,10 @@ extern "C" { */ #define SF_FLOW_SPEC_NB_FILTERS_MAX 8 +/* Used to guard action masks */ +#define SFC_BUILD_SET_OVERFLOW(_action, _set) \ + RTE_BUILD_BUG_ON((_action) >= sizeof(_set) * CHAR_BIT) + /* RSS configuration storage */ struct sfc_flow_rss { unsigned int rxq_hw_index_min; diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index a86a22ad8f..5fbf627f0a 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -445,6 +445,99 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, return rc; } +/* + * An action supported by MAE may correspond to a bundle of RTE flow actions, + * in example, VLAN_PUSH = OF_PUSH_VLAN + OF_VLAN_SET_VID + OF_VLAN_SET_PCP. + * That is, related RTE flow actions need to be tracked as parts of a whole + * so that they can be combined into a single action and submitted to MAE + * representation of a given rule's action set. + * + * Each RTE flow action provided by an application gets classified as + * one belonging to some bundle type. If an action is not supposed to + * belong to any bundle, or if this action is END, it is described as + * one belonging to a dummy bundle of type EMPTY. + * + * A currently tracked bundle will be submitted if a repeating + * action or an action of different bundle type follows. + */ + +enum sfc_mae_actions_bundle_type { + SFC_MAE_ACTIONS_BUNDLE_EMPTY = 0, +}; + +struct sfc_mae_actions_bundle { + enum sfc_mae_actions_bundle_type type; + + /* Indicates actions already tracked by the current bundle */ + uint64_t actions_mask; +}; + +/* + * Combine configuration of RTE flow actions tracked by the bundle into a + * single action and submit the result to MAE action set specification. + * Do nothing in the case of dummy action bundle. + */ +static int +sfc_mae_actions_bundle_submit(const struct sfc_mae_actions_bundle *bundle, + __rte_unused efx_mae_actions_t *spec) +{ + int rc = 0; + + switch (bundle->type) { + case SFC_MAE_ACTIONS_BUNDLE_EMPTY: + break; + default: + SFC_ASSERT(B_FALSE); + break; + } + + return rc; +} + +/* + * Given the type of the next RTE flow action in the line, decide + * whether a new bundle is about to start, and, if this is the case, + * submit and reset the current bundle. + */ +static int +sfc_mae_actions_bundle_sync(const struct rte_flow_action *action, + struct sfc_mae_actions_bundle *bundle, + efx_mae_actions_t *spec, + struct rte_flow_error *error) +{ + enum sfc_mae_actions_bundle_type bundle_type_new; + int rc; + + switch (action->type) { + default: + /* + * Self-sufficient actions, including END, are handled in this + * case. No checks for unsupported actions are needed here + * because parsing doesn't occur at this point. + */ + bundle_type_new = SFC_MAE_ACTIONS_BUNDLE_EMPTY; + break; + } + + if (bundle_type_new != bundle->type || + (bundle->actions_mask & (1ULL << action->type)) != 0) { + rc = sfc_mae_actions_bundle_submit(bundle, spec); + if (rc != 0) + goto fail_submit; + + memset(bundle, 0, sizeof(*bundle)); + } + + bundle->type = bundle_type_new; + + return 0; + +fail_submit: + return rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_ACTION, NULL, + "Failed to request the (group of) action(s)"); +} + static int sfc_mae_rule_parse_action_phy_port(struct sfc_adapter *sa, const struct rte_flow_action_phy_port *conf, @@ -469,6 +562,7 @@ sfc_mae_rule_parse_action_phy_port(struct sfc_adapter *sa, static int sfc_mae_rule_parse_action(struct sfc_adapter *sa, const struct rte_flow_action *action, + struct sfc_mae_actions_bundle *bundle, efx_mae_actions_t *spec, struct rte_flow_error *error) { @@ -476,9 +570,13 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa, switch (action->type) { case RTE_FLOW_ACTION_TYPE_OF_POP_VLAN: + SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_OF_POP_VLAN, + bundle->actions_mask); rc = efx_mae_action_set_populate_vlan_pop(spec); break; case RTE_FLOW_ACTION_TYPE_PHY_PORT: + SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_PHY_PORT, + bundle->actions_mask); rc = sfc_mae_rule_parse_action_phy_port(sa, action->conf, spec); break; default: @@ -490,6 +588,8 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa, if (rc != 0) { rc = rte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_ACTION, NULL, "Failed to request the action"); + } else { + bundle->actions_mask |= (1ULL << action->type); } return rc; @@ -501,6 +601,7 @@ sfc_mae_rule_parse_actions(struct sfc_adapter *sa, struct sfc_mae_action_set **action_setp, struct rte_flow_error *error) { + struct sfc_mae_actions_bundle bundle = {0}; const struct rte_flow_action *action; efx_mae_actions_t *spec; int rc; @@ -517,11 +618,20 @@ sfc_mae_rule_parse_actions(struct sfc_adapter *sa, for (action = actions; action->type != RTE_FLOW_ACTION_TYPE_END; ++action) { - rc = sfc_mae_rule_parse_action(sa, action, spec, error); + rc = sfc_mae_actions_bundle_sync(action, &bundle, spec, error); + if (rc != 0) + goto fail_rule_parse_action; + + rc = sfc_mae_rule_parse_action(sa, action, &bundle, spec, + error); if (rc != 0) goto fail_rule_parse_action; } + rc = sfc_mae_actions_bundle_sync(action, &bundle, spec, error); + if (rc != 0) + goto fail_rule_parse_action; + *action_setp = sfc_mae_action_set_attach(sa, spec); if (*action_setp != NULL) { efx_mae_action_set_spec_fini(sa->nic, spec); From patchwork Tue Oct 20 08:47:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81467 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 433E6A04DD; Tue, 20 Oct 2020 10:58:01 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C654EBE17; Tue, 20 Oct 2020 10:49:40 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 64356BADE for ; Tue, 20 Oct 2020 10:49:03 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.64]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id BC83C6008F for ; Tue, 20 Oct 2020 08:49:01 +0000 (UTC) Received: from us4-mdac16-6.ut7.mdlocal (unknown [10.7.65.74]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id BBD772009B for ; Tue, 20 Oct 2020 08:49:01 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 2C58422004D for ; Tue, 20 Oct 2020 08:49:01 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id D79A4800060 for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnEH030805; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 43FBE1626DA; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:56 +0100 Message-ID: <1603183709-23420-30-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-2.134200-8.000000-10 X-TMASE-MatchedRID: hOKbrLjOKN5EjiOYrUNIqaofqYgF6NV/x+jrF7TzRS0Ajiw/nJICh+Z5 Gn23AeDZ8XVI39JCRnRuL3ESIrARlyHhSBQfglfsA9lly13c/gGH0N4NyO41W7vrYEyMiww4q9V hOmRpTapMhOK98HsSQD9ZNziQoQkP56XkomU2m5X7gWP0TNHLHGtNZoZ5+7ekBCzD0Dc8iUtPH2 OEh/+ebHaalVKfJdYjztJEIiMQkV/ecSkNT7l/2YldKbZsGYatfS0Ip2eEHnz3IzXlXlpamPoLR 4+zsDTtpmd/ehreR4XdibkIw67lEU9bcnLT8dyfbk26O/KUX8Gs4pXz6bFNF1nCmg+eSVSoAejv 9WP+b9S3LBV+Zzde6VsVzu+vkWoeyNt630cKnsraQLtLC8aUqEPBvsmCWGHWUWQ7Bol0IqAY5tv H9Ry2Nw== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--2.134200-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183741-kneo-f3VXviW X-PPE-DISP: 1603183741;kneo-f3VXviW Subject: [dpdk-dev] [PATCH 29/62] net/sfc: support VLAN PUSH actions in MAE backend X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov A group of actions (OF_PUSH_VLAN, OF_VLAN_SET_VID and OF_VLAN_SET_PCP) maps to MAE action VLAN_PUSH. This action group is supported only for rules which have transfer attribute, and can be requested once or twice per a rule. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 6 ++++ drivers/net/sfc/sfc_mae.c | 61 +++++++++++++++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index ed9fc9d845..b0caa4edf9 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -198,6 +198,12 @@ Supported actions (***transfer*** rules): - OF_POP_VLAN +- OF_PUSH_VLAN + +- OF_VLAN_SET_VID + +- OF_VLAN_SET_PCP + - PHY_PORT Validating flow rules depends on the firmware variant. diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 5fbf627f0a..98808ac3f0 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -463,6 +463,7 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, enum sfc_mae_actions_bundle_type { SFC_MAE_ACTIONS_BUNDLE_EMPTY = 0, + SFC_MAE_ACTIONS_BUNDLE_VLAN_PUSH, }; struct sfc_mae_actions_bundle { @@ -470,6 +471,10 @@ struct sfc_mae_actions_bundle { /* Indicates actions already tracked by the current bundle */ uint64_t actions_mask; + + /* Parameters used by SFC_MAE_ACTIONS_BUNDLE_VLAN_PUSH */ + rte_be16_t vlan_push_tpid; + rte_be16_t vlan_push_tci; }; /* @@ -479,13 +484,17 @@ struct sfc_mae_actions_bundle { */ static int sfc_mae_actions_bundle_submit(const struct sfc_mae_actions_bundle *bundle, - __rte_unused efx_mae_actions_t *spec) + efx_mae_actions_t *spec) { int rc = 0; switch (bundle->type) { case SFC_MAE_ACTIONS_BUNDLE_EMPTY: break; + case SFC_MAE_ACTIONS_BUNDLE_VLAN_PUSH: + rc = efx_mae_action_set_populate_vlan_push( + spec, bundle->vlan_push_tpid, bundle->vlan_push_tci); + break; default: SFC_ASSERT(B_FALSE); break; @@ -509,6 +518,11 @@ sfc_mae_actions_bundle_sync(const struct rte_flow_action *action, int rc; switch (action->type) { + case RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN: + case RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID: + case RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP: + bundle_type_new = SFC_MAE_ACTIONS_BUNDLE_VLAN_PUSH; + break; default: /* * Self-sufficient actions, including END, are handled in this @@ -538,6 +552,34 @@ sfc_mae_actions_bundle_sync(const struct rte_flow_action *action, "Failed to request the (group of) action(s)"); } +static void +sfc_mae_rule_parse_action_of_push_vlan( + const struct rte_flow_action_of_push_vlan *conf, + struct sfc_mae_actions_bundle *bundle) +{ + bundle->vlan_push_tpid = conf->ethertype; +} + +static void +sfc_mae_rule_parse_action_of_set_vlan_vid( + const struct rte_flow_action_of_set_vlan_vid *conf, + struct sfc_mae_actions_bundle *bundle) +{ + bundle->vlan_push_tci |= (conf->vlan_vid & + rte_cpu_to_be_16(RTE_LEN2MASK(12, uint16_t))); +} + +static void +sfc_mae_rule_parse_action_of_set_vlan_pcp( + const struct rte_flow_action_of_set_vlan_pcp *conf, + struct sfc_mae_actions_bundle *bundle) +{ + uint16_t vlan_tci_pcp = (uint16_t)(conf->vlan_pcp & + RTE_LEN2MASK(3, uint8_t)) << 13; + + bundle->vlan_push_tci |= rte_cpu_to_be_16(vlan_tci_pcp); +} + static int sfc_mae_rule_parse_action_phy_port(struct sfc_adapter *sa, const struct rte_flow_action_phy_port *conf, @@ -566,7 +608,7 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa, efx_mae_actions_t *spec, struct rte_flow_error *error) { - int rc; + int rc = 0; switch (action->type) { case RTE_FLOW_ACTION_TYPE_OF_POP_VLAN: @@ -574,6 +616,21 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa, bundle->actions_mask); rc = efx_mae_action_set_populate_vlan_pop(spec); break; + case RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN: + SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN, + bundle->actions_mask); + sfc_mae_rule_parse_action_of_push_vlan(action->conf, bundle); + break; + case RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID: + SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID, + bundle->actions_mask); + sfc_mae_rule_parse_action_of_set_vlan_vid(action->conf, bundle); + break; + case RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP: + SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP, + bundle->actions_mask); + sfc_mae_rule_parse_action_of_set_vlan_pcp(action->conf, bundle); + break; case RTE_FLOW_ACTION_TYPE_PHY_PORT: SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_PHY_PORT, bundle->actions_mask); From patchwork Tue Oct 20 08:47:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81478 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6A1A7A04DD; Tue, 20 Oct 2020 11:02:02 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1555EC842; Tue, 20 Oct 2020 10:49:56 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id BED10BBA0 for ; Tue, 20 Oct 2020 10:49:04 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 8F2336008B for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from us4-mdac16-14.ut7.mdlocal (unknown [10.7.65.238]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 8F767200A0 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 100A61C0051 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id BA11580005E for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnWJ030802; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 506891626DD; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:57 +0100 Message-ID: <1603183709-23420-31-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.005700-8.000000-10 X-TMASE-MatchedRID: 1k6om1Yy2loZ7Z5t6RByKcbr3d9/yP1kaeMaKzvXUpljLp8Cm8vwF12O RX0B8+qTT1fsjZmF+qzm9S/0eIQUb+ox2xGkyLxhPwKTD1v8YV5SDnPEI8clbYo2zZttmKgwBdk tVeUMQ91Ke+b9hRgNQa1TSd3U5mjSWELDcKwGO24Pe5gzF3TVtw4fD/I06RGB/J7h1gsh1oSYpu G7kpoKRwiWi74Qn7wWwltAkl1nSvhthJ7IXRIqNhjDRPpHuqhaxmJ6Bfwk3mWbKItl61J/yZ+in TK0bC9eKrauXd3MZDXpkjKz69JdHWOmaRfQqSGTtlf5XJ97FgX5Bn0ItTXDzy2mZLZr+cEmglCg HUFGvGFYufgks1xj64xPQ4PjKOx8zpMkEh8K4C4iLV7d9yx+FzigZBQJvBjlD6DuZ3COjrnoW0N kKZgEnVjylogJTbSOQwymtxuJ6y0= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-1.005700-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183744-Lvn_k2EG677s X-PPE-DISP: 1603183744;Lvn_k2EG677s Subject: [dpdk-dev] [PATCH 30/62] common/sfc_efx/base: support adding FLAG action to a set X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov This action can be added at any point before DELIVER. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 5 ++ drivers/common/sfc_efx/base/efx_impl.h | 8 +++ drivers/common/sfc_efx/base/efx_mae.c | 62 ++++++++++++++++++- .../sfc_efx/rte_common_sfc_efx_version.map | 1 + 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 193ffff14c..e03da22c3b 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4178,6 +4178,11 @@ efx_mae_action_set_populate_vlan_push( __in uint16_t tpid_be, __in uint16_t tci_be); +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_action_set_populate_flag( + __in efx_mae_actions_t *spec); + LIBEFX_API extern __checkReturn efx_rc_t efx_mae_action_set_populate_deliver( diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h index cefbcac93e..bffd4c6ce8 100644 --- a/drivers/common/sfc_efx/base/efx_impl.h +++ b/drivers/common/sfc_efx/base/efx_impl.h @@ -1704,6 +1704,14 @@ typedef enum efx_mae_action_e { EFX_MAE_ACTION_VLAN_POP, EFX_MAE_ACTION_VLAN_PUSH, + /* + * These actions are not strictly ordered and can + * be passed by a client in any order (before DELIVER). + * However, these enumerants must be kept compactly + * in the end of the enumeration (before DELIVER). + */ + EFX_MAE_ACTION_FLAG, + /* DELIVER is always the last action. */ EFX_MAE_ACTION_DELIVER, diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index b631487645..93fd02f6d2 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -715,6 +715,37 @@ efx_mae_action_set_add_vlan_push( return (rc); } +static __checkReturn efx_rc_t +efx_mae_action_set_add_flag( + __in efx_mae_actions_t *spec, + __in size_t arg_size, + __in_bcount(arg_size) const uint8_t *arg) +{ + efx_rc_t rc; + + _NOTE(ARGUNUSED(spec)) + + if (arg_size != 0) { + rc = EINVAL; + goto fail1; + } + + if (arg != NULL) { + rc = EINVAL; + goto fail2; + } + + /* This action does not have any arguments, so do nothing here. */ + + return (0); + +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + static __checkReturn efx_rc_t efx_mae_action_set_add_deliver( __in efx_mae_actions_t *spec, @@ -757,6 +788,9 @@ static const efx_mae_action_desc_t efx_mae_actions[EFX_MAE_NACTIONS] = { [EFX_MAE_ACTION_VLAN_PUSH] = { .emad_add = efx_mae_action_set_add_vlan_push }, + [EFX_MAE_ACTION_FLAG] = { + .emad_add = efx_mae_action_set_add_flag + }, [EFX_MAE_ACTION_DELIVER] = { .emad_add = efx_mae_action_set_add_deliver } @@ -765,8 +799,17 @@ static const efx_mae_action_desc_t efx_mae_actions[EFX_MAE_NACTIONS] = { static const uint32_t efx_mae_action_ordered_map = (1U << EFX_MAE_ACTION_VLAN_POP) | (1U << EFX_MAE_ACTION_VLAN_PUSH) | + (1U << EFX_MAE_ACTION_FLAG) | (1U << EFX_MAE_ACTION_DELIVER); +/* + * These actions must not be added after DELIVER, but + * they can have any place among the rest of + * strictly ordered actions. + */ +static const uint32_t efx_mae_action_nonstrict_map = + (1U << EFX_MAE_ACTION_FLAG); + static const uint32_t efx_mae_action_repeat_map = (1U << EFX_MAE_ACTION_VLAN_POP) | (1U << EFX_MAE_ACTION_VLAN_PUSH); @@ -793,6 +836,7 @@ efx_mae_action_set_spec_populate( (sizeof (efx_mae_action_repeat_map) * 8)); EFX_STATIC_ASSERT(EFX_MAE_ACTION_DELIVER + 1 == EFX_MAE_NACTIONS); + EFX_STATIC_ASSERT(EFX_MAE_ACTION_FLAG + 1 == EFX_MAE_ACTION_DELIVER); if (type >= EFX_ARRAY_SIZE(efx_mae_actions)) { rc = EINVAL; @@ -811,9 +855,10 @@ efx_mae_action_set_spec_populate( } if ((efx_mae_action_ordered_map & action_mask) != 0) { + uint32_t strict_ordered_map = + efx_mae_action_ordered_map & ~efx_mae_action_nonstrict_map; uint32_t later_actions_mask = - efx_mae_action_ordered_map & - ~(action_mask | (action_mask - 1)); + strict_ordered_map & ~(action_mask | (action_mask - 1)); if ((spec->emass_actions & later_actions_mask) != 0) { /* Cannot add an action after later ordered actions. */ @@ -867,6 +912,14 @@ efx_mae_action_set_populate_vlan_push( EFX_MAE_ACTION_VLAN_PUSH, sizeof (action), arg)); } + __checkReturn efx_rc_t +efx_mae_action_set_populate_flag( + __in efx_mae_actions_t *spec) +{ + return (efx_mae_action_set_spec_populate(spec, + EFX_MAE_ACTION_FLAG, 0, NULL)); +} + __checkReturn efx_rc_t efx_mae_action_set_populate_deliver( __in efx_mae_actions_t *spec, @@ -1059,6 +1112,11 @@ efx_mae_action_set_alloc( spec->emass_vlan_push_descs[outer_tag_idx].emavp_tci_be); } + if ((spec->emass_actions & (1U << EFX_MAE_ACTION_FLAG)) != 0) { + MCDI_IN_SET_DWORD_FIELD(req, MAE_ACTION_SET_ALLOC_IN_FLAGS, + MAE_ACTION_SET_ALLOC_IN_FLAG, 1); + } + MCDI_IN_SET_DWORD(req, MAE_ACTION_SET_ALLOC_IN_DELIVER, spec->emass_deliver_mport.sel); diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index be11b6ad3c..f57f4a3a8f 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -90,6 +90,7 @@ INTERNAL { efx_mae_action_set_alloc; efx_mae_action_set_free; efx_mae_action_set_populate_deliver; + efx_mae_action_set_populate_flag; efx_mae_action_set_populate_vlan_pop; efx_mae_action_set_populate_vlan_push; efx_mae_action_set_spec_fini; From patchwork Tue Oct 20 08:47:58 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81482 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9336FA04DD; Tue, 20 Oct 2020 11:03:41 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id B726FC8C4; Tue, 20 Oct 2020 10:50:01 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 7A603BBAA for ; Tue, 20 Oct 2020 10:49:05 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.64]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 4B2766004D for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) Received: from us4-mdac16-7.ut7.mdlocal (unknown [10.7.65.75]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 4AE682009B for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id CD6ED22004D for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 84D33800058 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnvW030801; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 5CC1D1626DF; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:58 +0100 Message-ID: <1603183709-23420-32-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-3.592100-8.000000-10 X-TMASE-MatchedRID: MS5rc/rqO2zJM5Ks2Ob22KiUivh0j2Pv6VTG9cZxEjIGmHr1eMxt2UAc 6DyoS2rIVvq8yHKcgGbCA6ReZQdElI+BOETL3Rcxh2VzUlo4HVOlhc243Qzx9e5tHZDe1yEfo8W MkQWv6iXBcIE78YqRWo6HM5rqDwqt1rnzACZmo4qvGPpIbT/04jaKqqFsQ+0TR5IKp8psL0VpFI MCymBjSnbQMlPJZh9xlSdwd8Y2QkIPCwTLRI+SL44a/nr4oqdxhdeYev6ImzWyrFieOBrhBjzcW rt/fwYrRcB2ZpPnVjJQ5+rfVDglH5RMZUCEHkRt X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-3.592100-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183745-voxdqpmRhHKi X-PPE-DISP: 1603183745;voxdqpmRhHKi Subject: [dpdk-dev] [PATCH 31/62] net/sfc: support flow action FLAG in MAE backend X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov The action handler will use MAE action FLAG. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 2 ++ drivers/net/sfc/sfc_mae.c | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index b0caa4edf9..2ddfd0c957 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -204,6 +204,8 @@ Supported actions (***transfer*** rules): - OF_VLAN_SET_PCP +- FLAG + - PHY_PORT Validating flow rules depends on the firmware variant. diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 98808ac3f0..af961ceffe 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -631,6 +631,11 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa, bundle->actions_mask); sfc_mae_rule_parse_action_of_set_vlan_pcp(action->conf, bundle); break; + case RTE_FLOW_ACTION_TYPE_FLAG: + SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_FLAG, + bundle->actions_mask); + rc = efx_mae_action_set_populate_flag(spec); + break; case RTE_FLOW_ACTION_TYPE_PHY_PORT: SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_PHY_PORT, bundle->actions_mask); From patchwork Tue Oct 20 08:47:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81498 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id B93C8A04DD; Tue, 20 Oct 2020 11:09:28 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 275D3CACC; Tue, 20 Oct 2020 10:50:28 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id E1590BBB0 for ; Tue, 20 Oct 2020 10:49:07 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.62]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 2E8C360086 for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from us4-mdac16-69.ut7.mdlocal (unknown [10.7.64.188]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 2F4708009B for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 4187C280059 for ; Tue, 20 Oct 2020 08:49:01 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id EAB20A80061 for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mn1U030804; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 69A631626E1; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:47:59 +0100 Message-ID: <1603183709-23420-33-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-2.082000-8.000000-10 X-TMASE-MatchedRID: pX1c04mAgVEZ7Z5t6RByKcbr3d9/yP1kaeMaKzvXUpljLp8Cm8vwF12O RX0B8+qTT1fsjZmF+qzm9S/0eIQUb+ox2xGkyLxhPwKTD1v8YV5SDnPEI8clbdjMMV3eZDNhrWm yq7PauHmer62Ni/rU6K1TSd3U5mjSWELDcKwGO24Pe5gzF3TVt1xo0H+7nJCrijbNm22YqDBnj1 T6aiJbiTxOxTEbgyTygDLqnrRlXrZ8nn9tnqel2MZW5ai5WKlyLI9Rj5e/2rM7mylLNWg91tRwX o/6srg5M3VnBiT32oTeccuulHjnOrASsnG6FVMG3uJICNR8ChGK5URknflp4R5N9Xn7Fnyp8Oyc cFNBL2TKhETi2//sjuP9Cb59K8ACZrS+A8PszW/U9h9N881NSQ== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--2.082000-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183741-MLHalgAcbAwB X-PPE-DISP: 1603183741;MLHalgAcbAwB Subject: [dpdk-dev] [PATCH 32/62] common/sfc_efx/base: support adding MARK action to a set X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov This action can be added at any point before DELIVER. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 6 ++ drivers/common/sfc_efx/base/efx_impl.h | 2 + drivers/common/sfc_efx/base/efx_mae.c | 58 ++++++++++++++++++- .../sfc_efx/rte_common_sfc_efx_version.map | 1 + 4 files changed, 65 insertions(+), 2 deletions(-) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index e03da22c3b..1d2987653b 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4183,6 +4183,12 @@ extern __checkReturn efx_rc_t efx_mae_action_set_populate_flag( __in efx_mae_actions_t *spec); +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_action_set_populate_mark( + __in efx_mae_actions_t *spec, + __in uint32_t mark_value); + LIBEFX_API extern __checkReturn efx_rc_t efx_mae_action_set_populate_deliver( diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h index bffd4c6ce8..db68cc7b24 100644 --- a/drivers/common/sfc_efx/base/efx_impl.h +++ b/drivers/common/sfc_efx/base/efx_impl.h @@ -1711,6 +1711,7 @@ typedef enum efx_mae_action_e { * in the end of the enumeration (before DELIVER). */ EFX_MAE_ACTION_FLAG, + EFX_MAE_ACTION_MARK, /* DELIVER is always the last action. */ EFX_MAE_ACTION_DELIVER, @@ -1737,6 +1738,7 @@ typedef struct efx_mae_actions_s { unsigned int emass_n_vlan_tags_to_push; efx_mae_action_vlan_push_t emass_vlan_push_descs[ EFX_MAE_VLAN_PUSH_MAX_NTAGS]; + uint32_t emass_mark_value; efx_mport_sel_t emass_deliver_mport; } efx_mae_actions_t; diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index 93fd02f6d2..880336a7d9 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -746,6 +746,35 @@ efx_mae_action_set_add_flag( return (rc); } +static __checkReturn efx_rc_t +efx_mae_action_set_add_mark( + __in efx_mae_actions_t *spec, + __in size_t arg_size, + __in_bcount(arg_size) const uint8_t *arg) +{ + efx_rc_t rc; + + if (arg_size != sizeof (spec->emass_mark_value)) { + rc = EINVAL; + goto fail1; + } + + if (arg == NULL) { + rc = EINVAL; + goto fail2; + } + + memcpy(&spec->emass_mark_value, arg, arg_size); + + return (0); + +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + static __checkReturn efx_rc_t efx_mae_action_set_add_deliver( __in efx_mae_actions_t *spec, @@ -791,6 +820,9 @@ static const efx_mae_action_desc_t efx_mae_actions[EFX_MAE_NACTIONS] = { [EFX_MAE_ACTION_FLAG] = { .emad_add = efx_mae_action_set_add_flag }, + [EFX_MAE_ACTION_MARK] = { + .emad_add = efx_mae_action_set_add_mark + }, [EFX_MAE_ACTION_DELIVER] = { .emad_add = efx_mae_action_set_add_deliver } @@ -800,6 +832,7 @@ static const uint32_t efx_mae_action_ordered_map = (1U << EFX_MAE_ACTION_VLAN_POP) | (1U << EFX_MAE_ACTION_VLAN_PUSH) | (1U << EFX_MAE_ACTION_FLAG) | + (1U << EFX_MAE_ACTION_MARK) | (1U << EFX_MAE_ACTION_DELIVER); /* @@ -808,7 +841,8 @@ static const uint32_t efx_mae_action_ordered_map = * strictly ordered actions. */ static const uint32_t efx_mae_action_nonstrict_map = - (1U << EFX_MAE_ACTION_FLAG); + (1U << EFX_MAE_ACTION_FLAG) | + (1U << EFX_MAE_ACTION_MARK); static const uint32_t efx_mae_action_repeat_map = (1U << EFX_MAE_ACTION_VLAN_POP) | @@ -836,7 +870,8 @@ efx_mae_action_set_spec_populate( (sizeof (efx_mae_action_repeat_map) * 8)); EFX_STATIC_ASSERT(EFX_MAE_ACTION_DELIVER + 1 == EFX_MAE_NACTIONS); - EFX_STATIC_ASSERT(EFX_MAE_ACTION_FLAG + 1 == EFX_MAE_ACTION_DELIVER); + EFX_STATIC_ASSERT(EFX_MAE_ACTION_FLAG + 1 == EFX_MAE_ACTION_MARK); + EFX_STATIC_ASSERT(EFX_MAE_ACTION_MARK + 1 == EFX_MAE_ACTION_DELIVER); if (type >= EFX_ARRAY_SIZE(efx_mae_actions)) { rc = EINVAL; @@ -920,6 +955,17 @@ efx_mae_action_set_populate_flag( EFX_MAE_ACTION_FLAG, 0, NULL)); } + __checkReturn efx_rc_t +efx_mae_action_set_populate_mark( + __in efx_mae_actions_t *spec, + __in uint32_t mark_value) +{ + const uint8_t *arg = (const uint8_t *)&mark_value; + + return (efx_mae_action_set_spec_populate(spec, + EFX_MAE_ACTION_MARK, sizeof (mark_value), arg)); +} + __checkReturn efx_rc_t efx_mae_action_set_populate_deliver( __in efx_mae_actions_t *spec, @@ -1117,6 +1163,14 @@ efx_mae_action_set_alloc( MAE_ACTION_SET_ALLOC_IN_FLAG, 1); } + if ((spec->emass_actions & (1U << EFX_MAE_ACTION_MARK)) != 0) { + MCDI_IN_SET_DWORD_FIELD(req, MAE_ACTION_SET_ALLOC_IN_FLAGS, + MAE_ACTION_SET_ALLOC_IN_MARK, 1); + + MCDI_IN_SET_DWORD(req, + MAE_ACTION_SET_ALLOC_IN_MARK_VALUE, spec->emass_mark_value); + } + MCDI_IN_SET_DWORD(req, MAE_ACTION_SET_ALLOC_IN_DELIVER, spec->emass_deliver_mport.sel); diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index f57f4a3a8f..6ed412ee39 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -91,6 +91,7 @@ INTERNAL { efx_mae_action_set_free; efx_mae_action_set_populate_deliver; efx_mae_action_set_populate_flag; + efx_mae_action_set_populate_mark; efx_mae_action_set_populate_vlan_pop; efx_mae_action_set_populate_vlan_push; efx_mae_action_set_spec_fini; From patchwork Tue Oct 20 08:48:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81472 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 785A8A04DD; Tue, 20 Oct 2020 10:59:45 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A2842C325; Tue, 20 Oct 2020 10:49:47 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 2E464BAE8 for ; Tue, 20 Oct 2020 10:49:04 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id AFC686006E for ; Tue, 20 Oct 2020 08:49:02 +0000 (UTC) Received: from us4-mdac16-58.ut7.mdlocal (unknown [10.7.66.29]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id AEC6F8009E for ; Tue, 20 Oct 2020 08:49:02 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 1BCC080057 for ; Tue, 20 Oct 2020 08:49:02 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id C4E30800058 for ; Tue, 20 Oct 2020 08:49:01 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnI1030800; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 76C671626E3; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:00 +0100 Message-ID: <1603183709-23420-34-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-3.399600-8.000000-10 X-TMASE-MatchedRID: 4e78QTyJ6gTJM5Ks2Ob22KiUivh0j2Pv6VTG9cZxEjIGmHr1eMxt2UAc 6DyoS2rIVvq8yHKcgGZ66iUnuykP7AfKaDkWT1u+GjzBgnFZvQ7ZywDYifSetg6QlBHhBZuwDN2 gpU0rAlY9qJNQsBEEy4Ay6p60ZV62G2i4y8P2xXndB/CxWTRRuwihQpoXbuXFaPr6nVloqq5W6f 9OFkc7EcCIlskZJdDYbx8SEmfmBffgjvjI4zDVSIhdD3d9zIgQPELKBLhXYDHSExfDqrno0gTUk 527BFikD1y8R38S3l1URzkirO0Q1F5h9KQWrq4BvuMTr7CQJJ76svlVb6h9lw== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-3.399600-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183742-Ux_BUrYzNZdg X-PPE-DISP: 1603183742;Ux_BUrYzNZdg Subject: [dpdk-dev] [PATCH 33/62] net/sfc: support flow action MARK in MAE backend X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov The action handler will use MAE action MARK. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 2 ++ drivers/net/sfc/sfc_mae.c | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index 2ddfd0c957..ff0d094068 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -206,6 +206,8 @@ Supported actions (***transfer*** rules): - FLAG +- MARK + - PHY_PORT Validating flow rules depends on the firmware variant. diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index af961ceffe..1e7a368303 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -580,6 +580,13 @@ sfc_mae_rule_parse_action_of_set_vlan_pcp( bundle->vlan_push_tci |= rte_cpu_to_be_16(vlan_tci_pcp); } +static int +sfc_mae_rule_parse_action_mark(const struct rte_flow_action_mark *conf, + efx_mae_actions_t *spec) +{ + return efx_mae_action_set_populate_mark(spec, conf->id); +} + static int sfc_mae_rule_parse_action_phy_port(struct sfc_adapter *sa, const struct rte_flow_action_phy_port *conf, @@ -636,6 +643,11 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa, bundle->actions_mask); rc = efx_mae_action_set_populate_flag(spec); break; + case RTE_FLOW_ACTION_TYPE_MARK: + SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_MARK, + bundle->actions_mask); + rc = sfc_mae_rule_parse_action_mark(action->conf, spec); + break; case RTE_FLOW_ACTION_TYPE_PHY_PORT: SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_PHY_PORT, bundle->actions_mask); From patchwork Tue Oct 20 08:48:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81485 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id CFBA8A04DD; Tue, 20 Oct 2020 11:04:52 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id F0309C904; Tue, 20 Oct 2020 10:50:07 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id F2860BBBC for ; Tue, 20 Oct 2020 10:49:04 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id C3B536007B for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from us4-mdac16-62.ut7.mdlocal (unknown [10.7.66.61]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id C2FED2009A for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.199]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 536AC1C004F for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 09879180062 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnG1030820; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 83A2E1626E5; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:01 +0100 Message-ID: <1603183709-23420-35-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.638700-8.000000-10 X-TMASE-MatchedRID: WXcy5iipN2407l2UVEk0Bi2416nc3bQleouvej40T4iOSVCvVHWJJ0Ac 6DyoS2rIKnoLoDc7CX2zVa72vCi3PIgPQuqHpFiETNDKZy5/hvRh1mb42cZVB5soi2XrUn/Jn6K dMrRsL14qtq5d3cxkNV0+OHzRHks+Dgw4HlC5jlvW+xZSEfGOzc4mkI38XbyWhbBEJY1F9tIko7 s/UcmA7qISKHjBEKisFmQj0mUIb31IoxYYsIHRataTxr7l5BRrOKBkFAm8GOUPoO5ncI6OuehbQ 2QpmASdWPKWiAlNtI5DDKa3G4nrLQ== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-1.638700-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183744-5U4zv96z7fcR X-PPE-DISP: 1603183744;5U4zv96z7fcR Subject: [dpdk-dev] [PATCH 34/62] common/sfc_efx/base: add named constant for invalid VF X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov This makes existing code clearer. Also, it will be used by a later patch. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 1d2987653b..eefd79dd06 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -1603,11 +1603,13 @@ typedef struct efx_nic_cfg_s { uint32_t enc_assigned_port; } efx_nic_cfg_t; +#define EFX_PCI_VF_INVALID 0xffff + #define EFX_VPORT_PCI_FUNCTION_IS_PF(configp) \ - ((configp)->evc_function == 0xffff) + ((configp)->evc_function == EFX_PCI_VF_INVALID) -#define EFX_PCI_FUNCTION_IS_PF(_encp) ((_encp)->enc_vf == 0xffff) -#define EFX_PCI_FUNCTION_IS_VF(_encp) ((_encp)->enc_vf != 0xffff) +#define EFX_PCI_FUNCTION_IS_PF(_encp) ((_encp)->enc_vf == EFX_PCI_VF_INVALID) +#define EFX_PCI_FUNCTION_IS_VF(_encp) ((_encp)->enc_vf != EFX_PCI_VF_INVALID) #define EFX_PCI_FUNCTION(_encp) \ (EFX_PCI_FUNCTION_IS_PF(_encp) ? (_encp)->enc_pf : (_encp)->enc_vf) @@ -3871,7 +3873,7 @@ typedef enum efx_vport_type_e { #define EFX_VPORT_ID_INVALID 0 typedef struct efx_vport_config_s { - /* Either VF index or 0xffff for PF */ + /* Either VF index or EFX_PCI_VF_INVALID for PF */ uint16_t evc_function; /* VLAN ID of the associated function */ uint16_t evc_vid; From patchwork Tue Oct 20 08:48:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81484 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 24586A04DD; Tue, 20 Oct 2020 11:04:28 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id BC2E5C8F6; Tue, 20 Oct 2020 10:50:05 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id ABD49BBAE for ; Tue, 20 Oct 2020 10:49:05 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.64]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 3C0E96004F for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from us4-mdac16-1.ut7.mdlocal (unknown [10.7.65.69]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 3A5D82009B for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 44ADA220059 for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id EFF9D800058 for ; Tue, 20 Oct 2020 08:49:02 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnmQ030803; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 8FE931626E6; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:02 +0100 Message-ID: <1603183709-23420-36-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-3.258600-8.000000-10 X-TMASE-MatchedRID: jW2Old1ajwBCXIPbCpslEEr0JusapgjyyK08DGQV3qvyN+XEEoySvuZ5 Gn23AeDZuA9fFHhyLzzltBq1WutDWufzx0Vh6/WW9cb9iRwZHB8/pOSL72dTf7Zk7gsuflVK48T rEPjgAF1p7pqcmL+GxLlV8VXOJLZWY93BF3BQDx7nZxuPj9aY+6LwP+jjbL9KGlfXMQvierdARX r3iG5/5+LzNWBegCW2wgn7iDBesS1YF3qW3Je6+7koFGQg+AS+/CMxRVpH4459CUgTcPbpELB/G gNwbqMNeL7UrqCj2l356ESA07XtUnJ3XrQ4lK3Z+xwTl345oIPAisH+ktUifL1NuKS30BZnQIFI ZLtsgG0DUH+nVLNyiCsqIP9TxvtJo1s8kG68tot+3BndfXUhXQ== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-3.258600-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183743-MtWsI1jqXHh1 X-PPE-DISP: 1603183743;MtWsI1jqXHh1 Subject: [dpdk-dev] [PATCH 35/62] common/sfc_efx/base: add an API to get MPORT of a PF/VF X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov PCIe functions have static MPORTs which can be utilised by MAE rules as delivery destinations for matching traffic. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 14 +++++++ drivers/common/sfc_efx/base/efx_mae.c | 39 +++++++++++++++++++ .../sfc_efx/rte_common_sfc_efx_version.map | 1 + 3 files changed, 54 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index eefd79dd06..96ea93f75a 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4111,6 +4111,20 @@ efx_mae_mport_by_phy_port( __in uint32_t phy_port, __out efx_mport_sel_t *mportp); +/* + * Get MPORT selector of a PCIe function. + * + * The resulting MPORT selector is opaque to the caller and can be + * passed as an argument to efx_mae_match_spec_mport_set() + * and efx_mae_action_set_populate_deliver(). + */ +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_mport_by_pcie_function( + __in uint32_t pf, + __in uint32_t vf, + __out efx_mport_sel_t *mportp); + /* * Fields which have BE postfix in their named constants are expected * to be passed by callers in big-endian byte order. They will appear diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index 880336a7d9..ee51f19e5e 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -357,6 +357,45 @@ efx_mae_mport_by_phy_port( return (0); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + + __checkReturn efx_rc_t +efx_mae_mport_by_pcie_function( + __in uint32_t pf, + __in uint32_t vf, + __out efx_mport_sel_t *mportp) +{ + efx_dword_t dword; + efx_rc_t rc; + + EFX_STATIC_ASSERT(EFX_PCI_VF_INVALID == + MAE_MPORT_SELECTOR_FUNC_VF_ID_NULL); + + if (pf > EFX_MASK32(MAE_MPORT_SELECTOR_FUNC_PF_ID)) { + rc = EINVAL; + goto fail1; + } + + if (vf > EFX_MASK32(MAE_MPORT_SELECTOR_FUNC_VF_ID)) { + rc = EINVAL; + goto fail2; + } + + EFX_POPULATE_DWORD_3(dword, + MAE_MPORT_SELECTOR_TYPE, MAE_MPORT_SELECTOR_TYPE_FUNC, + MAE_MPORT_SELECTOR_FUNC_PF_ID, pf, + MAE_MPORT_SELECTOR_FUNC_VF_ID, vf); + + memset(mportp, 0, sizeof (*mportp)); + mportp->sel = dword.ed_u32[0]; + + return (0); + +fail2: + EFSYS_PROBE(fail2); fail1: EFSYS_PROBE1(fail1, efx_rc_t, rc); return (rc); diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index 6ed412ee39..cb92955a64 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -106,6 +106,7 @@ INTERNAL { efx_mae_match_spec_is_valid; efx_mae_match_spec_mport_set; efx_mae_match_specs_class_cmp; + efx_mae_mport_by_pcie_function; efx_mae_mport_by_phy_port; efx_mcdi_fini; From patchwork Tue Oct 20 08:48:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81474 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 81C3EA04DD; Tue, 20 Oct 2020 11:00:30 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 8A5E4AD33; Tue, 20 Oct 2020 10:49:50 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 680C0BBAE for ; Tue, 20 Oct 2020 10:49:04 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 26AEF60054 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from us4-mdac16-62.ut7.mdlocal (unknown [10.7.66.61]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 274EF2009A for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.41]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id A57FC1C004F for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 584324C0064 for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnEJ030805; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 9C6321626EA; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:03 +0100 Message-ID: <1603183709-23420-37-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.832600-8.000000-10 X-TMASE-MatchedRID: 45LChreVRiQfKML5AJtfLabtlVLKF4zpaeMaKzvXUpljLp8Cm8vwFwoe RRhCZWIBfGzuoVn0Vs6PQi9XuOWoOPyUSi1R/9mUHl2pJS1lPFu1vfBQSgBJqJck4WtpRCa1KWM 3aQNUjqhSBYbXlRzeV/9vSUyC4hWYqj01FlWBadqHZXNSWjgdU3VNoFzxmabndPuD+FuuXo7u9+ Mep8zDYhRG3wzjcy8gbDgPJqIxAh83KXWd30Ii3RRFJJyf5BJe3QfwsVk0UbvqwGfCk7KUs5ezw SW0eLgTGSOflvkC6XLdl4U8LJxzABQUcgIVHunC8xDd5IZMw4de52L5QGdjqCnpv7jwCVldskhp jLV1Y07VtJPAMNyGQQ9cvEd/Et5dVEc5IqztENReYfSkFq6uAb7jE6+wkCSeftwZ3X11IV0= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--1.832600-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183744-V92rj4L0gGEs X-PPE-DISP: 1603183744;V92rj4L0gGEs Subject: [dpdk-dev] [PATCH 36/62] net/sfc: support flow items PF and VF in transfer rules X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add support for these flow items to MAE-specific RTE flow implementation. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 4 ++ drivers/net/sfc/sfc_mae.c | 126 ++++++++++++++++++++++++++++++++++++ drivers/net/sfc/sfc_mae.h | 1 + 3 files changed, 131 insertions(+) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index ff0d094068..b0f19d51b4 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -192,6 +192,10 @@ Supported pattern items (***transfer*** rules): - PHY_PORT (cannot repeat; conflicts with other traffic source items) +- PF (cannot repeat; conflicts with other traffic source items) + +- VF (cannot repeat; conflicts with other traffic source items) + - ETH Supported actions (***transfer*** rules): diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 1e7a368303..7d1a3b5999 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -276,6 +276,109 @@ sfc_mae_rule_parse_item_phy_port(const struct rte_flow_item *item, return 0; } +static int +sfc_mae_rule_parse_item_pf(const struct rte_flow_item *item, + struct sfc_flow_parse_ctx *ctx, + struct rte_flow_error *error) +{ + struct sfc_mae_parse_ctx *ctx_mae = ctx->mae; + const efx_nic_cfg_t *encp = efx_nic_cfg_get(ctx_mae->sa->nic); + efx_mport_sel_t mport_v; + int rc; + + if (ctx_mae->match_mport_set) { + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Can't handle multiple traffic source items"); + } + + rc = efx_mae_mport_by_pcie_function(encp->enc_pf, EFX_PCI_VF_INVALID, + &mport_v); + if (rc != 0) { + return rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Failed to convert the PF ID"); + } + + rc = efx_mae_match_spec_mport_set(ctx_mae->match_spec_action, + &mport_v, NULL); + if (rc != 0) { + return rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Failed to set MPORT for the PF"); + } + + ctx_mae->match_mport_set = B_TRUE; + + return 0; +} + +static int +sfc_mae_rule_parse_item_vf(const struct rte_flow_item *item, + struct sfc_flow_parse_ctx *ctx, + struct rte_flow_error *error) +{ + struct sfc_mae_parse_ctx *ctx_mae = ctx->mae; + const efx_nic_cfg_t *encp = efx_nic_cfg_get(ctx_mae->sa->nic); + const struct rte_flow_item_vf supp_mask = { + .id = 0xffffffff, + }; + const void *def_mask = &rte_flow_item_vf_mask; + const struct rte_flow_item_vf *spec = NULL; + const struct rte_flow_item_vf *mask = NULL; + efx_mport_sel_t mport_v; + int rc; + + if (ctx_mae->match_mport_set) { + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Can't handle multiple traffic source items"); + } + + rc = sfc_flow_parse_init(item, + (const void **)&spec, (const void **)&mask, + (const void *)&supp_mask, def_mask, + sizeof(struct rte_flow_item_vf), error); + if (rc != 0) + return rc; + + if (mask->id != supp_mask.id) { + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Bad mask in the VF pattern item"); + } + + /* + * If "spec" is not set, the item requests any VF related to the + * PF of the current DPDK port (but not the PF itself). + * Reject this match criterion as unsupported. + */ + if (spec == NULL) { + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Bad spec in the VF pattern item"); + } + + rc = efx_mae_mport_by_pcie_function(encp->enc_pf, spec->id, &mport_v); + if (rc != 0) { + return rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Failed to convert the PF + VF IDs"); + } + + rc = efx_mae_match_spec_mport_set(ctx_mae->match_spec_action, + &mport_v, NULL); + if (rc != 0) { + return rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Failed to set MPORT for the PF + VF"); + } + + ctx_mae->match_mport_set = B_TRUE; + + return 0; +} + struct sfc_mae_field_locator { efx_mae_field_id_t field_id; size_t size; @@ -387,6 +490,28 @@ static const struct sfc_flow_item sfc_flow_items[] = { .ctx_type = SFC_FLOW_PARSE_CTX_MAE, .parse = sfc_mae_rule_parse_item_phy_port, }, + { + .type = RTE_FLOW_ITEM_TYPE_PF, + /* + * In terms of RTE flow, this item is a META one, + * and its position in the pattern is don't care. + */ + .prev_layer = SFC_FLOW_ITEM_ANY_LAYER, + .layer = SFC_FLOW_ITEM_ANY_LAYER, + .ctx_type = SFC_FLOW_PARSE_CTX_MAE, + .parse = sfc_mae_rule_parse_item_pf, + }, + { + .type = RTE_FLOW_ITEM_TYPE_VF, + /* + * In terms of RTE flow, this item is a META one, + * and its position in the pattern is don't care. + */ + .prev_layer = SFC_FLOW_ITEM_ANY_LAYER, + .layer = SFC_FLOW_ITEM_ANY_LAYER, + .ctx_type = SFC_FLOW_PARSE_CTX_MAE, + .parse = sfc_mae_rule_parse_item_vf, + }, { .type = RTE_FLOW_ITEM_TYPE_ETH, .prev_layer = SFC_FLOW_ITEM_START_LAYER, @@ -407,6 +532,7 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, int rc; memset(&ctx_mae, 0, sizeof(ctx_mae)); + ctx_mae.sa = sa; rc = efx_mae_match_spec_init(sa->nic, EFX_MAE_RULE_ACTION, spec->priority, diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index d9f0ee3cbc..3c34d08f88 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -57,6 +57,7 @@ struct sfc_adapter; struct sfc_flow_spec; struct sfc_mae_parse_ctx { + struct sfc_adapter *sa; efx_mae_match_spec_t *match_spec_action; bool match_mport_set; }; From patchwork Tue Oct 20 08:48:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81492 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 120D7A04DD; Tue, 20 Oct 2020 11:07:28 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id EF9F5C9AA; Tue, 20 Oct 2020 10:50:19 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 61BC2AD31 for ; Tue, 20 Oct 2020 10:49:06 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.62]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id DB86060051 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from us4-mdac16-61.ut7.mdlocal (unknown [10.7.66.58]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id DAC8D8009B for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 6F613280050 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 25531800058 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnWL030802; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id A94861627D7; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:04 +0100 Message-ID: <1603183709-23420-38-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-4.739600-8.000000-10 X-TMASE-MatchedRID: m/l8lVFgJ4tu0gVhNXVDBC2416nc3bQleouvej40T4gd0WOKRkwsh3Io zGa69omdrdoLblq9S5pcx+WL9y6rQSKEfPn9tGVyT7O/YHJhINDZywDYifSetlVkJxysad/IFQL H9fnGRSezlUihehRd5hE6igv/Yt1iGnqsZ8sRr2KJXSm2bBmGrSg7JAmHu44omyiLZetSf8mfop 0ytGwvXiq2rl3dzGQ126VsqPthZV3Fas11FAFXfl2LwSxHc/V7+JiNlJE7Tq3Whg6Go2DiXWGr+ kKaOxOlARqqITY+a8A+BAHhr7v/HumWouLxpnrvwIbNcKIf6So4oGQUCbwY5Q+g7mdwjo656FtD ZCmYBJ1Y8paICU20jkMMprcbiest X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-4.739600-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183744-ZNyz83cYRGpe X-PPE-DISP: 1603183744;ZNyz83cYRGpe Subject: [dpdk-dev] [PATCH 37/62] net/sfc: support flow actions PF and VF in transfer rules X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov The action handler will use MAE action DELIVER with MPORT of the PF/VF. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 4 ++++ drivers/net/sfc/sfc_mae.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index b0f19d51b4..2ec95460c5 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -214,6 +214,10 @@ Supported actions (***transfer*** rules): - PHY_PORT +- PF + +- VF + Validating flow rules depends on the firmware variant. The :ref:`flow_isolated_mode` is supported. diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 7d1a3b5999..ff21351152 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -734,6 +734,30 @@ sfc_mae_rule_parse_action_phy_port(struct sfc_adapter *sa, return efx_mae_action_set_populate_deliver(spec, &mport); } +static int +sfc_mae_rule_parse_action_pf_vf(struct sfc_adapter *sa, + const struct rte_flow_action_vf *vf_conf, + efx_mae_actions_t *spec) +{ + const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic); + efx_mport_sel_t mport; + uint32_t vf; + int rc; + + if (vf_conf == NULL) + vf = EFX_PCI_VF_INVALID; + else if (vf_conf->original != 0) + vf = encp->enc_vf; + else + vf = vf_conf->id; + + rc = efx_mae_mport_by_pcie_function(encp->enc_pf, vf, &mport); + if (rc != 0) + return rc; + + return efx_mae_action_set_populate_deliver(spec, &mport); +} + static int sfc_mae_rule_parse_action(struct sfc_adapter *sa, const struct rte_flow_action *action, @@ -779,6 +803,16 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa, bundle->actions_mask); rc = sfc_mae_rule_parse_action_phy_port(sa, action->conf, spec); break; + case RTE_FLOW_ACTION_TYPE_PF: + SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_PF, + bundle->actions_mask); + rc = sfc_mae_rule_parse_action_pf_vf(sa, NULL, spec); + break; + case RTE_FLOW_ACTION_TYPE_VF: + SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_VF, + bundle->actions_mask); + rc = sfc_mae_rule_parse_action_pf_vf(sa, action->conf, spec); + break; default: return rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION, NULL, From patchwork Tue Oct 20 08:48:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81475 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 287A8A04DD; Tue, 20 Oct 2020 11:00:52 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D9C81C80A; Tue, 20 Oct 2020 10:49:51 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 53DC5BBAC for ; Tue, 20 Oct 2020 10:49:04 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.62]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 219CC60087 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from us4-mdac16-61.ut7.mdlocal (unknown [10.7.66.58]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 20AF88009B for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id A530C280053 for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 5AFF3800058 for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mn1W030804; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id B684A1627DA; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:05 +0100 Message-ID: <1603183709-23420-39-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.100700-8.000000-10 X-TMASE-MatchedRID: aYY/z8vMijzecSkNT7l/2W/BUkaRdR0Jas1wAJHsfyJeOpN49cSJ3Q2o 6ebnCAbg3Mltz09ZqJNA08Pbjdhi2R1YpEPWJiyziJwEp8weVXxSQLJ/PYofeAaYevV4zG3ZO8+ BEoNgmT98qLeh0f6YVhXXfLCAeq/9krMo37I6x/7MbQu1fPiCD45Wj4EMKY2smyiLZetSf8mfop 0ytGwvXiq2rl3dzGQ1cOg+TLV4WO10Tf7IGuGYrx/0CrLQi3i2nL+X7dzMxiALyz/82ADZx+avn jEmI7dIIQ+gd8TOwCJrvIq+8tRwmhMk/TLr7x7bIi1e3fcsfhc4oGQUCbwY5Q+g7mdwjo656FtD ZCmYBJ1ty4Dch3o7okMMprcbiest X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--1.100700-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183744-mkw3yf_qmmqQ X-PPE-DISP: 1603183744;mkw3yf_qmmqQ Subject: [dpdk-dev] [PATCH 38/62] common/sfc_efx/base: add an API for adding action DROP X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Client drivers may need to request that matching traffic be dropped. Add a dedicated API to support this. The API relies on action DELIVER with properly constructed NULL MPORT argument. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 5 +++++ drivers/common/sfc_efx/base/efx_mae.c | 19 +++++++++++++++++++ .../sfc_efx/rte_common_sfc_efx_version.map | 1 + 3 files changed, 25 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 96ea93f75a..4a4dc8ba4d 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4211,6 +4211,11 @@ efx_mae_action_set_populate_deliver( __in efx_mae_actions_t *spec, __in const efx_mport_sel_t *mportp); +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_action_set_populate_drop( + __in efx_mae_actions_t *spec); + LIBEFX_API extern __checkReturn boolean_t efx_mae_action_set_specs_equal( diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index ee51f19e5e..0cfa3f6c06 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -1028,6 +1028,25 @@ efx_mae_action_set_populate_deliver( return (rc); } + __checkReturn efx_rc_t +efx_mae_action_set_populate_drop( + __in efx_mae_actions_t *spec) +{ + efx_mport_sel_t mport; + const uint8_t *arg; + efx_dword_t dword; + + EFX_POPULATE_DWORD_1(dword, + MAE_MPORT_SELECTOR_FLAT, MAE_MPORT_SELECTOR_NULL); + + mport.sel = dword.ed_u32[0]; + + arg = (const uint8_t *)&mport.sel; + + return (efx_mae_action_set_spec_populate(spec, + EFX_MAE_ACTION_DELIVER, sizeof (mport.sel), arg)); +} + __checkReturn boolean_t efx_mae_action_set_specs_equal( __in const efx_mae_actions_t *left, diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index cb92955a64..7cc692db3f 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -90,6 +90,7 @@ INTERNAL { efx_mae_action_set_alloc; efx_mae_action_set_free; efx_mae_action_set_populate_deliver; + efx_mae_action_set_populate_drop; efx_mae_action_set_populate_flag; efx_mae_action_set_populate_mark; efx_mae_action_set_populate_vlan_pop; From patchwork Tue Oct 20 08:48:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81477 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id B9F5BA04DD; Tue, 20 Oct 2020 11:01:38 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A72B5C82A; Tue, 20 Oct 2020 10:49:54 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id E5725BBA2 for ; Tue, 20 Oct 2020 10:49:04 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id B38686006E for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from us4-mdac16-58.ut7.mdlocal (unknown [10.7.66.29]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id B251E8009E for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.199]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id E7E4F80055 for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 9E9E318005B for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnmS030803; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id C3E1F1627E2; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:06 +0100 Message-ID: <1603183709-23420-40-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-3.843100-8.000000-10 X-TMASE-MatchedRID: m/l8lVFgJ4tu0gVhNXVDBCA64TWjSz46ovA/6ONsv0oAjiw/nJIChy2C AW3ky8Wr2XHJ0L4jOIRTvVffeIwvQ60iin8P0KjVPwKTD1v8YV5MkOX0UoduuYaMPFsKFv3Qku+ GdcB8c5Pes3lPbq7/VMWhhwhs7YYjGnqsZ8sRr2KJXSm2bBmGrSg7JAmHu44omyiLZetSf8mfop 0ytGwvXiq2rl3dzGQ1v/2trgnD2R5oQSfW9cA/HpZiPMrwGSXxP8MvK96vMvDLSPk9PJL5Z+JcI eJAkXc8vPJGuN2rogq2fXhDNWnU5NMrLi7sx3HyUMQ8hJn9I6Q4oGQUCbwY5Q+g7mdwjo656FtD ZCmYBJ1Y8paICU20jkMMprcbiest X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-3.843100-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183744-lMFwRaiFDCI9 X-PPE-DISP: 1603183744;lMFwRaiFDCI9 Subject: [dpdk-dev] [PATCH 39/62] net/sfc: support flow action DROP in transfer rules X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Effectively, the resulting action will be of type DELIVER, and destination MPORT will be a properly constructed NULL value. This will achieve the requested behaviour (no delivery). Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 2 ++ drivers/net/sfc/sfc_mae.c | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index 2ec95460c5..ba73391d5f 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -218,6 +218,8 @@ Supported actions (***transfer*** rules): - VF +- DROP + Validating flow rules depends on the firmware variant. The :ref:`flow_isolated_mode` is supported. diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index ff21351152..a5800ae722 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -813,6 +813,11 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa, bundle->actions_mask); rc = sfc_mae_rule_parse_action_pf_vf(sa, action->conf, spec); break; + case RTE_FLOW_ACTION_TYPE_DROP: + SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_DROP, + bundle->actions_mask); + rc = efx_mae_action_set_populate_drop(spec); + break; default: return rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION, NULL, From patchwork Tue Oct 20 08:48:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81486 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id E246BA04DD; Tue, 20 Oct 2020 11:05:16 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0214FBBC2; Tue, 20 Oct 2020 10:50:10 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id B7AE2BBA0 for ; Tue, 20 Oct 2020 10:49:06 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 82D1A60089 for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from us4-mdac16-42.ut7.mdlocal (unknown [10.7.64.24]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 81EA08009E for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 055288005D for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id AF69A800058 for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnI3030800; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id D28101613A9; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:07 +0100 Message-ID: <1603183709-23420-41-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.143800-8.000000-10 X-TMASE-MatchedRID: S9Ceak9KoSgdqirDt7KDjMeuFL5UpINx66i2vtqzeKX5+tteD5RzhamE 6sikRTtfuA9fFHhyLzywgcHDNo5AtCHhSBQfglfsA9lly13c/gGrlTqw7wfC06jxqhyDxmYjM74 8GW9lTth1/2ejr+BWJnug5fIqIMi3lW8+jFKPmuajGOtqnkAZC/fjx7YIT/BiGlfXMQvierfjLK PupB6SI6P4tSedQfydN8eHxrg3vgIEIbfwCb92vZ4CIKY/Hg3AGdQnQSTrKGPEQdG7H66TyJ8TM nmE+d0ZMZKyPnlHaGefE5OShXLriM1ov2rmo4g7eczzwAdnPmgrbsVQSwOPc8cME+FNINstctHd Jx5wkFarVCyHXe6rPfbLITVN89Mvk3UkV5Qp4wSI45Rd9ORJwFlJvEhEss3fvN+d4ahMo5NWXGv UUmKP2w== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--1.143800-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183746-v_RwHpSrJZJJ X-PPE-DISP: 1603183746;v_RwHpSrJZJJ Subject: [dpdk-dev] [PATCH 40/62] common/sfc_efx/base: refactor version / boot info get helper X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Refactor MCDI helper for version information and boot status retrieval; it should comprise two dedicated helper functions. A later patch will extend and reuse version retrieval helper. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko --- drivers/common/sfc_efx/base/efx_mcdi.c | 156 ++++++++++++++++--------- drivers/common/sfc_efx/base/efx_mcdi.h | 12 ++ 2 files changed, 116 insertions(+), 52 deletions(-) diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c index ede052a26a..edd069c969 100644 --- a/drivers/common/sfc_efx/base/efx_mcdi.c +++ b/drivers/common/sfc_efx/base/efx_mcdi.c @@ -962,31 +962,32 @@ efx_mcdi_ev_death( } __checkReturn efx_rc_t -efx_mcdi_version( +efx_mcdi_get_version( __in efx_nic_t *enp, - __out_ecount_opt(4) uint16_t versionp[4], - __out_opt uint32_t *buildp, - __out_opt efx_mcdi_boot_t *statusp) + __out efx_mcdi_version_t *verp) { - efx_mcdi_req_t req; EFX_MCDI_DECLARE_BUF(payload, - MAX(MC_CMD_GET_VERSION_IN_LEN, MC_CMD_GET_BOOT_STATUS_IN_LEN), - MAX(MC_CMD_GET_VERSION_OUT_LEN, - MC_CMD_GET_BOOT_STATUS_OUT_LEN)); - efx_word_t *ver_words; - uint16_t version[4]; - uint32_t build; - efx_mcdi_boot_t status; + MC_CMD_GET_VERSION_IN_LEN, + MC_CMD_GET_VERSION_OUT_LEN); + size_t min_resp_len_required; + efx_mcdi_req_t req; efx_rc_t rc; + EFX_STATIC_ASSERT(sizeof (verp->emv_version) == + MC_CMD_GET_VERSION_OUT_VERSION_LEN); + EFX_STATIC_ASSERT(sizeof (verp->emv_firmware) == + MC_CMD_GET_VERSION_OUT_FIRMWARE_LEN); + EFSYS_ASSERT3U(enp->en_features, &, EFX_FEATURE_MCDI); req.emr_cmd = MC_CMD_GET_VERSION; req.emr_in_buf = payload; - req.emr_in_length = MC_CMD_GET_VERSION_IN_LEN; req.emr_out_buf = payload; + req.emr_in_length = MC_CMD_GET_VERSION_IN_LEN; req.emr_out_length = MC_CMD_GET_VERSION_OUT_LEN; + min_resp_len_required = MC_CMD_GET_VERSION_V0_OUT_LEN; + efx_mcdi_execute(enp, &req); if (req.emr_rc != 0) { @@ -994,34 +995,56 @@ efx_mcdi_version( goto fail1; } - /* bootrom support */ - if (req.emr_out_length_used == MC_CMD_GET_VERSION_V0_OUT_LEN) { - version[0] = version[1] = version[2] = version[3] = 0; - build = MCDI_OUT_DWORD(req, GET_VERSION_OUT_FIRMWARE); - - goto version; - } - - if (req.emr_out_length_used < MC_CMD_GET_VERSION_OUT_LEN) { + if (req.emr_out_length_used < min_resp_len_required) { rc = EMSGSIZE; goto fail2; } - ver_words = MCDI_OUT2(req, efx_word_t, GET_VERSION_OUT_VERSION); - version[0] = EFX_WORD_FIELD(ver_words[0], EFX_WORD_0); - version[1] = EFX_WORD_FIELD(ver_words[1], EFX_WORD_0); - version[2] = EFX_WORD_FIELD(ver_words[2], EFX_WORD_0); - version[3] = EFX_WORD_FIELD(ver_words[3], EFX_WORD_0); - build = MCDI_OUT_DWORD(req, GET_VERSION_OUT_FIRMWARE); + memset(verp, 0, sizeof (*verp)); -version: - /* The bootrom doesn't understand BOOT_STATUS */ - if (MC_FW_VERSION_IS_BOOTLOADER(build)) { - status = EFX_MCDI_BOOT_ROM; - goto out; + if (req.emr_out_length_used > min_resp_len_required) { + efx_word_t *ver_words; + + if (req.emr_out_length_used < MC_CMD_GET_VERSION_OUT_LEN) { + rc = EMSGSIZE; + goto fail3; + } + + ver_words = MCDI_OUT2(req, efx_word_t, GET_VERSION_OUT_VERSION); + + verp->emv_version[0] = EFX_WORD_FIELD(ver_words[0], EFX_WORD_0); + verp->emv_version[1] = EFX_WORD_FIELD(ver_words[1], EFX_WORD_0); + verp->emv_version[2] = EFX_WORD_FIELD(ver_words[2], EFX_WORD_0); + verp->emv_version[3] = EFX_WORD_FIELD(ver_words[3], EFX_WORD_0); } - (void) memset(payload, 0, sizeof (payload)); + verp->emv_firmware = MCDI_OUT_DWORD(req, GET_VERSION_OUT_FIRMWARE); + + return (0); + +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + + return (rc); +} + +static __checkReturn efx_rc_t +efx_mcdi_get_boot_status( + __in efx_nic_t *enp, + __out efx_mcdi_boot_t *statusp) +{ + EFX_MCDI_DECLARE_BUF(payload, + MC_CMD_GET_BOOT_STATUS_IN_LEN, + MC_CMD_GET_BOOT_STATUS_OUT_LEN); + efx_mcdi_req_t req; + efx_rc_t rc; + + EFSYS_ASSERT3U(enp->en_features, &, EFX_FEATURE_MCDI); + req.emr_cmd = MC_CMD_GET_BOOT_STATUS; req.emr_in_buf = payload; req.emr_in_length = MC_CMD_GET_BOOT_STATUS_IN_LEN; @@ -1030,44 +1053,73 @@ efx_mcdi_version( efx_mcdi_execute_quiet(enp, &req); - if (req.emr_rc == EACCES) { - /* Unprivileged functions cannot access BOOT_STATUS */ - status = EFX_MCDI_BOOT_PRIMARY; - version[0] = version[1] = version[2] = version[3] = 0; - build = 0; - goto out; - } - if (req.emr_rc != 0) { rc = req.emr_rc; - goto fail3; + goto fail1; } if (req.emr_out_length_used < MC_CMD_GET_BOOT_STATUS_OUT_LEN) { rc = EMSGSIZE; - goto fail4; + goto fail2; } if (MCDI_OUT_DWORD_FIELD(req, GET_BOOT_STATUS_OUT_FLAGS, GET_BOOT_STATUS_OUT_FLAGS_PRIMARY)) - status = EFX_MCDI_BOOT_PRIMARY; + *statusp = EFX_MCDI_BOOT_PRIMARY; else - status = EFX_MCDI_BOOT_SECONDARY; + *statusp = EFX_MCDI_BOOT_SECONDARY; + + return (0); + +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + + return (rc); +} + + __checkReturn efx_rc_t +efx_mcdi_version( + __in efx_nic_t *enp, + __out_ecount_opt(4) uint16_t versionp[4], + __out_opt uint32_t *buildp, + __out_opt efx_mcdi_boot_t *statusp) +{ + efx_mcdi_version_t ver; + efx_mcdi_boot_t status; + efx_rc_t rc; + + rc = efx_mcdi_get_version(enp, &ver); + if (rc != 0) + goto fail1; + + /* The bootrom doesn't understand BOOT_STATUS */ + if (MC_FW_VERSION_IS_BOOTLOADER(ver.emv_firmware)) { + status = EFX_MCDI_BOOT_ROM; + goto out; + } + + rc = efx_mcdi_get_boot_status(enp, &status); + if (rc == EACCES) { + /* Unprivileged functions cannot access BOOT_STATUS */ + status = EFX_MCDI_BOOT_PRIMARY; + memset(ver.emv_version, 0, sizeof (ver.emv_version)); + ver.emv_firmware = 0; + } else if (rc != 0) { + goto fail2; + } out: if (versionp != NULL) - memcpy(versionp, version, sizeof (version)); + memcpy(versionp, ver.emv_version, sizeof (ver.emv_version)); if (buildp != NULL) - *buildp = build; + *buildp = ver.emv_firmware; if (statusp != NULL) *statusp = status; return (0); -fail4: - EFSYS_PROBE(fail4); -fail3: - EFSYS_PROBE(fail3); fail2: EFSYS_PROBE(fail2); fail1: diff --git a/drivers/common/sfc_efx/base/efx_mcdi.h b/drivers/common/sfc_efx/base/efx_mcdi.h index 9dd0a23862..8b50b8a949 100644 --- a/drivers/common/sfc_efx/base/efx_mcdi.h +++ b/drivers/common/sfc_efx/base/efx_mcdi.h @@ -118,6 +118,18 @@ efx_mcdi_raise_exception( __in_opt efx_mcdi_req_t *emrp, __in int rc); +typedef struct efx_mcdi_version_s { + /* Basic version information */ + uint16_t emv_version[4]; + uint32_t emv_firmware; +} efx_mcdi_version_t; + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +efx_mcdi_get_version( + __in efx_nic_t *enp, + __out efx_mcdi_version_t *verp); + typedef enum efx_mcdi_boot_e { EFX_MCDI_BOOT_PRIMARY, EFX_MCDI_BOOT_SECONDARY, From patchwork Tue Oct 20 08:48:08 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81503 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 15735A04DD; Tue, 20 Oct 2020 11:11:09 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id F3285CFE7; Tue, 20 Oct 2020 10:50:34 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 6C622BBAE for ; Tue, 20 Oct 2020 10:49:10 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 1B5DF6005A for ; Tue, 20 Oct 2020 08:49:08 +0000 (UTC) Received: from us4-mdac16-41.ut7.mdlocal (unknown [10.7.64.23]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 1BFBE8009E for ; Tue, 20 Oct 2020 08:49:08 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.41]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 98D4B80056 for ; Tue, 20 Oct 2020 08:49:07 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 4BD704C005C for ; Tue, 20 Oct 2020 08:49:07 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnvY030801; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id DF6FF1613AB; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:08 +0100 Message-ID: <1603183709-23420-42-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-3.744000-8.000000-10 X-TMASE-MatchedRID: USBznjRQ989MPcmMaoae6R3EEAbn+GRbOTjDMsgp/8GrZHMcVOhFSMzp aT8RVq/tFGVIZCbILXTy7+YHWQ1L0RskZmIm07Kryf21YeIsPYZ6i696PjRPiA5bRK3kNPhULPJ tWpbJjY12wcINfceTjnDlPghqPnfyhmayTFnN39Yn6YVq3MQsI1M8G40owbvKCmsLHmesXbFtqw 6rEcE6N94uOUmYluEd0zoQrejyE606NBdUxznZvceuFL5UpINx70qdorrh7aL3Ru3JrjJxKJPpO oE2MGLrAz50BRibi1tRKFInjeMGM7xfZDNk09XDjhVIiMAyis7M8zLNncnslfkuQv9PIVnNouaX E/reSZkbpFu2LL52JiA7TAOaRNCdDPIzF4wRfrAURSScn+QSXtADGm4LoiiT+gtHj7OwNO0NstC Xmf87HH6NWRsXLx5K5F9kzd71rK3ruNneCXN7kbZenzIjRXqmhtxeP8NjoZG6uY1l2joOgMSa0Y kW2GDPbpmIqVEZl89NS22e9i4qE9pAu0sLxpSoQ8G+yYJYYdZRZDsGiXQioBjm28f1HLY3 X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--3.744000-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183748-mB1LQfeKMz4Q X-PPE-DISP: 1603183748;mB1LQfeKMz4Q Subject: [dpdk-dev] [PATCH 41/62] common/sfc_efx/base: add an API for querying board info X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Riverhead boards can provide extended version information. Implement facilities necessary to obtain it. Add an API for querying board information. A client driver may use this to discover which of its instances relate to which physical boards, based on board serial number persistence for a given physical board. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko --- drivers/common/sfc_efx/base/efx.h | 16 +++++++ drivers/common/sfc_efx/base/efx_mcdi.c | 48 ++++++++++++++++--- drivers/common/sfc_efx/base/efx_mcdi.h | 18 +++++++ drivers/common/sfc_efx/base/efx_nic.c | 46 ++++++++++++++++++ .../sfc_efx/rte_common_sfc_efx_version.map | 1 + 5 files changed, 123 insertions(+), 6 deletions(-) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 4a4dc8ba4d..75edb59a49 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -1647,6 +1647,22 @@ efx_nic_get_fw_version( __in efx_nic_t *enp, __out efx_nic_fw_info_t *enfip); +#define EFX_NIC_BOARD_INFO_SERIAL_LEN (64) +#define EFX_NIC_BOARD_INFO_NAME_LEN (16) + +typedef struct efx_nic_board_info_s { + /* The following two fields are NUL-terminated ASCII strings. */ + char enbi_serial[EFX_NIC_BOARD_INFO_SERIAL_LEN]; + char enbi_name[EFX_NIC_BOARD_INFO_NAME_LEN]; + uint32_t enbi_revision; +} efx_nic_board_info_t; + +LIBEFX_API +extern __checkReturn efx_rc_t +efx_nic_get_board_info( + __in efx_nic_t *enp, + __out efx_nic_board_info_t *board_infop); + /* Driver resource limits (minimum required/maximum usable). */ typedef struct efx_drv_limits_s { uint32_t edl_min_evq_count; diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c index edd069c969..8c984d8cad 100644 --- a/drivers/common/sfc_efx/base/efx_mcdi.c +++ b/drivers/common/sfc_efx/base/efx_mcdi.c @@ -964,11 +964,13 @@ efx_mcdi_ev_death( __checkReturn efx_rc_t efx_mcdi_get_version( __in efx_nic_t *enp, + __in uint32_t flags_req, __out efx_mcdi_version_t *verp) { + efx_nic_board_info_t *board_infop = &verp->emv_board_info; EFX_MCDI_DECLARE_BUF(payload, - MC_CMD_GET_VERSION_IN_LEN, - MC_CMD_GET_VERSION_OUT_LEN); + MC_CMD_GET_VERSION_EXT_IN_LEN, + MC_CMD_GET_VERSION_V2_OUT_LEN); size_t min_resp_len_required; efx_mcdi_req_t req; efx_rc_t rc; @@ -978,15 +980,35 @@ efx_mcdi_get_version( EFX_STATIC_ASSERT(sizeof (verp->emv_firmware) == MC_CMD_GET_VERSION_OUT_FIRMWARE_LEN); + EFX_STATIC_ASSERT(EFX_MCDI_VERSION_BOARD_INFO == + (1U << MC_CMD_GET_VERSION_V2_OUT_BOARD_EXT_INFO_PRESENT_LBN)); + + EFX_STATIC_ASSERT(sizeof (board_infop->enbi_serial) == + MC_CMD_GET_VERSION_V2_OUT_BOARD_SERIAL_LEN); + EFX_STATIC_ASSERT(sizeof (board_infop->enbi_name) == + MC_CMD_GET_VERSION_V2_OUT_BOARD_NAME_LEN); + EFX_STATIC_ASSERT(sizeof (board_infop->enbi_revision) == + MC_CMD_GET_VERSION_V2_OUT_BOARD_REVISION_LEN); + EFSYS_ASSERT3U(enp->en_features, &, EFX_FEATURE_MCDI); req.emr_cmd = MC_CMD_GET_VERSION; req.emr_in_buf = payload; req.emr_out_buf = payload; - req.emr_in_length = MC_CMD_GET_VERSION_IN_LEN; - req.emr_out_length = MC_CMD_GET_VERSION_OUT_LEN; - min_resp_len_required = MC_CMD_GET_VERSION_V0_OUT_LEN; + if (flags_req != 0) { + /* Request basic + extended version information. */ + req.emr_in_length = MC_CMD_GET_VERSION_EXT_IN_LEN; + req.emr_out_length = MC_CMD_GET_VERSION_V2_OUT_LEN; + + min_resp_len_required = MC_CMD_GET_VERSION_V2_OUT_LEN; + } else { + /* Request only basic version information. */ + req.emr_in_length = MC_CMD_GET_VERSION_IN_LEN; + req.emr_out_length = MC_CMD_GET_VERSION_OUT_LEN; + + min_resp_len_required = MC_CMD_GET_VERSION_V0_OUT_LEN; + } efx_mcdi_execute(enp, &req); @@ -1020,6 +1042,20 @@ efx_mcdi_get_version( verp->emv_firmware = MCDI_OUT_DWORD(req, GET_VERSION_OUT_FIRMWARE); + verp->emv_flags = MCDI_OUT_DWORD(req, GET_VERSION_V2_OUT_FLAGS); + verp->emv_flags &= flags_req; + + if ((verp->emv_flags & EFX_MCDI_VERSION_BOARD_INFO) != 0) { + memcpy(board_infop->enbi_serial, + MCDI_OUT2(req, char, GET_VERSION_V2_OUT_BOARD_SERIAL), + sizeof (board_infop->enbi_serial)); + memcpy(board_infop->enbi_name, + MCDI_OUT2(req, char, GET_VERSION_V2_OUT_BOARD_NAME), + sizeof (board_infop->enbi_name)); + board_infop->enbi_revision = + MCDI_OUT_DWORD(req, GET_VERSION_V2_OUT_BOARD_REVISION); + } + return (0); fail3: @@ -1090,7 +1126,7 @@ efx_mcdi_version( efx_mcdi_boot_t status; efx_rc_t rc; - rc = efx_mcdi_get_version(enp, &ver); + rc = efx_mcdi_get_version(enp, 0, &ver); if (rc != 0) goto fail1; diff --git a/drivers/common/sfc_efx/base/efx_mcdi.h b/drivers/common/sfc_efx/base/efx_mcdi.h index 8b50b8a949..0b39a6f7f6 100644 --- a/drivers/common/sfc_efx/base/efx_mcdi.h +++ b/drivers/common/sfc_efx/base/efx_mcdi.h @@ -118,16 +118,34 @@ efx_mcdi_raise_exception( __in_opt efx_mcdi_req_t *emrp, __in int rc); +/* + * Flags that name portions of extended version information + * + * The values match their MCDI counterparts. + */ +#define EFX_MCDI_VERSION_BOARD_INFO (1U << 4) + typedef struct efx_mcdi_version_s { /* Basic version information */ uint16_t emv_version[4]; uint32_t emv_firmware; + + /* + * Extended version information + * + * Valid portions of obtained information are indicated by flags. + */ + uint32_t emv_flags; + + /* Information valid if emv_flags has EFX_MCDI_VERSION_BOARD_INFO set */ + efx_nic_board_info_t emv_board_info; } efx_mcdi_version_t; LIBEFX_INTERNAL extern __checkReturn efx_rc_t efx_mcdi_get_version( __in efx_nic_t *enp, + __in uint32_t flags_req, __out efx_mcdi_version_t *verp); typedef enum efx_mcdi_boot_e { diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c index a78c4c3737..7c28fb1744 100644 --- a/drivers/common/sfc_efx/base/efx_nic.c +++ b/drivers/common/sfc_efx/base/efx_nic.c @@ -791,6 +791,52 @@ efx_nic_get_fw_version( return (0); +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + + return (rc); +} + + __checkReturn efx_rc_t +efx_nic_get_board_info( + __in efx_nic_t *enp, + __out efx_nic_board_info_t *board_infop) +{ + efx_mcdi_version_t ver; + efx_rc_t rc; + + EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MCDI); + EFSYS_ASSERT3U(enp->en_features, &, EFX_FEATURE_MCDI); + + rc = efx_mcdi_get_version(enp, EFX_MCDI_VERSION_BOARD_INFO, &ver); + if (rc == EMSGSIZE) { + /* + * Typically, EMSGSIZE is returned by above call in the + * case when the NIC does not provide extra information. + */ + rc = ENOTSUP; + goto fail1; + } else if (rc != 0) { + goto fail2; + } + + if ((ver.emv_flags & EFX_MCDI_VERSION_BOARD_INFO) == 0) { + rc = ENOTSUP; + goto fail3; + } + + memcpy(board_infop, &ver.emv_board_info, sizeof (*board_infop)); + + /* MCDI should provide NUL-terminated strings, but stay vigilant. */ + board_infop->enbi_serial[sizeof (board_infop->enbi_serial) - 1] = '\0'; + board_infop->enbi_name[sizeof (board_infop->enbi_name) - 1] = '\0'; + + return (0); + fail3: EFSYS_PROBE(fail3); fail2: diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index 7cc692db3f..37056abd60 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -131,6 +131,7 @@ INTERNAL { efx_nic_destroy; efx_nic_fini; efx_nic_get_bar_region; + efx_nic_get_board_info; efx_nic_get_fw_subvariant; efx_nic_get_fw_version; efx_nic_get_vi_pool; From patchwork Tue Oct 20 08:48:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81501 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 853BCA04DD; Tue, 20 Oct 2020 11:10:25 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 295ACCFB1; Tue, 20 Oct 2020 10:50:32 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 2D244BBC2 for ; Tue, 20 Oct 2020 10:49:08 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 947686008F for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from us4-mdac16-75.ut7.mdlocal (unknown [10.7.64.194]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 953168009E for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.199]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 23A4680057 for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id CE5BE18005B for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8moXo030863; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id EE6471613BE; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:09 +0100 Message-ID: <1603183709-23420-43-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-3.017700-8.000000-10 X-TMASE-MatchedRID: sYi+h+oAOhT90dfary0jKDPF07YFM7bTa01mhnn7t6TplCKCpVh6EKq9 0Gjn1y697hDaMZWnA/ExXjnD5osbhP1PYuSZ5yXpqJSK+HSPY+/pVMb1xnESMgaYevV4zG3ZQBz oPKhLasitcw7GcMT4xCU0wC5DqKBIeEvDBxAaKu0Pe5gzF3TVt7qGBW9J0Yqje7ijHq7g9oY6ZF n4DNCez5Mtkj+Hp5J39OL9KY9jgW4YB2fOueQzjxRFJJyf5BJe0AMabguiKJP6C0ePs7A07X1Hh KzShSYnctGEZzK2aB7esV1a3n7zixIep12qiNx4E2x16uMCY42SEWPXfMCsVPtRkLrI9ieM4L6E wG9oaSm4DRfskASiEDLh4ElT3qLg2kC7SwvGlKhDwb7Jglhh1lFkOwaJdCKgGObbx/Uctjc= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--3.017700-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183745-CMylSaI6B9ds X-PPE-DISP: 1603183745;CMylSaI6B9ds Subject: [dpdk-dev] [PATCH 42/62] net/sfc: add HW switch ID helpers X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov The driver will need a means to figure out relationship between RTE ethdev instances and underlying HW switch entities. For now, use board serial number string as a unique HW switch identifier. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/net/sfc/sfc.c | 44 +++++++++++++++++++++++++++++++++++++++++++ drivers/net/sfc/sfc.h | 8 ++++++++ 2 files changed, 52 insertions(+) diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c index 3b896490f7..a4fe495788 100644 --- a/drivers/net/sfc/sfc.c +++ b/drivers/net/sfc/sfc.c @@ -1259,3 +1259,47 @@ sfc_register_logtype(const struct rte_pci_addr *pci_addr, return ret; } + +struct sfc_hw_switch_id { + char board_sn[RTE_SIZEOF_FIELD(efx_nic_board_info_t, enbi_serial)]; +}; + +int +sfc_hw_switch_id_init(struct sfc_adapter *sa, + struct sfc_hw_switch_id **idp) +{ + efx_nic_board_info_t board_info; + struct sfc_hw_switch_id *id; + int rc; + + if (idp == NULL) + return EINVAL; + + id = rte_zmalloc("sfc_hw_switch_id", sizeof(*id), 0); + if (id == NULL) + return ENOMEM; + + rc = efx_nic_get_board_info(sa->nic, &board_info); + if (rc != 0) + return rc; + + memcpy(id->board_sn, board_info.enbi_serial, sizeof(id->board_sn)); + + *idp = id; + + return 0; +} + +void +sfc_hw_switch_id_fini(__rte_unused struct sfc_adapter *sa, + struct sfc_hw_switch_id *id) +{ + rte_free(id); +} + +bool +sfc_hw_switch_ids_equal(const struct sfc_hw_switch_id *left, + const struct sfc_hw_switch_id *right) +{ + return strcmp(left->board_sn, right->board_sn) == 0; +} diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h index 4b5d687108..ed059e142f 100644 --- a/drivers/net/sfc/sfc.h +++ b/drivers/net/sfc/sfc.h @@ -403,6 +403,14 @@ int sfc_port_reset_mac_stats(struct sfc_adapter *sa); int sfc_set_rx_mode(struct sfc_adapter *sa); int sfc_set_rx_mode_unchecked(struct sfc_adapter *sa); +struct sfc_hw_switch_id; + +int sfc_hw_switch_id_init(struct sfc_adapter *sa, + struct sfc_hw_switch_id **idp); +void sfc_hw_switch_id_fini(struct sfc_adapter *sa, + struct sfc_hw_switch_id *idp); +bool sfc_hw_switch_ids_equal(const struct sfc_hw_switch_id *left, + const struct sfc_hw_switch_id *right); #ifdef __cplusplus } From patchwork Tue Oct 20 08:48:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81500 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 298B4A04DD; Tue, 20 Oct 2020 11:10:06 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C3A81CF8D; Tue, 20 Oct 2020 10:50:30 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 4B199BBAE for ; Tue, 20 Oct 2020 10:49:08 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.64]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id CD1C06008C for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from us4-mdac16-1.ut7.mdlocal (unknown [10.7.65.69]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id CB61C2009B for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.41]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 3AF7E220052 for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id E3CF14C0059 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnva030801; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 090B01613CB; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:10 +0100 Message-ID: <1603183709-23420-44-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-6.415900-8.000000-10 X-TMASE-MatchedRID: uf0j0HzgYrMfKML5AJtfLf3HILfxLV/9S6mvV++TKmlxhjGz7lumrwgI aaSer6PCk/P0B8S1IYLKHBviWj0QRj09o8PhVkSdW1M77Gh1ugZzmB71otxffG82zvsXichaNF9 CGqne0yx9o40ln6gi8cGddr3VWQDjIvi8tYxfenGolIr4dI9j7+lUxvXGcRIyBph69XjMbdmAec OigRAlta3aC25avUua+WHc8RqHeHV/GxHOvf6lEub3p4cnIXGN2csA2In0nraPiMW+3YzkggTqf /Dg2cz8JORm1qaXr4cidYoCHucQNWiqvF73selK9Jn/ZrGuc8HdXhRKGhNdp+ZMicrOlIVJsskC J7yz5Px0dwyXsNLGVLSJSoi4LGd3LDvpFRH1bkIPe5gzF3TVt3Hv4qNcyiZVY7Fv3XBzv+HK1N5 uMH+VUP5er2rP1IKr79lqEzYHnGwEGNruDgdTzRzsdVXXq/9LsGJsaKyZd0TplCKCpVh6EOyrhS 15CsznvUaRai4wxazMUkPBkCEgxDpCGMf9ktTQSszr2nuUNKwvXkmKVNgrflTFKQBe714nChY+H tJZ2GPE+nTdM2Xui1twxqU1OpW/rFMDyJP7G26a+cpJvTbSHDtwRuVgSp+1RjHvrQ40NxZ+4PU2 eqLaIsId/fzQe6Zn7+ab+FAmr9v5+oRgEhP056am63kopwnT3WFaxVW7M2ged11F9IsKFK6vdXP rzehX5J+kpDMEvF1szYb0YTsqVyQYHMLagAMBngIgpj8eDcAZ1CdBJOsoY8RB0bsfrpPIx1FPlN AAmcAkz69GaAoQFqvM9ZiezkVQkc7fz1ZZZHZ0zqrhnMSJ2J6oP1a0mRIj X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--6.415900-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183745-Y5j3GzIL-Utc X-PPE-DISP: 1603183745;Y5j3GzIL-Utc Subject: [dpdk-dev] [PATCH 43/62] net/sfc: support the concept of RTE switch domains/ports X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov A later patch will add support for RTE flow action PORT_ID to MAE backend. The driver has to ensure that such actions refer to RTE ethdev instances deployed on top of the same physical device. Also, the driver needs a means to find sibling RTE ethdev instances when parsing such actions. In order to solve these problems, add a switch infrastructure which allocates switch domains based on persistence of device serial number string across switch ports included in a domain. Explain mapping between RTE switch port IDs and MAE endpoints. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/net/sfc/meson.build | 1 + drivers/net/sfc/sfc_ethdev.c | 7 + drivers/net/sfc/sfc_mae.c | 35 +++++ drivers/net/sfc/sfc_mae.h | 6 + drivers/net/sfc/sfc_switch.c | 276 +++++++++++++++++++++++++++++++++++ drivers/net/sfc/sfc_switch.h | 47 ++++++ 6 files changed, 372 insertions(+) create mode 100644 drivers/net/sfc/sfc_switch.c create mode 100644 drivers/net/sfc/sfc_switch.h diff --git a/drivers/net/sfc/meson.build b/drivers/net/sfc/meson.build index 7a893080cb..42b184c29e 100644 --- a/drivers/net/sfc/meson.build +++ b/drivers/net/sfc/meson.build @@ -47,6 +47,7 @@ sources = files( 'sfc_tx.c', 'sfc_tso.c', 'sfc_filter.c', + 'sfc_switch.c', 'sfc_mae.c', 'sfc_flow.c', 'sfc_dp.c', diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index c0672083ec..107dd0f470 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -93,6 +93,7 @@ sfc_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev); struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev); struct sfc_rss *rss = &sas->rss; + struct sfc_mae *mae = &sa->mae; uint64_t txq_offloads_def = 0; sfc_log_init(sa, "entry"); @@ -187,6 +188,12 @@ sfc_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->dev_capa = RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP | RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP; + if (mae->status == SFC_MAE_STATUS_SUPPORTED) { + dev_info->switch_info.name = dev->device->driver->name; + dev_info->switch_info.domain_id = mae->switch_domain_id; + dev_info->switch_info.port_id = mae->switch_port_id; + } + return 0; } diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index a5800ae722..64cd6b0e9b 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -15,11 +15,24 @@ #include "sfc.h" #include "sfc_log.h" +#include "sfc_switch.h" + +static int +sfc_mae_assign_entity_mport(struct sfc_adapter *sa, + efx_mport_sel_t *mportp) +{ + const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic); + + return efx_mae_mport_by_pcie_function(encp->enc_pf, encp->enc_vf, + mportp); +} int sfc_mae_attach(struct sfc_adapter *sa) { + struct sfc_mae_switch_port_request switch_port_request = {0}; const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic); + efx_mport_sel_t entity_mport; struct sfc_mae *mae = &sa->mae; efx_mae_limits_t limits; int rc; @@ -41,6 +54,25 @@ sfc_mae_attach(struct sfc_adapter *sa) if (rc != 0) goto fail_mae_get_limits; + sfc_log_init(sa, "assign entity MPORT"); + rc = sfc_mae_assign_entity_mport(sa, &entity_mport); + if (rc != 0) + goto fail_mae_assign_entity_mport; + + sfc_log_init(sa, "assign RTE switch domain"); + rc = sfc_mae_assign_switch_domain(sa, &mae->switch_domain_id); + if (rc != 0) + goto fail_mae_assign_switch_domain; + + sfc_log_init(sa, "assign RTE switch port"); + switch_port_request.type = SFC_MAE_SWITCH_PORT_INDEPENDENT; + switch_port_request.entity_mportp = &entity_mport; + rc = sfc_mae_assign_switch_port(mae->switch_domain_id, + &switch_port_request, + &mae->switch_port_id); + if (rc != 0) + goto fail_mae_assign_switch_port; + mae->status = SFC_MAE_STATUS_SUPPORTED; mae->nb_action_rule_prios_max = limits.eml_max_n_action_prios; TAILQ_INIT(&mae->action_sets); @@ -49,6 +81,9 @@ sfc_mae_attach(struct sfc_adapter *sa) return 0; +fail_mae_assign_switch_port: +fail_mae_assign_switch_domain: +fail_mae_assign_entity_mport: fail_mae_get_limits: efx_mae_fini(sa->nic); diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index 3c34d08f88..f92e62dcbe 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -12,6 +12,8 @@ #include +#include + #include "efx.h" #ifdef __cplusplus @@ -45,6 +47,10 @@ enum sfc_mae_status { }; struct sfc_mae { + /** Assigned switch domain identifier */ + uint16_t switch_domain_id; + /** Assigned switch port identifier */ + uint16_t switch_port_id; /** NIC support for MAE status */ enum sfc_mae_status status; /** Priority level limit for MAE action rules */ diff --git a/drivers/net/sfc/sfc_switch.c b/drivers/net/sfc/sfc_switch.c new file mode 100644 index 0000000000..395fc40263 --- /dev/null +++ b/drivers/net/sfc/sfc_switch.c @@ -0,0 +1,276 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * + * Copyright(c) 2019-2020 Xilinx, Inc. + * Copyright(c) 2019 Solarflare Communications Inc. + * + * This software was jointly developed between OKTET Labs (under contract + * for Solarflare) and Solarflare Communications, Inc. + */ + +#include + +#include +#include + +#include "efx.h" + +#include "sfc.h" +#include "sfc_log.h" +#include "sfc_switch.h" + +/** + * Switch port registry entry. + * + * Drivers aware of RTE switch domains also have to maintain RTE switch + * port IDs for RTE ethdev instances they operate. These IDs are supposed + * to stand for physical interconnect entities, in example, PCIe functions. + * + * In terms of MAE, a physical interconnect entity can be referred to using + * an MPORT selector, that is, a 32-bit value. RTE switch port IDs, in turn, + * are 16-bit values, so indirect mapping has to be maintained: + * + * +--------------------+ +---------------------------------------+ + * | RTE switch port ID | ------ | MAE switch port entry | + * +--------------------+ | --------------------- | + * | | + * | Entity (PCIe function) MPORT selector | + * | + | + * | Port type (independent/representor) | + * +---------------------------------------+ + * + * This mapping comprises a port type to ensure that RTE switch port ID + * of a represented entity and that of its representor are different in + * the case when the entity gets plugged into DPDK and not into a guest. + */ +struct sfc_mae_switch_port { + TAILQ_ENTRY(sfc_mae_switch_port) switch_domain_ports; + + /** Entity (PCIe function) MPORT selector */ + efx_mport_sel_t entity_mport; + /** Port type (independent/representor) */ + enum sfc_mae_switch_port_type type; + /** RTE switch port ID */ + uint16_t id; +}; + +TAILQ_HEAD(sfc_mae_switch_ports, sfc_mae_switch_port); + +/** + * Switch domain registry entry. + * + * Even if an RTE ethdev instance gets unplugged, the corresponding + * entry in the switch port registry will not be removed because the + * entity (PCIe function) MPORT is static and cannot change. If this + * RTE ethdev gets plugged back, the entry will be reused, and + * RTE switch port ID will be the same. + */ +struct sfc_mae_switch_domain { + TAILQ_ENTRY(sfc_mae_switch_domain) entries; + + /** HW switch ID */ + struct sfc_hw_switch_id *hw_switch_id; + /** The number of ports in the switch port registry */ + unsigned int nb_ports; + /** Switch port registry */ + struct sfc_mae_switch_ports ports; + /** RTE switch domain ID allocated for a group of devices */ + uint16_t id; +}; + +TAILQ_HEAD(sfc_mae_switch_domains, sfc_mae_switch_domain); + +/** + * MAE representation of RTE switch infrastructure. + * + * It is possible that an RTE flow API client tries to insert a rule + * referencing an RTE ethdev deployed on top of a different physical + * device (it may belong to the same vendor or not). This particular + * driver/engine cannot support this and has to turn down such rules. + * + * Technically, it's HW switch identifier which, if queried for each + * RTE ethdev instance, indicates relationship between the instances. + * In the meantime, RTE flow API clients also need to somehow figure + * out relationship between RTE ethdev instances in advance. + * + * The concept of RTE switch domains resolves this issue. The driver + * maintains a static list of switch domains which is easy to browse, + * and each RTE ethdev fills RTE switch parameters in device + * information structure which is made available to clients. + * + * Even if all RTE ethdev instances belonging to a switch domain get + * unplugged, the corresponding entry in the switch domain registry + * will not be removed because the corresponding HW switch exists + * regardless of its ports being plugged to DPDK or kept aside. + * If a port gets plugged back to DPDK, the corresponding + * RTE ethdev will indicate the same RTE switch domain ID. + */ +struct sfc_mae_switch { + /** A lock to protect the whole structure */ + rte_spinlock_t lock; + /** Switch domain registry */ + struct sfc_mae_switch_domains domains; +}; + +static struct sfc_mae_switch sfc_mae_switch = { + .lock = RTE_SPINLOCK_INITIALIZER, + .domains = TAILQ_HEAD_INITIALIZER(sfc_mae_switch.domains), +}; + + +/* This function expects to be called only when the lock is held */ +static struct sfc_mae_switch_domain * +sfc_mae_find_switch_domain_by_id(uint16_t switch_domain_id) +{ + struct sfc_mae_switch_domain *domain; + + SFC_ASSERT(rte_spinlock_is_locked(&sfc_mae_switch.lock)); + + TAILQ_FOREACH(domain, &sfc_mae_switch.domains, entries) { + if (domain->id == switch_domain_id) + return domain; + } + + return NULL; +} + +/* This function expects to be called only when the lock is held */ +static struct sfc_mae_switch_domain * +sfc_mae_find_switch_domain_by_hw_switch_id(const struct sfc_hw_switch_id *id) +{ + struct sfc_mae_switch_domain *domain; + + SFC_ASSERT(rte_spinlock_is_locked(&sfc_mae_switch.lock)); + + TAILQ_FOREACH(domain, &sfc_mae_switch.domains, entries) { + if (sfc_hw_switch_ids_equal(domain->hw_switch_id, id)) + return domain; + } + + return NULL; +} + +int +sfc_mae_assign_switch_domain(struct sfc_adapter *sa, + uint16_t *switch_domain_id) +{ + struct sfc_hw_switch_id *hw_switch_id; + struct sfc_mae_switch_domain *domain; + int rc; + + rte_spinlock_lock(&sfc_mae_switch.lock); + + rc = sfc_hw_switch_id_init(sa, &hw_switch_id); + if (rc != 0) + goto fail_hw_switch_id_init; + + domain = sfc_mae_find_switch_domain_by_hw_switch_id(hw_switch_id); + if (domain != NULL) { + sfc_hw_switch_id_fini(sa, hw_switch_id); + goto done; + } + + domain = rte_zmalloc("sfc_mae_switch_domain", sizeof(*domain), 0); + if (domain == NULL) { + rc = ENOMEM; + goto fail_mem_alloc; + } + + /* + * This code belongs to driver init path, that is, negation is + * done at the end of the path by sfc_eth_dev_init(). RTE APIs + * negate error codes, so drop negation here. + */ + rc = -rte_eth_switch_domain_alloc(&domain->id); + if (rc != 0) + goto fail_domain_alloc; + + domain->hw_switch_id = hw_switch_id; + + TAILQ_INIT(&domain->ports); + + TAILQ_INSERT_TAIL(&sfc_mae_switch.domains, domain, entries); + +done: + *switch_domain_id = domain->id; + + rte_spinlock_unlock(&sfc_mae_switch.lock); + + return 0; + +fail_domain_alloc: + rte_free(domain); + +fail_mem_alloc: + sfc_hw_switch_id_fini(sa, hw_switch_id); + rte_spinlock_unlock(&sfc_mae_switch.lock); + +fail_hw_switch_id_init: + return rc; +} + +/* This function expects to be called only when the lock is held */ +static struct sfc_mae_switch_port * +sfc_mae_find_switch_port_by_entity(const struct sfc_mae_switch_domain *domain, + const efx_mport_sel_t *entity_mportp, + enum sfc_mae_switch_port_type type) +{ + struct sfc_mae_switch_port *port; + + SFC_ASSERT(rte_spinlock_is_locked(&sfc_mae_switch.lock)); + + TAILQ_FOREACH(port, &domain->ports, switch_domain_ports) { + if (port->entity_mport.sel == entity_mportp->sel && + port->type == type) + return port; + } + + return NULL; +} + +int +sfc_mae_assign_switch_port(uint16_t switch_domain_id, + const struct sfc_mae_switch_port_request *req, + uint16_t *switch_port_id) +{ + struct sfc_mae_switch_domain *domain; + struct sfc_mae_switch_port *port; + int rc; + + rte_spinlock_lock(&sfc_mae_switch.lock); + + domain = sfc_mae_find_switch_domain_by_id(switch_domain_id); + if (domain == NULL) { + rc = EINVAL; + goto fail_find_switch_domain_by_id; + } + + port = sfc_mae_find_switch_port_by_entity(domain, req->entity_mportp, + req->type); + if (port != NULL) + goto done; + + port = rte_zmalloc("sfc_mae_switch_port", sizeof(*port), 0); + if (port == NULL) { + rc = ENOMEM; + goto fail_mem_alloc; + } + + port->entity_mport.sel = req->entity_mportp->sel; + port->type = req->type; + + port->id = (domain->nb_ports++); + + TAILQ_INSERT_TAIL(&domain->ports, port, switch_domain_ports); + +done: + *switch_port_id = port->id; + + rte_spinlock_unlock(&sfc_mae_switch.lock); + + return 0; + +fail_mem_alloc: +fail_find_switch_domain_by_id: + rte_spinlock_unlock(&sfc_mae_switch.lock); + return rc; +} diff --git a/drivers/net/sfc/sfc_switch.h b/drivers/net/sfc/sfc_switch.h new file mode 100644 index 0000000000..9845ac8801 --- /dev/null +++ b/drivers/net/sfc/sfc_switch.h @@ -0,0 +1,47 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * + * Copyright(c) 2019-2020 Xilinx, Inc. + * Copyright(c) 2019 Solarflare Communications Inc. + * + * This software was jointly developed between OKTET Labs (under contract + * for Solarflare) and Solarflare Communications, Inc. + */ + +#ifndef _SFC_SWITCH_H +#define _SFC_SWITCH_H + +#include + +#include "efx.h" + +#include "sfc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Options for MAE switch port type */ +enum sfc_mae_switch_port_type { + /** + * The switch port is operated by a self-sufficient RTE ethdev + * and thus refers to its underlying PCIe function + */ + SFC_MAE_SWITCH_PORT_INDEPENDENT = 0, +}; + +struct sfc_mae_switch_port_request { + enum sfc_mae_switch_port_type type; + const efx_mport_sel_t *entity_mportp; +}; + +int sfc_mae_assign_switch_domain(struct sfc_adapter *sa, + uint16_t *switch_domain_id); + +int sfc_mae_assign_switch_port(uint16_t switch_domain_id, + const struct sfc_mae_switch_port_request *req, + uint16_t *switch_port_id); + +#ifdef __cplusplus +} +#endif +#endif /* _SFC_SWITCH_H */ From patchwork Tue Oct 20 08:48:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81470 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 84652A04DD; Tue, 20 Oct 2020 10:59:03 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D20C8BC6C; Tue, 20 Oct 2020 10:49:44 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id B76F1BBA6 for ; Tue, 20 Oct 2020 10:49:02 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 02CE560089 for ; Tue, 20 Oct 2020 08:49:01 +0000 (UTC) Received: from us4-mdac16-7.ut7.mdlocal (unknown [10.7.65.75]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 0380B200A0 for ; Tue, 20 Oct 2020 08:49:01 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.33]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 74A511C0054 for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 2AD1FA80061 for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnG3030820; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 15C961616D5; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:11 +0100 Message-ID: <1603183709-23420-45-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.065200-8.000000-10 X-TMASE-MatchedRID: 3ksEd+Y0lhRu0gVhNXVDBHYZxYoZm58FK1PH96GPPGCZfDRE1uqSgu1+ sfrt9AWI2XHJ0L4jOIRTvVffeIwvQ4SH/KD/7QRgnFVnNmvv47tLXPA26IG0hN9RlPzeVuQQbaa h63IrZyfR1p6w/8fEozoDS4rfut35X+8u+zQ7JmKqDSBu0tUhr4HLFWR93TgkHWtVZN0asTi1lc oibF/5wUxwpTUboUzT7uiIyPP00Otw1/wpADjDvGhCG8qMW+KyBnIRIVcCWN9s98Z8fG/6kS9+7 r4Ve5ORzAGZU0rgjylsMyD1FAVfKvzEorjs/fJlD3uYMxd01bd9LQinZ4QefPcjNeVeWlqY+gtH j7OwNO2tdP9AzJTY3NtLmhUDutwNn7lxBBp+zgrK30zxQlCIv9vosV/0Q+z83J0NP0GJI4sA1B7 YuKd0v85ZpbBQ5omwWXp4ELZuAse+BLCmO4JWR9pAu0sLxpSoQ8G+yYJYYdZRZDsGiXQioL4jxK nHJRLcVcr204P67pw= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-1.065200-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183740-LszZGc9bMFIM X-PPE-DISP: 1603183740;LszZGc9bMFIM Subject: [dpdk-dev] [PATCH 44/62] net/sfc: support flow action PORT ID in transfer rules X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov The action handler will use MAE action DELIVER with MPORT of the PCIe function associated with a given DPDK port ID. The DPDK port must not relate to a different physical device. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 2 ++ drivers/net/sfc/sfc_mae.c | 33 ++++++++++++++++++++ drivers/net/sfc/sfc_switch.c | 58 ++++++++++++++++++++++++++++++++++++ drivers/net/sfc/sfc_switch.h | 6 ++++ 4 files changed, 99 insertions(+) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index ba73391d5f..7b8c1c8527 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -218,6 +218,8 @@ Supported actions (***transfer*** rules): - VF +- PORT_ID + - DROP Validating flow rules depends on the firmware variant. diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 64cd6b0e9b..f309efa2cf 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -30,6 +30,7 @@ sfc_mae_assign_entity_mport(struct sfc_adapter *sa, int sfc_mae_attach(struct sfc_adapter *sa) { + struct sfc_adapter_shared * const sas = sfc_sa2shared(sa); struct sfc_mae_switch_port_request switch_port_request = {0}; const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic); efx_mport_sel_t entity_mport; @@ -67,6 +68,12 @@ sfc_mae_attach(struct sfc_adapter *sa) sfc_log_init(sa, "assign RTE switch port"); switch_port_request.type = SFC_MAE_SWITCH_PORT_INDEPENDENT; switch_port_request.entity_mportp = &entity_mport; + /* + * As of now, the driver does not support representors, so + * RTE ethdev MPORT simply matches that of the entity. + */ + switch_port_request.ethdev_mportp = &entity_mport; + switch_port_request.ethdev_port_id = sas->port_id; rc = sfc_mae_assign_switch_port(mae->switch_domain_id, &switch_port_request, &mae->switch_port_id); @@ -793,6 +800,27 @@ sfc_mae_rule_parse_action_pf_vf(struct sfc_adapter *sa, return efx_mae_action_set_populate_deliver(spec, &mport); } +static int +sfc_mae_rule_parse_action_port_id(struct sfc_adapter *sa, + const struct rte_flow_action_port_id *conf, + efx_mae_actions_t *spec) +{ + struct sfc_adapter_shared * const sas = sfc_sa2shared(sa); + struct sfc_mae *mae = &sa->mae; + efx_mport_sel_t mport; + uint16_t port_id; + int rc; + + port_id = (conf->original != 0) ? sas->port_id : conf->id; + + rc = sfc_mae_switch_port_by_ethdev(mae->switch_domain_id, + port_id, &mport); + if (rc != 0) + return rc; + + return efx_mae_action_set_populate_deliver(spec, &mport); +} + static int sfc_mae_rule_parse_action(struct sfc_adapter *sa, const struct rte_flow_action *action, @@ -848,6 +876,11 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa, bundle->actions_mask); rc = sfc_mae_rule_parse_action_pf_vf(sa, action->conf, spec); break; + case RTE_FLOW_ACTION_TYPE_PORT_ID: + SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_PORT_ID, + bundle->actions_mask); + rc = sfc_mae_rule_parse_action_port_id(sa, action->conf, spec); + break; case RTE_FLOW_ACTION_TYPE_DROP: SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_DROP, bundle->actions_mask); diff --git a/drivers/net/sfc/sfc_switch.c b/drivers/net/sfc/sfc_switch.c index 395fc40263..bdea2a2446 100644 --- a/drivers/net/sfc/sfc_switch.c +++ b/drivers/net/sfc/sfc_switch.c @@ -41,10 +41,22 @@ * This mapping comprises a port type to ensure that RTE switch port ID * of a represented entity and that of its representor are different in * the case when the entity gets plugged into DPDK and not into a guest. + * + * Entry data also comprises RTE ethdev's own MPORT. This value + * coincides with the entity MPORT in the case of independent ports. + * In the case of representors, this ID is not a selector and refers + * to an allocatable object (that is, it's likely to change on RTE + * ethdev replug). Flow API backend must use this value rather + * than entity_mport to support flow rule action PORT_ID. */ struct sfc_mae_switch_port { TAILQ_ENTRY(sfc_mae_switch_port) switch_domain_ports; + /** RTE ethdev MPORT */ + efx_mport_sel_t ethdev_mport; + /** RTE ethdev port ID */ + uint16_t ethdev_port_id; + /** Entity (PCIe function) MPORT selector */ efx_mport_sel_t entity_mport; /** Port type (independent/representor) */ @@ -263,6 +275,9 @@ sfc_mae_assign_switch_port(uint16_t switch_domain_id, TAILQ_INSERT_TAIL(&domain->ports, port, switch_domain_ports); done: + port->ethdev_mport = *req->ethdev_mportp; + port->ethdev_port_id = req->ethdev_port_id; + *switch_port_id = port->id; rte_spinlock_unlock(&sfc_mae_switch.lock); @@ -274,3 +289,46 @@ sfc_mae_assign_switch_port(uint16_t switch_domain_id, rte_spinlock_unlock(&sfc_mae_switch.lock); return rc; } + +/* This function expects to be called only when the lock is held */ +static int +sfc_mae_find_switch_port_by_ethdev(uint16_t switch_domain_id, + uint16_t ethdev_port_id, + efx_mport_sel_t *mport_sel) +{ + struct sfc_mae_switch_domain *domain; + struct sfc_mae_switch_port *port; + + SFC_ASSERT(rte_spinlock_is_locked(&sfc_mae_switch.lock)); + + if (ethdev_port_id == RTE_MAX_ETHPORTS) + return EINVAL; + + domain = sfc_mae_find_switch_domain_by_id(switch_domain_id); + if (domain == NULL) + return EINVAL; + + TAILQ_FOREACH(port, &domain->ports, switch_domain_ports) { + if (port->ethdev_port_id == ethdev_port_id) { + *mport_sel = port->ethdev_mport; + return 0; + } + } + + return ENOENT; +} + +int +sfc_mae_switch_port_by_ethdev(uint16_t switch_domain_id, + uint16_t ethdev_port_id, + efx_mport_sel_t *mport_sel) +{ + int rc; + + rte_spinlock_lock(&sfc_mae_switch.lock); + rc = sfc_mae_find_switch_port_by_ethdev(switch_domain_id, + ethdev_port_id, mport_sel); + rte_spinlock_unlock(&sfc_mae_switch.lock); + + return rc; +} diff --git a/drivers/net/sfc/sfc_switch.h b/drivers/net/sfc/sfc_switch.h index 9845ac8801..96ece95654 100644 --- a/drivers/net/sfc/sfc_switch.h +++ b/drivers/net/sfc/sfc_switch.h @@ -32,6 +32,8 @@ enum sfc_mae_switch_port_type { struct sfc_mae_switch_port_request { enum sfc_mae_switch_port_type type; const efx_mport_sel_t *entity_mportp; + const efx_mport_sel_t *ethdev_mportp; + uint16_t ethdev_port_id; }; int sfc_mae_assign_switch_domain(struct sfc_adapter *sa, @@ -41,6 +43,10 @@ int sfc_mae_assign_switch_port(uint16_t switch_domain_id, const struct sfc_mae_switch_port_request *req, uint16_t *switch_port_id); +int sfc_mae_switch_port_by_ethdev(uint16_t switch_domain_id, + uint16_t ethdev_port_id, + efx_mport_sel_t *mport_sel); + #ifdef __cplusplus } #endif From patchwork Tue Oct 20 08:48:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81476 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 492D3A04DD; Tue, 20 Oct 2020 11:01:15 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 29247C81E; Tue, 20 Oct 2020 10:49:53 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id EB4B4BBA6 for ; Tue, 20 Oct 2020 10:49:04 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 78B036004D for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) Received: from us4-mdac16-58.ut7.mdlocal (unknown [10.7.66.29]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 78B518009E for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id DA38580057 for ; Tue, 20 Oct 2020 08:49:02 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 907EB800058 for ; Tue, 20 Oct 2020 08:49:02 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8monK030888; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 22A221613A9; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:12 +0100 Message-ID: <1603183709-23420-46-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.793500-8.000000-10 X-TMASE-MatchedRID: wAskXJFQGCEfKML5AJtfLVkxnoxnQfVSL1eX+z9B1QxwkdIrVt8X1ciT Wug2C4DNNNN0dk/lb45w5T4Iaj538mJZXQNDzktS+ACG5oWJ7tLH6OsXtPNFLT8fBHJpFUzVM/3 +TuDqaXfbChJmGA7/2t7D7QDzMhW65kIIdSBWpoH9tX9U6Guaiti5W7Rf+s6QDpCUEeEFm7AVAs f1+cZFJ5yTP1lsxtj2Ehs1pFGBg9IAH0kGDN+N054CIKY/Hg3AaZGo0EeYG96i9JVLbqc4Fyq2r l3dzGQ1r1S3+0WjH8xzyAqWo2KjhG46VkHHINVQqsDD2EnxKvMtfwKLTZ0mnvjHqksKBdobrUGO Aofsk2R7ux96hbe72RAaAkgNd9JPUMQ8hJn9I6Q4oGQUCbwY5Q+g7mdwjo656FtDZCmYBJ3KTLw /lNgw8g== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--1.793500-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183743-Lcc04bu64-68 X-PPE-DISP: 1603183743;Lcc04bu64-68 Subject: [dpdk-dev] [PATCH 45/62] net/sfc: support flow item PORT ID in transfer rules X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add support for this flow item to MAE-specific RTE flow implementation. The DPDK port must not relate to a different physical device. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 2 + drivers/net/sfc/sfc_mae.c | 76 +++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index 7b8c1c8527..e1cacf55ff 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -190,6 +190,8 @@ Supported actions (***non-transfer*** rules): Supported pattern items (***transfer*** rules): +- PORT_ID (cannot repeat; conflicts with other traffic source items) + - PHY_PORT (cannot repeat; conflicts with other traffic source items) - PF (cannot repeat; conflicts with other traffic source items) diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index f309efa2cf..14e6d33c55 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -260,6 +260,71 @@ sfc_mae_flow_cleanup(struct sfc_adapter *sa, efx_mae_match_spec_fini(sa->nic, spec_mae->match_spec); } +static int +sfc_mae_rule_parse_item_port_id(const struct rte_flow_item *item, + struct sfc_flow_parse_ctx *ctx, + struct rte_flow_error *error) +{ + struct sfc_mae_parse_ctx *ctx_mae = ctx->mae; + const struct rte_flow_item_port_id supp_mask = { + .id = 0xffffffff, + }; + const void *def_mask = &rte_flow_item_port_id_mask; + const struct rte_flow_item_port_id *spec = NULL; + const struct rte_flow_item_port_id *mask = NULL; + efx_mport_sel_t mport_sel; + int rc; + + if (ctx_mae->match_mport_set) { + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Can't handle multiple traffic source items"); + } + + rc = sfc_flow_parse_init(item, + (const void **)&spec, (const void **)&mask, + (const void *)&supp_mask, def_mask, + sizeof(struct rte_flow_item_port_id), error); + if (rc != 0) + return rc; + + if (mask->id != supp_mask.id) { + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Bad mask in the PORT_ID pattern item"); + } + + /* If "spec" is not set, could be any port ID */ + if (spec == NULL) + return 0; + + if (spec->id > UINT16_MAX) { + return rte_flow_error_set(error, EOVERFLOW, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "The port ID is too large"); + } + + rc = sfc_mae_switch_port_by_ethdev(ctx_mae->sa->mae.switch_domain_id, + spec->id, &mport_sel); + if (rc != 0) { + return rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Can't find RTE ethdev by the port ID"); + } + + rc = efx_mae_match_spec_mport_set(ctx_mae->match_spec_action, + &mport_sel, NULL); + if (rc != 0) { + return rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Failed to set MPORT for the port ID"); + } + + ctx_mae->match_mport_set = B_TRUE; + + return 0; +} + static int sfc_mae_rule_parse_item_phy_port(const struct rte_flow_item *item, struct sfc_flow_parse_ctx *ctx, @@ -521,6 +586,17 @@ sfc_mae_rule_parse_item_eth(const struct rte_flow_item *item, } static const struct sfc_flow_item sfc_flow_items[] = { + { + .type = RTE_FLOW_ITEM_TYPE_PORT_ID, + /* + * In terms of RTE flow, this item is a META one, + * and its position in the pattern is don't care. + */ + .prev_layer = SFC_FLOW_ITEM_ANY_LAYER, + .layer = SFC_FLOW_ITEM_ANY_LAYER, + .ctx_type = SFC_FLOW_PARSE_CTX_MAE, + .parse = sfc_mae_rule_parse_item_port_id, + }, { .type = RTE_FLOW_ITEM_TYPE_PHY_PORT, /* From patchwork Tue Oct 20 08:48:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81471 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 78CB6A04DD; Tue, 20 Oct 2020 10:59:24 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 40085C30D; Tue, 20 Oct 2020 10:49:46 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 011F4AD31 for ; Tue, 20 Oct 2020 10:49:04 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.64]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id BA9AF60086 for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) Received: from us4-mdac16-7.ut7.mdlocal (unknown [10.7.65.75]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id B8D5B2009B for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.41]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 43C31220052 for ; Tue, 20 Oct 2020 08:49:03 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id EC32E4C0064 for ; Tue, 20 Oct 2020 08:49:02 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mofu030891; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 2FB421613AB; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:13 +0100 Message-ID: <1603183709-23420-47-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.678900-8.000000-10 X-TMASE-MatchedRID: GcRwLfmoPZhIm8dlggjEyIdlc1JaOB1T3aHfGa/QuY9wkdIrVt8X1VDT Kayi2ZF6Ko7X68Rw9F5w5T4Iaj538mJZXQNDzktSGjzBgnFZvQ59LQinZ4QefPcjNeVeWlqY+gt Hj7OwNO1Sa+jpKCDmEdCZMd5J/GBLyTLOixpJsxVWy8fBjv7JVx7Mc2e0klEosO9luMuMZydn9l mUyAj90xWAh8yB+DmUZ2RkyJMfj9FoSRluDiak3NpAu0sLxpSoQ8G+yYJYYdZRZDsGiXQioL4jx KnHJRLcVcr204P67pw= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-0.678900-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183743-tP51TRUZUVZO X-PPE-DISP: 1603183743;tP51TRUZUVZO Subject: [dpdk-dev] [PATCH 46/62] common/sfc_efx/base: add MAE match fields for VLAN X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add MCDI-compatible enumeration for these fields and provide necessary mappings for them to be inserted directly into mask-value pairs buffer. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 4 ++++ drivers/common/sfc_efx/base/efx_mae.c | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 75edb59a49..30bd411843 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4103,6 +4103,10 @@ typedef enum efx_mae_field_id_e { EFX_MAE_FIELD_ETHER_TYPE_BE, EFX_MAE_FIELD_ETH_SADDR_BE, EFX_MAE_FIELD_ETH_DADDR_BE, + EFX_MAE_FIELD_VLAN0_TCI_BE, + EFX_MAE_FIELD_VLAN0_PROTO_BE, + EFX_MAE_FIELD_VLAN1_TCI_BE, + EFX_MAE_FIELD_VLAN1_PROTO_BE, EFX_MAE_FIELD_NIDS } efx_mae_field_id_t; diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index 0cfa3f6c06..334b46630c 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -286,6 +286,10 @@ typedef enum efx_mae_field_cap_id_e { EFX_MAE_FIELD_ID_ETHER_TYPE_BE = MAE_FIELD_ETHER_TYPE, EFX_MAE_FIELD_ID_ETH_SADDR_BE = MAE_FIELD_ETH_SADDR, EFX_MAE_FIELD_ID_ETH_DADDR_BE = MAE_FIELD_ETH_DADDR, + EFX_MAE_FIELD_ID_VLAN0_TCI_BE = MAE_FIELD_VLAN0_TCI, + EFX_MAE_FIELD_ID_VLAN0_PROTO_BE = MAE_FIELD_VLAN0_PROTO, + EFX_MAE_FIELD_ID_VLAN1_TCI_BE = MAE_FIELD_VLAN1_TCI, + EFX_MAE_FIELD_ID_VLAN1_PROTO_BE = MAE_FIELD_VLAN1_PROTO, EFX_MAE_FIELD_CAP_NIDS } efx_mae_field_cap_id_t; @@ -331,6 +335,10 @@ static const efx_mae_mv_desc_t __efx_mae_action_rule_mv_desc_set[] = { EFX_MAE_MV_DESC(ETHER_TYPE_BE, EFX_MAE_FIELD_BE), EFX_MAE_MV_DESC(ETH_SADDR_BE, EFX_MAE_FIELD_BE), EFX_MAE_MV_DESC(ETH_DADDR_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(VLAN0_TCI_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(VLAN0_PROTO_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(VLAN1_TCI_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(VLAN1_PROTO_BE, EFX_MAE_FIELD_BE), #undef EFX_MAE_MV_DESC }; From patchwork Tue Oct 20 08:48:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81497 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id CC669A04DD; Tue, 20 Oct 2020 11:09:07 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D1908CA4C; Tue, 20 Oct 2020 10:50:26 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 0C9A6BBBC for ; Tue, 20 Oct 2020 10:49:08 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 41EAC6008A for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from us4-mdac16-10.ut7.mdlocal (unknown [10.7.65.180]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 42A532009A for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.41]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 9DB881C0051 for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 506604C0059 for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8moAq030894; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 3D2951613A9; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:14 +0100 Message-ID: <1603183709-23420-48-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-3.751500-8.000000-10 X-TMASE-MatchedRID: EsGFgrCrGksfKML5AJtfLTdpb/tuXpJnmXYQ9W53Np2ZfDRE1uqSgoz1 bq8bIdDvSLZYGytM40BLG6rghpHL98kzkqzY5vbYqJSK+HSPY+/pVMb1xnESMgaYevV4zG3ZQBz oPKhLasjuo3YBjUsFh8LrkAU++Mn8WlEpRu0HDirnvg/SfqXd/dnLANiJ9J62VWQnHKxp38gkKy HF/43GXiBPsqyaFx8lXl9v5CQ2BAF6Icg4A21ScsebIMlISwjbyWxPa/RwSU9psnGGIgWMmXEzs NpqhJDMq1SffpAHzg7ExXUw9J4h+qB11RkmaqHealRqQPhHMT4TuzedwPfr/VHpIy6wt5Uw33pX Y2CsQeI9XuH79CQNgLAsMJewrCQMniXiio3lwpHM0ihsfYPMYQoXSOLC5a44kEuRYev4ZM9ZeMX 00rN0KXlX3Ord7p8AYcTwAY0stzWp+3FLcueO9UmSRRbSc9s3GwKs3RUcsbh/zGD4l8Bj0OcMSM soUYnjiZNHeXaejyaAMuqetGVetnyef22ep6XYxlblqLlYqXIMw01Q9OppbC3M/7j+0Q17/PbGa wOwxugH0RKBLzgCPgquMtctL7FEmWfmTG0oYXFNz+ENdQhnUgXoUv3pQ3u2Ri2QV0pCBB7w7Jxw U0EvZMqEROLb/+yO4/0Jvn0rwAJmtL4Dw+zNb9T2H03zzU1J X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--3.751500-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183746-TrNCMyDI9V91 X-PPE-DISP: 1603183746;TrNCMyDI9V91 Subject: [dpdk-dev] [PATCH 47/62] net/sfc: support flow item VLAN in transfer rules X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add support for this flow item to MAE-specific RTE flow implementation. In a pattern, a L2 item preceding an item VLAN must have correct "type" ("inner_type") set depending on the total number of VLAN tags (double-tagging is supported): "pattern eth type is X / vlan / end", X = 0x8100, or 0x88a8, or 0x9100, or 0x9200, or 0x9300 "pattern eth type is X / vlan inner_type is 0x8100 / vlan / end" X = 0x88a8, or 0x9100, or 0x9200, or 0x9300 Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 2 + drivers/net/sfc/sfc_mae.c | 265 +++++++++++++++++++++++++++++++++++- drivers/net/sfc/sfc_mae.h | 47 +++++++ 3 files changed, 311 insertions(+), 3 deletions(-) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index e1cacf55ff..adee0cd670 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -200,6 +200,8 @@ Supported pattern items (***transfer*** rules): - ETH +- VLAN (double-tagging is supported) + Supported actions (***transfer*** rules): - OF_POP_VLAN diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 14e6d33c55..cc22fee6fe 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -260,6 +260,122 @@ sfc_mae_flow_cleanup(struct sfc_adapter *sa, efx_mae_match_spec_fini(sa->nic, spec_mae->match_spec); } +static int +sfc_mae_set_ethertypes(struct sfc_mae_parse_ctx *ctx) +{ + efx_mae_match_spec_t *efx_spec = ctx->match_spec_action; + struct sfc_mae_pattern_data *pdata = &ctx->pattern_data; + const efx_mae_field_id_t field_ids[] = { + EFX_MAE_FIELD_VLAN0_PROTO_BE, + EFX_MAE_FIELD_VLAN1_PROTO_BE, + }; + const struct sfc_mae_ethertype *et; + unsigned int i; + int rc; + + /* + * In accordance with RTE flow API convention, the innermost L2 + * item's "type" ("inner_type") is a L3 EtherType. If there is + * no L3 item, it's 0x0000/0x0000. + */ + et = &pdata->ethertypes[pdata->nb_vlan_tags]; + rc = efx_mae_match_spec_field_set(efx_spec, EFX_MAE_FIELD_ETHER_TYPE_BE, + sizeof(et->value), + (const uint8_t *)&et->value, + sizeof(et->mask), + (const uint8_t *)&et->mask); + if (rc != 0) + return rc; + + /* + * sfc_mae_rule_parse_item_vlan() has already made sure + * that pdata->nb_vlan_tags does not exceed this figure. + */ + RTE_BUILD_BUG_ON(SFC_MAE_MATCH_VLAN_MAX_NTAGS != 2); + + for (i = 0; i < pdata->nb_vlan_tags; ++i) { + et = &pdata->ethertypes[i]; + + rc = efx_mae_match_spec_field_set(efx_spec, field_ids[i], + sizeof(et->value), + (const uint8_t *)&et->value, + sizeof(et->mask), + (const uint8_t *)&et->mask); + if (rc != 0) + return rc; + } + + return 0; +} + +static int +sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx, + struct rte_flow_error *error) +{ + struct sfc_mae_pattern_data *pdata = &ctx->pattern_data; + struct sfc_mae_ethertype *ethertypes = pdata->ethertypes; + const rte_be16_t supported_tpids[] = { + /* VLAN standard TPID (always the first element) */ + RTE_BE16(RTE_ETHER_TYPE_VLAN), + + /* Double-tagging TPIDs */ + RTE_BE16(RTE_ETHER_TYPE_QINQ), + RTE_BE16(RTE_ETHER_TYPE_QINQ1), + RTE_BE16(RTE_ETHER_TYPE_QINQ2), + RTE_BE16(RTE_ETHER_TYPE_QINQ3), + }; + unsigned int nb_supported_tpids = RTE_DIM(supported_tpids); + unsigned int ethertype_idx; + int rc; + + /* + * sfc_mae_rule_parse_item_vlan() has already made sure + * that pdata->nb_vlan_tags does not exceed this figure. + */ + RTE_BUILD_BUG_ON(SFC_MAE_MATCH_VLAN_MAX_NTAGS != 2); + + for (ethertype_idx = 0; + ethertype_idx < pdata->nb_vlan_tags; ++ethertype_idx) { + unsigned int tpid_idx; + + /* Exact match is supported only. */ + if (ethertypes[ethertype_idx].mask != RTE_BE16(0xffff)) { + rc = EINVAL; + goto fail; + } + + for (tpid_idx = pdata->nb_vlan_tags - ethertype_idx - 1; + tpid_idx < nb_supported_tpids; ++tpid_idx) { + if (ethertypes[ethertype_idx].value == + supported_tpids[tpid_idx]) + break; + } + + if (tpid_idx == nb_supported_tpids) { + rc = EINVAL; + goto fail; + } + + nb_supported_tpids = 1; + } + + /* + * Now, when the number of VLAN tags is known, set fields + * ETHER_TYPE, VLAN0_PROTO and VLAN1_PROTO so that the first + * one is either a valid L3 EtherType (or 0x0000/0x0000), + * and the last two are valid TPIDs (or 0x0000/0x0000). + */ + rc = sfc_mae_set_ethertypes(ctx); + if (rc != 0) + goto fail; + + return 0; + +fail: + return rte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_ITEM, NULL, + "Failed to process pattern data"); +} + static int sfc_mae_rule_parse_item_port_id(const struct rte_flow_item *item, struct sfc_flow_parse_ctx *ctx, @@ -486,6 +602,16 @@ sfc_mae_rule_parse_item_vf(const struct rte_flow_item *item, return 0; } +/* + * Having this field ID in a field locator means that this + * locator cannot be used to actually set the field at the + * time when the corresponding item gets encountered. Such + * fields get stashed in the parsing context instead. This + * is required to resolve dependencies between the stashed + * fields. See sfc_mae_rule_process_pattern_data(). + */ +#define SFC_MAE_FIELD_HANDLING_DEFERRED EFX_MAE_FIELD_NIDS + struct sfc_mae_field_locator { efx_mae_field_id_t field_id; size_t size; @@ -522,6 +648,9 @@ sfc_mae_parse_item(const struct sfc_mae_field_locator *field_locators, for (i = 0; i < nb_field_locators; ++i) { const struct sfc_mae_field_locator *fl = &field_locators[i]; + if (fl->field_id == SFC_MAE_FIELD_HANDLING_DEFERRED) + continue; + rc = efx_mae_match_spec_field_set(efx_spec, fl->field_id, fl->size, spec + fl->ofst, fl->size, mask + fl->ofst); @@ -539,7 +668,11 @@ sfc_mae_parse_item(const struct sfc_mae_field_locator *field_locators, static const struct sfc_mae_field_locator flocs_eth[] = { { - EFX_MAE_FIELD_ETHER_TYPE_BE, + /* + * This locator is used only for building supported fields mask. + * The field is handled by sfc_mae_rule_process_pattern_data(). + */ + SFC_MAE_FIELD_HANDLING_DEFERRED, RTE_SIZEOF_FIELD(struct rte_flow_item_eth, type), offsetof(struct rte_flow_item_eth, type), }, @@ -577,14 +710,128 @@ sfc_mae_rule_parse_item_eth(const struct rte_flow_item *item, if (rc != 0) return rc; - /* If "spec" is not set, could be any Ethernet */ - if (spec == NULL) + if (spec != NULL) { + struct sfc_mae_pattern_data *pdata = &ctx_mae->pattern_data; + struct sfc_mae_ethertype *ethertypes = pdata->ethertypes; + const struct rte_flow_item_eth *item_spec; + const struct rte_flow_item_eth *item_mask; + + item_spec = (const struct rte_flow_item_eth *)spec; + item_mask = (const struct rte_flow_item_eth *)mask; + + ethertypes[0].value = item_spec->type; + ethertypes[0].mask = item_mask->type; + } else { + /* + * The specification is empty. This is wrong in the case + * when there are more network patterns in line. Other + * than that, any Ethernet can match. All of that is + * checked at the end of parsing. + */ return 0; + } return sfc_mae_parse_item(flocs_eth, RTE_DIM(flocs_eth), spec, mask, ctx_mae->match_spec_action, error); } +static const struct sfc_mae_field_locator flocs_vlan[] = { + /* Outermost tag */ + { + EFX_MAE_FIELD_VLAN0_TCI_BE, + RTE_SIZEOF_FIELD(struct rte_flow_item_vlan, tci), + offsetof(struct rte_flow_item_vlan, tci), + }, + { + /* + * This locator is used only for building supported fields mask. + * The field is handled by sfc_mae_rule_process_pattern_data(). + */ + SFC_MAE_FIELD_HANDLING_DEFERRED, + RTE_SIZEOF_FIELD(struct rte_flow_item_vlan, inner_type), + offsetof(struct rte_flow_item_vlan, inner_type), + }, + + /* Innermost tag */ + { + EFX_MAE_FIELD_VLAN1_TCI_BE, + RTE_SIZEOF_FIELD(struct rte_flow_item_vlan, tci), + offsetof(struct rte_flow_item_vlan, tci), + }, + { + /* + * This locator is used only for building supported fields mask. + * The field is handled by sfc_mae_rule_process_pattern_data(). + */ + SFC_MAE_FIELD_HANDLING_DEFERRED, + RTE_SIZEOF_FIELD(struct rte_flow_item_vlan, inner_type), + offsetof(struct rte_flow_item_vlan, inner_type), + }, +}; + +static int +sfc_mae_rule_parse_item_vlan(const struct rte_flow_item *item, + struct sfc_flow_parse_ctx *ctx, + struct rte_flow_error *error) +{ + struct sfc_mae_parse_ctx *ctx_mae = ctx->mae; + struct sfc_mae_pattern_data *pdata = &ctx_mae->pattern_data; + const struct sfc_mae_field_locator *flocs; + struct rte_flow_item_vlan supp_mask; + const uint8_t *spec = NULL; + const uint8_t *mask = NULL; + unsigned int nb_flocs; + int rc; + + RTE_BUILD_BUG_ON(SFC_MAE_MATCH_VLAN_MAX_NTAGS != 2); + + if (pdata->nb_vlan_tags == SFC_MAE_MATCH_VLAN_MAX_NTAGS) { + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "Can't match that many VLAN tags"); + } + + nb_flocs = RTE_DIM(flocs_vlan) / SFC_MAE_MATCH_VLAN_MAX_NTAGS; + flocs = flocs_vlan + pdata->nb_vlan_tags * nb_flocs; + + /* If parsing fails, this can remain incremented. */ + ++pdata->nb_vlan_tags; + + sfc_mae_item_build_supp_mask(flocs, nb_flocs, + &supp_mask, sizeof(supp_mask)); + + rc = sfc_flow_parse_init(item, + (const void **)&spec, (const void **)&mask, + (const void *)&supp_mask, + &rte_flow_item_vlan_mask, + sizeof(struct rte_flow_item_vlan), error); + if (rc != 0) + return rc; + + if (spec != NULL) { + struct sfc_mae_ethertype *ethertypes = pdata->ethertypes; + const struct rte_flow_item_vlan *item_spec; + const struct rte_flow_item_vlan *item_mask; + + item_spec = (const struct rte_flow_item_vlan *)spec; + item_mask = (const struct rte_flow_item_vlan *)mask; + + ethertypes[pdata->nb_vlan_tags].value = item_spec->inner_type; + ethertypes[pdata->nb_vlan_tags].mask = item_mask->inner_type; + } else { + /* + * The specification is empty. This is wrong in the case + * when there are more network patterns in line. Other + * than that, any Ethernet can match. All of that is + * checked at the end of parsing. + */ + return 0; + } + + return sfc_mae_parse_item(flocs, nb_flocs, spec, mask, + ctx_mae->match_spec_action, error); +} + static const struct sfc_flow_item sfc_flow_items[] = { { .type = RTE_FLOW_ITEM_TYPE_PORT_ID, @@ -637,6 +884,13 @@ static const struct sfc_flow_item sfc_flow_items[] = { .ctx_type = SFC_FLOW_PARSE_CTX_MAE, .parse = sfc_mae_rule_parse_item_eth, }, + { + .type = RTE_FLOW_ITEM_TYPE_VLAN, + .prev_layer = SFC_FLOW_ITEM_L2, + .layer = SFC_FLOW_ITEM_L2, + .ctx_type = SFC_FLOW_PARSE_CTX_MAE, + .parse = sfc_mae_rule_parse_item_vlan, + }, }; int @@ -670,6 +924,10 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, if (rc != 0) goto fail_parse_pattern; + rc = sfc_mae_rule_process_pattern_data(&ctx_mae, error); + if (rc != 0) + goto fail_process_pattern_data; + if (!efx_mae_match_spec_is_valid(sa->nic, ctx_mae.match_spec_action)) { rc = rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ITEM, NULL, @@ -682,6 +940,7 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, return 0; fail_validate_match_spec_action: +fail_process_pattern_data: fail_parse_pattern: efx_mae_match_spec_fini(sa->nic, ctx_mae.match_spec_action); diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index f92e62dcbe..e4e8ab67a5 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -62,10 +62,57 @@ struct sfc_mae { struct sfc_adapter; struct sfc_flow_spec; +/** This implementation supports double-tagging */ +#define SFC_MAE_MATCH_VLAN_MAX_NTAGS (2) + +/** It is possible to keep track of one item ETH and two items VLAN */ +#define SFC_MAE_L2_MAX_NITEMS (SFC_MAE_MATCH_VLAN_MAX_NTAGS + 1) + +/** Auxiliary entry format to keep track of L2 "type" ("inner_type") */ +struct sfc_mae_ethertype { + rte_be16_t value; + rte_be16_t mask; +}; + +struct sfc_mae_pattern_data { + /** + * Keeps track of "type" ("inner_type") mask and value for each + * parsed L2 item in a pattern. These values/masks get filled + * in MAE match specification at the end of parsing. Also, this + * information is used to conduct consistency checks: + * + * - If an item ETH is followed by a single item VLAN, + * the former must have "type" set to one of supported + * TPID values (0x8100, 0x88a8, 0x9100, 0x9200, 0x9300). + * + * - If an item ETH is followed by two items VLAN, the + * item ETH must have "type" set to one of supported TPID + * values (0x88a8, 0x9100, 0x9200, 0x9300), and the outermost + * VLAN item must have "inner_type" set to TPID value 0x8100. + * + * In turn, mapping between RTE convention (above requirements) and + * MAE fields is non-trivial. The following scheme indicates + * which item EtherTypes go to which MAE fields in the case + * of single tag: + * + * ETH (0x8100) --> VLAN0_PROTO_BE + * VLAN (L3 EtherType) --> ETHER_TYPE_BE + * + * Similarly, in the case of double tagging: + * + * ETH (0x88a8) --> VLAN0_PROTO_BE + * VLAN (0x8100) --> VLAN1_PROTO_BE + * VLAN (L3 EtherType) --> ETHER_TYPE_BE + */ + struct sfc_mae_ethertype ethertypes[SFC_MAE_L2_MAX_NITEMS]; + unsigned int nb_vlan_tags; +}; + struct sfc_mae_parse_ctx { struct sfc_adapter *sa; efx_mae_match_spec_t *match_spec_action; bool match_mport_set; + struct sfc_mae_pattern_data pattern_data; }; int sfc_mae_attach(struct sfc_adapter *sa); From patchwork Tue Oct 20 08:48:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81469 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id E9C63A04DD; Tue, 20 Oct 2020 10:58:43 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 5BD91BE41; Tue, 20 Oct 2020 10:49:43 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 8ECF3BBA2 for ; Tue, 20 Oct 2020 10:49:02 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.64]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id D13136007B for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from us4-mdac16-6.ut7.mdlocal (unknown [10.7.65.74]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id D0D472009B for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 610EF22004D for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 1728D800058 for ; Tue, 20 Oct 2020 08:49:00 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8movM030897; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 4B3041613AB; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:15 +0100 Message-ID: <1603183709-23420-49-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.947300-8.000000-10 X-TMASE-MatchedRID: zyhNn9BFHvhIm8dlggjEyIdlc1JaOB1T3aHfGa/QuY9wkdIrVt8X1VDT Kayi2ZF6Ko7X68Rw9F5w5T4Iaj538mJZXQNDzktSPmDp3xFIgjNnAst8At+c3Zsoi2XrUn/Jn6K dMrRsL14qtq5d3cxkNU3guhS6ZRsx3YKYS2pEZ6PRgYCcnzd6WVhJWgch8A3C+4nKUVekCrzReh NQzeOkbu0Laox8bly9LmOkVnXJpV6YivHXQH1QrNaTxr7l5BRrOKBkFAm8GOUPoO5ncI6OuehbQ 2QpmASdWPKWiAlNtI5DDKa3G4nrLQ== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-0.947300-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183740-DPBsPj8BDdpu X-PPE-DISP: 1603183740;DPBsPj8BDdpu Subject: [dpdk-dev] [PATCH 48/62] common/sfc_efx/base: add MAE match fields for IPv4 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add MCDI-compatible enumeration for these fields and provide necessary mappings for them to be inserted directly into mask-value pairs buffer. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 5 +++++ drivers/common/sfc_efx/base/efx_mae.c | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 30bd411843..ed15e5e0d5 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4107,6 +4107,11 @@ typedef enum efx_mae_field_id_e { EFX_MAE_FIELD_VLAN0_PROTO_BE, EFX_MAE_FIELD_VLAN1_TCI_BE, EFX_MAE_FIELD_VLAN1_PROTO_BE, + EFX_MAE_FIELD_SRC_IP4_BE, + EFX_MAE_FIELD_DST_IP4_BE, + EFX_MAE_FIELD_IP_PROTO, + EFX_MAE_FIELD_IP_TOS, + EFX_MAE_FIELD_IP_TTL, EFX_MAE_FIELD_NIDS } efx_mae_field_id_t; diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index 334b46630c..5843a52569 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -290,6 +290,11 @@ typedef enum efx_mae_field_cap_id_e { EFX_MAE_FIELD_ID_VLAN0_PROTO_BE = MAE_FIELD_VLAN0_PROTO, EFX_MAE_FIELD_ID_VLAN1_TCI_BE = MAE_FIELD_VLAN1_TCI, EFX_MAE_FIELD_ID_VLAN1_PROTO_BE = MAE_FIELD_VLAN1_PROTO, + EFX_MAE_FIELD_ID_SRC_IP4_BE = MAE_FIELD_SRC_IP4, + EFX_MAE_FIELD_ID_DST_IP4_BE = MAE_FIELD_DST_IP4, + EFX_MAE_FIELD_ID_IP_PROTO = MAE_FIELD_IP_PROTO, + EFX_MAE_FIELD_ID_IP_TOS = MAE_FIELD_IP_TOS, + EFX_MAE_FIELD_ID_IP_TTL = MAE_FIELD_IP_TTL, EFX_MAE_FIELD_CAP_NIDS } efx_mae_field_cap_id_t; @@ -339,6 +344,11 @@ static const efx_mae_mv_desc_t __efx_mae_action_rule_mv_desc_set[] = { EFX_MAE_MV_DESC(VLAN0_PROTO_BE, EFX_MAE_FIELD_BE), EFX_MAE_MV_DESC(VLAN1_TCI_BE, EFX_MAE_FIELD_BE), EFX_MAE_MV_DESC(VLAN1_PROTO_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(SRC_IP4_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(DST_IP4_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(IP_PROTO, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(IP_TOS, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(IP_TTL, EFX_MAE_FIELD_BE), #undef EFX_MAE_MV_DESC }; From patchwork Tue Oct 20 08:48:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81504 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id DED51A04DD; Tue, 20 Oct 2020 11:11:46 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 102DBE24B; Tue, 20 Oct 2020 10:50:38 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id C6987BBBC for ; Tue, 20 Oct 2020 10:49:09 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 91E6A6007A for ; Tue, 20 Oct 2020 08:49:09 +0000 (UTC) Received: from us4-mdac16-52.ut7.mdlocal (unknown [10.7.66.23]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 911142009A for ; Tue, 20 Oct 2020 08:49:09 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.199]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 12FB61C0051 for ; Tue, 20 Oct 2020 08:49:09 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id BC81418005B for ; Tue, 20 Oct 2020 08:49:08 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mo3x030900; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 5838F1613A9; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:16 +0100 Message-ID: <1603183709-23420-50-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.972300-8.000000-10 X-TMASE-MatchedRID: U43vBdnEpjofKML5AJtfLS2416nc3bQleouvej40T4gd0WOKRkwsh3Io zGa69omdrdoLblq9S5oV+ztbPoSlM0jn8cIz0h4xHl2pJS1lPFvbODDlFP8GtiGD+Fp3vZHUiM6 fF5HaiokeiFQL2XCGlEbCbdi0X6BUxz6opuAAUJJX7UpJhGB2YqIik2/euMx1f8xg+JfAY9BNnt 9EGqgbbPCro3RI5LoRHbgNvtI8fLxfHIrW6stOkz5g6d8RSIIzovA/6ONsv0rmQJUUegCCexZKi SC+7/NsOPAJR2VDC9/c7RafwK18CoP+zEDQnRb6+ACG5oWJ7tICn5QffvZFle4utY8dkDDy5Bit m2A0oi+iMobsOo19soAy6p60ZV62fJ5/bZ6npdiujVRFkkVsmx8lAh96RVPPUNv5At92pCH3Qva JB5wFpXwsCPATzCTsd5f4wKG8PlXdyppfK383wBBrUiiKoDjaA9Lcdcpe5r9wZ/9f5Xj1/fDsnH BTQS9kyoRE4tv/7I7j/Qm+fSvAAma0vgPD7M1vQP8wh/06uR0= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-0.972300-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183749-Tx1wuV6-Td6V X-PPE-DISP: 1603183749;Tx1wuV6-Td6V Subject: [dpdk-dev] [PATCH 49/62] net/sfc: support flow item IPV4 in transfer rules X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add support for this flow item to MAE-specific RTE flow implementation. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 3 + drivers/net/sfc/sfc_mae.c | 121 ++++++++++++++++++++++++++++++++++++ drivers/net/sfc/sfc_mae.h | 20 ++++++ 3 files changed, 144 insertions(+) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index adee0cd670..e687e1cac3 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -202,6 +202,9 @@ Supported pattern items (***transfer*** rules): - VLAN (double-tagging is supported) +- IPV4 (source/destination addresses, IP transport protocol, + type of service, time to live) + Supported actions (***transfer*** rules): - OF_POP_VLAN diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index cc22fee6fe..d7c1cd784f 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -312,6 +312,7 @@ static int sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx, struct rte_flow_error *error) { + efx_mae_match_spec_t *efx_spec = ctx->match_spec_action; struct sfc_mae_pattern_data *pdata = &ctx->pattern_data; struct sfc_mae_ethertype *ethertypes = pdata->ethertypes; const rte_be16_t supported_tpids[] = { @@ -326,8 +327,19 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx, }; unsigned int nb_supported_tpids = RTE_DIM(supported_tpids); unsigned int ethertype_idx; + const uint8_t *valuep; + const uint8_t *maskp; int rc; + if (pdata->innermost_ethertype_restriction.mask != 0 && + pdata->nb_vlan_tags < SFC_MAE_MATCH_VLAN_MAX_NTAGS) { + /* + * If a single item VLAN is followed by a L3 item, value + * of "type" in item ETH can't be a double-tagging TPID. + */ + nb_supported_tpids = 1; + } + /* * sfc_mae_rule_parse_item_vlan() has already made sure * that pdata->nb_vlan_tags does not exceed this figure. @@ -359,6 +371,21 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx, nb_supported_tpids = 1; } + if (pdata->innermost_ethertype_restriction.mask == RTE_BE16(0xffff)) { + struct sfc_mae_ethertype *et = ðertypes[ethertype_idx]; + + if (et->mask == 0) { + et->mask = RTE_BE16(0xffff); + et->value = + pdata->innermost_ethertype_restriction.value; + } else if (et->mask != RTE_BE16(0xffff) || + et->value != + pdata->innermost_ethertype_restriction.value) { + rc = EINVAL; + goto fail; + } + } + /* * Now, when the number of VLAN tags is known, set fields * ETHER_TYPE, VLAN0_PROTO and VLAN1_PROTO so that the first @@ -369,6 +396,16 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx, if (rc != 0) goto fail; + valuep = (const uint8_t *)&pdata->l3_next_proto_value; + maskp = (const uint8_t *)&pdata->l3_next_proto_mask; + rc = efx_mae_match_spec_field_set(efx_spec, EFX_MAE_FIELD_IP_PROTO, + sizeof(pdata->l3_next_proto_value), + valuep, + sizeof(pdata->l3_next_proto_mask), + maskp); + if (rc != 0) + goto fail; + return 0; fail: @@ -832,6 +869,83 @@ sfc_mae_rule_parse_item_vlan(const struct rte_flow_item *item, ctx_mae->match_spec_action, error); } +static const struct sfc_mae_field_locator flocs_ipv4[] = { + { + EFX_MAE_FIELD_SRC_IP4_BE, + RTE_SIZEOF_FIELD(struct rte_flow_item_ipv4, hdr.src_addr), + offsetof(struct rte_flow_item_ipv4, hdr.src_addr), + }, + { + EFX_MAE_FIELD_DST_IP4_BE, + RTE_SIZEOF_FIELD(struct rte_flow_item_ipv4, hdr.dst_addr), + offsetof(struct rte_flow_item_ipv4, hdr.dst_addr), + }, + { + /* + * This locator is used only for building supported fields mask. + * The field is handled by sfc_mae_rule_process_pattern_data(). + */ + SFC_MAE_FIELD_HANDLING_DEFERRED, + RTE_SIZEOF_FIELD(struct rte_flow_item_ipv4, hdr.next_proto_id), + offsetof(struct rte_flow_item_ipv4, hdr.next_proto_id), + }, + { + EFX_MAE_FIELD_IP_TOS, + RTE_SIZEOF_FIELD(struct rte_flow_item_ipv4, + hdr.type_of_service), + offsetof(struct rte_flow_item_ipv4, hdr.type_of_service), + }, + { + EFX_MAE_FIELD_IP_TTL, + RTE_SIZEOF_FIELD(struct rte_flow_item_ipv4, hdr.time_to_live), + offsetof(struct rte_flow_item_ipv4, hdr.time_to_live), + }, +}; + +static int +sfc_mae_rule_parse_item_ipv4(const struct rte_flow_item *item, + struct sfc_flow_parse_ctx *ctx, + struct rte_flow_error *error) +{ + rte_be16_t ethertype_ipv4_be = RTE_BE16(RTE_ETHER_TYPE_IPV4); + struct sfc_mae_parse_ctx *ctx_mae = ctx->mae; + struct sfc_mae_pattern_data *pdata = &ctx_mae->pattern_data; + struct rte_flow_item_ipv4 supp_mask; + const uint8_t *spec = NULL; + const uint8_t *mask = NULL; + int rc; + + sfc_mae_item_build_supp_mask(flocs_ipv4, RTE_DIM(flocs_ipv4), + &supp_mask, sizeof(supp_mask)); + + rc = sfc_flow_parse_init(item, + (const void **)&spec, (const void **)&mask, + (const void *)&supp_mask, + &rte_flow_item_ipv4_mask, + sizeof(struct rte_flow_item_ipv4), error); + if (rc != 0) + return rc; + + pdata->innermost_ethertype_restriction.value = ethertype_ipv4_be; + pdata->innermost_ethertype_restriction.mask = RTE_BE16(0xffff); + + if (spec != NULL) { + const struct rte_flow_item_ipv4 *item_spec; + const struct rte_flow_item_ipv4 *item_mask; + + item_spec = (const struct rte_flow_item_ipv4 *)spec; + item_mask = (const struct rte_flow_item_ipv4 *)mask; + + pdata->l3_next_proto_value = item_spec->hdr.next_proto_id; + pdata->l3_next_proto_mask = item_mask->hdr.next_proto_id; + } else { + return 0; + } + + return sfc_mae_parse_item(flocs_ipv4, RTE_DIM(flocs_ipv4), spec, mask, + ctx_mae->match_spec_action, error); +} + static const struct sfc_flow_item sfc_flow_items[] = { { .type = RTE_FLOW_ITEM_TYPE_PORT_ID, @@ -891,6 +1005,13 @@ static const struct sfc_flow_item sfc_flow_items[] = { .ctx_type = SFC_FLOW_PARSE_CTX_MAE, .parse = sfc_mae_rule_parse_item_vlan, }, + { + .type = RTE_FLOW_ITEM_TYPE_IPV4, + .prev_layer = SFC_FLOW_ITEM_L2, + .layer = SFC_FLOW_ITEM_L3, + .ctx_type = SFC_FLOW_PARSE_CTX_MAE, + .parse = sfc_mae_rule_parse_item_ipv4, + }, }; int diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index e4e8ab67a5..56be8bf917 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -90,6 +90,10 @@ struct sfc_mae_pattern_data { * values (0x88a8, 0x9100, 0x9200, 0x9300), and the outermost * VLAN item must have "inner_type" set to TPID value 0x8100. * + * - If a L2 item is followed by a L3 one, the former must + * indicate "type" ("inner_type") which corresponds to + * the protocol used in the L3 item, or 0x0000/0x0000. + * * In turn, mapping between RTE convention (above requirements) and * MAE fields is non-trivial. The following scheme indicates * which item EtherTypes go to which MAE fields in the case @@ -106,6 +110,22 @@ struct sfc_mae_pattern_data { */ struct sfc_mae_ethertype ethertypes[SFC_MAE_L2_MAX_NITEMS]; unsigned int nb_vlan_tags; + + /** + * L3 requirement for the innermost L2 item's "type" ("inner_type"). + * This contains one of: + * - 0x0800/0xffff: IPV4 + * - 0x0000/0x0000: no L3 item + */ + struct sfc_mae_ethertype innermost_ethertype_restriction; + + /** + * The following two fields keep track of L3 "proto" mask and value. + * The corresponding fields get filled in MAE match specification + * at the end of parsing. + */ + uint8_t l3_next_proto_value; + uint8_t l3_next_proto_mask; }; struct sfc_mae_parse_ctx { From patchwork Tue Oct 20 08:48:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81489 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id E3F0CA04DD; Tue, 20 Oct 2020 11:06:23 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 24EA1C934; Tue, 20 Oct 2020 10:50:16 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 011ECBBA2 for ; Tue, 20 Oct 2020 10:49:06 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id C38E36007A for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from us4-mdac16-14.ut7.mdlocal (unknown [10.7.65.238]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id C2CF92009A for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.199]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 4D8ED1C004F for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 0393118005C for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8moYq030903; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 6810D1613AB; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:17 +0100 Message-ID: <1603183709-23420-51-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.947300-8.000000-10 X-TMASE-MatchedRID: zyhNn9BFHvhIm8dlggjEyIdlc1JaOB1T3aHfGa/QuY9wkdIrVt8X1VDT Kayi2ZF6Ko7X68Rw9F5w5T4Iaj538mJZXQNDzktSPmDp3xFIgjNnAst8At+c3Zsoi2XrUn/Jn6K dMrRsL14qtq5d3cxkNSjkRB+q9uV+q9HJ29GABNqExlSruN4RaUvgEToPkTiaUw3xg/zKLsNwqH Nr4ZZ0xqTQT1ylSSDS0UxE7Z+gblAXzT4bXhidhH6RDHTv+5K/OKBkFAm8GOUPoO5ncI6OuehbQ 2QpmASdWPKWiAlNtI5DDKa3G4nrLQ== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-0.947300-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183746-pFQms0MSQGDP X-PPE-DISP: 1603183746;pFQms0MSQGDP Subject: [dpdk-dev] [PATCH 50/62] common/sfc_efx/base: add MAE match fields for IPv6 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add MCDI-compatible enumeration for these fields and provide necessary mappings for them to be inserted directly into mask-value pairs buffer. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 2 ++ drivers/common/sfc_efx/base/efx_mae.c | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index ed15e5e0d5..16927eb910 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4112,6 +4112,8 @@ typedef enum efx_mae_field_id_e { EFX_MAE_FIELD_IP_PROTO, EFX_MAE_FIELD_IP_TOS, EFX_MAE_FIELD_IP_TTL, + EFX_MAE_FIELD_SRC_IP6_BE, + EFX_MAE_FIELD_DST_IP6_BE, EFX_MAE_FIELD_NIDS } efx_mae_field_id_t; diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index 5843a52569..c015b4c471 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -295,6 +295,8 @@ typedef enum efx_mae_field_cap_id_e { EFX_MAE_FIELD_ID_IP_PROTO = MAE_FIELD_IP_PROTO, EFX_MAE_FIELD_ID_IP_TOS = MAE_FIELD_IP_TOS, EFX_MAE_FIELD_ID_IP_TTL = MAE_FIELD_IP_TTL, + EFX_MAE_FIELD_ID_SRC_IP6_BE = MAE_FIELD_SRC_IP6, + EFX_MAE_FIELD_ID_DST_IP6_BE = MAE_FIELD_DST_IP6, EFX_MAE_FIELD_CAP_NIDS } efx_mae_field_cap_id_t; @@ -349,6 +351,8 @@ static const efx_mae_mv_desc_t __efx_mae_action_rule_mv_desc_set[] = { EFX_MAE_MV_DESC(IP_PROTO, EFX_MAE_FIELD_BE), EFX_MAE_MV_DESC(IP_TOS, EFX_MAE_FIELD_BE), EFX_MAE_MV_DESC(IP_TTL, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(SRC_IP6_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(DST_IP6_BE, EFX_MAE_FIELD_BE), #undef EFX_MAE_MV_DESC }; From patchwork Tue Oct 20 08:48:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81495 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 22BD1A04DD; Tue, 20 Oct 2020 11:08:29 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1FBB4C9E8; Tue, 20 Oct 2020 10:50:24 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id A0677BBAE for ; Tue, 20 Oct 2020 10:49:07 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 2BA4D6006F for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from us4-mdac16-58.ut7.mdlocal (unknown [10.7.66.29]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 2BF548009E for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.199]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 8349480055 for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 3938B18005C for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8moBp030906; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 7520C1613A9; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:18 +0100 Message-ID: <1603183709-23420-52-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.957700-8.000000-10 X-TMASE-MatchedRID: 8MyktT0TNtAfKML5AJtfLS2416nc3bQleouvej40T4gd0WOKRkwsh3Io zGa69omdrdoLblq9S5oV+ztbPoSlM0jn8cIz0h4xHl2pJS1lPFvbODDlFP8GtiGD+Fp3vZHUiM6 fF5HaiomfjLsLfKL5D/AdrFuuWv7h1DZoJkSjra7iNGQgiadfQ5naxzJFBx6vkY8eITaSJPhJvx ajLjIujj7dd0lpU1NQB+I75w7Uv8ofE8yM4pjsDwtuKBGekqUpm+MB6kaZ2g786P7mJFDKJkEGg DPm1NXSsg+aW8XFeYtUwLVchez9YsAZFb3S3SJaMFiL9HP6G1V1Cfa1MSvlMNVjZnZqFTTwuat9 2WYV8dDkA8OrYHdwDGfYlY/yoV/0Up6EHOb2+c7kHZDO53QSwuPlwCWV27Nr X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-0.957700-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183746-lmXyqbWzMbKf X-PPE-DISP: 1603183746;lmXyqbWzMbKf Subject: [dpdk-dev] [PATCH 51/62] net/sfc: support flow item IPV6 in transfer rules X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add support for this flow item to MAE-specific RTE flow implementation. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 3 + drivers/net/sfc/sfc_mae.c | 106 ++++++++++++++++++++++++++++++++++++ drivers/net/sfc/sfc_mae.h | 1 + 3 files changed, 110 insertions(+) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index e687e1cac3..8209990d23 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -205,6 +205,9 @@ Supported pattern items (***transfer*** rules): - IPV4 (source/destination addresses, IP transport protocol, type of service, time to live) +- IPV6 (source/destination addresses, IP transport protocol, + traffic class, hop limit) + Supported actions (***transfer*** rules): - OF_POP_VLAN diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index d7c1cd784f..2b0121c0ac 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -946,6 +946,105 @@ sfc_mae_rule_parse_item_ipv4(const struct rte_flow_item *item, ctx_mae->match_spec_action, error); } +static const struct sfc_mae_field_locator flocs_ipv6[] = { + { + EFX_MAE_FIELD_SRC_IP6_BE, + RTE_SIZEOF_FIELD(struct rte_flow_item_ipv6, hdr.src_addr), + offsetof(struct rte_flow_item_ipv6, hdr.src_addr), + }, + { + EFX_MAE_FIELD_DST_IP6_BE, + RTE_SIZEOF_FIELD(struct rte_flow_item_ipv6, hdr.dst_addr), + offsetof(struct rte_flow_item_ipv6, hdr.dst_addr), + }, + { + /* + * This locator is used only for building supported fields mask. + * The field is handled by sfc_mae_rule_process_pattern_data(). + */ + SFC_MAE_FIELD_HANDLING_DEFERRED, + RTE_SIZEOF_FIELD(struct rte_flow_item_ipv6, hdr.proto), + offsetof(struct rte_flow_item_ipv6, hdr.proto), + }, + { + EFX_MAE_FIELD_IP_TTL, + RTE_SIZEOF_FIELD(struct rte_flow_item_ipv6, hdr.hop_limits), + offsetof(struct rte_flow_item_ipv6, hdr.hop_limits), + }, +}; + +static int +sfc_mae_rule_parse_item_ipv6(const struct rte_flow_item *item, + struct sfc_flow_parse_ctx *ctx, + struct rte_flow_error *error) +{ + rte_be16_t ethertype_ipv6_be = RTE_BE16(RTE_ETHER_TYPE_IPV6); + struct sfc_mae_parse_ctx *ctx_mae = ctx->mae; + struct sfc_mae_pattern_data *pdata = &ctx_mae->pattern_data; + struct rte_flow_item_ipv6 supp_mask; + const uint8_t *spec = NULL; + const uint8_t *mask = NULL; + rte_be32_t vtc_flow_be; + uint32_t vtc_flow; + uint8_t tc_value; + uint8_t tc_mask; + int rc; + + sfc_mae_item_build_supp_mask(flocs_ipv6, RTE_DIM(flocs_ipv6), + &supp_mask, sizeof(supp_mask)); + + vtc_flow_be = RTE_BE32(RTE_IPV6_HDR_TC_MASK); + memcpy(&supp_mask, &vtc_flow_be, sizeof(vtc_flow_be)); + + rc = sfc_flow_parse_init(item, + (const void **)&spec, (const void **)&mask, + (const void *)&supp_mask, + &rte_flow_item_ipv6_mask, + sizeof(struct rte_flow_item_ipv6), error); + if (rc != 0) + return rc; + + pdata->innermost_ethertype_restriction.value = ethertype_ipv6_be; + pdata->innermost_ethertype_restriction.mask = RTE_BE16(0xffff); + + if (spec != NULL) { + const struct rte_flow_item_ipv6 *item_spec; + const struct rte_flow_item_ipv6 *item_mask; + + item_spec = (const struct rte_flow_item_ipv6 *)spec; + item_mask = (const struct rte_flow_item_ipv6 *)mask; + + pdata->l3_next_proto_value = item_spec->hdr.proto; + pdata->l3_next_proto_mask = item_mask->hdr.proto; + } else { + return 0; + } + + rc = sfc_mae_parse_item(flocs_ipv6, RTE_DIM(flocs_ipv6), spec, mask, + ctx_mae->match_spec_action, error); + if (rc != 0) + return rc; + + memcpy(&vtc_flow_be, spec, sizeof(vtc_flow_be)); + vtc_flow = rte_be_to_cpu_32(vtc_flow_be); + tc_value = (vtc_flow & RTE_IPV6_HDR_TC_MASK) >> RTE_IPV6_HDR_TC_SHIFT; + + memcpy(&vtc_flow_be, mask, sizeof(vtc_flow_be)); + vtc_flow = rte_be_to_cpu_32(vtc_flow_be); + tc_mask = (vtc_flow & RTE_IPV6_HDR_TC_MASK) >> RTE_IPV6_HDR_TC_SHIFT; + + rc = efx_mae_match_spec_field_set(ctx_mae->match_spec_action, + EFX_MAE_FIELD_IP_TOS, + sizeof(tc_value), &tc_value, + sizeof(tc_mask), &tc_mask); + if (rc != 0) { + return rte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_ITEM, + NULL, "Failed to process item fields"); + } + + return 0; +} + static const struct sfc_flow_item sfc_flow_items[] = { { .type = RTE_FLOW_ITEM_TYPE_PORT_ID, @@ -1012,6 +1111,13 @@ static const struct sfc_flow_item sfc_flow_items[] = { .ctx_type = SFC_FLOW_PARSE_CTX_MAE, .parse = sfc_mae_rule_parse_item_ipv4, }, + { + .type = RTE_FLOW_ITEM_TYPE_IPV6, + .prev_layer = SFC_FLOW_ITEM_L2, + .layer = SFC_FLOW_ITEM_L3, + .ctx_type = SFC_FLOW_PARSE_CTX_MAE, + .parse = sfc_mae_rule_parse_item_ipv6, + }, }; int diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index 56be8bf917..993a377861 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -115,6 +115,7 @@ struct sfc_mae_pattern_data { * L3 requirement for the innermost L2 item's "type" ("inner_type"). * This contains one of: * - 0x0800/0xffff: IPV4 + * - 0x86dd/0xffff: IPV6 * - 0x0000/0x0000: no L3 item */ struct sfc_mae_ethertype innermost_ethertype_restriction; From patchwork Tue Oct 20 08:48:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81491 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 5BAD0A04DD; Tue, 20 Oct 2020 11:07:06 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A6C1CC980; Tue, 20 Oct 2020 10:50:18 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 738CEBAE8 for ; Tue, 20 Oct 2020 10:49:07 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.62]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 4506F60072 for ; Tue, 20 Oct 2020 08:49:07 +0000 (UTC) Received: from us4-mdac16-3.ut7.mdlocal (unknown [10.7.65.71]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 446D08009B for ; Tue, 20 Oct 2020 08:49:07 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.41]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id CA3D7280053 for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 7DC8D4C005C for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8moJn030909; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 81EF41613AB; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:19 +0100 Message-ID: <1603183709-23420-53-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.542900-8.000000-10 X-TMASE-MatchedRID: wNa/NzXcuxNIm8dlggjEyIdlc1JaOB1T3aHfGa/QuY9wkdIrVt8X1VDT Kayi2ZF6Ko7X68Rw9F5w5T4Iaj538mJZXQNDzktSJhpz1Tt0Ip9j0mUvAvV2DTX0XBuNPWrao8W MkQWv6iXBcIE78YqRWo6HM5rqDwqtTBHrkx9W8fcJIpmiXKK2EONPXBRaeY9w4uUomG0oqZUM4T 4ZZM54boGhQFOzwTeptXJTwC5I7xriPCgCgPEFihb2OXZ3jwYghdeYev6ImzWyrFieOBrhBjzcW rt/fwYrRcB2ZpPnVjJQ5+rfVDglH5RMZUCEHkRt X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-0.542900-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183747-R22oHEe5gZVm X-PPE-DISP: 1603183747;R22oHEe5gZVm Subject: [dpdk-dev] [PATCH 52/62] common/sfc_efx/base: add MAE match fields for TCP and UDP X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add MCDI-compatible enumeration for these fields and provide necessary mappings for them to be inserted directly into mask-value pairs buffer. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 3 +++ drivers/common/sfc_efx/base/efx_mae.c | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 16927eb910..b84a43336a 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4114,6 +4114,9 @@ typedef enum efx_mae_field_id_e { EFX_MAE_FIELD_IP_TTL, EFX_MAE_FIELD_SRC_IP6_BE, EFX_MAE_FIELD_DST_IP6_BE, + EFX_MAE_FIELD_L4_SPORT_BE, + EFX_MAE_FIELD_L4_DPORT_BE, + EFX_MAE_FIELD_TCP_FLAGS_BE, EFX_MAE_FIELD_NIDS } efx_mae_field_id_t; diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index c015b4c471..7958504963 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -297,6 +297,9 @@ typedef enum efx_mae_field_cap_id_e { EFX_MAE_FIELD_ID_IP_TTL = MAE_FIELD_IP_TTL, EFX_MAE_FIELD_ID_SRC_IP6_BE = MAE_FIELD_SRC_IP6, EFX_MAE_FIELD_ID_DST_IP6_BE = MAE_FIELD_DST_IP6, + EFX_MAE_FIELD_ID_L4_SPORT_BE = MAE_FIELD_L4_SPORT, + EFX_MAE_FIELD_ID_L4_DPORT_BE = MAE_FIELD_L4_DPORT, + EFX_MAE_FIELD_ID_TCP_FLAGS_BE = MAE_FIELD_TCP_FLAGS, EFX_MAE_FIELD_CAP_NIDS } efx_mae_field_cap_id_t; @@ -353,6 +356,9 @@ static const efx_mae_mv_desc_t __efx_mae_action_rule_mv_desc_set[] = { EFX_MAE_MV_DESC(IP_TTL, EFX_MAE_FIELD_BE), EFX_MAE_MV_DESC(SRC_IP6_BE, EFX_MAE_FIELD_BE), EFX_MAE_MV_DESC(DST_IP6_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(L4_SPORT_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(L4_DPORT_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(TCP_FLAGS_BE, EFX_MAE_FIELD_BE), #undef EFX_MAE_MV_DESC }; From patchwork Tue Oct 20 08:48:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81493 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id D3DC2A04DD; Tue, 20 Oct 2020 11:07:49 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 63187C9C6; Tue, 20 Oct 2020 10:50:21 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id E12E0BBA2 for ; Tue, 20 Oct 2020 10:49:07 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id B1D5360071 for ; Tue, 20 Oct 2020 08:49:07 +0000 (UTC) Received: from us4-mdac16-58.ut7.mdlocal (unknown [10.7.66.29]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id AF8468009E for ; Tue, 20 Oct 2020 08:49:07 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.199]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 19D2580055 for ; Tue, 20 Oct 2020 08:49:07 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id C3C11180058 for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8movP030912; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 8FA441613A9; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:20 +0100 Message-ID: <1603183709-23420-54-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.042700-8.000000-10 X-TMASE-MatchedRID: 3ksEd+Y0lhQfKML5AJtfLS2416nc3bQleouvej40T4gd0WOKRkwsh66P KQSZCnDqRjuuru99Q9KPQi9XuOWoOPyUSi1R/9mUpu2VUsoXjOnH6OsXtPNFLU8iLpubparmLYt XmTkfIw66wYPx0ATBoKj/gQzO7EtvVumvLS6q4FCSvRb8EMdYRYfQ3g3I7jVbDpCUEeEFm7CGon GL0jN7MrAvU1QKVuyLUWBVxR396r7JwIkjG/GOnCL/7WCg9OOSovA/6ONsv0rmQJUUegCCe+xvA Z+P6819rIBzH3upzT+/0Zic4ZIFl7Ud2R7XKvn3I7qctJOE9rp9LQinZ4QefPcjNeVeWlqY+gtH j7OwNO1Sa+jpKCDmEWz7+ViRut4I3ZNS0z0ZM49hoJiDekd93DNT61j9k+YbvHJcklp+bXU5Ydt MJu+Xj06eURWUybDimvjwc3/yjPGG0ZyqkEqBXdpAu0sLxpSoQ8G+yYJYYdZRZDsGiXQioL4jxK nHJRLcVcr204P67pw= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-0.042700-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183747-MfsUSuCwCjAB X-PPE-DISP: 1603183747;MfsUSuCwCjAB Subject: [dpdk-dev] [PATCH 53/62] net/sfc: support flow item TCP in transfer rules X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add support for this flow item to MAE-specific RTE flow implementation. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 2 + drivers/net/sfc/sfc_mae.c | 77 +++++++++++++++++++++++++++++++++++++ drivers/net/sfc/sfc_mae.h | 15 +++++++- 3 files changed, 93 insertions(+), 1 deletion(-) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index 8209990d23..661af43a20 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -208,6 +208,8 @@ Supported pattern items (***transfer*** rules): - IPV6 (source/destination addresses, IP transport protocol, traffic class, hop limit) +- TCP (source/destination ports, TCP header length + TCP flags) + Supported actions (***transfer*** rules): - OF_POP_VLAN diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 2b0121c0ac..59c53a96f3 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -396,6 +396,19 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx, if (rc != 0) goto fail; + if (pdata->l3_next_proto_restriction_mask == 0xff) { + if (pdata->l3_next_proto_mask == 0) { + pdata->l3_next_proto_mask = 0xff; + pdata->l3_next_proto_value = + pdata->l3_next_proto_restriction_value; + } else if (pdata->l3_next_proto_mask != 0xff || + pdata->l3_next_proto_value != + pdata->l3_next_proto_restriction_value) { + rc = EINVAL; + goto fail; + } + } + valuep = (const uint8_t *)&pdata->l3_next_proto_value; maskp = (const uint8_t *)&pdata->l3_next_proto_mask; rc = efx_mae_match_spec_field_set(efx_spec, EFX_MAE_FIELD_IP_PROTO, @@ -1045,6 +1058,63 @@ sfc_mae_rule_parse_item_ipv6(const struct rte_flow_item *item, return 0; } +static const struct sfc_mae_field_locator flocs_tcp[] = { + { + EFX_MAE_FIELD_L4_SPORT_BE, + RTE_SIZEOF_FIELD(struct rte_flow_item_tcp, hdr.src_port), + offsetof(struct rte_flow_item_tcp, hdr.src_port), + }, + { + EFX_MAE_FIELD_L4_DPORT_BE, + RTE_SIZEOF_FIELD(struct rte_flow_item_tcp, hdr.dst_port), + offsetof(struct rte_flow_item_tcp, hdr.dst_port), + }, + { + EFX_MAE_FIELD_TCP_FLAGS_BE, + /* + * The values have been picked intentionally since the + * target MAE field is oversize (16 bit). This mapping + * relies on the fact that the MAE field is big-endian. + */ + RTE_SIZEOF_FIELD(struct rte_flow_item_tcp, hdr.data_off) + + RTE_SIZEOF_FIELD(struct rte_flow_item_tcp, hdr.tcp_flags), + offsetof(struct rte_flow_item_tcp, hdr.data_off), + }, +}; + +static int +sfc_mae_rule_parse_item_tcp(const struct rte_flow_item *item, + struct sfc_flow_parse_ctx *ctx, + struct rte_flow_error *error) +{ + struct sfc_mae_parse_ctx *ctx_mae = ctx->mae; + struct sfc_mae_pattern_data *pdata = &ctx_mae->pattern_data; + struct rte_flow_item_tcp supp_mask; + const uint8_t *spec = NULL; + const uint8_t *mask = NULL; + int rc; + + sfc_mae_item_build_supp_mask(flocs_tcp, RTE_DIM(flocs_tcp), + &supp_mask, sizeof(supp_mask)); + + rc = sfc_flow_parse_init(item, + (const void **)&spec, (const void **)&mask, + (const void *)&supp_mask, + &rte_flow_item_tcp_mask, + sizeof(struct rte_flow_item_tcp), error); + if (rc != 0) + return rc; + + pdata->l3_next_proto_restriction_value = IPPROTO_TCP; + pdata->l3_next_proto_restriction_mask = 0xff; + + if (spec == NULL) + return 0; + + return sfc_mae_parse_item(flocs_tcp, RTE_DIM(flocs_tcp), spec, mask, + ctx_mae->match_spec_action, error); +} + static const struct sfc_flow_item sfc_flow_items[] = { { .type = RTE_FLOW_ITEM_TYPE_PORT_ID, @@ -1118,6 +1188,13 @@ static const struct sfc_flow_item sfc_flow_items[] = { .ctx_type = SFC_FLOW_PARSE_CTX_MAE, .parse = sfc_mae_rule_parse_item_ipv6, }, + { + .type = RTE_FLOW_ITEM_TYPE_TCP, + .prev_layer = SFC_FLOW_ITEM_L3, + .layer = SFC_FLOW_ITEM_L4, + .ctx_type = SFC_FLOW_PARSE_CTX_MAE, + .parse = sfc_mae_rule_parse_item_tcp, + }, }; int diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index 993a377861..71046f2308 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -123,10 +123,23 @@ struct sfc_mae_pattern_data { /** * The following two fields keep track of L3 "proto" mask and value. * The corresponding fields get filled in MAE match specification - * at the end of parsing. + * at the end of parsing. Also, the information is used by a + * post-check to enforce consistency requirements: + * + * - If a L3 item is followed by an item TCP, the former has + * its "proto" set to either 0x06/0xff or 0x00/0x00. */ uint8_t l3_next_proto_value; uint8_t l3_next_proto_mask; + + /* + * L4 requirement for L3 item's "proto". + * This contains one of: + * - 0x06/0xff: TCP + * - 0x00/0x00: no L4 item + */ + uint8_t l3_next_proto_restriction_value; + uint8_t l3_next_proto_restriction_mask; }; struct sfc_mae_parse_ctx { From patchwork Tue Oct 20 08:48:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81494 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 35DBFA04DD; Tue, 20 Oct 2020 11:08:10 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A6C5AC9D8; Tue, 20 Oct 2020 10:50:22 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 5A31DAD31 for ; Tue, 20 Oct 2020 10:49:07 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.62]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 2BF2D60085 for ; Tue, 20 Oct 2020 08:49:07 +0000 (UTC) Received: from us4-mdac16-60.ut7.mdlocal (unknown [10.7.66.51]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 2B3CE8009B for ; Tue, 20 Oct 2020 08:49:07 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.199]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id ADDE3280052 for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 632FC18005C for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mowK030915; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 9D8121613AB; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:21 +0100 Message-ID: <1603183709-23420-55-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.505800-8.000000-10 X-TMASE-MatchedRID: 45LChreVRiQfKML5AJtfLS2416nc3bQleouvej40T4gd0WOKRkwsh3Io zGa69omdrdoLblq9S5oV+ztbPoSlM0jn8cIz0h4xHl2pJS1lPFtj0mUvAvV2DU8iLpubparmjZy eZR8NxX75Xk8N8430QJSmVaNYk8rS1DZoJkSjra4mGnPVO3Qin+ZM8S4DYUopDpCUEeEFm7AVAs f1+cZFJ7N4hcW6TGp2Qr7W/2h+I70fE8yM4pjsDzXJPZYaymc4xEHRux+uk8hxKpvEGAbTDuqKL FY8vs6J7KPUUOwL++F0n8xGScnpLzekwf7SLln+3d5o1G92BDTJGMijlL4l6loNzNxWS2uNmO59 S5epWL8WHfn54hdOcZN1JFeUKeMEiOOUXfTkScBZSbxIRLLN380Goa3UM++8 X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--0.505800-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183747-TQKIx4oSSN1o X-PPE-DISP: 1603183747;TQKIx4oSSN1o Subject: [dpdk-dev] [PATCH 54/62] net/sfc: support flow item UDP in transfer rules X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add support for this flow item to MAE-specific RTE flow implementation. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 2 ++ drivers/net/sfc/sfc_mae.c | 53 +++++++++++++++++++++++++++++++++++++ drivers/net/sfc/sfc_mae.h | 4 +++ 3 files changed, 59 insertions(+) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index 661af43a20..e8f8fa987b 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -210,6 +210,8 @@ Supported pattern items (***transfer*** rules): - TCP (source/destination ports, TCP header length + TCP flags) +- UDP (source/destination ports) + Supported actions (***transfer*** rules): - OF_POP_VLAN diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 59c53a96f3..3dd233c6dc 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -1115,6 +1115,52 @@ sfc_mae_rule_parse_item_tcp(const struct rte_flow_item *item, ctx_mae->match_spec_action, error); } +static const struct sfc_mae_field_locator flocs_udp[] = { + { + EFX_MAE_FIELD_L4_SPORT_BE, + RTE_SIZEOF_FIELD(struct rte_flow_item_udp, hdr.src_port), + offsetof(struct rte_flow_item_udp, hdr.src_port), + }, + { + EFX_MAE_FIELD_L4_DPORT_BE, + RTE_SIZEOF_FIELD(struct rte_flow_item_udp, hdr.dst_port), + offsetof(struct rte_flow_item_udp, hdr.dst_port), + }, +}; + +static int +sfc_mae_rule_parse_item_udp(const struct rte_flow_item *item, + struct sfc_flow_parse_ctx *ctx, + struct rte_flow_error *error) +{ + struct sfc_mae_parse_ctx *ctx_mae = ctx->mae; + struct sfc_mae_pattern_data *pdata = &ctx_mae->pattern_data; + struct rte_flow_item_udp supp_mask; + const uint8_t *spec = NULL; + const uint8_t *mask = NULL; + int rc; + + sfc_mae_item_build_supp_mask(flocs_udp, RTE_DIM(flocs_udp), + &supp_mask, sizeof(supp_mask)); + + rc = sfc_flow_parse_init(item, + (const void **)&spec, (const void **)&mask, + (const void *)&supp_mask, + &rte_flow_item_udp_mask, + sizeof(struct rte_flow_item_udp), error); + if (rc != 0) + return rc; + + pdata->l3_next_proto_restriction_value = IPPROTO_UDP; + pdata->l3_next_proto_restriction_mask = 0xff; + + if (spec == NULL) + return 0; + + return sfc_mae_parse_item(flocs_udp, RTE_DIM(flocs_udp), spec, mask, + ctx_mae->match_spec_action, error); +} + static const struct sfc_flow_item sfc_flow_items[] = { { .type = RTE_FLOW_ITEM_TYPE_PORT_ID, @@ -1195,6 +1241,13 @@ static const struct sfc_flow_item sfc_flow_items[] = { .ctx_type = SFC_FLOW_PARSE_CTX_MAE, .parse = sfc_mae_rule_parse_item_tcp, }, + { + .type = RTE_FLOW_ITEM_TYPE_UDP, + .prev_layer = SFC_FLOW_ITEM_L3, + .layer = SFC_FLOW_ITEM_L4, + .ctx_type = SFC_FLOW_PARSE_CTX_MAE, + .parse = sfc_mae_rule_parse_item_udp, + }, }; int diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index 71046f2308..8d9b4039f3 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -128,6 +128,9 @@ struct sfc_mae_pattern_data { * * - If a L3 item is followed by an item TCP, the former has * its "proto" set to either 0x06/0xff or 0x00/0x00. + * + * - If a L3 item is followed by an item UDP, the former has + * its "proto" set to either 0x11/0xff or 0x00/0x00. */ uint8_t l3_next_proto_value; uint8_t l3_next_proto_mask; @@ -136,6 +139,7 @@ struct sfc_mae_pattern_data { * L4 requirement for L3 item's "proto". * This contains one of: * - 0x06/0xff: TCP + * - 0x11/0xff: UDP * - 0x00/0x00: no L4 item */ uint8_t l3_next_proto_restriction_value; From patchwork Tue Oct 20 08:48:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81479 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 2C42EA04DD; Tue, 20 Oct 2020 11:02:28 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 8B4C6C854; Tue, 20 Oct 2020 10:49:57 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 1F97EBBB0 for ; Tue, 20 Oct 2020 10:49:05 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id E047060054 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from us4-mdac16-75.ut7.mdlocal (unknown [10.7.64.194]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id E0C048009E for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.41]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 6FDAE80057 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 23F794C0064 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mo1P030916; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id AA4CB1613A9; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:22 +0100 Message-ID: <1603183709-23420-56-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-4.153800-8.000000-10 X-TMASE-MatchedRID: 4jdN4RfSnnzxpWQFmQ4/MhYZoKAPfQ6CHS44sLaHAPLyN+XEEoySvlt/ rcvvwuMBuKjr7On4ANqCfAAkLV8ZpH/BjdQS1Tt2BytCIW2H3sdKRaXN2yYjHnCR0itW3xfVUNM prKLZkXoqjtfrxHD0XnDlPghqPnfyYlldA0POS1LHmyDJSEsI28wx7VbZgGmKR2YNIFh+clFcmx XymrkPkPN+XKhORaFFgDLqnrRlXrZ8nn9tnqel2MZW5ai5WKlyZrcHqz4ma7qkiv9e1njxcJW5+ voW4STCkNG0hyFkD4Y6Zd7tBWMUnjo44vflLzuVpTHdnTkqPPIGOl0WvKNVtdrEgHosDUI48Oyc cFNBL2TKhETi2//sjuP9Cb59K8ACZrS+A8PszW/U9h9N881NSQ== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--4.153800-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183744-KNCTvujRAs0O X-PPE-DISP: 1603183744;KNCTvujRAs0O Subject: [dpdk-dev] [PATCH 55/62] common/sfc_efx/base: indicate MAE support for encapsulation X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov MAE provides support for encapsulation. One needs to insert a so-called outer rule, which can match outer packet fields, to require that matching packets be parsed as tunnel frames of a given type (VXLAN, Geneve, NVGRE). Then it is possible to chain this rule with an action rule in order to match on inner fields and carry out some actions on matching packets. Report to clients what encapsulation types are supported by MAE. Indicate the number of priority levels for outer rules. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 2 ++ drivers/common/sfc_efx/base/efx_impl.h | 2 ++ drivers/common/sfc_efx/base/efx_mae.c | 22 ++++++++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index b84a43336a..dea1fe3979 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4068,6 +4068,8 @@ efx_mae_fini( typedef struct efx_mae_limits_s { uint32_t eml_max_n_action_prios; + uint32_t eml_max_n_outer_prios; + uint32_t eml_encap_types_supported; } efx_mae_limits_t; LIBEFX_API diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h index db68cc7b24..900a8c9c6a 100644 --- a/drivers/common/sfc_efx/base/efx_impl.h +++ b/drivers/common/sfc_efx/base/efx_impl.h @@ -798,6 +798,8 @@ typedef struct efx_mae_s { /** Action rule match field capabilities. */ efx_mae_field_cap_t *em_action_rule_field_caps; size_t em_action_rule_field_caps_size; + uint32_t em_max_n_outer_prios; + uint32_t em_encap_types_supported; } 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 7958504963..4e51c7b69b 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -39,9 +39,29 @@ efx_mae_get_capabilities( goto fail2; } + maep->em_max_n_outer_prios = + MCDI_OUT_DWORD(req, MAE_GET_CAPS_OUT_OUTER_PRIOS); + maep->em_max_n_action_prios = MCDI_OUT_DWORD(req, MAE_GET_CAPS_OUT_ACTION_PRIOS); + maep->em_encap_types_supported = 0; + + if (MCDI_OUT_DWORD(req, MAE_GET_CAPS_OUT_ENCAP_TYPE_VXLAN) == 1) { + maep->em_encap_types_supported |= + (1U << EFX_TUNNEL_PROTOCOL_VXLAN); + } + + if (MCDI_OUT_DWORD(req, MAE_GET_CAPS_OUT_ENCAP_TYPE_GENEVE) == 1) { + maep->em_encap_types_supported |= + (1U << EFX_TUNNEL_PROTOCOL_GENEVE); + } + + if (MCDI_OUT_DWORD(req, MAE_GET_CAPS_OUT_ENCAP_TYPE_NVGRE) == 1) { + maep->em_encap_types_supported |= + (1U << EFX_TUNNEL_PROTOCOL_NVGRE); + } + maep->em_max_nfields = MCDI_OUT_DWORD(req, MAE_GET_CAPS_OUT_MATCH_FIELD_COUNT); @@ -225,7 +245,9 @@ efx_mae_get_limits( goto fail1; } + emlp->eml_max_n_outer_prios = maep->em_max_n_outer_prios; emlp->eml_max_n_action_prios = maep->em_max_n_action_prios; + emlp->eml_encap_types_supported = maep->em_encap_types_supported; return (0); From patchwork Tue Oct 20 08:48:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81490 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id A5F3EA04DD; Tue, 20 Oct 2020 11:06:44 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 6BDA4C968; Tue, 20 Oct 2020 10:50:17 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 2CE36BBA6 for ; Tue, 20 Oct 2020 10:49:07 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.64]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id AB9A46007D for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) Received: from us4-mdac16-11.ut7.mdlocal (unknown [10.7.65.208]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id A9E962009B for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 38FD622004F for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id E4336800058 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8moAJ030921; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id B831F1613BE; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:23 +0100 Message-ID: <1603183709-23420-57-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.450900-8.000000-10 X-TMASE-MatchedRID: 0ewWeSi3LUlIm8dlggjEyIdlc1JaOB1T3aHfGa/QuY/cUlQs8YFKzuZ5 Gn23AeDZuA9fFHhyLzywgcHDNo5AtCHhSBQfglfsA9lly13c/gEyieckNRsVxx9W4auM/sn0j++ ck7gzviB9nXBYBc7+9RLUZu/IHKwxFUPnz5fE4uP0MaQO2ri8DPoMe2Os6+g5myiLZetSf8mfop 0ytGwvXiq2rl3dzGQ1sJmqsJ/dI9+YY7qGTMxERZIMqWKN4/8VnHy/IrOPsiv7E8fFVUVOi/U34 d/y/jJFAKu1NGLkIOd0vW21E/pKAHfJ1aogE706UuniFRR7Z6E4oGQUCbwY5Q+g7mdwjo656FtD ZCmYBJ1Y8paICU20jkMMprcbiest X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-0.450900-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183745-XiHQZ3plDNZZ X-PPE-DISP: 1603183745;XiHQZ3plDNZZ Subject: [dpdk-dev] [PATCH 56/62] common/sfc_efx/base: add MAE encap. match fields X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add MCDI-compatible enumeration for these fields and provide necessary mappings for them to be inserted directly into mask-value pairs buffer. These fields are meant to comprise a so-called outer match specification; provide necessary definitions. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 17 ++++++++ drivers/common/sfc_efx/base/efx_impl.h | 1 + drivers/common/sfc_efx/base/efx_mae.c | 56 ++++++++++++++++++++++++++ 3 files changed, 74 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index dea1fe3979..29ef20facc 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4080,6 +4080,7 @@ efx_mae_get_limits( typedef enum efx_mae_rule_type_e { EFX_MAE_RULE_ACTION = 0, + EFX_MAE_RULE_OUTER, EFX_MAE_RULE_NTYPES } efx_mae_rule_type_t; @@ -4119,6 +4120,22 @@ typedef enum efx_mae_field_id_e { EFX_MAE_FIELD_L4_SPORT_BE, EFX_MAE_FIELD_L4_DPORT_BE, EFX_MAE_FIELD_TCP_FLAGS_BE, + EFX_MAE_FIELD_ENC_ETHER_TYPE_BE, + EFX_MAE_FIELD_ENC_ETH_SADDR_BE, + EFX_MAE_FIELD_ENC_ETH_DADDR_BE, + EFX_MAE_FIELD_ENC_VLAN0_TCI_BE, + EFX_MAE_FIELD_ENC_VLAN0_PROTO_BE, + EFX_MAE_FIELD_ENC_VLAN1_TCI_BE, + EFX_MAE_FIELD_ENC_VLAN1_PROTO_BE, + EFX_MAE_FIELD_ENC_SRC_IP4_BE, + EFX_MAE_FIELD_ENC_DST_IP4_BE, + EFX_MAE_FIELD_ENC_IP_PROTO, + EFX_MAE_FIELD_ENC_IP_TOS, + EFX_MAE_FIELD_ENC_IP_TTL, + EFX_MAE_FIELD_ENC_SRC_IP6_BE, + EFX_MAE_FIELD_ENC_DST_IP6_BE, + EFX_MAE_FIELD_ENC_L4_SPORT_BE, + EFX_MAE_FIELD_ENC_L4_DPORT_BE, EFX_MAE_FIELD_NIDS } efx_mae_field_id_t; diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h index 900a8c9c6a..6a8b8d65f1 100644 --- a/drivers/common/sfc_efx/base/efx_impl.h +++ b/drivers/common/sfc_efx/base/efx_impl.h @@ -1698,6 +1698,7 @@ struct efx_mae_match_spec_s { uint32_t emms_prio; union emms_mask_value_pairs { uint8_t action[MAE_FIELD_MASK_VALUE_PAIRS_LEN]; + uint8_t outer[MAE_ENC_FIELD_PAIRS_LEN]; } emms_mask_value_pairs; }; diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index 4e51c7b69b..13ccd79f31 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -267,6 +267,8 @@ efx_mae_match_spec_init( efx_rc_t rc; switch (type) { + case EFX_MAE_RULE_OUTER: + break; case EFX_MAE_RULE_ACTION: break; default: @@ -322,6 +324,22 @@ typedef enum efx_mae_field_cap_id_e { EFX_MAE_FIELD_ID_L4_SPORT_BE = MAE_FIELD_L4_SPORT, EFX_MAE_FIELD_ID_L4_DPORT_BE = MAE_FIELD_L4_DPORT, EFX_MAE_FIELD_ID_TCP_FLAGS_BE = MAE_FIELD_TCP_FLAGS, + EFX_MAE_FIELD_ID_ENC_ETHER_TYPE_BE = MAE_FIELD_ENC_ETHER_TYPE, + EFX_MAE_FIELD_ID_ENC_ETH_SADDR_BE = MAE_FIELD_ENC_ETH_SADDR, + EFX_MAE_FIELD_ID_ENC_ETH_DADDR_BE = MAE_FIELD_ENC_ETH_DADDR, + EFX_MAE_FIELD_ID_ENC_VLAN0_TCI_BE = MAE_FIELD_ENC_VLAN0_TCI, + EFX_MAE_FIELD_ID_ENC_VLAN0_PROTO_BE = MAE_FIELD_ENC_VLAN0_PROTO, + EFX_MAE_FIELD_ID_ENC_VLAN1_TCI_BE = MAE_FIELD_ENC_VLAN1_TCI, + EFX_MAE_FIELD_ID_ENC_VLAN1_PROTO_BE = MAE_FIELD_ENC_VLAN1_PROTO, + EFX_MAE_FIELD_ID_ENC_SRC_IP4_BE = MAE_FIELD_ENC_SRC_IP4, + EFX_MAE_FIELD_ID_ENC_DST_IP4_BE = MAE_FIELD_ENC_DST_IP4, + EFX_MAE_FIELD_ID_ENC_IP_PROTO = MAE_FIELD_ENC_IP_PROTO, + EFX_MAE_FIELD_ID_ENC_IP_TOS = MAE_FIELD_ENC_IP_TOS, + EFX_MAE_FIELD_ID_ENC_IP_TTL = MAE_FIELD_ENC_IP_TTL, + EFX_MAE_FIELD_ID_ENC_SRC_IP6_BE = MAE_FIELD_ENC_SRC_IP6, + EFX_MAE_FIELD_ID_ENC_DST_IP6_BE = MAE_FIELD_ENC_DST_IP6, + EFX_MAE_FIELD_ID_ENC_L4_SPORT_BE = MAE_FIELD_ENC_L4_SPORT, + EFX_MAE_FIELD_ID_ENC_L4_DPORT_BE = MAE_FIELD_ENC_L4_DPORT, EFX_MAE_FIELD_CAP_NIDS } efx_mae_field_cap_id_t; @@ -382,6 +400,40 @@ static const efx_mae_mv_desc_t __efx_mae_action_rule_mv_desc_set[] = { EFX_MAE_MV_DESC(L4_DPORT_BE, EFX_MAE_FIELD_BE), EFX_MAE_MV_DESC(TCP_FLAGS_BE, EFX_MAE_FIELD_BE), +#undef EFX_MAE_MV_DESC +}; + +/* Indices to this array are provided by efx_mae_field_id_t */ +static const efx_mae_mv_desc_t __efx_mae_outer_rule_mv_desc_set[] = { +#define EFX_MAE_MV_DESC(_name, _endianness) \ + [EFX_MAE_FIELD_##_name] = \ + { \ + EFX_MAE_FIELD_ID_##_name, \ + MAE_ENC_FIELD_PAIRS_##_name##_LEN, \ + MAE_ENC_FIELD_PAIRS_##_name##_OFST, \ + MAE_ENC_FIELD_PAIRS_##_name##_MASK_LEN, \ + MAE_ENC_FIELD_PAIRS_##_name##_MASK_OFST, \ + _endianness \ + } + + EFX_MAE_MV_DESC(INGRESS_MPORT_SELECTOR, EFX_MAE_FIELD_LE), + EFX_MAE_MV_DESC(ENC_ETHER_TYPE_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ENC_ETH_SADDR_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ENC_ETH_DADDR_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ENC_VLAN0_TCI_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ENC_VLAN0_PROTO_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ENC_VLAN1_TCI_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ENC_VLAN1_PROTO_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ENC_SRC_IP4_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ENC_DST_IP4_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ENC_IP_PROTO, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ENC_IP_TOS, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ENC_IP_TTL, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ENC_SRC_IP6_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ENC_DST_IP6_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ENC_L4_SPORT_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ENC_L4_DPORT_BE, EFX_MAE_FIELD_BE), + #undef EFX_MAE_MV_DESC }; @@ -470,6 +522,10 @@ efx_mae_match_spec_field_set( } switch (spec->emms_type) { + case EFX_MAE_RULE_OUTER: + descp = &__efx_mae_outer_rule_mv_desc_set[field_id]; + mvp = spec->emms_mask_value_pairs.outer; + break; case EFX_MAE_RULE_ACTION: descp = &__efx_mae_action_rule_mv_desc_set[field_id]; mvp = spec->emms_mask_value_pairs.action; From patchwork Tue Oct 20 08:48:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81487 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id D2C6BA04DD; Tue, 20 Oct 2020 11:05:39 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 40206C926; Tue, 20 Oct 2020 10:50:12 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id A4AF5AD31 for ; Tue, 20 Oct 2020 10:49:05 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 740436005E for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) Received: from us4-mdac16-58.ut7.mdlocal (unknown [10.7.66.29]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 72A8A8009E for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.41]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id D088480055 for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 83EE04C005C for ; Tue, 20 Oct 2020 08:49:04 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:51 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mo3e030924; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id C4E631613A9; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:24 +0100 Message-ID: <1603183709-23420-58-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.788000-8.000000-10 X-TMASE-MatchedRID: g3zpsxt0E1BIm8dlggjEyIdlc1JaOB1T3aHfGa/QuY98vx8dQICa6+Z5 Gn23AeDZuA9fFHhyLzywgcHDNo5AtCHhSBQfglfsA9lly13c/gEyieckNRsVx1VkJxysad/I4sw lrPZpNc7i8zVgXoAltsIJ+4gwXrEtJ0RPnyOnrZKlCXOD27yEzr+NPHLpa3mdjbu7a9U8YJryxJ C79RyrF5ENsrg+0grOQ8PJ3SXHj3fGTQE0jjBLY/bzqUbfy56LApv9TnH/xs69Tbikt9AWZ0CBS GS7bIBtA1B/p1SzcogrKiD/U8b7STG+qee9IpZ3 X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--0.788000-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183745-GzIlohbNmqS2 X-PPE-DISP: 1603183745;GzIlohbNmqS2 Subject: [dpdk-dev] [PATCH 57/62] common/sfc_efx/base: add MAE match field VNET ID for tunnels X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add MCDI-compatible enumeration for this field and provide necessary mappings for it to be inserted directly into mask-value pairs buffer. VNET_ID can be used to serve the following match fields: rte_flow_item_vxlan.vni, rte_flow_item_geneve.vni, rte_flow_item_nvgre.tni Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 1 + drivers/common/sfc_efx/base/efx_mae.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 29ef20facc..901d653262 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4136,6 +4136,7 @@ typedef enum efx_mae_field_id_e { EFX_MAE_FIELD_ENC_DST_IP6_BE, EFX_MAE_FIELD_ENC_L4_SPORT_BE, EFX_MAE_FIELD_ENC_L4_DPORT_BE, + EFX_MAE_FIELD_ENC_VNET_ID_BE, EFX_MAE_FIELD_NIDS } efx_mae_field_id_t; diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index 13ccd79f31..dfb8b2e743 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -340,6 +340,7 @@ typedef enum efx_mae_field_cap_id_e { EFX_MAE_FIELD_ID_ENC_DST_IP6_BE = MAE_FIELD_ENC_DST_IP6, EFX_MAE_FIELD_ID_ENC_L4_SPORT_BE = MAE_FIELD_ENC_L4_SPORT, EFX_MAE_FIELD_ID_ENC_L4_DPORT_BE = MAE_FIELD_ENC_L4_DPORT, + EFX_MAE_FIELD_ID_ENC_VNET_ID_BE = MAE_FIELD_ENC_VNET_ID, EFX_MAE_FIELD_CAP_NIDS } efx_mae_field_cap_id_t; @@ -399,6 +400,7 @@ static const efx_mae_mv_desc_t __efx_mae_action_rule_mv_desc_set[] = { EFX_MAE_MV_DESC(L4_SPORT_BE, EFX_MAE_FIELD_BE), EFX_MAE_MV_DESC(L4_DPORT_BE, EFX_MAE_FIELD_BE), EFX_MAE_MV_DESC(TCP_FLAGS_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(ENC_VNET_ID_BE, EFX_MAE_FIELD_BE), #undef EFX_MAE_MV_DESC }; From patchwork Tue Oct 20 08:48:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81506 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 8A1A9A04DD; Tue, 20 Oct 2020 11:12:30 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 319C9E25C; Tue, 20 Oct 2020 10:50:41 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 87AC0BBBC for ; Tue, 20 Oct 2020 10:49:10 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 1842E6006F for ; Tue, 20 Oct 2020 08:49:09 +0000 (UTC) Received: from us4-mdac16-58.ut7.mdlocal (unknown [10.7.66.29]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 18A6F8009E for ; Tue, 20 Oct 2020 08:49:09 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.40]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 8635D80055 for ; Tue, 20 Oct 2020 08:49:08 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 3CD7ABC0067 for ; Tue, 20 Oct 2020 08:49:08 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:51 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:51 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mosb030927; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id D21F31613AB; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:25 +0100 Message-ID: <1603183709-23420-59-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.402900-8.000000-10 X-TMASE-MatchedRID: v6XyZOeCJ6BXDwaouY0y7snUT+eskUQPKVrLOZD1BXQUg3Iby1ts262y y0u8o6fF2XHJ0L4jOIQs/31GzKkTsX37P6Etxb6f9cb9iRwZHB8/pOSL72dTfwdkFovAReUoilv Ab18i4hM4oaNQ56uefbQSgC3u7x63OYaLvc/+qamHZXNSWjgdU4Z6Q5tE4bB0myiLZetSf8mfop 0ytGwvXiq2rl3dzGQ1DEzjTsDYTlWTIK5Q9X28C7gqYFAsm8wW2PvaDEEPwPOW/7fXwBwGMgjw1 cwjcgN2F7ZKDLi5tUbhUMwM7mgUGgBc3DnHrNRTUuniFRR7Z6E4oGQUCbwY5Q+g7mdwjo656FtD ZCmYBJ1Y8paICU20ju90JQgW5qyr X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-1.402900-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183749-bKB7NmHMiTYx X-PPE-DISP: 1603183749;bKB7NmHMiTYx Subject: [dpdk-dev] [PATCH 58/62] common/sfc_efx/base: add an API to compare match specs X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Match specification format and its size are not exposed to clients. Provide an API to compare two match specifications. A client would typically use this API to compare a match specification of an outer rule being validated with match specifications of already active outer rules (to make sure that rule class is supported). Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 6 ++++++ drivers/common/sfc_efx/base/efx_mae.c | 8 ++++++++ drivers/common/sfc_efx/rte_common_sfc_efx_version.map | 1 + 3 files changed, 15 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 901d653262..c6472eaf76 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4204,6 +4204,12 @@ efx_mae_match_spec_mport_set( __in const efx_mport_sel_t *valuep, __in_opt const efx_mport_sel_t *maskp); +LIBEFX_API +extern __checkReturn boolean_t +efx_mae_match_specs_equal( + __in const efx_mae_match_spec_t *left, + __in const efx_mae_match_spec_t *right); + /* * Make sure that match fields known by EFX have proper masks set * in the match specification as per requirements of SF-122526-TC. diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index dfb8b2e743..935cec5e18 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -636,6 +636,14 @@ efx_mae_match_spec_mport_set( return (rc); } + __checkReturn boolean_t +efx_mae_match_specs_equal( + __in const efx_mae_match_spec_t *left, + __in const efx_mae_match_spec_t *right) +{ + return ((memcmp(left, right, sizeof (*left)) == 0) ? B_TRUE : B_FALSE); +} + #define EFX_MASK_BIT_IS_SET(_mask, _mask_page_nbits, _bit) \ ((_mask)[(_bit) / (_mask_page_nbits)] & \ (1ULL << ((_bit) & ((_mask_page_nbits) - 1)))) diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index 37056abd60..07b3b6371b 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -107,6 +107,7 @@ INTERNAL { efx_mae_match_spec_is_valid; efx_mae_match_spec_mport_set; efx_mae_match_specs_class_cmp; + efx_mae_match_specs_equal; efx_mae_mport_by_pcie_function; efx_mae_mport_by_phy_port; From patchwork Tue Oct 20 08:48:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81505 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id DB02BA04DD; Tue, 20 Oct 2020 11:12:09 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A11E8E252; Tue, 20 Oct 2020 10:50:39 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id D7EC0BBC6 for ; Tue, 20 Oct 2020 10:49:10 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.64]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 679B36004F for ; Tue, 20 Oct 2020 08:49:09 +0000 (UTC) Received: from us4-mdac16-1.ut7.mdlocal (unknown [10.7.65.69]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 6742D200A4 for ; Tue, 20 Oct 2020 08:49:09 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.199]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 46A6122004D for ; Tue, 20 Oct 2020 08:49:08 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id F0EFC18005B for ; Tue, 20 Oct 2020 08:49:07 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:51 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:51 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mo3p030930; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id DF5DC1613A9; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:26 +0100 Message-ID: <1603183709-23420-60-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.108200-8.000000-10 X-TMASE-MatchedRID: VmQnTTPLPg/MNfmX7cQoSspdsi/eZA1jaeMaKzvXUpljLp8Cm8vwF7KB pljvKsfOfGzuoVn0Vs6PQi9XuOWoONS7ezKc1Aokx5sgyUhLCNv3+mUqDWUKyF9QIc+ez/4+lSp EXhOCtBS9ScRxnMR7bitS3PG+1A2HWBF4xKGSZdloUArKobkzYlBijjE0XjY+GlfXMQviercMwu JBqQIpuemp9HBDaWugEarACDIZa3lUzR/yBHQjZsewkPVzkoGN8Cg+ULTCPpmbKItl61J/yZ+in TK0bC9eKrauXd3MZDVNXZdfUYkK/9Xsj4rlw2f6IQAAYCZV3NwHz0Cj1aP8G/5dQyNHcjPP/Qve 5Mgu3Xti6cHGNRve5BPszTkhMOsa1nj+CgxsDEvAhs1woh/pKjigZBQJvBjlD6DuZ3COjrnoW0N kKZgEnW3LgNyHejuiQwymtxuJ6y0= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--0.108200-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183748-rzKI_Tth7pfS X-PPE-DISP: 1603183748;rzKI_Tth7pfS Subject: [dpdk-dev] [PATCH 59/62] common/sfc_efx/base: validate and compare outer match specs X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Let the client validate an outer match specification. Let the client comprare classes of two outer match specifications. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx_impl.h | 3 + drivers/common/sfc_efx/base/efx_mae.c | 126 ++++++++++++++++++++++++- 2 files changed, 126 insertions(+), 3 deletions(-) diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h index 6a8b8d65f1..d8423d49fe 100644 --- a/drivers/common/sfc_efx/base/efx_impl.h +++ b/drivers/common/sfc_efx/base/efx_impl.h @@ -800,6 +800,9 @@ typedef struct efx_mae_s { size_t em_action_rule_field_caps_size; uint32_t em_max_n_outer_prios; uint32_t em_encap_types_supported; + /** Outer rule match field capabilities. */ + efx_mae_field_cap_t *em_outer_rule_field_caps; + size_t em_outer_rule_field_caps_size; } 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 935cec5e18..45a796fdad 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -74,6 +74,88 @@ efx_mae_get_capabilities( return (rc); } +static __checkReturn efx_rc_t +efx_mae_get_outer_rule_caps( + __in efx_nic_t *enp, + __in unsigned int field_ncaps, + __out_ecount(field_ncaps) efx_mae_field_cap_t *field_caps) +{ + efx_mcdi_req_t req; + EFX_MCDI_DECLARE_BUF(payload, + MC_CMD_MAE_GET_OR_CAPS_IN_LEN, + MC_CMD_MAE_GET_OR_CAPS_OUT_LENMAX_MCDI2); + unsigned int mcdi_field_ncaps; + unsigned int i; + efx_rc_t rc; + + if (MC_CMD_MAE_GET_OR_CAPS_OUT_LEN(field_ncaps) > + MC_CMD_MAE_GET_OR_CAPS_OUT_LENMAX_MCDI2) { + rc = EINVAL; + goto fail1; + } + + req.emr_cmd = MC_CMD_MAE_GET_OR_CAPS; + req.emr_in_buf = payload; + req.emr_in_length = MC_CMD_MAE_GET_OR_CAPS_IN_LEN; + req.emr_out_buf = payload; + req.emr_out_length = MC_CMD_MAE_GET_OR_CAPS_OUT_LEN(field_ncaps); + + efx_mcdi_execute(enp, &req); + + if (req.emr_rc != 0) { + rc = req.emr_rc; + goto fail2; + } + + mcdi_field_ncaps = MCDI_OUT_DWORD(req, MAE_GET_OR_CAPS_OUT_COUNT); + + if (req.emr_out_length_used < + MC_CMD_MAE_GET_OR_CAPS_OUT_LEN(mcdi_field_ncaps)) { + rc = EMSGSIZE; + goto fail3; + } + + if (mcdi_field_ncaps > field_ncaps) { + rc = EMSGSIZE; + goto fail4; + } + + for (i = 0; i < mcdi_field_ncaps; ++i) { + uint32_t match_flag; + uint32_t mask_flag; + + field_caps[i].emfc_support = MCDI_OUT_INDEXED_DWORD_FIELD(req, + MAE_GET_OR_CAPS_OUT_FIELD_FLAGS, i, + MAE_FIELD_FLAGS_SUPPORT_STATUS); + + match_flag = MCDI_OUT_INDEXED_DWORD_FIELD(req, + MAE_GET_OR_CAPS_OUT_FIELD_FLAGS, i, + MAE_FIELD_FLAGS_MATCH_AFFECTS_CLASS); + + field_caps[i].emfc_match_affects_class = + (match_flag != 0) ? B_TRUE : B_FALSE; + + mask_flag = MCDI_OUT_INDEXED_DWORD_FIELD(req, + MAE_GET_OR_CAPS_OUT_FIELD_FLAGS, i, + MAE_FIELD_FLAGS_MASK_AFFECTS_CLASS); + + field_caps[i].emfc_mask_affects_class = + (mask_flag != 0) ? B_TRUE : B_FALSE; + } + + return (0); + +fail4: + EFSYS_PROBE(fail4); +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + static __checkReturn efx_rc_t efx_mae_get_action_rule_caps( __in efx_nic_t *enp, @@ -161,6 +243,8 @@ efx_mae_init( __in efx_nic_t *enp) { const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp); + efx_mae_field_cap_t *or_fcaps; + size_t or_fcaps_size; efx_mae_field_cap_t *ar_fcaps; size_t ar_fcaps_size; efx_mae_t *maep; @@ -183,11 +267,25 @@ efx_mae_init( if (rc != 0) goto fail3; + or_fcaps_size = maep->em_max_nfields * sizeof (*or_fcaps); + EFSYS_KMEM_ALLOC(enp->en_esip, or_fcaps_size, or_fcaps); + if (or_fcaps == NULL) { + rc = ENOMEM; + goto fail4; + } + + maep->em_outer_rule_field_caps_size = or_fcaps_size; + maep->em_outer_rule_field_caps = or_fcaps; + + rc = efx_mae_get_outer_rule_caps(enp, maep->em_max_nfields, or_fcaps); + if (rc != 0) + goto fail5; + ar_fcaps_size = maep->em_max_nfields * sizeof (*ar_fcaps); EFSYS_KMEM_ALLOC(enp->en_esip, ar_fcaps_size, ar_fcaps); if (ar_fcaps == NULL) { rc = ENOMEM; - goto fail4; + goto fail6; } maep->em_action_rule_field_caps_size = ar_fcaps_size; @@ -195,13 +293,18 @@ efx_mae_init( rc = efx_mae_get_action_rule_caps(enp, maep->em_max_nfields, ar_fcaps); if (rc != 0) - goto fail5; + goto fail7; return (0); -fail5: +fail7: EFSYS_PROBE(fail5); EFSYS_KMEM_FREE(enp->en_esip, ar_fcaps_size, ar_fcaps); +fail6: + EFSYS_PROBE(fail4); +fail5: + EFSYS_PROBE(fail5); + EFSYS_KMEM_FREE(enp->en_esip, or_fcaps_size, or_fcaps); fail4: EFSYS_PROBE(fail4); fail3: @@ -227,6 +330,8 @@ efx_mae_fini( EFSYS_KMEM_FREE(enp->en_esip, maep->em_action_rule_field_caps_size, maep->em_action_rule_field_caps); + EFSYS_KMEM_FREE(enp->en_esip, maep->em_outer_rule_field_caps_size, + maep->em_outer_rule_field_caps); EFSYS_KMEM_FREE(enp->en_esip, sizeof (*maep), maep); enp->en_maep = NULL; } @@ -711,6 +816,13 @@ efx_mae_match_spec_is_valid( const uint8_t *mvp; switch (spec->emms_type) { + case EFX_MAE_RULE_OUTER: + field_caps = maep->em_outer_rule_field_caps; + desc_setp = __efx_mae_outer_rule_mv_desc_set; + desc_set_nentries = + EFX_ARRAY_SIZE(__efx_mae_outer_rule_mv_desc_set); + mvp = spec->emms_mask_value_pairs.outer; + break; case EFX_MAE_RULE_ACTION: field_caps = maep->em_action_rule_field_caps; desc_setp = __efx_mae_action_rule_mv_desc_set; @@ -1190,6 +1302,14 @@ efx_mae_match_specs_class_cmp( efx_rc_t rc; switch (left->emms_type) { + case EFX_MAE_RULE_OUTER: + field_caps = maep->em_outer_rule_field_caps; + desc_setp = __efx_mae_outer_rule_mv_desc_set; + desc_set_nentries = + EFX_ARRAY_SIZE(__efx_mae_outer_rule_mv_desc_set); + mvpl = left->emms_mask_value_pairs.outer; + mvpr = right->emms_mask_value_pairs.outer; + break; case EFX_MAE_RULE_ACTION: field_caps = maep->em_action_rule_field_caps; desc_setp = __efx_mae_action_rule_mv_desc_set; From patchwork Tue Oct 20 08:48:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81496 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6FF5FA04DD; Tue, 20 Oct 2020 11:08:47 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 665F0CA36; Tue, 20 Oct 2020 10:50:25 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id E166BBBB4 for ; Tue, 20 Oct 2020 10:49:08 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id B1F8C6006D for ; Tue, 20 Oct 2020 08:49:08 +0000 (UTC) Received: from us4-mdac16-27.ut7.mdlocal (unknown [10.7.66.59]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id B154A2009A for ; Tue, 20 Oct 2020 08:49:08 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.41]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 055391C0051 for ; Tue, 20 Oct 2020 08:49:08 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id AD1294C005C for ; Tue, 20 Oct 2020 08:49:07 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:51 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:51 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mp0x030933; Tue, 20 Oct 2020 09:48:51 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id ED27D1613AB; Tue, 20 Oct 2020 09:48:50 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:27 +0100 Message-ID: <1603183709-23420-61-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.389900-8.000000-10 X-TMASE-MatchedRID: IaQsIsqmO9Q/REwOA9OGtQ9rVnOZ7Na2aeMaKzvXUpljLp8Cm8vwF12O RX0B8+qTT1fsjZmF+qzm9S/0eIQUb+ox2xGkyLxhPwKTD1v8YV4yieckNRsVx8LR/1CaEfqJR+X 4fj4ypMn/aNNKUC1FYcwhBUgPv4Ps/uudbUpvyZHJ1E/nrJFED3vEgoSBmr8BkY8eITaSJPibfn TDz+a2OX2dcFgFzv71EtRm78gcrDHtzSKzUmDUV8ewkPVzkoGNqb3/o5s+OcO1E+HbdRuHYHd7b ci/LVuNdR9IuTvvB94PtqKIlA3hYsKfN8lhf0yu7+azOEjVWOOiIpNv3rjMdeD3XFrJfgvzIX4K 6awSpd7i8zVgXoAltsIJ+4gwXrEtWBd6ltyXuvs2k0Gbj8GCy2/SjwtHaDeMFV/rwU4HCDgI0eU FZmDyOnKgTZRqNH0y6gumGf9mHG+4RKcahf4Y41IMFAxTLLN5ViQAkXSslhW9Tbikt9AWZ0CBSG S7bIBtA1B/p1SzcogrKiD/U8b7SaNbPJBuvLaLftwZ3X11IV0= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-1.389900-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183748-Ppl1c9n4fEPE X-PPE-DISP: 1603183748;Ppl1c9n4fEPE Subject: [dpdk-dev] [PATCH 60/62] common/sfc_efx/base: support outer rule provisioning X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Let the client insert / remove outer rules. Let the client refer to an inserted outer rule in a match specification of type ACTION. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 21 ++ drivers/common/sfc_efx/base/efx_mae.c | 197 ++++++++++++++++++ .../sfc_efx/rte_common_sfc_efx_version.map | 3 + 3 files changed, 221 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index c6472eaf76..3b40e28b4e 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4137,6 +4137,7 @@ typedef enum efx_mae_field_id_e { EFX_MAE_FIELD_ENC_L4_SPORT_BE, EFX_MAE_FIELD_ENC_L4_DPORT_BE, EFX_MAE_FIELD_ENC_VNET_ID_BE, + EFX_MAE_FIELD_OUTER_RULE_ID, EFX_MAE_FIELD_NIDS } efx_mae_field_id_t; @@ -4298,6 +4299,26 @@ typedef struct efx_mae_rule_id_s { uint32_t id; } efx_mae_rule_id_t; +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_outer_rule_insert( + __in efx_nic_t *enp, + __in const efx_mae_match_spec_t *spec, + __in efx_tunnel_protocol_t encap_type, + __out efx_mae_rule_id_t *or_idp); + +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_outer_rule_remove( + __in efx_nic_t *enp, + __in const efx_mae_rule_id_t *or_idp); + +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_match_spec_outer_rule_id_set( + __in efx_mae_match_spec_t *spec, + __in const efx_mae_rule_id_t *or_idp); + /* Action set ID */ typedef struct efx_mae_aset_id_s { uint32_t id; diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index 45a796fdad..fbf56b14ce 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -446,6 +446,7 @@ typedef enum efx_mae_field_cap_id_e { EFX_MAE_FIELD_ID_ENC_L4_SPORT_BE = MAE_FIELD_ENC_L4_SPORT, EFX_MAE_FIELD_ID_ENC_L4_DPORT_BE = MAE_FIELD_ENC_L4_DPORT, EFX_MAE_FIELD_ID_ENC_VNET_ID_BE = MAE_FIELD_ENC_VNET_ID, + EFX_MAE_FIELD_ID_OUTER_RULE_ID = MAE_FIELD_OUTER_RULE_ID, EFX_MAE_FIELD_CAP_NIDS } efx_mae_field_cap_id_t; @@ -506,6 +507,7 @@ static const efx_mae_mv_desc_t __efx_mae_action_rule_mv_desc_set[] = { EFX_MAE_MV_DESC(L4_DPORT_BE, EFX_MAE_FIELD_BE), EFX_MAE_MV_DESC(TCP_FLAGS_BE, EFX_MAE_FIELD_BE), EFX_MAE_MV_DESC(ENC_VNET_ID_BE, EFX_MAE_FIELD_BE), + EFX_MAE_MV_DESC(OUTER_RULE_ID, EFX_MAE_FIELD_LE), #undef EFX_MAE_MV_DESC }; @@ -1380,6 +1382,201 @@ efx_mae_match_specs_class_cmp( return (0); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + + __checkReturn efx_rc_t +efx_mae_outer_rule_insert( + __in efx_nic_t *enp, + __in const efx_mae_match_spec_t *spec, + __in efx_tunnel_protocol_t encap_type, + __out efx_mae_rule_id_t *or_idp) +{ + const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp); + efx_mcdi_req_t req; + EFX_MCDI_DECLARE_BUF(payload, + MC_CMD_MAE_OUTER_RULE_INSERT_IN_LENMAX_MCDI2, + MC_CMD_MAE_OUTER_RULE_INSERT_OUT_LEN); + uint32_t encap_type_mcdi; + efx_mae_rule_id_t or_id; + size_t offset; + efx_rc_t rc; + + EFX_STATIC_ASSERT(sizeof (or_idp->id) == + MC_CMD_MAE_OUTER_RULE_INSERT_OUT_OR_ID_LEN); + + EFX_STATIC_ASSERT(EFX_MAE_RSRC_ID_INVALID == + MC_CMD_MAE_OUTER_RULE_INSERT_OUT_OUTER_RULE_ID_NULL); + + if (encp->enc_mae_supported == B_FALSE) { + rc = ENOTSUP; + goto fail1; + } + + if (spec->emms_type != EFX_MAE_RULE_OUTER) { + rc = EINVAL; + goto fail2; + } + + switch (encap_type) { + case EFX_TUNNEL_PROTOCOL_NONE: + encap_type_mcdi = MAE_MCDI_ENCAP_TYPE_NONE; + break; + case EFX_TUNNEL_PROTOCOL_VXLAN: + encap_type_mcdi = MAE_MCDI_ENCAP_TYPE_VXLAN; + break; + case EFX_TUNNEL_PROTOCOL_GENEVE: + encap_type_mcdi = MAE_MCDI_ENCAP_TYPE_GENEVE; + break; + case EFX_TUNNEL_PROTOCOL_NVGRE: + encap_type_mcdi = MAE_MCDI_ENCAP_TYPE_NVGRE; + break; + default: + rc = ENOTSUP; + goto fail3; + } + + req.emr_cmd = MC_CMD_MAE_OUTER_RULE_INSERT; + req.emr_in_buf = payload; + req.emr_in_length = MC_CMD_MAE_OUTER_RULE_INSERT_IN_LENMAX_MCDI2; + req.emr_out_buf = payload; + req.emr_out_length = MC_CMD_MAE_OUTER_RULE_INSERT_OUT_LEN; + + MCDI_IN_SET_DWORD(req, + MAE_OUTER_RULE_INSERT_IN_ENCAP_TYPE, encap_type_mcdi); + + MCDI_IN_SET_DWORD(req, MAE_OUTER_RULE_INSERT_IN_PRIO, spec->emms_prio); + + /* + * Mask-value pairs have been stored in the byte order needed for the + * MCDI request and are thus safe to be copied directly to the buffer. + * The library cares about byte order in efx_mae_match_spec_field_set(). + */ + EFX_STATIC_ASSERT(sizeof (spec->emms_mask_value_pairs.outer) >= + MAE_ENC_FIELD_PAIRS_LEN); + offset = MC_CMD_MAE_OUTER_RULE_INSERT_IN_FIELD_MATCH_CRITERIA_OFST; + memcpy(payload + offset, spec->emms_mask_value_pairs.outer, + MAE_ENC_FIELD_PAIRS_LEN); + + efx_mcdi_execute(enp, &req); + + if (req.emr_rc != 0) { + rc = req.emr_rc; + goto fail4; + } + + if (req.emr_out_length_used < MC_CMD_MAE_OUTER_RULE_INSERT_OUT_LEN) { + rc = EMSGSIZE; + goto fail5; + } + + or_id.id = MCDI_OUT_DWORD(req, MAE_OUTER_RULE_INSERT_OUT_OR_ID); + if (or_id.id == EFX_MAE_RSRC_ID_INVALID) { + rc = ENOENT; + goto fail6; + } + + or_idp->id = or_id.id; + + return (0); + +fail6: + EFSYS_PROBE(fail6); +fail5: + EFSYS_PROBE(fail5); +fail4: + EFSYS_PROBE(fail4); +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + + __checkReturn efx_rc_t +efx_mae_outer_rule_remove( + __in efx_nic_t *enp, + __in const efx_mae_rule_id_t *or_idp) +{ + const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp); + efx_mcdi_req_t req; + EFX_MCDI_DECLARE_BUF(payload, + MC_CMD_MAE_OUTER_RULE_REMOVE_IN_LEN(1), + MC_CMD_MAE_OUTER_RULE_REMOVE_OUT_LEN(1)); + efx_rc_t rc; + + if (encp->enc_mae_supported == B_FALSE) { + rc = ENOTSUP; + goto fail1; + } + + req.emr_cmd = MC_CMD_MAE_OUTER_RULE_REMOVE; + req.emr_in_buf = payload; + req.emr_in_length = MC_CMD_MAE_OUTER_RULE_REMOVE_IN_LEN(1); + req.emr_out_buf = payload; + req.emr_out_length = MC_CMD_MAE_OUTER_RULE_REMOVE_OUT_LEN(1); + + MCDI_IN_SET_DWORD(req, MAE_OUTER_RULE_REMOVE_IN_OR_ID, or_idp->id); + + efx_mcdi_execute(enp, &req); + + if (req.emr_rc != 0) { + rc = req.emr_rc; + goto fail2; + } + + if (MCDI_OUT_DWORD(req, MAE_OUTER_RULE_REMOVE_OUT_REMOVED_OR_ID) != + or_idp->id) { + /* Firmware failed to remove the outer rule. */ + rc = EAGAIN; + goto fail3; + } + + return (0); + +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + + __checkReturn efx_rc_t +efx_mae_match_spec_outer_rule_id_set( + __in efx_mae_match_spec_t *spec, + __in const efx_mae_rule_id_t *or_idp) +{ + uint32_t full_mask = UINT32_MAX; + efx_rc_t rc; + + if (spec->emms_type != EFX_MAE_RULE_ACTION) { + rc = EINVAL; + goto fail1; + } + + if (or_idp == NULL) { + rc = EINVAL; + goto fail2; + } + + rc = efx_mae_match_spec_field_set(spec, EFX_MAE_FIELD_OUTER_RULE_ID, + sizeof (or_idp->id), (const uint8_t *)&or_idp->id, + sizeof (full_mask), (const uint8_t *)&full_mask); + if (rc != 0) + goto fail3; + + return (0); + +fail3: + EFSYS_PROBE(fail3); fail2: EFSYS_PROBE(fail2); fail1: diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index 07b3b6371b..403feeaf11 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -106,10 +106,13 @@ INTERNAL { efx_mae_match_spec_init; efx_mae_match_spec_is_valid; efx_mae_match_spec_mport_set; + efx_mae_match_spec_outer_rule_id_set; efx_mae_match_specs_class_cmp; efx_mae_match_specs_equal; efx_mae_mport_by_pcie_function; efx_mae_mport_by_phy_port; + efx_mae_outer_rule_insert; + efx_mae_outer_rule_remove; efx_mcdi_fini; efx_mcdi_get_proxy_handle; From patchwork Tue Oct 20 08:48:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81502 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id C4E96A04DD; Tue, 20 Oct 2020 11:10:44 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 96257CFC3; Tue, 20 Oct 2020 10:50:33 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id C479EBBB0 for ; Tue, 20 Oct 2020 10:49:09 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 954B360086 for ; Tue, 20 Oct 2020 08:49:09 +0000 (UTC) Received: from us4-mdac16-33.ut7.mdlocal (unknown [10.7.66.150]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 9463E2009A for ; Tue, 20 Oct 2020 08:49:09 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.41]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id C8AD41C004F for ; Tue, 20 Oct 2020 08:49:08 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 7B5034C0059 for ; Tue, 20 Oct 2020 08:49:08 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:51 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:51 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mpl7030936; Tue, 20 Oct 2020 09:48:51 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 0675D1613A9; Tue, 20 Oct 2020 09:48:51 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:28 +0100 Message-ID: <1603183709-23420-62-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-5.362100-8.000000-10 X-TMASE-MatchedRID: vTggjsizJkofKML5AJtfLabtlVLKF4zpPf2+tfEqWx35+tteD5RzhTh5 8Z2KtlKJ2XHJ0L4jOIRTvVffeIwvQ60iin8P0KjVPwKTD1v8YV5MkOX0UoduuT8fBHJpFUzVz/P voDcs3aMbwAKQ5596XheSbO49IQfeOjl3g2p4XXD8OMEMU7OyZkqWjqojF9OAijbNm22YqDAlld Kl4MzoStqimtCn2njeuzqF6W+9RbGqPTUWVYFp2omR/mpCAiHduoYFb0nRiqMed11F9IsKFEjYb j4tH6TbQFK84IGWquFSu6EJNCYJIZ+/ZwhOYKA2yq0aou1D6WyByxVkfd04JEoPLn6eZ90+hqJx i9IzezLqUQWJH+LYza/qPN+tRPX/OR1mtZMXNzEgCPGiZqtI8PG6GRFYrbYY0qkUgB4fU1CtabK rs9q4eYpbZLyoDNErGuxIIkd/lYAMoqefAvhjqD5g6d8RSIIzY9JlLwL1dg1psnGGIgWMmSbt0H HPBJBzD0yfeIi020rLcI1y0IYdPtOxwlDCh8axJhpz1Tt0Ip+++wkLapaddxLf1vz7ecPHyVdGR U34S3zzJ2qAgIv3n9HklL8l1yisYeOFZSwS7nRhXXywTJLpfE8S+VNhFmpbvStYzicikmv3h2jy bQkTkrSXsdWR9OqDQOdq1Wge/qp/3lhQ3Uk1Gehsg0dmQfnGpYXNuN0M8fXlS6H7BUL+sY9noFg PEO4N+2Epkgc6z1IeEY36dmSJyDL7uOIf7WD3oxjrap5AGQvlPUem/J5c5MFKi4VGOHQCXO3nZW AVBzuPm8W3uITXYIAy6p60ZV62fJ5/bZ6npdiyO81X3yak82Ik96R7xpRNl5A+II0fS2z9iTTWI EzrBQQvBXbC0lbou2E3zrtBXASUZ+PsGziOXBH8OnZHwTlg7ITbZbuQXsUeBiRI0I05ig== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-5.362100-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183749-Ycpa9d5XOq4z X-PPE-DISP: 1603183749;Ycpa9d5XOq4z Subject: [dpdk-dev] [PATCH 61/62] net/sfc: support encap. flow items in transfer rules X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Add support for flow items VXLAN, Geneve and NVGRE to MAE-specific RTE flow implementation. Having support for these items implies the ability to insert so-called outer MAE rules and refer to them in MAE action rules. The patch takes care of all necessary facilities to do that. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- doc/guides/nics/sfc_efx.rst | 6 + drivers/net/sfc/sfc_flow.c | 18 +- drivers/net/sfc/sfc_flow.h | 2 + drivers/net/sfc/sfc_mae.c | 603 ++++++++++++++++++++++++++++++++++-- drivers/net/sfc/sfc_mae.h | 34 ++ 5 files changed, 630 insertions(+), 33 deletions(-) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index e8f8fa987b..461120448c 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -212,6 +212,12 @@ Supported pattern items (***transfer*** rules): - UDP (source/destination ports) +- VXLAN (exact match of VXLAN network identifier) + +- GENEVE (exact match of virtual network identifier) + +- NVGRE (exact match of virtual subnet ID) + Supported actions (***transfer*** rules): - OF_POP_VLAN diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c index 6ccefef477..4321045d1a 100644 --- a/drivers/net/sfc/sfc_flow.c +++ b/drivers/net/sfc/sfc_flow.c @@ -1288,7 +1288,8 @@ sfc_flow_parse_pattern(const struct sfc_flow_item *flow_items, break; default: - if (is_ifrm) { + if (parse_ctx->type == SFC_FLOW_PARSE_CTX_FILTER && + is_ifrm) { rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, pattern, @@ -2565,13 +2566,8 @@ sfc_flow_verify(struct sfc_adapter *sa, struct rte_flow *flow, } if (ops->verify != NULL) { - /* - * Use locking since verify method may need to - * access the list of already created rules. - */ - sfc_adapter_lock(sa); + SFC_ASSERT(sfc_adapter_is_locked(sa)); rc = ops->verify(sa, flow); - sfc_adapter_unlock(sa); } if (rc != 0) { @@ -2599,12 +2595,16 @@ sfc_flow_validate(struct rte_eth_dev *dev, if (flow == NULL) return -rte_errno; + sfc_adapter_lock(sa); + rc = sfc_flow_parse(dev, attr, pattern, actions, flow, error); if (rc == 0) rc = sfc_flow_verify(sa, flow, error); sfc_flow_free(sa, flow); + sfc_adapter_unlock(sa); + return rc; } @@ -2623,12 +2623,12 @@ sfc_flow_create(struct rte_eth_dev *dev, if (flow == NULL) goto fail_no_mem; + sfc_adapter_lock(sa); + rc = sfc_flow_parse(dev, attr, pattern, actions, flow, error); if (rc != 0) goto fail_bad_value; - sfc_adapter_lock(sa); - TAILQ_INSERT_TAIL(&sa->flow_list, flow, entries); if (sa->state == SFC_ADAPTER_STARTED) { diff --git a/drivers/net/sfc/sfc_flow.h b/drivers/net/sfc/sfc_flow.h index e991ae132c..09105953ff 100644 --- a/drivers/net/sfc/sfc_flow.h +++ b/drivers/net/sfc/sfc_flow.h @@ -67,6 +67,8 @@ struct sfc_flow_spec_filter { struct sfc_flow_spec_mae { /* Desired priority level */ unsigned int priority; + /* Outer rule registry entry */ + struct sfc_mae_outer_rule *outer_rule; /* EFX match specification */ efx_mae_match_spec_t *match_spec; /* Action set registry entry */ diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 3dd233c6dc..c78a376a88 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -81,7 +81,10 @@ sfc_mae_attach(struct sfc_adapter *sa) goto fail_mae_assign_switch_port; mae->status = SFC_MAE_STATUS_SUPPORTED; + mae->nb_outer_rule_prios_max = limits.eml_max_n_outer_prios; mae->nb_action_rule_prios_max = limits.eml_max_n_action_prios; + mae->encap_types_supported = limits.eml_encap_types_supported; + TAILQ_INIT(&mae->outer_rules); TAILQ_INIT(&mae->action_sets); sfc_log_init(sa, "done"); @@ -119,6 +122,138 @@ sfc_mae_detach(struct sfc_adapter *sa) sfc_log_init(sa, "done"); } +static struct sfc_mae_outer_rule * +sfc_mae_outer_rule_attach(struct sfc_adapter *sa, + const efx_mae_match_spec_t *match_spec, + efx_tunnel_protocol_t encap_type) +{ + struct sfc_mae_outer_rule *rule; + struct sfc_mae *mae = &sa->mae; + + SFC_ASSERT(sfc_adapter_is_locked(sa)); + + TAILQ_FOREACH(rule, &mae->outer_rules, entries) { + if (efx_mae_match_specs_equal(rule->match_spec, match_spec) && + rule->encap_type == encap_type) { + ++(rule->refcnt); + return rule; + } + } + + return NULL; +} + +static int +sfc_mae_outer_rule_add(struct sfc_adapter *sa, + efx_mae_match_spec_t *match_spec, + efx_tunnel_protocol_t encap_type, + struct sfc_mae_outer_rule **rulep) +{ + struct sfc_mae_outer_rule *rule; + struct sfc_mae *mae = &sa->mae; + + SFC_ASSERT(sfc_adapter_is_locked(sa)); + + rule = rte_zmalloc("sfc_mae_outer_rule", sizeof(*rule), 0); + if (rule == NULL) + return ENOMEM; + + rule->refcnt = 1; + rule->match_spec = match_spec; + rule->encap_type = encap_type; + + rule->fw_rsrc.rule_id.id = EFX_MAE_RSRC_ID_INVALID; + + TAILQ_INSERT_TAIL(&mae->outer_rules, rule, entries); + + *rulep = rule; + + return 0; +} + +static void +sfc_mae_outer_rule_del(struct sfc_adapter *sa, + struct sfc_mae_outer_rule *rule) +{ + struct sfc_mae *mae = &sa->mae; + + SFC_ASSERT(sfc_adapter_is_locked(sa)); + SFC_ASSERT(rule->refcnt != 0); + + --(rule->refcnt); + + if (rule->refcnt != 0) + return; + + SFC_ASSERT(rule->fw_rsrc.rule_id.id == EFX_MAE_RSRC_ID_INVALID); + SFC_ASSERT(rule->fw_rsrc.refcnt == 0); + + efx_mae_match_spec_fini(sa->nic, rule->match_spec); + + TAILQ_REMOVE(&mae->outer_rules, rule, entries); + rte_free(rule); +} + +static int +sfc_mae_outer_rule_enable(struct sfc_adapter *sa, + struct sfc_mae_outer_rule *rule, + efx_mae_match_spec_t *match_spec_action) +{ + struct sfc_mae_fw_rsrc *fw_rsrc = &rule->fw_rsrc; + int rc; + + SFC_ASSERT(sfc_adapter_is_locked(sa)); + + if (fw_rsrc->refcnt == 0) { + SFC_ASSERT(fw_rsrc->rule_id.id == EFX_MAE_RSRC_ID_INVALID); + SFC_ASSERT(rule->match_spec != NULL); + + rc = efx_mae_outer_rule_insert(sa->nic, rule->match_spec, + rule->encap_type, + &fw_rsrc->rule_id); + if (rc != 0) + return rc; + } + + rc = efx_mae_match_spec_outer_rule_id_set(match_spec_action, + &fw_rsrc->rule_id); + if (rc != 0) { + if (fw_rsrc->refcnt == 0) { + (void)efx_mae_outer_rule_remove(sa->nic, + &fw_rsrc->rule_id); + } + return rc; + } + + ++(fw_rsrc->refcnt); + + return 0; +} + +static int +sfc_mae_outer_rule_disable(struct sfc_adapter *sa, + struct sfc_mae_outer_rule *rule) +{ + struct sfc_mae_fw_rsrc *fw_rsrc = &rule->fw_rsrc; + int rc; + + SFC_ASSERT(sfc_adapter_is_locked(sa)); + SFC_ASSERT(fw_rsrc->rule_id.id != EFX_MAE_RSRC_ID_INVALID); + SFC_ASSERT(fw_rsrc->refcnt != 0); + + if (fw_rsrc->refcnt == 1) { + rc = efx_mae_outer_rule_remove(sa->nic, &fw_rsrc->rule_id); + if (rc != 0) + return rc; + + fw_rsrc->rule_id.id = EFX_MAE_RSRC_ID_INVALID; + } + + --(fw_rsrc->refcnt); + + return 0; +} + static struct sfc_mae_action_set * sfc_mae_action_set_attach(struct sfc_adapter *sa, const efx_mae_actions_t *spec) @@ -253,6 +388,9 @@ sfc_mae_flow_cleanup(struct sfc_adapter *sa, SFC_ASSERT(spec_mae->rule_id.id == EFX_MAE_RSRC_ID_INVALID); + if (spec_mae->outer_rule != NULL) + sfc_mae_outer_rule_del(sa, spec_mae->outer_rule); + if (spec_mae->action_set != NULL) sfc_mae_action_set_del(sa, spec_mae->action_set); @@ -263,8 +401,8 @@ sfc_mae_flow_cleanup(struct sfc_adapter *sa, static int sfc_mae_set_ethertypes(struct sfc_mae_parse_ctx *ctx) { - efx_mae_match_spec_t *efx_spec = ctx->match_spec_action; struct sfc_mae_pattern_data *pdata = &ctx->pattern_data; + const efx_mae_field_id_t *fremap = ctx->field_ids_remap; const efx_mae_field_id_t field_ids[] = { EFX_MAE_FIELD_VLAN0_PROTO_BE, EFX_MAE_FIELD_VLAN1_PROTO_BE, @@ -279,7 +417,8 @@ sfc_mae_set_ethertypes(struct sfc_mae_parse_ctx *ctx) * no L3 item, it's 0x0000/0x0000. */ et = &pdata->ethertypes[pdata->nb_vlan_tags]; - rc = efx_mae_match_spec_field_set(efx_spec, EFX_MAE_FIELD_ETHER_TYPE_BE, + rc = efx_mae_match_spec_field_set(ctx->match_spec, + fremap[EFX_MAE_FIELD_ETHER_TYPE_BE], sizeof(et->value), (const uint8_t *)&et->value, sizeof(et->mask), @@ -296,7 +435,8 @@ sfc_mae_set_ethertypes(struct sfc_mae_parse_ctx *ctx) for (i = 0; i < pdata->nb_vlan_tags; ++i) { et = &pdata->ethertypes[i]; - rc = efx_mae_match_spec_field_set(efx_spec, field_ids[i], + rc = efx_mae_match_spec_field_set(ctx->match_spec, + fremap[field_ids[i]], sizeof(et->value), (const uint8_t *)&et->value, sizeof(et->mask), @@ -312,7 +452,7 @@ static int sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx, struct rte_flow_error *error) { - efx_mae_match_spec_t *efx_spec = ctx->match_spec_action; + const efx_mae_field_id_t *fremap = ctx->field_ids_remap; struct sfc_mae_pattern_data *pdata = &ctx->pattern_data; struct sfc_mae_ethertype *ethertypes = pdata->ethertypes; const rte_be16_t supported_tpids[] = { @@ -411,7 +551,8 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx, valuep = (const uint8_t *)&pdata->l3_next_proto_value; maskp = (const uint8_t *)&pdata->l3_next_proto_mask; - rc = efx_mae_match_spec_field_set(efx_spec, EFX_MAE_FIELD_IP_PROTO, + rc = efx_mae_match_spec_field_set(ctx->match_spec, + fremap[EFX_MAE_FIELD_IP_PROTO], sizeof(pdata->l3_next_proto_value), valuep, sizeof(pdata->l3_next_proto_mask), @@ -478,7 +619,7 @@ sfc_mae_rule_parse_item_port_id(const struct rte_flow_item *item, "Can't find RTE ethdev by the port ID"); } - rc = efx_mae_match_spec_mport_set(ctx_mae->match_spec_action, + rc = efx_mae_match_spec_mport_set(ctx_mae->match_spec, &mport_sel, NULL); if (rc != 0) { return rte_flow_error_set(error, rc, @@ -536,8 +677,7 @@ sfc_mae_rule_parse_item_phy_port(const struct rte_flow_item *item, "Failed to convert the PHY_PORT index"); } - rc = efx_mae_match_spec_mport_set(ctx_mae->match_spec_action, - &mport_v, NULL); + rc = efx_mae_match_spec_mport_set(ctx_mae->match_spec, &mport_v, NULL); if (rc != 0) { return rte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_ITEM, item, @@ -573,8 +713,7 @@ sfc_mae_rule_parse_item_pf(const struct rte_flow_item *item, "Failed to convert the PF ID"); } - rc = efx_mae_match_spec_mport_set(ctx_mae->match_spec_action, - &mport_v, NULL); + rc = efx_mae_match_spec_mport_set(ctx_mae->match_spec, &mport_v, NULL); if (rc != 0) { return rte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_ITEM, item, @@ -639,8 +778,7 @@ sfc_mae_rule_parse_item_vf(const struct rte_flow_item *item, "Failed to convert the PF + VF IDs"); } - rc = efx_mae_match_spec_mport_set(ctx_mae->match_spec_action, - &mport_v, NULL); + rc = efx_mae_match_spec_mport_set(ctx_mae->match_spec, &mport_v, NULL); if (rc != 0) { return rte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_ITEM, item, @@ -689,9 +827,10 @@ sfc_mae_item_build_supp_mask(const struct sfc_mae_field_locator *field_locators, static int sfc_mae_parse_item(const struct sfc_mae_field_locator *field_locators, unsigned int nb_field_locators, const uint8_t *spec, - const uint8_t *mask, efx_mae_match_spec_t *efx_spec, + const uint8_t *mask, struct sfc_mae_parse_ctx *ctx, struct rte_flow_error *error) { + const efx_mae_field_id_t *fremap = ctx->field_ids_remap; unsigned int i; int rc = 0; @@ -701,7 +840,8 @@ sfc_mae_parse_item(const struct sfc_mae_field_locator *field_locators, if (fl->field_id == SFC_MAE_FIELD_HANDLING_DEFERRED) continue; - rc = efx_mae_match_spec_field_set(efx_spec, fl->field_id, + rc = efx_mae_match_spec_field_set(ctx->match_spec, + fremap[fl->field_id], fl->size, spec + fl->ofst, fl->size, mask + fl->ofst); if (rc != 0) @@ -782,7 +922,7 @@ sfc_mae_rule_parse_item_eth(const struct rte_flow_item *item, } return sfc_mae_parse_item(flocs_eth, RTE_DIM(flocs_eth), spec, mask, - ctx_mae->match_spec_action, error); + ctx_mae, error); } static const struct sfc_mae_field_locator flocs_vlan[] = { @@ -878,8 +1018,7 @@ sfc_mae_rule_parse_item_vlan(const struct rte_flow_item *item, return 0; } - return sfc_mae_parse_item(flocs, nb_flocs, spec, mask, - ctx_mae->match_spec_action, error); + return sfc_mae_parse_item(flocs, nb_flocs, spec, mask, ctx_mae, error); } static const struct sfc_mae_field_locator flocs_ipv4[] = { @@ -956,7 +1095,7 @@ sfc_mae_rule_parse_item_ipv4(const struct rte_flow_item *item, } return sfc_mae_parse_item(flocs_ipv4, RTE_DIM(flocs_ipv4), spec, mask, - ctx_mae->match_spec_action, error); + ctx_mae, error); } static const struct sfc_mae_field_locator flocs_ipv6[] = { @@ -993,6 +1132,7 @@ sfc_mae_rule_parse_item_ipv6(const struct rte_flow_item *item, { rte_be16_t ethertype_ipv6_be = RTE_BE16(RTE_ETHER_TYPE_IPV6); struct sfc_mae_parse_ctx *ctx_mae = ctx->mae; + const efx_mae_field_id_t *fremap = ctx_mae->field_ids_remap; struct sfc_mae_pattern_data *pdata = &ctx_mae->pattern_data; struct rte_flow_item_ipv6 supp_mask; const uint8_t *spec = NULL; @@ -1034,7 +1174,7 @@ sfc_mae_rule_parse_item_ipv6(const struct rte_flow_item *item, } rc = sfc_mae_parse_item(flocs_ipv6, RTE_DIM(flocs_ipv6), spec, mask, - ctx_mae->match_spec_action, error); + ctx_mae, error); if (rc != 0) return rc; @@ -1046,8 +1186,8 @@ sfc_mae_rule_parse_item_ipv6(const struct rte_flow_item *item, vtc_flow = rte_be_to_cpu_32(vtc_flow_be); tc_mask = (vtc_flow & RTE_IPV6_HDR_TC_MASK) >> RTE_IPV6_HDR_TC_SHIFT; - rc = efx_mae_match_spec_field_set(ctx_mae->match_spec_action, - EFX_MAE_FIELD_IP_TOS, + rc = efx_mae_match_spec_field_set(ctx_mae->match_spec, + fremap[EFX_MAE_FIELD_IP_TOS], sizeof(tc_value), &tc_value, sizeof(tc_mask), &tc_mask); if (rc != 0) { @@ -1094,6 +1234,16 @@ sfc_mae_rule_parse_item_tcp(const struct rte_flow_item *item, const uint8_t *mask = NULL; int rc; + /* + * When encountered among outermost items, item TCP is invalid. + * Check which match specification is being constructed now. + */ + if (ctx_mae->match_spec != ctx_mae->match_spec_action) { + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "TCP in outer frame is invalid"); + } + sfc_mae_item_build_supp_mask(flocs_tcp, RTE_DIM(flocs_tcp), &supp_mask, sizeof(supp_mask)); @@ -1112,7 +1262,7 @@ sfc_mae_rule_parse_item_tcp(const struct rte_flow_item *item, return 0; return sfc_mae_parse_item(flocs_tcp, RTE_DIM(flocs_tcp), spec, mask, - ctx_mae->match_spec_action, error); + ctx_mae, error); } static const struct sfc_mae_field_locator flocs_udp[] = { @@ -1158,7 +1308,157 @@ sfc_mae_rule_parse_item_udp(const struct rte_flow_item *item, return 0; return sfc_mae_parse_item(flocs_udp, RTE_DIM(flocs_udp), spec, mask, - ctx_mae->match_spec_action, error); + ctx_mae, error); +} + +static const struct sfc_mae_field_locator flocs_tunnel[] = { + { + /* + * The size and offset values are relevant + * for Geneve and NVGRE, too. + */ + .size = RTE_SIZEOF_FIELD(struct rte_flow_item_vxlan, vni), + .ofst = offsetof(struct rte_flow_item_vxlan, vni), + }, +}; + +/* + * An auxiliary registry which allows using non-encap. field IDs + * directly when building a match specification of type ACTION. + * + * See sfc_mae_rule_parse_pattern() and sfc_mae_rule_parse_item_tunnel(). + */ +static const efx_mae_field_id_t field_ids_no_remap[] = { +#define FIELD_ID_NO_REMAP(_field) \ + [EFX_MAE_FIELD_##_field] = EFX_MAE_FIELD_##_field + + FIELD_ID_NO_REMAP(ETHER_TYPE_BE), + FIELD_ID_NO_REMAP(ETH_SADDR_BE), + FIELD_ID_NO_REMAP(ETH_DADDR_BE), + FIELD_ID_NO_REMAP(VLAN0_TCI_BE), + FIELD_ID_NO_REMAP(VLAN0_PROTO_BE), + FIELD_ID_NO_REMAP(VLAN1_TCI_BE), + FIELD_ID_NO_REMAP(VLAN1_PROTO_BE), + FIELD_ID_NO_REMAP(SRC_IP4_BE), + FIELD_ID_NO_REMAP(DST_IP4_BE), + FIELD_ID_NO_REMAP(IP_PROTO), + FIELD_ID_NO_REMAP(IP_TOS), + FIELD_ID_NO_REMAP(IP_TTL), + FIELD_ID_NO_REMAP(SRC_IP6_BE), + FIELD_ID_NO_REMAP(DST_IP6_BE), + FIELD_ID_NO_REMAP(L4_SPORT_BE), + FIELD_ID_NO_REMAP(L4_DPORT_BE), + FIELD_ID_NO_REMAP(TCP_FLAGS_BE), + +#undef FIELD_ID_NO_REMAP +}; + +/* + * An auxiliary registry which allows using "ENC" field IDs + * when building a match specification of type OUTER. + * + * See sfc_mae_rule_encap_parse_init(). + */ +static const efx_mae_field_id_t field_ids_remap_to_encap[] = { +#define FIELD_ID_REMAP_TO_ENCAP(_field) \ + [EFX_MAE_FIELD_##_field] = EFX_MAE_FIELD_ENC_##_field + + FIELD_ID_REMAP_TO_ENCAP(ETHER_TYPE_BE), + FIELD_ID_REMAP_TO_ENCAP(ETH_SADDR_BE), + FIELD_ID_REMAP_TO_ENCAP(ETH_DADDR_BE), + FIELD_ID_REMAP_TO_ENCAP(VLAN0_TCI_BE), + FIELD_ID_REMAP_TO_ENCAP(VLAN0_PROTO_BE), + FIELD_ID_REMAP_TO_ENCAP(VLAN1_TCI_BE), + FIELD_ID_REMAP_TO_ENCAP(VLAN1_PROTO_BE), + FIELD_ID_REMAP_TO_ENCAP(SRC_IP4_BE), + FIELD_ID_REMAP_TO_ENCAP(DST_IP4_BE), + FIELD_ID_REMAP_TO_ENCAP(IP_PROTO), + FIELD_ID_REMAP_TO_ENCAP(IP_TOS), + FIELD_ID_REMAP_TO_ENCAP(IP_TTL), + FIELD_ID_REMAP_TO_ENCAP(SRC_IP6_BE), + FIELD_ID_REMAP_TO_ENCAP(DST_IP6_BE), + FIELD_ID_REMAP_TO_ENCAP(L4_SPORT_BE), + FIELD_ID_REMAP_TO_ENCAP(L4_DPORT_BE), + +#undef FIELD_ID_REMAP_TO_ENCAP +}; + +static int +sfc_mae_rule_parse_item_tunnel(const struct rte_flow_item *item, + struct sfc_flow_parse_ctx *ctx, + struct rte_flow_error *error) +{ + struct sfc_mae_parse_ctx *ctx_mae = ctx->mae; + uint8_t vnet_id_v[sizeof(uint32_t)] = {0}; + uint8_t vnet_id_m[sizeof(uint32_t)] = {0}; + const struct rte_flow_item_vxlan *vxp; + uint8_t supp_mask[sizeof(uint64_t)]; + const uint8_t *spec = NULL; + const uint8_t *mask = NULL; + const void *def_mask; + int rc; + + /* + * We're about to start processing inner frame items. + * Process pattern data that has been deferred so far + * and reset pattern data storage. + */ + rc = sfc_mae_rule_process_pattern_data(ctx_mae, error); + if (rc != 0) + return rc; + + memset(&ctx_mae->pattern_data, 0, sizeof(ctx_mae->pattern_data)); + + sfc_mae_item_build_supp_mask(flocs_tunnel, RTE_DIM(flocs_tunnel), + &supp_mask, sizeof(supp_mask)); + + /* + * This tunnel item was preliminarily detected by + * sfc_mae_rule_encap_parse_init(). Default mask + * was also picked by that helper. Use it here. + */ + def_mask = ctx_mae->tunnel_def_mask; + + rc = sfc_flow_parse_init(item, + (const void **)&spec, (const void **)&mask, + (const void *)&supp_mask, def_mask, + sizeof(def_mask), error); + if (rc != 0) + return rc; + + /* + * This item and later ones comprise a + * match specification of type ACTION. + */ + ctx_mae->match_spec = ctx_mae->match_spec_action; + + /* This item and later ones use non-encap. EFX MAE field IDs. */ + ctx_mae->field_ids_remap = field_ids_no_remap; + + if (spec == NULL) + return 0; + + /* + * Field EFX_MAE_FIELD_ENC_VNET_ID_BE is a 32-bit one. + * Copy 24-bit VNI, which is BE, at offset 1 in it. + * The extra byte is 0 both in the mask and in the value. + */ + vxp = (const struct rte_flow_item_vxlan *)spec; + memcpy(vnet_id_v + 1, &vxp->vni, sizeof(vxp->vni)); + + vxp = (const struct rte_flow_item_vxlan *)mask; + memcpy(vnet_id_m + 1, &vxp->vni, sizeof(vxp->vni)); + + rc = efx_mae_match_spec_field_set(ctx_mae->match_spec, + EFX_MAE_FIELD_ENC_VNET_ID_BE, + sizeof(vnet_id_v), vnet_id_v, + sizeof(vnet_id_m), vnet_id_m); + if (rc != 0) { + rc = rte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_ITEM, + item, "Failed to set VXLAN VNI"); + } + + return rc; } static const struct sfc_flow_item sfc_flow_items[] = { @@ -1248,8 +1548,178 @@ static const struct sfc_flow_item sfc_flow_items[] = { .ctx_type = SFC_FLOW_PARSE_CTX_MAE, .parse = sfc_mae_rule_parse_item_udp, }, + { + .type = RTE_FLOW_ITEM_TYPE_VXLAN, + .prev_layer = SFC_FLOW_ITEM_L4, + .layer = SFC_FLOW_ITEM_START_LAYER, + .ctx_type = SFC_FLOW_PARSE_CTX_MAE, + .parse = sfc_mae_rule_parse_item_tunnel, + }, + { + .type = RTE_FLOW_ITEM_TYPE_GENEVE, + .prev_layer = SFC_FLOW_ITEM_L4, + .layer = SFC_FLOW_ITEM_START_LAYER, + .ctx_type = SFC_FLOW_PARSE_CTX_MAE, + .parse = sfc_mae_rule_parse_item_tunnel, + }, + { + .type = RTE_FLOW_ITEM_TYPE_NVGRE, + .prev_layer = SFC_FLOW_ITEM_L3, + .layer = SFC_FLOW_ITEM_START_LAYER, + .ctx_type = SFC_FLOW_PARSE_CTX_MAE, + .parse = sfc_mae_rule_parse_item_tunnel, + }, }; +static int +sfc_mae_rule_process_outer(struct sfc_adapter *sa, + struct sfc_mae_parse_ctx *ctx, + struct sfc_mae_outer_rule **rulep, + struct rte_flow_error *error) +{ + struct sfc_mae_outer_rule *rule; + int rc; + + if (ctx->encap_type == EFX_TUNNEL_PROTOCOL_NONE) { + *rulep = NULL; + return 0; + } + + SFC_ASSERT(ctx->match_spec_outer != NULL); + + if (!efx_mae_match_spec_is_valid(sa->nic, ctx->match_spec_outer)) { + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ITEM, NULL, + "Inconsistent pattern (outer)"); + } + + *rulep = sfc_mae_outer_rule_attach(sa, ctx->match_spec_outer, + ctx->encap_type); + if (*rulep != NULL) { + efx_mae_match_spec_fini(sa->nic, ctx->match_spec_outer); + } else { + rc = sfc_mae_outer_rule_add(sa, ctx->match_spec_outer, + ctx->encap_type, rulep); + if (rc != 0) { + return rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_ITEM, NULL, + "Failed to process the pattern"); + } + } + + /* + * Depending on whether we reuse an existing outer rule or create a + * new one (see above), outer rule ID is either a valid value or + * EFX_MAE_RSRC_ID_INVALID. Set it in the action rule match + * specification (and the full mask, too) in order to have correct + * class comparisons of the new rule with existing ones. + * Also, action rule match specification will be validated shortly, + * and having the full mask set for outer rule ID indicates that we + * will use this field, and support for this field has to be checked. + */ + rule = *rulep; + rc = efx_mae_match_spec_outer_rule_id_set(ctx->match_spec_action, + &rule->fw_rsrc.rule_id); + if (rc != 0) { + sfc_mae_outer_rule_del(sa, *rulep); + *rulep = NULL; + + return rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_ITEM, NULL, + "Failed to process the pattern"); + } + + return 0; +} + +static int +sfc_mae_rule_encap_parse_init(struct sfc_adapter *sa, + const struct rte_flow_item pattern[], + struct sfc_mae_parse_ctx *ctx, + struct rte_flow_error *error) +{ + struct sfc_mae *mae = &sa->mae; + int rc; + + if (pattern == NULL) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM_NUM, NULL, + "NULL pattern"); + return -rte_errno; + } + + for (;;) { + switch (pattern->type) { + case RTE_FLOW_ITEM_TYPE_VXLAN: + ctx->encap_type = EFX_TUNNEL_PROTOCOL_VXLAN; + ctx->tunnel_def_mask = &rte_flow_item_vxlan_mask; + RTE_BUILD_BUG_ON(sizeof(ctx->tunnel_def_mask) != + sizeof(rte_flow_item_vxlan_mask)); + break; + case RTE_FLOW_ITEM_TYPE_GENEVE: + ctx->encap_type = EFX_TUNNEL_PROTOCOL_GENEVE; + ctx->tunnel_def_mask = &rte_flow_item_geneve_mask; + RTE_BUILD_BUG_ON(sizeof(ctx->tunnel_def_mask) != + sizeof(rte_flow_item_geneve_mask)); + break; + case RTE_FLOW_ITEM_TYPE_NVGRE: + ctx->encap_type = EFX_TUNNEL_PROTOCOL_NVGRE; + ctx->tunnel_def_mask = &rte_flow_item_nvgre_mask; + RTE_BUILD_BUG_ON(sizeof(ctx->tunnel_def_mask) != + sizeof(rte_flow_item_nvgre_mask)); + break; + case RTE_FLOW_ITEM_TYPE_END: + break; + default: + ++pattern; + continue; + }; + + break; + } + + if (pattern->type == RTE_FLOW_ITEM_TYPE_END) + return 0; + + if ((mae->encap_types_supported & (1U << ctx->encap_type)) == 0) { + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ITEM, + pattern, "Unsupported tunnel item"); + } + + if (ctx->priority >= mae->nb_outer_rule_prios_max) { + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY, + NULL, "Unsupported priority level"); + } + + rc = efx_mae_match_spec_init(sa->nic, EFX_MAE_RULE_OUTER, ctx->priority, + &ctx->match_spec_outer); + if (rc != 0) { + return rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_ITEM, pattern, + "Failed to initialise outer rule match specification"); + } + + /* Outermost items comprise a match specification of type OUTER. */ + ctx->match_spec = ctx->match_spec_outer; + + /* Outermost items use "ENC" EFX MAE field IDs. */ + ctx->field_ids_remap = field_ids_remap_to_encap; + + return 0; +} + +static void +sfc_mae_rule_encap_parse_fini(struct sfc_adapter *sa, + struct sfc_mae_parse_ctx *ctx) +{ + if (ctx->encap_type == EFX_TUNNEL_PROTOCOL_NONE) + return; + + efx_mae_match_spec_fini(sa->nic, ctx->match_spec_outer); +} + int sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, const struct rte_flow_item pattern[], @@ -1261,6 +1731,7 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, int rc; memset(&ctx_mae, 0, sizeof(ctx_mae)); + ctx_mae.priority = spec->priority; ctx_mae.sa = sa; rc = efx_mae_match_spec_init(sa->nic, EFX_MAE_RULE_ACTION, @@ -1273,9 +1744,24 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, goto fail_init_match_spec_action; } + /* + * As a preliminary setting, assume that there is no encapsulation + * in the pattern. That is, pattern items are about to comprise a + * match specification of type ACTION and use non-encap. field IDs. + * + * sfc_mae_rule_encap_parse_init() below may override this. + */ + ctx_mae.encap_type = EFX_TUNNEL_PROTOCOL_NONE; + ctx_mae.match_spec = ctx_mae.match_spec_action; + ctx_mae.field_ids_remap = field_ids_no_remap; + ctx.type = SFC_FLOW_PARSE_CTX_MAE; ctx.mae = &ctx_mae; + rc = sfc_mae_rule_encap_parse_init(sa, pattern, &ctx_mae, error); + if (rc != 0) + goto fail_encap_parse_init; + rc = sfc_flow_parse_pattern(sfc_flow_items, RTE_DIM(sfc_flow_items), pattern, &ctx, error); if (rc != 0) @@ -1285,6 +1771,10 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, if (rc != 0) goto fail_process_pattern_data; + rc = sfc_mae_rule_process_outer(sa, &ctx_mae, &spec->outer_rule, error); + if (rc != 0) + goto fail_process_outer; + if (!efx_mae_match_spec_is_valid(sa->nic, ctx_mae.match_spec_action)) { rc = rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ITEM, NULL, @@ -1297,8 +1787,12 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, return 0; fail_validate_match_spec_action: +fail_process_outer: fail_process_pattern_data: fail_parse_pattern: + sfc_mae_rule_encap_parse_fini(sa, &ctx_mae); + +fail_encap_parse_init: efx_mae_match_spec_fini(sa->nic, ctx_mae.match_spec_action); fail_init_match_spec_action: @@ -1670,6 +2164,37 @@ sfc_mae_rules_class_cmp(struct sfc_adapter *sa, return (rc == 0) ? have_same_class : false; } +static int +sfc_mae_outer_rule_class_verify(struct sfc_adapter *sa, + struct sfc_mae_outer_rule *rule) +{ + struct sfc_mae_fw_rsrc *fw_rsrc = &rule->fw_rsrc; + struct sfc_mae_outer_rule *entry; + struct sfc_mae *mae = &sa->mae; + + if (fw_rsrc->rule_id.id != EFX_MAE_RSRC_ID_INVALID) { + /* An active rule is reused. It's class is wittingly valid. */ + return 0; + } + + TAILQ_FOREACH_REVERSE(entry, &mae->outer_rules, + sfc_mae_outer_rules, entries) { + const efx_mae_match_spec_t *left = entry->match_spec; + const efx_mae_match_spec_t *right = rule->match_spec; + + if (entry == rule) + continue; + + if (sfc_mae_rules_class_cmp(sa, left, right)) + return 0; + } + + sfc_info(sa, "for now, the HW doesn't support rule validation, and HW " + "support for outer frame pattern items is not guaranteed; " + "other than that, the items are valid from SW standpoint"); + return 0; +} + static int sfc_mae_action_rule_class_verify(struct sfc_adapter *sa, struct sfc_flow_spec_mae *spec) @@ -1722,12 +2247,20 @@ sfc_mae_flow_verify(struct sfc_adapter *sa, { struct sfc_flow_spec *spec = &flow->spec; struct sfc_flow_spec_mae *spec_mae = &spec->mae; + struct sfc_mae_outer_rule *outer_rule = spec_mae->outer_rule; + int rc; SFC_ASSERT(sfc_adapter_is_locked(sa)); if (sa->state != SFC_ADAPTER_STARTED) return EAGAIN; + if (outer_rule != NULL) { + rc = sfc_mae_outer_rule_class_verify(sa, outer_rule); + if (rc != 0) + return rc; + } + return sfc_mae_action_rule_class_verify(sa, spec_mae); } @@ -1737,6 +2270,7 @@ sfc_mae_flow_insert(struct sfc_adapter *sa, { struct sfc_flow_spec *spec = &flow->spec; struct sfc_flow_spec_mae *spec_mae = &spec->mae; + struct sfc_mae_outer_rule *outer_rule = spec_mae->outer_rule; struct sfc_mae_action_set *action_set = spec_mae->action_set; struct sfc_mae_fw_rsrc *fw_rsrc = &action_set->fw_rsrc; int rc; @@ -1744,6 +2278,13 @@ sfc_mae_flow_insert(struct sfc_adapter *sa, SFC_ASSERT(spec_mae->rule_id.id == EFX_MAE_RSRC_ID_INVALID); SFC_ASSERT(action_set != NULL); + if (outer_rule != NULL) { + rc = sfc_mae_outer_rule_enable(sa, outer_rule, + spec_mae->match_spec); + if (rc != 0) + goto fail_outer_rule_enable; + } + rc = sfc_mae_action_set_enable(sa, action_set); if (rc != 0) goto fail_action_set_enable; @@ -1760,6 +2301,10 @@ sfc_mae_flow_insert(struct sfc_adapter *sa, (void)sfc_mae_action_set_disable(sa, action_set); fail_action_set_enable: + if (outer_rule != NULL) + (void)sfc_mae_outer_rule_disable(sa, outer_rule); + +fail_outer_rule_enable: return rc; } @@ -1770,6 +2315,7 @@ sfc_mae_flow_remove(struct sfc_adapter *sa, struct sfc_flow_spec *spec = &flow->spec; struct sfc_flow_spec_mae *spec_mae = &spec->mae; struct sfc_mae_action_set *action_set = spec_mae->action_set; + struct sfc_mae_outer_rule *outer_rule = spec_mae->outer_rule; int rc; SFC_ASSERT(spec_mae->rule_id.id != EFX_MAE_RSRC_ID_INVALID); @@ -1781,5 +2327,14 @@ sfc_mae_flow_remove(struct sfc_adapter *sa, spec_mae->rule_id.id = EFX_MAE_RSRC_ID_INVALID; - return sfc_mae_action_set_disable(sa, action_set); + rc = sfc_mae_action_set_disable(sa, action_set); + if (rc != 0) { + sfc_err(sa, "failed to disable the action set (rc = %d)", rc); + /* Despite the error, proceed with outer rule removal. */ + } + + if (outer_rule != NULL) + return sfc_mae_outer_rule_disable(sa, outer_rule); + + return 0; } diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index 8d9b4039f3..53ddead979 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -26,9 +26,21 @@ struct sfc_mae_fw_rsrc { RTE_STD_C11 union { efx_mae_aset_id_t aset_id; + efx_mae_rule_id_t rule_id; }; }; +/** Outer rule registry entry */ +struct sfc_mae_outer_rule { + TAILQ_ENTRY(sfc_mae_outer_rule) entries; + unsigned int refcnt; + efx_mae_match_spec_t *match_spec; + efx_tunnel_protocol_t encap_type; + struct sfc_mae_fw_rsrc fw_rsrc; +}; + +TAILQ_HEAD(sfc_mae_outer_rules, sfc_mae_outer_rule); + /** Action set registry entry */ struct sfc_mae_action_set { TAILQ_ENTRY(sfc_mae_action_set) entries; @@ -53,8 +65,14 @@ struct sfc_mae { uint16_t switch_port_id; /** NIC support for MAE status */ enum sfc_mae_status status; + /** Priority level limit for MAE outer rules */ + unsigned int nb_outer_rule_prios_max; /** Priority level limit for MAE action rules */ unsigned int nb_action_rule_prios_max; + /** Encapsulation support status */ + uint32_t encap_types_supported; + /** Outer rule registry */ + struct sfc_mae_outer_rules outer_rules; /** Action set registry */ struct sfc_mae_action_sets action_sets; }; @@ -149,8 +167,24 @@ struct sfc_mae_pattern_data { struct sfc_mae_parse_ctx { struct sfc_adapter *sa; efx_mae_match_spec_t *match_spec_action; + efx_mae_match_spec_t *match_spec_outer; + /* + * This points to either of the above two specifications depending + * on which part of the pattern is being parsed (outer / inner). + */ + efx_mae_match_spec_t *match_spec; + /* + * This points to either "field_ids_remap_to_encap" + * or "field_ids_no_remap" (see sfc_mae.c) depending on + * which part of the pattern is being parsed. + */ + const efx_mae_field_id_t *field_ids_remap; + /* This points to a tunnel-specific default mask. */ + const void *tunnel_def_mask; bool match_mport_set; struct sfc_mae_pattern_data pattern_data; + efx_tunnel_protocol_t encap_type; + unsigned int priority; }; int sfc_mae_attach(struct sfc_adapter *sa); From patchwork Tue Oct 20 08:48:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81488 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id DA6D5A04DD; Tue, 20 Oct 2020 11:06:01 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id AFA32C91E; Tue, 20 Oct 2020 10:50:14 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id AFCD2BAE8 for ; Tue, 20 Oct 2020 10:49:06 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 7D7AC6007B for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from us4-mdac16-32.ut7.mdlocal (unknown [10.7.66.145]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 7CA252009A for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.41]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 085331C0053 for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id B10074C0059 for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:51 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:51 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mpRf030939; Tue, 20 Oct 2020 09:48:51 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 136431613AB; Tue, 20 Oct 2020 09:48:51 +0100 (BST) From: Andrew Rybchenko To: CC: Date: Tue, 20 Oct 2020 09:48:29 +0100 Message-ID: <1603183709-23420-63-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.990000-8.000000-10 X-TMASE-MatchedRID: WTQJ2mrE7OOdQVJt8T89TW/BUkaRdR0JG0Oe0T+pTlFPIi6bm6Wq5qdm AgMyOH7Yq64l+8SGdzgOnpqGwNbZeh2k1vtl2oj3z/7rpiFAj38LKPaBHScRdT2mEJylgvfBUx7 kGWSmvLut2gtuWr1Lms4nQjLEMMKB8pKIoUEViCH9xyC38S1f/f6lpfpte41hOoVNY5hwbaWjxY yRBa/qJcFwgTvxipFajoczmuoPCq0dycOur/o01hvuWNFguUkX4aVimkhYkFlyZEhSBWenXqmO3 HFIcpHV76WIMPmea8bgOfEZ5IzGuqxcz3NibvHNlVCYvnnDW2mF15h6/oibNbKsWJ44GuEGPNxa u39/BitFwHZmk+dWMmhnUCrcDtVn X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--1.990000-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183746-jUegXjdNSHyn X-PPE-DISP: 1603183746;jUegXjdNSHyn Subject: [dpdk-dev] [PATCH 62/62] doc: advertise flow API transfer rules support in net/sfc X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Transfer rules support matching on various inner and outer packet headers, traffic source items like PORT_ID, PHY_PORT, PF and VF and actions to route traffic to destination (PORT_ID, PHY_PORT, PF, VF or DROP), MARK, FLAG and apply VLAN push/pop transformations. Signed-off-by: Andrew Rybchenko --- doc/guides/rel_notes/release_20_11.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/guides/rel_notes/release_20_11.rst b/doc/guides/rel_notes/release_20_11.rst index 278d8dd0d4..b91524ee59 100644 --- a/doc/guides/rel_notes/release_20_11.rst +++ b/doc/guides/rel_notes/release_20_11.rst @@ -165,7 +165,8 @@ New Features Updated the Solarflare ``sfc_efx`` driver with changes including: * Added SR-IOV PF support - * Added Alveo SN1000 SmartNICs (EF100 architecture) support + * Added Alveo SN1000 SmartNICs (EF100 architecture) support including + flow API transfer rules for switch HW offload * **Updated Virtio driver.**