Message ID | 20190906120058.108073-8-yahui.cao@intel.com (mailing list archive) |
---|---|
State | Superseded, archived |
Delegated to: | xiaolong ye |
Headers | show |
Series | net/ice: add ice Flow Director driver | expand |
Context | Check | Description |
---|---|---|
ci/checkpatch | warning | coding style issues |
ci/Intel-compilation | fail | apply issues |
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@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 >
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 */ + 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."); + 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))) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ACTION, act, + "The region sizes should be any of the following values:" + "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++;
FDIR can send packet to a group of queues and distruibte it by RSS. Signed-off-by: Yahui Cao <yahui.cao@intel.com> --- drivers/net/ice/ice_fdir_filter.c | 65 +++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+)