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. Chain id 0 means disable */ 152 int vcap_enable_lookups(struct vcap_control *vctrl, struct net_device *ndev, 153 int chain_id, unsigned long cookie, bool enable); 154 155 /* VCAP rule operations */ 156 /* Allocate a rule and fill in the basic information */ 157 struct vcap_rule *vcap_alloc_rule(struct vcap_control *vctrl, 158 struct net_device *ndev, 159 int vcap_chain_id, 160 enum vcap_user user, 161 u16 priority, 162 u32 id); 163 /* Free mem of a rule owned by client */ 164 void vcap_free_rule(struct vcap_rule *rule); 165 /* Validate a rule before adding it to the VCAP */ 166 int vcap_val_rule(struct vcap_rule *rule, u16 l3_proto); 167 /* Add rule to a VCAP instance */ 168 int vcap_add_rule(struct vcap_rule *rule); 169 /* Delete rule in a VCAP instance */ 170 int vcap_del_rule(struct vcap_control *vctrl, struct net_device *ndev, u32 id); 171 /* Make a full copy of an existing rule with a new rule id */ 172 struct vcap_rule *vcap_copy_rule(struct vcap_rule *rule); 173 /* Get rule from a VCAP instance */ 174 struct vcap_rule *vcap_get_rule(struct vcap_control *vctrl, u32 id); 175 /* Update existing rule */ 176 int vcap_mod_rule(struct vcap_rule *rule); 177 178 /* Update the keyset for the rule */ 179 int vcap_set_rule_set_keyset(struct vcap_rule *rule, 180 enum vcap_keyfield_set keyset); 181 /* Update the actionset for the rule */ 182 int vcap_set_rule_set_actionset(struct vcap_rule *rule, 183 enum vcap_actionfield_set actionset); 184 /* Set a rule counter id (for certain VCAPs only) */ 185 void vcap_rule_set_counter_id(struct vcap_rule *rule, u32 counter_id); 186 187 /* VCAP rule field operations */ 188 int vcap_rule_add_key_bit(struct vcap_rule *rule, enum vcap_key_field key, 189 enum vcap_bit val); 190 int vcap_rule_add_key_u32(struct vcap_rule *rule, enum vcap_key_field key, 191 u32 value, u32 mask); 192 int vcap_rule_add_key_u48(struct vcap_rule *rule, enum vcap_key_field key, 193 struct vcap_u48_key *fieldval); 194 int vcap_rule_add_key_u72(struct vcap_rule *rule, enum vcap_key_field key, 195 struct vcap_u72_key *fieldval); 196 int vcap_rule_add_key_u128(struct vcap_rule *rule, enum vcap_key_field key, 197 struct vcap_u128_key *fieldval); 198 int vcap_rule_add_action_bit(struct vcap_rule *rule, 199 enum vcap_action_field action, enum vcap_bit val); 200 int vcap_rule_add_action_u32(struct vcap_rule *rule, 201 enum vcap_action_field action, u32 value); 202 203 /* VCAP rule counter operations */ 204 int vcap_rule_set_counter(struct vcap_rule *rule, struct vcap_counter *ctr); 205 int vcap_rule_get_counter(struct vcap_rule *rule, struct vcap_counter *ctr); 206 207 /* VCAP lookup operations */ 208 /* Convert a chain id to a VCAP lookup index */ 209 int vcap_chain_id_to_lookup(struct vcap_admin *admin, int cur_cid); 210 /* Lookup a vcap instance using chain id */ 211 struct vcap_admin *vcap_find_admin(struct vcap_control *vctrl, int cid); 212 /* Find information on a key field in a rule */ 213 const struct vcap_field *vcap_lookup_keyfield(struct vcap_rule *rule, 214 enum vcap_key_field key); 215 /* Find a rule id with a provided cookie */ 216 int vcap_lookup_rule_by_cookie(struct vcap_control *vctrl, u64 cookie); 217 /* Is the next chain id in the following lookup, possible in another VCAP */ 218 bool vcap_is_next_lookup(struct vcap_control *vctrl, int cur_cid, int next_cid); 219 /* Provide all rules via a callback interface */ 220 int vcap_rule_iter(struct vcap_control *vctrl, 221 int (*callback)(void *, struct vcap_rule *), void *arg); 222 /* Match a list of keys against the keysets available in a vcap type */ 223 bool vcap_rule_find_keysets(struct vcap_rule *rule, 224 struct vcap_keyset_list *matches); 225 /* Return the keyset information for the keyset */ 226 const struct vcap_set *vcap_keyfieldset(struct vcap_control *vctrl, 227 enum vcap_type vt, 228 enum vcap_keyfield_set keyset); 229 /* Copy to host byte order */ 230 void vcap_netbytes_copy(u8 *dst, u8 *src, int count); 231 232 /* Convert validation error code into tc extact error message */ 233 void vcap_set_tc_exterr(struct flow_cls_offload *fco, struct vcap_rule *vrule); 234 235 /* Cleanup a VCAP instance */ 236 int vcap_del_rules(struct vcap_control *vctrl, struct vcap_admin *admin); 237 238 /* Add a keyset to a keyset list */ 239 bool vcap_keyset_list_add(struct vcap_keyset_list *keysetlist, 240 enum vcap_keyfield_set keyset); 241 /* Drop keys in a keylist and any keys that are not supported by the keyset */ 242 int vcap_filter_rule_keys(struct vcap_rule *rule, 243 enum vcap_key_field keylist[], int length, 244 bool drop_unsupported); 245 246 /* map keyset id to a string with the keyset name */ 247 const char *vcap_keyset_name(struct vcap_control *vctrl, 248 enum vcap_keyfield_set keyset); 249 /* map key field id to a string with the key name */ 250 const char *vcap_keyfield_name(struct vcap_control *vctrl, 251 enum vcap_key_field key); 252 253 /* Modify a 32 bit key field with value and mask in the rule */ 254 int vcap_rule_mod_key_u32(struct vcap_rule *rule, enum vcap_key_field key, 255 u32 value, u32 mask); 256 /* Modify a 32 bit action field with value in the rule */ 257 int vcap_rule_mod_action_u32(struct vcap_rule *rule, 258 enum vcap_action_field action, 259 u32 value); 260 261 /* Get a 32 bit key field value and mask from the rule */ 262 int vcap_rule_get_key_u32(struct vcap_rule *rule, enum vcap_key_field key, 263 u32 *value, u32 *mask); 264 265 #endif /* __VCAP_API_CLIENT__ */ 266