1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2019 Intel Corporation
5 #ifndef _ICE_GENERIC_FLOW_H_
6 #define _ICE_GENERIC_FLOW_H_
8 #include <rte_flow_driver.h>
12 #define ICE_PROT_MAC_INNER (1ULL << 1)
13 #define ICE_PROT_MAC_OUTER (1ULL << 2)
14 #define ICE_PROT_VLAN_INNER (1ULL << 3)
15 #define ICE_PROT_VLAN_OUTER (1ULL << 4)
16 #define ICE_PROT_IPV4_INNER (1ULL << 5)
17 #define ICE_PROT_IPV4_OUTER (1ULL << 6)
18 #define ICE_PROT_IPV6_INNER (1ULL << 7)
19 #define ICE_PROT_IPV6_OUTER (1ULL << 8)
20 #define ICE_PROT_TCP_INNER (1ULL << 9)
21 #define ICE_PROT_TCP_OUTER (1ULL << 10)
22 #define ICE_PROT_UDP_INNER (1ULL << 11)
23 #define ICE_PROT_UDP_OUTER (1ULL << 12)
24 #define ICE_PROT_SCTP_INNER (1ULL << 13)
25 #define ICE_PROT_SCTP_OUTER (1ULL << 14)
26 #define ICE_PROT_ICMP4_INNER (1ULL << 15)
27 #define ICE_PROT_ICMP4_OUTER (1ULL << 16)
28 #define ICE_PROT_ICMP6_INNER (1ULL << 17)
29 #define ICE_PROT_ICMP6_OUTER (1ULL << 18)
30 #define ICE_PROT_VXLAN (1ULL << 19)
31 #define ICE_PROT_NVGRE (1ULL << 20)
32 #define ICE_PROT_GTPU (1ULL << 21)
36 #define ICE_SMAC (1ULL << 63)
37 #define ICE_DMAC (1ULL << 62)
38 #define ICE_ETHERTYPE (1ULL << 61)
39 #define ICE_IP_SRC (1ULL << 60)
40 #define ICE_IP_DST (1ULL << 59)
41 #define ICE_IP_PROTO (1ULL << 58)
42 #define ICE_IP_TTL (1ULL << 57)
43 #define ICE_IP_TOS (1ULL << 56)
44 #define ICE_SPORT (1ULL << 55)
45 #define ICE_DPORT (1ULL << 54)
46 #define ICE_ICMP_TYPE (1ULL << 53)
47 #define ICE_ICMP_CODE (1ULL << 52)
48 #define ICE_VXLAN_VNI (1ULL << 51)
49 #define ICE_NVGRE_TNI (1ULL << 50)
50 #define ICE_GTPU_TEID (1ULL << 49)
51 #define ICE_GTPU_QFI (1ULL << 48)
55 #define ICE_INSET_NONE 0ULL
59 #define ICE_INSET_SMAC (ICE_PROT_MAC_OUTER | ICE_SMAC)
60 #define ICE_INSET_DMAC (ICE_PROT_MAC_OUTER | ICE_DMAC)
61 #define ICE_INSET_VLAN_INNER (ICE_PROT_VLAN_INNER)
62 #define ICE_INSET_VLAN_OUTER (ICE_PROT_VLAN_OUTER)
63 #define ICE_INSET_ETHERTYPE (ICE_ETHERTYPE)
65 #define ICE_INSET_IPV4_SRC \
66 (ICE_PROT_IPV4_OUTER | ICE_IP_SRC)
67 #define ICE_INSET_IPV4_DST \
68 (ICE_PROT_IPV4_OUTER | ICE_IP_DST)
69 #define ICE_INSET_IPV4_TOS \
70 (ICE_PROT_IPV4_OUTER | ICE_IP_TOS)
71 #define ICE_INSET_IPV4_PROTO \
72 (ICE_PROT_IPV4_OUTER | ICE_IP_PROTO)
73 #define ICE_INSET_IPV4_TTL \
74 (ICE_PROT_IPV4_OUTER | ICE_IP_TTL)
75 #define ICE_INSET_IPV6_SRC \
76 (ICE_PROT_IPV6_OUTER | ICE_IP_SRC)
77 #define ICE_INSET_IPV6_DST \
78 (ICE_PROT_IPV6_OUTER | ICE_IP_DST)
79 #define ICE_INSET_IPV6_NEXT_HDR \
80 (ICE_PROT_IPV6_OUTER | ICE_IP_PROTO)
81 #define ICE_INSET_IPV6_HOP_LIMIT \
82 (ICE_PROT_IPV6_OUTER | ICE_IP_TTL)
83 #define ICE_INSET_IPV6_TC \
84 (ICE_PROT_IPV6_OUTER | ICE_IP_TOS)
86 #define ICE_INSET_TCP_SRC_PORT \
87 (ICE_PROT_TCP_OUTER | ICE_SPORT)
88 #define ICE_INSET_TCP_DST_PORT \
89 (ICE_PROT_TCP_OUTER | ICE_DPORT)
90 #define ICE_INSET_UDP_SRC_PORT \
91 (ICE_PROT_UDP_OUTER | ICE_SPORT)
92 #define ICE_INSET_UDP_DST_PORT \
93 (ICE_PROT_UDP_OUTER | ICE_DPORT)
94 #define ICE_INSET_SCTP_SRC_PORT \
95 (ICE_PROT_SCTP_OUTER | ICE_SPORT)
96 #define ICE_INSET_SCTP_DST_PORT \
97 (ICE_PROT_SCTP_OUTER | ICE_DPORT)
98 #define ICE_INSET_ICMP4_SRC_PORT \
99 (ICE_PROT_ICMP4_OUTER | ICE_SPORT)
100 #define ICE_INSET_ICMP4_DST_PORT \
101 (ICE_PROT_ICMP4_OUTER | ICE_DPORT)
102 #define ICE_INSET_ICMP6_SRC_PORT \
103 (ICE_PROT_ICMP6_OUTER | ICE_SPORT)
104 #define ICE_INSET_ICMP6_DST_PORT \
105 (ICE_PROT_ICMP6_OUTER | ICE_DPORT)
106 #define ICE_INSET_ICMP4_TYPE \
107 (ICE_PROT_ICMP4_OUTER | ICE_ICMP_TYPE)
108 #define ICE_INSET_ICMP4_CODE \
109 (ICE_PROT_ICMP4_OUTER | ICE_ICMP_CODE)
110 #define ICE_INSET_ICMP6_TYPE \
111 (ICE_PROT_ICMP6_OUTER | ICE_ICMP_TYPE)
112 #define ICE_INSET_ICMP6_CODE \
113 (ICE_PROT_ICMP6_OUTER | ICE_ICMP_CODE)
117 #define ICE_INSET_TUN_SMAC \
118 (ICE_PROT_MAC_INNER | ICE_SMAC)
119 #define ICE_INSET_TUN_DMAC \
120 (ICE_PROT_MAC_INNER | ICE_DMAC)
122 #define ICE_INSET_TUN_IPV4_SRC \
123 (ICE_PROT_IPV4_INNER | ICE_IP_SRC)
124 #define ICE_INSET_TUN_IPV4_DST \
125 (ICE_PROT_IPV4_INNER | ICE_IP_DST)
126 #define ICE_INSET_TUN_IPV4_TTL \
127 (ICE_PROT_IPV4_INNER | ICE_IP_TTL)
128 #define ICE_INSET_TUN_IPV4_PROTO \
129 (ICE_PROT_IPV4_INNER | ICE_IP_PROTO)
130 #define ICE_INSET_TUN_IPV4_TOS \
131 (ICE_PROT_IPV4_INNER | ICE_IP_TOS)
132 #define ICE_INSET_TUN_IPV6_SRC \
133 (ICE_PROT_IPV6_INNER | ICE_IP_SRC)
134 #define ICE_INSET_TUN_IPV6_DST \
135 (ICE_PROT_IPV6_INNER | ICE_IP_DST)
136 #define ICE_INSET_TUN_IPV6_HOP_LIMIT \
137 (ICE_PROT_IPV6_INNER | ICE_IP_TTL)
138 #define ICE_INSET_TUN_IPV6_NEXT_HDR \
139 (ICE_PROT_IPV6_INNER | ICE_IP_PROTO)
140 #define ICE_INSET_TUN_IPV6_TC \
141 (ICE_PROT_IPV6_INNER | ICE_IP_TOS)
143 #define ICE_INSET_TUN_TCP_SRC_PORT \
144 (ICE_PROT_TCP_INNER | ICE_SPORT)
145 #define ICE_INSET_TUN_TCP_DST_PORT \
146 (ICE_PROT_TCP_INNER | ICE_DPORT)
147 #define ICE_INSET_TUN_UDP_SRC_PORT \
148 (ICE_PROT_UDP_INNER | ICE_SPORT)
149 #define ICE_INSET_TUN_UDP_DST_PORT \
150 (ICE_PROT_UDP_INNER | ICE_DPORT)
151 #define ICE_INSET_TUN_SCTP_SRC_PORT \
152 (ICE_PROT_SCTP_INNER | ICE_SPORT)
153 #define ICE_INSET_TUN_SCTP_DST_PORT \
154 (ICE_PROT_SCTP_INNER | ICE_DPORT)
155 #define ICE_INSET_TUN_ICMP4_SRC_PORT \
156 (ICE_PROT_ICMP4_INNER | ICE_SPORT)
157 #define ICE_INSET_TUN_ICMP4_DST_PORT \
158 (ICE_PROT_ICMP4_INNER | ICE_DPORT)
159 #define ICE_INSET_TUN_ICMP6_SRC_PORT \
160 (ICE_PROT_ICMP6_INNER | ICE_SPORT)
161 #define ICE_INSET_TUN_ICMP6_DST_PORT \
162 (ICE_PROT_ICMP6_INNER | ICE_DPORT)
163 #define ICE_INSET_TUN_ICMP4_TYPE \
164 (ICE_PROT_ICMP4_INNER | ICE_ICMP_TYPE)
165 #define ICE_INSET_TUN_ICMP4_CODE \
166 (ICE_PROT_ICMP4_INNER | ICE_ICMP_CODE)
167 #define ICE_INSET_TUN_ICMP6_TYPE \
168 (ICE_PROT_ICMP6_INNER | ICE_ICMP_TYPE)
169 #define ICE_INSET_TUN_ICMP6_CODE \
170 (ICE_PROT_ICMP6_INNER | ICE_ICMP_CODE)
172 #define ICE_INSET_TUN_VXLAN_VNI \
173 (ICE_PROT_VXLAN | ICE_VXLAN_VNI)
174 #define ICE_INSET_TUN_NVGRE_TNI \
175 (ICE_PROT_NVGRE | ICE_NVGRE_TNI)
176 #define ICE_INSET_GTPU_TEID \
177 (ICE_PROT_GTPU | ICE_GTPU_TEID)
178 #define ICE_INSET_GTPU_QFI \
179 (ICE_PROT_GTPU | ICE_GTPU_QFI)
183 extern const struct rte_flow_ops ice_flow_ops;
186 enum ice_flow_engine_type {
187 ICE_FLOW_ENGINE_NONE = 0,
188 ICE_FLOW_ENGINE_FDIR,
189 ICE_FLOW_ENGINE_SWITCH,
190 ICE_FLOW_ENGINE_HASH,
196 * classification stages.
197 * for non-pipeline mode, we have two classification stages: Distributor/RSS
198 * for pipeline-mode we have three classification stages:
199 * Permission/Distributor/RSS
201 enum ice_flow_classification_stage {
202 ICE_FLOW_STAGE_NONE = 0,
204 ICE_FLOW_STAGE_PERMISSION,
205 ICE_FLOW_STAGE_DISTRIBUTOR,
208 /* pattern structure */
209 struct ice_pattern_match_item {
210 enum rte_flow_item_type *pattern_list;
211 /* pattern_list must end with RTE_FLOW_ITEM_TYPE_END */
212 uint64_t input_set_mask;
216 typedef int (*engine_init_t)(struct ice_adapter *ad);
217 typedef void (*engine_uninit_t)(struct ice_adapter *ad);
218 typedef int (*engine_create_t)(struct ice_adapter *ad,
219 struct rte_flow *flow,
221 struct rte_flow_error *error);
222 typedef int (*engine_destroy_t)(struct ice_adapter *ad,
223 struct rte_flow *flow,
224 struct rte_flow_error *error);
225 typedef int (*engine_query_t)(struct ice_adapter *ad,
226 struct rte_flow *flow,
227 struct rte_flow_query_count *count,
228 struct rte_flow_error *error);
229 typedef void (*engine_free_t) (struct rte_flow *flow);
230 typedef int (*parse_pattern_action_t)(struct ice_adapter *ad,
231 struct ice_pattern_match_item *array,
233 const struct rte_flow_item pattern[],
234 const struct rte_flow_action actions[],
236 struct rte_flow_error *error);
238 /* Struct to store engine created. */
239 struct ice_flow_engine {
240 TAILQ_ENTRY(ice_flow_engine) node;
242 engine_uninit_t uninit;
243 engine_create_t create;
244 engine_destroy_t destroy;
245 engine_query_t query_count;
247 enum ice_flow_engine_type type;
249 TAILQ_HEAD(ice_engine_list, ice_flow_engine);
251 /* Struct to store flow created. */
253 TAILQ_ENTRY(rte_flow) node;
254 struct ice_flow_engine *engine;
258 struct ice_flow_parser {
259 struct ice_flow_engine *engine;
260 struct ice_pattern_match_item *array;
262 parse_pattern_action_t parse_pattern_action;
263 enum ice_flow_classification_stage stage;
266 /* Struct to store parser created. */
267 struct ice_flow_parser_node {
268 TAILQ_ENTRY(ice_flow_parser_node) node;
269 struct ice_flow_parser *parser;
272 void ice_register_flow_engine(struct ice_flow_engine *engine);
273 int ice_flow_init(struct ice_adapter *ad);
274 void ice_flow_uninit(struct ice_adapter *ad);
275 int ice_register_parser(struct ice_flow_parser *parser,
276 struct ice_adapter *ad);
277 void ice_unregister_parser(struct ice_flow_parser *parser,
278 struct ice_adapter *ad);
279 struct ice_pattern_match_item *
280 ice_search_pattern_match_item(const struct rte_flow_item pattern[],
281 struct ice_pattern_match_item *array,
283 struct rte_flow_error *error);