New upstream version 17.11-rc3
[deb_dpdk.git] / lib / librte_mbuf / rte_mbuf_ptype.c
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright 2016 6WIND S.A.
5  *   All rights reserved.
6  *
7  *   Redistribution and use in source and binary forms, with or without
8  *   modification, are permitted provided that the following conditions
9  *   are met:
10  *
11  *     * Redistributions of source code must retain the above copyright
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright
14  *       notice, this list of conditions and the following disclaimer in
15  *       the documentation and/or other materials provided with the
16  *       distribution.
17  *     * Neither the name of 6WIND S.A. nor the names of its
18  *       contributors may be used to endorse or promote products derived
19  *       from this software without specific prior written permission.
20  *
21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33
34 #include <stdint.h>
35
36 #include <rte_mbuf.h>
37 #include <rte_mbuf_ptype.h>
38
39 /* get the name of the l2 packet type */
40 const char *rte_get_ptype_l2_name(uint32_t ptype)
41 {
42         switch (ptype & RTE_PTYPE_L2_MASK) {
43         case RTE_PTYPE_L2_ETHER: return "L2_ETHER";
44         case RTE_PTYPE_L2_ETHER_TIMESYNC: return "L2_ETHER_TIMESYNC";
45         case RTE_PTYPE_L2_ETHER_ARP: return "L2_ETHER_ARP";
46         case RTE_PTYPE_L2_ETHER_LLDP: return "L2_ETHER_LLDP";
47         case RTE_PTYPE_L2_ETHER_NSH: return "L2_ETHER_NSH";
48         case RTE_PTYPE_L2_ETHER_VLAN: return "L2_ETHER_VLAN";
49         case RTE_PTYPE_L2_ETHER_QINQ: return "L2_ETHER_QINQ";
50         default: return "L2_UNKNOWN";
51         }
52 }
53
54 /* get the name of the l3 packet type */
55 const char *rte_get_ptype_l3_name(uint32_t ptype)
56 {
57         switch (ptype & RTE_PTYPE_L3_MASK) {
58         case RTE_PTYPE_L3_IPV4: return "L3_IPV4";
59         case RTE_PTYPE_L3_IPV4_EXT: return "L3_IPV4_EXT";
60         case RTE_PTYPE_L3_IPV6: return "L3_IPV6";
61         case RTE_PTYPE_L3_IPV4_EXT_UNKNOWN: return "L3_IPV4_EXT_UNKNOWN";
62         case RTE_PTYPE_L3_IPV6_EXT: return "L3_IPV6_EXT";
63         case RTE_PTYPE_L3_IPV6_EXT_UNKNOWN: return "L3_IPV6_EXT_UNKNOWN";
64         default: return "L3_UNKNOWN";
65         }
66 }
67
68 /* get the name of the l4 packet type */
69 const char *rte_get_ptype_l4_name(uint32_t ptype)
70 {
71         switch (ptype & RTE_PTYPE_L4_MASK) {
72         case RTE_PTYPE_L4_TCP: return "L4_TCP";
73         case RTE_PTYPE_L4_UDP: return "L4_UDP";
74         case RTE_PTYPE_L4_FRAG: return "L4_FRAG";
75         case RTE_PTYPE_L4_SCTP: return "L4_SCTP";
76         case RTE_PTYPE_L4_ICMP: return "L4_ICMP";
77         case RTE_PTYPE_L4_NONFRAG: return "L4_NONFRAG";
78         default: return "L4_UNKNOWN";
79         }
80 }
81
82 /* get the name of the tunnel packet type */
83 const char *rte_get_ptype_tunnel_name(uint32_t ptype)
84 {
85         switch (ptype & RTE_PTYPE_TUNNEL_MASK) {
86         case RTE_PTYPE_TUNNEL_IP: return "TUNNEL_IP";
87         case RTE_PTYPE_TUNNEL_GRE: return "TUNNEL_GRE";
88         case RTE_PTYPE_TUNNEL_VXLAN: return "TUNNEL_VXLAN";
89         case RTE_PTYPE_TUNNEL_NVGRE: return "TUNNEL_NVGRE";
90         case RTE_PTYPE_TUNNEL_GENEVE: return "TUNNEL_GENEVE";
91         case RTE_PTYPE_TUNNEL_GRENAT: return "TUNNEL_GRENAT";
92         case RTE_PTYPE_TUNNEL_GTPC: return "TUNNEL_GTPC";
93         case RTE_PTYPE_TUNNEL_GTPU: return "TUNNEL_GTPU";
94         case RTE_PTYPE_TUNNEL_ESP: return "TUNNEL_ESP";
95         default: return "TUNNEL_UNKNOWN";
96         }
97 }
98
99 /* get the name of the inner_l2 packet type */
100 const char *rte_get_ptype_inner_l2_name(uint32_t ptype)
101 {
102         switch (ptype & RTE_PTYPE_INNER_L2_MASK) {
103         case RTE_PTYPE_INNER_L2_ETHER: return "INNER_L2_ETHER";
104         case RTE_PTYPE_INNER_L2_ETHER_VLAN: return "INNER_L2_ETHER_VLAN";
105         case RTE_PTYPE_INNER_L2_ETHER_QINQ: return "INNER_L2_ETHER_QINQ";
106         default: return "INNER_L2_UNKNOWN";
107         }
108 }
109
110 /* get the name of the inner_l3 packet type */
111 const char *rte_get_ptype_inner_l3_name(uint32_t ptype)
112 {
113         switch (ptype & RTE_PTYPE_INNER_L3_MASK) {
114         case RTE_PTYPE_INNER_L3_IPV4: return "INNER_L3_IPV4";
115         case RTE_PTYPE_INNER_L3_IPV4_EXT: return "INNER_L3_IPV4_EXT";
116         case RTE_PTYPE_INNER_L3_IPV6: return "INNER_L3_IPV6";
117         case RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN:
118                 return "INNER_L3_IPV4_EXT_UNKNOWN";
119         case RTE_PTYPE_INNER_L3_IPV6_EXT: return "INNER_L3_IPV6_EXT";
120         case RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN:
121                 return "INNER_L3_IPV6_EXT_UNKNOWN";
122         default: return "INNER_L3_UNKNOWN";
123         }
124 }
125
126 /* get the name of the inner_l4 packet type */
127 const char *rte_get_ptype_inner_l4_name(uint32_t ptype)
128 {
129         switch (ptype & RTE_PTYPE_INNER_L4_MASK) {
130         case RTE_PTYPE_INNER_L4_TCP: return "INNER_L4_TCP";
131         case RTE_PTYPE_INNER_L4_UDP: return "INNER_L4_UDP";
132         case RTE_PTYPE_INNER_L4_FRAG: return "INNER_L4_FRAG";
133         case RTE_PTYPE_INNER_L4_SCTP: return "INNER_L4_SCTP";
134         case RTE_PTYPE_INNER_L4_ICMP: return "INNER_L4_ICMP";
135         case RTE_PTYPE_INNER_L4_NONFRAG: return "INNER_L4_NONFRAG";
136         default: return "INNER_L4_UNKNOWN";
137         }
138 }
139
140 /* write the packet type name into the buffer */
141 int rte_get_ptype_name(uint32_t ptype, char *buf, size_t buflen)
142 {
143         int ret;
144
145         if (buflen == 0)
146                 return -1;
147
148         buf[0] = '\0';
149         if ((ptype & RTE_PTYPE_ALL_MASK) == RTE_PTYPE_UNKNOWN) {
150                 ret = snprintf(buf, buflen, "UNKNOWN");
151                 if (ret < 0)
152                         return -1;
153                 if ((size_t)ret >= buflen)
154                         return -1;
155                 return 0;
156         }
157
158         if ((ptype & RTE_PTYPE_L2_MASK) != 0) {
159                 ret = snprintf(buf, buflen, "%s ",
160                         rte_get_ptype_l2_name(ptype));
161                 if (ret < 0)
162                         return -1;
163                 if ((size_t)ret >= buflen)
164                         return -1;
165                 buf += ret;
166                 buflen -= ret;
167         }
168         if ((ptype & RTE_PTYPE_L3_MASK) != 0) {
169                 ret = snprintf(buf, buflen, "%s ",
170                         rte_get_ptype_l3_name(ptype));
171                 if (ret < 0)
172                         return -1;
173                 if ((size_t)ret >= buflen)
174                         return -1;
175                 buf += ret;
176                 buflen -= ret;
177         }
178         if ((ptype & RTE_PTYPE_L4_MASK) != 0) {
179                 ret = snprintf(buf, buflen, "%s ",
180                         rte_get_ptype_l4_name(ptype));
181                 if (ret < 0)
182                         return -1;
183                 if ((size_t)ret >= buflen)
184                         return -1;
185                 buf += ret;
186                 buflen -= ret;
187         }
188         if ((ptype & RTE_PTYPE_TUNNEL_MASK) != 0) {
189                 ret = snprintf(buf, buflen, "%s ",
190                         rte_get_ptype_tunnel_name(ptype));
191                 if (ret < 0)
192                         return -1;
193                 if ((size_t)ret >= buflen)
194                         return -1;
195                 buf += ret;
196                 buflen -= ret;
197         }
198         if ((ptype & RTE_PTYPE_INNER_L2_MASK) != 0) {
199                 ret = snprintf(buf, buflen, "%s ",
200                         rte_get_ptype_inner_l2_name(ptype));
201                 if (ret < 0)
202                         return -1;
203                 if ((size_t)ret >= buflen)
204                         return -1;
205                 buf += ret;
206                 buflen -= ret;
207         }
208         if ((ptype & RTE_PTYPE_INNER_L3_MASK) != 0) {
209                 ret = snprintf(buf, buflen, "%s ",
210                         rte_get_ptype_inner_l3_name(ptype));
211                 if (ret < 0)
212                         return -1;
213                 if ((size_t)ret >= buflen)
214                         return -1;
215                 buf += ret;
216                 buflen -= ret;
217         }
218         if ((ptype & RTE_PTYPE_INNER_L4_MASK) != 0) {
219                 ret = snprintf(buf, buflen, "%s ",
220                         rte_get_ptype_inner_l4_name(ptype));
221                 if (ret < 0)
222                         return -1;
223                 if ((size_t)ret >= buflen)
224                         return -1;
225                 buf += ret;
226                 buflen -= ret;
227         }
228
229         return 0;
230 }