From patchwork Mon Oct 2 08:53:41 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trevor Tao X-Patchwork-Id: 132254 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 67FD54269E; Mon, 2 Oct 2023 10:54:05 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id DFF9840284; Mon, 2 Oct 2023 10:54:04 +0200 (CEST) Received: from m12.mail.163.com (m12.mail.163.com [220.181.12.217]) by mails.dpdk.org (Postfix) with ESMTP id F1DCA4003C for ; Mon, 2 Oct 2023 10:54:02 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:Subject:Date:Message-Id:MIME-Version; bh=9mL96 cvZSefythcENV/deCsRR/cEiNsNn6cOglwabCQ=; b=dVJHQ84MAUlJZt5nro8+X n4XjKEsgafjaMBJ4GLSs8d6MrMxP+OojAU9M4STdK4HKgSEK4VOUdEK4gvllpUK9 XsOiQ9YzJUmeqJEWJRDBAehdqy48ZLNzJDq4w8eL339txCreHliUYfGKYOsgtVf2 OGeOoY6o85nr1olLUACNss= Received: from u2204.. (unknown [112.24.230.70]) by zwqz-smtp-mta-g5-3 (Coremail) with SMTP id _____wAXOIoghRplSW2oDg--.38562S3; Mon, 02 Oct 2023 16:53:58 +0800 (CST) From: Trevor Tao To: dev@dpdk.org Cc: Trevor Tao Subject: [PATCH v1 2/3] examples/l3fwd: relax the Offload requirement Date: Mon, 2 Oct 2023 08:53:41 +0000 Message-Id: <20231002085342.934130-2-taozj888@163.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231002085342.934130-1-taozj888@163.com> References: <20231002085342.934130-1-taozj888@163.com> MIME-Version: 1.0 X-CM-TRANSID: _____wAXOIoghRplSW2oDg--.38562S3 X-Coremail-Antispam: 1Uf129KBjvJXoWxWFy8ZFWxGryfZr4fGr43GFg_yoWrCFy3pa nrKrs7Xrn3Zry3XF1fAa1furnxWr18ur1DCrn5Aw17t39rA34kJFWUtFy5uFW2ya4kCrZx ZFWrWrW5KF18A3JanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0JUTWlDUUUUU= X-Originating-IP: [112.24.230.70] X-CM-SenderInfo: hwdr6yqyyyqiywtou0bp/xtbBlwf8x2I0afUVtAAAsA 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 Now the port Rx offload mode is set to RTE_ETH_RX_OFFLOAD_CHECKSUM by default, but some hw and/or virtual interface does not support the offload mode presupposed, e.g., some virtio interfaces in the cloud may only partly support RTE_ETH_RX_OFFLOAD_UDP_CKSUM/ RTE_ETH_RX_OFFLOAD_TCP_CKSUM, but not RTE_ETH_RX_OFFLOAD_IPV4_CKSUM, and the error msg here: Ethdev port_id=0 requested Rx offloads 0xe does not match Rx offloads capabilities 0x201d in rte_eth_dev_configure() So to enable the l3fwd running in that environment, the Rx mode requirement can be relaxed to reflect the hardware feature reality here, and the l3fwd can run smoothly then. A warning msg would be provided to user in case it happens here. On the other side, enabling the software cksum check in case missing the hw support. The relax action for rx cksum offload is just enabled when relax_rx_mode is true which is false by default. Signed-off-by: Trevor Tao --- examples/l3fwd/l3fwd.h | 12 ++++++++++-- examples/l3fwd/l3fwd_em.h | 2 +- examples/l3fwd/l3fwd_lpm.h | 2 +- examples/l3fwd/main.c | 14 ++++++++++++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h index b55855c932..fd98ad3373 100644 --- a/examples/l3fwd/l3fwd.h +++ b/examples/l3fwd/l3fwd.h @@ -159,7 +159,7 @@ send_single_packet(struct lcore_conf *qconf, #ifdef DO_RFC_1812_CHECKS static inline int -is_valid_ipv4_pkt(struct rte_ipv4_hdr *pkt, uint32_t link_len) +is_valid_ipv4_pkt(struct rte_ipv4_hdr *pkt, uint32_t link_len, uint64_t ol_flags) { /* From http://www.rfc-editor.org/rfc/rfc1812.txt section 5.2.2 */ /* @@ -170,7 +170,15 @@ is_valid_ipv4_pkt(struct rte_ipv4_hdr *pkt, uint32_t link_len) return -1; /* 2. The IP checksum must be correct. */ - /* this is checked in H/W */ + /* if this is not checked in H/W, check it. */ + if ((ol_flags & RTE_ETH_RX_OFFLOAD_IPV4_CKSUM) == 0) { + uint16_t actual_cksum, expected_cksum; + actual_cksum = pkt->hdr_checksum; + pkt->hdr_checksum = 0; + expected_cksum = rte_ipv4_cksum(pkt); + if (actual_cksum != expected_cksum) + return -2; + } /* * 3. The IP version number must be 4. If the version number is not 4 diff --git a/examples/l3fwd/l3fwd_em.h b/examples/l3fwd/l3fwd_em.h index 7d051fc076..1fee2e2e6c 100644 --- a/examples/l3fwd/l3fwd_em.h +++ b/examples/l3fwd/l3fwd_em.h @@ -20,7 +20,7 @@ l3fwd_em_handle_ipv4(struct rte_mbuf *m, uint16_t portid, #ifdef DO_RFC_1812_CHECKS /* Check to make sure the packet is valid (RFC1812) */ - if (is_valid_ipv4_pkt(ipv4_hdr, m->pkt_len) < 0) { + if (is_valid_ipv4_pkt(ipv4_hdr, m->pkt_len, m->ol_flags) < 0) { rte_pktmbuf_free(m); return BAD_PORT; } diff --git a/examples/l3fwd/l3fwd_lpm.h b/examples/l3fwd/l3fwd_lpm.h index c61b969584..5ddae7da0f 100644 --- a/examples/l3fwd/l3fwd_lpm.h +++ b/examples/l3fwd/l3fwd_lpm.h @@ -22,7 +22,7 @@ l3fwd_lpm_simple_forward(struct rte_mbuf *m, uint16_t portid, #ifdef DO_RFC_1812_CHECKS /* Check to make sure the packet is valid (RFC1812) */ - if (is_valid_ipv4_pkt(ipv4_hdr, m->pkt_len) < 0) { + if (is_valid_ipv4_pkt(ipv4_hdr, m->pkt_len) < 0, m->ol_flags) { rte_pktmbuf_free(m); return; } diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c index 2c8f528d00..a48ae7f62b 100644 --- a/examples/l3fwd/main.c +++ b/examples/l3fwd/main.c @@ -1284,6 +1284,20 @@ l3fwd_poll_resource_setup(void) local_port_conf.rx_adv_conf.rss_conf.rss_hf); } + /* relax the rx offload requirement */ + if ((local_port_conf.rxmode.offloads & dev_info.rx_offload_capa) != + local_port_conf.rxmode.offloads) { + printf("Port %u requested Rx offloads 0x%"PRIx64" does not" + " match Rx offloads capabilities 0x%"PRIx64"\n", + portid, local_port_conf.rxmode.offloads, + dev_info.rx_offload_capa); + if (relax_rx_mode) { + local_port_conf.rxmode.offloads &= dev_info.rx_offload_capa; + printf("warning: modified the rx offload to 0x%"PRIx64" based on device" + " capability\n", local_port_conf.rxmode.offloads); + } + } + ret = rte_eth_dev_configure(portid, nb_rx_queue, (uint16_t)n_tx_queue, &local_port_conf); if (ret < 0)