1c9da1ac1SSteen Hegelund /* SPDX-License-Identifier: GPL-2.0+ */ 2c9da1ac1SSteen Hegelund /* Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries. 3c9da1ac1SSteen Hegelund * Microchip VCAP API 4c9da1ac1SSteen Hegelund */ 5c9da1ac1SSteen Hegelund 6c9da1ac1SSteen Hegelund #ifndef __VCAP_API_CLIENT__ 7c9da1ac1SSteen Hegelund #define __VCAP_API_CLIENT__ 8c9da1ac1SSteen Hegelund 9c9da1ac1SSteen Hegelund #include <linux/types.h> 10c9da1ac1SSteen Hegelund #include <linux/list.h> 11c9da1ac1SSteen Hegelund #include <linux/netdevice.h> 12c9da1ac1SSteen Hegelund #include <net/flow_offload.h> 13c9da1ac1SSteen Hegelund 14c9da1ac1SSteen Hegelund #include "vcap_api.h" 15c9da1ac1SSteen Hegelund 16c9da1ac1SSteen Hegelund /* Client supplied VCAP rule key control part */ 17c9da1ac1SSteen Hegelund struct vcap_client_keyfield_ctrl { 18c9da1ac1SSteen Hegelund struct list_head list; /* For insertion into a rule */ 19c9da1ac1SSteen Hegelund enum vcap_key_field key; 20c9da1ac1SSteen Hegelund enum vcap_field_type type; 21c9da1ac1SSteen Hegelund }; 22c9da1ac1SSteen Hegelund 23c9da1ac1SSteen Hegelund struct vcap_u1_key { 24c9da1ac1SSteen Hegelund u8 value; 25c9da1ac1SSteen Hegelund u8 mask; 26c9da1ac1SSteen Hegelund }; 27c9da1ac1SSteen Hegelund 28c9da1ac1SSteen Hegelund struct vcap_u32_key { 29c9da1ac1SSteen Hegelund u32 value; 30c9da1ac1SSteen Hegelund u32 mask; 31c9da1ac1SSteen Hegelund }; 32c9da1ac1SSteen Hegelund 33c9da1ac1SSteen Hegelund struct vcap_u48_key { 34c9da1ac1SSteen Hegelund u8 value[6]; 35c9da1ac1SSteen Hegelund u8 mask[6]; 36c9da1ac1SSteen Hegelund }; 37c9da1ac1SSteen Hegelund 38c9da1ac1SSteen Hegelund struct vcap_u56_key { 39c9da1ac1SSteen Hegelund u8 value[7]; 40c9da1ac1SSteen Hegelund u8 mask[7]; 41c9da1ac1SSteen Hegelund }; 42c9da1ac1SSteen Hegelund 43c9da1ac1SSteen Hegelund struct vcap_u64_key { 44c9da1ac1SSteen Hegelund u8 value[8]; 45c9da1ac1SSteen Hegelund u8 mask[8]; 46c9da1ac1SSteen Hegelund }; 47c9da1ac1SSteen Hegelund 48c9da1ac1SSteen Hegelund struct vcap_u72_key { 49c9da1ac1SSteen Hegelund u8 value[9]; 50c9da1ac1SSteen Hegelund u8 mask[9]; 51c9da1ac1SSteen Hegelund }; 52c9da1ac1SSteen Hegelund 53c9da1ac1SSteen Hegelund struct vcap_u112_key { 54c9da1ac1SSteen Hegelund u8 value[14]; 55c9da1ac1SSteen Hegelund u8 mask[14]; 56c9da1ac1SSteen Hegelund }; 57c9da1ac1SSteen Hegelund 58c9da1ac1SSteen Hegelund struct vcap_u128_key { 59c9da1ac1SSteen Hegelund u8 value[16]; 60c9da1ac1SSteen Hegelund u8 mask[16]; 61c9da1ac1SSteen Hegelund }; 62c9da1ac1SSteen Hegelund 63c9da1ac1SSteen Hegelund /* Client supplied VCAP rule field data */ 64c9da1ac1SSteen Hegelund struct vcap_client_keyfield_data { 65c9da1ac1SSteen Hegelund union { 66c9da1ac1SSteen Hegelund struct vcap_u1_key u1; 67c9da1ac1SSteen Hegelund struct vcap_u32_key u32; 68c9da1ac1SSteen Hegelund struct vcap_u48_key u48; 69c9da1ac1SSteen Hegelund struct vcap_u56_key u56; 70c9da1ac1SSteen Hegelund struct vcap_u64_key u64; 71c9da1ac1SSteen Hegelund struct vcap_u72_key u72; 72c9da1ac1SSteen Hegelund struct vcap_u112_key u112; 73c9da1ac1SSteen Hegelund struct vcap_u128_key u128; 74c9da1ac1SSteen Hegelund }; 75c9da1ac1SSteen Hegelund }; 76c9da1ac1SSteen Hegelund 77c9da1ac1SSteen Hegelund /* Client supplied VCAP rule key (value, mask) */ 78c9da1ac1SSteen Hegelund struct vcap_client_keyfield { 79c9da1ac1SSteen Hegelund struct vcap_client_keyfield_ctrl ctrl; 80c9da1ac1SSteen Hegelund struct vcap_client_keyfield_data data; 81c9da1ac1SSteen Hegelund }; 82c9da1ac1SSteen Hegelund 83c9da1ac1SSteen Hegelund /* Client supplied VCAP rule action control part */ 84c9da1ac1SSteen Hegelund struct vcap_client_actionfield_ctrl { 85c9da1ac1SSteen Hegelund struct list_head list; /* For insertion into a rule */ 86c9da1ac1SSteen Hegelund enum vcap_action_field action; 87c9da1ac1SSteen Hegelund enum vcap_field_type type; 88c9da1ac1SSteen Hegelund }; 89c9da1ac1SSteen Hegelund 90c9da1ac1SSteen Hegelund struct vcap_u1_action { 91c9da1ac1SSteen Hegelund u8 value; 92c9da1ac1SSteen Hegelund }; 93c9da1ac1SSteen Hegelund 94c9da1ac1SSteen Hegelund struct vcap_u32_action { 95c9da1ac1SSteen Hegelund u32 value; 96c9da1ac1SSteen Hegelund }; 97c9da1ac1SSteen Hegelund 98c9da1ac1SSteen Hegelund struct vcap_u48_action { 99c9da1ac1SSteen Hegelund u8 value[6]; 100c9da1ac1SSteen Hegelund }; 101c9da1ac1SSteen Hegelund 102c9da1ac1SSteen Hegelund struct vcap_u56_action { 103c9da1ac1SSteen Hegelund u8 value[7]; 104c9da1ac1SSteen Hegelund }; 105c9da1ac1SSteen Hegelund 106c9da1ac1SSteen Hegelund struct vcap_u64_action { 107c9da1ac1SSteen Hegelund u8 value[8]; 108c9da1ac1SSteen Hegelund }; 109c9da1ac1SSteen Hegelund 110c9da1ac1SSteen Hegelund struct vcap_u72_action { 111c9da1ac1SSteen Hegelund u8 value[9]; 112c9da1ac1SSteen Hegelund }; 113c9da1ac1SSteen Hegelund 114c9da1ac1SSteen Hegelund struct vcap_u112_action { 115c9da1ac1SSteen Hegelund u8 value[14]; 116c9da1ac1SSteen Hegelund }; 117c9da1ac1SSteen Hegelund 118c9da1ac1SSteen Hegelund struct vcap_u128_action { 119c9da1ac1SSteen Hegelund u8 value[16]; 120c9da1ac1SSteen Hegelund }; 121c9da1ac1SSteen Hegelund 122c9da1ac1SSteen Hegelund struct vcap_client_actionfield_data { 123c9da1ac1SSteen Hegelund union { 124c9da1ac1SSteen Hegelund struct vcap_u1_action u1; 125c9da1ac1SSteen Hegelund struct vcap_u32_action u32; 126c9da1ac1SSteen Hegelund struct vcap_u48_action u48; 127c9da1ac1SSteen Hegelund struct vcap_u56_action u56; 128c9da1ac1SSteen Hegelund struct vcap_u64_action u64; 129c9da1ac1SSteen Hegelund struct vcap_u72_action u72; 130c9da1ac1SSteen Hegelund struct vcap_u112_action u112; 131c9da1ac1SSteen Hegelund struct vcap_u128_action u128; 132c9da1ac1SSteen Hegelund }; 133c9da1ac1SSteen Hegelund }; 134c9da1ac1SSteen Hegelund 135c9da1ac1SSteen Hegelund struct vcap_client_actionfield { 136c9da1ac1SSteen Hegelund struct vcap_client_actionfield_ctrl ctrl; 137c9da1ac1SSteen Hegelund struct vcap_client_actionfield_data data; 138c9da1ac1SSteen Hegelund }; 139c9da1ac1SSteen Hegelund 140c9da1ac1SSteen Hegelund enum vcap_bit { 141c9da1ac1SSteen Hegelund VCAP_BIT_ANY, 142c9da1ac1SSteen Hegelund VCAP_BIT_0, 143c9da1ac1SSteen Hegelund VCAP_BIT_1 144c9da1ac1SSteen Hegelund }; 145c9da1ac1SSteen Hegelund 146f13230a4SSteen Hegelund struct vcap_counter { 147f13230a4SSteen Hegelund u32 value; 148f13230a4SSteen Hegelund bool sticky; 149f13230a4SSteen Hegelund }; 150f13230a4SSteen Hegelund 151cfd9e7b7SSteen Hegelund /* Enable/Disable the VCAP instance lookups */ 15267456717SSteen Hegelund int vcap_enable_lookups(struct vcap_control *vctrl, struct net_device *ndev, 153cfd9e7b7SSteen Hegelund int from_cid, int to_cid, unsigned long cookie, 154cfd9e7b7SSteen Hegelund bool enable); 15567456717SSteen Hegelund 156c9da1ac1SSteen Hegelund /* VCAP rule operations */ 157c9da1ac1SSteen Hegelund /* Allocate a rule and fill in the basic information */ 158c9da1ac1SSteen Hegelund struct vcap_rule *vcap_alloc_rule(struct vcap_control *vctrl, 159c9da1ac1SSteen Hegelund struct net_device *ndev, 160c9da1ac1SSteen Hegelund int vcap_chain_id, 161c9da1ac1SSteen Hegelund enum vcap_user user, 162c9da1ac1SSteen Hegelund u16 priority, 163c9da1ac1SSteen Hegelund u32 id); 164c9da1ac1SSteen Hegelund /* Free mem of a rule owned by client */ 165c9da1ac1SSteen Hegelund void vcap_free_rule(struct vcap_rule *rule); 166c9da1ac1SSteen Hegelund /* Validate a rule before adding it to the VCAP */ 167c9da1ac1SSteen Hegelund int vcap_val_rule(struct vcap_rule *rule, u16 l3_proto); 168c9da1ac1SSteen Hegelund /* Add rule to a VCAP instance */ 169c9da1ac1SSteen Hegelund int vcap_add_rule(struct vcap_rule *rule); 170c9da1ac1SSteen Hegelund /* Delete rule in a VCAP instance */ 171c9da1ac1SSteen Hegelund int vcap_del_rule(struct vcap_control *vctrl, struct net_device *ndev, u32 id); 172465a38a2SSteen Hegelund /* Make a full copy of an existing rule with a new rule id */ 173465a38a2SSteen Hegelund struct vcap_rule *vcap_copy_rule(struct vcap_rule *rule); 174610c32b2SHoratiu Vultur /* Get rule from a VCAP instance */ 175610c32b2SHoratiu Vultur struct vcap_rule *vcap_get_rule(struct vcap_control *vctrl, u32 id); 1762662b3f9SHoratiu Vultur /* Update existing rule */ 1772662b3f9SHoratiu Vultur int vcap_mod_rule(struct vcap_rule *rule); 178c9da1ac1SSteen Hegelund 179c9da1ac1SSteen Hegelund /* Update the keyset for the rule */ 180c9da1ac1SSteen Hegelund int vcap_set_rule_set_keyset(struct vcap_rule *rule, 181c9da1ac1SSteen Hegelund enum vcap_keyfield_set keyset); 182c9da1ac1SSteen Hegelund /* Update the actionset for the rule */ 183c9da1ac1SSteen Hegelund int vcap_set_rule_set_actionset(struct vcap_rule *rule, 184c9da1ac1SSteen Hegelund enum vcap_actionfield_set actionset); 185f13230a4SSteen Hegelund /* Set a rule counter id (for certain VCAPs only) */ 186f13230a4SSteen Hegelund void vcap_rule_set_counter_id(struct vcap_rule *rule, u32 counter_id); 187c9da1ac1SSteen Hegelund 188c9da1ac1SSteen Hegelund /* VCAP rule field operations */ 189c9da1ac1SSteen Hegelund int vcap_rule_add_key_bit(struct vcap_rule *rule, enum vcap_key_field key, 190c9da1ac1SSteen Hegelund enum vcap_bit val); 191c9da1ac1SSteen Hegelund int vcap_rule_add_key_u32(struct vcap_rule *rule, enum vcap_key_field key, 192c9da1ac1SSteen Hegelund u32 value, u32 mask); 193c9da1ac1SSteen Hegelund int vcap_rule_add_key_u48(struct vcap_rule *rule, enum vcap_key_field key, 194c9da1ac1SSteen Hegelund struct vcap_u48_key *fieldval); 19546be056eSSteen Hegelund int vcap_rule_add_key_u72(struct vcap_rule *rule, enum vcap_key_field key, 19646be056eSSteen Hegelund struct vcap_u72_key *fieldval); 197d6c2964dSSteen Hegelund int vcap_rule_add_key_u128(struct vcap_rule *rule, enum vcap_key_field key, 198d6c2964dSSteen Hegelund struct vcap_u128_key *fieldval); 199c9da1ac1SSteen Hegelund int vcap_rule_add_action_bit(struct vcap_rule *rule, 200c9da1ac1SSteen Hegelund enum vcap_action_field action, enum vcap_bit val); 201c9da1ac1SSteen Hegelund int vcap_rule_add_action_u32(struct vcap_rule *rule, 202c9da1ac1SSteen Hegelund enum vcap_action_field action, u32 value); 203c9da1ac1SSteen Hegelund 204*bfcb94aaSSteen Hegelund /* Get number of rules in a vcap instance lookup chain id range */ 205*bfcb94aaSSteen Hegelund int vcap_admin_rule_count(struct vcap_admin *admin, int cid); 206*bfcb94aaSSteen Hegelund 207f13230a4SSteen Hegelund /* VCAP rule counter operations */ 20827d293ccSSteen Hegelund int vcap_get_rule_count_by_cookie(struct vcap_control *vctrl, 20927d293ccSSteen Hegelund struct vcap_counter *ctr, u64 cookie); 210f13230a4SSteen Hegelund int vcap_rule_set_counter(struct vcap_rule *rule, struct vcap_counter *ctr); 211f13230a4SSteen Hegelund int vcap_rule_get_counter(struct vcap_rule *rule, struct vcap_counter *ctr); 212f13230a4SSteen Hegelund 213c9da1ac1SSteen Hegelund /* VCAP lookup operations */ 2147de1dcadSSteen Hegelund /* Convert a chain id to a VCAP lookup index */ 2157de1dcadSSteen Hegelund int vcap_chain_id_to_lookup(struct vcap_admin *admin, int cur_cid); 216c9da1ac1SSteen Hegelund /* Lookup a vcap instance using chain id */ 217c9da1ac1SSteen Hegelund struct vcap_admin *vcap_find_admin(struct vcap_control *vctrl, int cid); 21846be056eSSteen Hegelund /* Find information on a key field in a rule */ 21946be056eSSteen Hegelund const struct vcap_field *vcap_lookup_keyfield(struct vcap_rule *rule, 22046be056eSSteen Hegelund enum vcap_key_field key); 221c9da1ac1SSteen Hegelund /* Find a rule id with a provided cookie */ 222c9da1ac1SSteen Hegelund int vcap_lookup_rule_by_cookie(struct vcap_control *vctrl, u64 cookie); 22388bd9ea7SSteen Hegelund /* Calculate the value used for chaining VCAP rules */ 22488bd9ea7SSteen Hegelund int vcap_chain_offset(struct vcap_control *vctrl, int from_cid, int to_cid); 225392d0ab0SSteen Hegelund /* Is the next chain id in the following lookup, possible in another VCAP */ 226392d0ab0SSteen Hegelund bool vcap_is_next_lookup(struct vcap_control *vctrl, int cur_cid, int next_cid); 227784c3067SSteen Hegelund /* Is this chain id the last lookup of all VCAPs */ 228e7e3f514SSteen Hegelund bool vcap_is_last_chain(struct vcap_control *vctrl, int cid, bool ingress); 229465a38a2SSteen Hegelund /* Match a list of keys against the keysets available in a vcap type */ 230465a38a2SSteen Hegelund bool vcap_rule_find_keysets(struct vcap_rule *rule, 231465a38a2SSteen Hegelund struct vcap_keyset_list *matches); 232465a38a2SSteen Hegelund /* Return the keyset information for the keyset */ 233465a38a2SSteen Hegelund const struct vcap_set *vcap_keyfieldset(struct vcap_control *vctrl, 234465a38a2SSteen Hegelund enum vcap_type vt, 235465a38a2SSteen Hegelund enum vcap_keyfield_set keyset); 236c9da1ac1SSteen Hegelund /* Copy to host byte order */ 237c9da1ac1SSteen Hegelund void vcap_netbytes_copy(u8 *dst, u8 *src, int count); 238c9da1ac1SSteen Hegelund 239c9da1ac1SSteen Hegelund /* Convert validation error code into tc extact error message */ 240c9da1ac1SSteen Hegelund void vcap_set_tc_exterr(struct flow_cls_offload *fco, struct vcap_rule *vrule); 241c9da1ac1SSteen Hegelund 2428e10490bSSteen Hegelund /* Cleanup a VCAP instance */ 2438e10490bSSteen Hegelund int vcap_del_rules(struct vcap_control *vctrl, struct vcap_admin *admin); 2448e10490bSSteen Hegelund 245abc4010dSSteen Hegelund /* Add a keyset to a keyset list */ 246abc4010dSSteen Hegelund bool vcap_keyset_list_add(struct vcap_keyset_list *keysetlist, 247abc4010dSSteen Hegelund enum vcap_keyfield_set keyset); 248465a38a2SSteen Hegelund /* Drop keys in a keylist and any keys that are not supported by the keyset */ 249465a38a2SSteen Hegelund int vcap_filter_rule_keys(struct vcap_rule *rule, 250465a38a2SSteen Hegelund enum vcap_key_field keylist[], int length, 251465a38a2SSteen Hegelund bool drop_unsupported); 252abc4010dSSteen Hegelund 253abc4010dSSteen Hegelund /* map keyset id to a string with the keyset name */ 254abc4010dSSteen Hegelund const char *vcap_keyset_name(struct vcap_control *vctrl, 255abc4010dSSteen Hegelund enum vcap_keyfield_set keyset); 256abc4010dSSteen Hegelund /* map key field id to a string with the key name */ 257abc4010dSSteen Hegelund const char *vcap_keyfield_name(struct vcap_control *vctrl, 258abc4010dSSteen Hegelund enum vcap_key_field key); 259abc4010dSSteen Hegelund 260465a38a2SSteen Hegelund /* Modify a 32 bit key field with value and mask in the rule */ 261465a38a2SSteen Hegelund int vcap_rule_mod_key_u32(struct vcap_rule *rule, enum vcap_key_field key, 262465a38a2SSteen Hegelund u32 value, u32 mask); 263465a38a2SSteen Hegelund /* Modify a 32 bit action field with value in the rule */ 264465a38a2SSteen Hegelund int vcap_rule_mod_action_u32(struct vcap_rule *rule, 265465a38a2SSteen Hegelund enum vcap_action_field action, 266465a38a2SSteen Hegelund u32 value); 267465a38a2SSteen Hegelund 2686009b61fSHoratiu Vultur /* Get a 32 bit key field value and mask from the rule */ 2696009b61fSHoratiu Vultur int vcap_rule_get_key_u32(struct vcap_rule *rule, enum vcap_key_field key, 2706009b61fSHoratiu Vultur u32 *value, u32 *mask); 2716ebf182bSDaniel Machon 272*bfcb94aaSSteen Hegelund /* Remove a key field with value and mask in the rule */ 273*bfcb94aaSSteen Hegelund int vcap_rule_rem_key(struct vcap_rule *rule, enum vcap_key_field key); 274*bfcb94aaSSteen Hegelund 275*bfcb94aaSSteen Hegelund /* Select the keyset from the list that results in the smallest rule size */ 276*bfcb94aaSSteen Hegelund enum vcap_keyfield_set 277*bfcb94aaSSteen Hegelund vcap_select_min_rule_keyset(struct vcap_control *vctrl, enum vcap_type vtype, 278*bfcb94aaSSteen Hegelund struct vcap_keyset_list *kslist); 279*bfcb94aaSSteen Hegelund 2806ebf182bSDaniel Machon struct vcap_client_actionfield * 2816ebf182bSDaniel Machon vcap_find_actionfield(struct vcap_rule *rule, enum vcap_action_field act); 282c9da1ac1SSteen Hegelund #endif /* __VCAP_API_CLIENT__ */ 283