285 lines · c
1/* SPDX-License-Identifier: GPL-2.0+ */2/* Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries.3 * Microchip VCAP API4 */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_1144};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_set279vcap_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__ */285