[dpdk-dev] [dpdk-dev 07/12] net/ice: enable FDIR queue group

Ye Xiaolong xiaolong.ye at intel.com
Sat Sep 7 20:22:29 CEST 2019


On 09/06, Yahui Cao wrote:
>FDIR can send packet to a group of queues and distruibte it by RSS.
>
>Signed-off-by: Yahui Cao <yahui.cao at intel.com>
>---
> drivers/net/ice/ice_fdir_filter.c | 65 +++++++++++++++++++++++++++++++
> 1 file changed, 65 insertions(+)
>
>diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c
>index df4d0329c..ebbe1bd6c 100644
>--- a/drivers/net/ice/ice_fdir_filter.c
>+++ b/drivers/net/ice/ice_fdir_filter.c
>@@ -741,6 +741,62 @@ static struct ice_flow_engine ice_fdir_engine = {
> 	.type = ICE_FLOW_ENGINE_FDIR,
> };
> 
>+static int
>+ice_fdir_parse_action_qregion(struct ice_pf *pf,
>+			      struct rte_flow_error *error,
>+			      const struct rte_flow_action *act,
>+			      struct ice_fdir_filter_conf *filter)
>+{
>+	const struct rte_flow_action_rss *rss = act->conf;
>+	uint32_t i;
>+
>+	if (act->type != RTE_FLOW_ACTION_TYPE_RSS) {
>+		rte_flow_error_set(error, EINVAL,
>+				   RTE_FLOW_ERROR_TYPE_ACTION, act,
>+				   "Invalid action.");
>+		return -rte_errno;
>+	}
>+
>+	if (rss->queue_num <= 1) {
>+		rte_flow_error_set(error, EINVAL,
>+				   RTE_FLOW_ERROR_TYPE_ACTION, act,
>+				   "Queue region size can't be 0 or 1.");
>+		return -rte_errno;
>+	}
>+
>+	/* check if queue index for queue region is continuos */

s/continuos/continuous

>+	for (i = 0; i < rss->queue_num - 1; i++) {
>+		if (rss->queue[i + 1] != rss->queue[i] + 1) {
>+			rte_flow_error_set(error, EINVAL,
>+					   RTE_FLOW_ERROR_TYPE_ACTION, act,
>+					   "Invalid queue region indexes.");

Change the error message to "discontinuous queue region." to be more specific?

>+			return -rte_errno;
>+		}
>+	}
>+
>+	if (rss->queue[rss->queue_num - 1] >= pf->dev_data->nb_rx_queues) {
>+		rte_flow_error_set(error, EINVAL,
>+				   RTE_FLOW_ERROR_TYPE_ACTION, act,
>+				   "Invalid queue region indexes.");
>+		return -rte_errno;
>+	}
>+
>+	if (!(rte_is_power_of_2(rss->queue_num) && (rss->queue_num <= 128))) {

Use a macro fro the 128.

>+		rte_flow_error_set(error, EINVAL,
>+				   RTE_FLOW_ERROR_TYPE_ACTION, act,
>+				   "The region sizes should be any of the following values:"

s/sizes/size

>+				   "1, 2, 4, 8, 16, 32, 64, 128 as long as the total number "
>+				   "of queues do not exceed the VSI allocation.");
>+		return -rte_errno;
>+	}
>+
>+	filter->input.q_index = rss->queue[0];
>+	filter->input.q_region = rte_fls_u32(rss->queue_num) - 1;
>+	filter->input.dest_ctl = ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP;
>+
>+	return 0;
>+}
>+
> static int
> ice_fdir_parse_action(struct ice_adapter *ad,
> 		      const struct rte_flow_action actions[],
>@@ -752,6 +808,7 @@ ice_fdir_parse_action(struct ice_adapter *ad,
> 	const struct rte_flow_action_mark *mark_spec = NULL;
> 	uint32_t dest_num = 0;
> 	uint32_t mark_num = 0;
>+	int ret;
> 
> 	for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
> 		switch (actions->type) {
>@@ -785,6 +842,14 @@ ice_fdir_parse_action(struct ice_adapter *ad,
> 				ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QINDEX;
> 			filter->input.q_index = 0;
> 			break;
>+		case RTE_FLOW_ACTION_TYPE_RSS:
>+			dest_num++;
>+
>+			ret = ice_fdir_parse_action_qregion(pf,
>+						error, actions, filter);
>+			if (ret)
>+				return ret;
>+			break;
> 		case RTE_FLOW_ACTION_TYPE_MARK:
> 			mark_num++;
> 
>-- 
>2.17.1
>


More information about the dev mailing list