From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 79B1DA0543; Tue, 25 Oct 2022 10:03:50 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9C76442C54; Tue, 25 Oct 2022 10:01:01 +0200 (CEST) Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2102.outbound.protection.outlook.com [40.107.237.102]) by mails.dpdk.org (Postfix) with ESMTP id C789242BA7 for ; Tue, 25 Oct 2022 10:00:46 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Z8yEwyGVVxncSiB7W7Vuz/zrBjW9mDro5URgaF56onPmgilQiyK+7/unLxyN+3/jSXFaOf6p0P/CF7iGvWZcpLwIdmFukuCm4afoEJ6zW4XaJMf4Tsm01zfbBwREViY5Y2mrspc0AgguSKhnDRkP5MSPOteBnTbBBuiKJUmArlcLF2nf1xPxLJMOHqXQ7EHBsa/ZmO0TKZbK1nsZLlrkXRbBRg86v1J9IanEk9TVyXYrrzDpycwEVoTgIPL7Y9cAyDewweQ46R6G0Uni2KcpTIwQY7L5T2m5Kb6btNrC5tAVpoFpBRLEfNjTyh4z5NzbBmislCOjyQKpJM/MV1x93w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=3ZddnPhJ5PHgw36imy+YTVvTj+jqQKPKlE5PKkK8h5U=; b=XiI3wpHN+tfgTVAFRdhMuisfi3Ekvoy9bK2Fufgh+CkoKWqHLBcfLdBCavxbEASskTB4cARsBsfLeRAbb+S8NKDfG7l+XDGqIfVGrhfu2hKpthdRJjspAg6gsf8nucO7ovAZ8/luV7yTSxhqjKeLTE2axnYq/eTXy92BVFGr/ER3GrK14pEi41TRRo3eJPBZhsbh9fRGc8mGNxBdE+IlylZA0Wqu+M3E1rE4fFjF305B9eerTZEx+n5xG023hn+G4nmDf6UojzX6rbshjbPH41uhDXn+Ax6B6luT75Ts7zMpmQfbkSJTZpW0PpcW8s30DTSwSi8BlTP1Ds2LfG/4+A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com; dkim=pass header.d=corigine.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=3ZddnPhJ5PHgw36imy+YTVvTj+jqQKPKlE5PKkK8h5U=; b=rk2g3Bs/kqNt36+T1vZoesii3cT+GEy3KHzgbPWP+tD0JgFGGmt+1lyDilZ6g5RyCNYIrPNzs+d5SLQFFFjR/NrofL/xFCQlSqE8/9oX4V7p4YbzRm0mcxyuyFzeYuyowdXiQdaeZBTZb5Xb3XLR83vNigEz4xIehnTp55KQbmg= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=corigine.com; Received: from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) by BLAPR13MB4739.namprd13.prod.outlook.com (2603:10b6:208:306::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5746.25; Tue, 25 Oct 2022 08:00:45 +0000 Received: from SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::7c26:1a0b:2825:6f4b]) by SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::7c26:1a0b:2825:6f4b%4]) with mapi id 15.20.5723.014; Tue, 25 Oct 2022 08:00:45 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, niklas.soderlund@corigine.com, Chaoyong He Subject: [PATCH v3 26/26] net/nfp: support new solution for tunnel decap action Date: Tue, 25 Oct 2022 15:59:18 +0800 Message-Id: <20221025075918.7778-27-chaoyong.he@corigine.com> X-Mailer: git-send-email 2.29.3 In-Reply-To: <20221025075918.7778-1-chaoyong.he@corigine.com> References: <1666427069-10553-1-git-send-email-chaoyong.he@corigine.com> <20221025075918.7778-1-chaoyong.he@corigine.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-ClientProxiedBy: SG2PR01CA0142.apcprd01.prod.exchangelabs.com (2603:1096:4:8f::22) To SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR13MB5545:EE_|BLAPR13MB4739:EE_ X-MS-Office365-Filtering-Correlation-Id: 86e4edad-7373-4f68-93d4-08dab65f04ff X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: x2RXjsNlaxAC+cwTMhst71KfWRhAGR0MhYnp6q1YxMZ98F/zTdOUOoCc7odAUN8lCJAyB3rTbyqkOxcu4tFm8g4eWEbhMIv1RYCQEl7TTdgvguGC2F2xXsvNar8ZTkyS2xz9lt27iuXx/ZUIVd+PbNMsKjLe9Pvj0+GXQPq1sp32b+IQ2VSQS1BYybUx9cbZtnLPboyYeanp3NoAoZTZ0VVYnHFzF1v5OnrgYE0xHWD4IdVQwwgyq4k8CinaKKkqyv+o3wRc4RkbKQbziMGXgqexWb56xdQToQw4SZw7UV6f2lQyulDoTb0PqYm0hjKjZe6wURppOfgD+sig4FazCGsYO2nUPPE+uKb2GbVeVP98qsxMmPLlY9ctIRjcAOI+EAPaSDn6tikst1mMyB1lgvApaM9l8Hx+s3MM9oEPt/wERFf7/XvW3GCTUUxtzjp7ANGadHE5HkpkmRLIopcbZnYXSkAuRxGmHXInoBxqwtV7XB/unixv+tFOhoO9lCXEcsmWuGWYED5IA98kjuxq6YTft2cSE1ZIXwMa1KqJLIHDEmV0kgVtXzkfau51NPkm17FkAuUvVYEPS1AU3wDJngTZCvwV3wtQ3Tgvig9taLmcygqzfSZ2zS3X2Hp5HxvONT/9Ot9FgPykGe+VgL1v9GJ2Bk8XlnDYyCqJA41hAeiTQRntex596HrN1RNL0rvPa+yOaD/YsAvwBBmNQLlHfJBopFPiwT4rCNPa2CGHsiDXFIbZdeJMT19sk0KZzk7CLDKrX0uSpQM2r6FQDo9gUA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230022)(4636009)(376002)(366004)(396003)(136003)(39850400004)(346002)(451199015)(36756003)(38350700002)(86362001)(38100700002)(41300700001)(83380400001)(66946007)(66574015)(1076003)(2906002)(6512007)(6666004)(26005)(186003)(6916009)(6506007)(52116002)(107886003)(478600001)(44832011)(66556008)(5660300002)(8936002)(2616005)(6486002)(30864003)(8676002)(316002)(66476007)(4326008); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?a1NSem9XYmc5UXQ3czJPTVluTlN0Y1Z3b24wa256dGgxVTBKK3BiTkZRSVV4?= =?utf-8?B?alFheDBrR1Z3ais5SWt2TGhLaVRXSzFGeVgwWFNTdXo0MjdBdGZ5U2gvb1NP?= =?utf-8?B?Q1NhNStKMEh1MDNDS2lMZXc2enF4V3Y4dytJdG83ZzNvd0w4OFZIanhJbDN4?= =?utf-8?B?VGlxdGhHelRTVVMvbm5sK3BZcWc0REY5MGNrWFRSSzZxMmlURS9jTzhENlJG?= =?utf-8?B?NERhdWswbTJUNHViUlpmMFdTdWZ3MFRqU1NKWmQyOVE5cXpDZXNYQWhIdUxi?= =?utf-8?B?aFo0UHptZ29ib2dEZTg3d3dqOVdlVDdVTEpsRmY3U01iUTZGdTJDSlRCeS9v?= =?utf-8?B?enpMUFRxOXpSMC9EaytKUU0zd3lUM1pzSVdzZEFJUTBESmVGR3dTWmQ4cHh2?= =?utf-8?B?WkVvcDM1ZjN3REs2a2s3UFFZYmdTdS9qa25LQTBqYXhEQnpXaGJuOThLTmcx?= =?utf-8?B?R2RZMTQ4QW96UnovdXp6VzlpVlowSm9lZ05Yc3lBWGpXTEV1ZFhWU2NBaWk1?= =?utf-8?B?U1RJRGNnS3k1YXg3N3c5bTZyOU83ck51TUM2c1pJYUtWRy9Ba0E5YnBXeW9m?= =?utf-8?B?Nm1nZHVIQi9SNnF2cXhoS3Rwb1IwWFpreUQyZ0w3R1Q3UjdMV2pNdStzajZN?= =?utf-8?B?amFORzEvbFNLaEQrWHcybXZQSnZQUUZOWXo1aXlodkRrTGxpUy9qQ1ROMytn?= =?utf-8?B?dDA3OXVBWlBKUm1HZVJvelpLNmI1R1dRYW5rREcwQzZ0ZW91Q0NhVEMxdEtD?= =?utf-8?B?ZndSdEwyZk5OdlRhRk04YU1kRjZtd2lTR2F4VGI0aWdnQ3pIVUp3ZVhYcWZm?= =?utf-8?B?ZHlSSWNJR3pmbjlZeHFvSzJkdFpLa2xvYmZBUzQzTnhZaThVRWQvcDRFRExV?= =?utf-8?B?a04zT0h5ckExNU13dEVBaUZnTEJDUlhTRzMwTjdCeWFma3RLYjNvd3BsajI5?= =?utf-8?B?eTVDYmkzN2tLZHZPRkI2ejY5bnVhSTg3N0N6V3BleVNsZytnY1cyMHFQNVQx?= =?utf-8?B?MEp0amlyQ01KSFBIN0JFa085KzBmeXhLaUNiSUYwamkraE8rVzRIVlhUcnNK?= =?utf-8?B?UStxZU5YQ1I1STUyS0ordnhlVWNVVFF4WElTdkp3c01pa2Z3bGJIU3g5OGxW?= =?utf-8?B?R2toRHBWaXRKbGN3V3ZMc0V4L3VUdXBXdElSZ1RHdUZxZFZXL2hQVVNCVUpi?= =?utf-8?B?K21pWEt1aWkvbUdESStNREFocnhkTVIzM0J5N0dtRzFHWVJ5bGNsaFhaaWZX?= =?utf-8?B?dlVNd2JqcDhGYkFxK1B2T0JPamh3TTRHc3REQS9oWk50MjNpbHN6UlB5N2M1?= =?utf-8?B?cnpqWm5pQW52bTFRZUUveG15U3prczVxQ1JvK0o3VjF6b1RIcEd6c0hTc0R4?= =?utf-8?B?RTJCaTZjQkY1dFRnK1BPVUo2MDFiUno3TnlrMDZQVlI0ZWE1Q2xXUm5VYitt?= =?utf-8?B?eS9rbzFldXc3bU5ocXc1bE92bUl0enlGaDR2WnV4a1dHdmtsQXI2aDdhenZO?= =?utf-8?B?bDFFdnBka3NybVNpQndiZ29lcW5oZWo3UnJoWUxnSktneEcxUXNHaVNuc0tI?= =?utf-8?B?bW5Fc3E5QUd5M2JvU0xXbW15OWZaV1BIWjlEMkpvakc0NENia05XY2xvdEE3?= =?utf-8?B?czVaelZNTTR5QU1xM0o2NDJEbGFTTExNazM3NVErS0Z0b0svcHVqWEFMd2tS?= =?utf-8?B?RmZPUkhORVhiNHdlUWtkVjdFU1NweFZWUU1lMnRmSjZMaklGRXhuQ09yekdj?= =?utf-8?B?UE4zZzJEVDFpbXlxR1NFZldTb3NkRkUxUXZDdTlaOUdKVmYwQTJzM1ZVTXpZ?= =?utf-8?B?b0ZScUQ1Tmw5Ti9QbkNHTjBPRUJqUUxlNE85SDNaNnJuYklGR2NEZ3dlWUNj?= =?utf-8?B?WWFENkppUHMweXF5VXk1RzhuTUFQUmQraFNhekkxd3h4K3VWUHFzZ05pcDM2?= =?utf-8?B?S1E5YmU1M3VybmpFY0lYY09rWUp3Q2NjRk1WVGFrRTdCWno3K0N6NlljOC9z?= =?utf-8?B?L1J1VGx5dVFBRFF4dldUTmhSeEhQYUlSNFdYbzZYSll6bWxsSjY4L3piUWpM?= =?utf-8?B?REw4OTYxSUZjU1MrR2xWUkg2elp2dW16ZmRSR0N6djRWOEMzNmRtcUI1WmYw?= =?utf-8?B?enZKNGMxVUVCSnRQclBrMVBoRDg4SGIzU2p4K2w0WVJMUHpRSHRLNHNzb2V6?= =?utf-8?B?VWc9PQ==?= X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: 86e4edad-7373-4f68-93d4-08dab65f04ff X-MS-Exchange-CrossTenant-AuthSource: SJ0PR13MB5545.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Oct 2022 08:00:45.1632 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: fe128f2c-073b-4c20-818e-7246a585940c X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: gfglg73ZfkFpDQ97ylfliE6Vb1GhlUqU9/s050eF1cipEpyJLVAEcWmsKK9YH64D0bDAY1AcyEGY50lAQJzjPzLu1n4AMYvf8/XpWsDFi+I= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLAPR13MB4739 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org The new version of flower firmware application add the support of a new tunnel decap action solution. It changes the structure of tunnel neighbor, and use a feature flag to indicate which tunnel decap action solution is used. Add the logic of read extra features from firmware, and store it in the app private structure. Adjust the data structure and related logic to make the PMD support both version of tunnel decap action solutions. Signed-off-by: Chaoyong He Reviewed-by: Niklas Söderlund --- drivers/net/nfp/flower/nfp_flower.c | 14 +++ drivers/net/nfp/flower/nfp_flower.h | 24 +++++ drivers/net/nfp/flower/nfp_flower_cmsg.c | 4 + drivers/net/nfp/flower/nfp_flower_cmsg.h | 17 ++++ drivers/net/nfp/nfp_flow.c | 118 +++++++++++++++++++---- 5 files changed, 157 insertions(+), 20 deletions(-) diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c index 41b0fe2337..aa8199dde2 100644 --- a/drivers/net/nfp/flower/nfp_flower.c +++ b/drivers/net/nfp/flower/nfp_flower.c @@ -1074,6 +1074,8 @@ int nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev) { int ret; + int err; + uint64_t ext_features; unsigned int numa_node; struct nfp_net_hw *pf_hw; struct nfp_net_hw *ctrl_hw; @@ -1115,6 +1117,18 @@ nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev) goto vnic_cleanup; } + /* Read the extra features */ + ext_features = nfp_rtsym_read_le(pf_dev->sym_tbl, "_abi_flower_extra_features", + &err); + if (err != 0) { + PMD_INIT_LOG(ERR, "Couldn't read extra features from fw"); + ret = -EIO; + goto pf_cpp_area_cleanup; + } + + /* Store the extra features */ + app_fw_flower->ext_features = ext_features; + /* Fill in the PF vNIC and populate app struct */ app_fw_flower->pf_hw = pf_hw; pf_hw->ctrl_bar = pf_dev->ctrl_bar; diff --git a/drivers/net/nfp/flower/nfp_flower.h b/drivers/net/nfp/flower/nfp_flower.h index f199741190..c05a761a95 100644 --- a/drivers/net/nfp/flower/nfp_flower.h +++ b/drivers/net/nfp/flower/nfp_flower.h @@ -8,6 +8,21 @@ #include "../nfp_common.h" +/* Extra features bitmap. */ +#define NFP_FL_FEATS_GENEVE RTE_BIT64(0) +#define NFP_FL_NBI_MTU_SETTING RTE_BIT64(1) +#define NFP_FL_FEATS_GENEVE_OPT RTE_BIT64(2) +#define NFP_FL_FEATS_VLAN_PCP RTE_BIT64(3) +#define NFP_FL_FEATS_VF_RLIM RTE_BIT64(4) +#define NFP_FL_FEATS_FLOW_MOD RTE_BIT64(5) +#define NFP_FL_FEATS_PRE_TUN_RULES RTE_BIT64(6) +#define NFP_FL_FEATS_IPV6_TUN RTE_BIT64(7) +#define NFP_FL_FEATS_VLAN_QINQ RTE_BIT64(8) +#define NFP_FL_FEATS_QOS_PPS RTE_BIT64(9) +#define NFP_FL_FEATS_QOS_METER RTE_BIT64(10) +#define NFP_FL_FEATS_DECAP_V2 RTE_BIT64(11) +#define NFP_FL_FEATS_HOST_ACK RTE_BIT64(31) + /* * Flower fallback and ctrl path always adds and removes * 8 bytes of prepended data. Tx descriptors must point @@ -57,9 +72,18 @@ struct nfp_app_fw_flower { /* service id of ctrl vnic service */ uint32_t ctrl_vnic_id; + /* Flower extra features */ + uint64_t ext_features; + struct nfp_flow_priv *flow_priv; }; +static inline bool +nfp_flower_support_decap_v2(const struct nfp_app_fw_flower *app_fw_flower) +{ + return app_fw_flower->ext_features & NFP_FL_FEATS_DECAP_V2; +} + int nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev); int nfp_secondary_init_app_fw_flower(struct nfp_cpp *cpp); uint16_t nfp_flower_pf_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, diff --git a/drivers/net/nfp/flower/nfp_flower_cmsg.c b/drivers/net/nfp/flower/nfp_flower_cmsg.c index 76815cfe14..babdd8e36b 100644 --- a/drivers/net/nfp/flower/nfp_flower_cmsg.c +++ b/drivers/net/nfp/flower/nfp_flower_cmsg.c @@ -263,6 +263,8 @@ nfp_flower_cmsg_tun_neigh_v4_rule(struct nfp_app_fw_flower *app_fw_flower, } msg_len = sizeof(struct nfp_flower_cmsg_tun_neigh_v4); + if (!nfp_flower_support_decap_v2(app_fw_flower)) + msg_len -= sizeof(struct nfp_flower_tun_neigh_ext); msg = nfp_flower_cmsg_init(mbuf, NFP_FLOWER_CMSG_TYPE_TUN_NEIGH, msg_len); memcpy(msg, payload, msg_len); @@ -292,6 +294,8 @@ nfp_flower_cmsg_tun_neigh_v6_rule(struct nfp_app_fw_flower *app_fw_flower, } msg_len = sizeof(struct nfp_flower_cmsg_tun_neigh_v6); + if (!nfp_flower_support_decap_v2(app_fw_flower)) + msg_len -= sizeof(struct nfp_flower_tun_neigh_ext); msg = nfp_flower_cmsg_init(mbuf, NFP_FLOWER_CMSG_TYPE_TUN_NEIGH_V6, msg_len); memcpy(msg, payload, msg_len); diff --git a/drivers/net/nfp/flower/nfp_flower_cmsg.h b/drivers/net/nfp/flower/nfp_flower_cmsg.h index a48da67222..04601cb0bd 100644 --- a/drivers/net/nfp/flower/nfp_flower_cmsg.h +++ b/drivers/net/nfp/flower/nfp_flower_cmsg.h @@ -135,6 +135,21 @@ struct nfp_flower_tun_neigh { rte_be32_t port_id; }; +/* + * Bit 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 + * -----\ 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 + * +---------------------------------------------------------------+ + * 0 | VLAN_TPID | VLAN_ID | + * +---------------------------------------------------------------+ + * 1 | HOST_CTX | + * +---------------------------------------------------------------+ + */ +struct nfp_flower_tun_neigh_ext { + rte_be16_t vlan_tpid; + rte_be16_t vlan_tci; + rte_be32_t host_ctx; +}; + /* * NFP_FLOWER_CMSG_TYPE_TUN_NEIGH_V4 * Bit 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 @@ -157,6 +172,7 @@ struct nfp_flower_cmsg_tun_neigh_v4 { rte_be32_t dst_ipv4; rte_be32_t src_ipv4; struct nfp_flower_tun_neigh common; + struct nfp_flower_tun_neigh_ext ext; }; /* @@ -193,6 +209,7 @@ struct nfp_flower_cmsg_tun_neigh_v6 { uint8_t dst_ipv6[16]; uint8_t src_ipv6[16]; struct nfp_flower_tun_neigh common; + struct nfp_flower_tun_neigh_ext ext; }; #define NFP_TUN_PRE_TUN_RULE_DEL (1 << 0) diff --git a/drivers/net/nfp/nfp_flow.c b/drivers/net/nfp/nfp_flow.c index 93a9233b8b..af56e7bef2 100644 --- a/drivers/net/nfp/nfp_flow.c +++ b/drivers/net/nfp/nfp_flow.c @@ -2384,8 +2384,10 @@ nfp_flower_add_tun_neigh_v4_encap(struct nfp_app_fw_flower *app_fw_flower, static int nfp_flower_add_tun_neigh_v4_decap(struct nfp_app_fw_flower *app_fw_flower, + struct nfp_fl_rule_metadata *nfp_flow_meta, struct rte_flow *nfp_flow) { + bool exists = false; struct nfp_fl_tun *tmp; struct nfp_fl_tun *tun; struct nfp_flow_priv *priv; @@ -2419,11 +2421,17 @@ nfp_flower_add_tun_neigh_v4_decap(struct nfp_app_fw_flower *app_fw_flower, LIST_FOREACH(tmp, &priv->nn_list, next) { if (memcmp(&tmp->payload, &tun->payload, sizeof(struct nfp_fl_tun_entry)) == 0) { tmp->ref_cnt++; - return 0; + exists = true; + break; } } - LIST_INSERT_HEAD(&priv->nn_list, tun, next); + if (exists) { + if (!nfp_flower_support_decap_v2(app_fw_flower)) + return 0; + } else { + LIST_INSERT_HEAD(&priv->nn_list, tun, next); + } memset(&payload, 0, sizeof(struct nfp_flower_cmsg_tun_neigh_v4)); payload.dst_ipv4 = ipv4->ipv4_src; @@ -2432,6 +2440,17 @@ nfp_flower_add_tun_neigh_v4_decap(struct nfp_app_fw_flower *app_fw_flower, memcpy(payload.common.src_mac, eth->mac_dst, RTE_ETHER_ADDR_LEN); payload.common.port_id = port->in_port; + if (nfp_flower_support_decap_v2(app_fw_flower)) { + if (meta_tci->tci != 0) { + payload.ext.vlan_tci = meta_tci->tci; + payload.ext.vlan_tpid = 0x88a8; + } else { + payload.ext.vlan_tci = 0xffff; + payload.ext.vlan_tpid = 0xffff; + } + payload.ext.host_ctx = nfp_flow_meta->host_ctx_id; + } + return nfp_flower_cmsg_tun_neigh_v4_rule(app_fw_flower, &payload); } @@ -2492,8 +2511,10 @@ nfp_flower_add_tun_neigh_v6_encap(struct nfp_app_fw_flower *app_fw_flower, static int nfp_flower_add_tun_neigh_v6_decap(struct nfp_app_fw_flower *app_fw_flower, + struct nfp_fl_rule_metadata *nfp_flow_meta, struct rte_flow *nfp_flow) { + bool exists = false; struct nfp_fl_tun *tmp; struct nfp_fl_tun *tun; struct nfp_flow_priv *priv; @@ -2527,11 +2548,17 @@ nfp_flower_add_tun_neigh_v6_decap(struct nfp_app_fw_flower *app_fw_flower, LIST_FOREACH(tmp, &priv->nn_list, next) { if (memcmp(&tmp->payload, &tun->payload, sizeof(struct nfp_fl_tun_entry)) == 0) { tmp->ref_cnt++; - return 0; + exists = true; + break; } } - LIST_INSERT_HEAD(&priv->nn_list, tun, next); + if (exists) { + if (!nfp_flower_support_decap_v2(app_fw_flower)) + return 0; + } else { + LIST_INSERT_HEAD(&priv->nn_list, tun, next); + } memset(&payload, 0, sizeof(struct nfp_flower_cmsg_tun_neigh_v6)); memcpy(payload.dst_ipv6, ipv6->ipv6_src, sizeof(payload.dst_ipv6)); @@ -2540,6 +2567,17 @@ nfp_flower_add_tun_neigh_v6_decap(struct nfp_app_fw_flower *app_fw_flower, memcpy(payload.common.src_mac, eth->mac_dst, RTE_ETHER_ADDR_LEN); payload.common.port_id = port->in_port; + if (nfp_flower_support_decap_v2(app_fw_flower)) { + if (meta_tci->tci != 0) { + payload.ext.vlan_tci = meta_tci->tci; + payload.ext.vlan_tpid = 0x88a8; + } else { + payload.ext.vlan_tci = 0xffff; + payload.ext.vlan_tpid = 0xffff; + } + payload.ext.host_ctx = nfp_flow_meta->host_ctx_id; + } + return nfp_flower_cmsg_tun_neigh_v6_rule(app_fw_flower, &payload); } @@ -2557,12 +2595,14 @@ nfp_flower_del_tun_neigh_v6(struct nfp_app_fw_flower *app_fw_flower, static int nfp_flower_del_tun_neigh(struct nfp_app_fw_flower *app_fw_flower, - struct rte_flow *nfp_flow) + struct rte_flow *nfp_flow, + bool decap_flag) { int ret; bool flag = false; struct nfp_fl_tun *tmp; struct nfp_fl_tun *tun; + struct nfp_flower_in_port *port; tun = &nfp_flow->tun; LIST_FOREACH(tmp, &app_fw_flower->flow_priv->nn_list, next) { @@ -2590,6 +2630,40 @@ nfp_flower_del_tun_neigh(struct nfp_app_fw_flower *app_fw_flower, } } + if (!decap_flag) + return 0; + + port = (struct nfp_flower_in_port *)(nfp_flow->payload.unmasked_data + + sizeof(struct nfp_fl_rule_metadata) + + sizeof(struct nfp_flower_meta_tci)); + + if (tmp->payload.v6_flag != 0) { + struct nfp_flower_cmsg_tun_neigh_v6 nn_v6; + memset(&nn_v6, 0, sizeof(struct nfp_flower_cmsg_tun_neigh_v6)); + memcpy(nn_v6.dst_ipv6, tmp->payload.dst.dst_ipv6, sizeof(nn_v6.dst_ipv6)); + memcpy(nn_v6.src_ipv6, tmp->payload.src.src_ipv6, sizeof(nn_v6.src_ipv6)); + memcpy(nn_v6.common.dst_mac, tmp->payload.dst_addr, RTE_ETHER_ADDR_LEN); + memcpy(nn_v6.common.src_mac, tmp->payload.src_addr, RTE_ETHER_ADDR_LEN); + nn_v6.common.port_id = port->in_port; + + ret = nfp_flower_cmsg_tun_neigh_v6_rule(app_fw_flower, &nn_v6); + } else { + struct nfp_flower_cmsg_tun_neigh_v4 nn_v4; + memset(&nn_v4, 0, sizeof(struct nfp_flower_cmsg_tun_neigh_v4)); + nn_v4.dst_ipv4 = tmp->payload.dst.dst_ipv4; + nn_v4.src_ipv4 = tmp->payload.src.src_ipv4; + memcpy(nn_v4.common.dst_mac, tmp->payload.dst_addr, RTE_ETHER_ADDR_LEN); + memcpy(nn_v4.common.src_mac, tmp->payload.src_addr, RTE_ETHER_ADDR_LEN); + nn_v4.common.port_id = port->in_port; + + ret = nfp_flower_cmsg_tun_neigh_v4_rule(app_fw_flower, &nn_v4); + } + + if (ret != 0) { + PMD_DRV_LOG(DEBUG, "Failed to send the nn entry"); + return -EINVAL; + } + return 0; } @@ -2877,12 +2951,14 @@ nfp_pre_tun_table_check_del(struct nfp_flower_representor *repr, goto free_entry; } - ret = nfp_flower_cmsg_pre_tunnel_rule(repr->app_fw_flower, nfp_flow_meta, - nfp_mac_idx, true); - if (ret != 0) { - PMD_DRV_LOG(ERR, "Send pre tunnel rule failed"); - ret = -EINVAL; - goto free_entry; + if (!nfp_flower_support_decap_v2(repr->app_fw_flower)) { + ret = nfp_flower_cmsg_pre_tunnel_rule(repr->app_fw_flower, nfp_flow_meta, + nfp_mac_idx, true); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Send pre tunnel rule failed"); + ret = -EINVAL; + goto free_entry; + } } find_entry->ref_cnt = 1U; @@ -2933,18 +3009,20 @@ nfp_flow_action_tunnel_decap(struct nfp_flower_representor *repr, return -EINVAL; } - ret = nfp_flower_cmsg_pre_tunnel_rule(app_fw_flower, nfp_flow_meta, - nfp_mac_idx, false); - if (ret != 0) { - PMD_DRV_LOG(ERR, "Send pre tunnel rule failed"); - return -EINVAL; + if (!nfp_flower_support_decap_v2(app_fw_flower)) { + ret = nfp_flower_cmsg_pre_tunnel_rule(app_fw_flower, nfp_flow_meta, + nfp_mac_idx, false); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Send pre tunnel rule failed"); + return -EINVAL; + } } meta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.unmasked_data; if (meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_IPV4) - return nfp_flower_add_tun_neigh_v4_decap(app_fw_flower, nfp_flow); + return nfp_flower_add_tun_neigh_v4_decap(app_fw_flower, nfp_flow_meta, nfp_flow); else - return nfp_flower_add_tun_neigh_v6_decap(app_fw_flower, nfp_flow); + return nfp_flower_add_tun_neigh_v6_decap(app_fw_flower, nfp_flow_meta, nfp_flow); } static int @@ -3654,11 +3732,11 @@ nfp_flow_destroy(struct rte_eth_dev *dev, break; case NFP_FLOW_ENCAP: /* Delete the entry from nn table */ - ret = nfp_flower_del_tun_neigh(app_fw_flower, nfp_flow); + ret = nfp_flower_del_tun_neigh(app_fw_flower, nfp_flow, false); break; case NFP_FLOW_DECAP: /* Delete the entry from nn table */ - ret = nfp_flower_del_tun_neigh(app_fw_flower, nfp_flow); + ret = nfp_flower_del_tun_neigh(app_fw_flower, nfp_flow, true); if (ret != 0) goto exit; -- 2.29.3