Commit c02b19ed authored by Steen Hegelund's avatar Steen Hegelund Committed by David S. Miller

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: default avatarSteen Hegelund <steen.hegelund@microchip.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5dd3beba
...@@ -3264,6 +3264,28 @@ static int vcap_rule_get_key(struct vcap_rule *rule, ...@@ -3264,6 +3264,28 @@ static int vcap_rule_get_key(struct vcap_rule *rule,
return 0; 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 */ /* Get the keysets that matches the rule key type/mask */
int vcap_rule_get_keysets(struct vcap_rule_internal *ri, int vcap_rule_get_keysets(struct vcap_rule_internal *ri,
struct vcap_keyset_list *matches) struct vcap_keyset_list *matches)
...@@ -3277,7 +3299,7 @@ int vcap_rule_get_keysets(struct vcap_rule_internal *ri, ...@@ -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); err = vcap_rule_get_key(&ri->data, VCAP_KF_TYPE, &kf);
if (err) if (err)
return err; return vcap_rule_get_untyped_keyset(ri, matches);
if (kf.ctrl.type == VCAP_FIELD_BIT) { if (kf.ctrl.type == VCAP_FIELD_BIT) {
value = kf.data.u1.value; value = kf.data.u1.value;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment