net/cnxk: support to validate meter policy
authorSunil Kumar Kori <skori@marvell.com>
Tue, 12 Oct 2021 07:06:03 +0000 (12:36 +0530)
committerJerin Jacob <jerinj@marvell.com>
Tue, 19 Oct 2021 14:24:59 +0000 (16:24 +0200)
Implement API to validate meter policy for CNXK platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
Signed-off-by: Rakesh Kudurumalla <rkudurumalla@marvell.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
doc/guides/nics/features/cnxk.ini
doc/guides/nics/features/cnxk_vf.ini
drivers/net/cnxk/cnxk_ethdev_mtr.c

index 1ced3ee..f058645 100644 (file)
@@ -79,6 +79,7 @@ count                = Y
 drop                 = Y
 flag                 = Y
 mark                 = Y
+meter                = Y
 of_pop_vlan          = Y
 of_push_vlan         = Y
 of_set_vlan_pcp      = Y
index 139d9b9..f3d9f23 100644 (file)
@@ -71,6 +71,7 @@ count                = Y
 drop                 = Y
 flag                 = Y
 mark                 = Y
+meter                = Y
 of_pop_vlan          = Y
 of_push_vlan         = Y
 of_set_vlan_pcp      = Y
index 9106cb1..c042da6 100644 (file)
@@ -218,10 +218,59 @@ cnxk_nix_mtr_profile_delete(struct rte_eth_dev *eth_dev, uint32_t profile_id,
        return 0;
 }
 
+static int
+cnxk_nix_mtr_policy_validate(struct rte_eth_dev *dev,
+                            struct rte_mtr_meter_policy_params *policy,
+                            struct rte_mtr_error *error)
+{
+       static const char *const action_color[] = {"Green", "Yellow", "Red"};
+       bool supported[RTE_COLORS] = {false, false, false};
+       const struct rte_flow_action *action;
+       char message[1024];
+       uint32_t i;
+
+       RTE_SET_USED(dev);
+
+       if (!policy)
+               return 0; /* Nothing to be validated */
+
+       for (i = 0; i < RTE_COLORS; i++) {
+               if (policy->actions[i]) {
+                       for (action = policy->actions[i];
+                            action->type != RTE_FLOW_ACTION_TYPE_END;
+                            action++) {
+                               if (action->type == RTE_FLOW_ACTION_TYPE_METER)
+                                       supported[i] = true;
+
+                               if (action->type == RTE_FLOW_ACTION_TYPE_DROP)
+                                       supported[i] = true;
+
+                               if (!supported[i]) {
+                                       sprintf(message,
+                                               "%s action is not valid",
+                                               action_color[i]);
+                                       return -rte_mtr_error_set(error,
+                                         ENOTSUP,
+                                         RTE_MTR_ERROR_TYPE_METER_POLICY, NULL,
+                                         message);
+                               }
+                       }
+               } else {
+                       sprintf(message, "%s action is null", action_color[i]);
+                       return -rte_mtr_error_set(error, EINVAL,
+                               RTE_MTR_ERROR_TYPE_METER_POLICY, NULL,
+                               message);
+               }
+       }
+
+       return 0;
+}
+
 const struct rte_mtr_ops nix_mtr_ops = {
        .capabilities_get = cnxk_nix_mtr_capabilities_get,
        .meter_profile_add = cnxk_nix_mtr_profile_add,
        .meter_profile_delete = cnxk_nix_mtr_profile_delete,
+       .meter_policy_validate = cnxk_nix_mtr_policy_validate,
 };
 
 int