New upstream version 17.11-rc3
[deb_dpdk.git] / lib / librte_mbuf / rte_mbuf_ptype.h
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright(c) 2010-2016 Intel Corporation.
5  *   Copyright 2014-2016 6WIND S.A.
6  *   All rights reserved.
7  *
8  *   Redistribution and use in source and binary forms, with or without
9  *   modification, are permitted provided that the following conditions
10  *   are met:
11  *
12  *     * Redistributions of source code must retain the above copyright
13  *       notice, this list of conditions and the following disclaimer.
14  *     * Redistributions in binary form must reproduce the above copyright
15  *       notice, this list of conditions and the following disclaimer in
16  *       the documentation and/or other materials provided with the
17  *       distribution.
18  *     * Neither the name of Intel Corporation nor the names of its
19  *       contributors may be used to endorse or promote products derived
20  *       from this software without specific prior written permission.
21  *
22  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34
35 #ifndef _RTE_MBUF_PTYPE_H_
36 #define _RTE_MBUF_PTYPE_H_
37
38 /**
39  * @file
40  * RTE Mbuf Packet Types
41  *
42  * This file contains declarations for features related to mbuf packet
43  * types. The packet type gives information about the data carried by the
44  * mbuf, and is stored in the mbuf in a 32 bits field.
45  *
46  * The 32 bits are divided into several fields to mark packet types. Note that
47  * each field is indexical.
48  * - Bit 3:0 is for L2 types.
49  * - Bit 7:4 is for L3 or outer L3 (for tunneling case) types.
50  * - Bit 11:8 is for L4 or outer L4 (for tunneling case) types.
51  * - Bit 15:12 is for tunnel types.
52  * - Bit 19:16 is for inner L2 types.
53  * - Bit 23:20 is for inner L3 types.
54  * - Bit 27:24 is for inner L4 types.
55  * - Bit 31:28 is reserved.
56  *
57  * To be compatible with Vector PMD, RTE_PTYPE_L3_IPV4, RTE_PTYPE_L3_IPV4_EXT,
58  * RTE_PTYPE_L3_IPV6, RTE_PTYPE_L3_IPV6_EXT, RTE_PTYPE_L4_TCP, RTE_PTYPE_L4_UDP
59  * and RTE_PTYPE_L4_SCTP should be kept as below in a contiguous 7 bits.
60  *
61  * Note that L3 types values are selected for checking IPV4/IPV6 header from
62  * performance point of view. Reading annotations of RTE_ETH_IS_IPV4_HDR and
63  * RTE_ETH_IS_IPV6_HDR is needed for any future changes of L3 type values.
64  *
65  * Note that the packet types of the same packet recognized by different
66  * hardware may be different, as different hardware may have different
67  * capability of packet type recognition.
68  *
69  * examples:
70  * <'ether type'=0x0800
71  * | 'version'=4, 'protocol'=0x29
72  * | 'version'=6, 'next header'=0x3A
73  * | 'ICMPv6 header'>
74  * will be recognized on i40e hardware as packet type combination of,
75  * RTE_PTYPE_L2_ETHER |
76  * RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
77  * RTE_PTYPE_TUNNEL_IP |
78  * RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
79  * RTE_PTYPE_INNER_L4_ICMP.
80  *
81  * <'ether type'=0x86DD
82  * | 'version'=6, 'next header'=0x2F
83  * | 'GRE header'
84  * | 'version'=6, 'next header'=0x11
85  * | 'UDP header'>
86  * will be recognized on i40e hardware as packet type combination of,
87  * RTE_PTYPE_L2_ETHER |
88  * RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
89  * RTE_PTYPE_TUNNEL_GRENAT |
90  * RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
91  * RTE_PTYPE_INNER_L4_UDP.
92  */
93
94 #include <stddef.h>
95 #include <stdint.h>
96
97 #ifdef __cplusplus
98 extern "C" {
99 #endif
100
101 /**
102  * No packet type information.
103  */
104 #define RTE_PTYPE_UNKNOWN                   0x00000000
105 /**
106  * Ethernet packet type.
107  * It is used for outer packet for tunneling cases.
108  *
109  * Packet format:
110  * <'ether type'=[0x0800|0x86DD]>
111  */
112 #define RTE_PTYPE_L2_ETHER                  0x00000001
113 /**
114  * Ethernet packet type for time sync.
115  *
116  * Packet format:
117  * <'ether type'=0x88F7>
118  */
119 #define RTE_PTYPE_L2_ETHER_TIMESYNC         0x00000002
120 /**
121  * ARP (Address Resolution Protocol) packet type.
122  *
123  * Packet format:
124  * <'ether type'=0x0806>
125  */
126 #define RTE_PTYPE_L2_ETHER_ARP              0x00000003
127 /**
128  * LLDP (Link Layer Discovery Protocol) packet type.
129  *
130  * Packet format:
131  * <'ether type'=0x88CC>
132  */
133 #define RTE_PTYPE_L2_ETHER_LLDP             0x00000004
134 /**
135  * NSH (Network Service Header) packet type.
136  *
137  * Packet format:
138  * <'ether type'=0x894F>
139  */
140 #define RTE_PTYPE_L2_ETHER_NSH              0x00000005
141 /**
142  * VLAN packet type.
143  *
144  * Packet format:
145  * <'ether type'=[0x8100]>
146  */
147 #define RTE_PTYPE_L2_ETHER_VLAN             0x00000006
148 /**
149  * QinQ packet type.
150  *
151  * Packet format:
152  * <'ether type'=[0x88A8]>
153  */
154 #define RTE_PTYPE_L2_ETHER_QINQ             0x00000007
155 /**
156  * Mask of layer 2 packet types.
157  * It is used for outer packet for tunneling cases.
158  */
159 #define RTE_PTYPE_L2_MASK                   0x0000000f
160 /**
161  * IP (Internet Protocol) version 4 packet type.
162  * It is used for outer packet for tunneling cases, and does not contain any
163  * header option.
164  *
165  * Packet format:
166  * <'ether type'=0x0800
167  * | 'version'=4, 'ihl'=5>
168  */
169 #define RTE_PTYPE_L3_IPV4                   0x00000010
170 /**
171  * IP (Internet Protocol) version 4 packet type.
172  * It is used for outer packet for tunneling cases, and contains header
173  * options.
174  *
175  * Packet format:
176  * <'ether type'=0x0800
177  * | 'version'=4, 'ihl'=[6-15], 'options'>
178  */
179 #define RTE_PTYPE_L3_IPV4_EXT               0x00000030
180 /**
181  * IP (Internet Protocol) version 6 packet type.
182  * It is used for outer packet for tunneling cases, and does not contain any
183  * extension header.
184  *
185  * Packet format:
186  * <'ether type'=0x86DD
187  * | 'version'=6, 'next header'=0x3B>
188  */
189 #define RTE_PTYPE_L3_IPV6                   0x00000040
190 /**
191  * IP (Internet Protocol) version 4 packet type.
192  * It is used for outer packet for tunneling cases, and may or maynot contain
193  * header options.
194  *
195  * Packet format:
196  * <'ether type'=0x0800
197  * | 'version'=4, 'ihl'=[5-15], <'options'>>
198  */
199 #define RTE_PTYPE_L3_IPV4_EXT_UNKNOWN       0x00000090
200 /**
201  * IP (Internet Protocol) version 6 packet type.
202  * It is used for outer packet for tunneling cases, and contains extension
203  * headers.
204  *
205  * Packet format:
206  * <'ether type'=0x86DD
207  * | 'version'=6, 'next header'=[0x0|0x2B|0x2C|0x32|0x33|0x3C|0x87],
208  *   'extension headers'>
209  */
210 #define RTE_PTYPE_L3_IPV6_EXT               0x000000c0
211 /**
212  * IP (Internet Protocol) version 6 packet type.
213  * It is used for outer packet for tunneling cases, and may or maynot contain
214  * extension headers.
215  *
216  * Packet format:
217  * <'ether type'=0x86DD
218  * | 'version'=6, 'next header'=[0x3B|0x0|0x2B|0x2C|0x32|0x33|0x3C|0x87],
219  *   <'extension headers'>>
220  */
221 #define RTE_PTYPE_L3_IPV6_EXT_UNKNOWN       0x000000e0
222 /**
223  * Mask of layer 3 packet types.
224  * It is used for outer packet for tunneling cases.
225  */
226 #define RTE_PTYPE_L3_MASK                   0x000000f0
227 /**
228  * TCP (Transmission Control Protocol) packet type.
229  * It is used for outer packet for tunneling cases.
230  *
231  * Packet format:
232  * <'ether type'=0x0800
233  * | 'version'=4, 'protocol'=6, 'MF'=0, 'frag_offset'=0>
234  * or,
235  * <'ether type'=0x86DD
236  * | 'version'=6, 'next header'=6>
237  */
238 #define RTE_PTYPE_L4_TCP                    0x00000100
239 /**
240  * UDP (User Datagram Protocol) packet type.
241  * It is used for outer packet for tunneling cases.
242  *
243  * Packet format:
244  * <'ether type'=0x0800
245  * | 'version'=4, 'protocol'=17, 'MF'=0, 'frag_offset'=0>
246  * or,
247  * <'ether type'=0x86DD
248  * | 'version'=6, 'next header'=17>
249  */
250 #define RTE_PTYPE_L4_UDP                    0x00000200
251 /**
252  * Fragmented IP (Internet Protocol) packet type.
253  * It is used for outer packet for tunneling cases.
254  *
255  * It refers to those packets of any IP types, which can be recognized as
256  * fragmented. A fragmented packet cannot be recognized as any other L4 types
257  * (RTE_PTYPE_L4_TCP, RTE_PTYPE_L4_UDP, RTE_PTYPE_L4_SCTP, RTE_PTYPE_L4_ICMP,
258  * RTE_PTYPE_L4_NONFRAG).
259  *
260  * Packet format:
261  * <'ether type'=0x0800
262  * | 'version'=4, 'MF'=1>
263  * or,
264  * <'ether type'=0x0800
265  * | 'version'=4, 'frag_offset'!=0>
266  * or,
267  * <'ether type'=0x86DD
268  * | 'version'=6, 'next header'=44>
269  */
270 #define RTE_PTYPE_L4_FRAG                   0x00000300
271 /**
272  * SCTP (Stream Control Transmission Protocol) packet type.
273  * It is used for outer packet for tunneling cases.
274  *
275  * Packet format:
276  * <'ether type'=0x0800
277  * | 'version'=4, 'protocol'=132, 'MF'=0, 'frag_offset'=0>
278  * or,
279  * <'ether type'=0x86DD
280  * | 'version'=6, 'next header'=132>
281  */
282 #define RTE_PTYPE_L4_SCTP                   0x00000400
283 /**
284  * ICMP (Internet Control Message Protocol) packet type.
285  * It is used for outer packet for tunneling cases.
286  *
287  * Packet format:
288  * <'ether type'=0x0800
289  * | 'version'=4, 'protocol'=1, 'MF'=0, 'frag_offset'=0>
290  * or,
291  * <'ether type'=0x86DD
292  * | 'version'=6, 'next header'=1>
293  */
294 #define RTE_PTYPE_L4_ICMP                   0x00000500
295 /**
296  * Non-fragmented IP (Internet Protocol) packet type.
297  * It is used for outer packet for tunneling cases.
298  *
299  * It refers to those packets of any IP types, while cannot be recognized as
300  * any of above L4 types (RTE_PTYPE_L4_TCP, RTE_PTYPE_L4_UDP,
301  * RTE_PTYPE_L4_FRAG, RTE_PTYPE_L4_SCTP, RTE_PTYPE_L4_ICMP).
302  *
303  * Packet format:
304  * <'ether type'=0x0800
305  * | 'version'=4, 'protocol'!=[6|17|132|1], 'MF'=0, 'frag_offset'=0>
306  * or,
307  * <'ether type'=0x86DD
308  * | 'version'=6, 'next header'!=[6|17|44|132|1]>
309  */
310 #define RTE_PTYPE_L4_NONFRAG                0x00000600
311 /**
312  * Mask of layer 4 packet types.
313  * It is used for outer packet for tunneling cases.
314  */
315 #define RTE_PTYPE_L4_MASK                   0x00000f00
316 /**
317  * IP (Internet Protocol) in IP (Internet Protocol) tunneling packet type.
318  *
319  * Packet format:
320  * <'ether type'=0x0800
321  * | 'version'=4, 'protocol'=[4|41]>
322  * or,
323  * <'ether type'=0x86DD
324  * | 'version'=6, 'next header'=[4|41]>
325  */
326 #define RTE_PTYPE_TUNNEL_IP                 0x00001000
327 /**
328  * GRE (Generic Routing Encapsulation) tunneling packet type.
329  *
330  * Packet format:
331  * <'ether type'=0x0800
332  * | 'version'=4, 'protocol'=47>
333  * or,
334  * <'ether type'=0x86DD
335  * | 'version'=6, 'next header'=47>
336  */
337 #define RTE_PTYPE_TUNNEL_GRE                0x00002000
338 /**
339  * VXLAN (Virtual eXtensible Local Area Network) tunneling packet type.
340  *
341  * Packet format:
342  * <'ether type'=0x0800
343  * | 'version'=4, 'protocol'=17
344  * | 'destination port'=4789>
345  * or,
346  * <'ether type'=0x86DD
347  * | 'version'=6, 'next header'=17
348  * | 'destination port'=4789>
349  */
350 #define RTE_PTYPE_TUNNEL_VXLAN              0x00003000
351 /**
352  * NVGRE (Network Virtualization using Generic Routing Encapsulation) tunneling
353  * packet type.
354  *
355  * Packet format:
356  * <'ether type'=0x0800
357  * | 'version'=4, 'protocol'=47
358  * | 'protocol type'=0x6558>
359  * or,
360  * <'ether type'=0x86DD
361  * | 'version'=6, 'next header'=47
362  * | 'protocol type'=0x6558'>
363  */
364 #define RTE_PTYPE_TUNNEL_NVGRE              0x00004000
365 /**
366  * GENEVE (Generic Network Virtualization Encapsulation) tunneling packet type.
367  *
368  * Packet format:
369  * <'ether type'=0x0800
370  * | 'version'=4, 'protocol'=17
371  * | 'destination port'=6081>
372  * or,
373  * <'ether type'=0x86DD
374  * | 'version'=6, 'next header'=17
375  * | 'destination port'=6081>
376  */
377 #define RTE_PTYPE_TUNNEL_GENEVE             0x00005000
378 /**
379  * Tunneling packet type of Teredo, VXLAN (Virtual eXtensible Local Area
380  * Network) or GRE (Generic Routing Encapsulation) could be recognized as this
381  * packet type, if they can not be recognized independently as of hardware
382  * capability.
383  */
384 #define RTE_PTYPE_TUNNEL_GRENAT             0x00006000
385 /**
386  * GTP-C (GPRS Tunnelling Protocol) control tunneling packet type.
387  * Packet format:
388  * <'ether type'=0x0800
389  * | 'version'=4, 'protocol'=17
390  * | 'destination port'=2123>
391  * or,
392  * <'ether type'=0x86DD
393  * | 'version'=6, 'next header'=17
394  * | 'destination port'=2123>
395  * or,
396  * <'ether type'=0x0800
397  * | 'version'=4, 'protocol'=17
398  * | 'source port'=2123>
399  * or,
400  * <'ether type'=0x86DD
401  * | 'version'=6, 'next header'=17
402  * | 'source port'=2123>
403  */
404 #define RTE_PTYPE_TUNNEL_GTPC               0x00007000
405 /**
406  * GTP-U (GPRS Tunnelling Protocol) user data tunneling packet type.
407  * Packet format:
408  * <'ether type'=0x0800
409  * | 'version'=4, 'protocol'=17
410  * | 'destination port'=2152>
411  * or,
412  * <'ether type'=0x86DD
413  * | 'version'=6, 'next header'=17
414  * | 'destination port'=2152>
415  */
416 #define RTE_PTYPE_TUNNEL_GTPU               0x00008000
417 /**
418  * ESP (IP Encapsulating Security Payload) tunneling packet type.
419  *
420  * Packet format:
421  * <'ether type'=0x0800
422  * | 'version'=4, 'protocol'=51>
423  * or,
424  * <'ether type'=0x86DD
425  * | 'version'=6, 'next header'=51>
426  */
427 #define RTE_PTYPE_TUNNEL_ESP                0x00009000
428 /**
429  * Mask of tunneling packet types.
430  */
431 #define RTE_PTYPE_TUNNEL_MASK               0x0000f000
432 /**
433  * Ethernet packet type.
434  * It is used for inner packet type only.
435  *
436  * Packet format (inner only):
437  * <'ether type'=[0x800|0x86DD]>
438  */
439 #define RTE_PTYPE_INNER_L2_ETHER            0x00010000
440 /**
441  * Ethernet packet type with VLAN (Virtual Local Area Network) tag.
442  *
443  * Packet format (inner only):
444  * <'ether type'=[0x800|0x86DD], vlan=[1-4095]>
445  */
446 #define RTE_PTYPE_INNER_L2_ETHER_VLAN       0x00020000
447 /**
448  * QinQ packet type.
449  *
450  * Packet format:
451  * <'ether type'=[0x88A8]>
452  */
453 #define RTE_PTYPE_INNER_L2_ETHER_QINQ       0x00030000
454 /**
455  * Mask of inner layer 2 packet types.
456  */
457 #define RTE_PTYPE_INNER_L2_MASK             0x000f0000
458 /**
459  * IP (Internet Protocol) version 4 packet type.
460  * It is used for inner packet only, and does not contain any header option.
461  *
462  * Packet format (inner only):
463  * <'ether type'=0x0800
464  * | 'version'=4, 'ihl'=5>
465  */
466 #define RTE_PTYPE_INNER_L3_IPV4             0x00100000
467 /**
468  * IP (Internet Protocol) version 4 packet type.
469  * It is used for inner packet only, and contains header options.
470  *
471  * Packet format (inner only):
472  * <'ether type'=0x0800
473  * | 'version'=4, 'ihl'=[6-15], 'options'>
474  */
475 #define RTE_PTYPE_INNER_L3_IPV4_EXT         0x00200000
476 /**
477  * IP (Internet Protocol) version 6 packet type.
478  * It is used for inner packet only, and does not contain any extension header.
479  *
480  * Packet format (inner only):
481  * <'ether type'=0x86DD
482  * | 'version'=6, 'next header'=0x3B>
483  */
484 #define RTE_PTYPE_INNER_L3_IPV6             0x00300000
485 /**
486  * IP (Internet Protocol) version 4 packet type.
487  * It is used for inner packet only, and may or maynot contain header options.
488  *
489  * Packet format (inner only):
490  * <'ether type'=0x0800
491  * | 'version'=4, 'ihl'=[5-15], <'options'>>
492  */
493 #define RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN 0x00400000
494 /**
495  * IP (Internet Protocol) version 6 packet type.
496  * It is used for inner packet only, and contains extension headers.
497  *
498  * Packet format (inner only):
499  * <'ether type'=0x86DD
500  * | 'version'=6, 'next header'=[0x0|0x2B|0x2C|0x32|0x33|0x3C|0x87],
501  *   'extension headers'>
502  */
503 #define RTE_PTYPE_INNER_L3_IPV6_EXT         0x00500000
504 /**
505  * IP (Internet Protocol) version 6 packet type.
506  * It is used for inner packet only, and may or maynot contain extension
507  * headers.
508  *
509  * Packet format (inner only):
510  * <'ether type'=0x86DD
511  * | 'version'=6, 'next header'=[0x3B|0x0|0x2B|0x2C|0x32|0x33|0x3C|0x87],
512  *   <'extension headers'>>
513  */
514 #define RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN 0x00600000
515 /**
516  * Mask of inner layer 3 packet types.
517  */
518 #define RTE_PTYPE_INNER_L3_MASK             0x00f00000
519 /**
520  * TCP (Transmission Control Protocol) packet type.
521  * It is used for inner packet only.
522  *
523  * Packet format (inner only):
524  * <'ether type'=0x0800
525  * | 'version'=4, 'protocol'=6, 'MF'=0, 'frag_offset'=0>
526  * or,
527  * <'ether type'=0x86DD
528  * | 'version'=6, 'next header'=6>
529  */
530 #define RTE_PTYPE_INNER_L4_TCP              0x01000000
531 /**
532  * UDP (User Datagram Protocol) packet type.
533  * It is used for inner packet only.
534  *
535  * Packet format (inner only):
536  * <'ether type'=0x0800
537  * | 'version'=4, 'protocol'=17, 'MF'=0, 'frag_offset'=0>
538  * or,
539  * <'ether type'=0x86DD
540  * | 'version'=6, 'next header'=17>
541  */
542 #define RTE_PTYPE_INNER_L4_UDP              0x02000000
543 /**
544  * Fragmented IP (Internet Protocol) packet type.
545  * It is used for inner packet only, and may or maynot have layer 4 packet.
546  *
547  * Packet format (inner only):
548  * <'ether type'=0x0800
549  * | 'version'=4, 'MF'=1>
550  * or,
551  * <'ether type'=0x0800
552  * | 'version'=4, 'frag_offset'!=0>
553  * or,
554  * <'ether type'=0x86DD
555  * | 'version'=6, 'next header'=44>
556  */
557 #define RTE_PTYPE_INNER_L4_FRAG             0x03000000
558 /**
559  * SCTP (Stream Control Transmission Protocol) packet type.
560  * It is used for inner packet only.
561  *
562  * Packet format (inner only):
563  * <'ether type'=0x0800
564  * | 'version'=4, 'protocol'=132, 'MF'=0, 'frag_offset'=0>
565  * or,
566  * <'ether type'=0x86DD
567  * | 'version'=6, 'next header'=132>
568  */
569 #define RTE_PTYPE_INNER_L4_SCTP             0x04000000
570 /**
571  * ICMP (Internet Control Message Protocol) packet type.
572  * It is used for inner packet only.
573  *
574  * Packet format (inner only):
575  * <'ether type'=0x0800
576  * | 'version'=4, 'protocol'=1, 'MF'=0, 'frag_offset'=0>
577  * or,
578  * <'ether type'=0x86DD
579  * | 'version'=6, 'next header'=1>
580  */
581 #define RTE_PTYPE_INNER_L4_ICMP             0x05000000
582 /**
583  * Non-fragmented IP (Internet Protocol) packet type.
584  * It is used for inner packet only, and may or maynot have other unknown layer
585  * 4 packet types.
586  *
587  * Packet format (inner only):
588  * <'ether type'=0x0800
589  * | 'version'=4, 'protocol'!=[6|17|132|1], 'MF'=0, 'frag_offset'=0>
590  * or,
591  * <'ether type'=0x86DD
592  * | 'version'=6, 'next header'!=[6|17|44|132|1]>
593  */
594 #define RTE_PTYPE_INNER_L4_NONFRAG          0x06000000
595 /**
596  * Mask of inner layer 4 packet types.
597  */
598 #define RTE_PTYPE_INNER_L4_MASK             0x0f000000
599 /**
600  * All valid layer masks.
601  */
602 #define RTE_PTYPE_ALL_MASK                  0x0fffffff
603
604 /**
605  * Check if the (outer) L3 header is IPv4. To avoid comparing IPv4 types one by
606  * one, bit 4 is selected to be used for IPv4 only. Then checking bit 4 can
607  * determine if it is an IPV4 packet.
608  */
609 #define  RTE_ETH_IS_IPV4_HDR(ptype) ((ptype) & RTE_PTYPE_L3_IPV4)
610
611 /**
612  * Check if the (outer) L3 header is IPv4. To avoid comparing IPv4 types one by
613  * one, bit 6 is selected to be used for IPv4 only. Then checking bit 6 can
614  * determine if it is an IPV4 packet.
615  */
616 #define  RTE_ETH_IS_IPV6_HDR(ptype) ((ptype) & RTE_PTYPE_L3_IPV6)
617
618 /* Check if it is a tunneling packet */
619 #define RTE_ETH_IS_TUNNEL_PKT(ptype) ((ptype) &                         \
620         (RTE_PTYPE_TUNNEL_MASK |                                        \
621                 RTE_PTYPE_INNER_L2_MASK |                               \
622                 RTE_PTYPE_INNER_L3_MASK |                               \
623                 RTE_PTYPE_INNER_L4_MASK))
624
625 /**
626  * Get the name of the l2 packet type
627  *
628  * @param ptype
629  *   The packet type value.
630  * @return
631  *   A non-null string describing the packet type.
632  */
633 const char *rte_get_ptype_l2_name(uint32_t ptype);
634
635 /**
636  * Get the name of the l3 packet type
637  *
638  * @param ptype
639  *   The packet type value.
640  * @return
641  *   A non-null string describing the packet type.
642  */
643 const char *rte_get_ptype_l3_name(uint32_t ptype);
644
645 /**
646  * Get the name of the l4 packet type
647  *
648  * @param ptype
649  *   The packet type value.
650  * @return
651  *   A non-null string describing the packet type.
652  */
653 const char *rte_get_ptype_l4_name(uint32_t ptype);
654
655 /**
656  * Get the name of the tunnel packet type
657  *
658  * @param ptype
659  *   The packet type value.
660  * @return
661  *   A non-null string describing the packet type.
662  */
663 const char *rte_get_ptype_tunnel_name(uint32_t ptype);
664
665 /**
666  * Get the name of the inner_l2 packet type
667  *
668  * @param ptype
669  *   The packet type value.
670  * @return
671  *   A non-null string describing the packet type.
672  */
673 const char *rte_get_ptype_inner_l2_name(uint32_t ptype);
674
675 /**
676  * Get the name of the inner_l3 packet type
677  *
678  * @param ptype
679  *   The packet type value.
680  * @return
681  *   A non-null string describing the packet type.
682  */
683 const char *rte_get_ptype_inner_l3_name(uint32_t ptype);
684
685 /**
686  * Get the name of the inner_l4 packet type
687  *
688  * @param ptype
689  *   The packet type value.
690  * @return
691  *   A non-null string describing the packet type.
692  */
693 const char *rte_get_ptype_inner_l4_name(uint32_t ptype);
694
695 /**
696  * Write the packet type name into the buffer
697  *
698  * @param ptype
699  *   The packet type value.
700  * @param buf
701  *   The buffer where the string is written.
702  * @param buflen
703  *   The length of the buffer.
704  * @return
705  *   - 0 on success
706  *   - (-1) if the buffer is too small
707  */
708 int rte_get_ptype_name(uint32_t ptype, char *buf, size_t buflen);
709
710 #ifdef __cplusplus
711 }
712 #endif
713
714 #endif /* _RTE_MBUF_PTYPE_H_ */