mbuf: add FCoE packet type
[dpdk.git] / lib / librte_mbuf / rte_mbuf_ptype.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2016 6WIND S.A.
3  */
4
5 #include <stdint.h>
6
7 #include <rte_mbuf.h>
8 #include <rte_mbuf_ptype.h>
9
10 /* get the name of the l2 packet type */
11 const char *rte_get_ptype_l2_name(uint32_t ptype)
12 {
13         switch (ptype & RTE_PTYPE_L2_MASK) {
14         case RTE_PTYPE_L2_ETHER: return "L2_ETHER";
15         case RTE_PTYPE_L2_ETHER_TIMESYNC: return "L2_ETHER_TIMESYNC";
16         case RTE_PTYPE_L2_ETHER_ARP: return "L2_ETHER_ARP";
17         case RTE_PTYPE_L2_ETHER_LLDP: return "L2_ETHER_LLDP";
18         case RTE_PTYPE_L2_ETHER_NSH: return "L2_ETHER_NSH";
19         case RTE_PTYPE_L2_ETHER_VLAN: return "L2_ETHER_VLAN";
20         case RTE_PTYPE_L2_ETHER_QINQ: return "L2_ETHER_QINQ";
21         case RTE_PTYPE_L2_ETHER_PPPOE: return "L2_ETHER_PPPOE";
22         case RTE_PTYPE_L2_ETHER_FCOE: return "L2_ETHER_FCOE";
23         default: return "L2_UNKNOWN";
24         }
25 }
26
27 /* get the name of the l3 packet type */
28 const char *rte_get_ptype_l3_name(uint32_t ptype)
29 {
30         switch (ptype & RTE_PTYPE_L3_MASK) {
31         case RTE_PTYPE_L3_IPV4: return "L3_IPV4";
32         case RTE_PTYPE_L3_IPV4_EXT: return "L3_IPV4_EXT";
33         case RTE_PTYPE_L3_IPV6: return "L3_IPV6";
34         case RTE_PTYPE_L3_IPV4_EXT_UNKNOWN: return "L3_IPV4_EXT_UNKNOWN";
35         case RTE_PTYPE_L3_IPV6_EXT: return "L3_IPV6_EXT";
36         case RTE_PTYPE_L3_IPV6_EXT_UNKNOWN: return "L3_IPV6_EXT_UNKNOWN";
37         default: return "L3_UNKNOWN";
38         }
39 }
40
41 /* get the name of the l4 packet type */
42 const char *rte_get_ptype_l4_name(uint32_t ptype)
43 {
44         switch (ptype & RTE_PTYPE_L4_MASK) {
45         case RTE_PTYPE_L4_TCP: return "L4_TCP";
46         case RTE_PTYPE_L4_UDP: return "L4_UDP";
47         case RTE_PTYPE_L4_FRAG: return "L4_FRAG";
48         case RTE_PTYPE_L4_SCTP: return "L4_SCTP";
49         case RTE_PTYPE_L4_ICMP: return "L4_ICMP";
50         case RTE_PTYPE_L4_NONFRAG: return "L4_NONFRAG";
51         default: return "L4_UNKNOWN";
52         }
53 }
54
55 /* get the name of the tunnel packet type */
56 const char *rte_get_ptype_tunnel_name(uint32_t ptype)
57 {
58         switch (ptype & RTE_PTYPE_TUNNEL_MASK) {
59         case RTE_PTYPE_TUNNEL_IP: return "TUNNEL_IP";
60         case RTE_PTYPE_TUNNEL_GRE: return "TUNNEL_GRE";
61         case RTE_PTYPE_TUNNEL_VXLAN: return "TUNNEL_VXLAN";
62         case RTE_PTYPE_TUNNEL_NVGRE: return "TUNNEL_NVGRE";
63         case RTE_PTYPE_TUNNEL_GENEVE: return "TUNNEL_GENEVE";
64         case RTE_PTYPE_TUNNEL_GRENAT: return "TUNNEL_GRENAT";
65         case RTE_PTYPE_TUNNEL_GTPC: return "TUNNEL_GTPC";
66         case RTE_PTYPE_TUNNEL_GTPU: return "TUNNEL_GTPU";
67         case RTE_PTYPE_TUNNEL_ESP: return "TUNNEL_ESP";
68         case RTE_PTYPE_TUNNEL_L2TP: return "TUNNEL_L2TP";
69         case RTE_PTYPE_TUNNEL_VXLAN_GPE: return "TUNNEL_VXLAN_GPE";
70         case RTE_PTYPE_TUNNEL_MPLS_IN_UDP: return "TUNNEL_MPLS_IN_UDP";
71         case RTE_PTYPE_TUNNEL_MPLS_IN_GRE: return "TUNNEL_MPLS_IN_GRE";
72         default: return "TUNNEL_UNKNOWN";
73         }
74 }
75
76 /* get the name of the inner_l2 packet type */
77 const char *rte_get_ptype_inner_l2_name(uint32_t ptype)
78 {
79         switch (ptype & RTE_PTYPE_INNER_L2_MASK) {
80         case RTE_PTYPE_INNER_L2_ETHER: return "INNER_L2_ETHER";
81         case RTE_PTYPE_INNER_L2_ETHER_VLAN: return "INNER_L2_ETHER_VLAN";
82         case RTE_PTYPE_INNER_L2_ETHER_QINQ: return "INNER_L2_ETHER_QINQ";
83         default: return "INNER_L2_UNKNOWN";
84         }
85 }
86
87 /* get the name of the inner_l3 packet type */
88 const char *rte_get_ptype_inner_l3_name(uint32_t ptype)
89 {
90         switch (ptype & RTE_PTYPE_INNER_L3_MASK) {
91         case RTE_PTYPE_INNER_L3_IPV4: return "INNER_L3_IPV4";
92         case RTE_PTYPE_INNER_L3_IPV4_EXT: return "INNER_L3_IPV4_EXT";
93         case RTE_PTYPE_INNER_L3_IPV6: return "INNER_L3_IPV6";
94         case RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN:
95                 return "INNER_L3_IPV4_EXT_UNKNOWN";
96         case RTE_PTYPE_INNER_L3_IPV6_EXT: return "INNER_L3_IPV6_EXT";
97         case RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN:
98                 return "INNER_L3_IPV6_EXT_UNKNOWN";
99         default: return "INNER_L3_UNKNOWN";
100         }
101 }
102
103 /* get the name of the inner_l4 packet type */
104 const char *rte_get_ptype_inner_l4_name(uint32_t ptype)
105 {
106         switch (ptype & RTE_PTYPE_INNER_L4_MASK) {
107         case RTE_PTYPE_INNER_L4_TCP: return "INNER_L4_TCP";
108         case RTE_PTYPE_INNER_L4_UDP: return "INNER_L4_UDP";
109         case RTE_PTYPE_INNER_L4_FRAG: return "INNER_L4_FRAG";
110         case RTE_PTYPE_INNER_L4_SCTP: return "INNER_L4_SCTP";
111         case RTE_PTYPE_INNER_L4_ICMP: return "INNER_L4_ICMP";
112         case RTE_PTYPE_INNER_L4_NONFRAG: return "INNER_L4_NONFRAG";
113         default: return "INNER_L4_UNKNOWN";
114         }
115 }
116
117 /* write the packet type name into the buffer */
118 int rte_get_ptype_name(uint32_t ptype, char *buf, size_t buflen)
119 {
120         int ret;
121
122         if (buflen == 0)
123                 return -1;
124
125         buf[0] = '\0';
126         if ((ptype & RTE_PTYPE_ALL_MASK) == RTE_PTYPE_UNKNOWN) {
127                 ret = snprintf(buf, buflen, "UNKNOWN");
128                 if (ret < 0)
129                         return -1;
130                 if ((size_t)ret >= buflen)
131                         return -1;
132                 return 0;
133         }
134
135         if ((ptype & RTE_PTYPE_L2_MASK) != 0) {
136                 ret = snprintf(buf, buflen, "%s ",
137                         rte_get_ptype_l2_name(ptype));
138                 if (ret < 0)
139                         return -1;
140                 if ((size_t)ret >= buflen)
141                         return -1;
142                 buf += ret;
143                 buflen -= ret;
144         }
145         if ((ptype & RTE_PTYPE_L3_MASK) != 0) {
146                 ret = snprintf(buf, buflen, "%s ",
147                         rte_get_ptype_l3_name(ptype));
148                 if (ret < 0)
149                         return -1;
150                 if ((size_t)ret >= buflen)
151                         return -1;
152                 buf += ret;
153                 buflen -= ret;
154         }
155         if ((ptype & RTE_PTYPE_L4_MASK) != 0) {
156                 ret = snprintf(buf, buflen, "%s ",
157                         rte_get_ptype_l4_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_TUNNEL_MASK) != 0) {
166                 ret = snprintf(buf, buflen, "%s ",
167                         rte_get_ptype_tunnel_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_INNER_L2_MASK) != 0) {
176                 ret = snprintf(buf, buflen, "%s ",
177                         rte_get_ptype_inner_l2_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_INNER_L3_MASK) != 0) {
186                 ret = snprintf(buf, buflen, "%s ",
187                         rte_get_ptype_inner_l3_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_L4_MASK) != 0) {
196                 ret = snprintf(buf, buflen, "%s ",
197                         rte_get_ptype_inner_l4_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
206         return 0;
207 }