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