Linux Audio

Check our new training course

Loading...
  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 */
 17struct 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
 23struct vcap_u1_key {
 24	u8 value;
 25	u8 mask;
 26};
 27
 28struct vcap_u32_key {
 29	u32 value;
 30	u32 mask;
 31};
 32
 33struct vcap_u48_key {
 34	u8 value[6];
 35	u8 mask[6];
 36};
 37
 38struct vcap_u56_key {
 39	u8 value[7];
 40	u8 mask[7];
 41};
 42
 43struct vcap_u64_key {
 44	u8 value[8];
 45	u8 mask[8];
 46};
 47
 48struct vcap_u72_key {
 49	u8 value[9];
 50	u8 mask[9];
 51};
 52
 53struct vcap_u112_key {
 54	u8 value[14];
 55	u8 mask[14];
 56};
 57
 58struct vcap_u128_key {
 59	u8 value[16];
 60	u8 mask[16];
 61};
 62
 63/* Client supplied VCAP rule field data */
 64struct 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) */
 78struct 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 */
 84struct 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
 90struct vcap_u1_action {
 91	u8 value;
 92};
 93
 94struct vcap_u32_action {
 95	u32 value;
 96};
 97
 98struct vcap_u48_action {
 99	u8 value[6];
100};
101
102struct vcap_u56_action {
103	u8 value[7];
104};
105
106struct vcap_u64_action {
107	u8 value[8];
108};
109
110struct vcap_u72_action {
111	u8 value[9];
112};
113
114struct vcap_u112_action {
115	u8 value[14];
116};
117
118struct vcap_u128_action {
119	u8 value[16];
120};
121
122struct 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
135struct vcap_client_actionfield {
136	struct vcap_client_actionfield_ctrl ctrl;
137	struct vcap_client_actionfield_data data;
138};
139
140enum vcap_bit {
141	VCAP_BIT_ANY,
142	VCAP_BIT_0,
143	VCAP_BIT_1
144};
145
146struct vcap_counter {
147	u32 value;
148	bool sticky;
149};
150
151/* Enable/Disable the VCAP instance lookups */
152int 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 */
158struct 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 */
165void vcap_free_rule(struct vcap_rule *rule);
166/* Validate a rule before adding it to the VCAP */
167int vcap_val_rule(struct vcap_rule *rule, u16 l3_proto);
168/* Add rule to a VCAP instance */
169int vcap_add_rule(struct vcap_rule *rule);
170/* Delete rule in a VCAP instance */
171int 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 */
173struct vcap_rule *vcap_copy_rule(struct vcap_rule *rule);
174/* Get rule from a VCAP instance */
175struct vcap_rule *vcap_get_rule(struct vcap_control *vctrl, u32 id);
176/* Update existing rule */
177int vcap_mod_rule(struct vcap_rule *rule);
178
179/* Update the keyset for the rule */
180int vcap_set_rule_set_keyset(struct vcap_rule *rule,
181			     enum vcap_keyfield_set keyset);
182/* Update the actionset for the rule */
183int 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) */
186void vcap_rule_set_counter_id(struct vcap_rule *rule, u32 counter_id);
187
188/* VCAP rule field operations */
189int vcap_rule_add_key_bit(struct vcap_rule *rule, enum vcap_key_field key,
190			  enum vcap_bit val);
191int vcap_rule_add_key_u32(struct vcap_rule *rule, enum vcap_key_field key,
192			  u32 value, u32 mask);
193int vcap_rule_add_key_u48(struct vcap_rule *rule, enum vcap_key_field key,
194			  struct vcap_u48_key *fieldval);
195int vcap_rule_add_key_u72(struct vcap_rule *rule, enum vcap_key_field key,
196			  struct vcap_u72_key *fieldval);
197int vcap_rule_add_key_u128(struct vcap_rule *rule, enum vcap_key_field key,
198			   struct vcap_u128_key *fieldval);
199int vcap_rule_add_action_bit(struct vcap_rule *rule,
200			     enum vcap_action_field action, enum vcap_bit val);
201int 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 */
205int vcap_admin_rule_count(struct vcap_admin *admin, int cid);
206
207/* VCAP rule counter operations */
208int vcap_get_rule_count_by_cookie(struct vcap_control *vctrl,
209				  struct vcap_counter *ctr, u64 cookie);
210int vcap_rule_set_counter(struct vcap_rule *rule, struct vcap_counter *ctr);
211int 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 */
215int vcap_chain_id_to_lookup(struct vcap_admin *admin, int cur_cid);
216/* Lookup a vcap instance using chain id */
217struct vcap_admin *vcap_find_admin(struct vcap_control *vctrl, int cid);
218/* Find information on a key field in a rule */
219const 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 */
222int vcap_lookup_rule_by_cookie(struct vcap_control *vctrl, u64 cookie);
223/* Calculate the value used for chaining VCAP rules */
224int 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 */
226bool 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 */
228bool 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 */
230bool vcap_rule_find_keysets(struct vcap_rule *rule,
231			    struct vcap_keyset_list *matches);
232/* Return the keyset information for the keyset */
233const 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 */
237void vcap_netbytes_copy(u8 *dst, u8 *src, int count);
238
239/* Convert validation error code into tc extact error message */
240void vcap_set_tc_exterr(struct flow_cls_offload *fco, struct vcap_rule *vrule);
241
242/* Cleanup a VCAP instance */
243int vcap_del_rules(struct vcap_control *vctrl, struct vcap_admin *admin);
244
245/* Add a keyset to a keyset list */
246bool 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 */
249int 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 */
254const 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 */
257const 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 */
261int 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 */
264int 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 */
269int 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 */
273int 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 */
276enum vcap_keyfield_set
277vcap_select_min_rule_keyset(struct vcap_control *vctrl, enum vcap_type vtype,
278			    struct vcap_keyset_list *kslist);
279
280struct vcap_client_actionfield *
281vcap_find_actionfield(struct vcap_rule *rule, enum vcap_action_field act);
282#endif /* __VCAP_API_CLIENT__ */