From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id 6BD1211C5 for ; Fri, 3 Jul 2015 03:31:03 +0200 (CEST) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga101.jf.intel.com with ESMTP; 02 Jul 2015 18:31:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,396,1432623600"; d="scan'208";a="739693346" Received: from pgsmsx101.gar.corp.intel.com ([10.221.44.78]) by fmsmga001.fm.intel.com with ESMTP; 02 Jul 2015 18:31:01 -0700 Received: from shsmsx102.ccr.corp.intel.com (10.239.4.154) by PGSMSX101.gar.corp.intel.com (10.221.44.78) with Microsoft SMTP Server (TLS) id 14.3.224.2; Fri, 3 Jul 2015 09:30:58 +0800 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.129]) by shsmsx102.ccr.corp.intel.com ([169.254.2.165]) with mapi id 14.03.0224.002; Fri, 3 Jul 2015 09:30:57 +0800 From: "Zhang, Helin" To: Olivier MATZ , "dev@dpdk.org" Thread-Topic: [PATCH v8 03/18] mbuf: add definitions of unified packet types Thread-Index: AQHQsxDmL9O8qvdcZ0WV4eRuWIoZXp3HZdeAgAABygCAAY/tIA== Date: Fri, 3 Jul 2015 01:30:56 +0000 Message-ID: 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> <559256B8.4080703@6wind.com> <5595050C.2060909@6wind.com> In-Reply-To: <5595050C.2060909@6wind.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 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: Fri, 03 Jul 2015 01:31:04 -0000 > -----Original Message----- > From: Olivier MATZ [mailto:olivier.matz@6wind.com] > Sent: Thursday, July 2, 2015 5:32 PM > To: Zhang, Helin; dev@dpdk.org > Cc: Cao, Waterman; Liang, Cunming; Liu, Jijiang; Ananyev, Konstantin; Ric= hardson, > Bruce; yongwang@vmware.com; Wu, Jingjing > Subject: Re: [PATCH v8 03/18] mbuf: add definitions of unified packet typ= es >=20 > Hi Helin, >=20 > On 07/02/2015 03:30 AM, Zhang, Helin wrote: > > Hi Oliver > > > > Thanks for your helps! > > > >> -----Original Message----- > >> From: Olivier MATZ [mailto:olivier.matz@6wind.com] > >> Sent: Tuesday, June 30, 2015 4:44 PM > >> To: Zhang, Helin; dev@dpdk.org > >> Cc: Cao, Waterman; Liang, Cunming; Liu, Jijiang; Ananyev, Konstantin; > >> Richardson, Bruce; yongwang@vmware.com; Wu, Jingjing > >> Subject: Re: [PATCH v8 03/18] mbuf: add definitions of unified packet > >> types > >> > >> 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 b= its. > >>> + * > >>> + * 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'=3D0x0800 > >>> + * | 'version'=3D4, 'protocol'=3D0x29 > >>> + * | 'version'=3D6, 'next header'=3D0x3A > >>> + * | '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'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D0x2F > >>> + * | 'GRE header' > >>> + * | 'version'=3D6, 'next header'=3D0x11 > >>> + * | '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'=3D[0x0800|0x86DD|others]> */ > >>> +#define RTE_PTYPE_L2_MAC 0x00000001 > >> > >> I'm wondering if RTE_PTYPE_L2_ETHER is not a better name? > > Ethernet includes both Data Link Layer and Physical Layer, while MAC > > is for Data Link Layer only. I would prefer to keep 'MAC' in the names,= rather > than 'ether'. > > Any opinions from others? >=20 > Just to precise what I'm saying: MAC is the interface between the logical= link and > the physical layer. It is different depending on the physical media (Ethe= rnet, > Token Ring, WLAN, ...). > Every packet has a MAC layer and I think "MAC" does not bring any informa= tion. >=20 > Having "ETHER" in the name would inform the software that it can expect a= n > ethernet header. In the future, I would expect to have more L2 types like= PPP. OK, good explanation! I will change the name and thanks! >=20 > I also have another question about RTE_PTYPE_L2_MAC. You describe it as > "<'ether type'=3D[0x0800|0x86DD|others]>". > What is the meaning of "others"? Does it mean that it is valid to set > RTE_PTYPE_L2_MAC for any received packet? OK. I think others should be removed. As ARP/LLDP like packet types are com= bined together with MAC type. >=20 > For instance, an ARP packet. The driver has the choice to set: > A- RTE_PTYPE_UNKNOWN: the driver does not know the L2 packet > type > B- RTE_PTYPE_L2_MAC: the driver knows it's an ethernet packet > (it should be the case for all received packets today as > dpdk only supports ethernet ports) > C- RTE_PTYPE_L2_ARP: the driver knows that the packet carries > an ARP header after the ethernet header. >=20 > Is it correct for a driver to always set B- for all received packets? Currently it combines ether type and other ether type based protocols toget= her. So if it is a L2_LLDP, it could be treated as MAC + LLDP, while MAC means M= AC only or MAC + L3. >=20 > Another thing that bothers me a bit is that L2_ARP, L2_LLDP, L2_MAC_TIMES= YNC, > (...) are not really L2 types. The L2 type is Ethernet. On the other hand= , they are > not L3 type either. > So, I have no other solution. The OSI model is probably a bit too theoric= al, and we > have to choose the solution that is the most useful for the applications,= even if it > does not absolutely matches the theory ;) Yes, they are a bit bothering. Currently they are combined together with L2= types. Maybe it needs to define a MISC PACKET TYPE field, as we still have 4 bits = available there. Thanks, Helin >=20 >=20 > Regards, > Olivier >=20 >=20 > > > > Regards, > > Helin > > > >> > >> > >>> +/** > >>> + * MAC (Media Access Control) packet type for time sync. > >>> + * > >>> + * Packet format: > >>> + * <'ether type'=3D0x88F7> > >>> + */ > >>> +#define RTE_PTYPE_L2_MAC_TIMESYNC 0x00000002 > >>> +/** > >>> + * ARP (Address Resolution Protocol) packet type. > >>> + * > >>> + * Packet format: > >>> + * <'ether type'=3D0x0806> > >>> + */ > >>> +#define RTE_PTYPE_L2_ARP 0x00000003 > >>> +/** > >>> + * LLDP (Link Layer Discovery Protocol) packet type. > >>> + * > >>> + * Packet format: > >>> + * <'ether type'=3D0x88CC> > >>> + */ > >>> +#define RTE_PTYPE_L2_LLDP 0x00000004 > >> > >> Maybe ETHER should appear in these names too, what do you think? > > Same as above. > > > >> > >> > >> > >> > >>> +/** > >>> + * 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'=3D0x0800 > >>> + * | 'version'=3D4, 'ihl'=3D5> > >>> + */ > >>> +#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'=3D0x0800 > >>> + * | 'version'=3D4, 'ihl'=3D[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'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D0x3B> */ > >>> +#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'=3D0x0800 > >>> + * | 'version'=3D4, 'ihl'=3D[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'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D[0x0|0x2B|0x2C|0x32|0x33|0x3C|0x= 87], > >>> + * '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'=3D0x86DD > >>> + * | 'version'=3D6, 'next > header'=3D[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'=3D0x0800 > >>> + * | 'version'=3D4, 'protocol'=3D6, 'MF'=3D0> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D6> > >>> + */ > >>> +#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'=3D0x0800 > >>> + * | 'version'=3D4, 'protocol'=3D17, 'MF'=3D0> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D17> */ > >>> +#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'=3D0x0800 > >>> + * | 'version'=3D4, 'MF'=3D1> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D44> */ > >>> +#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'=3D0x0800 > >>> + * | 'version'=3D4, 'protocol'=3D132, 'MF'=3D0> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D132> */ > >>> +#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'=3D0x0800 > >>> + * | 'version'=3D4, 'protocol'=3D1, 'MF'=3D0> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D1> > >>> + */ > >>> +#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'=3D0x0800 > >>> + * | 'version'=3D4, 'protocol'!=3D[6|17|132|1], 'MF'=3D0> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'!=3D[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'=3D0x0800 > >>> + * | 'version'=3D4, 'protocol'=3D[4|41]> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D[4|41]> */ > >>> +#define RTE_PTYPE_TUNNEL_IP 0x00001000 > >>> +/** > >>> + * GRE (Generic Routing Encapsulation) tunneling packet type. > >>> + * > >>> + * Packet format: > >>> + * <'ether type'=3D0x0800 > >>> + * | 'version'=3D4, 'protocol'=3D47> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D47> */ > >>> +#define RTE_PTYPE_TUNNEL_GRE 0x00002000 > >>> +/** > >>> + * VXLAN (Virtual eXtensible Local Area Network) tunneling packet ty= pe. > >>> + * > >>> + * Packet format: > >>> + * <'ether type'=3D0x0800 > >>> + * | 'version'=3D4, 'protocol'=3D17 > >>> + * | 'destination port'=3D4798> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D17 > >>> + * | 'destination port'=3D4798> > >>> + */ > >>> +#define RTE_PTYPE_TUNNEL_VXLAN 0x00003000 > >>> +/** > >>> + * NVGRE (Network Virtualization using Generic Routing > >>> +Encapsulation) tunneling > >>> + * packet type. > >>> + * > >>> + * Packet format: > >>> + * <'ether type'=3D0x0800 > >>> + * | 'version'=3D4, 'protocol'=3D47 > >>> + * | 'protocol type'=3D0x6558> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D47 > >>> + * | 'protocol type'=3D0x6558'> > >>> + */ > >>> +#define RTE_PTYPE_TUNNEL_NVGRE 0x00004000 > >>> +/** > >>> + * GENEVE (Generic Network Virtualization Encapsulation) tunneling > >>> +packet > >> type. > >>> + * > >>> + * Packet format: > >>> + * <'ether type'=3D0x0800 > >>> + * | 'version'=3D4, 'protocol'=3D17 > >>> + * | 'destination port'=3D6081> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D17 > >>> + * | 'destination port'=3D6081> > >>> + */ > >>> +#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'=3D[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'=3D[0x800|0x86DD], vlan=3D[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'=3D0x0800 > >>> + * | 'version'=3D4, 'ihl'=3D5> > >>> + */ > >>> +#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'=3D0x0800 > >>> + * | 'version'=3D4, 'ihl'=3D[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 extens= ion > header. > >>> + * > >>> + * Packet format (inner only): > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D0x3B> */ > >>> +#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 heade= r > options. > >>> + * > >>> + * Packet format (inner only): > >>> + * <'ether type'=3D0x0800 > >>> + * | 'version'=3D4, 'ihl'=3D[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'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D[0x0|0x2B|0x2C|0x32|0x33|0x3C|0x= 87], > >>> + * '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'=3D0x86DD > >>> + * | 'version'=3D6, 'next > header'=3D[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'=3D0x0800 > >>> + * | 'version'=3D4, 'protocol'=3D6, 'MF'=3D0> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D6> > >>> + */ > >>> +#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'=3D0x0800 > >>> + * | 'version'=3D4, 'protocol'=3D17, 'MF'=3D0> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D17> */ > >>> +#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'=3D0x0800 > >>> + * | 'version'=3D4, 'MF'=3D1> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D44> */ > >>> +#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'=3D0x0800 > >>> + * | 'version'=3D4, 'protocol'=3D132, 'MF'=3D0> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D132> */ > >>> +#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'=3D0x0800 > >>> + * | 'version'=3D4, 'protocol'=3D1, 'MF'=3D0> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'=3D1> > >>> + */ > >>> +#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'=3D0x0800 > >>> + * | 'version'=3D4, 'protocol'!=3D[6|17|132|1], 'MF'=3D0> > >>> + * or, > >>> + * <'ether type'=3D0x86DD > >>> + * | 'version'=3D6, 'next header'!=3D[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 > >>> * > >>> > >