> -----Original Message-----
> From: Pattan, Reshma
> Sent: Monday, October 8, 2018 10:10 AM
> To: dev@dpdk.org; Dumitrescu, Cristian <cristian.dumitre...@intel.com>;
> Singh, Jasvinder <jasvinder.si...@intel.com>
> Cc: Pattan, Reshma <reshma.pat...@intel.com>
> Subject: [PATCH v3] net/softnic: add flow flush API
>
> Add rte flow flush api for flushing
> all the flows of the port.
>
> Signed-off-by: Reshma Pattan <reshma.pat...@intel.com>
> ---
> v3: Some style related changes
> v2: Use TAILQ_FOREACH_SAFE instead of TAILQ_FOREACH
> for safe removal using TAILQ_REMOVAL.
> ---
> drivers/net/softnic/rte_eth_softnic_flow.c | 47 +++++++++++++++++++++-
> 1 file changed, 46 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/softnic/rte_eth_softnic_flow.c
> b/drivers/net/softnic/rte_eth_softnic_flow.c
> index 03d41bc01..08ea6e940 100644
> --- a/drivers/net/softnic/rte_eth_softnic_flow.c
> +++ b/drivers/net/softnic/rte_eth_softnic_flow.c
> @@ -11,6 +11,7 @@
> #include <rte_string_fns.h>
> #include <rte_flow.h>
> #include <rte_flow_driver.h>
> +#include <rte_tailq.h>
>
> #include "rte_eth_softnic_internals.h"
> #include "rte_eth_softnic.h"
> @@ -1915,6 +1916,50 @@ pmd_flow_destroy(struct rte_eth_dev *dev,
> return 0;
> }
>
> +static int
> +pmd_flow_flush(struct rte_eth_dev *dev,
> + struct rte_flow_error *error)
> +{
> + struct pmd_internals *softnic = dev->data->dev_private;
> + struct pipeline *pipeline;
> + uint32_t i;
> +
> + TAILQ_FOREACH(pipeline, &softnic->pipeline_list, node) {
> + /* Remove all the flows added to the tables. */
> + for (i = 0; i < pipeline->n_tables; i++) {
> + struct softnic_table *table = &pipeline->table[i];
> + struct rte_flow *flow;
> + void *temp;
> + int status;
> +
> + TAILQ_FOREACH_SAFE(flow, &table->flows, node,
> temp) {
> + /* Rule delete. */
> + status = softnic_pipeline_table_rule_delete
> + (softnic,
> + pipeline->name,
> + i,
> + &flow->match);
> + if (status)
> + return rte_flow_error_set(error,
> + EINVAL,
> +
> RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
> + NULL,
> + "Pipeline table rule delete
> failed");
When rule deletion fails, you should not abort, but set up a flag and continue
to delete the remaining rules.
> +
> + /* Update dependencies */
> + if (is_meter_action_enable(softnic, table))
> + flow_meter_owner_reset(softnic,
> flow);
> +
> + /* Flow delete. */
> + TAILQ_REMOVE(&table->flows, flow, node);
> + free(flow);
> + }
> + }
> + }
> +
This is the place to examine the above mentioned flag and set the error
function argument. If error, the error message basically says "some of the
rules could not be deleted".
> + return 0;
> +}
> +
> static int
> pmd_flow_query(struct rte_eth_dev *dev __rte_unused,
> struct rte_flow *flow,
> @@ -1971,7 +2016,7 @@ const struct rte_flow_ops pmd_flow_ops = {
> .validate = pmd_flow_validate,
> .create = pmd_flow_create,
> .destroy = pmd_flow_destroy,
> - .flush = NULL,
> + .flush = pmd_flow_flush,
> .query = pmd_flow_query,
> .isolate = NULL,
> };
> --
> 2.17.1