1
2
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
12
13
14
15
16
17
18
19
20
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
39static u32 ngbe_ptype_lookup[NGBE_PTID_MAX] __rte_cache_aligned = {
40
41
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
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
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
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
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
95u32 *ngbe_get_supported_ptypes(void)
96{
97 static u32 ptypes[] = {
98
99
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 RTE_PTYPE_UNKNOWN
115 };
116
117 return ptypes;
118}
119
120static inline u8
121ngbe_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
147static inline u8
148ngbe_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
189static inline u8
190ngbe_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
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
277u32 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
285u8 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