[dpdk-dev] [PATCH v3] net/softnic: add flow flush API

Dumitrescu, Cristian cristian.dumitrescu at intel.com
Mon Oct 8 12:35:40 CEST 2018



> -----Original Message-----
> From: Pattan, Reshma
> Sent: Monday, October 8, 2018 10:10 AM
> To: dev at dpdk.org; Dumitrescu, Cristian <cristian.dumitrescu at intel.com>;
> Singh, Jasvinder <jasvinder.singh at intel.com>
> Cc: Pattan, Reshma <reshma.pattan at 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.pattan at 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



More information about the dev mailing list