net/softnic: support flow validate

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>
This commit is contained in:
Reshma Pattan 2018-09-11 15:20:37 +01:00 committed by Cristian Dumitrescu
parent e12b177090
commit 8364aa4734
3 changed files with 130 additions and 0 deletions

View 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,
};

View 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,
};

View 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
*/