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 C635A42338; Mon, 9 Oct 2023 11:03:15 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 56A7340282; Mon, 9 Oct 2023 11:03:15 +0200 (CEST) Received: from forward502c.mail.yandex.net (forward502c.mail.yandex.net [178.154.239.210]) by mails.dpdk.org (Postfix) with ESMTP id C255A4026B for ; Mon, 9 Oct 2023 11:03:13 +0200 (CEST) Received: from mail-nwsmtp-smtp-production-main-19.sas.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-19.sas.yp-c.yandex.net [IPv6:2a02:6b8:c14:4081:0:640:557:0]) by forward502c.mail.yandex.net (Yandex) with ESMTP id 2C34D5ED99; Mon, 9 Oct 2023 12:03:13 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-19.sas.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id B3YFWm0DXuQ0-WJMnMdeL; Mon, 09 Oct 2023 12:03:12 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1696842192; bh=PMJCK5zNUx0IHpufIzDrOHX1gkigN0igxyBNyMrvPJE=; h=In-Reply-To:From:Date:References:To:Subject:Message-ID; b=jghtOd2nh5boGaHTCg09UubY7yEZF+gp8bk1hFjy2xzUqD+dNwQVv2R8knoR8cKpV LqGdT02U5fJIionHCHuB12qW1lC1ifi7zb/qEUkac41OSyzRDgI/Z+3cMgBO8hXCwx DIV+rAjBM4o2qXwJ/n2ZrIC3DAloZd3yeluu/PFQ= Authentication-Results: mail-nwsmtp-smtp-production-main-19.sas.yp-c.yandex.net; dkim=pass header.i=@yandex.ru Message-ID: <47cddf82-ee35-473c-aa5f-f5bde64ea4e6@yandex.ru> Date: Mon, 9 Oct 2023 10:03:11 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v1 2/3] examples/l3fwd: relax the Offload requirement Content-Language: en-US, ru-RU To: Trevor Tao , dev@dpdk.org References: <20231002085342.934130-1-taozj888@163.com> <20231002085342.934130-2-taozj888@163.com> From: Konstantin Ananyev In-Reply-To: <20231002085342.934130-2-taozj888@163.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit 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 02.10.2023 09:53, Trevor Tao пишет: > 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) { Typo, pls fix. > 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) { Ok, but we relax only IP cksum. Though l3fwd tries to enable IP/TCP/UDP cksum. What if TCP/UDP is not supported, should we allow it or fail? > + 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) if you going to submit new version, pls don't forget to bump the version number of the patch.