FILE
vcap_api_client.h
File preview with syntax highlighting.
linux-6.19.14/drivers/net/ethernet/microchip/vcap/vcap_api_client.h
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); 203int vcap_rule_add_action_u72(struct vcap_rule *rule, enum vcap_action_field action, 204 struct vcap_u72_action *fieldval); 205 206/* Get number of rules in a vcap instance lookup chain id range */ 207int vcap_admin_rule_count(struct vcap_admin *admin, int cid); 208 209/* VCAP rule counter operations */ 210int vcap_get_rule_count_by_cookie(struct vcap_control *vctrl, 211 struct vcap_counter *ctr, u64 cookie); 212int vcap_rule_set_counter(struct vcap_rule *rule, struct vcap_counter *ctr); 213int vcap_rule_get_counter(struct vcap_rule *rule, struct vcap_counter *ctr); 214 215/* VCAP lookup operations */ 216/* Convert a chain id to a VCAP lookup index */ 217int vcap_chain_id_to_lookup(struct vcap_admin *admin, int cur_cid); 218/* Lookup a vcap instance using chain id */ 219struct vcap_admin *vcap_find_admin(struct vcap_control *vctrl, int cid); 220/* Find information on a key field in a rule */ 221const struct vcap_field *vcap_lookup_keyfield(struct vcap_rule *rule, 222 enum vcap_key_field key); 223/* Find a rule id with a provided cookie */ 224int vcap_lookup_rule_by_cookie(struct vcap_control *vctrl, u64 cookie); 225/* Calculate the value used for chaining VCAP rules */ 226int vcap_chain_offset(struct vcap_control *vctrl, int from_cid, int to_cid); 227/* Is the next chain id in the following lookup, possible in another VCAP */ 228bool vcap_is_next_lookup(struct vcap_control *vctrl, int cur_cid, int next_cid); 229/* Is this chain id the last lookup of all VCAPs */ 230bool vcap_is_last_chain(struct vcap_control *vctrl, int cid, bool ingress); 231/* Match a list of keys against the keysets available in a vcap type */ 232bool vcap_rule_find_keysets(struct vcap_rule *rule, 233 struct vcap_keyset_list *matches); 234/* Return the keyset information for the keyset */ 235const struct vcap_set *vcap_keyfieldset(struct vcap_control *vctrl, 236 enum vcap_type vt, 237 enum vcap_keyfield_set keyset); 238/* Copy to host byte order */ 239void vcap_netbytes_copy(u8 *dst, u8 *src, int count); 240 241/* Convert validation error code into tc extack error message */ 242void vcap_set_tc_exterr(struct flow_cls_offload *fco, struct vcap_rule *vrule); 243 244/* Cleanup a VCAP instance */ 245int vcap_del_rules(struct vcap_control *vctrl, struct vcap_admin *admin); 246 247/* Add a keyset to a keyset list */ 248bool vcap_keyset_list_add(struct vcap_keyset_list *keysetlist, 249 enum vcap_keyfield_set keyset); 250/* Drop keys in a keylist and any keys that are not supported by the keyset */ 251int vcap_filter_rule_keys(struct vcap_rule *rule, 252 enum vcap_key_field keylist[], int length, 253 bool drop_unsupported); 254 255/* map keyset id to a string with the keyset name */ 256const char *vcap_keyset_name(struct vcap_control *vctrl, 257 enum vcap_keyfield_set keyset); 258/* map key field id to a string with the key name */ 259const char *vcap_keyfield_name(struct vcap_control *vctrl, 260 enum vcap_key_field key); 261 262/* Modify a 32 bit key field with value and mask in the rule */ 263int vcap_rule_mod_key_u32(struct vcap_rule *rule, enum vcap_key_field key, 264 u32 value, u32 mask); 265/* Modify a 32 bit action field with value in the rule */ 266int vcap_rule_mod_action_u32(struct vcap_rule *rule, 267 enum vcap_action_field action, 268 u32 value); 269 270/* Get a 32 bit key field value and mask from the rule */ 271int vcap_rule_get_key_u32(struct vcap_rule *rule, enum vcap_key_field key, 272 u32 *value, u32 *mask); 273 274/* Remove a key field with value and mask in the rule */ 275int vcap_rule_rem_key(struct vcap_rule *rule, enum vcap_key_field key); 276 277/* Select the keyset from the list that results in the smallest rule size */ 278enum vcap_keyfield_set 279vcap_select_min_rule_keyset(struct vcap_control *vctrl, enum vcap_type vtype, 280 struct vcap_keyset_list *kslist); 281 282struct vcap_client_actionfield * 283vcap_find_actionfield(struct vcap_rule *rule, enum vcap_action_field act); 284#endif /* __VCAP_API_CLIENT__ */
~/
Read-only file preview.