1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2019 Marvell International Ltd.
10 #include "otx2_common.h"
11 #include "otx2_ethdev_sec.h"
12 #include "otx2_ipsec_anti_replay.h"
13 #include "otx2_ipsec_fp.h"
15 /* Default mark value used when none is provided. */
16 #define OTX2_FLOW_ACTION_FLAG_DEFAULT 0xffff
18 #define PTYPE_NON_TUNNEL_WIDTH 16
19 #define PTYPE_TUNNEL_WIDTH 12
20 #define PTYPE_NON_TUNNEL_ARRAY_SZ BIT(PTYPE_NON_TUNNEL_WIDTH)
21 #define PTYPE_TUNNEL_ARRAY_SZ BIT(PTYPE_TUNNEL_WIDTH)
22 #define PTYPE_ARRAY_SZ ((PTYPE_NON_TUNNEL_ARRAY_SZ +\
23 PTYPE_TUNNEL_ARRAY_SZ) *\
26 #define NIX_RX_OFFLOAD_NONE (0)
27 #define NIX_RX_OFFLOAD_RSS_F BIT(0)
28 #define NIX_RX_OFFLOAD_PTYPE_F BIT(1)
29 #define NIX_RX_OFFLOAD_CHECKSUM_F BIT(2)
30 #define NIX_RX_OFFLOAD_VLAN_STRIP_F BIT(3)
31 #define NIX_RX_OFFLOAD_MARK_UPDATE_F BIT(4)
32 #define NIX_RX_OFFLOAD_TSTAMP_F BIT(5)
33 #define NIX_RX_OFFLOAD_SECURITY_F BIT(6)
35 /* Flags to control cqe_to_mbuf conversion function.
36 * Defining it from backwards to denote its been
37 * not used as offload flags to pick function
39 #define NIX_RX_MULTI_SEG_F BIT(15)
40 #define NIX_TIMESYNC_RX_OFFSET 8
42 /* Inline IPsec offsets */
44 /* nix_cqe_hdr_s + nix_rx_parse_s + nix_rx_sg_s + nix_iova_s */
45 #define INLINE_CPT_RESULT_OFFSET 80
47 struct otx2_timesync_info {
49 rte_iova_t tx_tstamp_iova;
51 uint64_t rx_tstamp_dynflag;
52 int tstamp_dynfield_offset;
55 } __rte_cache_aligned;
57 union mbuf_initializer {
67 static inline rte_mbuf_timestamp_t *
68 otx2_timestamp_dynfield(struct rte_mbuf *mbuf,
69 struct otx2_timesync_info *info)
71 return RTE_MBUF_DYNFIELD(mbuf,
72 info->tstamp_dynfield_offset, rte_mbuf_timestamp_t *);
75 static __rte_always_inline void
76 otx2_nix_mbuf_to_tstamp(struct rte_mbuf *mbuf,
77 struct otx2_timesync_info *tstamp, const uint16_t flag,
80 if ((flag & NIX_RX_OFFLOAD_TSTAMP_F) &&
81 (mbuf->data_off == RTE_PKTMBUF_HEADROOM +
82 NIX_TIMESYNC_RX_OFFSET)) {
84 mbuf->pkt_len -= NIX_TIMESYNC_RX_OFFSET;
86 /* Reading the rx timestamp inserted by CGX, viz at
87 * starting of the packet data.
89 *otx2_timestamp_dynfield(mbuf, tstamp) =
90 rte_be_to_cpu_64(*tstamp_ptr);
91 /* PKT_RX_IEEE1588_TMST flag needs to be set only in case
92 * PTP packets are received.
94 if (mbuf->packet_type == RTE_PTYPE_L2_ETHER_TIMESYNC) {
96 *otx2_timestamp_dynfield(mbuf, tstamp);
98 mbuf->ol_flags |= PKT_RX_IEEE1588_PTP |
99 PKT_RX_IEEE1588_TMST |
100 tstamp->rx_tstamp_dynflag;
105 static __rte_always_inline uint64_t
106 nix_clear_data_off(uint64_t oldval)
108 union mbuf_initializer mbuf_init = { .value = oldval };
110 mbuf_init.fields.data_off = 0;
111 return mbuf_init.value;
114 static __rte_always_inline struct rte_mbuf *
115 nix_get_mbuf_from_cqe(void *cq, const uint64_t data_off)
119 /* Skip CQE, NIX_RX_PARSE_S and SG HDR(9 DWORDs) and peek buff addr */
120 buff = *((rte_iova_t *)((uint64_t *)cq + 9));
121 return (struct rte_mbuf *)(buff - data_off);
125 static __rte_always_inline uint32_t
126 nix_ptype_get(const void * const lookup_mem, const uint64_t in)
128 const uint16_t * const ptype = lookup_mem;
129 const uint16_t lh_lg_lf = (in & 0xFFF0000000000000) >> 52;
130 const uint16_t tu_l2 = ptype[(in & 0x000FFFF000000000) >> 36];
131 const uint16_t il4_tu = ptype[PTYPE_NON_TUNNEL_ARRAY_SZ + lh_lg_lf];
133 return (il4_tu << PTYPE_NON_TUNNEL_WIDTH) | tu_l2;
136 static __rte_always_inline uint32_t
137 nix_rx_olflags_get(const void * const lookup_mem, const uint64_t in)
139 const uint32_t * const ol_flags = (const uint32_t *)
140 ((const uint8_t *)lookup_mem + PTYPE_ARRAY_SZ);
142 return ol_flags[(in & 0xfff00000) >> 20];
145 static inline uint64_t
146 nix_update_match_id(const uint16_t match_id, uint64_t ol_flags,
147 struct rte_mbuf *mbuf)
149 /* There is no separate bit to check match_id
150 * is valid or not? and no flag to identify it is an
151 * RTE_FLOW_ACTION_TYPE_FLAG vs RTE_FLOW_ACTION_TYPE_MARK
152 * action. The former case addressed through 0 being invalid
153 * value and inc/dec match_id pair when MARK is activated.
154 * The later case addressed through defining
155 * OTX2_FLOW_MARK_DEFAULT as value for
156 * RTE_FLOW_ACTION_TYPE_MARK.
157 * This would translate to not use
158 * OTX2_FLOW_ACTION_FLAG_DEFAULT - 1 and
159 * OTX2_FLOW_ACTION_FLAG_DEFAULT for match_id.
160 * i.e valid mark_id's are from
161 * 0 to OTX2_FLOW_ACTION_FLAG_DEFAULT - 2
163 if (likely(match_id)) {
164 ol_flags |= PKT_RX_FDIR;
165 if (match_id != OTX2_FLOW_ACTION_FLAG_DEFAULT) {
166 ol_flags |= PKT_RX_FDIR_ID;
167 mbuf->hash.fdir.hi = match_id - 1;
174 static __rte_always_inline void
175 nix_cqe_xtract_mseg(const struct nix_rx_parse_s *rx,
176 struct rte_mbuf *mbuf, uint64_t rearm)
178 const rte_iova_t *iova_list;
179 struct rte_mbuf *head;
180 const rte_iova_t *eol;
184 sg = *(const uint64_t *)(rx + 1);
185 nb_segs = (sg >> 48) & 0x3;
186 mbuf->nb_segs = nb_segs;
187 mbuf->data_len = sg & 0xFFFF;
190 eol = ((const rte_iova_t *)(rx + 1) + ((rx->desc_sizem1 + 1) << 1));
191 /* Skip SG_S and first IOVA*/
192 iova_list = ((const rte_iova_t *)(rx + 1)) + 2;
195 rearm = rearm & ~0xFFFF;
199 mbuf->next = ((struct rte_mbuf *)*iova_list) - 1;
202 __mempool_check_cookies(mbuf->pool, (void **)&mbuf, 1, 1);
204 mbuf->data_len = sg & 0xFFFF;
206 *(uint64_t *)(&mbuf->rearm_data) = rearm;
210 if (!nb_segs && (iova_list + 1 < eol)) {
211 sg = *(const uint64_t *)(iova_list);
212 nb_segs = (sg >> 48) & 0x3;
213 head->nb_segs += nb_segs;
214 iova_list = (const rte_iova_t *)(iova_list + 1);
220 static __rte_always_inline uint16_t
221 nix_rx_sec_cptres_get(const void *cq)
223 volatile const struct otx2_cpt_res *res;
225 res = (volatile const struct otx2_cpt_res *)((const char *)cq +
226 INLINE_CPT_RESULT_OFFSET);
231 static __rte_always_inline void *
232 nix_rx_sec_sa_get(const void * const lookup_mem, int spi, uint16_t port)
234 const uint64_t *const *sa_tbl = (const uint64_t * const *)
235 ((const uint8_t *)lookup_mem + OTX2_NIX_SA_TBL_START);
237 return (void *)sa_tbl[port][spi];
240 static __rte_always_inline uint64_t
241 nix_rx_sec_mbuf_update(const struct nix_rx_parse_s *rx,
242 const struct nix_cqe_hdr_s *cq, struct rte_mbuf *m,
243 const void * const lookup_mem)
245 uint8_t *l2_ptr, *l3_ptr, *l2_ptr_actual, *l3_ptr_actual;
246 struct otx2_ipsec_fp_in_sa *sa;
247 uint16_t m_len, l2_len, ip_len;
248 struct rte_ipv6_hdr *ip6h;
249 struct rte_ipv4_hdr *iph;
250 uint16_t *ether_type;
254 if (unlikely(nix_rx_sec_cptres_get(cq) != OTX2_SEC_COMP_GOOD))
255 return PKT_RX_SEC_OFFLOAD | PKT_RX_SEC_OFFLOAD_FAILED;
257 /* 20 bits of tag would have the SPI */
258 spi = cq->tag & 0xFFFFF;
260 sa = nix_rx_sec_sa_get(lookup_mem, spi, m->port);
261 *rte_security_dynfield(m) = sa->udata64;
263 l2_ptr = rte_pktmbuf_mtod(m, uint8_t *);
264 l2_len = rx->lcptr - rx->laptr;
265 l3_ptr = RTE_PTR_ADD(l2_ptr, l2_len);
267 if (sa->replay_win_sz) {
268 if (cpt_ipsec_ip_antireplay_check(sa, l3_ptr) < 0)
269 return PKT_RX_SEC_OFFLOAD | PKT_RX_SEC_OFFLOAD_FAILED;
272 l2_ptr_actual = RTE_PTR_ADD(l2_ptr,
273 sizeof(struct otx2_ipsec_fp_res_hdr));
274 l3_ptr_actual = RTE_PTR_ADD(l3_ptr,
275 sizeof(struct otx2_ipsec_fp_res_hdr));
277 for (i = l2_len - RTE_ETHER_TYPE_LEN - 1; i >= 0; i--)
278 l2_ptr_actual[i] = l2_ptr[i];
280 m->data_off += sizeof(struct otx2_ipsec_fp_res_hdr);
282 ether_type = RTE_PTR_SUB(l3_ptr_actual, RTE_ETHER_TYPE_LEN);
284 iph = (struct rte_ipv4_hdr *)l3_ptr_actual;
285 if ((iph->version_ihl >> 4) == 4) {
286 ip_len = rte_be_to_cpu_16(iph->total_length);
287 *ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
289 ip6h = (struct rte_ipv6_hdr *)iph;
290 ip_len = rte_be_to_cpu_16(ip6h->payload_len);
291 *ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6);
294 m_len = ip_len + l2_len;
297 return PKT_RX_SEC_OFFLOAD;
300 static __rte_always_inline void
301 otx2_nix_cqe_to_mbuf(const struct nix_cqe_hdr_s *cq, const uint32_t tag,
302 struct rte_mbuf *mbuf, const void *lookup_mem,
303 const uint64_t val, const uint16_t flag)
305 const struct nix_rx_parse_s *rx =
306 (const struct nix_rx_parse_s *)((const uint64_t *)cq + 1);
307 const uint64_t w1 = *(const uint64_t *)rx;
308 const uint16_t len = rx->pkt_lenm1 + 1;
309 uint64_t ol_flags = 0;
311 /* Mark mempool obj as "get" as it is alloc'ed by NIX */
312 __mempool_check_cookies(mbuf->pool, (void **)&mbuf, 1, 1);
314 if (flag & NIX_RX_OFFLOAD_PTYPE_F)
315 mbuf->packet_type = nix_ptype_get(lookup_mem, w1);
317 mbuf->packet_type = 0;
319 if (flag & NIX_RX_OFFLOAD_RSS_F) {
320 mbuf->hash.rss = tag;
321 ol_flags |= PKT_RX_RSS_HASH;
324 if (flag & NIX_RX_OFFLOAD_CHECKSUM_F)
325 ol_flags |= nix_rx_olflags_get(lookup_mem, w1);
327 if (flag & NIX_RX_OFFLOAD_VLAN_STRIP_F) {
328 if (rx->vtag0_gone) {
329 ol_flags |= PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED;
330 mbuf->vlan_tci = rx->vtag0_tci;
332 if (rx->vtag1_gone) {
333 ol_flags |= PKT_RX_QINQ | PKT_RX_QINQ_STRIPPED;
334 mbuf->vlan_tci_outer = rx->vtag1_tci;
338 if (flag & NIX_RX_OFFLOAD_MARK_UPDATE_F)
339 ol_flags = nix_update_match_id(rx->match_id, ol_flags, mbuf);
341 if ((flag & NIX_RX_OFFLOAD_SECURITY_F) &&
342 cq->cqe_type == NIX_XQE_TYPE_RX_IPSECH) {
343 *(uint64_t *)(&mbuf->rearm_data) = val;
344 ol_flags |= nix_rx_sec_mbuf_update(rx, cq, mbuf, lookup_mem);
345 mbuf->ol_flags = ol_flags;
349 mbuf->ol_flags = ol_flags;
350 *(uint64_t *)(&mbuf->rearm_data) = val;
353 if (flag & NIX_RX_MULTI_SEG_F) {
354 nix_cqe_xtract_mseg(rx, mbuf, val);
356 mbuf->data_len = len;
361 #define CKSUM_F NIX_RX_OFFLOAD_CHECKSUM_F
362 #define PTYPE_F NIX_RX_OFFLOAD_PTYPE_F
363 #define RSS_F NIX_RX_OFFLOAD_RSS_F
364 #define RX_VLAN_F NIX_RX_OFFLOAD_VLAN_STRIP_F
365 #define MARK_F NIX_RX_OFFLOAD_MARK_UPDATE_F
366 #define TS_F NIX_RX_OFFLOAD_TSTAMP_F
367 #define RX_SEC_F NIX_RX_OFFLOAD_SECURITY_F
369 /* [SEC] [TSMP] [MARK] [VLAN] [CKSUM] [PTYPE] [RSS] */
370 #define NIX_RX_FASTPATH_MODES \
371 R(no_offload, 0, 0, 0, 0, 0, 0, 0, NIX_RX_OFFLOAD_NONE) \
372 R(rss, 0, 0, 0, 0, 0, 0, 1, RSS_F) \
373 R(ptype, 0, 0, 0, 0, 0, 1, 0, PTYPE_F) \
374 R(ptype_rss, 0, 0, 0, 0, 0, 1, 1, PTYPE_F | RSS_F) \
375 R(cksum, 0, 0, 0, 0, 1, 0, 0, CKSUM_F) \
376 R(cksum_rss, 0, 0, 0, 0, 1, 0, 1, CKSUM_F | RSS_F) \
377 R(cksum_ptype, 0, 0, 0, 0, 1, 1, 0, CKSUM_F | PTYPE_F) \
378 R(cksum_ptype_rss, 0, 0, 0, 0, 1, 1, 1, CKSUM_F | PTYPE_F | RSS_F)\
379 R(vlan, 0, 0, 0, 1, 0, 0, 0, RX_VLAN_F) \
380 R(vlan_rss, 0, 0, 0, 1, 0, 0, 1, RX_VLAN_F | RSS_F) \
381 R(vlan_ptype, 0, 0, 0, 1, 0, 1, 0, RX_VLAN_F | PTYPE_F) \
382 R(vlan_ptype_rss, 0, 0, 0, 1, 0, 1, 1, \
383 RX_VLAN_F | PTYPE_F | RSS_F) \
384 R(vlan_cksum, 0, 0, 0, 1, 1, 0, 0, RX_VLAN_F | CKSUM_F) \
385 R(vlan_cksum_rss, 0, 0, 0, 1, 1, 0, 1, \
386 RX_VLAN_F | CKSUM_F | RSS_F) \
387 R(vlan_cksum_ptype, 0, 0, 0, 1, 1, 1, 0, \
388 RX_VLAN_F | CKSUM_F | PTYPE_F) \
389 R(vlan_cksum_ptype_rss, 0, 0, 0, 1, 1, 1, 1, \
390 RX_VLAN_F | CKSUM_F | PTYPE_F | RSS_F) \
391 R(mark, 0, 0, 1, 0, 0, 0, 0, MARK_F) \
392 R(mark_rss, 0, 0, 1, 0, 0, 0, 1, MARK_F | RSS_F) \
393 R(mark_ptype, 0, 0, 1, 0, 0, 1, 0, MARK_F | PTYPE_F) \
394 R(mark_ptype_rss, 0, 0, 1, 0, 0, 1, 1, MARK_F | PTYPE_F | RSS_F) \
395 R(mark_cksum, 0, 0, 1, 0, 1, 0, 0, MARK_F | CKSUM_F) \
396 R(mark_cksum_rss, 0, 0, 1, 0, 1, 0, 1, MARK_F | CKSUM_F | RSS_F) \
397 R(mark_cksum_ptype, 0, 0, 1, 0, 1, 1, 0, \
398 MARK_F | CKSUM_F | PTYPE_F) \
399 R(mark_cksum_ptype_rss, 0, 0, 1, 0, 1, 1, 1, \
400 MARK_F | CKSUM_F | PTYPE_F | RSS_F) \
401 R(mark_vlan, 0, 0, 1, 1, 0, 0, 0, MARK_F | RX_VLAN_F) \
402 R(mark_vlan_rss, 0, 0, 1, 1, 0, 0, 1, \
403 MARK_F | RX_VLAN_F | RSS_F) \
404 R(mark_vlan_ptype, 0, 0, 1, 1, 0, 1, 0, \
405 MARK_F | RX_VLAN_F | PTYPE_F) \
406 R(mark_vlan_ptype_rss, 0, 0, 1, 1, 0, 1, 1, \
407 MARK_F | RX_VLAN_F | PTYPE_F | RSS_F) \
408 R(mark_vlan_cksum, 0, 0, 1, 1, 1, 0, 0, \
409 MARK_F | RX_VLAN_F | CKSUM_F) \
410 R(mark_vlan_cksum_rss, 0, 0, 1, 1, 1, 0, 1, \
411 MARK_F | RX_VLAN_F | CKSUM_F | RSS_F) \
412 R(mark_vlan_cksum_ptype, 0, 0, 1, 1, 1, 1, 0, \
413 MARK_F | RX_VLAN_F | CKSUM_F | PTYPE_F) \
414 R(mark_vlan_cksum_ptype_rss, 0, 0, 1, 1, 1, 1, 1, \
415 MARK_F | RX_VLAN_F | CKSUM_F | PTYPE_F | RSS_F) \
416 R(ts, 0, 1, 0, 0, 0, 0, 0, TS_F) \
417 R(ts_rss, 0, 1, 0, 0, 0, 0, 1, TS_F | RSS_F) \
418 R(ts_ptype, 0, 1, 0, 0, 0, 1, 0, TS_F | PTYPE_F) \
419 R(ts_ptype_rss, 0, 1, 0, 0, 0, 1, 1, TS_F | PTYPE_F | RSS_F) \
420 R(ts_cksum, 0, 1, 0, 0, 1, 0, 0, TS_F | CKSUM_F) \
421 R(ts_cksum_rss, 0, 1, 0, 0, 1, 0, 1, TS_F | CKSUM_F | RSS_F) \
422 R(ts_cksum_ptype, 0, 1, 0, 0, 1, 1, 0, TS_F | CKSUM_F | PTYPE_F) \
423 R(ts_cksum_ptype_rss, 0, 1, 0, 0, 1, 1, 1, \
424 TS_F | CKSUM_F | PTYPE_F | RSS_F) \
425 R(ts_vlan, 0, 1, 0, 1, 0, 0, 0, TS_F | RX_VLAN_F) \
426 R(ts_vlan_rss, 0, 1, 0, 1, 0, 0, 1, TS_F | RX_VLAN_F | RSS_F) \
427 R(ts_vlan_ptype, 0, 1, 0, 1, 0, 1, 0, \
428 TS_F | RX_VLAN_F | PTYPE_F) \
429 R(ts_vlan_ptype_rss, 0, 1, 0, 1, 0, 1, 1, \
430 TS_F | RX_VLAN_F | PTYPE_F | RSS_F) \
431 R(ts_vlan_cksum, 0, 1, 0, 1, 1, 0, 0, \
432 TS_F | RX_VLAN_F | CKSUM_F) \
433 R(ts_vlan_cksum_rss, 0, 1, 0, 1, 1, 0, 1, \
434 MARK_F | RX_VLAN_F | CKSUM_F | RSS_F) \
435 R(ts_vlan_cksum_ptype, 0, 1, 0, 1, 1, 1, 0, \
436 TS_F | RX_VLAN_F | CKSUM_F | PTYPE_F) \
437 R(ts_vlan_cksum_ptype_rss, 0, 1, 0, 1, 1, 1, 1, \
438 TS_F | RX_VLAN_F | CKSUM_F | PTYPE_F | RSS_F) \
439 R(ts_mark, 0, 1, 1, 0, 0, 0, 0, TS_F | MARK_F) \
440 R(ts_mark_rss, 0, 1, 1, 0, 0, 0, 1, TS_F | MARK_F | RSS_F) \
441 R(ts_mark_ptype, 0, 1, 1, 0, 0, 1, 0, TS_F | MARK_F | PTYPE_F) \
442 R(ts_mark_ptype_rss, 0, 1, 1, 0, 0, 1, 1, \
443 TS_F | MARK_F | PTYPE_F | RSS_F) \
444 R(ts_mark_cksum, 0, 1, 1, 0, 1, 0, 0, TS_F | MARK_F | CKSUM_F) \
445 R(ts_mark_cksum_rss, 0, 1, 1, 0, 1, 0, 1, \
446 TS_F | MARK_F | CKSUM_F | RSS_F) \
447 R(ts_mark_cksum_ptype, 0, 1, 1, 0, 1, 1, 0, \
448 TS_F | MARK_F | CKSUM_F | PTYPE_F) \
449 R(ts_mark_cksum_ptype_rss, 0, 1, 1, 0, 1, 1, 1, \
450 TS_F | MARK_F | CKSUM_F | PTYPE_F | RSS_F) \
451 R(ts_mark_vlan, 0, 1, 1, 1, 0, 0, 0, TS_F | MARK_F | RX_VLAN_F)\
452 R(ts_mark_vlan_rss, 0, 1, 1, 1, 0, 0, 1, \
453 TS_F | MARK_F | RX_VLAN_F | RSS_F) \
454 R(ts_mark_vlan_ptype, 0, 1, 1, 1, 0, 1, 0, \
455 TS_F | MARK_F | RX_VLAN_F | PTYPE_F) \
456 R(ts_mark_vlan_ptype_rss, 0, 1, 1, 1, 0, 1, 1, \
457 TS_F | MARK_F | RX_VLAN_F | PTYPE_F | RSS_F) \
458 R(ts_mark_vlan_cksum_ptype, 0, 1, 1, 1, 1, 1, 0, \
459 TS_F | MARK_F | RX_VLAN_F | CKSUM_F | PTYPE_F) \
460 R(ts_mark_vlan_cksum_ptype_rss, 0, 1, 1, 1, 1, 1, 1, \
461 TS_F | MARK_F | RX_VLAN_F | CKSUM_F | PTYPE_F | RSS_F) \
462 R(sec, 1, 0, 0, 0, 0, 0, 0, RX_SEC_F) \
463 R(sec_rss, 1, 0, 0, 0, 0, 0, 1, RX_SEC_F | RSS_F) \
464 R(sec_ptype, 1, 0, 0, 0, 0, 1, 0, RX_SEC_F | PTYPE_F) \
465 R(sec_ptype_rss, 1, 0, 0, 0, 0, 1, 1, \
466 RX_SEC_F | PTYPE_F | RSS_F) \
467 R(sec_cksum, 1, 0, 0, 0, 1, 0, 0, RX_SEC_F | CKSUM_F) \
468 R(sec_cksum_rss, 1, 0, 0, 0, 1, 0, 1, \
469 RX_SEC_F | CKSUM_F | RSS_F) \
470 R(sec_cksum_ptype, 1, 0, 0, 0, 1, 1, 0, \
471 RX_SEC_F | CKSUM_F | PTYPE_F) \
472 R(sec_cksum_ptype_rss, 1, 0, 0, 0, 1, 1, 1, \
473 RX_SEC_F | CKSUM_F | PTYPE_F | RSS_F) \
474 R(sec_vlan, 1, 0, 0, 1, 0, 0, 0, RX_SEC_F | RX_VLAN_F) \
475 R(sec_vlan_rss, 1, 0, 0, 1, 0, 0, 1, \
476 RX_SEC_F | RX_VLAN_F | RSS_F) \
477 R(sec_vlan_ptype, 1, 0, 0, 1, 0, 1, 0, \
478 RX_SEC_F | RX_VLAN_F | PTYPE_F) \
479 R(sec_vlan_ptype_rss, 1, 0, 0, 1, 0, 1, 1, \
480 RX_SEC_F | RX_VLAN_F | PTYPE_F | RSS_F) \
481 R(sec_vlan_cksum, 1, 0, 0, 1, 1, 0, 0, \
482 RX_SEC_F | RX_VLAN_F | CKSUM_F) \
483 R(sec_vlan_cksum_rss, 1, 0, 0, 1, 1, 0, 1, \
484 RX_SEC_F | RX_VLAN_F | CKSUM_F | RSS_F) \
485 R(sec_vlan_cksum_ptype, 1, 0, 0, 1, 1, 1, 0, \
486 RX_SEC_F | RX_VLAN_F | CKSUM_F | PTYPE_F) \
487 R(sec_vlan_cksum_ptype_rss, 1, 0, 0, 1, 1, 1, 1, \
488 RX_SEC_F | RX_VLAN_F | CKSUM_F | PTYPE_F | RSS_F) \
489 R(sec_mark, 1, 0, 1, 0, 0, 0, 0, RX_SEC_F | MARK_F) \
490 R(sec_mark_rss, 1, 0, 1, 0, 0, 0, 1, RX_SEC_F | MARK_F | RSS_F)\
491 R(sec_mark_ptype, 1, 0, 1, 0, 0, 1, 0, \
492 RX_SEC_F | MARK_F | PTYPE_F) \
493 R(sec_mark_ptype_rss, 1, 0, 1, 0, 0, 1, 1, \
494 RX_SEC_F | MARK_F | PTYPE_F | RSS_F) \
495 R(sec_mark_cksum, 1, 0, 1, 0, 1, 0, 0, \
496 RX_SEC_F | MARK_F | CKSUM_F) \
497 R(sec_mark_cksum_rss, 1, 0, 1, 0, 1, 0, 1, \
498 RX_SEC_F | MARK_F | CKSUM_F | RSS_F) \
499 R(sec_mark_cksum_ptype, 1, 0, 1, 0, 1, 1, 0, \
500 RX_SEC_F | MARK_F | CKSUM_F | PTYPE_F) \
501 R(sec_mark_cksum_ptype_rss, 1, 0, 1, 0, 1, 1, 1, \
502 RX_SEC_F | MARK_F | CKSUM_F | PTYPE_F | RSS_F) \
503 R(sec_mark_vlan, 1, 0, 1, 1, 0, 0, 0, RX_SEC_F | RX_VLAN_F) \
504 R(sec_mark_vlan_rss, 1, 0, 1, 1, 0, 0, 1, \
505 RX_SEC_F | MARK_F | RX_VLAN_F | RSS_F) \
506 R(sec_mark_vlan_ptype, 1, 0, 1, 1, 0, 1, 0, \
507 RX_SEC_F | MARK_F | RX_VLAN_F | PTYPE_F) \
508 R(sec_mark_vlan_ptype_rss, 1, 0, 1, 1, 0, 1, 1, \
509 RX_SEC_F | MARK_F | RX_VLAN_F | PTYPE_F | RSS_F) \
510 R(sec_mark_vlan_cksum, 1, 0, 1, 1, 1, 0, 0, \
511 RX_SEC_F | MARK_F | RX_VLAN_F | CKSUM_F) \
512 R(sec_mark_vlan_cksum_rss, 1, 0, 1, 1, 1, 0, 1, \
513 RX_SEC_F | MARK_F | RX_VLAN_F | CKSUM_F | RSS_F) \
514 R(sec_mark_vlan_cksum_ptype, 1, 0, 1, 1, 1, 1, 0, \
515 RX_SEC_F | MARK_F | RX_VLAN_F | CKSUM_F | PTYPE_F) \
516 R(sec_mark_vlan_cksum_ptype_rss, \
517 1, 0, 1, 1, 1, 1, 1, \
518 RX_SEC_F | MARK_F | RX_VLAN_F | CKSUM_F | PTYPE_F | \
520 R(sec_ts, 1, 1, 0, 0, 0, 0, 0, RX_SEC_F | TS_F) \
521 R(sec_ts_rss, 1, 1, 0, 0, 0, 0, 1, RX_SEC_F | TS_F | RSS_F) \
522 R(sec_ts_ptype, 1, 1, 0, 0, 0, 1, 0, RX_SEC_F | TS_F | PTYPE_F)\
523 R(sec_ts_ptype_rss, 1, 1, 0, 0, 0, 1, 1, \
524 RX_SEC_F | TS_F | PTYPE_F | RSS_F) \
525 R(sec_ts_cksum, 1, 1, 0, 0, 1, 0, 0, RX_SEC_F | TS_F | CKSUM_F)\
526 R(sec_ts_cksum_rss, 1, 1, 0, 0, 1, 0, 1, \
527 RX_SEC_F | TS_F | CKSUM_F | RSS_F) \
528 R(sec_ts_cksum_ptype, 1, 1, 0, 0, 1, 1, 0, \
529 RX_SEC_F | CKSUM_F | PTYPE_F) \
530 R(sec_ts_cksum_ptype_rss, 1, 1, 0, 0, 1, 1, 1, \
531 RX_SEC_F | TS_F | CKSUM_F | PTYPE_F | RSS_F) \
532 R(sec_ts_vlan, 1, 1, 0, 1, 0, 0, 0, \
533 RX_SEC_F | TS_F | RX_VLAN_F) \
534 R(sec_ts_vlan_rss, 1, 1, 0, 1, 0, 0, 1, \
535 RX_SEC_F | TS_F | RX_VLAN_F | RSS_F) \
536 R(sec_ts_vlan_ptype, 1, 1, 0, 1, 0, 1, 0, \
537 RX_SEC_F | TS_F | RX_VLAN_F | PTYPE_F) \
538 R(sec_ts_vlan_ptype_rss, 1, 1, 0, 1, 0, 1, 1, \
539 RX_SEC_F | TS_F | RX_VLAN_F | PTYPE_F | RSS_F) \
540 R(sec_ts_vlan_cksum, 1, 1, 0, 1, 1, 0, 0, \
541 RX_SEC_F | TS_F | RX_VLAN_F | CKSUM_F) \
542 R(sec_ts_vlan_cksum_rss, 1, 1, 0, 1, 1, 0, 1, \
543 RX_SEC_F | TS_F | RX_VLAN_F | CKSUM_F | RSS_F) \
544 R(sec_ts_vlan_cksum_ptype, 1, 1, 0, 1, 1, 1, 0, \
545 RX_SEC_F | TS_F | RX_VLAN_F | CKSUM_F | PTYPE_F) \
546 R(sec_ts_vlan_cksum_ptype_rss, 1, 1, 0, 1, 1, 1, 1, \
547 RX_SEC_F | TS_F | RX_VLAN_F | CKSUM_F | PTYPE_F | \
549 R(sec_ts_mark, 1, 1, 1, 0, 0, 0, 0, RX_SEC_F | TS_F | MARK_F) \
550 R(sec_ts_mark_rss, 1, 1, 1, 0, 0, 0, 1, \
551 RX_SEC_F | TS_F | MARK_F | RSS_F) \
552 R(sec_ts_mark_ptype, 1, 1, 1, 0, 0, 1, 0, \
553 RX_SEC_F | TS_F | MARK_F | PTYPE_F) \
554 R(sec_ts_mark_ptype_rss, 1, 1, 1, 0, 0, 1, 1, \
555 RX_SEC_F | TS_F | MARK_F | PTYPE_F | RSS_F) \
556 R(sec_ts_mark_cksum, 1, 1, 1, 0, 1, 0, 0, \
557 RX_SEC_F | TS_F | MARK_F | CKSUM_F) \
558 R(sec_ts_mark_cksum_rss, 1, 1, 1, 0, 1, 0, 1, \
559 RX_SEC_F | TS_F | MARK_F | CKSUM_F | RSS_F) \
560 R(sec_ts_mark_cksum_ptype, 1, 1, 1, 0, 1, 1, 0, \
561 RX_SEC_F | TS_F | MARK_F | CKSUM_F | PTYPE_F) \
562 R(sec_ts_mark_cksum_ptype_rss, 1, 1, 1, 0, 1, 1, 1, \
563 RX_SEC_F | TS_F | MARK_F | CKSUM_F | PTYPE_F | RSS_F) \
564 R(sec_ts_mark_vlan, 1, 1, 1, 1, 0, 0, 0, \
565 RX_SEC_F | TS_F | MARK_F | RX_VLAN_F) \
566 R(sec_ts_mark_vlan_rss, 1, 1, 1, 1, 0, 0, 1, \
567 RX_SEC_F | RX_VLAN_F | RSS_F) \
568 R(sec_ts_mark_vlan_ptype, 1, 1, 1, 1, 0, 1, 0, \
569 RX_SEC_F | TS_F | MARK_F | RX_VLAN_F | PTYPE_F) \
570 R(sec_ts_mark_vlan_ptype_rss, 1, 1, 1, 1, 0, 1, 1, \
571 RX_SEC_F | TS_F | MARK_F | RX_VLAN_F | PTYPE_F | RSS_F)\
572 R(sec_ts_mark_vlan_cksum, 1, 1, 1, 1, 1, 0, 0, \
573 RX_SEC_F | TS_F | MARK_F | RX_VLAN_F | CKSUM_F) \
574 R(sec_ts_mark_vlan_cksum_rss, 1, 1, 1, 1, 1, 0, 1, \
575 RX_SEC_F | TS_F | MARK_F | RX_VLAN_F | CKSUM_F | RSS_F)\
576 R(sec_ts_mark_vlan_cksum_ptype, 1, 1, 1, 1, 1, 1, 0, \
577 RX_SEC_F | TS_F | MARK_F | RX_VLAN_F | CKSUM_F | \
579 R(sec_ts_mark_vlan_cksum_ptype_rss, \
580 1, 1, 1, 1, 1, 1, 1, \
581 RX_SEC_F | TS_F | MARK_F | RX_VLAN_F | CKSUM_F | \
583 #endif /* __OTX2_RX_H__ */