All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ori Kam <orika@mellanox.com>
To: "kirankumark@marvell.com" <kirankumark@marvell.com>,
	Wenzhuo Lu <wenzhuo.lu@intel.com>,
	Jingjing Wu <jingjing.wu@intel.com>,
	Bernard Iremonger <bernard.iremonger@intel.com>,
	John McNamara <john.mcnamara@intel.com>,
	Marko Kovacevic <marko.kovacevic@intel.com>,
	Thomas Monjalon <thomas@monjalon.net>,
	Ferruh Yigit <ferruh.yigit@intel.com>,
	 Andrew Rybchenko <arybchenko@solarflare.com>
Cc: "dev@dpdk.org" <dev@dpdk.org>
Subject: Re: [dpdk-dev] [PATCH] ethdev: add DBDF action to RTE Flow
Date: Mon, 16 Mar 2020 13:34:16 +0000	[thread overview]
Message-ID: <AM6PR05MB51767C8797125A1B8F13C9B0DBF90@AM6PR05MB5176.eurprd05.prod.outlook.com> (raw)
In-Reply-To: <20200310160609.7434-1-kirankumark@marvell.com>

Hi Kiran,


> -----Original Message-----
> From: kirankumark@marvell.com <kirankumark@marvell.com>
> Sent: Tuesday, March 10, 2020 6:06 PM
> To: Ori Kam <orika@mellanox.com>; Wenzhuo Lu <wenzhuo.lu@intel.com>;
> Jingjing Wu <jingjing.wu@intel.com>; Bernard Iremonger
> <bernard.iremonger@intel.com>; John McNamara
> <john.mcnamara@intel.com>; Marko Kovacevic
> <marko.kovacevic@intel.com>; Thomas Monjalon <thomas@monjalon.net>;
> Ferruh Yigit <ferruh.yigit@intel.com>; Andrew Rybchenko
> <arybchenko@solarflare.com>
> Cc: dev@dpdk.org; Kiran Kumar K <kirankumark@marvell.com>
> Subject: [dpdk-dev] [PATCH] ethdev: add DBDF action to RTE Flow
> 
> From: Kiran Kumar K <kirankumark@marvell.com>
> 
> Adding suuport to DBDF action in the RTE Flow.
> Application can specify the dbdf value using rte_flow_action_dbdf.
> Matched traffic will be sent to specified PCI DBDF device.
> 
I would like to see more detail use case, for example to which device / device type 
will the traffic be routed to?

> Signed-off-by: Kiran Kumar K <kirankumark@marvell.com>
> ---
>  app/test-pmd/cmdline_flow.c        | 64 ++++++++++++++++++++++++++++++
>  doc/guides/prog_guide/rte_flow.rst | 19 +++++++++
>  lib/librte_ethdev/rte_flow.c       |  1 +
>  lib/librte_ethdev/rte_flow.h       | 16 ++++++++
>  4 files changed, 100 insertions(+)
> 
> diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
> index a78154502..c318b4a27 100644
> --- a/app/test-pmd/cmdline_flow.c
> +++ b/app/test-pmd/cmdline_flow.c
> @@ -342,8 +342,17 @@ enum index {
>  	ACTION_SET_IPV4_DSCP_VALUE,
>  	ACTION_SET_IPV6_DSCP,
>  	ACTION_SET_IPV6_DSCP_VALUE,
> +	ACTION_DBDF,
>  };
> 
> +#define DBDF_KEY_LENGTH 20
> +
> +struct action_dbdf_data {
> +	struct rte_flow_action_dbdf conf;
> +	uint8_t dbdf_value[DBDF_KEY_LENGTH];
> +};
> +
> +
>  /** Maximum size for pattern in struct rte_flow_item_raw. */
>  #define ITEM_RAW_PATTERN_SIZE 40
> 
> @@ -1144,6 +1153,7 @@ static const enum index next_action[] = {
>  	ACTION_SET_META,
>  	ACTION_SET_IPV4_DSCP,
>  	ACTION_SET_IPV6_DSCP,
> +	ACTION_DBDF,
>  	ZERO,
>  };
> 
> @@ -1369,6 +1379,11 @@ static const enum index action_set_ipv6_dscp[] = {
>  	ZERO,
>  };
> 
> +static const enum index action_dbdf[] = {
> +	ACTION_NEXT,
> +	ZERO,
> +};
> +
>  static int parse_set_raw_encap_decap(struct context *, const struct token *,
>  				     const char *, unsigned int,
>  				     void *, unsigned int);
> @@ -1421,6 +1436,9 @@ static int parse_vc_action_mplsoudp_encap(struct
> context *,
>  static int parse_vc_action_mplsoudp_decap(struct context *,
>  					  const struct token *, const char *,
>  					  unsigned int, void *, unsigned int);
> +static int parse_vc_action_dbdf_value(struct context *,
> +				     const struct token *, const char *,
> +				     unsigned int, void *, unsigned int);
>  static int parse_vc_action_raw_encap(struct context *,
>  				     const struct token *, const char *,
>  				     unsigned int, void *, unsigned int);
> @@ -3684,6 +3702,18 @@ static const struct token token_list[] = {
>  			     (struct rte_flow_action_set_dscp, dscp)),
>  		.call = parse_vc_conf,
>  	},
> +	[ACTION_DBDF] = {
> +		.name = "dbdf",
> +		.help = "set DBDF value",
> +		.next = NEXT(action_dbdf, NEXT_ENTRY(STRING)),
> +		.priv = PRIV_ACTION(DBDF, sizeof(struct action_dbdf_data)),
> +		.args = ARGS(ARGS_ENTRY_ARB(0, 0),
> +			     ARGS_ENTRY_ARB(0, sizeof(uint8_t)),
> +			     ARGS_ENTRY_ARB(
> +			    offsetof(struct action_dbdf_data, dbdf_value),
> +					    DBDF_KEY_LENGTH)),
> +		.call = parse_vc_action_dbdf_value,
> +	},
>  };
> 
>  /** Remove and return last entry from argument stack. */
> @@ -5064,6 +5094,40 @@ parse_vc_action_raw_encap_index(struct context
> *ctx, const struct token *token,
>  	return len;
>  }
> 
> +static int
> +parse_vc_action_dbdf_value(struct context *ctx, const struct token *token,
> +			  const char *str, unsigned int len, void *buf,
> +			  unsigned int size)
> +{
> +	struct buffer *out = buf;
> +	struct rte_flow_action *action;
> +	struct action_dbdf_data *action_dbdf_data = NULL;
> +	int ret;
> +
> +	ret = parse_vc(ctx, token, str, len, buf, size);
> +	if (ret < 0)
> +		return ret;
> +	/* Nothing else to do if there is no buffer. */
> +	if (!out)
> +		return ret;
> +	if (!out->args.vc.actions_n)
> +		return -1;
> +	action = &out->args.vc.actions[out->args.vc.actions_n - 1];
> +	/* Point to selected object. */
> +	ctx->object = out->args.vc.data;
> +	ctx->objmask = NULL;
> +	/* Copy the headers to the buffer. */
> +	action_dbdf_data = ctx->object;
> +	*action_dbdf_data = (struct action_dbdf_data) {
> +		.conf = (struct rte_flow_action_dbdf){
> +			.dbdf_value = action_dbdf_data->dbdf_value,
> +		},
> +		.dbdf_value = {},
> +	};
> +	action->conf = &action_dbdf_data->conf;

I think you are missing the setting of the len value in the conf.

> +	return ret;
> +}
> +
>  static int
>  parse_vc_action_raw_encap(struct context *ctx, const struct token *token,
>  			  const char *str, unsigned int len, void *buf,
> diff --git a/doc/guides/prog_guide/rte_flow.rst
> b/doc/guides/prog_guide/rte_flow.rst
> index 41c147913..b900e283c 100644
> --- a/doc/guides/prog_guide/rte_flow.rst
> +++ b/doc/guides/prog_guide/rte_flow.rst
> @@ -2616,6 +2616,25 @@ Otherwise, RTE_FLOW_ERROR_TYPE_ACTION error
> will be returned.
>     | ``dscp``  | DSCP in low 6 bits, rest ignore |
>     +-----------+---------------------------------+
> 
> +Action: ``DBDF``
> +^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Set DBDF value.
> +
> +Send traffic to specified PCI DBDF device.
> +
> +.. _table_rte_flow_action_dbdf:
> +
> +.. table:: DBDF
> +
> +   +-----------------+----------------------------+
> +   | Field           | Value                      |
> +   +=================+============================+
> +   | ``length``      | DBDF length                |
> +   +-----------------+----------------------------+
> +   | ``dbdf_value``  | DBDF value                 |
> +   +-----------------+----------------------------+
> +
>  Negative types
>  ~~~~~~~~~~~~~~
> 
> diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c
> index a5ac1c7fb..6eada7785 100644
> --- a/lib/librte_ethdev/rte_flow.c
> +++ b/lib/librte_ethdev/rte_flow.c
> @@ -172,6 +172,7 @@ static const struct rte_flow_desc_data
> rte_flow_desc_action[] = {
>  	MK_FLOW_ACTION(SET_META, sizeof(struct
> rte_flow_action_set_meta)),
>  	MK_FLOW_ACTION(SET_IPV4_DSCP, sizeof(struct
> rte_flow_action_set_dscp)),
>  	MK_FLOW_ACTION(SET_IPV6_DSCP, sizeof(struct
> rte_flow_action_set_dscp)),
> +	MK_FLOW_ACTION(DBDF, sizeof(struct rte_flow_action_dbdf)),
>  };
> 
>  int
> diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
> index b43238b45..b6029c282 100644
> --- a/lib/librte_ethdev/rte_flow.h
> +++ b/lib/librte_ethdev/rte_flow.h
> @@ -2082,6 +2082,22 @@ enum rte_flow_action_type {
>  	 * See struct rte_flow_action_set_dscp.
>  	 */
>  	RTE_FLOW_ACTION_TYPE_SET_IPV6_DSCP,
> +
> +	/**
> +	 * Send packet to specified PCIe device
> +	 */
> +	RTE_FLOW_ACTION_TYPE_DBDF,
> +};
> +
> +
> +/**
> + * RTE_FLOW_ACTION_TYPE_DBDF
> + *
> + * Send the packet to specified PCI DBDF device
> + */
> +struct rte_flow_action_dbdf {
> +	uint8_t length;
> +	const uint8_t *dbdf_value;
>  };
> 
>  /**
> --
> 2.17.1

Thanks,
Ori

  reply	other threads:[~2020-03-16 13:34 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-10 16:06 [dpdk-dev] [PATCH] ethdev: add DBDF action to RTE Flow kirankumark
2020-03-16 13:34 ` Ori Kam [this message]
2020-03-17 10:34   ` Kiran Kumar Kokkilagadda
2020-03-17 13:26     ` Ori Kam
2020-03-19  9:17       ` Kiran Kumar Kokkilagadda
2020-03-19  9:26         ` Thomas Monjalon
2020-05-26 16:55           ` David Marchand
2020-05-26 16:57             ` Jerin Jacob
2020-05-26 17:09               ` David Marchand

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=AM6PR05MB51767C8797125A1B8F13C9B0DBF90@AM6PR05MB5176.eurprd05.prod.outlook.com \
    --to=orika@mellanox.com \
    --cc=arybchenko@solarflare.com \
    --cc=bernard.iremonger@intel.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=jingjing.wu@intel.com \
    --cc=john.mcnamara@intel.com \
    --cc=kirankumark@marvell.com \
    --cc=marko.kovacevic@intel.com \
    --cc=thomas@monjalon.net \
    --cc=wenzhuo.lu@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.