]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
net: microchip: sparx5: Add actionset type id information to rule
authorSteen Hegelund <steen.hegelund@microchip.com>
Tue, 24 Jan 2023 10:45:06 +0000 (11:45 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 26 Jan 2023 09:07:44 +0000 (10:07 +0100)
This adds the actionset type id to the rule information.  This is needed as
we now have more than one actionset in a VCAP instance (IS0).

Signed-off-by: Steen Hegelund <steen.hegelund@microchip.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/microchip/vcap/vcap_api.c

index 2eaa857d8c1af14b3443c52a46a5e95cb3cf6608..c740e83d9c20a6f69b88795fa0cdd3545c2cbc24 100644 (file)
@@ -1673,6 +1673,39 @@ static int vcap_add_type_keyfield(struct vcap_rule *rule)
        return 0;
 }
 
+/* Add the actionset typefield to the list of rule actionfields */
+static int vcap_add_type_actionfield(struct vcap_rule *rule)
+{
+       enum vcap_actionfield_set actionset = rule->actionset;
+       struct vcap_rule_internal *ri = to_intrule(rule);
+       enum vcap_type vt = ri->admin->vtype;
+       const struct vcap_field *fields;
+       const struct vcap_set *aset;
+       int ret = -EINVAL;
+
+       aset = vcap_actionfieldset(ri->vctrl, vt, actionset);
+       if (!aset)
+               return ret;
+       if (aset->type_id == (u8)-1)  /* No type field is needed */
+               return 0;
+
+       fields = vcap_actionfields(ri->vctrl, vt, actionset);
+       if (!fields)
+               return -EINVAL;
+       if (fields[VCAP_AF_TYPE].width > 1) {
+               ret = vcap_rule_add_action_u32(rule, VCAP_AF_TYPE,
+                                              aset->type_id);
+       } else {
+               if (aset->type_id)
+                       ret = vcap_rule_add_action_bit(rule, VCAP_AF_TYPE,
+                                                      VCAP_BIT_1);
+               else
+                       ret = vcap_rule_add_action_bit(rule, VCAP_AF_TYPE,
+                                                      VCAP_BIT_0);
+       }
+       return ret;
+}
+
 /* Add a keyset to a keyset list */
 bool vcap_keyset_list_add(struct vcap_keyset_list *keysetlist,
                          enum vcap_keyfield_set keyset)
@@ -1856,6 +1889,7 @@ int vcap_val_rule(struct vcap_rule *rule, u16 l3_proto)
                return -EINVAL;
        }
        vcap_add_type_keyfield(rule);
+       vcap_add_type_actionfield(rule);
        /* Add default fields to this rule */
        ri->vctrl->ops->add_default_fields(ri->ndev, ri->admin, rule);