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 2CCA7A0542; Mon, 1 Aug 2022 16:28:22 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id BD7EC4067B; Mon, 1 Aug 2022 16:28:21 +0200 (CEST) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by mails.dpdk.org (Postfix) with ESMTP id E0FB24014F for ; Mon, 1 Aug 2022 16:28:20 +0200 (CEST) Received: from [192.168.1.39] (unknown [188.170.75.116]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by shelob.oktetlabs.ru (Postfix) with ESMTPSA id 901A6F1; Mon, 1 Aug 2022 17:28:18 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 901A6F1 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=oktetlabs.ru; s=default; t=1659364100; bh=Hzu2hdNsBJoiFxcoBczn9HtD+1Y1Iv+qIvQFETDNZOo=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=hGPK3mv04JMt2AC4ThX35v8TUHZt5/9uiJdHrC+iAlnxa7/iL/dFhmqOBDv46RtTa K8946Ky34bTInr/KeQOhj082RY9gjCgU4nm+NR3ncTAxGp/BWGCAtfrhaqxZgMmvuB B1vyk5FBuuh+5VMzBPsh88HQFTNi7fuM1W0o9Nz0= Message-ID: <41783e69-6d97-2d4c-a7b0-ce915b39400b@oktetlabs.ru> Date: Mon, 1 Aug 2022 17:28:17 +0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.11.0 Subject: Re: [PATCH v9 2/4] ethdev: introduce protocol hdr based buffer split Content-Language: en-US To: "Ding, Xuan" Cc: "dev@dpdk.org" , "stephen@networkplumber.org" , "Wang, YuanX" , Ray Kinsella , "Wu, WenxuanX" , "thomas@monjalon.net" , "Li, Xiaoyun" , "ferruh.yigit@xilinx.com" , "Singh, Aman Deep" , "Zhang, Yuying" , "Zhang, Qi Z" , "jerinjacobk@gmail.com" , "viacheslavo@nvidia.com" References: <20220303060136.36427-1-xuan.ding@intel.com> <20220613102550.241759-1-wenxuanx.wu@intel.com> <20220613102550.241759-3-wenxuanx.wu@intel.com> <7f8f4017-c924-9533-0914-3792c32b5804@oktetlabs.ru> From: Andrew Rybchenko In-Reply-To: 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 On 7/21/22 06:24, Ding, Xuan wrote: > Hi Andrew, > >> -----Original Message----- >> From: Andrew Rybchenko >> Sent: 2022年7月8日 23:01 >> To: Wu, WenxuanX ; thomas@monjalon.net; Li, >> Xiaoyun ; ferruh.yigit@xilinx.com; Singh, Aman Deep >> ; dev@dpdk.org; Zhang, Yuying >> ; Zhang, Qi Z ; >> jerinjacobk@gmail.com >> Cc: stephen@networkplumber.org; Ding, Xuan ; Wang, >> YuanX ; Ray Kinsella >> Subject: Re: [PATCH v9 2/4] ethdev: introduce protocol hdr based buffer split >> >> On 6/13/22 13:25, wenxuanx.wu@intel.com wrote: >>> From: Wenxuan Wu >>> >>> Currently, Rx buffer split supports length based split. With Rx queue >>> offload RTE_ETH_RX_OFFLOAD_BUFFER_SPLIT enabled and Rx packet >> segment >>> configured, PMD will be able to split the received packets into >>> multiple segments. >>> >>> However, length based buffer split is not suitable for NICs that do >>> split based on protocol headers. Given an arbitrarily variable length >>> in Rx packet segment, it is almost impossible to pass a fixed protocol >>> header to driver. Besides, the existence of tunneling results in the >>> composition of a packet is various, which makes the situation even worse. >>> >>> This patch extends current buffer split to support protocol header >>> based buffer split. A new proto_hdr field is introduced in the >>> reserved field of rte_eth_rxseg_split structure to specify protocol >>> header. The proto_hdr field defines the split position of packet, >>> splitting will always happens after the protocol header defined in the >>> Rx packet segment. When Rx queue offload >>> RTE_ETH_RX_OFFLOAD_BUFFER_SPLIT is enabled and corresponding protocol >>> header is configured, driver will split the ingress packets into multiple >> segments. >>> >>> struct rte_eth_rxseg_split { >>> >>> struct rte_mempool *mp; /* memory pools to allocate segment from */ >>> uint16_t length; /* segment maximal data length, >>> configures "split point" */ >>> uint16_t offset; /* data offset from beginning >>> of mbuf data buffer */ >>> uint32_t proto_hdr; /* inner/outer L2/L3/L4 protocol header, >>> configures "split point" */ >> >> There is a big problem here that using RTE_PTYPE_* defines I can't request split >> after either TCP or UDP header. > > Sorry, for some reason I missed your reply. > > Current RTE_PTYPE_* list all the tunnel and L2/L3/L4 protocol headers (both outer and inner). > Do you mean that we should support higher layer protocols after L4? > > I think tunnel and L2/L3/L4 protocol headers are enough. > In DPDK, we don't parse higher level protocols after L4. > And the higher layer protocols are richer, we can't list all of them. > What do you think? It looks like you don't get my point. You simply cannot say: RTE_PTYPE_L4_TCP | RTE_PTYPE_L4_UDP since it is numerically equal to RTE_PTYPE_L4_FRAG. May be the design limitation is acceptable. I have no strong opinion, but it must be clear for all that the limitation exists. >> >>> }; >>> >>> If both inner and outer L2/L3/L4 level protocol header split can be >>> supported by a PMD. Corresponding protocol header capability is >>> RTE_PTYPE_L2_ETHER, RTE_PTYPE_L3_IPV4, RTE_PTYPE_L3_IPV6, >>> RTE_PTYPE_L4_TCP, RTE_PTYPE_L4_UDP, RTE_PTYPE_L4_SCTP, >>> RTE_PTYPE_INNER_L2_ETHER, RTE_PTYPE_INNER_L3_IPV4, >>> RTE_PTYPE_INNER_L3_IPV6, RTE_PTYPE_INNER_L4_TCP, >> RTE_PTYPE_INNER_L4_UDP, RTE_PTYPE_INNER_L4_SCTP. >> >> I think there is no point to list above defines here if it is not the only supported >> defines. > > Yes, since we use a API to return the protocol header driver supported to split, > there is no need to list the incomplete RTE_PTYPE* here. Please see next version. > >> >>> >>> For example, let's suppose we configured the Rx queue with the >>> following segments: >>> seg0 - pool0, proto_hdr0=RTE_PTYPE_L3_IPV4, off0=2B >>> seg1 - pool1, proto_hdr1=RTE_PTYPE_L4_UDP, off1=128B >>> seg2 - pool2, off1=0B >>> >>> The packet consists of MAC_IPV4_UDP_PAYLOAD will be split like >>> following: >>> seg0 - ipv4 header @ RTE_PKTMBUF_HEADROOM + 2 in mbuf from pool0 >>> seg1 - udp header @ 128 in mbuf from pool1 >>> seg2 - payload @ 0 in mbuf from pool2 >> >> Sorry, but I still see no definition what should happen with, for example, ARP >> packet with above config. > > Thanks, because the following reply was not answered in v8, > the definition has not been added in v9 yet. > > " > Our NIC only supports to split the packets into two segments, > so there will be an exact match for the only one protocol header configured. Back to this > question, for the set of proto_hdrs configured, it can have two behaviors: > 1. The aggressive way is to split on longest match you mentioned, E.g. we configure split > on ETH-IPV4-TCP, when receives ETH-IPV4-UDP or ETH-IPV6, it can also split on ETH-IPV4 > or ETH. > 2. A more conservative way is to split only when the packets meet the all protocol headers > in the Rx packet segment. In the above situation, it will not do split for ETH-IPV4-UDP > and ETH-IPV6. > > I prefer the second behavior, because the split is usually for the inner most header and > payload, if it does not meet, the rest of the headers have no actual value. > " > > Hope to get your insights. > And we will update the doc to define the behavior in next version. I'm OK with (2) as well. Please, define it in the documentation. Also it must be clear which segment/mempool is used if a packet is not split.