net/softnic: support flow validate
authorReshma Pattan <reshma.pattan@intel.com>
Tue, 11 Sep 2018 14:20:37 +0000 (15:20 +0100)
committerCristian Dumitrescu <cristian.dumitrescu@intel.com>
Fri, 12 Oct 2018 15:59:02 +0000 (17:59 +0200)
Start adding flow api operations.

Started with flow validate api support by adding
below basic infrastructure.

flow_pipeline_table_get()
pmd_flow_validate()

Additional flow validate changes will be
added in next patches.

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
drivers/net/softnic/rte_eth_softnic.c
drivers/net/softnic/rte_eth_softnic_flow.c
drivers/net/softnic/rte_eth_softnic_internals.h

index 41c3a9b..148b82e 100644 (file)
@@ -204,6 +204,21 @@ pmd_link_update(struct rte_eth_dev *dev __rte_unused,
        return 0;
 }
 
+static int
+pmd_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
+               enum rte_filter_type filter_type,
+               enum rte_filter_op filter_op,
+               void *arg)
+{
+       if (filter_type == RTE_ETH_FILTER_GENERIC &&
+                       filter_op == RTE_ETH_FILTER_GET) {
+               *(const void **)arg = &pmd_flow_ops;
+               return 0;
+       }
+
+       return -ENOTSUP;
+}
+
 static int
 pmd_tm_ops_get(struct rte_eth_dev *dev __rte_unused, void *arg)
 {
@@ -221,6 +236,7 @@ static const struct eth_dev_ops pmd_ops = {
        .dev_infos_get = pmd_dev_infos_get,
        .rx_queue_setup = pmd_rx_queue_setup,
        .tx_queue_setup = pmd_tx_queue_setup,
+       .filter_ctrl = pmd_filter_ctrl,
        .tm_ops_get = pmd_tm_ops_get,
 };
 
index 843db75..f378903 100644 (file)
@@ -44,3 +44,115 @@ flow_attr_map_get(struct pmd_internals *softnic,
        return (ingress) ? &softnic->flow.ingress_map[group_id] :
                &softnic->flow.egress_map[group_id];
 }
+
+static int
+flow_pipeline_table_get(struct pmd_internals *softnic,
+               const struct rte_flow_attr *attr,
+               const char **pipeline_name,
+               uint32_t *table_id,
+               struct rte_flow_error *error)
+{
+       struct flow_attr_map *map;
+
+       if (attr == NULL)
+               return rte_flow_error_set(error,
+                               EINVAL,
+                               RTE_FLOW_ERROR_TYPE_ATTR,
+                               NULL,
+                               "Null attr");
+
+       if (!attr->ingress && !attr->egress)
+               return rte_flow_error_set(error,
+                               EINVAL,
+                               RTE_FLOW_ERROR_TYPE_ATTR_INGRESS,
+                               attr,
+                               "Ingress/egress not specified");
+
+       if (attr->ingress && attr->egress)
+               return rte_flow_error_set(error,
+                               EINVAL,
+                               RTE_FLOW_ERROR_TYPE_ATTR_INGRESS,
+                               attr,
+                               "Setting both ingress and egress is not allowed");
+
+       map = flow_attr_map_get(softnic,
+                       attr->group,
+                       attr->ingress);
+       if (map == NULL ||
+                       map->valid == 0)
+               return rte_flow_error_set(error,
+                               EINVAL,
+                               RTE_FLOW_ERROR_TYPE_ATTR_GROUP,
+                               attr,
+                               "Invalid group ID");
+
+       if (pipeline_name)
+               *pipeline_name = map->pipeline_name;
+
+       if (table_id)
+               *table_id = map->table_id;
+
+       return 0;
+}
+
+static int
+pmd_flow_validate(struct rte_eth_dev *dev,
+               const struct rte_flow_attr *attr,
+               const struct rte_flow_item item[],
+               const struct rte_flow_action action[],
+               struct rte_flow_error *error)
+{
+       struct pmd_internals *softnic = dev->data->dev_private;
+       struct pipeline *pipeline;
+       const char *pipeline_name = NULL;
+       uint32_t table_id = 0;
+       int status;
+
+       /* Check input parameters. */
+       if (attr == NULL)
+               return rte_flow_error_set(error,
+                               EINVAL,
+                               RTE_FLOW_ERROR_TYPE_ATTR,
+                               NULL, "Null attr");
+
+       if (item == NULL)
+               return rte_flow_error_set(error,
+                               EINVAL,
+                               RTE_FLOW_ERROR_TYPE_ITEM,
+                               NULL,
+                               "Null item");
+
+       if (action == NULL)
+               return rte_flow_error_set(error,
+                               EINVAL,
+                               RTE_FLOW_ERROR_TYPE_ACTION,
+                               NULL,
+                               "Null action");
+
+       /* Identify the pipeline table to add this flow to. */
+       status = flow_pipeline_table_get(softnic, attr, &pipeline_name,
+                                       &table_id, error);
+       if (status)
+               return status;
+
+       pipeline = softnic_pipeline_find(softnic, pipeline_name);
+       if (pipeline == NULL)
+               return rte_flow_error_set(error,
+                               EINVAL,
+                               RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+                               NULL,
+                               "Invalid pipeline name");
+
+       if (table_id >= pipeline->n_tables)
+               return rte_flow_error_set(error,
+                               EINVAL,
+                               RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+                               NULL,
+                               "Invalid pipeline table ID");
+
+       return 0;
+}
+
+const struct rte_flow_ops pmd_flow_ops = {
+       .validate = pmd_flow_validate,
+};
index 1857ec5..a1a2e15 100644 (file)
@@ -569,6 +569,8 @@ flow_attr_map_get(struct pmd_internals *softnic,
                uint32_t group_id,
                int ingress);
 
+extern const struct rte_flow_ops pmd_flow_ops;
+
 /**
  * MEMPOOL
  */