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