xref: /dpdk/lib/mbuf/rte_mbuf_ptype.c (revision 99a2dd95)
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 */
rte_get_ptype_l2_name(uint32_t ptype)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 */
rte_get_ptype_l3_name(uint32_t ptype)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 */
rte_get_ptype_l4_name(uint32_t ptype)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 	default: return "L4_UNKNOWN";
54 	}
55 }
56 
57 /* get the name of the tunnel packet type */
rte_get_ptype_tunnel_name(uint32_t ptype)58 const char *rte_get_ptype_tunnel_name(uint32_t ptype)
59 {
60 	switch (ptype & RTE_PTYPE_TUNNEL_MASK) {
61 	case RTE_PTYPE_TUNNEL_IP: return "TUNNEL_IP";
62 	case RTE_PTYPE_TUNNEL_GRE: return "TUNNEL_GRE";
63 	case RTE_PTYPE_TUNNEL_VXLAN: return "TUNNEL_VXLAN";
64 	case RTE_PTYPE_TUNNEL_NVGRE: return "TUNNEL_NVGRE";
65 	case RTE_PTYPE_TUNNEL_GENEVE: return "TUNNEL_GENEVE";
66 	case RTE_PTYPE_TUNNEL_GRENAT: return "TUNNEL_GRENAT";
67 	case RTE_PTYPE_TUNNEL_GTPC: return "TUNNEL_GTPC";
68 	case RTE_PTYPE_TUNNEL_GTPU: return "TUNNEL_GTPU";
69 	case RTE_PTYPE_TUNNEL_ESP: return "TUNNEL_ESP";
70 	case RTE_PTYPE_TUNNEL_L2TP: return "TUNNEL_L2TP";
71 	case RTE_PTYPE_TUNNEL_VXLAN_GPE: return "TUNNEL_VXLAN_GPE";
72 	case RTE_PTYPE_TUNNEL_MPLS_IN_UDP: return "TUNNEL_MPLS_IN_UDP";
73 	case RTE_PTYPE_TUNNEL_MPLS_IN_GRE: return "TUNNEL_MPLS_IN_GRE";
74 	default: return "TUNNEL_UNKNOWN";
75 	}
76 }
77 
78 /* get the name of the inner_l2 packet type */
rte_get_ptype_inner_l2_name(uint32_t ptype)79 const char *rte_get_ptype_inner_l2_name(uint32_t ptype)
80 {
81 	switch (ptype & RTE_PTYPE_INNER_L2_MASK) {
82 	case RTE_PTYPE_INNER_L2_ETHER: return "INNER_L2_ETHER";
83 	case RTE_PTYPE_INNER_L2_ETHER_VLAN: return "INNER_L2_ETHER_VLAN";
84 	case RTE_PTYPE_INNER_L2_ETHER_QINQ: return "INNER_L2_ETHER_QINQ";
85 	default: return "INNER_L2_UNKNOWN";
86 	}
87 }
88 
89 /* get the name of the inner_l3 packet type */
rte_get_ptype_inner_l3_name(uint32_t ptype)90 const char *rte_get_ptype_inner_l3_name(uint32_t ptype)
91 {
92 	switch (ptype & RTE_PTYPE_INNER_L3_MASK) {
93 	case RTE_PTYPE_INNER_L3_IPV4: return "INNER_L3_IPV4";
94 	case RTE_PTYPE_INNER_L3_IPV4_EXT: return "INNER_L3_IPV4_EXT";
95 	case RTE_PTYPE_INNER_L3_IPV6: return "INNER_L3_IPV6";
96 	case RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN:
97 		return "INNER_L3_IPV4_EXT_UNKNOWN";
98 	case RTE_PTYPE_INNER_L3_IPV6_EXT: return "INNER_L3_IPV6_EXT";
99 	case RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN:
100 		return "INNER_L3_IPV6_EXT_UNKNOWN";
101 	default: return "INNER_L3_UNKNOWN";
102 	}
103 }
104 
105 /* get the name of the inner_l4 packet type */
rte_get_ptype_inner_l4_name(uint32_t ptype)106 const char *rte_get_ptype_inner_l4_name(uint32_t ptype)
107 {
108 	switch (ptype & RTE_PTYPE_INNER_L4_MASK) {
109 	case RTE_PTYPE_INNER_L4_TCP: return "INNER_L4_TCP";
110 	case RTE_PTYPE_INNER_L4_UDP: return "INNER_L4_UDP";
111 	case RTE_PTYPE_INNER_L4_FRAG: return "INNER_L4_FRAG";
112 	case RTE_PTYPE_INNER_L4_SCTP: return "INNER_L4_SCTP";
113 	case RTE_PTYPE_INNER_L4_ICMP: return "INNER_L4_ICMP";
114 	case RTE_PTYPE_INNER_L4_NONFRAG: return "INNER_L4_NONFRAG";
115 	default: return "INNER_L4_UNKNOWN";
116 	}
117 }
118 
119 /* write the packet type name into the buffer */
rte_get_ptype_name(uint32_t ptype,char * buf,size_t buflen)120 int rte_get_ptype_name(uint32_t ptype, char *buf, size_t buflen)
121 {
122 	int ret;
123 
124 	if (buflen == 0)
125 		return -1;
126 
127 	buf[0] = '\0';
128 	if ((ptype & RTE_PTYPE_ALL_MASK) == RTE_PTYPE_UNKNOWN) {
129 		ret = snprintf(buf, buflen, "UNKNOWN");
130 		if (ret < 0)
131 			return -1;
132 		if ((size_t)ret >= buflen)
133 			return -1;
134 		return 0;
135 	}
136 
137 	if ((ptype & RTE_PTYPE_L2_MASK) != 0) {
138 		ret = snprintf(buf, buflen, "%s ",
139 			rte_get_ptype_l2_name(ptype));
140 		if (ret < 0)
141 			return -1;
142 		if ((size_t)ret >= buflen)
143 			return -1;
144 		buf += ret;
145 		buflen -= ret;
146 	}
147 	if ((ptype & RTE_PTYPE_L3_MASK) != 0) {
148 		ret = snprintf(buf, buflen, "%s ",
149 			rte_get_ptype_l3_name(ptype));
150 		if (ret < 0)
151 			return -1;
152 		if ((size_t)ret >= buflen)
153 			return -1;
154 		buf += ret;
155 		buflen -= ret;
156 	}
157 	if ((ptype & RTE_PTYPE_L4_MASK) != 0) {
158 		ret = snprintf(buf, buflen, "%s ",
159 			rte_get_ptype_l4_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_TUNNEL_MASK) != 0) {
168 		ret = snprintf(buf, buflen, "%s ",
169 			rte_get_ptype_tunnel_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_INNER_L2_MASK) != 0) {
178 		ret = snprintf(buf, buflen, "%s ",
179 			rte_get_ptype_inner_l2_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_INNER_L3_MASK) != 0) {
188 		ret = snprintf(buf, buflen, "%s ",
189 			rte_get_ptype_inner_l3_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_L4_MASK) != 0) {
198 		ret = snprintf(buf, buflen, "%s ",
199 			rte_get_ptype_inner_l4_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 
208 	return 0;
209 }
210