Branch data Line data Source code
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 u32 ngbe_ptype_lookup[NGBE_PTID_MAX] __rte_cache_aligned = {
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 : :
95 : 0 : 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 : 0 : *no_of_elements = RTE_DIM(ptypes);
117 : 0 : return ptypes;
118 : : }
119 : :
120 : : static inline u8
121 : : ngbe_encode_ptype_mac(u32 ptype)
122 : : {
123 : : u8 ptid;
124 : :
125 : : ptid = NGBE_PTID_PKT_MAC;
126 : :
127 [ # # ]: 0 : 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
148 : 0 : ngbe_encode_ptype_ip(u32 ptype)
149 : : {
150 : : u8 ptid;
151 : :
152 : : ptid = NGBE_PTID_PKT_IP;
153 : :
154 [ # # # ]: 0 : 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 : 0 : 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 : 0 : break;
164 : : default:
165 : : return ngbe_encode_ptype_mac(ptype);
166 : : }
167 : :
168 [ # # # # : 0 : switch (ptype & RTE_PTYPE_L4_MASK) {
# ]
169 : 0 : case RTE_PTYPE_L4_TCP:
170 : 0 : ptid |= NGBE_PTID_TYP_TCP;
171 : 0 : break;
172 : 0 : case RTE_PTYPE_L4_UDP:
173 : 0 : ptid |= NGBE_PTID_TYP_UDP;
174 : 0 : break;
175 : 0 : case RTE_PTYPE_L4_SCTP:
176 : 0 : ptid |= NGBE_PTID_TYP_SCTP;
177 : 0 : break;
178 : 0 : case RTE_PTYPE_L4_FRAG:
179 : 0 : ptid |= NGBE_PTID_TYP_IPFRAG;
180 : 0 : break;
181 : 0 : default:
182 : 0 : ptid |= NGBE_PTID_TYP_IPDATA;
183 : 0 : break;
184 : : }
185 : :
186 : : return ptid;
187 : : }
188 : :
189 : : static inline u8
190 : 0 : ngbe_encode_ptype_tunnel(u32 ptype)
191 : : {
192 : : u8 ptid;
193 : :
194 : : ptid = NGBE_PTID_PKT_TUN;
195 : :
196 [ # # # ]: 0 : 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 : 0 : 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 : 0 : break;
206 : 0 : default:
207 : 0 : return ngbe_encode_ptype_ip(ptype);
208 : : }
209 : :
210 : : /* VXLAN/GRE/Teredo/VXLAN-GPE are not supported in EM */
211 [ # # # ]: 0 : switch (ptype & RTE_PTYPE_TUNNEL_MASK) {
212 : : case RTE_PTYPE_TUNNEL_IP:
213 : : ptid |= NGBE_PTID_TUN_EI;
214 : : break;
215 : 0 : case RTE_PTYPE_TUNNEL_GRE:
216 : : case RTE_PTYPE_TUNNEL_VXLAN_GPE:
217 : 0 : ptid |= NGBE_PTID_TUN_EIG;
218 : 0 : 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 [ # # # # ]: 0 : switch (ptype & RTE_PTYPE_INNER_L2_MASK) {
229 : 0 : case RTE_PTYPE_INNER_L2_ETHER:
230 : 0 : ptid |= NGBE_PTID_TUN_EIGM;
231 : 0 : break;
232 : 0 : case RTE_PTYPE_INNER_L2_ETHER_VLAN:
233 : 0 : ptid |= NGBE_PTID_TUN_EIGMV;
234 : 0 : break;
235 : 0 : case RTE_PTYPE_INNER_L2_ETHER_QINQ:
236 : 0 : ptid |= NGBE_PTID_TUN_EIGMV;
237 : 0 : break;
238 : : default:
239 : : break;
240 : : }
241 : :
242 [ # # # ]: 0 : 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 : 0 : case RTE_PTYPE_INNER_L3_IPV6:
248 : : case RTE_PTYPE_INNER_L3_IPV6_EXT:
249 : : case RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN:
250 : 0 : ptid |= NGBE_PTID_PKT_IPV6;
251 : 0 : break;
252 : : default:
253 : : return ptid;
254 : : }
255 : :
256 [ # # # # : 0 : switch (ptype & RTE_PTYPE_INNER_L4_MASK) {
# ]
257 : 0 : case RTE_PTYPE_INNER_L4_TCP:
258 : 0 : ptid |= NGBE_PTID_TYP_TCP;
259 : 0 : break;
260 : 0 : case RTE_PTYPE_INNER_L4_UDP:
261 : 0 : ptid |= NGBE_PTID_TYP_UDP;
262 : 0 : break;
263 : 0 : case RTE_PTYPE_INNER_L4_SCTP:
264 : 0 : ptid |= NGBE_PTID_TYP_SCTP;
265 : 0 : break;
266 : 0 : case RTE_PTYPE_INNER_L4_FRAG:
267 : 0 : ptid |= NGBE_PTID_TYP_IPFRAG;
268 : 0 : break;
269 : 0 : default:
270 : 0 : ptid |= NGBE_PTID_TYP_IPDATA;
271 : 0 : break;
272 : : }
273 : :
274 : : return ptid;
275 : : }
276 : :
277 : 0 : u32 ngbe_decode_ptype(u8 ptid)
278 : : {
279 [ # # ]: 0 : if (-1 != ngbe_etflt_id(ptid))
280 : : return RTE_PTYPE_UNKNOWN;
281 : :
282 : 0 : return ngbe_ptype_lookup[ptid];
283 : : }
284 : :
285 : 0 : u8 ngbe_encode_ptype(u32 ptype)
286 : : {
287 : : u8 ptid = 0;
288 : :
289 [ # # ]: 0 : if (ptype & RTE_PTYPE_TUNNEL_MASK)
290 : 0 : ptid = ngbe_encode_ptype_tunnel(ptype);
291 [ # # ]: 0 : else if (ptype & RTE_PTYPE_L3_MASK)
292 : 0 : ptid = ngbe_encode_ptype_ip(ptype);
293 [ # # ]: 0 : else if (ptype & RTE_PTYPE_L2_MASK)
294 : : ptid = ngbe_encode_ptype_mac(ptype);
295 : : else
296 : : ptid = NGBE_PTID_NULL;
297 : :
298 : 0 : return ptid;
299 : : }
|