On Mon, Jun 7, 2021 at 11:39 PM Nithin Dabilpuram
<ndabilpuram@marvell.com> wrote:
>
> From: Satheesh Paul <psatheesh@marvell.com>
>
> Added support for rss action in rte_flow code based on ROC.
>
> Signed-off-by: Satheesh Paul <psatheesh@marvell.com>
> ---
> drivers/net/cnxk/cnxk_rte_flow.c | 72 +++++++++++++++++++++++++++++++++++-----
Looks like we missed updating doc/guides/nics/features/cnxk.ini for
this rss action.
> 1 file changed, 64 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/net/cnxk/cnxk_rte_flow.c b/drivers/net/cnxk/cnxk_rte_flow.c
> index d0e7bdc..8486e9e 100644
> --- a/drivers/net/cnxk/cnxk_rte_flow.c
> +++ b/drivers/net/cnxk/cnxk_rte_flow.c
> @@ -4,15 +4,64 @@
> #include <cnxk_rte_flow.h>
>
> static int
> -cnxk_map_actions(struct rte_eth_dev *dev,
> +npc_rss_action_validate(struct rte_eth_dev *dev,
> + const struct rte_flow_attr *attr,
> + const struct rte_flow_action *act)
> +{
> + const struct rte_flow_action_rss *rss;
> +
> + rss = (const struct rte_flow_action_rss *)act->conf;
> +
> + if (attr->egress) {
> + plt_err("No support of RSS in egress");
> + return -EINVAL;
> + }
> +
> + if (dev->data->dev_conf.rxmode.mq_mode != ETH_MQ_RX_RSS) {
> + plt_err("multi-queue mode is disabled");
> + return -ENOTSUP;
> + }
> +
> + if (!rss || !rss->queue_num) {
> + plt_err("no valid queues");
> + return -EINVAL;
> + }
> +
> + if (rss->func != RTE_ETH_HASH_FUNCTION_DEFAULT) {
> + plt_err("non-default RSS hash functions are not supported");
> + return -ENOTSUP;
> + }
> +
> + if (rss->key_len && rss->key_len > ROC_NIX_RSS_KEY_LEN) {
> + plt_err("RSS hash key too large");
> + return -ENOTSUP;
> + }
> +
> + return 0;
> +}
> +
> +static void
> +npc_rss_flowkey_get(struct cnxk_eth_dev *dev,
> + const struct roc_npc_action *rss_action,
> + uint32_t *flowkey_cfg)
> +{
> + const struct roc_npc_action_rss *rss;
> +
> + rss = (const struct roc_npc_action_rss *)rss_action->conf;
> +
> + *flowkey_cfg = cnxk_rss_ethdev_to_nix(dev, rss->types, rss->level);
> +}
> +
> +static int
> +cnxk_map_actions(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
> const struct rte_flow_action actions[],
> - struct roc_npc_action in_actions[])
> + struct roc_npc_action in_actions[], uint32_t *flowkey_cfg)
> {
> struct cnxk_eth_dev *hw = dev->data->dev_private;
> const struct rte_flow_action_count *act_count;
> const struct rte_flow_action_queue *act_q;
> + int i = 0, rc = 0;
> int rq;
> - int i = 0;
>
> RTE_SET_USED(hw);
>
> @@ -68,7 +117,12 @@ cnxk_map_actions(struct rte_eth_dev *dev,
> break;
>
> case RTE_FLOW_ACTION_TYPE_RSS:
> + rc = npc_rss_action_validate(dev, attr, actions);
> + if (rc)
> + goto err_exit;
> in_actions[i].type = ROC_NPC_ACTION_TYPE_RSS;
> + in_actions[i].conf = actions->conf;
> + npc_rss_flowkey_get(hw, &in_actions[i], flowkey_cfg);
> break;
>
> case RTE_FLOW_ACTION_TYPE_SECURITY:
> @@ -94,7 +148,7 @@ cnxk_map_flow_data(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
> const struct rte_flow_action actions[],
> struct roc_npc_attr *in_attr,
> struct roc_npc_item_info in_pattern[],
> - struct roc_npc_action in_actions[])
> + struct roc_npc_action in_actions[], uint32_t *flowkey_cfg)
> {
> int i = 0;
>
> @@ -113,7 +167,7 @@ cnxk_map_flow_data(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
> }
> in_pattern[i].type = ROC_NPC_ITEM_TYPE_END;
>
> - return cnxk_map_actions(dev, actions, in_actions);
> + return cnxk_map_actions(dev, attr, actions, in_actions, flowkey_cfg);
> }
>
> static int
> @@ -128,12 +182,13 @@ cnxk_flow_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
> struct roc_npc *npc = &hw->npc;
> struct roc_npc_attr in_attr;
> struct roc_npc_flow flow;
> + uint32_t flowkey_cfg = 0;
> int rc;
>
> memset(&flow, 0, sizeof(flow));
>
> rc = cnxk_map_flow_data(dev, attr, pattern, actions, &in_attr,
> - in_pattern, in_actions);
> + in_pattern, in_actions, &flowkey_cfg);
> if (rc) {
> rte_flow_error_set(error, 0, RTE_FLOW_ERROR_TYPE_ACTION_NUM,
> NULL, "Failed to map flow data");
> @@ -155,11 +210,12 @@ cnxk_flow_create(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
> struct roc_npc *npc = &hw->npc;
> struct roc_npc_attr in_attr;
> struct roc_npc_flow *flow;
> - int errcode;
> + int errcode = 0;
> int rc;
>
> rc = cnxk_map_flow_data(dev, attr, pattern, actions, &in_attr,
> - in_pattern, in_actions);
> + in_pattern, in_actions,
> + &npc->flowkey_cfg_state);
> if (rc) {
> rte_flow_error_set(error, 0, RTE_FLOW_ERROR_TYPE_ACTION_NUM,
> NULL, "Failed to map flow data");
> --
> 2.8.4
>
@@ -4,15 +4,64 @@
#include <cnxk_rte_flow.h>
static int
-cnxk_map_actions(struct rte_eth_dev *dev,
+npc_rss_action_validate(struct rte_eth_dev *dev,
+ const struct rte_flow_attr *attr,
+ const struct rte_flow_action *act)
+{
+ const struct rte_flow_action_rss *rss;
+
+ rss = (const struct rte_flow_action_rss *)act->conf;
+
+ if (attr->egress) {
+ plt_err("No support of RSS in egress");
+ return -EINVAL;
+ }
+
+ if (dev->data->dev_conf.rxmode.mq_mode != ETH_MQ_RX_RSS) {
+ plt_err("multi-queue mode is disabled");
+ return -ENOTSUP;
+ }
+
+ if (!rss || !rss->queue_num) {
+ plt_err("no valid queues");
+ return -EINVAL;
+ }
+
+ if (rss->func != RTE_ETH_HASH_FUNCTION_DEFAULT) {
+ plt_err("non-default RSS hash functions are not supported");
+ return -ENOTSUP;
+ }
+
+ if (rss->key_len && rss->key_len > ROC_NIX_RSS_KEY_LEN) {
+ plt_err("RSS hash key too large");
+ return -ENOTSUP;
+ }
+
+ return 0;
+}
+
+static void
+npc_rss_flowkey_get(struct cnxk_eth_dev *dev,
+ const struct roc_npc_action *rss_action,
+ uint32_t *flowkey_cfg)
+{
+ const struct roc_npc_action_rss *rss;
+
+ rss = (const struct roc_npc_action_rss *)rss_action->conf;
+
+ *flowkey_cfg = cnxk_rss_ethdev_to_nix(dev, rss->types, rss->level);
+}
+
+static int
+cnxk_map_actions(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
const struct rte_flow_action actions[],
- struct roc_npc_action in_actions[])
+ struct roc_npc_action in_actions[], uint32_t *flowkey_cfg)
{
struct cnxk_eth_dev *hw = dev->data->dev_private;
const struct rte_flow_action_count *act_count;
const struct rte_flow_action_queue *act_q;
+ int i = 0, rc = 0;
int rq;
- int i = 0;
RTE_SET_USED(hw);
@@ -68,7 +117,12 @@ cnxk_map_actions(struct rte_eth_dev *dev,
break;
case RTE_FLOW_ACTION_TYPE_RSS:
+ rc = npc_rss_action_validate(dev, attr, actions);
+ if (rc)
+ goto err_exit;
in_actions[i].type = ROC_NPC_ACTION_TYPE_RSS;
+ in_actions[i].conf = actions->conf;
+ npc_rss_flowkey_get(hw, &in_actions[i], flowkey_cfg);
break;
case RTE_FLOW_ACTION_TYPE_SECURITY:
@@ -94,7 +148,7 @@ cnxk_map_flow_data(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
const struct rte_flow_action actions[],
struct roc_npc_attr *in_attr,
struct roc_npc_item_info in_pattern[],
- struct roc_npc_action in_actions[])
+ struct roc_npc_action in_actions[], uint32_t *flowkey_cfg)
{
int i = 0;
@@ -113,7 +167,7 @@ cnxk_map_flow_data(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
}
in_pattern[i].type = ROC_NPC_ITEM_TYPE_END;
- return cnxk_map_actions(dev, actions, in_actions);
+ return cnxk_map_actions(dev, attr, actions, in_actions, flowkey_cfg);
}
static int
@@ -128,12 +182,13 @@ cnxk_flow_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
struct roc_npc *npc = &hw->npc;
struct roc_npc_attr in_attr;
struct roc_npc_flow flow;
+ uint32_t flowkey_cfg = 0;
int rc;
memset(&flow, 0, sizeof(flow));
rc = cnxk_map_flow_data(dev, attr, pattern, actions, &in_attr,
- in_pattern, in_actions);
+ in_pattern, in_actions, &flowkey_cfg);
if (rc) {
rte_flow_error_set(error, 0, RTE_FLOW_ERROR_TYPE_ACTION_NUM,
NULL, "Failed to map flow data");
@@ -155,11 +210,12 @@ cnxk_flow_create(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
struct roc_npc *npc = &hw->npc;
struct roc_npc_attr in_attr;
struct roc_npc_flow *flow;
- int errcode;
+ int errcode = 0;
int rc;
rc = cnxk_map_flow_data(dev, attr, pattern, actions, &in_attr,
- in_pattern, in_actions);
+ in_pattern, in_actions,
+ &npc->flowkey_cfg_state);
if (rc) {
rte_flow_error_set(error, 0, RTE_FLOW_ERROR_TYPE_ACTION_NUM,
NULL, "Failed to map flow data");