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:
parent
5dd3beba22
commit
c02b19edc7
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue