net: microchip: vcap: Add vcap_mod_rule
authorHoratiu Vultur <horatiu.vultur@microchip.com>
Sat, 3 Dec 2022 10:43:46 +0000 (11:43 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 6 Dec 2022 12:26:43 +0000 (13:26 +0100)
Add the function vcap_mod_rule which allows to update an existing rule
in the vcap. It is required for the rule to exist in the vcap to be able
to modify it.

Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/microchip/vcap/vcap_api.c
drivers/net/ethernet/microchip/vcap/vcap_api_client.h

index 2712831..eae4e9f 100644 (file)
@@ -1955,6 +1955,42 @@ unlock:
 }
 EXPORT_SYMBOL_GPL(vcap_get_rule);
 
+/* Update existing rule */
+int vcap_mod_rule(struct vcap_rule *rule)
+{
+       struct vcap_rule_internal *ri = to_intrule(rule);
+       struct vcap_counter ctr;
+       int err;
+
+       err = vcap_api_check(ri->vctrl);
+       if (err)
+               return err;
+
+       if (!vcap_lookup_rule(ri->vctrl, ri->data.id))
+               return -ENOENT;
+
+       mutex_lock(&ri->admin->lock);
+       /* Encode the bitstreams to the VCAP cache */
+       vcap_erase_cache(ri);
+       err = vcap_encode_rule(ri);
+       if (err)
+               goto out;
+
+       err = vcap_write_rule(ri);
+       if (err)
+               goto out;
+
+       memset(&ctr, 0, sizeof(ctr));
+       err =  vcap_write_counter(ri, &ctr);
+       if (err)
+               goto out;
+
+out:
+       mutex_unlock(&ri->admin->lock);
+       return err;
+}
+EXPORT_SYMBOL_GPL(vcap_mod_rule);
+
 /* Return the alignment offset for a new rule address */
 static int vcap_valid_rule_move(struct vcap_rule_internal *el, int offset)
 {
index a354dcd..fdfc5d5 100644 (file)
@@ -172,6 +172,8 @@ int vcap_del_rule(struct vcap_control *vctrl, struct net_device *ndev, u32 id);
 struct vcap_rule *vcap_copy_rule(struct vcap_rule *rule);
 /* Get rule from a VCAP instance */
 struct vcap_rule *vcap_get_rule(struct vcap_control *vctrl, u32 id);
+/* Update existing rule */
+int vcap_mod_rule(struct vcap_rule *rule);
 
 /* Update the keyset for the rule */
 int vcap_set_rule_set_keyset(struct vcap_rule *rule,