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 1C2364331F; Mon, 13 Nov 2023 22:14:00 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E4882402B0; Mon, 13 Nov 2023 22:13:59 +0100 (CET) Received: from frasgout.his.huawei.com (frasgout.his.huawei.com [185.176.79.56]) by mails.dpdk.org (Postfix) with ESMTP id E65B6402AB for ; Mon, 13 Nov 2023 22:13:58 +0100 (CET) Received: from frapeml100007.china.huawei.com (unknown [172.18.147.207]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4SThrM5T2fz6JB6t for ; Tue, 14 Nov 2023 05:09:23 +0800 (CST) Received: from frapeml500007.china.huawei.com (7.182.85.172) by frapeml100007.china.huawei.com (7.182.85.133) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.31; Mon, 13 Nov 2023 22:13:58 +0100 Received: from frapeml500007.china.huawei.com ([7.182.85.172]) by frapeml500007.china.huawei.com ([7.182.85.172]) with mapi id 15.01.2507.031; Mon, 13 Nov 2023 22:13:57 +0100 From: Konstantin Ananyev To: Trevor Tao , "dev@dpdk.org" Subject: RE: [PATCH v5 2/2] examples/l3fwd: relax RX Offload with option Thread-Topic: [PATCH v5 2/2] examples/l3fwd: relax RX Offload with option Thread-Index: AQHaFkwwH6zw5A2kAUC+mopJxNFfrbB4v5VA Date: Mon, 13 Nov 2023 21:13:57 +0000 Message-ID: References: <20231113161135.125307-1-taozj888@163.com> <20231113161135.125307-3-taozj888@163.com> In-Reply-To: <20231113161135.125307-3-taozj888@163.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.81.190.147] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-CFilter-Loop: Reflected 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: >=20 > Ethdev port_id=3D0 requested Rx offloads 0xe does not match Rx offloads > capabilities 0x201d in rte_eth_dev_configure() >=20 > So to enable the l3fwd running in that environment, the Rx mode requireme= nt > can be relaxed to reflect the hardware feature reality here with an optio= n > relax_rx_offload, and the l3fwd can run smoothly then. > A warning msg would be provided to user in case it happens here. >=20 > On the other side, enabling the software cksum check in case missing the > hw support. >=20 > The relax action for rx cksum offload is just enabled when > relax_rx_offload is true which is false by default. >=20 > 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 | 24 ++++++++++++++++++++++++ > 4 files changed, 36 insertions(+), 4 deletions(-) >=20 > diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h > index b55855c932..e7ae0e5834 100644 > --- a/examples/l3fwd/l3fwd.h > +++ b/examples/l3fwd/l3fwd.h > @@ -159,7 +159,7 @@ send_single_packet(struct lcore_conf *qconf, >=20 > #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; >=20 > /* 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_MBUF_F_RX_IP_CKSUM_MASK) =3D=3D RTE_MBUF_F_RX_IP_CK= SUM_NONE) { Actually, we probably also need to check for RTE_MBUF_F_RX_IP_CKSUM_BAD, But that is a subject for another patch (fix actually). Acked-by: Konstantin Ananyev > + uint16_t actual_cksum, expected_cksum; > + actual_cksum =3D pkt->hdr_checksum; > + pkt->hdr_checksum =3D 0; > + expected_cksum =3D rte_ipv4_cksum(pkt); > + if (actual_cksum !=3D expected_cksum) > + return -2; > + } >=20 > /* > * 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 porti= d, >=20 > #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..4ee61e8d88 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 p= ortid, >=20 > #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; > } > diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c > index b42365ef1b..851e7e68f9 100644 > --- a/examples/l3fwd/main.c > +++ b/examples/l3fwd/main.c > @@ -74,6 +74,8 @@ static int numa_on =3D 1; /**< NUMA is enabled by defau= lt. */ > static int parse_ptype; /**< Parse packet type using rx callback, and */ > /**< disabled by default */ > static int disable_rss; /**< Disable the RX RSS mode */ > +static int relax_rx_offload; /**< Relax RX offload mode, and */ > + /**< disabled by default */ > static int per_port_pool; /**< Use separate buffer pools per port; disab= led */ > /**< by default */ >=20 > @@ -680,6 +682,7 @@ static const char short_options[] =3D > #define CMD_LINE_OPT_HASH_ENTRY_NUM "hash-entry-num" > #define CMD_LINE_OPT_PARSE_PTYPE "parse-ptype" > #define CMD_LINE_OPT_DISABLE_RSS "disable-rss" > +#define CMD_LINE_OPT_RELAX_RX_OFFLOAD "relax-rx-offload" > #define CMD_LINE_OPT_PER_PORT_POOL "per-port-pool" > #define CMD_LINE_OPT_MODE "mode" > #define CMD_LINE_OPT_EVENTQ_SYNC "eventq-sched" > @@ -708,6 +711,7 @@ enum { > CMD_LINE_OPT_HASH_ENTRY_NUM_NUM, > CMD_LINE_OPT_PARSE_PTYPE_NUM, > CMD_LINE_OPT_DISABLE_RSS_NUM, > + CMD_LINE_OPT_RELAX_RX_OFFLOAD_NUM, > CMD_LINE_OPT_RULE_IPV4_NUM, > CMD_LINE_OPT_RULE_IPV6_NUM, > CMD_LINE_OPT_ALG_NUM, > @@ -731,6 +735,7 @@ static const struct option lgopts[] =3D { > {CMD_LINE_OPT_MAX_PKT_LEN, 1, 0, CMD_LINE_OPT_MAX_PKT_LEN_NUM}, > {CMD_LINE_OPT_HASH_ENTRY_NUM, 1, 0, CMD_LINE_OPT_HASH_ENTRY_NUM_NUM}, > {CMD_LINE_OPT_PARSE_PTYPE, 0, 0, CMD_LINE_OPT_PARSE_PTYPE_NUM}, > + {CMD_LINE_OPT_RELAX_RX_OFFLOAD, 0, 0, CMD_LINE_OPT_RELAX_RX_OFFLOAD_NUM= }, > {CMD_LINE_OPT_DISABLE_RSS, 0, 0, CMD_LINE_OPT_DISABLE_RSS_NUM}, > {CMD_LINE_OPT_PER_PORT_POOL, 0, 0, CMD_LINE_OPT_PARSE_PER_PORT_POOL}, > {CMD_LINE_OPT_MODE, 1, 0, CMD_LINE_OPT_MODE_NUM}, > @@ -857,6 +862,11 @@ parse_args(int argc, char **argv) > parse_ptype =3D 1; > break; >=20 > + case CMD_LINE_OPT_RELAX_RX_OFFLOAD_NUM: > + printf("Relax rx offload mode is enabled\n"); > + relax_rx_offload =3D 1; > + break; > + > case CMD_LINE_OPT_DISABLE_RSS_NUM: > printf("Disable RX RSS\n"); > disable_rss =3D 1; > @@ -1278,6 +1288,20 @@ l3fwd_poll_resource_setup(void) > local_port_conf.rx_adv_conf.rss_conf.rss_hf); > } >=20 > + /* relax the rx offload requirement */ > + if ((local_port_conf.rxmode.offloads & dev_info.rx_offload_capa) !=3D > + 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_offload) { > + local_port_conf.rxmode.offloads &=3D dev_info.rx_offload_capa; > + printf("warning: modified the rx offload to 0x%"PRIx64" based on dev= ice" > + " capability\n", local_port_conf.rxmode.offloads); > + } > + } > + > ret =3D rte_eth_dev_configure(portid, nb_rx_queue, > (uint16_t)n_tx_queue, &local_port_conf); > if (ret < 0) > -- > 2.34.1