a4508149d92b783aa501f691ad267b54fc28c45e
[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         default: return "TUNNEL_UNKNOWN";
95         }
96 }
97
98 /* get the name of the inner_l2 packet type */
99 const char *rte_get_ptype_inner_l2_name(uint32_t ptype)
100 {
101         switch (ptype & RTE_PTYPE_INNER_L2_MASK) {
102         case RTE_PTYPE_INNER_L2_ETHER: return "INNER_L2_ETHER";
103         case RTE_PTYPE_INNER_L2_ETHER_VLAN: return "INNER_L2_ETHER_VLAN";
104         case RTE_PTYPE_INNER_L2_ETHER_QINQ: return "INNER_L2_ETHER_QINQ";
105         default: return "INNER_L2_UNKNOWN";
106         }
107 }
108
109 /* get the name of the inner_l3 packet type */
110 const char *rte_get_ptype_inner_l3_name(uint32_t ptype)
111 {
112         switch (ptype & RTE_PTYPE_INNER_L3_MASK) {
113         case RTE_PTYPE_INNER_L3_IPV4: return "INNER_L3_IPV4";
114         case RTE_PTYPE_INNER_L3_IPV4_EXT: return "INNER_L3_IPV4_EXT";
115         case RTE_PTYPE_INNER_L3_IPV6: return "INNER_L3_IPV6";
116         case RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN:
117                 return "INNER_L3_IPV4_EXT_UNKNOWN";
118         case RTE_PTYPE_INNER_L3_IPV6_EXT: return "INNER_L3_IPV6_EXT";
119         case RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN:
120                 return "INNER_L3_IPV6_EXT_UNKNOWN";
121         default: return "INNER_L3_UNKNOWN";
122         }
123 }
124
125 /* get the name of the inner_l4 packet type */
126 const char *rte_get_ptype_inner_l4_name(uint32_t ptype)
127 {
128         switch (ptype & RTE_PTYPE_INNER_L4_MASK) {
129         case RTE_PTYPE_INNER_L4_TCP: return "INNER_L4_TCP";
130         case RTE_PTYPE_INNER_L4_UDP: return "INNER_L4_UDP";
131         case RTE_PTYPE_INNER_L4_FRAG: return "INNER_L4_FRAG";
132         case RTE_PTYPE_INNER_L4_SCTP: return "INNER_L4_SCTP";
133         case RTE_PTYPE_INNER_L4_ICMP: return "INNER_L4_ICMP";
134         case RTE_PTYPE_INNER_L4_NONFRAG: return "INNER_L4_NONFRAG";
135         default: return "INNER_L4_UNKNOWN";
136         }
137 }
138
139 /* write the packet type name into the buffer */
140 int rte_get_ptype_name(uint32_t ptype, char *buf, size_t buflen)
141 {
142         int ret;
143
144         if (buflen == 0)
145                 return -1;
146
147         buf[0] = '\0';
148         if ((ptype & RTE_PTYPE_ALL_MASK) == RTE_PTYPE_UNKNOWN) {
149                 ret = snprintf(buf, buflen, "UNKNOWN");
150                 if (ret < 0)
151                         return -1;
152                 if ((size_t)ret >= buflen)
153                         return -1;
154                 return 0;
155         }
156
157         if ((ptype & RTE_PTYPE_L2_MASK) != 0) {
158                 ret = snprintf(buf, buflen, "%s ",
159                         rte_get_ptype_l2_name(ptype));
160                 if (ret < 0)
161                         return -1;
162                 if ((size_t)ret >= buflen)
163                         return -1;
164                 buf += ret;
165                 buflen -= ret;
166         }
167         if ((ptype & RTE_PTYPE_L3_MASK) != 0) {
168                 ret = snprintf(buf, buflen, "%s ",
169                         rte_get_ptype_l3_name(ptype));
170                 if (ret < 0)
171                         return -1;
172                 if ((size_t)ret >= buflen)
173                         return -1;
174                 buf += ret;
175                 buflen -= ret;
176         }
177         if ((ptype & RTE_PTYPE_L4_MASK) != 0) {
178                 ret = snprintf(buf, buflen, "%s ",
179                         rte_get_ptype_l4_name(ptype));
180                 if (ret < 0)
181                         return -1;
182                 if ((size_t)ret >= buflen)
183                         return -1;
184                 buf += ret;
185                 buflen -= ret;
186         }
187         if ((ptype & RTE_PTYPE_TUNNEL_MASK) != 0) {
188                 ret = snprintf(buf, buflen, "%s ",
189                         rte_get_ptype_tunnel_name(ptype));
190                 if (ret < 0)
191                         return -1;
192                 if ((size_t)ret >= buflen)
193                         return -1;
194                 buf += ret;
195                 buflen -= ret;
196         }
197         if ((ptype & RTE_PTYPE_INNER_L2_MASK) != 0) {
198                 ret = snprintf(buf, buflen, "%s ",
199                         rte_get_ptype_inner_l2_name(ptype));
200                 if (ret < 0)
201                         return -1;
202                 if ((size_t)ret >= buflen)
203                         return -1;
204                 buf += ret;
205                 buflen -= ret;
206         }
207         if ((ptype & RTE_PTYPE_INNER_L3_MASK) != 0) {
208                 ret = snprintf(buf, buflen, "%s ",
209                         rte_get_ptype_inner_l3_name(ptype));
210                 if (ret < 0)
211                         return -1;
212                 if ((size_t)ret >= buflen)
213                         return -1;
214                 buf += ret;
215                 buflen -= ret;
216         }
217         if ((ptype & RTE_PTYPE_INNER_L4_MASK) != 0) {
218                 ret = snprintf(buf, buflen, "%s ",
219                         rte_get_ptype_inner_l4_name(ptype));
220                 if (ret < 0)
221                         return -1;
222                 if ((size_t)ret >= buflen)
223                         return -1;
224                 buf += ret;
225                 buflen -= ret;
226         }
227
228         return 0;
229 }