From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wi0-f181.google.com (mail-wi0-f181.google.com [209.85.212.181]) by dpdk.org (Postfix) with ESMTP id D82145A7A for ; Tue, 30 Jun 2015 10:43:44 +0200 (CEST) Received: by wiga1 with SMTP id a1so91699237wig.0 for ; Tue, 30 Jun 2015 01:43:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-type :content-transfer-encoding; bh=mCUjhEebKKI7H7rHvnoaMOaDg1ROWV290gUsSVlIfE4=; b=Q062wCjJOAn2yZi8M5o10XAgOBZv0D76FYyRxdty8uR2NPdOWWYusiipgRrV6q+fj/ rLXC9rZJ4evnXmZkH6R5dNFliB20qZakUg3/PbKP8BT2YT4qco9k6ocLjvA7hreske0e Ro0AYrsOnT3iMunfVpDUmlzkOqo0foC3/LCCbCYLiLDCAgP2IQsBiSkxbHqGPxNWcczn TwKhiiQyDQ+i5FPlNDymvbMVsp/TZRtyoBQuhy1z3i/8lPGLLKlOUkSPNRXa/buzinWt qWrYS2Za9pHCBXt5hj1EVmiHgmnUp0iTKT6zoJMX9n8WQ3ZhguNhzlzShX5DooCJ+525 W5+A== X-Gm-Message-State: ALoCoQlUHmVtaIxc8fSUi13HJjlwJsFYQZg1WgWiJj/YdDofQganNiplciPjhjoSrGRMo5TE0RqI X-Received: by 10.180.78.136 with SMTP id b8mr29609099wix.89.1435653824692; Tue, 30 Jun 2015 01:43:44 -0700 (PDT) Received: from [10.16.0.195] (6wind.net2.nerim.net. [213.41.151.210]) by mx.google.com with ESMTPSA id c7sm54250636wjb.19.2015.06.30.01.43.43 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jun 2015 01:43:44 -0700 (PDT) Message-ID: <559256B8.4080703@6wind.com> Date: Tue, 30 Jun 2015 10:43:36 +0200 From: Olivier MATZ User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.6.0 MIME-Version: 1.0 To: Helin Zhang , dev@dpdk.org References: <1434701661-9943-1-git-send-email-helin.zhang@intel.com> <1435024235-19483-1-git-send-email-helin.zhang@intel.com> <1435024235-19483-4-git-send-email-helin.zhang@intel.com> In-Reply-To: <1435024235-19483-4-git-send-email-helin.zhang@intel.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [dpdk-dev] [PATCH v8 03/18] mbuf: add definitions of unified packet types X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 30 Jun 2015 08:43:45 -0000 Hi Helin, This is greatly documented, thanks! Please find a small comment below. On 06/23/2015 03:50 AM, Helin Zhang wrote: > As there are only 6 bit flags in ol_flags for indicating packet > types, which is not enough to describe all the possible packet > types hardware can recognize. For example, i40e hardware can > recognize more than 150 packet types. Unified packet type is > composed of L2 type, L3 type, L4 type, tunnel type, inner L2 type, > inner L3 type and inner L4 type fields, and can be stored in > 'struct rte_mbuf' of 32 bits field 'packet_type'. > To avoid breaking ABI compatibility, all the changes would be > enabled by RTE_NEXT_ABI, which is disabled by default. > > [...] > diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h > index 0315561..0ee0c55 100644 > --- a/lib/librte_mbuf/rte_mbuf.h > +++ b/lib/librte_mbuf/rte_mbuf.h > @@ -201,6 +201,493 @@ extern "C" { > /* Use final bit of flags to indicate a control mbuf */ > #define CTRL_MBUF_FLAG (1ULL << 63) /**< Mbuf contains control data */ > > +#ifdef RTE_NEXT_ABI > +/* > + * 32 bits are divided into several fields to mark packet types. Note that > + * each field is indexical. > + * - Bit 3:0 is for L2 types. > + * - Bit 7:4 is for L3 or outer L3 (for tunneling case) types. > + * - Bit 11:8 is for L4 or outer L4 (for tunneling case) types. > + * - Bit 15:12 is for tunnel types. > + * - Bit 19:16 is for inner L2 types. > + * - Bit 23:20 is for inner L3 types. > + * - Bit 27:24 is for inner L4 types. > + * - Bit 31:28 is reserved. > + * > + * To be compatible with Vector PMD, RTE_PTYPE_L3_IPV4, RTE_PTYPE_L3_IPV4_EXT, > + * RTE_PTYPE_L3_IPV6, RTE_PTYPE_L3_IPV6_EXT, RTE_PTYPE_L4_TCP, RTE_PTYPE_L4_UDP > + * and RTE_PTYPE_L4_SCTP should be kept as below in a contiguous 7 bits. > + * > + * Note that L3 types values are selected for checking IPV4/IPV6 header from > + * performance point of view. Reading annotations of RTE_ETH_IS_IPV4_HDR and > + * RTE_ETH_IS_IPV6_HDR is needed for any future changes of L3 type values. > + * > + * Note that the packet types of the same packet recognized by different > + * hardware may be different, as different hardware may have different > + * capability of packet type recognition. > + * > + * examples: > + * <'ether type'=0x0800 > + * | 'version'=4, 'protocol'=0x29 > + * | 'version'=6, 'next header'=0x3A > + * | 'ICMPv6 header'> > + * will be recognized on i40e hardware as packet type combination of, > + * RTE_PTYPE_L2_MAC | > + * RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | > + * RTE_PTYPE_TUNNEL_IP | > + * RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN | > + * RTE_PTYPE_INNER_L4_ICMP. > + * > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=0x2F > + * | 'GRE header' > + * | 'version'=6, 'next header'=0x11 > + * | 'UDP header'> > + * will be recognized on i40e hardware as packet type combination of, > + * RTE_PTYPE_L2_MAC | > + * RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | > + * RTE_PTYPE_TUNNEL_GRENAT | > + * RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN | > + * RTE_PTYPE_INNER_L4_UDP. > + */ > +#define RTE_PTYPE_UNKNOWN 0x00000000 > +/** > + * MAC (Media Access Control) packet type. > + * It is used for outer packet for tunneling cases. > + * > + * Packet format: > + * <'ether type'=[0x0800|0x86DD|others]> > + */ > +#define RTE_PTYPE_L2_MAC 0x00000001 I'm wondering if RTE_PTYPE_L2_ETHER is not a better name? > +/** > + * MAC (Media Access Control) packet type for time sync. > + * > + * Packet format: > + * <'ether type'=0x88F7> > + */ > +#define RTE_PTYPE_L2_MAC_TIMESYNC 0x00000002 > +/** > + * ARP (Address Resolution Protocol) packet type. > + * > + * Packet format: > + * <'ether type'=0x0806> > + */ > +#define RTE_PTYPE_L2_ARP 0x00000003 > +/** > + * LLDP (Link Layer Discovery Protocol) packet type. > + * > + * Packet format: > + * <'ether type'=0x88CC> > + */ > +#define RTE_PTYPE_L2_LLDP 0x00000004 Maybe ETHER should appear in these names too, what do you think? > +/** > + * Mask of layer 2 packet types. > + * It is used for outer packet for tunneling cases. > + */ > +#define RTE_PTYPE_L2_MASK 0x0000000f > +/** > + * IP (Internet Protocol) version 4 packet type. > + * It is used for outer packet for tunneling cases, and does not contain any > + * header option. > + * > + * Packet format: > + * <'ether type'=0x0800 > + * | 'version'=4, 'ihl'=5> > + */ > +#define RTE_PTYPE_L3_IPV4 0x00000010 > +/** > + * IP (Internet Protocol) version 4 packet type. > + * It is used for outer packet for tunneling cases, and contains header > + * options. > + * > + * Packet format: > + * <'ether type'=0x0800 > + * | 'version'=4, 'ihl'=[6-15], 'options'> > + */ > +#define RTE_PTYPE_L3_IPV4_EXT 0x00000030 > +/** > + * IP (Internet Protocol) version 6 packet type. > + * It is used for outer packet for tunneling cases, and does not contain any > + * extension header. > + * > + * Packet format: > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=0x3B> > + */ > +#define RTE_PTYPE_L3_IPV6 0x00000040 > +/** > + * IP (Internet Protocol) version 4 packet type. > + * It is used for outer packet for tunneling cases, and may or maynot contain > + * header options. > + * > + * Packet format: > + * <'ether type'=0x0800 > + * | 'version'=4, 'ihl'=[5-15], <'options'>> > + */ > +#define RTE_PTYPE_L3_IPV4_EXT_UNKNOWN 0x00000090 > +/** > + * IP (Internet Protocol) version 6 packet type. > + * It is used for outer packet for tunneling cases, and contains extension > + * headers. > + * > + * Packet format: > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=[0x0|0x2B|0x2C|0x32|0x33|0x3C|0x87], > + * 'extension headers'> > + */ > +#define RTE_PTYPE_L3_IPV6_EXT 0x000000c0 > +/** > + * IP (Internet Protocol) version 6 packet type. > + * It is used for outer packet for tunneling cases, and may or maynot contain > + * extension headers. > + * > + * Packet format: > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=[0x3B|0x0|0x2B|0x2C|0x32|0x33|0x3C|0x87], > + * <'extension headers'>> > + */ > +#define RTE_PTYPE_L3_IPV6_EXT_UNKNOWN 0x000000e0 > +/** > + * Mask of layer 3 packet types. > + * It is used for outer packet for tunneling cases. > + */ > +#define RTE_PTYPE_L3_MASK 0x000000f0 > +/** > + * TCP (Transmission Control Protocol) packet type. > + * It is used for outer packet for tunneling cases. > + * > + * Packet format: > + * <'ether type'=0x0800 > + * | 'version'=4, 'protocol'=6, 'MF'=0> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=6> > + */ > +#define RTE_PTYPE_L4_TCP 0x00000100 > +/** > + * UDP (User Datagram Protocol) packet type. > + * It is used for outer packet for tunneling cases. > + * > + * Packet format: > + * <'ether type'=0x0800 > + * | 'version'=4, 'protocol'=17, 'MF'=0> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=17> > + */ > +#define RTE_PTYPE_L4_UDP 0x00000200 > +/** > + * Fragmented IP (Internet Protocol) packet type. > + * It is used for outer packet for tunneling cases. > + * > + * It refers to those packets of any IP types, which can be recognized as > + * fragmented. A fragmented packet cannot be recognized as any other L4 types > + * (RTE_PTYPE_L4_TCP, RTE_PTYPE_L4_UDP, RTE_PTYPE_L4_SCTP, RTE_PTYPE_L4_ICMP, > + * RTE_PTYPE_L4_NONFRAG). > + * > + * Packet format: > + * <'ether type'=0x0800 > + * | 'version'=4, 'MF'=1> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=44> > + */ > +#define RTE_PTYPE_L4_FRAG 0x00000300 > +/** > + * SCTP (Stream Control Transmission Protocol) packet type. > + * It is used for outer packet for tunneling cases. > + * > + * Packet format: > + * <'ether type'=0x0800 > + * | 'version'=4, 'protocol'=132, 'MF'=0> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=132> > + */ > +#define RTE_PTYPE_L4_SCTP 0x00000400 > +/** > + * ICMP (Internet Control Message Protocol) packet type. > + * It is used for outer packet for tunneling cases. > + * > + * Packet format: > + * <'ether type'=0x0800 > + * | 'version'=4, 'protocol'=1, 'MF'=0> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=1> > + */ > +#define RTE_PTYPE_L4_ICMP 0x00000500 > +/** > + * Non-fragmented IP (Internet Protocol) packet type. > + * It is used for outer packet for tunneling cases. > + * > + * It refers to those packets of any IP types, while cannot be recognized as > + * any of above L4 types (RTE_PTYPE_L4_TCP, RTE_PTYPE_L4_UDP, > + * RTE_PTYPE_L4_FRAG, RTE_PTYPE_L4_SCTP, RTE_PTYPE_L4_ICMP). > + * > + * Packet format: > + * <'ether type'=0x0800 > + * | 'version'=4, 'protocol'!=[6|17|132|1], 'MF'=0> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'!=[6|17|44|132|1]> > + */ > +#define RTE_PTYPE_L4_NONFRAG 0x00000600 > +/** > + * Mask of layer 4 packet types. > + * It is used for outer packet for tunneling cases. > + */ > +#define RTE_PTYPE_L4_MASK 0x00000f00 > +/** > + * IP (Internet Protocol) in IP (Internet Protocol) tunneling packet type. > + * > + * Packet format: > + * <'ether type'=0x0800 > + * | 'version'=4, 'protocol'=[4|41]> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=[4|41]> > + */ > +#define RTE_PTYPE_TUNNEL_IP 0x00001000 > +/** > + * GRE (Generic Routing Encapsulation) tunneling packet type. > + * > + * Packet format: > + * <'ether type'=0x0800 > + * | 'version'=4, 'protocol'=47> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=47> > + */ > +#define RTE_PTYPE_TUNNEL_GRE 0x00002000 > +/** > + * VXLAN (Virtual eXtensible Local Area Network) tunneling packet type. > + * > + * Packet format: > + * <'ether type'=0x0800 > + * | 'version'=4, 'protocol'=17 > + * | 'destination port'=4798> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=17 > + * | 'destination port'=4798> > + */ > +#define RTE_PTYPE_TUNNEL_VXLAN 0x00003000 > +/** > + * NVGRE (Network Virtualization using Generic Routing Encapsulation) tunneling > + * packet type. > + * > + * Packet format: > + * <'ether type'=0x0800 > + * | 'version'=4, 'protocol'=47 > + * | 'protocol type'=0x6558> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=47 > + * | 'protocol type'=0x6558'> > + */ > +#define RTE_PTYPE_TUNNEL_NVGRE 0x00004000 > +/** > + * GENEVE (Generic Network Virtualization Encapsulation) tunneling packet type. > + * > + * Packet format: > + * <'ether type'=0x0800 > + * | 'version'=4, 'protocol'=17 > + * | 'destination port'=6081> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=17 > + * | 'destination port'=6081> > + */ > +#define RTE_PTYPE_TUNNEL_GENEVE 0x00005000 > +/** > + * Tunneling packet type of Teredo, VXLAN (Virtual eXtensible Local Area > + * Network) or GRE (Generic Routing Encapsulation) could be recognized as this > + * packet type, if they can not be recognized independently as of hardware > + * capability. > + */ > +#define RTE_PTYPE_TUNNEL_GRENAT 0x00006000 > +/** > + * Mask of tunneling packet types. > + */ > +#define RTE_PTYPE_TUNNEL_MASK 0x0000f000 > +/** > + * MAC (Media Access Control) packet type. > + * It is used for inner packet type only. > + * > + * Packet format (inner only): > + * <'ether type'=[0x800|0x86DD]> > + */ > +#define RTE_PTYPE_INNER_L2_MAC 0x00010000 > +/** > + * MAC (Media Access Control) packet type with VLAN (Virtual Local Area > + * Network) tag. > + * > + * Packet format (inner only): > + * <'ether type'=[0x800|0x86DD], vlan=[1-4095]> > + */ > +#define RTE_PTYPE_INNER_L2_MAC_VLAN 0x00020000 > +/** > + * Mask of inner layer 2 packet types. > + */ > +#define RTE_PTYPE_INNER_L2_MASK 0x000f0000 > +/** > + * IP (Internet Protocol) version 4 packet type. > + * It is used for inner packet only, and does not contain any header option. > + * > + * Packet format (inner only): > + * <'ether type'=0x0800 > + * | 'version'=4, 'ihl'=5> > + */ > +#define RTE_PTYPE_INNER_L3_IPV4 0x00100000 > +/** > + * IP (Internet Protocol) version 4 packet type. > + * It is used for inner packet only, and contains header options. > + * > + * Packet format (inner only): > + * <'ether type'=0x0800 > + * | 'version'=4, 'ihl'=[6-15], 'options'> > + */ > +#define RTE_PTYPE_INNER_L3_IPV4_EXT 0x00200000 > +/** > + * IP (Internet Protocol) version 6 packet type. > + * It is used for inner packet only, and does not contain any extension header. > + * > + * Packet format (inner only): > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=0x3B> > + */ > +#define RTE_PTYPE_INNER_L3_IPV6 0x00300000 > +/** > + * IP (Internet Protocol) version 4 packet type. > + * It is used for inner packet only, and may or maynot contain header options. > + * > + * Packet format (inner only): > + * <'ether type'=0x0800 > + * | 'version'=4, 'ihl'=[5-15], <'options'>> > + */ > +#define RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN 0x00400000 > +/** > + * IP (Internet Protocol) version 6 packet type. > + * It is used for inner packet only, and contains extension headers. > + * > + * Packet format (inner only): > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=[0x0|0x2B|0x2C|0x32|0x33|0x3C|0x87], > + * 'extension headers'> > + */ > +#define RTE_PTYPE_INNER_L3_IPV6_EXT 0x00500000 > +/** > + * IP (Internet Protocol) version 6 packet type. > + * It is used for inner packet only, and may or maynot contain extension > + * headers. > + * > + * Packet format (inner only): > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=[0x3B|0x0|0x2B|0x2C|0x32|0x33|0x3C|0x87], > + * <'extension headers'>> > + */ > +#define RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN 0x00600000 > +/** > + * Mask of inner layer 3 packet types. > + */ > +#define RTE_PTYPE_INNER_INNER_L3_MASK 0x00f00000 > +/** > + * TCP (Transmission Control Protocol) packet type. > + * It is used for inner packet only. > + * > + * Packet format (inner only): > + * <'ether type'=0x0800 > + * | 'version'=4, 'protocol'=6, 'MF'=0> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=6> > + */ > +#define RTE_PTYPE_INNER_L4_TCP 0x01000000 > +/** > + * UDP (User Datagram Protocol) packet type. > + * It is used for inner packet only. > + * > + * Packet format (inner only): > + * <'ether type'=0x0800 > + * | 'version'=4, 'protocol'=17, 'MF'=0> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=17> > + */ > +#define RTE_PTYPE_INNER_L4_UDP 0x02000000 > +/** > + * Fragmented IP (Internet Protocol) packet type. > + * It is used for inner packet only, and may or maynot have layer 4 packet. > + * > + * Packet format (inner only): > + * <'ether type'=0x0800 > + * | 'version'=4, 'MF'=1> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=44> > + */ > +#define RTE_PTYPE_INNER_L4_FRAG 0x03000000 > +/** > + * SCTP (Stream Control Transmission Protocol) packet type. > + * It is used for inner packet only. > + * > + * Packet format (inner only): > + * <'ether type'=0x0800 > + * | 'version'=4, 'protocol'=132, 'MF'=0> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=132> > + */ > +#define RTE_PTYPE_INNER_L4_SCTP 0x04000000 > +/** > + * ICMP (Internet Control Message Protocol) packet type. > + * It is used for inner packet only. > + * > + * Packet format (inner only): > + * <'ether type'=0x0800 > + * | 'version'=4, 'protocol'=1, 'MF'=0> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'=1> > + */ > +#define RTE_PTYPE_INNER_L4_ICMP 0x05000000 > +/** > + * Non-fragmented IP (Internet Protocol) packet type. > + * It is used for inner packet only, and may or maynot have other unknown layer > + * 4 packet types. > + * > + * Packet format (inner only): > + * <'ether type'=0x0800 > + * | 'version'=4, 'protocol'!=[6|17|132|1], 'MF'=0> > + * or, > + * <'ether type'=0x86DD > + * | 'version'=6, 'next header'!=[6|17|44|132|1]> > + */ > +#define RTE_PTYPE_INNER_L4_NONFRAG 0x06000000 > +/** > + * Mask of inner layer 4 packet types. > + */ > +#define RTE_PTYPE_INNER_L4_MASK 0x0f000000 > + > +/** > + * Check if the (outer) L3 header is IPv4. To avoid comparing IPv4 types one by > + * one, bit 4 is selected to be used for IPv4 only. Then checking bit 4 can > + * determin if it is an IPV4 packet. > + */ > +#define RTE_ETH_IS_IPV4_HDR(ptype) ((ptype) & RTE_PTYPE_L3_IPV4) > + > +/** > + * Check if the (outer) L3 header is IPv4. To avoid comparing IPv4 types one by > + * one, bit 6 is selected to be used for IPv4 only. Then checking bit 6 can > + * determin if it is an IPV4 packet. > + */ > +#define RTE_ETH_IS_IPV6_HDR(ptype) ((ptype) & RTE_PTYPE_L3_IPV6) > + > +/* Check if it is a tunneling packet */ > +#define RTE_ETH_IS_TUNNEL_PKT(ptype) ((ptype) & RTE_PTYPE_TUNNEL_MASK) > +#endif /* RTE_NEXT_ABI */ > + > /** > * Get the name of a RX offload flag > * >