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:
parent
e12b177090
commit
8364aa4734
@ -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,
|
||||
};
|
||||
|
||||
|
@ -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,
|
||||
};
|
||||
|
@ -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
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user