1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
2 | /* Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries. |
3 | * Microchip VCAP API |
4 | */ |
5 | |
6 | #ifndef __VCAP_API_CLIENT__ |
7 | #define __VCAP_API_CLIENT__ |
8 | |
9 | #include <linux/types.h> |
10 | #include <linux/list.h> |
11 | #include <linux/netdevice.h> |
12 | #include <net/flow_offload.h> |
13 | |
14 | #include "vcap_api.h" |
15 | |
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; |
21 | }; |
22 | |
23 | struct vcap_u1_key { |
24 | u8 value; |
25 | u8 mask; |
26 | }; |
27 | |
28 | struct vcap_u32_key { |
29 | u32 value; |
30 | u32 mask; |
31 | }; |
32 | |
33 | struct vcap_u48_key { |
34 | u8 value[6]; |
35 | u8 mask[6]; |
36 | }; |
37 | |
38 | struct vcap_u56_key { |
39 | u8 value[7]; |
40 | u8 mask[7]; |
41 | }; |
42 | |
43 | struct vcap_u64_key { |
44 | u8 value[8]; |
45 | u8 mask[8]; |
46 | }; |
47 | |
48 | struct vcap_u72_key { |
49 | u8 value[9]; |
50 | u8 mask[9]; |
51 | }; |
52 | |
53 | struct vcap_u112_key { |
54 | u8 value[14]; |
55 | u8 mask[14]; |
56 | }; |
57 | |
58 | struct vcap_u128_key { |
59 | u8 value[16]; |
60 | u8 mask[16]; |
61 | }; |
62 | |
63 | /* Client supplied VCAP rule field data */ |
64 | struct vcap_client_keyfield_data { |
65 | union { |
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; |
74 | }; |
75 | }; |
76 | |
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; |
81 | }; |
82 | |
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; |
88 | }; |
89 | |
90 | struct vcap_u1_action { |
91 | u8 value; |
92 | }; |
93 | |
94 | struct vcap_u32_action { |
95 | u32 value; |
96 | }; |
97 | |
98 | struct vcap_u48_action { |
99 | u8 value[6]; |
100 | }; |
101 | |
102 | struct vcap_u56_action { |
103 | u8 value[7]; |
104 | }; |
105 | |
106 | struct vcap_u64_action { |
107 | u8 value[8]; |
108 | }; |
109 | |
110 | struct vcap_u72_action { |
111 | u8 value[9]; |
112 | }; |
113 | |
114 | struct vcap_u112_action { |
115 | u8 value[14]; |
116 | }; |
117 | |
118 | struct vcap_u128_action { |
119 | u8 value[16]; |
120 | }; |
121 | |
122 | struct vcap_client_actionfield_data { |
123 | union { |
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; |
132 | }; |
133 | }; |
134 | |
135 | struct vcap_client_actionfield { |
136 | struct vcap_client_actionfield_ctrl ctrl; |
137 | struct vcap_client_actionfield_data data; |
138 | }; |
139 | |
140 | enum vcap_bit { |
141 | VCAP_BIT_ANY, |
142 | VCAP_BIT_0, |
143 | VCAP_BIT_1 |
144 | }; |
145 | |
146 | struct vcap_counter { |
147 | u32 value; |
148 | bool sticky; |
149 | }; |
150 | |
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, |
154 | bool enable); |
155 | |
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, |
160 | int vcap_chain_id, |
161 | enum vcap_user user, |
162 | u16 priority, |
163 | u32 id); |
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); |
178 | |
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); |
187 | |
188 | /* VCAP rule field operations */ |
189 | int vcap_rule_add_key_bit(struct vcap_rule *rule, enum vcap_key_field key, |
190 | enum vcap_bit val); |
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); |
203 | |
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); |
206 | |
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); |
212 | |
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, |
234 | enum vcap_type vt, |
235 | enum vcap_keyfield_set keyset); |
236 | /* Copy to host byte order */ |
237 | void vcap_netbytes_copy(u8 *dst, u8 *src, int count); |
238 | |
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); |
241 | |
242 | /* Cleanup a VCAP instance */ |
243 | int vcap_del_rules(struct vcap_control *vctrl, struct vcap_admin *admin); |
244 | |
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); |
252 | |
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); |
259 | |
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, |
266 | u32 value); |
267 | |
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); |
271 | |
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); |
274 | |
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); |
279 | |
280 | struct vcap_client_actionfield * |
281 | vcap_find_actionfield(struct vcap_rule *rule, enum vcap_action_field act); |
282 | #endif /* __VCAP_API_CLIENT__ */ |
283 | |