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 0125346012; Wed, 8 Jan 2025 03:58:33 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 8C94540150; Wed, 8 Jan 2025 03:58:33 +0100 (CET) Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by mails.dpdk.org (Postfix) with ESMTP id BBAD44014F for ; Wed, 8 Jan 2025 03:58:31 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.88.105]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4YSXbW0RrWz11Rw2; Wed, 8 Jan 2025 10:55:35 +0800 (CST) Received: from kwepemf500004.china.huawei.com (unknown [7.202.181.242]) by mail.maildlp.com (Postfix) with ESMTPS id 8195E140132; Wed, 8 Jan 2025 10:58:29 +0800 (CST) Received: from localhost.localdomain (10.28.79.22) by kwepemf500004.china.huawei.com (7.202.181.242) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Wed, 8 Jan 2025 10:58:28 +0800 From: Jie Hai To: , , , Aman Singh CC: , , , Subject: [PATCH] app/testpmd: add ipv6 extension header parse Date: Wed, 8 Jan 2025 10:46:32 +0800 Message-ID: <20250108024632.12152-1-haijie1@huawei.com> X-Mailer: git-send-email 2.22.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.28.79.22] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To kwepemf500004.china.huawei.com (7.202.181.242) 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 This patch support parse ipv6 extension header, and support TSO for ipv6tcp packets with extension header. Signed-off-by: Jie Hai --- app/test-pmd/csumonly.c | 47 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c index 2246c22e8e56..a7b11490fe27 100644 --- a/app/test-pmd/csumonly.c +++ b/app/test-pmd/csumonly.c @@ -124,14 +124,59 @@ parse_ipv4(struct rte_ipv4_hdr *ipv4_hdr, struct testpmd_offload_info *info) info->l4_len = 0; } +static uint16_t +parse_ipv6_ext(struct rte_ipv6_hdr *ipv6_hdr, uint32_t *off) +{ + struct ext_hdr { + uint8_t next_hdr; + uint8_t len; + }; + struct ext_hdr *xh; + uint16_t proto; + char *xh_fst; + uint16_t i; + + proto = ipv6_hdr->proto; + xh_fst = (char *)ipv6_hdr + sizeof(*ipv6_hdr); +#define MAX_EXT_HDRS 9 + for (i = 0; i < MAX_EXT_HDRS; i++) { + switch (proto) { + case IPPROTO_HOPOPTS: + case IPPROTO_ROUTING: + case IPPROTO_DSTOPTS: + xh = (struct ext_hdr *)(xh_fst + *off); + *off += (xh->len + 1) * 8; + proto = xh->next_hdr; + break; + case IPPROTO_AH: + xh = (struct ext_hdr *)(xh_fst + *off); + *off += (xh->len + 2) * 4; + proto = xh->next_hdr; + break; + case IPPROTO_FRAGMENT: + xh = (struct ext_hdr *)(xh_fst + *off); + *off += 8; + proto = xh->next_hdr; + return proto; /* this is always the last ext hdr */ + case IPPROTO_NONE: + return proto; + default: + return proto; + } + } + return proto; +} + /* Parse an IPv6 header to fill l3_len, l4_len, and l4_proto */ static void parse_ipv6(struct rte_ipv6_hdr *ipv6_hdr, struct testpmd_offload_info *info) { struct rte_tcp_hdr *tcp_hdr; + uint32_t off = 0; info->l3_len = sizeof(struct rte_ipv6_hdr); - info->l4_proto = ipv6_hdr->proto; + info->l4_proto = parse_ipv6_ext(ipv6_hdr, &off); + info->l3_len += off; /* only fill l4_len for TCP, it's useful for TSO */ if (info->l4_proto == IPPROTO_TCP) { -- 2.22.0