xref: /dpdk/drivers/net/ngbe/ngbe_ptypes.c (revision 27595cd83053b2d39634a159d6709b3ce3cdf3b0)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2018-2021 Beijing WangXun Technology Co., Ltd.
3  */
4 
5 #include <rte_mbuf.h>
6 #include <rte_memory.h>
7 
8 #include "base/ngbe_type.h"
9 #include "ngbe_ptypes.h"
10 
11 /* The ngbe_ptype_lookup is used to convert from the 8-bit ptid in the
12  * hardware to a bit-field that can be used by SW to more easily determine the
13  * packet type.
14  *
15  * Macros are used to shorten the table lines and make this table human
16  * readable.
17  *
18  * We store the PTYPE in the top byte of the bit field - this is just so that
19  * we can check that the table doesn't have a row missing, as the index into
20  * the table should be the PTYPE.
21  */
22 #define TPTE(ptid, l2, l3, l4, tun, el2, el3, el4) \
23 	[ptid] = (RTE_PTYPE_L2_##l2 | \
24 		RTE_PTYPE_L3_##l3 | \
25 		RTE_PTYPE_L4_##l4 | \
26 		RTE_PTYPE_TUNNEL_##tun | \
27 		RTE_PTYPE_INNER_L2_##el2 | \
28 		RTE_PTYPE_INNER_L3_##el3 | \
29 		RTE_PTYPE_INNER_L4_##el4)
30 
31 #define RTE_PTYPE_L2_NONE               0
32 #define RTE_PTYPE_L3_NONE               0
33 #define RTE_PTYPE_L4_NONE               0
34 #define RTE_PTYPE_TUNNEL_NONE           0
35 #define RTE_PTYPE_INNER_L2_NONE         0
36 #define RTE_PTYPE_INNER_L3_NONE         0
37 #define RTE_PTYPE_INNER_L4_NONE         0
38 
39 static alignas(RTE_CACHE_LINE_SIZE) u32 ngbe_ptype_lookup[NGBE_PTID_MAX] = {
40 	/* L2:0-3 L3:4-7 L4:8-11 TUN:12-15 EL2:16-19 EL3:20-23 EL2:24-27 */
41 	/* L2: ETH */
42 	TPTE(0x10, ETHER,          NONE, NONE, NONE, NONE, NONE, NONE),
43 	TPTE(0x11, ETHER,          NONE, NONE, NONE, NONE, NONE, NONE),
44 	TPTE(0x12, ETHER_TIMESYNC, NONE, NONE, NONE, NONE, NONE, NONE),
45 	TPTE(0x13, ETHER_FIP,      NONE, NONE, NONE, NONE, NONE, NONE),
46 	TPTE(0x14, ETHER_LLDP,     NONE, NONE, NONE, NONE, NONE, NONE),
47 	TPTE(0x15, ETHER_CNM,      NONE, NONE, NONE, NONE, NONE, NONE),
48 	TPTE(0x16, ETHER_EAPOL,    NONE, NONE, NONE, NONE, NONE, NONE),
49 	TPTE(0x17, ETHER_ARP,      NONE, NONE, NONE, NONE, NONE, NONE),
50 	/* L2: Ethertype Filter */
51 	TPTE(0x18, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
52 	TPTE(0x19, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
53 	TPTE(0x1A, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
54 	TPTE(0x1B, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
55 	TPTE(0x1C, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
56 	TPTE(0x1D, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
57 	TPTE(0x1E, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
58 	TPTE(0x1F, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
59 	/* L3: IP */
60 	TPTE(0x20, ETHER, IPV4, NONFRAG, NONE, NONE, NONE, NONE),
61 	TPTE(0x21, ETHER, IPV4, FRAG,    NONE, NONE, NONE, NONE),
62 	TPTE(0x22, ETHER, IPV4, NONFRAG, NONE, NONE, NONE, NONE),
63 	TPTE(0x23, ETHER, IPV4, UDP,     NONE, NONE, NONE, NONE),
64 	TPTE(0x24, ETHER, IPV4, TCP,     NONE, NONE, NONE, NONE),
65 	TPTE(0x25, ETHER, IPV4, SCTP,    NONE, NONE, NONE, NONE),
66 	TPTE(0x29, ETHER, IPV6, FRAG,    NONE, NONE, NONE, NONE),
67 	TPTE(0x2A, ETHER, IPV6, NONFRAG, NONE, NONE, NONE, NONE),
68 	TPTE(0x2B, ETHER, IPV6, UDP,     NONE, NONE, NONE, NONE),
69 	TPTE(0x2C, ETHER, IPV6, TCP,     NONE, NONE, NONE, NONE),
70 	TPTE(0x2D, ETHER, IPV6, SCTP,    NONE, NONE, NONE, NONE),
71 	/* IPv4 -> IPv4/IPv6 */
72 	TPTE(0x81, ETHER, IPV4, NONE, IP, NONE, IPV4, FRAG),
73 	TPTE(0x82, ETHER, IPV4, NONE, IP, NONE, IPV4, NONFRAG),
74 	TPTE(0x83, ETHER, IPV4, NONE, IP, NONE, IPV4, UDP),
75 	TPTE(0x84, ETHER, IPV4, NONE, IP, NONE, IPV4, TCP),
76 	TPTE(0x85, ETHER, IPV4, NONE, IP, NONE, IPV4, SCTP),
77 	TPTE(0x89, ETHER, IPV4, NONE, IP, NONE, IPV6, FRAG),
78 	TPTE(0x8A, ETHER, IPV4, NONE, IP, NONE, IPV6, NONFRAG),
79 	TPTE(0x8B, ETHER, IPV4, NONE, IP, NONE, IPV6, UDP),
80 	TPTE(0x8C, ETHER, IPV4, NONE, IP, NONE, IPV6, TCP),
81 	TPTE(0x8D, ETHER, IPV4, NONE, IP, NONE, IPV6, SCTP),
82 	/* IPv6 -> IPv4/IPv6 */
83 	TPTE(0xC1, ETHER, IPV6, NONE, IP, NONE, IPV4, FRAG),
84 	TPTE(0xC2, ETHER, IPV6, NONE, IP, NONE, IPV4, NONFRAG),
85 	TPTE(0xC3, ETHER, IPV6, NONE, IP, NONE, IPV4, UDP),
86 	TPTE(0xC4, ETHER, IPV6, NONE, IP, NONE, IPV4, TCP),
87 	TPTE(0xC5, ETHER, IPV6, NONE, IP, NONE, IPV4, SCTP),
88 	TPTE(0xC9, ETHER, IPV6, NONE, IP, NONE, IPV6, FRAG),
89 	TPTE(0xCA, ETHER, IPV6, NONE, IP, NONE, IPV6, NONFRAG),
90 	TPTE(0xCB, ETHER, IPV6, NONE, IP, NONE, IPV6, UDP),
91 	TPTE(0xCC, ETHER, IPV6, NONE, IP, NONE, IPV6, TCP),
92 	TPTE(0xCD, ETHER, IPV6, NONE, IP, NONE, IPV6, SCTP),
93 };
94 
ngbe_get_supported_ptypes(size_t * no_of_elements)95 u32 *ngbe_get_supported_ptypes(size_t *no_of_elements)
96 {
97 	static u32 ptypes[] = {
98 		/* For non-vec functions,
99 		 * refers to ngbe_rxd_pkt_info_to_pkt_type();
100 		 */
101 		RTE_PTYPE_L2_ETHER,
102 		RTE_PTYPE_L3_IPV4,
103 		RTE_PTYPE_L3_IPV4_EXT,
104 		RTE_PTYPE_L3_IPV6,
105 		RTE_PTYPE_L3_IPV6_EXT,
106 		RTE_PTYPE_L4_SCTP,
107 		RTE_PTYPE_L4_TCP,
108 		RTE_PTYPE_L4_UDP,
109 		RTE_PTYPE_TUNNEL_IP,
110 		RTE_PTYPE_INNER_L3_IPV6,
111 		RTE_PTYPE_INNER_L3_IPV6_EXT,
112 		RTE_PTYPE_INNER_L4_TCP,
113 		RTE_PTYPE_INNER_L4_UDP,
114 	};
115 
116 	*no_of_elements = RTE_DIM(ptypes);
117 	return ptypes;
118 }
119 
120 static inline u8
ngbe_encode_ptype_mac(u32 ptype)121 ngbe_encode_ptype_mac(u32 ptype)
122 {
123 	u8 ptid;
124 
125 	ptid = NGBE_PTID_PKT_MAC;
126 
127 	switch (ptype & RTE_PTYPE_L2_MASK) {
128 	case RTE_PTYPE_UNKNOWN:
129 		break;
130 	case RTE_PTYPE_L2_ETHER_TIMESYNC:
131 		ptid |= NGBE_PTID_TYP_TS;
132 		break;
133 	case RTE_PTYPE_L2_ETHER_ARP:
134 		ptid |= NGBE_PTID_TYP_ARP;
135 		break;
136 	case RTE_PTYPE_L2_ETHER_LLDP:
137 		ptid |= NGBE_PTID_TYP_LLDP;
138 		break;
139 	default:
140 		ptid |= NGBE_PTID_TYP_MAC;
141 		break;
142 	}
143 
144 	return ptid;
145 }
146 
147 static inline u8
ngbe_encode_ptype_ip(u32 ptype)148 ngbe_encode_ptype_ip(u32 ptype)
149 {
150 	u8 ptid;
151 
152 	ptid = NGBE_PTID_PKT_IP;
153 
154 	switch (ptype & RTE_PTYPE_L3_MASK) {
155 	case RTE_PTYPE_L3_IPV4:
156 	case RTE_PTYPE_L3_IPV4_EXT:
157 	case RTE_PTYPE_L3_IPV4_EXT_UNKNOWN:
158 		break;
159 	case RTE_PTYPE_L3_IPV6:
160 	case RTE_PTYPE_L3_IPV6_EXT:
161 	case RTE_PTYPE_L3_IPV6_EXT_UNKNOWN:
162 		ptid |= NGBE_PTID_PKT_IPV6;
163 		break;
164 	default:
165 		return ngbe_encode_ptype_mac(ptype);
166 	}
167 
168 	switch (ptype & RTE_PTYPE_L4_MASK) {
169 	case RTE_PTYPE_L4_TCP:
170 		ptid |= NGBE_PTID_TYP_TCP;
171 		break;
172 	case RTE_PTYPE_L4_UDP:
173 		ptid |= NGBE_PTID_TYP_UDP;
174 		break;
175 	case RTE_PTYPE_L4_SCTP:
176 		ptid |= NGBE_PTID_TYP_SCTP;
177 		break;
178 	case RTE_PTYPE_L4_FRAG:
179 		ptid |= NGBE_PTID_TYP_IPFRAG;
180 		break;
181 	default:
182 		ptid |= NGBE_PTID_TYP_IPDATA;
183 		break;
184 	}
185 
186 	return ptid;
187 }
188 
189 static inline u8
ngbe_encode_ptype_tunnel(u32 ptype)190 ngbe_encode_ptype_tunnel(u32 ptype)
191 {
192 	u8 ptid;
193 
194 	ptid = NGBE_PTID_PKT_TUN;
195 
196 	switch (ptype & RTE_PTYPE_L3_MASK) {
197 	case RTE_PTYPE_L3_IPV4:
198 	case RTE_PTYPE_L3_IPV4_EXT:
199 	case RTE_PTYPE_L3_IPV4_EXT_UNKNOWN:
200 		break;
201 	case RTE_PTYPE_L3_IPV6:
202 	case RTE_PTYPE_L3_IPV6_EXT:
203 	case RTE_PTYPE_L3_IPV6_EXT_UNKNOWN:
204 		ptid |= NGBE_PTID_TUN_IPV6;
205 		break;
206 	default:
207 		return ngbe_encode_ptype_ip(ptype);
208 	}
209 
210 	/* VXLAN/GRE/Teredo/VXLAN-GPE are not supported in EM */
211 	switch (ptype & RTE_PTYPE_TUNNEL_MASK) {
212 	case RTE_PTYPE_TUNNEL_IP:
213 		ptid |= NGBE_PTID_TUN_EI;
214 		break;
215 	case RTE_PTYPE_TUNNEL_GRE:
216 	case RTE_PTYPE_TUNNEL_VXLAN_GPE:
217 		ptid |= NGBE_PTID_TUN_EIG;
218 		break;
219 	case RTE_PTYPE_TUNNEL_VXLAN:
220 	case RTE_PTYPE_TUNNEL_NVGRE:
221 	case RTE_PTYPE_TUNNEL_GENEVE:
222 	case RTE_PTYPE_TUNNEL_GRENAT:
223 		break;
224 	default:
225 		return ptid;
226 	}
227 
228 	switch (ptype & RTE_PTYPE_INNER_L2_MASK) {
229 	case RTE_PTYPE_INNER_L2_ETHER:
230 		ptid |= NGBE_PTID_TUN_EIGM;
231 		break;
232 	case RTE_PTYPE_INNER_L2_ETHER_VLAN:
233 		ptid |= NGBE_PTID_TUN_EIGMV;
234 		break;
235 	case RTE_PTYPE_INNER_L2_ETHER_QINQ:
236 		ptid |= NGBE_PTID_TUN_EIGMV;
237 		break;
238 	default:
239 		break;
240 	}
241 
242 	switch (ptype & RTE_PTYPE_INNER_L3_MASK) {
243 	case RTE_PTYPE_INNER_L3_IPV4:
244 	case RTE_PTYPE_INNER_L3_IPV4_EXT:
245 	case RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN:
246 		break;
247 	case RTE_PTYPE_INNER_L3_IPV6:
248 	case RTE_PTYPE_INNER_L3_IPV6_EXT:
249 	case RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN:
250 		ptid |= NGBE_PTID_PKT_IPV6;
251 		break;
252 	default:
253 		return ptid;
254 	}
255 
256 	switch (ptype & RTE_PTYPE_INNER_L4_MASK) {
257 	case RTE_PTYPE_INNER_L4_TCP:
258 		ptid |= NGBE_PTID_TYP_TCP;
259 		break;
260 	case RTE_PTYPE_INNER_L4_UDP:
261 		ptid |= NGBE_PTID_TYP_UDP;
262 		break;
263 	case RTE_PTYPE_INNER_L4_SCTP:
264 		ptid |= NGBE_PTID_TYP_SCTP;
265 		break;
266 	case RTE_PTYPE_INNER_L4_FRAG:
267 		ptid |= NGBE_PTID_TYP_IPFRAG;
268 		break;
269 	default:
270 		ptid |= NGBE_PTID_TYP_IPDATA;
271 		break;
272 	}
273 
274 	return ptid;
275 }
276 
ngbe_decode_ptype(u8 ptid)277 u32 ngbe_decode_ptype(u8 ptid)
278 {
279 	if (-1 != ngbe_etflt_id(ptid))
280 		return RTE_PTYPE_UNKNOWN;
281 
282 	return ngbe_ptype_lookup[ptid];
283 }
284 
ngbe_encode_ptype(u32 ptype)285 u8 ngbe_encode_ptype(u32 ptype)
286 {
287 	u8 ptid = 0;
288 
289 	if (ptype & RTE_PTYPE_TUNNEL_MASK)
290 		ptid = ngbe_encode_ptype_tunnel(ptype);
291 	else if (ptype & RTE_PTYPE_L3_MASK)
292 		ptid = ngbe_encode_ptype_ip(ptype);
293 	else if (ptype & RTE_PTYPE_L2_MASK)
294 		ptid = ngbe_encode_ptype_mac(ptype);
295 	else
296 		ptid = NGBE_PTID_NULL;
297 
298 	return ptid;
299 }
300