net: microchip: sparx5: Add support for getting keysets without a type id

When there is only one keyset available for a certain VCAP rule size, the
particular keyset does not need a type id when encoded in the VCAP
Hardware.

This provides support for getting a keyset from a rule, when this is the
case: only one keyset fits this rule size.

Signed-off-by: Steen Hegelund <steen.hegelund@microchip.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Steen Hegelund 2023-01-27 14:08:23 +01:00 committed by David S. Miller
parent 5dd3beba22
commit c02b19edc7
1 changed files with 23 additions and 1 deletions

View File

@ -3264,6 +3264,28 @@ static int vcap_rule_get_key(struct vcap_rule *rule,
return 0;
}
/* Find a keyset having the same size as the provided rule, where the keyset
* does not have a type id.
*/
static int vcap_rule_get_untyped_keyset(struct vcap_rule_internal *ri,
struct vcap_keyset_list *matches)
{
struct vcap_control *vctrl = ri->vctrl;
enum vcap_type vt = ri->admin->vtype;
const struct vcap_set *keyfield_set;
int idx;
keyfield_set = vctrl->vcaps[vt].keyfield_set;
for (idx = 0; idx < vctrl->vcaps[vt].keyfield_set_size; ++idx) {
if (keyfield_set[idx].sw_per_item == ri->keyset_sw &&
keyfield_set[idx].type_id == (u8)-1) {
vcap_keyset_list_add(matches, idx);
return 0;
}
}
return -EINVAL;
}
/* Get the keysets that matches the rule key type/mask */
int vcap_rule_get_keysets(struct vcap_rule_internal *ri,
struct vcap_keyset_list *matches)
@ -3277,7 +3299,7 @@ int vcap_rule_get_keysets(struct vcap_rule_internal *ri,
err = vcap_rule_get_key(&ri->data, VCAP_KF_TYPE, &kf);
if (err)
return err;
return vcap_rule_get_untyped_keyset(ri, matches);
if (kf.ctrl.type == VCAP_FIELD_BIT) {
value = kf.data.u1.value;