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 AEE20A034E; Thu, 20 Jan 2022 17:27:04 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3BF1F42713; Thu, 20 Jan 2022 17:27:02 +0100 (CET) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by mails.dpdk.org (Postfix) with ESMTP id CE16040042 for ; Thu, 20 Jan 2022 17:27:00 +0100 (CET) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.16.1.2/8.16.1.2) with ESMTP id 20KCOamx015679; Thu, 20 Jan 2022 08:26:59 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=qILpwlf/o9gYuIyyQ2n6B+Y6FGc/f2RzMSPG1OKSJ30=; b=McEBJCUSuVJ2DAJsvwYe+Eatca5Lxid3sCsUpuSWyP2fCr6Iz5B/EympDv0sbRQWOSLu L4KU5LhFx53YqewTmEhdcyww1pm06zprHhDdRN2+pfOLMSe0IA9cB5wrcCDg11TjV+au VQfZYnddZYkw0WHh4NNjwro/ILYyxLWXgErpMwWj2/QKbokE4CH51SL67gCesr80cxls dmgKhD94aLk3S5fdehqylkPDxlA1txgJquwI14+Xa+5dGlqSrPlA1bb+pRmlwncYj4W2 7F4JpM9wL8lmuPDVdCD2OydADf8wnrmNDaCChDUqjm76qV+6p0rdI7ZEP3+3mibYhBhi JQ== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3dpybrtkmw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Thu, 20 Jan 2022 08:26:59 -0800 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Thu, 20 Jan 2022 08:26:57 -0800 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Thu, 20 Jan 2022 08:26:57 -0800 Received: from localhost.localdomain (unknown [10.28.48.55]) by maili.marvell.com (Postfix) with ESMTP id A24D23F705A; Thu, 20 Jan 2022 08:26:52 -0800 (PST) From: Akhil Goyal To: CC: , , , , , , , , , , , , "Akhil Goyal" Subject: [PATCH v2 3/4] ethdev: add mbuf dynfield for incomplete IP reassembly Date: Thu, 20 Jan 2022 21:56:26 +0530 Message-ID: <20220120162627.4155695-4-gakhil@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220120162627.4155695-1-gakhil@marvell.com> References: <20220103150813.1694888-1-gakhil@marvell.com> <20220120162627.4155695-1-gakhil@marvell.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Proofpoint-ORIG-GUID: 3O8QAtTD3FCokTxXck5ogHTKBU35sVzH X-Proofpoint-GUID: 3O8QAtTD3FCokTxXck5ogHTKBU35sVzH X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.816,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-20_06,2022-01-20_01,2021-12-02_01 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 Hardware IP reassembly may be incomplete for multiple reasons like reassembly timeout reached, duplicate fragments, etc. To save application cycles to process these packets again, a new mbuf dynflag is added to show that the mbuf received is not reassembled properly. Now if this dynflag is set, application can retrieve corresponding chain of mbufs using mbuf dynfield set by the PMD. Now, it will be up to application to either drop those fragments or wait for more time. Signed-off-by: Akhil Goyal --- lib/ethdev/ethdev_driver.h | 8 ++++++++ lib/ethdev/rte_ethdev.c | 28 ++++++++++++++++++++++++++++ lib/ethdev/rte_ethdev.h | 21 +++++++++++++++++++++ lib/ethdev/version.map | 1 + 4 files changed, 58 insertions(+) diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h index a310001648..7499a4fbf5 100644 --- a/lib/ethdev/ethdev_driver.h +++ b/lib/ethdev/ethdev_driver.h @@ -1689,6 +1689,14 @@ int rte_eth_hairpin_queue_peer_unbind(uint16_t cur_port, uint16_t cur_queue, uint32_t direction); +/** + * @internal + * Register mbuf dynamic field and flag for IP reassembly incomplete case. + */ +__rte_internal +int +rte_eth_ip_reass_dynfield_register(int *field_offset, int *flag); + /* * Legacy ethdev API used internally by drivers. diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index 4bd31034a6..f6a155dceb 100644 --- a/lib/ethdev/rte_ethdev.c +++ b/lib/ethdev/rte_ethdev.c @@ -6554,6 +6554,34 @@ rte_eth_ip_reassembly_conf_get(uint16_t port_id, (*dev->dev_ops->ip_reassembly_conf_get)(dev, conf)); } +int +rte_eth_ip_reass_dynfield_register(int *field_offset, int *flag_offset) +{ + static const struct rte_mbuf_dynfield field_desc = { + .name = RTE_ETH_IP_REASS_DYNFIELD_NAME, + .size = sizeof(rte_eth_ip_reass_dynfield_t), + .align = __alignof__(rte_eth_ip_reass_dynfield_t), + }; + static const struct rte_mbuf_dynflag ip_reass_dynflag = { + .name = RTE_ETH_IP_REASS_INCOMPLETE_DYNFLAG_NAME, + }; + int offset; + + offset = rte_mbuf_dynfield_register(&field_desc); + if (offset < 0) + return -1; + if (field_offset != NULL) + *field_offset = offset; + + offset = rte_mbuf_dynflag_register(&ip_reass_dynflag); + if (offset < 0) + return -1; + if (flag_offset != NULL) + *flag_offset = offset; + + return 0; +} + RTE_LOG_REGISTER_DEFAULT(rte_eth_dev_logtype, INFO); RTE_INIT(ethdev_init_telemetry) diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h index 53af158bcb..a6b43bcf2c 100644 --- a/lib/ethdev/rte_ethdev.h +++ b/lib/ethdev/rte_ethdev.h @@ -5268,6 +5268,27 @@ __rte_experimental int rte_eth_ip_reassembly_conf_set(uint16_t port_id, struct rte_eth_ip_reass_params *conf); +#define RTE_ETH_IP_REASS_DYNFIELD_NAME "rte_eth_ip_reass_dynfield" +#define RTE_ETH_IP_REASS_INCOMPLETE_DYNFLAG_NAME "rte_eth_ip_reass_incomplete_dynflag" + +/** + * In case of IP reassembly offload failure, ol_flags in mbuf will be set + * with RTE_MBUF_F_RX_IPREASSEMBLY_INCOMPLETE and packets will be returned + * without alteration. The application can retrieve the attached fragments + * using mbuf dynamic field. + */ +typedef struct { + /** + * Next fragment packet. Application should fetch dynamic field of + * each fragment until a NULL is received and nb_frags is 0. + */ + struct rte_mbuf *next_frag; + /** Time spent(in ms) by HW in waiting for further fragments. */ + uint16_t time_spent; + /** Number of more fragments attached in mbuf dynamic fields. */ + uint16_t nb_frags; +} rte_eth_ip_reass_dynfield_t; + #include diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map index ad829dd47e..8b7578471a 100644 --- a/lib/ethdev/version.map +++ b/lib/ethdev/version.map @@ -283,6 +283,7 @@ INTERNAL { rte_eth_hairpin_queue_peer_bind; rte_eth_hairpin_queue_peer_unbind; rte_eth_hairpin_queue_peer_update; + rte_eth_ip_reass_dynfield_register; rte_eth_representor_id_get; rte_eth_switch_domain_alloc; rte_eth_switch_domain_free; -- 2.25.1