1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /* Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries.
6 #ifndef __VCAP_API_CLIENT__
7 #define __VCAP_API_CLIENT__
9 #include <linux/types.h>
10 #include <linux/list.h>
11 #include <linux/netdevice.h>
12 #include <net/flow_offload.h>
16 /* Client supplied VCAP rule key control part */
17 struct vcap_client_keyfield_ctrl {
18 struct list_head list; /* For insertion into a rule */
19 enum vcap_key_field key;
20 enum vcap_field_type type;
53 struct vcap_u112_key {
58 struct vcap_u128_key {
63 /* Client supplied VCAP rule field data */
64 struct vcap_client_keyfield_data {
66 struct vcap_u1_key u1;
67 struct vcap_u32_key u32;
68 struct vcap_u48_key u48;
69 struct vcap_u56_key u56;
70 struct vcap_u64_key u64;
71 struct vcap_u72_key u72;
72 struct vcap_u112_key u112;
73 struct vcap_u128_key u128;
77 /* Client supplied VCAP rule key (value, mask) */
78 struct vcap_client_keyfield {
79 struct vcap_client_keyfield_ctrl ctrl;
80 struct vcap_client_keyfield_data data;
83 /* Client supplied VCAP rule action control part */
84 struct vcap_client_actionfield_ctrl {
85 struct list_head list; /* For insertion into a rule */
86 enum vcap_action_field action;
87 enum vcap_field_type type;
90 struct vcap_u1_action {
94 struct vcap_u32_action {
98 struct vcap_u48_action {
102 struct vcap_u56_action {
106 struct vcap_u64_action {
110 struct vcap_u72_action {
114 struct vcap_u112_action {
118 struct vcap_u128_action {
122 struct vcap_client_actionfield_data {
124 struct vcap_u1_action u1;
125 struct vcap_u32_action u32;
126 struct vcap_u48_action u48;
127 struct vcap_u56_action u56;
128 struct vcap_u64_action u64;
129 struct vcap_u72_action u72;
130 struct vcap_u112_action u112;
131 struct vcap_u128_action u128;
135 struct vcap_client_actionfield {
136 struct vcap_client_actionfield_ctrl ctrl;
137 struct vcap_client_actionfield_data data;
146 struct vcap_counter {
151 /* Enable/Disable the VCAP instance lookups */
152 int vcap_enable_lookups(struct vcap_control *vctrl, struct net_device *ndev,
153 int from_cid, int to_cid, unsigned long cookie,
156 /* VCAP rule operations */
157 /* Allocate a rule and fill in the basic information */
158 struct vcap_rule *vcap_alloc_rule(struct vcap_control *vctrl,
159 struct net_device *ndev,
164 /* Free mem of a rule owned by client */
165 void vcap_free_rule(struct vcap_rule *rule);
166 /* Validate a rule before adding it to the VCAP */
167 int vcap_val_rule(struct vcap_rule *rule, u16 l3_proto);
168 /* Add rule to a VCAP instance */
169 int vcap_add_rule(struct vcap_rule *rule);
170 /* Delete rule in a VCAP instance */
171 int vcap_del_rule(struct vcap_control *vctrl, struct net_device *ndev, u32 id);
172 /* Make a full copy of an existing rule with a new rule id */
173 struct vcap_rule *vcap_copy_rule(struct vcap_rule *rule);
174 /* Get rule from a VCAP instance */
175 struct vcap_rule *vcap_get_rule(struct vcap_control *vctrl, u32 id);
176 /* Update existing rule */
177 int vcap_mod_rule(struct vcap_rule *rule);
179 /* Update the keyset for the rule */
180 int vcap_set_rule_set_keyset(struct vcap_rule *rule,
181 enum vcap_keyfield_set keyset);
182 /* Update the actionset for the rule */
183 int vcap_set_rule_set_actionset(struct vcap_rule *rule,
184 enum vcap_actionfield_set actionset);
185 /* Set a rule counter id (for certain VCAPs only) */
186 void vcap_rule_set_counter_id(struct vcap_rule *rule, u32 counter_id);
188 /* VCAP rule field operations */
189 int vcap_rule_add_key_bit(struct vcap_rule *rule, enum vcap_key_field key,
191 int vcap_rule_add_key_u32(struct vcap_rule *rule, enum vcap_key_field key,
192 u32 value, u32 mask);
193 int vcap_rule_add_key_u48(struct vcap_rule *rule, enum vcap_key_field key,
194 struct vcap_u48_key *fieldval);
195 int vcap_rule_add_key_u72(struct vcap_rule *rule, enum vcap_key_field key,
196 struct vcap_u72_key *fieldval);
197 int vcap_rule_add_key_u128(struct vcap_rule *rule, enum vcap_key_field key,
198 struct vcap_u128_key *fieldval);
199 int vcap_rule_add_action_bit(struct vcap_rule *rule,
200 enum vcap_action_field action, enum vcap_bit val);
201 int vcap_rule_add_action_u32(struct vcap_rule *rule,
202 enum vcap_action_field action, u32 value);
204 /* Get number of rules in a vcap instance lookup chain id range */
205 int vcap_admin_rule_count(struct vcap_admin *admin, int cid);
207 /* VCAP rule counter operations */
208 int vcap_get_rule_count_by_cookie(struct vcap_control *vctrl,
209 struct vcap_counter *ctr, u64 cookie);
210 int vcap_rule_set_counter(struct vcap_rule *rule, struct vcap_counter *ctr);
211 int vcap_rule_get_counter(struct vcap_rule *rule, struct vcap_counter *ctr);
213 /* VCAP lookup operations */
214 /* Convert a chain id to a VCAP lookup index */
215 int vcap_chain_id_to_lookup(struct vcap_admin *admin, int cur_cid);
216 /* Lookup a vcap instance using chain id */
217 struct vcap_admin *vcap_find_admin(struct vcap_control *vctrl, int cid);
218 /* Find information on a key field in a rule */
219 const struct vcap_field *vcap_lookup_keyfield(struct vcap_rule *rule,
220 enum vcap_key_field key);
221 /* Find a rule id with a provided cookie */
222 int vcap_lookup_rule_by_cookie(struct vcap_control *vctrl, u64 cookie);
223 /* Calculate the value used for chaining VCAP rules */
224 int vcap_chain_offset(struct vcap_control *vctrl, int from_cid, int to_cid);
225 /* Is the next chain id in the following lookup, possible in another VCAP */
226 bool vcap_is_next_lookup(struct vcap_control *vctrl, int cur_cid, int next_cid);
227 /* Is this chain id the last lookup of all VCAPs */
228 bool vcap_is_last_chain(struct vcap_control *vctrl, int cid, bool ingress);
229 /* Match a list of keys against the keysets available in a vcap type */
230 bool vcap_rule_find_keysets(struct vcap_rule *rule,
231 struct vcap_keyset_list *matches);
232 /* Return the keyset information for the keyset */
233 const struct vcap_set *vcap_keyfieldset(struct vcap_control *vctrl,
235 enum vcap_keyfield_set keyset);
236 /* Copy to host byte order */
237 void vcap_netbytes_copy(u8 *dst, u8 *src, int count);
239 /* Convert validation error code into tc extact error message */
240 void vcap_set_tc_exterr(struct flow_cls_offload *fco, struct vcap_rule *vrule);
242 /* Cleanup a VCAP instance */
243 int vcap_del_rules(struct vcap_control *vctrl, struct vcap_admin *admin);
245 /* Add a keyset to a keyset list */
246 bool vcap_keyset_list_add(struct vcap_keyset_list *keysetlist,
247 enum vcap_keyfield_set keyset);
248 /* Drop keys in a keylist and any keys that are not supported by the keyset */
249 int vcap_filter_rule_keys(struct vcap_rule *rule,
250 enum vcap_key_field keylist[], int length,
251 bool drop_unsupported);
253 /* map keyset id to a string with the keyset name */
254 const char *vcap_keyset_name(struct vcap_control *vctrl,
255 enum vcap_keyfield_set keyset);
256 /* map key field id to a string with the key name */
257 const char *vcap_keyfield_name(struct vcap_control *vctrl,
258 enum vcap_key_field key);
260 /* Modify a 32 bit key field with value and mask in the rule */
261 int vcap_rule_mod_key_u32(struct vcap_rule *rule, enum vcap_key_field key,
262 u32 value, u32 mask);
263 /* Modify a 32 bit action field with value in the rule */
264 int vcap_rule_mod_action_u32(struct vcap_rule *rule,
265 enum vcap_action_field action,
268 /* Get a 32 bit key field value and mask from the rule */
269 int vcap_rule_get_key_u32(struct vcap_rule *rule, enum vcap_key_field key,
270 u32 *value, u32 *mask);
272 /* Remove a key field with value and mask in the rule */
273 int vcap_rule_rem_key(struct vcap_rule *rule, enum vcap_key_field key);
275 /* Select the keyset from the list that results in the smallest rule size */
276 enum vcap_keyfield_set
277 vcap_select_min_rule_keyset(struct vcap_control *vctrl, enum vcap_type vtype,
278 struct vcap_keyset_list *kslist);
280 struct vcap_client_actionfield *
281 vcap_find_actionfield(struct vcap_rule *rule, enum vcap_action_field act);
282 #endif /* __VCAP_API_CLIENT__ */