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 /* VCAP rule operations */
147 /* Allocate a rule and fill in the basic information */
148 struct vcap_rule *vcap_alloc_rule(struct vcap_control *vctrl,
149 				  struct net_device *ndev,
150 				  int vcap_chain_id,
151 				  enum vcap_user user,
152 				  u16 priority,
153 				  u32 id);
154 /* Free mem of a rule owned by client */
155 void vcap_free_rule(struct vcap_rule *rule);
156 /* Validate a rule before adding it to the VCAP */
157 int vcap_val_rule(struct vcap_rule *rule, u16 l3_proto);
158 /* Add rule to a VCAP instance */
159 int vcap_add_rule(struct vcap_rule *rule);
160 /* Delete rule in a VCAP instance */
161 int vcap_del_rule(struct vcap_control *vctrl, struct net_device *ndev, u32 id);
162 
163 /* Update the keyset for the rule */
164 int vcap_set_rule_set_keyset(struct vcap_rule *rule,
165 			     enum vcap_keyfield_set keyset);
166 /* Update the actionset for the rule */
167 int vcap_set_rule_set_actionset(struct vcap_rule *rule,
168 				enum vcap_actionfield_set actionset);
169 
170 /* VCAP rule field operations */
171 int vcap_rule_add_key_bit(struct vcap_rule *rule, enum vcap_key_field key,
172 			  enum vcap_bit val);
173 int vcap_rule_add_key_u32(struct vcap_rule *rule, enum vcap_key_field key,
174 			  u32 value, u32 mask);
175 int vcap_rule_add_key_u48(struct vcap_rule *rule, enum vcap_key_field key,
176 			  struct vcap_u48_key *fieldval);
177 int vcap_rule_add_key_u72(struct vcap_rule *rule, enum vcap_key_field key,
178 			  struct vcap_u72_key *fieldval);
179 int vcap_rule_add_action_bit(struct vcap_rule *rule,
180 			     enum vcap_action_field action, enum vcap_bit val);
181 int vcap_rule_add_action_u32(struct vcap_rule *rule,
182 			     enum vcap_action_field action, u32 value);
183 
184 /* VCAP lookup operations */
185 /* Lookup a vcap instance using chain id */
186 struct vcap_admin *vcap_find_admin(struct vcap_control *vctrl, int cid);
187 /* Find information on a key field in a rule */
188 const struct vcap_field *vcap_lookup_keyfield(struct vcap_rule *rule,
189 					      enum vcap_key_field key);
190 /* Find a rule id with a provided cookie */
191 int vcap_lookup_rule_by_cookie(struct vcap_control *vctrl, u64 cookie);
192 
193 /* Copy to host byte order */
194 void vcap_netbytes_copy(u8 *dst, u8 *src, int count);
195 
196 /* Convert validation error code into tc extact error message */
197 void vcap_set_tc_exterr(struct flow_cls_offload *fco, struct vcap_rule *vrule);
198 
199 /* Cleanup a VCAP instance */
200 int vcap_del_rules(struct vcap_control *vctrl, struct vcap_admin *admin);
201 
202 #endif /* __VCAP_API_CLIENT__ */
203