1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2016 Intel Corporation
4 #ifndef __INCLUDE_PIPELINE_ACTIONS_COMMON_H__
5 #define __INCLUDE_PIPELINE_ACTIONS_COMMON_H__
9 #include <rte_common.h>
10 #include <rte_cycles.h>
12 #include <rte_pipeline.h>
14 #define PIPELINE_PORT_IN_AH(f_ah, f_pkt_work, f_pkt4_work) \
17 __rte_unused struct rte_pipeline *p, \
18 struct rte_mbuf **pkts, \
24 for (i = 0; i < (n_pkts & (~0x3LLU)); i += 4) \
25 f_pkt4_work(&pkts[i], arg); \
27 for ( ; i < n_pkts; i++) \
28 f_pkt_work(pkts[i], arg); \
33 #define PIPELINE_PORT_IN_AH_HIJACK_ALL(f_ah, f_pkt_work, f_pkt4_work) \
36 struct rte_pipeline *p, \
37 struct rte_mbuf **pkts, \
41 uint64_t pkt_mask = RTE_LEN2MASK(n_pkts, uint64_t); \
44 rte_pipeline_ah_packet_hijack(p, pkt_mask); \
46 for (i = 0; i < (n_pkts & (~0x3LLU)); i += 4) \
47 f_pkt4_work(&pkts[i], arg); \
49 for ( ; i < n_pkts; i++) \
50 f_pkt_work(pkts[i], arg); \
55 #define PIPELINE_TABLE_AH_HIT(f_ah, f_pkt_work, f_pkt4_work) \
58 __rte_unused struct rte_pipeline *p, \
59 struct rte_mbuf **pkts, \
60 uint64_t pkts_in_mask, \
61 struct rte_pipeline_table_entry **entries, \
64 if ((pkts_in_mask & (pkts_in_mask + 1)) == 0) { \
65 uint64_t n_pkts = __builtin_popcountll(pkts_in_mask); \
68 for (i = 0; i < (n_pkts & (~0x3LLU)); i += 4) \
69 f_pkt4_work(&pkts[i], &entries[i], arg); \
71 for ( ; i < n_pkts; i++) \
72 f_pkt_work(pkts[i], entries[i], arg); \
74 for ( ; pkts_in_mask; ) { \
75 uint32_t pos = __builtin_ctzll(pkts_in_mask); \
76 uint64_t pkt_mask = 1LLU << pos; \
78 pkts_in_mask &= ~pkt_mask; \
79 f_pkt_work(pkts[pos], entries[pos], arg); \
85 #define PIPELINE_TABLE_AH_MISS(f_ah, f_pkt_work, f_pkt4_work) \
88 __rte_unused struct rte_pipeline *p, \
89 struct rte_mbuf **pkts, \
90 uint64_t pkts_in_mask, \
91 struct rte_pipeline_table_entry *entry, \
94 if ((pkts_in_mask & (pkts_in_mask + 1)) == 0) { \
95 uint64_t n_pkts = __builtin_popcountll(pkts_in_mask); \
98 for (i = 0; i < (n_pkts & (~0x3LLU)); i += 4) \
99 f_pkt4_work(&pkts[i], entry, arg); \
101 for ( ; i < n_pkts; i++) \
102 f_pkt_work(pkts[i], entry, arg); \
104 for ( ; pkts_in_mask; ) { \
105 uint32_t pos = __builtin_ctzll(pkts_in_mask); \
106 uint64_t pkt_mask = 1LLU << pos; \
108 pkts_in_mask &= ~pkt_mask; \
109 f_pkt_work(pkts[pos], entry, arg); \
115 #define PIPELINE_TABLE_AH_HIT_DROP_TIME(f_ah, f_pkt_work, f_pkt4_work) \
118 struct rte_pipeline *p, \
119 struct rte_mbuf **pkts, \
120 uint64_t pkts_mask, \
121 struct rte_pipeline_table_entry **entries, \
124 uint64_t pkts_in_mask = pkts_mask; \
125 uint64_t pkts_out_mask = pkts_mask; \
126 uint64_t time = rte_rdtsc(); \
128 if ((pkts_in_mask & (pkts_in_mask + 1)) == 0) { \
129 uint64_t n_pkts = __builtin_popcountll(pkts_in_mask); \
132 for (i = 0; i < (n_pkts & (~0x3LLU)); i += 4) { \
133 uint64_t mask = f_pkt4_work(&pkts[i], \
134 &entries[i], arg, time); \
135 pkts_out_mask ^= mask << i; \
138 for ( ; i < n_pkts; i++) { \
139 uint64_t mask = f_pkt_work(pkts[i], \
140 entries[i], arg, time); \
141 pkts_out_mask ^= mask << i; \
144 for ( ; pkts_in_mask; ) { \
145 uint32_t pos = __builtin_ctzll(pkts_in_mask); \
146 uint64_t pkt_mask = 1LLU << pos; \
147 uint64_t mask = f_pkt_work(pkts[pos], \
148 entries[pos], arg, time); \
150 pkts_in_mask &= ~pkt_mask; \
151 pkts_out_mask ^= mask << pos; \
154 rte_pipeline_ah_packet_drop(p, pkts_out_mask ^ pkts_mask); \
159 #define PIPELINE_TABLE_AH_MISS_DROP_TIME(f_ah, f_pkt_work, f_pkt4_work) \
162 struct rte_pipeline *p, \
163 struct rte_mbuf **pkts, \
164 uint64_t pkts_mask, \
165 struct rte_pipeline_table_entry *entry, \
168 uint64_t pkts_in_mask = pkts_mask; \
169 uint64_t pkts_out_mask = pkts_mask; \
170 uint64_t time = rte_rdtsc(); \
172 if ((pkts_in_mask & (pkts_in_mask + 1)) == 0) { \
173 uint64_t n_pkts = __builtin_popcountll(pkts_in_mask); \
176 for (i = 0; i < (n_pkts & (~0x3LLU)); i += 4) { \
177 uint64_t mask = f_pkt4_work(&pkts[i], \
179 pkts_out_mask ^= mask << i; \
182 for ( ; i < n_pkts; i++) { \
183 uint64_t mask = f_pkt_work(pkts[i], entry, arg, time);\
184 pkts_out_mask ^= mask << i; \
187 for ( ; pkts_in_mask; ) { \
188 uint32_t pos = __builtin_ctzll(pkts_in_mask); \
189 uint64_t pkt_mask = 1LLU << pos; \
190 uint64_t mask = f_pkt_work(pkts[pos], \
193 pkts_in_mask &= ~pkt_mask; \
194 pkts_out_mask ^= mask << pos; \
197 rte_pipeline_ah_packet_drop(p, pkts_out_mask ^ pkts_mask); \