e0f2a92d1e57659a4302166448c93f8b3a6624ab
[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         case RTE_PTYPE_L2_ETHER_PPPOE: return "L2_ETHER_PPPOE";
51         default: return "L2_UNKNOWN";
52         }
53 }
54
55 /* get the name of the l3 packet type */
56 const char *rte_get_ptype_l3_name(uint32_t ptype)
57 {
58         switch (ptype & RTE_PTYPE_L3_MASK) {
59         case RTE_PTYPE_L3_IPV4: return "L3_IPV4";
60         case RTE_PTYPE_L3_IPV4_EXT: return "L3_IPV4_EXT";
61         case RTE_PTYPE_L3_IPV6: return "L3_IPV6";
62         case RTE_PTYPE_L3_IPV4_EXT_UNKNOWN: return "L3_IPV4_EXT_UNKNOWN";
63         case RTE_PTYPE_L3_IPV6_EXT: return "L3_IPV6_EXT";
64         case RTE_PTYPE_L3_IPV6_EXT_UNKNOWN: return "L3_IPV6_EXT_UNKNOWN";
65         default: return "L3_UNKNOWN";
66         }
67 }
68
69 /* get the name of the l4 packet type */
70 const char *rte_get_ptype_l4_name(uint32_t ptype)
71 {
72         switch (ptype & RTE_PTYPE_L4_MASK) {
73         case RTE_PTYPE_L4_TCP: return "L4_TCP";
74         case RTE_PTYPE_L4_UDP: return "L4_UDP";
75         case RTE_PTYPE_L4_FRAG: return "L4_FRAG";
76         case RTE_PTYPE_L4_SCTP: return "L4_SCTP";
77         case RTE_PTYPE_L4_ICMP: return "L4_ICMP";
78         case RTE_PTYPE_L4_NONFRAG: return "L4_NONFRAG";
79         default: return "L4_UNKNOWN";
80         }
81 }
82
83 /* get the name of the tunnel packet type */
84 const char *rte_get_ptype_tunnel_name(uint32_t ptype)
85 {
86         switch (ptype & RTE_PTYPE_TUNNEL_MASK) {
87         case RTE_PTYPE_TUNNEL_IP: return "TUNNEL_IP";
88         case RTE_PTYPE_TUNNEL_GRE: return "TUNNEL_GRE";
89         case RTE_PTYPE_TUNNEL_VXLAN: return "TUNNEL_VXLAN";
90         case RTE_PTYPE_TUNNEL_NVGRE: return "TUNNEL_NVGRE";
91         case RTE_PTYPE_TUNNEL_GENEVE: return "TUNNEL_GENEVE";
92         case RTE_PTYPE_TUNNEL_GRENAT: return "TUNNEL_GRENAT";
93         case RTE_PTYPE_TUNNEL_GTPC: return "TUNNEL_GTPC";
94         case RTE_PTYPE_TUNNEL_GTPU: return "TUNNEL_GTPU";
95         case RTE_PTYPE_TUNNEL_ESP: return "TUNNEL_ESP";
96         case RTE_PTYPE_TUNNEL_L2TP: return "TUNNEL_L2TP";
97         default: return "TUNNEL_UNKNOWN";
98         }
99 }
100
101 /* get the name of the inner_l2 packet type */
102 const char *rte_get_ptype_inner_l2_name(uint32_t ptype)
103 {
104         switch (ptype & RTE_PTYPE_INNER_L2_MASK) {
105         case RTE_PTYPE_INNER_L2_ETHER: return "INNER_L2_ETHER";
106         case RTE_PTYPE_INNER_L2_ETHER_VLAN: return "INNER_L2_ETHER_VLAN";
107         case RTE_PTYPE_INNER_L2_ETHER_QINQ: return "INNER_L2_ETHER_QINQ";
108         default: return "INNER_L2_UNKNOWN";
109         }
110 }
111
112 /* get the name of the inner_l3 packet type */
113 const char *rte_get_ptype_inner_l3_name(uint32_t ptype)
114 {
115         switch (ptype & RTE_PTYPE_INNER_L3_MASK) {
116         case RTE_PTYPE_INNER_L3_IPV4: return "INNER_L3_IPV4";
117         case RTE_PTYPE_INNER_L3_IPV4_EXT: return "INNER_L3_IPV4_EXT";
118         case RTE_PTYPE_INNER_L3_IPV6: return "INNER_L3_IPV6";
119         case RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN:
120                 return "INNER_L3_IPV4_EXT_UNKNOWN";
121         case RTE_PTYPE_INNER_L3_IPV6_EXT: return "INNER_L3_IPV6_EXT";
122         case RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN:
123                 return "INNER_L3_IPV6_EXT_UNKNOWN";
124         default: return "INNER_L3_UNKNOWN";
125         }
126 }
127
128 /* get the name of the inner_l4 packet type */
129 const char *rte_get_ptype_inner_l4_name(uint32_t ptype)
130 {
131         switch (ptype & RTE_PTYPE_INNER_L4_MASK) {
132         case RTE_PTYPE_INNER_L4_TCP: return "INNER_L4_TCP";
133         case RTE_PTYPE_INNER_L4_UDP: return "INNER_L4_UDP";
134         case RTE_PTYPE_INNER_L4_FRAG: return "INNER_L4_FRAG";
135         case RTE_PTYPE_INNER_L4_SCTP: return "INNER_L4_SCTP";
136         case RTE_PTYPE_INNER_L4_ICMP: return "INNER_L4_ICMP";
137         case RTE_PTYPE_INNER_L4_NONFRAG: return "INNER_L4_NONFRAG";
138         default: return "INNER_L4_UNKNOWN";
139         }
140 }
141
142 /* write the packet type name into the buffer */
143 int rte_get_ptype_name(uint32_t ptype, char *buf, size_t buflen)
144 {
145         int ret;
146
147         if (buflen == 0)
148                 return -1;
149
150         buf[0] = '\0';
151         if ((ptype & RTE_PTYPE_ALL_MASK) == RTE_PTYPE_UNKNOWN) {
152                 ret = snprintf(buf, buflen, "UNKNOWN");
153                 if (ret < 0)
154                         return -1;
155                 if ((size_t)ret >= buflen)
156                         return -1;
157                 return 0;
158         }
159
160         if ((ptype & RTE_PTYPE_L2_MASK) != 0) {
161                 ret = snprintf(buf, buflen, "%s ",
162                         rte_get_ptype_l2_name(ptype));
163                 if (ret < 0)
164                         return -1;
165                 if ((size_t)ret >= buflen)
166                         return -1;
167                 buf += ret;
168                 buflen -= ret;
169         }
170         if ((ptype & RTE_PTYPE_L3_MASK) != 0) {
171                 ret = snprintf(buf, buflen, "%s ",
172                         rte_get_ptype_l3_name(ptype));
173                 if (ret < 0)
174                         return -1;
175                 if ((size_t)ret >= buflen)
176                         return -1;
177                 buf += ret;
178                 buflen -= ret;
179         }
180         if ((ptype & RTE_PTYPE_L4_MASK) != 0) {
181                 ret = snprintf(buf, buflen, "%s ",
182                         rte_get_ptype_l4_name(ptype));
183                 if (ret < 0)
184                         return -1;
185                 if ((size_t)ret >= buflen)
186                         return -1;
187                 buf += ret;
188                 buflen -= ret;
189         }
190         if ((ptype & RTE_PTYPE_TUNNEL_MASK) != 0) {
191                 ret = snprintf(buf, buflen, "%s ",
192                         rte_get_ptype_tunnel_name(ptype));
193                 if (ret < 0)
194                         return -1;
195                 if ((size_t)ret >= buflen)
196                         return -1;
197                 buf += ret;
198                 buflen -= ret;
199         }
200         if ((ptype & RTE_PTYPE_INNER_L2_MASK) != 0) {
201                 ret = snprintf(buf, buflen, "%s ",
202                         rte_get_ptype_inner_l2_name(ptype));
203                 if (ret < 0)
204                         return -1;
205                 if ((size_t)ret >= buflen)
206                         return -1;
207                 buf += ret;
208                 buflen -= ret;
209         }
210         if ((ptype & RTE_PTYPE_INNER_L3_MASK) != 0) {
211                 ret = snprintf(buf, buflen, "%s ",
212                         rte_get_ptype_inner_l3_name(ptype));
213                 if (ret < 0)
214                         return -1;
215                 if ((size_t)ret >= buflen)
216                         return -1;
217                 buf += ret;
218                 buflen -= ret;
219         }
220         if ((ptype & RTE_PTYPE_INNER_L4_MASK) != 0) {
221                 ret = snprintf(buf, buflen, "%s ",
222                         rte_get_ptype_inner_l4_name(ptype));
223                 if (ret < 0)
224                         return -1;
225                 if ((size_t)ret >= buflen)
226                         return -1;
227                 buf += ret;
228                 buflen -= ret;
229         }
230
231         return 0;
232 }