DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 1/3] ethdev: support metadata as flow rule criteria
@ 2018-09-16 13:33 Dekel Peled
  2018-09-16 13:33 ` [dpdk-dev] [PATCH 2/3] app/testpmd: " Dekel Peled
                   ` (5 more replies)
  0 siblings, 6 replies; 48+ messages in thread
From: Dekel Peled @ 2018-09-16 13:33 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, dev, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, orika

As described in [1], a new rte_flow item is added to support metadata
to use as flow rule match pattern.
The metadata is an opaque item, fully controlled by the application.

The use of metadata is relevant for egress rules only.
It can be set in the flow rule using the RTE_FLOW_ITEM_META.

In order to avoid change in mbuf API, exisitng field buf.hash.fdir.hi
is used to carry the metadata item. This field is used only in
ingress packets, so using it for egress metadata will not cause
conflicts.

Application should set the packet metadata in the mbuf dedicated field,
and set the PKT_TX_METADATA flag in the mbuf->ol_flags.
The NIC will use the packet metadata as match criteria for relevant
flow rules.

This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,
along with corresponding struct rte_flow_item_meta and ol_flag
PKT_TX_METADATA.

[1] "[RFC,v2] ethdev: support metadata as flow rule criteria"

Signeoff-by: Dekel Peled <dekelp@mellanox.com>
---
 doc/guides/prog_guide/rte_flow.rst | 21 +++++++++++++++++++++
 lib/librte_ethdev/rte_ethdev.c     |  1 +
 lib/librte_ethdev/rte_ethdev.h     |  5 +++++
 lib/librte_ethdev/rte_flow.c       |  1 +
 lib/librte_ethdev/rte_flow.h       | 25 +++++++++++++++++++++++++
 lib/librte_mbuf/rte_mbuf.c         |  2 ++
 lib/librte_mbuf/rte_mbuf.h         | 16 ++++++++++++++--
 7 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
index b305a72..560e45a 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -1191,6 +1191,27 @@ Normally preceded by any of:
 - `Item: ICMP6_ND_NS`_
 - `Item: ICMP6_ND_OPT`_
 
+Item: ``META``
+^^^^^^^^^^^^^^
+
+Matches an application specific 32 bit metadata item.
+
+- Default ``mask`` matches any 32 bit value.
+
+.. _table_rte_flow_item_meta:
+
+.. table:: META
+
+   +----------+----------+---------------------------+
+   | Field    | Subfield | Value                     |
+   +==========+==========+===========================+
+   | ``spec`` | ``data`` | 32 bit metadata value     |
+   +----------+--------------------------------------+
+   | ``last`` | ``data`` | upper range value         |
+   +----------+----------+---------------------------+
+   | ``mask`` | ``data`` | zeroed to match any value |
+   +----------+----------+---------------------------+
+
 Actions
 ~~~~~~~
 
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index f790d42..1ae7694 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -158,6 +158,7 @@ struct rte_eth_xstats_name_off {
 	RTE_TX_OFFLOAD_BIT2STR(SECURITY),
 	RTE_TX_OFFLOAD_BIT2STR(UDP_TNL_TSO),
 	RTE_TX_OFFLOAD_BIT2STR(IP_TNL_TSO),
+	RTE_TX_OFFLOAD_BIT2STR(MATCH_METADATA),
 };
 
 #undef RTE_TX_OFFLOAD_BIT2STR
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index 7070e9a..a0da16c 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -953,6 +953,11 @@ struct rte_eth_conf {
  * for tunnel TSO.
  */
 #define DEV_TX_OFFLOAD_IP_TNL_TSO       0x00080000
+/**
+ * Device supports match on metadata Tx offload..
+ * Application must set PKT_TX_METADATA and mbuf metadata field.
+ */
+#define DEV_TX_OFFLOAD_MATCH_METADATA   0x00100000
 
 #define RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP 0x00000001
 /**< Device supports Rx queue setup after device started*/
diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c
index cff4b52..54e5ef8 100644
--- a/lib/librte_ethdev/rte_flow.c
+++ b/lib/librte_ethdev/rte_flow.c
@@ -66,6 +66,7 @@ struct rte_flow_desc_data {
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_sla_eth)),
 	MK_FLOW_ITEM(ICMP6_ND_OPT_TLA_ETH,
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
+	MK_FLOW_ITEM(META, sizeof(struct rte_flow_item_meta)),
 };
 
 /** Generate flow_action[] entry. */
diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
index f8ba71c..d3264be 100644
--- a/lib/librte_ethdev/rte_flow.h
+++ b/lib/librte_ethdev/rte_flow.h
@@ -413,6 +413,15 @@ enum rte_flow_item_type {
 	 * See struct rte_flow_item_mark.
 	 */
 	RTE_FLOW_ITEM_TYPE_MARK,
+
+	/**
+	* [META]
+	*
+	* Matches a metadata value specified in mbuf metadata field.
+	*
+	* See struct rte_flow_item_meta.
+	*/
+	RTE_FLOW_ITEM_TYPE_META,
 };
 
 /**
@@ -1156,6 +1165,22 @@ struct rte_flow_item_icmp6_nd_opt_tla_eth {
 #endif
 
 /**
+ * RTE_FLOW_ITEM_TYPE_META.
+ *
+ * Matches a specified metadata value.
+ */
+struct rte_flow_item_meta {
+	uint32_t data;
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_META. */
+#ifndef __cplusplus
+static const struct rte_flow_item_meta rte_flow_item_meta_mask = {
+	.data = RTE_BE32(UINT32_MAX),
+};
+#endif
+
+/**
  * @warning
  * @b EXPERIMENTAL: this structure may change without prior notice
  *
diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
index e714c5a..4b25ae8 100644
--- a/lib/librte_mbuf/rte_mbuf.c
+++ b/lib/librte_mbuf/rte_mbuf.c
@@ -395,6 +395,7 @@ const char *rte_get_tx_ol_flag_name(uint64_t mask)
 	case PKT_TX_TUNNEL_UDP: return "PKT_TX_TUNNEL_UDP";
 	case PKT_TX_MACSEC: return "PKT_TX_MACSEC";
 	case PKT_TX_SEC_OFFLOAD: return "PKT_TX_SEC_OFFLOAD";
+	case PKT_TX_METADATA: return "PKT_TX_METADATA";
 	default: return NULL;
 	}
 }
@@ -435,6 +436,7 @@ const char *rte_get_tx_ol_flag_name(uint64_t mask)
 		  "PKT_TX_TUNNEL_NONE" },
 		{ PKT_TX_MACSEC, PKT_TX_MACSEC, NULL },
 		{ PKT_TX_SEC_OFFLOAD, PKT_TX_SEC_OFFLOAD, NULL },
+		{ PKT_TX_METADATA, PKT_TX_METADATA, NULL },
 	};
 	const char *name;
 	unsigned int i;
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index 9ce5d76..ea75ad0 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -182,6 +182,11 @@
 /* add new TX flags here */
 
 /**
+ * Indicate that the metadata field in the mbuf is in use.
+ */
+#define PKT_TX_METADATA	(1ULL << 41)
+
+/**
  * UDP Fragmentation Offload flag. This flag is used for enabling UDP
  * fragmentation in SW or in HW. When use UFO, mbuf->tso_segsz is used
  * to store the MSS of UDP fragments.
@@ -342,8 +347,9 @@
 		PKT_TX_QINQ_PKT |        \
 		PKT_TX_VLAN_PKT |        \
 		PKT_TX_TUNNEL_MASK |	 \
-		PKT_TX_MACSEC |		 \
-		PKT_TX_SEC_OFFLOAD)
+		PKT_TX_MACSEC |          \
+		PKT_TX_SEC_OFFLOAD |	 \
+		PKT_TX_METADATA)
 
 /**
  * Mbuf having an external buffer attached. shinfo in mbuf must be filled.
@@ -526,6 +532,12 @@ struct rte_mbuf {
 			uint32_t hi;
 			/**< First 4 flexible bytes or FD ID, dependent on
 			     PKT_RX_FDIR_* flag in ol_flags. */
+			/**
+			 * Above member has optional use on egress:
+			 * Application specific metadata value
+			 * for flow rule match.
+			 * Valid if PKT_TX_METADATA is set.
+			 */
 		} fdir;           /**< Filter identifier if FDIR enabled */
 		struct {
 			uint32_t lo;
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH 2/3] app/testpmd: support metadata as flow rule criteria
  2018-09-16 13:33 [dpdk-dev] [PATCH 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
@ 2018-09-16 13:33 ` Dekel Peled
  2018-09-16 13:33 ` [dpdk-dev] [PATCH 3/3] app/testpmd: add debug command tx_metadata set <port-id> <value> Dekel Peled
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 48+ messages in thread
From: Dekel Peled @ 2018-09-16 13:33 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, dev, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, orika

As described in [1], this series adds option to set metadata value as
match pattern when creating a new flow rule.

This patch introduces additional options in testpmd commands.
New item type "meta" "data", new offload flag "match_metadata".

[1] "ethdev: support metadata as flow rule criteria"

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
 app/test-pmd/cmdline.c                      | 14 ++++++++------
 app/test-pmd/cmdline_flow.c                 | 25 +++++++++++++++++++++++++
 app/test-pmd/config.c                       |  1 +
 app/test-pmd/testpmd.c                      |  4 ++++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  5 ++---
 5 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 589121d..4559d59 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -17403,7 +17403,8 @@ struct cmd_config_per_port_tx_offload_result {
 			  "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
 			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
 			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
-			  "mt_lockfree#multi_segs#mbuf_fast_free#security");
+			  "mt_lockfree#multi_segs#mbuf_fast_free#security#"
+			  "match_metadata");
 cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_on_off =
 	TOKEN_STRING_INITIALIZER
 		(struct cmd_config_per_port_tx_offload_result,
@@ -17484,8 +17485,8 @@ struct cmd_config_per_port_tx_offload_result {
 		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
 		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
 		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
-		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
-		    "on|off",
+		    "mt_lockfree|multi_segs|mbuf_fast_free|security|"
+		    "match_metadata on|off",
 	.tokens = {
 		(void *)&cmd_config_per_port_tx_offload_result_port,
 		(void *)&cmd_config_per_port_tx_offload_result_config,
@@ -17535,7 +17536,8 @@ struct cmd_config_per_queue_tx_offload_result {
 			  "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
 			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
 			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
-			  "mt_lockfree#multi_segs#mbuf_fast_free#security");
+			  "mt_lockfree#multi_segs#mbuf_fast_free#security#"
+			  "match_metadata");
 cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_on_off =
 	TOKEN_STRING_INITIALIZER
 		(struct cmd_config_per_queue_tx_offload_result,
@@ -17588,8 +17590,8 @@ struct cmd_config_per_queue_tx_offload_result {
 		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
 		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
 		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
-		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
-		    "on|off",
+		    "mt_lockfree|multi_segs|mbuf_fast_free|security|"
+		    "match_metadata on|off",
 	.tokens = {
 		(void *)&cmd_config_per_queue_tx_offload_result_port,
 		(void *)&cmd_config_per_queue_tx_offload_result_port_id,
diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index f926060..2a5424f 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -178,6 +178,8 @@ enum index {
 	ITEM_ICMP6_ND_OPT_SLA_ETH_SLA,
 	ITEM_ICMP6_ND_OPT_TLA_ETH,
 	ITEM_ICMP6_ND_OPT_TLA_ETH_TLA,
+	ITEM_META,
+	ITEM_META_DATA,
 
 	/* Validate/create actions. */
 	ACTIONS,
@@ -564,6 +566,7 @@ struct parse_action_priv {
 	ITEM_ICMP6_ND_OPT,
 	ITEM_ICMP6_ND_OPT_SLA_ETH,
 	ITEM_ICMP6_ND_OPT_TLA_ETH,
+	ITEM_META,
 	ZERO,
 };
 
@@ -784,6 +787,12 @@ struct parse_action_priv {
 	ZERO,
 };
 
+static const enum index item_meta[] = {
+	ITEM_META_DATA,
+	ITEM_NEXT,
+	ZERO,
+};
+
 static const enum index next_action[] = {
 	ACTION_END,
 	ACTION_VOID,
@@ -1985,6 +1994,22 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,
 		.args = ARGS(ARGS_ENTRY_HTON
 			     (struct rte_flow_item_icmp6_nd_opt_tla_eth, tla)),
 	},
+	[ITEM_META] = {
+		.name = "meta",
+		.help = "match metadata header",
+		.priv = PRIV_ITEM(META, sizeof(struct rte_flow_item_meta)),
+		.next = NEXT(item_meta),
+		.call = parse_vc,
+	},
+	[ITEM_META_DATA] = {
+		.name = "data",
+		.help = "metadata value",
+		.next = NEXT(item_meta, NEXT_ENTRY(UNSIGNED), item_param),
+		.args = ARGS(ARGS_ENTRY_MASK_HTON(struct rte_flow_item_meta,
+        					  data,
+						  "\xff\xff\xff\xff"
+						  "\xff\xff\xff\xff")),
+	},
 
 	/* Validate/create actions. */
 	[ACTIONS] = {
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 14ccd68..70b2cce 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -1034,6 +1034,7 @@ void print_valid_ports(void)
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_sla_eth)),
 	MK_FLOW_ITEM(ICMP6_ND_OPT_TLA_ETH,
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
+	MK_FLOW_ITEM(META, sizeof(struct rte_flow_item_meta)),
 };
 
 /** Pattern item specification types. */
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index ee48db2..969eb7c 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -747,6 +747,10 @@ static void eth_dev_event_callback(char *device_name,
 		      DEV_TX_OFFLOAD_MBUF_FAST_FREE))
 			port->dev_conf.txmode.offloads &=
 				~DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+		if (!(port->dev_info.tx_offload_capa &
+			DEV_TX_OFFLOAD_MATCH_METADATA))
+			port->dev_conf.txmode.offloads &=
+				~DEV_TX_OFFLOAD_MATCH_METADATA;
 		if (numa_support) {
 			if (port_numa[pid] != NUMA_NO_CONFIG)
 				port_per_socket[port_numa[pid]]++;
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index dde205a..28da560 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -3511,10 +3511,9 @@ This section lists supported pattern items and their attributes, if any.
 
   - ``sla {MAC-48}``: source Ethernet LLA.
 
-- ``icmp6_nd_opt_sla_eth``: match ICMPv6 neighbor discovery target Ethernet
-  link-layer address option.
+- ``meta``: match application specific metadata. 
 
-  - ``tla {MAC-48}``: target Ethernet LLA.
+  - ``data``: metadata value.
 
 Actions list
 ^^^^^^^^^^^^
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH 3/3] app/testpmd: add debug command tx_metadata set <port-id> <value>
  2018-09-16 13:33 [dpdk-dev] [PATCH 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
  2018-09-16 13:33 ` [dpdk-dev] [PATCH 2/3] app/testpmd: " Dekel Peled
@ 2018-09-16 13:33 ` Dekel Peled
  2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 0/3] *** SUBJECT HERE *** Dekel Peled
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 48+ messages in thread
From: Dekel Peled @ 2018-09-16 13:33 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, dev, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, orika

As described in [1],[2] this series adds option to set metadata value as
match pattern when creating a new flow rule.

This patch introduces code for debug porpuse only.
The new debug command takes a 32 bit value and stores it per port.
testpmd will add to any Tx packet sent from this port the metadata
value, and set ol_flags accordingly.

[1] "ethdev: support metadata as flow rule criteria"
[2] "app/testpmd: support metadata as flow rule criteria"

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
 app/test-pmd/cmdline.c                      | 46 +++++++++++++++++++++++++++++
 app/test-pmd/config.c                       |  6 ++++
 app/test-pmd/testpmd.c                      |  1 +
 app/test-pmd/testpmd.h                      |  3 ++
 app/test-pmd/txonly.c                       | 10 +++++++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  7 +++++
 6 files changed, 73 insertions(+)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 4559d59..83ed2b2 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -17604,6 +17604,51 @@ struct cmd_config_per_queue_tx_offload_result {
 	}
 };
 
+/* *** ENABLE METADATA INSERTION IN TX PACKETS SENT TO PMD *** */
+struct cmd_tx_metadata_set_result {
+	cmdline_fixed_string_t tx_metadata;
+	cmdline_fixed_string_t set;
+	portid_t port_id;
+	uint32_t metadata;
+};
+
+static void
+cmd_tx_metadata_set_parsed(void *parsed_result,
+		       __attribute__((unused)) struct cmdline *cl,
+		       __attribute__((unused)) void *data)
+{
+	struct cmd_tx_metadata_set_result *res = parsed_result;
+
+	tx_metadata_set(res->port_id, res->metadata);
+}
+
+cmdline_parse_token_string_t cmd_tx_metadata_set_tx_metadata =
+	TOKEN_STRING_INITIALIZER(struct cmd_tx_metadata_set_result,
+				tx_metadata, "tx_metadata");
+cmdline_parse_token_string_t cmd_tx_metadata_set_set =
+	TOKEN_STRING_INITIALIZER(struct cmd_tx_metadata_set_result,
+				 set, "set");
+cmdline_parse_token_num_t cmd_tx_metadata_set_portid =
+	TOKEN_NUM_INITIALIZER(struct cmd_tx_metadata_set_result,
+			      port_id, UINT16);
+cmdline_parse_token_num_t cmd_tx_metadata_set_metadata =
+	TOKEN_NUM_INITIALIZER(struct cmd_tx_metadata_set_result,
+			      metadata, UINT32);
+
+cmdline_parse_inst_t cmd_tx_metadata_set = {
+	.f = cmd_tx_metadata_set_parsed,
+	.data = NULL,
+	.help_str = "tx_metadata set <port_id> <metadata>: "
+		    "Enable metadata insertion in packets sent to PMD",
+	.tokens = {
+		(void *)&cmd_tx_metadata_set_tx_metadata,
+		(void *)&cmd_tx_metadata_set_set,
+		(void *)&cmd_tx_metadata_set_portid,
+		(void *)&cmd_tx_metadata_set_metadata,
+		NULL,
+	},
+};
+
 /* ******************************************************************************** */
 
 /* list of instructions */
@@ -17869,6 +17914,7 @@ struct cmd_config_per_queue_tx_offload_result {
 	(cmdline_parse_inst_t *)&cmd_operate_bpf_ld_parse,
 	(cmdline_parse_inst_t *)&cmd_operate_bpf_unld_parse,
 #endif
+	(cmdline_parse_inst_t *)&cmd_tx_metadata_set,
 	NULL,
 };
 
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 70b2cce..b87c691 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -3828,3 +3828,9 @@ struct igb_ring_desc_16_bytes {
 
 	printf("\n\n");
 }
+
+void
+tx_metadata_set(portid_t port_id, uint32_t metadata)
+{
+	ports[port_id].metadata = metadata;
+}
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 969eb7c..cd6823d 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -776,6 +776,7 @@ static void eth_dev_event_callback(char *device_name,
 		/* set flag to initialize port/queue */
 		port->need_reconfig = 1;
 		port->need_reconfig_queues = 1;
+		port->metadata = 0;
 	}
 
 	/*
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index a1f6614..10b0cd3 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -183,6 +183,7 @@ struct rte_port {
 #ifdef SOFTNIC
 	struct softnic_port     softport;  /**< softnic params */
 #endif
+	uint32_t                metadata; /**< metadata value to add in tx packets (debug only) */
 };
 
 /**
@@ -743,6 +744,8 @@ enum print_warning {
 queueid_t get_allowed_max_nb_txq(portid_t *pid);
 int check_nb_txq(queueid_t txq);
 
+void tx_metadata_set(portid_t port_id, uint32_t metadata);
+
 /*
  * Work-around of a compilation error with ICC on invocations of the
  * rte_be_to_cpu_16() function.
diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
index 1f08b6e..5d55d52 100644
--- a/app/test-pmd/txonly.c
+++ b/app/test-pmd/txonly.c
@@ -253,6 +253,16 @@
 		pkt->l2_len = sizeof(struct ether_hdr);
 		pkt->l3_len = sizeof(struct ipv4_hdr);
 		pkts_burst[nb_pkt] = pkt;
+
+		/*
+		 * If user configured metadata value add it to packet
+		 * and set ol_flags accordingly
+		 */
+		if (ports[fs->tx_port].metadata)
+		{
+			pkt->hash.fdir.hi = ports[fs->tx_port].metadata;
+			pkt->ol_flags |= PKT_TX_METADATA;
+		}
 	}
 	nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_pkt);
 	/*
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 28da560..cfedf2d 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -851,6 +851,13 @@ Disable hardware insertion of a VLAN header in packets sent on a port::
 
    testpmd> tx_vlan reset (port_id)
 
+tx_metadata set
+~~~~~~~~~~~~~~~
+
+Set metadata value to insert in packets sent to PMD::
+
+   testpmd> tx_metadata set (port_id) (value)
+
 csum set
 ~~~~~~~~
 
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v2 0/3] *** SUBJECT HERE ***
  2018-09-16 13:33 [dpdk-dev] [PATCH 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
  2018-09-16 13:33 ` [dpdk-dev] [PATCH 2/3] app/testpmd: " Dekel Peled
  2018-09-16 13:33 ` [dpdk-dev] [PATCH 3/3] app/testpmd: add debug command tx_metadata set <port-id> <value> Dekel Peled
@ 2018-09-16 14:37 ` Dekel Peled
  2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 0/3] support meadata as flow rule criteria Dekel Peled
                     ` (3 more replies)
  2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
                   ` (2 subsequent siblings)
  5 siblings, 4 replies; 48+ messages in thread
From: Dekel Peled @ 2018-09-16 14:37 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, dev, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, orika

This series implements the match-metadata feature described in [1].

[1] "[RFC,v2] ethdev: support metadata as flow rule criteria"

V2:
* Fix some checkpatch coding style issues (wrongly sent).

Dekel Peled (3):
  ethdev: support metadata as flow rule criteria
  app/testpmd: support metadata as flow rule criteria
  app/testpmd: add debug command Tx metadata set

 app/test-pmd/cmdline.c                      | 60 ++++++++++++++++++++++++++---
 app/test-pmd/cmdline_flow.c                 | 25 ++++++++++++
 app/test-pmd/config.c                       |  7 ++++
 app/test-pmd/testpmd.c                      |  5 +++
 app/test-pmd/testpmd.h                      |  4 ++
 app/test-pmd/txonly.c                       |  9 +++++
 doc/guides/prog_guide/rte_flow.rst          | 21 ++++++++++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst | 12 ++++--
 lib/librte_ethdev/rte_ethdev.c              |  1 +
 lib/librte_ethdev/rte_ethdev.h              |  5 +++
 lib/librte_ethdev/rte_flow.c                |  1 +
 lib/librte_ethdev/rte_flow.h                | 24 ++++++++++++
 lib/librte_mbuf/rte_mbuf.c                  |  2 +
 lib/librte_mbuf/rte_mbuf.h                  | 16 +++++++-
 14 files changed, 181 insertions(+), 11 deletions(-)

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v2 1/3] ethdev: support metadata as flow rule criteria
  2018-09-16 13:33 [dpdk-dev] [PATCH 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
                   ` (2 preceding siblings ...)
  2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 0/3] *** SUBJECT HERE *** Dekel Peled
@ 2018-09-16 14:37 ` Dekel Peled
  2018-09-18  7:55   ` Xueming(Steven) Li
  2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 2/3] app/testpmd: " Dekel Peled
  2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 3/3] app/testpmd: add debug command Tx metadata set Dekel Peled
  5 siblings, 1 reply; 48+ messages in thread
From: Dekel Peled @ 2018-09-16 14:37 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, dev, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, orika

As described in [1], a new rte_flow item is added to support metadata
to use as flow rule match pattern.
The metadata is an opaque item, fully controlled by the application.

The use of metadata is relevant for egress rules only.
It can be set in the flow rule using the RTE_FLOW_ITEM_META.

In order to avoid change in mbuf API, exisitng field buf.hash.fdir.hi
is used to carry the metadata item. This field is used only in
ingress packets, so using it for egress metadata will not cause
conflicts.

Application should set the packet metadata in the mbuf dedicated field,
and set the PKT_TX_METADATA flag in the mbuf->ol_flags.
The NIC will use the packet metadata as match criteria for relevant
flow rules.

This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,
along with corresponding struct rte_flow_item_meta and ol_flag
PKT_TX_METADATA.

[1] "[RFC,v2] ethdev: support metadata as flow rule criteria"

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
V2:
* Fix some checkpatch coding style issues (wrongly sent).
---

 doc/guides/prog_guide/rte_flow.rst | 21 +++++++++++++++++++++
 lib/librte_ethdev/rte_ethdev.c     |  1 +
 lib/librte_ethdev/rte_ethdev.h     |  5 +++++
 lib/librte_ethdev/rte_flow.c       |  1 +
 lib/librte_ethdev/rte_flow.h       | 24 ++++++++++++++++++++++++
 lib/librte_mbuf/rte_mbuf.c         |  2 ++
 lib/librte_mbuf/rte_mbuf.h         | 16 ++++++++++++++--
 7 files changed, 68 insertions(+), 2 deletions(-)

diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
index b305a72..560e45a 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -1191,6 +1191,27 @@ Normally preceded by any of:
 - `Item: ICMP6_ND_NS`_
 - `Item: ICMP6_ND_OPT`_
 
+Item: ``META``
+^^^^^^^^^^^^^^
+
+Matches an application specific 32 bit metadata item.
+
+- Default ``mask`` matches any 32 bit value.
+
+.. _table_rte_flow_item_meta:
+
+.. table:: META
+
+   +----------+----------+---------------------------+
+   | Field    | Subfield | Value                     |
+   +==========+==========+===========================+
+   | ``spec`` | ``data`` | 32 bit metadata value     |
+   +----------+--------------------------------------+
+   | ``last`` | ``data`` | upper range value         |
+   +----------+----------+---------------------------+
+   | ``mask`` | ``data`` | zeroed to match any value |
+   +----------+----------+---------------------------+
+
 Actions
 ~~~~~~~
 
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index f790d42..1ae7694 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -158,6 +158,7 @@ struct rte_eth_xstats_name_off {
 	RTE_TX_OFFLOAD_BIT2STR(SECURITY),
 	RTE_TX_OFFLOAD_BIT2STR(UDP_TNL_TSO),
 	RTE_TX_OFFLOAD_BIT2STR(IP_TNL_TSO),
+	RTE_TX_OFFLOAD_BIT2STR(MATCH_METADATA),
 };
 
 #undef RTE_TX_OFFLOAD_BIT2STR
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index 7070e9a..a0da16c 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -953,6 +953,11 @@ struct rte_eth_conf {
  * for tunnel TSO.
  */
 #define DEV_TX_OFFLOAD_IP_TNL_TSO       0x00080000
+/**
+ * Device supports match on metadata Tx offload..
+ * Application must set PKT_TX_METADATA and mbuf metadata field.
+ */
+#define DEV_TX_OFFLOAD_MATCH_METADATA   0x00100000
 
 #define RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP 0x00000001
 /**< Device supports Rx queue setup after device started*/
diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c
index cff4b52..54e5ef8 100644
--- a/lib/librte_ethdev/rte_flow.c
+++ b/lib/librte_ethdev/rte_flow.c
@@ -66,6 +66,7 @@ struct rte_flow_desc_data {
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_sla_eth)),
 	MK_FLOW_ITEM(ICMP6_ND_OPT_TLA_ETH,
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
+	MK_FLOW_ITEM(META, sizeof(struct rte_flow_item_meta)),
 };
 
 /** Generate flow_action[] entry. */
diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
index f8ba71c..4cc5954 100644
--- a/lib/librte_ethdev/rte_flow.h
+++ b/lib/librte_ethdev/rte_flow.h
@@ -413,6 +413,14 @@ enum rte_flow_item_type {
 	 * See struct rte_flow_item_mark.
 	 */
 	RTE_FLOW_ITEM_TYPE_MARK,
+
+	/**
+	 * [META]
+	 *
+	 * Matches a metadata value specified in mbuf metadata field.
+	 * See struct rte_flow_item_meta.
+	 */
+	RTE_FLOW_ITEM_TYPE_META,
 };
 
 /**
@@ -1156,6 +1164,22 @@ struct rte_flow_item_icmp6_nd_opt_tla_eth {
 #endif
 
 /**
+ * RTE_FLOW_ITEM_TYPE_META.
+ *
+ * Matches a specified metadata value.
+ */
+struct rte_flow_item_meta {
+	uint32_t data;
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_META. */
+#ifndef __cplusplus
+static const struct rte_flow_item_meta rte_flow_item_meta_mask = {
+	.data = RTE_BE32(UINT32_MAX),
+};
+#endif
+
+/**
  * @warning
  * @b EXPERIMENTAL: this structure may change without prior notice
  *
diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
index e714c5a..4b25ae8 100644
--- a/lib/librte_mbuf/rte_mbuf.c
+++ b/lib/librte_mbuf/rte_mbuf.c
@@ -395,6 +395,7 @@ const char *rte_get_tx_ol_flag_name(uint64_t mask)
 	case PKT_TX_TUNNEL_UDP: return "PKT_TX_TUNNEL_UDP";
 	case PKT_TX_MACSEC: return "PKT_TX_MACSEC";
 	case PKT_TX_SEC_OFFLOAD: return "PKT_TX_SEC_OFFLOAD";
+	case PKT_TX_METADATA: return "PKT_TX_METADATA";
 	default: return NULL;
 	}
 }
@@ -435,6 +436,7 @@ const char *rte_get_tx_ol_flag_name(uint64_t mask)
 		  "PKT_TX_TUNNEL_NONE" },
 		{ PKT_TX_MACSEC, PKT_TX_MACSEC, NULL },
 		{ PKT_TX_SEC_OFFLOAD, PKT_TX_SEC_OFFLOAD, NULL },
+		{ PKT_TX_METADATA, PKT_TX_METADATA, NULL },
 	};
 	const char *name;
 	unsigned int i;
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index 9ce5d76..ea75ad0 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -182,6 +182,11 @@
 /* add new TX flags here */
 
 /**
+ * Indicate that the metadata field in the mbuf is in use.
+ */
+#define PKT_TX_METADATA	(1ULL << 41)
+
+/**
  * UDP Fragmentation Offload flag. This flag is used for enabling UDP
  * fragmentation in SW or in HW. When use UFO, mbuf->tso_segsz is used
  * to store the MSS of UDP fragments.
@@ -342,8 +347,9 @@
 		PKT_TX_QINQ_PKT |        \
 		PKT_TX_VLAN_PKT |        \
 		PKT_TX_TUNNEL_MASK |	 \
-		PKT_TX_MACSEC |		 \
-		PKT_TX_SEC_OFFLOAD)
+		PKT_TX_MACSEC |          \
+		PKT_TX_SEC_OFFLOAD |	 \
+		PKT_TX_METADATA)
 
 /**
  * Mbuf having an external buffer attached. shinfo in mbuf must be filled.
@@ -526,6 +532,12 @@ struct rte_mbuf {
 			uint32_t hi;
 			/**< First 4 flexible bytes or FD ID, dependent on
 			     PKT_RX_FDIR_* flag in ol_flags. */
+			/**
+			 * Above member has optional use on egress:
+			 * Application specific metadata value
+			 * for flow rule match.
+			 * Valid if PKT_TX_METADATA is set.
+			 */
 		} fdir;           /**< Filter identifier if FDIR enabled */
 		struct {
 			uint32_t lo;
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v2 2/3] app/testpmd: support metadata as flow rule criteria
  2018-09-16 13:33 [dpdk-dev] [PATCH 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
                   ` (3 preceding siblings ...)
  2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
@ 2018-09-16 14:37 ` Dekel Peled
  2018-09-18  8:21   ` Xueming(Steven) Li
  2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 3/3] app/testpmd: add debug command Tx metadata set Dekel Peled
  5 siblings, 1 reply; 48+ messages in thread
From: Dekel Peled @ 2018-09-16 14:37 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, dev, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, orika

As described in [1], this series adds option to set metadata value as
match pattern when creating a new flow rule.

This patch introduces additional options in testpmd commands.
New item type "meta" "data", new offload flag "match_metadata".

[1] "ethdev: support metadata as flow rule criteria"

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
V2:
* Fix some checkpatch coding style issues (wrongly sent).
---

 app/test-pmd/cmdline.c                      | 14 ++++++++------
 app/test-pmd/cmdline_flow.c                 | 25 +++++++++++++++++++++++++
 app/test-pmd/config.c                       |  1 +
 app/test-pmd/testpmd.c                      |  4 ++++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  5 ++---
 5 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 589121d..4559d59 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -17403,7 +17403,8 @@ struct cmd_config_per_port_tx_offload_result {
 			  "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
 			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
 			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
-			  "mt_lockfree#multi_segs#mbuf_fast_free#security");
+			  "mt_lockfree#multi_segs#mbuf_fast_free#security#"
+			  "match_metadata");
 cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_on_off =
 	TOKEN_STRING_INITIALIZER
 		(struct cmd_config_per_port_tx_offload_result,
@@ -17484,8 +17485,8 @@ struct cmd_config_per_port_tx_offload_result {
 		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
 		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
 		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
-		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
-		    "on|off",
+		    "mt_lockfree|multi_segs|mbuf_fast_free|security|"
+		    "match_metadata on|off",
 	.tokens = {
 		(void *)&cmd_config_per_port_tx_offload_result_port,
 		(void *)&cmd_config_per_port_tx_offload_result_config,
@@ -17535,7 +17536,8 @@ struct cmd_config_per_queue_tx_offload_result {
 			  "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
 			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
 			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
-			  "mt_lockfree#multi_segs#mbuf_fast_free#security");
+			  "mt_lockfree#multi_segs#mbuf_fast_free#security#"
+			  "match_metadata");
 cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_on_off =
 	TOKEN_STRING_INITIALIZER
 		(struct cmd_config_per_queue_tx_offload_result,
@@ -17588,8 +17590,8 @@ struct cmd_config_per_queue_tx_offload_result {
 		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
 		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
 		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
-		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
-		    "on|off",
+		    "mt_lockfree|multi_segs|mbuf_fast_free|security|"
+		    "match_metadata on|off",
 	.tokens = {
 		(void *)&cmd_config_per_queue_tx_offload_result_port,
 		(void *)&cmd_config_per_queue_tx_offload_result_port_id,
diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index f926060..f6ca6b4 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -178,6 +178,8 @@ enum index {
 	ITEM_ICMP6_ND_OPT_SLA_ETH_SLA,
 	ITEM_ICMP6_ND_OPT_TLA_ETH,
 	ITEM_ICMP6_ND_OPT_TLA_ETH_TLA,
+	ITEM_META,
+	ITEM_META_DATA,
 
 	/* Validate/create actions. */
 	ACTIONS,
@@ -564,6 +566,7 @@ struct parse_action_priv {
 	ITEM_ICMP6_ND_OPT,
 	ITEM_ICMP6_ND_OPT_SLA_ETH,
 	ITEM_ICMP6_ND_OPT_TLA_ETH,
+	ITEM_META,
 	ZERO,
 };
 
@@ -784,6 +787,12 @@ struct parse_action_priv {
 	ZERO,
 };
 
+static const enum index item_meta[] = {
+	ITEM_META_DATA,
+	ITEM_NEXT,
+	ZERO,
+};
+
 static const enum index next_action[] = {
 	ACTION_END,
 	ACTION_VOID,
@@ -1985,6 +1994,22 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,
 		.args = ARGS(ARGS_ENTRY_HTON
 			     (struct rte_flow_item_icmp6_nd_opt_tla_eth, tla)),
 	},
+	[ITEM_META] = {
+		.name = "meta",
+		.help = "match metadata header",
+		.priv = PRIV_ITEM(META, sizeof(struct rte_flow_item_meta)),
+		.next = NEXT(item_meta),
+		.call = parse_vc,
+	},
+	[ITEM_META_DATA] = {
+		.name = "data",
+		.help = "metadata value",
+		.next = NEXT(item_meta, NEXT_ENTRY(UNSIGNED), item_param),
+		.args = ARGS(ARGS_ENTRY_MASK_HTON(struct rte_flow_item_meta,
+							data,
+							"\xff\xff\xff\xff"
+							"\xff\xff\xff\xff")),
+	},
 
 	/* Validate/create actions. */
 	[ACTIONS] = {
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 14ccd68..70b2cce 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -1034,6 +1034,7 @@ void print_valid_ports(void)
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_sla_eth)),
 	MK_FLOW_ITEM(ICMP6_ND_OPT_TLA_ETH,
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
+	MK_FLOW_ITEM(META, sizeof(struct rte_flow_item_meta)),
 };
 
 /** Pattern item specification types. */
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index ee48db2..969eb7c 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -747,6 +747,10 @@ static void eth_dev_event_callback(char *device_name,
 		      DEV_TX_OFFLOAD_MBUF_FAST_FREE))
 			port->dev_conf.txmode.offloads &=
 				~DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+		if (!(port->dev_info.tx_offload_capa &
+			DEV_TX_OFFLOAD_MATCH_METADATA))
+			port->dev_conf.txmode.offloads &=
+				~DEV_TX_OFFLOAD_MATCH_METADATA;
 		if (numa_support) {
 			if (port_numa[pid] != NUMA_NO_CONFIG)
 				port_per_socket[port_numa[pid]]++;
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index dde205a..7d86692 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -3511,10 +3511,9 @@ This section lists supported pattern items and their attributes, if any.
 
   - ``sla {MAC-48}``: source Ethernet LLA.
 
-- ``icmp6_nd_opt_sla_eth``: match ICMPv6 neighbor discovery target Ethernet
-  link-layer address option.
+- ``meta``: match application specific metadata.
 
-  - ``tla {MAC-48}``: target Ethernet LLA.
+  - ``data``: metadata value.
 
 Actions list
 ^^^^^^^^^^^^
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v2 3/3] app/testpmd: add debug command Tx metadata set
  2018-09-16 13:33 [dpdk-dev] [PATCH 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
                   ` (4 preceding siblings ...)
  2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 2/3] app/testpmd: " Dekel Peled
@ 2018-09-16 14:37 ` Dekel Peled
  2018-09-19  5:39   ` Xueming(Steven) Li
  2018-10-05 13:19   ` Ferruh Yigit
  5 siblings, 2 replies; 48+ messages in thread
From: Dekel Peled @ 2018-09-16 14:37 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, dev, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, orika

As described in [1],[2] this series adds option to set metadata value as
match pattern when creating a new flow rule.

This patch introduces code for debug porpuse only.
The new debug command takes a 32 bit value and stores it per port.
testpmd will add to any Tx packet sent from this port the metadata
value, and set ol_flags accordingly.

[1] "ethdev: support metadata as flow rule criteria"
[2] "app/testpmd: support metadata as flow rule criteria"

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
V2:
* Fix some checkpatch coding style issues (wrongly sent).
---

 app/test-pmd/cmdline.c                      | 46 +++++++++++++++++++++++++++++
 app/test-pmd/config.c                       |  6 ++++
 app/test-pmd/testpmd.c                      |  1 +
 app/test-pmd/testpmd.h                      |  4 +++
 app/test-pmd/txonly.c                       |  9 ++++++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  7 +++++
 6 files changed, 73 insertions(+)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 4559d59..83ed2b2 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -17604,6 +17604,51 @@ struct cmd_config_per_queue_tx_offload_result {
 	}
 };
 
+/* *** ENABLE METADATA INSERTION IN TX PACKETS SENT TO PMD *** */
+struct cmd_tx_metadata_set_result {
+	cmdline_fixed_string_t tx_metadata;
+	cmdline_fixed_string_t set;
+	portid_t port_id;
+	uint32_t metadata;
+};
+
+static void
+cmd_tx_metadata_set_parsed(void *parsed_result,
+		       __attribute__((unused)) struct cmdline *cl,
+		       __attribute__((unused)) void *data)
+{
+	struct cmd_tx_metadata_set_result *res = parsed_result;
+
+	tx_metadata_set(res->port_id, res->metadata);
+}
+
+cmdline_parse_token_string_t cmd_tx_metadata_set_tx_metadata =
+	TOKEN_STRING_INITIALIZER(struct cmd_tx_metadata_set_result,
+				tx_metadata, "tx_metadata");
+cmdline_parse_token_string_t cmd_tx_metadata_set_set =
+	TOKEN_STRING_INITIALIZER(struct cmd_tx_metadata_set_result,
+				 set, "set");
+cmdline_parse_token_num_t cmd_tx_metadata_set_portid =
+	TOKEN_NUM_INITIALIZER(struct cmd_tx_metadata_set_result,
+			      port_id, UINT16);
+cmdline_parse_token_num_t cmd_tx_metadata_set_metadata =
+	TOKEN_NUM_INITIALIZER(struct cmd_tx_metadata_set_result,
+			      metadata, UINT32);
+
+cmdline_parse_inst_t cmd_tx_metadata_set = {
+	.f = cmd_tx_metadata_set_parsed,
+	.data = NULL,
+	.help_str = "tx_metadata set <port_id> <metadata>: "
+		    "Enable metadata insertion in packets sent to PMD",
+	.tokens = {
+		(void *)&cmd_tx_metadata_set_tx_metadata,
+		(void *)&cmd_tx_metadata_set_set,
+		(void *)&cmd_tx_metadata_set_portid,
+		(void *)&cmd_tx_metadata_set_metadata,
+		NULL,
+	},
+};
+
 /* ******************************************************************************** */
 
 /* list of instructions */
@@ -17869,6 +17914,7 @@ struct cmd_config_per_queue_tx_offload_result {
 	(cmdline_parse_inst_t *)&cmd_operate_bpf_ld_parse,
 	(cmdline_parse_inst_t *)&cmd_operate_bpf_unld_parse,
 #endif
+	(cmdline_parse_inst_t *)&cmd_tx_metadata_set,
 	NULL,
 };
 
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 70b2cce..b87c691 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -3828,3 +3828,9 @@ struct igb_ring_desc_16_bytes {
 
 	printf("\n\n");
 }
+
+void
+tx_metadata_set(portid_t port_id, uint32_t metadata)
+{
+	ports[port_id].metadata = metadata;
+}
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 969eb7c..cd6823d 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -776,6 +776,7 @@ static void eth_dev_event_callback(char *device_name,
 		/* set flag to initialize port/queue */
 		port->need_reconfig = 1;
 		port->need_reconfig_queues = 1;
+		port->metadata = 0;
 	}
 
 	/*
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index a1f6614..54c7e95 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -183,6 +183,8 @@ struct rte_port {
 #ifdef SOFTNIC
 	struct softnic_port     softport;  /**< softnic params */
 #endif
+	/* metadata value to add in tx packets (debug only) */
+	uint32_t                metadata;
 };
 
 /**
@@ -743,6 +745,8 @@ enum print_warning {
 queueid_t get_allowed_max_nb_txq(portid_t *pid);
 int check_nb_txq(queueid_t txq);
 
+void tx_metadata_set(portid_t port_id, uint32_t metadata);
+
 /*
  * Work-around of a compilation error with ICC on invocations of the
  * rte_be_to_cpu_16() function.
diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
index 1f08b6e..b5a4b35 100644
--- a/app/test-pmd/txonly.c
+++ b/app/test-pmd/txonly.c
@@ -253,6 +253,15 @@
 		pkt->l2_len = sizeof(struct ether_hdr);
 		pkt->l3_len = sizeof(struct ipv4_hdr);
 		pkts_burst[nb_pkt] = pkt;
+
+		/*
+		 * If user configured metadata value add it to packet
+		 * and set ol_flags accordingly
+		 */
+		if (ports[fs->tx_port].metadata) {
+			pkt->hash.fdir.hi = ports[fs->tx_port].metadata;
+			pkt->ol_flags |= PKT_TX_METADATA;
+		}
 	}
 	nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_pkt);
 	/*
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 7d86692..3688e1c 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -851,6 +851,13 @@ Disable hardware insertion of a VLAN header in packets sent on a port::
 
    testpmd> tx_vlan reset (port_id)
 
+tx_metadata set
+~~~~~~~~~~~~~~~
+
+Set metadata value to insert in packets sent to PMD::
+
+   testpmd> tx_metadata set (port_id) (value)
+
 csum set
 ~~~~~~~~
 
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v2 1/3] ethdev: support metadata as flow rule criteria
  2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
@ 2018-09-18  7:55   ` Xueming(Steven) Li
  0 siblings, 0 replies; 48+ messages in thread
From: Xueming(Steven) Li @ 2018-09-18  7:55 UTC (permalink / raw)
  To: Dekel Peled, wenzhuo.lu, jingjing.wu, bernard.iremonger, dev,
	olivier.matz, Adrien Mazarguil, Thomas Monjalon, ferruh.yigit,
	arybchenko
  Cc: Shahaf Shuler, Ori Kam



> -----Original Message-----
> From: dev <dev-bounces@dpdk.org> On Behalf Of Dekel Peled
> Sent: Sunday, September 16, 2018 10:38 PM
> To: wenzhuo.lu@intel.com; jingjing.wu@intel.com; bernard.iremonger@intel.com; dev@dpdk.org;
> olivier.matz@6wind.com; Adrien Mazarguil <adrien.mazarguil@6wind.com>; Thomas Monjalon
> <thomas@monjalon.net>; ferruh.yigit@intel.com; arybchenko@solarflare.com
> Cc: Shahaf Shuler <shahafs@mellanox.com>; Ori Kam <orika@mellanox.com>
> Subject: [dpdk-dev] [PATCH v2 1/3] ethdev: support metadata as flow rule criteria
> 
> As described in [1], a new rte_flow item is added to support metadata to use as flow rule match
> pattern.
> The metadata is an opaque item, fully controlled by the application.
> 
> The use of metadata is relevant for egress rules only.
> It can be set in the flow rule using the RTE_FLOW_ITEM_META.
> 
> In order to avoid change in mbuf API, exisitng field buf.hash.fdir.hi is used to carry the metadata
> item. This field is used only in ingress packets, so using it for egress metadata will not cause
> conflicts.
> 
> Application should set the packet metadata in the mbuf dedicated field, and set the PKT_TX_METADATA
> flag in the mbuf->ol_flags.
> The NIC will use the packet metadata as match criteria for relevant flow rules.
> 
> This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META, along with corresponding
> struct rte_flow_item_meta and ol_flag PKT_TX_METADATA.
> 
> [1] "[RFC,v2] ethdev: support metadata as flow rule criteria"
> 
> Signed-off-by: Dekel Peled <dekelp@mellanox.com>
> ---
> V2:
> * Fix some checkpatch coding style issues (wrongly sent).
> ---
> 
>  doc/guides/prog_guide/rte_flow.rst | 21 +++++++++++++++++++++
>  lib/librte_ethdev/rte_ethdev.c     |  1 +
>  lib/librte_ethdev/rte_ethdev.h     |  5 +++++
>  lib/librte_ethdev/rte_flow.c       |  1 +
>  lib/librte_ethdev/rte_flow.h       | 24 ++++++++++++++++++++++++
>  lib/librte_mbuf/rte_mbuf.c         |  2 ++
>  lib/librte_mbuf/rte_mbuf.h         | 16 ++++++++++++++--
>  7 files changed, 68 insertions(+), 2 deletions(-)
> 
> diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
> index b305a72..560e45a 100644
> --- a/doc/guides/prog_guide/rte_flow.rst
> +++ b/doc/guides/prog_guide/rte_flow.rst
> @@ -1191,6 +1191,27 @@ Normally preceded by any of:
>  - `Item: ICMP6_ND_NS`_
>  - `Item: ICMP6_ND_OPT`_
> 
> +Item: ``META``
> +^^^^^^^^^^^^^^
> +
> +Matches an application specific 32 bit metadata item.
> +
> +- Default ``mask`` matches any 32 bit value.
> +
> +.. _table_rte_flow_item_meta:
> +
> +.. table:: META
> +
> +   +----------+----------+---------------------------+
> +   | Field    | Subfield | Value                     |
> +   +==========+==========+===========================+
> +   | ``spec`` | ``data`` | 32 bit metadata value     |
> +   +----------+--------------------------------------+
> +   | ``last`` | ``data`` | upper range value         |
> +   +----------+----------+---------------------------+
> +   | ``mask`` | ``data`` | zeroed to match any value |
> +   +----------+----------+---------------------------+
> +
>  Actions
>  ~~~~~~~
> 
> diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index f790d42..1ae7694
> 100644
> --- a/lib/librte_ethdev/rte_ethdev.c
> +++ b/lib/librte_ethdev/rte_ethdev.c
> @@ -158,6 +158,7 @@ struct rte_eth_xstats_name_off {
>  	RTE_TX_OFFLOAD_BIT2STR(SECURITY),
>  	RTE_TX_OFFLOAD_BIT2STR(UDP_TNL_TSO),
>  	RTE_TX_OFFLOAD_BIT2STR(IP_TNL_TSO),
> +	RTE_TX_OFFLOAD_BIT2STR(MATCH_METADATA),
>  };
> 
>  #undef RTE_TX_OFFLOAD_BIT2STR
> diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h index 7070e9a..a0da16c
> 100644
> --- a/lib/librte_ethdev/rte_ethdev.h
> +++ b/lib/librte_ethdev/rte_ethdev.h
> @@ -953,6 +953,11 @@ struct rte_eth_conf {
>   * for tunnel TSO.
>   */
>  #define DEV_TX_OFFLOAD_IP_TNL_TSO       0x00080000
> +/**
> + * Device supports match on metadata Tx offload..
> + * Application must set PKT_TX_METADATA and mbuf metadata field.
> + */
> +#define DEV_TX_OFFLOAD_MATCH_METADATA   0x00100000
> 
>  #define RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP 0x00000001  /**< Device supports Rx queue setup
> after device started*/ diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c
> index cff4b52..54e5ef8 100644
> --- a/lib/librte_ethdev/rte_flow.c
> +++ b/lib/librte_ethdev/rte_flow.c
> @@ -66,6 +66,7 @@ struct rte_flow_desc_data {
>  		     sizeof(struct rte_flow_item_icmp6_nd_opt_sla_eth)),
>  	MK_FLOW_ITEM(ICMP6_ND_OPT_TLA_ETH,
>  		     sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
> +	MK_FLOW_ITEM(META, sizeof(struct rte_flow_item_meta)),
>  };
> 
>  /** Generate flow_action[] entry. */
> diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h index f8ba71c..4cc5954
> 100644
> --- a/lib/librte_ethdev/rte_flow.h
> +++ b/lib/librte_ethdev/rte_flow.h
> @@ -413,6 +413,14 @@ enum rte_flow_item_type {
>  	 * See struct rte_flow_item_mark.
>  	 */
>  	RTE_FLOW_ITEM_TYPE_MARK,
> +
> +	/**
> +	 * [META]
> +	 *
> +	 * Matches a metadata value specified in mbuf metadata field.
> +	 * See struct rte_flow_item_meta.
> +	 */
> +	RTE_FLOW_ITEM_TYPE_META,
>  };
> 
>  /**
> @@ -1156,6 +1164,22 @@ struct rte_flow_item_icmp6_nd_opt_tla_eth {  #endif
> 
>  /**
> + * RTE_FLOW_ITEM_TYPE_META.
> + *
> + * Matches a specified metadata value.
> + */
> +struct rte_flow_item_meta {
> +	uint32_t data;
> +};
> +
> +/** Default mask for RTE_FLOW_ITEM_TYPE_META. */ #ifndef __cplusplus
> +static const struct rte_flow_item_meta rte_flow_item_meta_mask = {
> +	.data = RTE_BE32(UINT32_MAX),
> +};
> +#endif
> +
> +/**
>   * @warning
>   * @b EXPERIMENTAL: this structure may change without prior notice
>   *
> diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c index e714c5a..4b25ae8 100644
> --- a/lib/librte_mbuf/rte_mbuf.c
> +++ b/lib/librte_mbuf/rte_mbuf.c
> @@ -395,6 +395,7 @@ const char *rte_get_tx_ol_flag_name(uint64_t mask)
>  	case PKT_TX_TUNNEL_UDP: return "PKT_TX_TUNNEL_UDP";
>  	case PKT_TX_MACSEC: return "PKT_TX_MACSEC";
>  	case PKT_TX_SEC_OFFLOAD: return "PKT_TX_SEC_OFFLOAD";
> +	case PKT_TX_METADATA: return "PKT_TX_METADATA";
>  	default: return NULL;
>  	}
>  }
> @@ -435,6 +436,7 @@ const char *rte_get_tx_ol_flag_name(uint64_t mask)
>  		  "PKT_TX_TUNNEL_NONE" },
>  		{ PKT_TX_MACSEC, PKT_TX_MACSEC, NULL },
>  		{ PKT_TX_SEC_OFFLOAD, PKT_TX_SEC_OFFLOAD, NULL },
> +		{ PKT_TX_METADATA, PKT_TX_METADATA, NULL },
>  	};
>  	const char *name;
>  	unsigned int i;
> diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index 9ce5d76..ea75ad0 100644
> --- a/lib/librte_mbuf/rte_mbuf.h
> +++ b/lib/librte_mbuf/rte_mbuf.h
> @@ -182,6 +182,11 @@
>  /* add new TX flags here */
> 
>  /**
> + * Indicate that the metadata field in the mbuf is in use.
> + */
> +#define PKT_TX_METADATA	(1ULL << 41)
> +
> +/**
>   * UDP Fragmentation Offload flag. This flag is used for enabling UDP
>   * fragmentation in SW or in HW. When use UFO, mbuf->tso_segsz is used
>   * to store the MSS of UDP fragments.
> @@ -342,8 +347,9 @@
>  		PKT_TX_QINQ_PKT |        \
>  		PKT_TX_VLAN_PKT |        \
>  		PKT_TX_TUNNEL_MASK |	 \
> -		PKT_TX_MACSEC |		 \
> -		PKT_TX_SEC_OFFLOAD)
> +		PKT_TX_MACSEC |          \
> +		PKT_TX_SEC_OFFLOAD |	 \
> +		PKT_TX_METADATA)
> 
>  /**
>   * Mbuf having an external buffer attached. shinfo in mbuf must be filled.
> @@ -526,6 +532,12 @@ struct rte_mbuf {
>  			uint32_t hi;
>  			/**< First 4 flexible bytes or FD ID, dependent on
>  			     PKT_RX_FDIR_* flag in ol_flags. */
> +			/**
> +			 * Above member has optional use on egress:
> +			 * Application specific metadata value
> +			 * for flow rule match.
> +			 * Valid if PKT_TX_METADATA is set.
> +			 */
>  		} fdir;           /**< Filter identifier if FDIR enabled */

Use mbuf->hash.fdir.hi to set metadata? How about a dedicate name mbuf->meta at same offset like this:
	union {
		union {
			// current hash definiton
		} hash;
		struct {
			uint32 lo;
			uint32 meta;
		}
	}

>  		struct {
>  			uint32_t lo;
> --
> 1.8.3.1


^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v2 2/3] app/testpmd: support metadata as flow rule criteria
  2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 2/3] app/testpmd: " Dekel Peled
@ 2018-09-18  8:21   ` Xueming(Steven) Li
  2018-09-25 11:32     ` Dekel Peled
  0 siblings, 1 reply; 48+ messages in thread
From: Xueming(Steven) Li @ 2018-09-18  8:21 UTC (permalink / raw)
  To: Dekel Peled, wenzhuo.lu, jingjing.wu, bernard.iremonger, dev,
	olivier.matz, Adrien Mazarguil, Thomas Monjalon, ferruh.yigit,
	arybchenko
  Cc: Shahaf Shuler, Ori Kam



> -----Original Message-----
> From: dev <dev-bounces@dpdk.org> On Behalf Of Dekel Peled
> Sent: Sunday, September 16, 2018 10:38 PM
> To: wenzhuo.lu@intel.com; jingjing.wu@intel.com; bernard.iremonger@intel.com; dev@dpdk.org;
> olivier.matz@6wind.com; Adrien Mazarguil <adrien.mazarguil@6wind.com>; Thomas Monjalon
> <thomas@monjalon.net>; ferruh.yigit@intel.com; arybchenko@solarflare.com
> Cc: Shahaf Shuler <shahafs@mellanox.com>; Ori Kam <orika@mellanox.com>
> Subject: [dpdk-dev] [PATCH v2 2/3] app/testpmd: support metadata as flow rule criteria
> 
> As described in [1], this series adds option to set metadata value as match pattern when creating a
> new flow rule.
> 
> This patch introduces additional options in testpmd commands.
> New item type "meta" "data", new offload flag "match_metadata".
> 
> [1] "ethdev: support metadata as flow rule criteria"
> 
> Signed-off-by: Dekel Peled <dekelp@mellanox.com>
> ---
> V2:
> * Fix some checkpatch coding style issues (wrongly sent).
> ---
> 
>  app/test-pmd/cmdline.c                      | 14 ++++++++------
>  app/test-pmd/cmdline_flow.c                 | 25 +++++++++++++++++++++++++
>  app/test-pmd/config.c                       |  1 +
>  app/test-pmd/testpmd.c                      |  4 ++++
>  doc/guides/testpmd_app_ug/testpmd_funcs.rst |  5 ++---
>  5 files changed, 40 insertions(+), 9 deletions(-)
> 
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 589121d..4559d59 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -17403,7 +17403,8 @@ struct cmd_config_per_port_tx_offload_result {
>  			  "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
>  			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
>  			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
> -			  "mt_lockfree#multi_segs#mbuf_fast_free#security");
> +			  "mt_lockfree#multi_segs#mbuf_fast_free#security#"
> +			  "match_metadata");
>  cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_on_off =
>  	TOKEN_STRING_INITIALIZER
>  		(struct cmd_config_per_port_tx_offload_result,
> @@ -17484,8 +17485,8 @@ struct cmd_config_per_port_tx_offload_result {
>  		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
>  		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
>  		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
> -		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
> -		    "on|off",
> +		    "mt_lockfree|multi_segs|mbuf_fast_free|security|"
> +		    "match_metadata on|off",
>  	.tokens = {
>  		(void *)&cmd_config_per_port_tx_offload_result_port,
>  		(void *)&cmd_config_per_port_tx_offload_result_config,
> @@ -17535,7 +17536,8 @@ struct cmd_config_per_queue_tx_offload_result {
>  			  "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
>  			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
>  			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
> -			  "mt_lockfree#multi_segs#mbuf_fast_free#security");
> +			  "mt_lockfree#multi_segs#mbuf_fast_free#security#"
> +			  "match_metadata");
>  cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_on_off =
>  	TOKEN_STRING_INITIALIZER
>  		(struct cmd_config_per_queue_tx_offload_result,
> @@ -17588,8 +17590,8 @@ struct cmd_config_per_queue_tx_offload_result {
>  		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
>  		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
>  		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
> -		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
> -		    "on|off",
> +		    "mt_lockfree|multi_segs|mbuf_fast_free|security|"
> +		    "match_metadata on|off",
>  	.tokens = {
>  		(void *)&cmd_config_per_queue_tx_offload_result_port,
>  		(void *)&cmd_config_per_queue_tx_offload_result_port_id,
> diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index f926060..f6ca6b4 100644
> --- a/app/test-pmd/cmdline_flow.c
> +++ b/app/test-pmd/cmdline_flow.c
> @@ -178,6 +178,8 @@ enum index {
>  	ITEM_ICMP6_ND_OPT_SLA_ETH_SLA,
>  	ITEM_ICMP6_ND_OPT_TLA_ETH,
>  	ITEM_ICMP6_ND_OPT_TLA_ETH_TLA,
> +	ITEM_META,
> +	ITEM_META_DATA,
> 
>  	/* Validate/create actions. */
>  	ACTIONS,
> @@ -564,6 +566,7 @@ struct parse_action_priv {
>  	ITEM_ICMP6_ND_OPT,
>  	ITEM_ICMP6_ND_OPT_SLA_ETH,
>  	ITEM_ICMP6_ND_OPT_TLA_ETH,
> +	ITEM_META,
>  	ZERO,
>  };
> 
> @@ -784,6 +787,12 @@ struct parse_action_priv {
>  	ZERO,
>  };
> 
> +static const enum index item_meta[] = {
> +	ITEM_META_DATA,
> +	ITEM_NEXT,
> +	ZERO,
> +};
> +
>  static const enum index next_action[] = {
>  	ACTION_END,
>  	ACTION_VOID,
> @@ -1985,6 +1994,22 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,
>  		.args = ARGS(ARGS_ENTRY_HTON
>  			     (struct rte_flow_item_icmp6_nd_opt_tla_eth, tla)),
>  	},
> +	[ITEM_META] = {
> +		.name = "meta",
> +		.help = "match metadata header",
> +		.priv = PRIV_ITEM(META, sizeof(struct rte_flow_item_meta)),
> +		.next = NEXT(item_meta),
> +		.call = parse_vc,
> +	},
> +	[ITEM_META_DATA] = {
> +		.name = "data",
> +		.help = "metadata value",
> +		.next = NEXT(item_meta, NEXT_ENTRY(UNSIGNED), item_param),
> +		.args = ARGS(ARGS_ENTRY_MASK_HTON(struct rte_flow_item_meta,
> +							data,
> +							"\xff\xff\xff\xff"
> +							"\xff\xff\xff\xff")),
> +	},
> 
>  	/* Validate/create actions. */
>  	[ACTIONS] = {
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index 14ccd68..70b2cce 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -1034,6 +1034,7 @@ void print_valid_ports(void)
>  		     sizeof(struct rte_flow_item_icmp6_nd_opt_sla_eth)),
>  	MK_FLOW_ITEM(ICMP6_ND_OPT_TLA_ETH,
>  		     sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
> +	MK_FLOW_ITEM(META, sizeof(struct rte_flow_item_meta)),
>  };
> 
>  /** Pattern item specification types. */ diff --git a/app/test-pmd/testpmd.c b/app/test-
> pmd/testpmd.c index ee48db2..969eb7c 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -747,6 +747,10 @@ static void eth_dev_event_callback(char *device_name,
>  		      DEV_TX_OFFLOAD_MBUF_FAST_FREE))
>  			port->dev_conf.txmode.offloads &=
>  				~DEV_TX_OFFLOAD_MBUF_FAST_FREE;
> +		if (!(port->dev_info.tx_offload_capa &
> +			DEV_TX_OFFLOAD_MATCH_METADATA))
> +			port->dev_conf.txmode.offloads &=
> +				~DEV_TX_OFFLOAD_MATCH_METADATA;
>  		if (numa_support) {
>  			if (port_numa[pid] != NUMA_NO_CONFIG)
>  				port_per_socket[port_numa[pid]]++;
> diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> index dde205a..7d86692 100644
> --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> @@ -3511,10 +3511,9 @@ This section lists supported pattern items and their attributes, if any.
> 
>    - ``sla {MAC-48}``: source Ethernet LLA.
> 
> -- ``icmp6_nd_opt_sla_eth``: match ICMPv6 neighbor discovery target Ethernet
> -  link-layer address option.

Seems this a typo, not a duplicate, don't remove it. Should be " icmp6_nd_opt_tla_eth".

> +- ``meta``: match application specific metadata.
> 
> -  - ``tla {MAC-48}``: target Ethernet LLA.
> +  - ``data``: metadata value.
> 
>  Actions list
>  ^^^^^^^^^^^^
> --
> 1.8.3.1


^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v2 3/3] app/testpmd: add debug command Tx metadata set
  2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 3/3] app/testpmd: add debug command Tx metadata set Dekel Peled
@ 2018-09-19  5:39   ` Xueming(Steven) Li
  2018-10-05 13:19   ` Ferruh Yigit
  1 sibling, 0 replies; 48+ messages in thread
From: Xueming(Steven) Li @ 2018-09-19  5:39 UTC (permalink / raw)
  To: Dekel Peled, wenzhuo.lu, jingjing.wu, bernard.iremonger, dev,
	olivier.matz, Adrien Mazarguil, Thomas Monjalon, ferruh.yigit,
	arybchenko
  Cc: Shahaf Shuler, Ori Kam


> -----Original Message-----
> From: dev <dev-bounces@dpdk.org> On Behalf Of Dekel Peled
> Sent: Sunday, September 16, 2018 10:38 PM
> To: wenzhuo.lu@intel.com; jingjing.wu@intel.com; bernard.iremonger@intel.com; dev@dpdk.org;
> olivier.matz@6wind.com; Adrien Mazarguil <adrien.mazarguil@6wind.com>; Thomas Monjalon
> <thomas@monjalon.net>; ferruh.yigit@intel.com; arybchenko@solarflare.com
> Cc: Shahaf Shuler <shahafs@mellanox.com>; Ori Kam <orika@mellanox.com>
> Subject: [dpdk-dev] [PATCH v2 3/3] app/testpmd: add debug command Tx metadata set
> 
> As described in [1],[2] this series adds option to set metadata value as match pattern when creating
> a new flow rule.
> 
> This patch introduces code for debug porpuse only.
> The new debug command takes a 32 bit value and stores it per port.
> testpmd will add to any Tx packet sent from this port the metadata value, and set ol_flags
> accordingly.
> 
> [1] "ethdev: support metadata as flow rule criteria"
> [2] "app/testpmd: support metadata as flow rule criteria"
> 
> Signed-off-by: Dekel Peled <dekelp@mellanox.com>
> ---
> V2:
> * Fix some checkpatch coding style issues (wrongly sent).
> ---
> 
>  app/test-pmd/cmdline.c                      | 46 +++++++++++++++++++++++++++++
>  app/test-pmd/config.c                       |  6 ++++
>  app/test-pmd/testpmd.c                      |  1 +
>  app/test-pmd/testpmd.h                      |  4 +++
>  app/test-pmd/txonly.c                       |  9 ++++++
>  doc/guides/testpmd_app_ug/testpmd_funcs.rst |  7 +++++
>  6 files changed, 73 insertions(+)
> 
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 4559d59..83ed2b2 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -17604,6 +17604,51 @@ struct cmd_config_per_queue_tx_offload_result {
>  	}
>  };
> 
> +/* *** ENABLE METADATA INSERTION IN TX PACKETS SENT TO PMD *** */
> +struct cmd_tx_metadata_set_result {
> +	cmdline_fixed_string_t tx_metadata;
> +	cmdline_fixed_string_t set;
> +	portid_t port_id;
> +	uint32_t metadata;
> +};
> +
> +static void
> +cmd_tx_metadata_set_parsed(void *parsed_result,
> +		       __attribute__((unused)) struct cmdline *cl,
> +		       __attribute__((unused)) void *data) {
> +	struct cmd_tx_metadata_set_result *res = parsed_result;
> +
> +	tx_metadata_set(res->port_id, res->metadata); }
> +
> +cmdline_parse_token_string_t cmd_tx_metadata_set_tx_metadata =
> +	TOKEN_STRING_INITIALIZER(struct cmd_tx_metadata_set_result,
> +				tx_metadata, "tx_metadata");
> +cmdline_parse_token_string_t cmd_tx_metadata_set_set =
> +	TOKEN_STRING_INITIALIZER(struct cmd_tx_metadata_set_result,
> +				 set, "set");
> +cmdline_parse_token_num_t cmd_tx_metadata_set_portid =
> +	TOKEN_NUM_INITIALIZER(struct cmd_tx_metadata_set_result,
> +			      port_id, UINT16);
> +cmdline_parse_token_num_t cmd_tx_metadata_set_metadata =
> +	TOKEN_NUM_INITIALIZER(struct cmd_tx_metadata_set_result,
> +			      metadata, UINT32);
> +
> +cmdline_parse_inst_t cmd_tx_metadata_set = {
> +	.f = cmd_tx_metadata_set_parsed,
> +	.data = NULL,
> +	.help_str = "tx_metadata set <port_id> <metadata>: "
> +		    "Enable metadata insertion in packets sent to PMD",
> +	.tokens = {
> +		(void *)&cmd_tx_metadata_set_tx_metadata,
> +		(void *)&cmd_tx_metadata_set_set,
> +		(void *)&cmd_tx_metadata_set_portid,
> +		(void *)&cmd_tx_metadata_set_metadata,
> +		NULL,
> +	},
> +};
> +
>  /* ******************************************************************************** */
> 
>  /* list of instructions */
> @@ -17869,6 +17914,7 @@ struct cmd_config_per_queue_tx_offload_result {
>  	(cmdline_parse_inst_t *)&cmd_operate_bpf_ld_parse,
>  	(cmdline_parse_inst_t *)&cmd_operate_bpf_unld_parse,  #endif
> +	(cmdline_parse_inst_t *)&cmd_tx_metadata_set,
>  	NULL,
>  };
> 
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index 70b2cce..b87c691 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -3828,3 +3828,9 @@ struct igb_ring_desc_16_bytes {
> 
>  	printf("\n\n");
>  }
> +
> +void
> +tx_metadata_set(portid_t port_id, uint32_t metadata) {
> +	ports[port_id].metadata = metadata;
> +}
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 969eb7c..cd6823d 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -776,6 +776,7 @@ static void eth_dev_event_callback(char *device_name,
>  		/* set flag to initialize port/queue */
>  		port->need_reconfig = 1;
>  		port->need_reconfig_queues = 1;
> +		port->metadata = 0;
>  	}
> 
>  	/*
> diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index a1f6614..54c7e95 100644
> --- a/app/test-pmd/testpmd.h
> +++ b/app/test-pmd/testpmd.h
> @@ -183,6 +183,8 @@ struct rte_port {
>  #ifdef SOFTNIC
>  	struct softnic_port     softport;  /**< softnic params */
>  #endif
> +	/* metadata value to add in tx packets (debug only) */
> +	uint32_t                metadata;
>  };
> 
>  /**
> @@ -743,6 +745,8 @@ enum print_warning {  queueid_t get_allowed_max_nb_txq(portid_t *pid);  int
> check_nb_txq(queueid_t txq);
> 
> +void tx_metadata_set(portid_t port_id, uint32_t metadata);
> +
>  /*
>   * Work-around of a compilation error with ICC on invocations of the
>   * rte_be_to_cpu_16() function.
> diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c index 1f08b6e..b5a4b35 100644
> --- a/app/test-pmd/txonly.c
> +++ b/app/test-pmd/txonly.c
> @@ -253,6 +253,15 @@
>  		pkt->l2_len = sizeof(struct ether_hdr);
>  		pkt->l3_len = sizeof(struct ipv4_hdr);
>  		pkts_burst[nb_pkt] = pkt;
> +
> +		/*
> +		 * If user configured metadata value add it to packet
> +		 * and set ol_flags accordingly
> +		 */
> +		if (ports[fs->tx_port].metadata) {
> +			pkt->hash.fdir.hi = ports[fs->tx_port].metadata;
> +			pkt->ol_flags |= PKT_TX_METADATA;
> +		}
>  	}
>  	nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_pkt);
>  	/*
> diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> index 7d86692..3688e1c 100644
> --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> @@ -851,6 +851,13 @@ Disable hardware insertion of a VLAN header in packets sent on a port::
> 
>     testpmd> tx_vlan reset (port_id)
> 
> +tx_metadata set
> +~~~~~~~~~~~~~~~
> +
> +Set metadata value to insert in packets sent to PMD::
> +
> +   testpmd> tx_metadata set (port_id) (value)
> +
>  csum set
>  ~~~~~~~~
> 
> --
> 1.8.3.1

Acked-by: Xueming Li <xuemingl@mellanox.com>

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v2 2/3] app/testpmd: support metadata as flow rule criteria
  2018-09-18  8:21   ` Xueming(Steven) Li
@ 2018-09-25 11:32     ` Dekel Peled
  0 siblings, 0 replies; 48+ messages in thread
From: Dekel Peled @ 2018-09-25 11:32 UTC (permalink / raw)
  To: Xueming(Steven) Li, wenzhuo.lu, jingjing.wu, bernard.iremonger,
	dev, olivier.matz, Adrien Mazarguil, Thomas Monjalon,
	ferruh.yigit, arybchenko
  Cc: Shahaf Shuler, Ori Kam



> -----Original Message-----
> From: Xueming(Steven) Li
> Sent: Tuesday, September 18, 2018 11:22 AM
> To: Dekel Peled <dekelp@mellanox.com>; wenzhuo.lu@intel.com;
> jingjing.wu@intel.com; bernard.iremonger@intel.com; dev@dpdk.org;
> olivier.matz@6wind.com; Adrien Mazarguil <adrien.mazarguil@6wind.com>;
> Thomas Monjalon <thomas@monjalon.net>; ferruh.yigit@intel.com;
> arybchenko@solarflare.com
> Cc: Shahaf Shuler <shahafs@mellanox.com>; Ori Kam
> <orika@mellanox.com>
> Subject: RE: [dpdk-dev] [PATCH v2 2/3] app/testpmd: support metadata as
> flow rule criteria
> 
> 
> 
> > -----Original Message-----
> > From: dev <dev-bounces@dpdk.org> On Behalf Of Dekel Peled
> > Sent: Sunday, September 16, 2018 10:38 PM
> > To: wenzhuo.lu@intel.com; jingjing.wu@intel.com;
> > bernard.iremonger@intel.com; dev@dpdk.org; olivier.matz@6wind.com;
> > Adrien Mazarguil <adrien.mazarguil@6wind.com>; Thomas Monjalon
> > <thomas@monjalon.net>; ferruh.yigit@intel.com;
> > arybchenko@solarflare.com
> > Cc: Shahaf Shuler <shahafs@mellanox.com>; Ori Kam
> <orika@mellanox.com>
> > Subject: [dpdk-dev] [PATCH v2 2/3] app/testpmd: support metadata as
> > flow rule criteria
> >
> > As described in [1], this series adds option to set metadata value as
> > match pattern when creating a new flow rule.
> >
> > This patch introduces additional options in testpmd commands.
> > New item type "meta" "data", new offload flag "match_metadata".
> >
> > [1] "ethdev: support metadata as flow rule criteria"
> >
> > Signed-off-by: Dekel Peled <dekelp@mellanox.com>
> > ---
> > V2:
> > * Fix some checkpatch coding style issues (wrongly sent).
> > ---
> >
> >  app/test-pmd/cmdline.c                      | 14 ++++++++------
> >  app/test-pmd/cmdline_flow.c                 | 25
> +++++++++++++++++++++++++
> >  app/test-pmd/config.c                       |  1 +
> >  app/test-pmd/testpmd.c                      |  4 ++++
> >  doc/guides/testpmd_app_ug/testpmd_funcs.rst |  5 ++---
> >  5 files changed, 40 insertions(+), 9 deletions(-)
> >
> > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
> > 589121d..4559d59 100644
> > --- a/app/test-pmd/cmdline.c
> > +++ b/app/test-pmd/cmdline.c
> > @@ -17403,7 +17403,8 @@ struct cmd_config_per_port_tx_offload_result
> {
> >
> "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
> >  			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
> >  			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
> > -
> "mt_lockfree#multi_segs#mbuf_fast_free#security");
> > +
> "mt_lockfree#multi_segs#mbuf_fast_free#security#"
> > +			  "match_metadata");
> >  cmdline_parse_token_string_t
> cmd_config_per_port_tx_offload_result_on_off =
> >  	TOKEN_STRING_INITIALIZER
> >  		(struct cmd_config_per_port_tx_offload_result,
> > @@ -17484,8 +17485,8 @@ struct cmd_config_per_port_tx_offload_result
> {
> >  		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
> >  		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
> >  		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
> > -		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
> > -		    "on|off",
> > +		    "mt_lockfree|multi_segs|mbuf_fast_free|security|"
> > +		    "match_metadata on|off",
> >  	.tokens = {
> >  		(void *)&cmd_config_per_port_tx_offload_result_port,
> >  		(void *)&cmd_config_per_port_tx_offload_result_config,
> > @@ -17535,7 +17536,8 @@ struct
> cmd_config_per_queue_tx_offload_result {
> >
> "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
> >  			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
> >  			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
> > -
> "mt_lockfree#multi_segs#mbuf_fast_free#security");
> > +
> "mt_lockfree#multi_segs#mbuf_fast_free#security#"
> > +			  "match_metadata");
> >  cmdline_parse_token_string_t
> cmd_config_per_queue_tx_offload_result_on_off =
> >  	TOKEN_STRING_INITIALIZER
> >  		(struct cmd_config_per_queue_tx_offload_result,
> > @@ -17588,8 +17590,8 @@ struct
> cmd_config_per_queue_tx_offload_result {
> >  		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
> >  		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
> >  		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
> > -		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
> > -		    "on|off",
> > +		    "mt_lockfree|multi_segs|mbuf_fast_free|security|"
> > +		    "match_metadata on|off",
> >  	.tokens = {
> >  		(void *)&cmd_config_per_queue_tx_offload_result_port,
> >  		(void
> *)&cmd_config_per_queue_tx_offload_result_port_id,
> > diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
> > index f926060..f6ca6b4 100644
> > --- a/app/test-pmd/cmdline_flow.c
> > +++ b/app/test-pmd/cmdline_flow.c
> > @@ -178,6 +178,8 @@ enum index {
> >  	ITEM_ICMP6_ND_OPT_SLA_ETH_SLA,
> >  	ITEM_ICMP6_ND_OPT_TLA_ETH,
> >  	ITEM_ICMP6_ND_OPT_TLA_ETH_TLA,
> > +	ITEM_META,
> > +	ITEM_META_DATA,
> >
> >  	/* Validate/create actions. */
> >  	ACTIONS,
> > @@ -564,6 +566,7 @@ struct parse_action_priv {
> >  	ITEM_ICMP6_ND_OPT,
> >  	ITEM_ICMP6_ND_OPT_SLA_ETH,
> >  	ITEM_ICMP6_ND_OPT_TLA_ETH,
> > +	ITEM_META,
> >  	ZERO,
> >  };
> >
> > @@ -784,6 +787,12 @@ struct parse_action_priv {
> >  	ZERO,
> >  };
> >
> > +static const enum index item_meta[] = {
> > +	ITEM_META_DATA,
> > +	ITEM_NEXT,
> > +	ZERO,
> > +};
> > +
> >  static const enum index next_action[] = {
> >  	ACTION_END,
> >  	ACTION_VOID,
> > @@ -1985,6 +1994,22 @@ static int comp_vc_action_rss_queue(struct
> context *, const struct token *,
> >  		.args = ARGS(ARGS_ENTRY_HTON
> >  			     (struct rte_flow_item_icmp6_nd_opt_tla_eth,
> tla)),
> >  	},
> > +	[ITEM_META] = {
> > +		.name = "meta",
> > +		.help = "match metadata header",
> > +		.priv = PRIV_ITEM(META, sizeof(struct
> rte_flow_item_meta)),
> > +		.next = NEXT(item_meta),
> > +		.call = parse_vc,
> > +	},
> > +	[ITEM_META_DATA] = {
> > +		.name = "data",
> > +		.help = "metadata value",
> > +		.next = NEXT(item_meta, NEXT_ENTRY(UNSIGNED),
> item_param),
> > +		.args = ARGS(ARGS_ENTRY_MASK_HTON(struct
> rte_flow_item_meta,
> > +							data,
> > +							"\xff\xff\xff\xff"
> > +							"\xff\xff\xff\xff")),
> > +	},
> >
> >  	/* Validate/create actions. */
> >  	[ACTIONS] = {
> > diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index
> > 14ccd68..70b2cce 100644
> > --- a/app/test-pmd/config.c
> > +++ b/app/test-pmd/config.c
> > @@ -1034,6 +1034,7 @@ void print_valid_ports(void)
> >  		     sizeof(struct rte_flow_item_icmp6_nd_opt_sla_eth)),
> >  	MK_FLOW_ITEM(ICMP6_ND_OPT_TLA_ETH,
> >  		     sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
> > +	MK_FLOW_ITEM(META, sizeof(struct rte_flow_item_meta)),
> >  };
> >
> >  /** Pattern item specification types. */ diff --git
> > a/app/test-pmd/testpmd.c b/app/test- pmd/testpmd.c index
> > ee48db2..969eb7c 100644
> > --- a/app/test-pmd/testpmd.c
> > +++ b/app/test-pmd/testpmd.c
> > @@ -747,6 +747,10 @@ static void eth_dev_event_callback(char
> *device_name,
> >  		      DEV_TX_OFFLOAD_MBUF_FAST_FREE))
> >  			port->dev_conf.txmode.offloads &=
> >  				~DEV_TX_OFFLOAD_MBUF_FAST_FREE;
> > +		if (!(port->dev_info.tx_offload_capa &
> > +			DEV_TX_OFFLOAD_MATCH_METADATA))
> > +			port->dev_conf.txmode.offloads &=
> > +				~DEV_TX_OFFLOAD_MATCH_METADATA;
> >  		if (numa_support) {
> >  			if (port_numa[pid] != NUMA_NO_CONFIG)
> >  				port_per_socket[port_numa[pid]]++;
> > diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> > b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> > index dde205a..7d86692 100644
> > --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> > +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> > @@ -3511,10 +3511,9 @@ This section lists supported pattern items and
> their attributes, if any.
> >
> >    - ``sla {MAC-48}``: source Ethernet LLA.
> >
> > -- ``icmp6_nd_opt_sla_eth``: match ICMPv6 neighbor discovery target
> > Ethernet
> > -  link-layer address option.
> 
> Seems this a typo, not a duplicate, don't remove it. Should be "
> icmp6_nd_opt_tla_eth".
> 

Fixed, thanks.

> > +- ``meta``: match application specific metadata.
> >
> > -  - ``tla {MAC-48}``: target Ethernet LLA.
> > +  - ``data``: metadata value.
> >
> >  Actions list
> >  ^^^^^^^^^^^^
> > --
> > 1.8.3.1


^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v3 0/3] support meadata as flow rule criteria
  2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 0/3] *** SUBJECT HERE *** Dekel Peled
@ 2018-09-27 13:57   ` Dekel Peled
  2018-10-03 20:46     ` Thomas Monjalon
                       ` (4 more replies)
  2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
                     ` (2 subsequent siblings)
  3 siblings, 5 replies; 48+ messages in thread
From: Dekel Peled @ 2018-09-27 13:57 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, dev, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, orika

This series implements the match-metadata feature described in [1].

[1] "[RFC v2] ethdev: support metadata as flow rule criteria"
    http://mails.dpdk.org/archives/dev/2018-August/110194.html

V3:
* Add link to RFC email.
* Add cover letter subject line.

V2:
* Fix some checkpatch coding style issues (wrongly sent).

Dekel Peled (3):
  ethdev: support metadata as flow rule criteria
  app/testpmd: support metadata as flow rule criteria
  app/testpmd: add debug command Tx metadata set

 app/test-pmd/cmdline.c                      | 60 ++++++++++++++++++++++++++---
 app/test-pmd/cmdline_flow.c                 | 25 ++++++++++++
 app/test-pmd/config.c                       |  7 ++++
 app/test-pmd/testpmd.c                      |  5 +++
 app/test-pmd/testpmd.h                      |  4 ++
 app/test-pmd/txonly.c                       |  9 +++++
 doc/guides/prog_guide/rte_flow.rst          | 21 ++++++++++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst | 13 ++++++-
 lib/librte_ethdev/rte_ethdev.c              |  1 +
 lib/librte_ethdev/rte_ethdev.h              |  5 +++
 lib/librte_ethdev/rte_flow.c                |  1 +
 lib/librte_ethdev/rte_flow.h                | 24 ++++++++++++
 lib/librte_mbuf/rte_mbuf.c                  |  2 +
 lib/librte_mbuf/rte_mbuf.h                  | 16 +++++++-
 14 files changed, 184 insertions(+), 9 deletions(-)

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v3 1/3] ethdev: support metadata as flow rule criteria
  2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 0/3] *** SUBJECT HERE *** Dekel Peled
  2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 0/3] support meadata as flow rule criteria Dekel Peled
@ 2018-09-27 13:57   ` Dekel Peled
  2018-10-05 13:31     ` Ferruh Yigit
  2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 2/3] app/testpmd: " Dekel Peled
  2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 3/3] app/testpmd: add debug command Tx metadata set Dekel Peled
  3 siblings, 1 reply; 48+ messages in thread
From: Dekel Peled @ 2018-09-27 13:57 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, dev, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, orika

As described in [1], a new rte_flow item is added to support metadata
to use as flow rule match pattern.
The metadata is an opaque item, fully controlled by the application.

The use of metadata is relevant for egress rules only.
It can be set in the flow rule using the RTE_FLOW_ITEM_META.

In order to avoid change in mbuf API, exisitng field buf.hash.fdir.hi
is used to carry the metadata item. This field is used only in
ingress packets, so using it for egress metadata will not cause
conflicts.

Application should set the packet metadata in the mbuf dedicated field,
and set the PKT_TX_METADATA flag in the mbuf->ol_flags.
The NIC will use the packet metadata as match criteria for relevant
flow rules.

This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,
along with corresponding struct rte_flow_item_meta and ol_flag
PKT_TX_METADATA.

[1] "[RFC,v2] ethdev: support metadata as flow rule criteria"
    http://mails.dpdk.org/archives/dev/2018-August/110194.html

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
 doc/guides/prog_guide/rte_flow.rst | 21 +++++++++++++++++++++
 lib/librte_ethdev/rte_ethdev.c     |  1 +
 lib/librte_ethdev/rte_ethdev.h     |  5 +++++
 lib/librte_ethdev/rte_flow.c       |  1 +
 lib/librte_ethdev/rte_flow.h       | 24 ++++++++++++++++++++++++
 lib/librte_mbuf/rte_mbuf.c         |  2 ++
 lib/librte_mbuf/rte_mbuf.h         | 16 ++++++++++++++--
 7 files changed, 68 insertions(+), 2 deletions(-)

diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
index b600b2d..8643722 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -1191,6 +1191,27 @@ Normally preceded by any of:
 - `Item: ICMP6_ND_NS`_
 - `Item: ICMP6_ND_OPT`_
 
+Item: ``META``
+^^^^^^^^^^^^^^
+
+Matches an application specific 32 bit metadata item.
+
+- Default ``mask`` matches any 32 bit value.
+
+.. _table_rte_flow_item_meta:
+
+.. table:: META
+
+   +----------+----------+---------------------------+
+   | Field    | Subfield | Value                     |
+   +==========+==========+===========================+
+   | ``spec`` | ``data`` | 32 bit metadata value     |
+   +----------+--------------------------------------+
+   | ``last`` | ``data`` | upper range value         |
+   +----------+----------+---------------------------+
+   | ``mask`` | ``data`` | zeroed to match any value |
+   +----------+----------+---------------------------+
+
 Actions
 ~~~~~~~
 
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index aa7730c..aa77439 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -157,6 +157,7 @@ struct rte_eth_xstats_name_off {
 	RTE_TX_OFFLOAD_BIT2STR(SECURITY),
 	RTE_TX_OFFLOAD_BIT2STR(UDP_TNL_TSO),
 	RTE_TX_OFFLOAD_BIT2STR(IP_TNL_TSO),
+	RTE_TX_OFFLOAD_BIT2STR(MATCH_METADATA),
 };
 
 #undef RTE_TX_OFFLOAD_BIT2STR
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index 44b4fb3..a6ca82f 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -948,6 +948,11 @@ struct rte_eth_conf {
  * for tunnel TSO.
  */
 #define DEV_TX_OFFLOAD_IP_TNL_TSO       0x00080000
+/**
+ * Device supports match on metadata Tx offload..
+ * Application must set PKT_TX_METADATA and mbuf metadata field.
+ */
+#define DEV_TX_OFFLOAD_MATCH_METADATA   0x00100000
 
 #define RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP 0x00000001
 /**< Device supports Rx queue setup after device started*/
diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c
index cff4b52..54e5ef8 100644
--- a/lib/librte_ethdev/rte_flow.c
+++ b/lib/librte_ethdev/rte_flow.c
@@ -66,6 +66,7 @@ struct rte_flow_desc_data {
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_sla_eth)),
 	MK_FLOW_ITEM(ICMP6_ND_OPT_TLA_ETH,
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
+	MK_FLOW_ITEM(META, sizeof(struct rte_flow_item_meta)),
 };
 
 /** Generate flow_action[] entry. */
diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
index 0656e5e..83aa9f4 100644
--- a/lib/librte_ethdev/rte_flow.h
+++ b/lib/librte_ethdev/rte_flow.h
@@ -413,6 +413,14 @@ enum rte_flow_item_type {
 	 * See struct rte_flow_item_mark.
 	 */
 	RTE_FLOW_ITEM_TYPE_MARK,
+
+	/**
+	 * [META]
+	 *
+	 * Matches a metadata value specified in mbuf metadata field.
+	 * See struct rte_flow_item_meta.
+	 */
+	RTE_FLOW_ITEM_TYPE_META,
 };
 
 /**
@@ -1156,6 +1164,22 @@ struct rte_flow_item_icmp6_nd_opt_tla_eth {
 #endif
 
 /**
+ * RTE_FLOW_ITEM_TYPE_META.
+ *
+ * Matches a specified metadata value.
+ */
+struct rte_flow_item_meta {
+	uint32_t data;
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_META. */
+#ifndef __cplusplus
+static const struct rte_flow_item_meta rte_flow_item_meta_mask = {
+	.data = RTE_BE32(UINT32_MAX),
+};
+#endif
+
+/**
  * @warning
  * @b EXPERIMENTAL: this structure may change without prior notice
  *
diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
index e714c5a..4b25ae8 100644
--- a/lib/librte_mbuf/rte_mbuf.c
+++ b/lib/librte_mbuf/rte_mbuf.c
@@ -395,6 +395,7 @@ const char *rte_get_tx_ol_flag_name(uint64_t mask)
 	case PKT_TX_TUNNEL_UDP: return "PKT_TX_TUNNEL_UDP";
 	case PKT_TX_MACSEC: return "PKT_TX_MACSEC";
 	case PKT_TX_SEC_OFFLOAD: return "PKT_TX_SEC_OFFLOAD";
+	case PKT_TX_METADATA: return "PKT_TX_METADATA";
 	default: return NULL;
 	}
 }
@@ -435,6 +436,7 @@ const char *rte_get_tx_ol_flag_name(uint64_t mask)
 		  "PKT_TX_TUNNEL_NONE" },
 		{ PKT_TX_MACSEC, PKT_TX_MACSEC, NULL },
 		{ PKT_TX_SEC_OFFLOAD, PKT_TX_SEC_OFFLOAD, NULL },
+		{ PKT_TX_METADATA, PKT_TX_METADATA, NULL },
 	};
 	const char *name;
 	unsigned int i;
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index 9ce5d76..ea75ad0 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -182,6 +182,11 @@
 /* add new TX flags here */
 
 /**
+ * Indicate that the metadata field in the mbuf is in use.
+ */
+#define PKT_TX_METADATA	(1ULL << 41)
+
+/**
  * UDP Fragmentation Offload flag. This flag is used for enabling UDP
  * fragmentation in SW or in HW. When use UFO, mbuf->tso_segsz is used
  * to store the MSS of UDP fragments.
@@ -342,8 +347,9 @@
 		PKT_TX_QINQ_PKT |        \
 		PKT_TX_VLAN_PKT |        \
 		PKT_TX_TUNNEL_MASK |	 \
-		PKT_TX_MACSEC |		 \
-		PKT_TX_SEC_OFFLOAD)
+		PKT_TX_MACSEC |          \
+		PKT_TX_SEC_OFFLOAD |	 \
+		PKT_TX_METADATA)
 
 /**
  * Mbuf having an external buffer attached. shinfo in mbuf must be filled.
@@ -526,6 +532,12 @@ struct rte_mbuf {
 			uint32_t hi;
 			/**< First 4 flexible bytes or FD ID, dependent on
 			     PKT_RX_FDIR_* flag in ol_flags. */
+			/**
+			 * Above member has optional use on egress:
+			 * Application specific metadata value
+			 * for flow rule match.
+			 * Valid if PKT_TX_METADATA is set.
+			 */
 		} fdir;           /**< Filter identifier if FDIR enabled */
 		struct {
 			uint32_t lo;
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v3 2/3] app/testpmd: support metadata as flow rule criteria
  2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 0/3] *** SUBJECT HERE *** Dekel Peled
  2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 0/3] support meadata as flow rule criteria Dekel Peled
  2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
@ 2018-09-27 13:57   ` Dekel Peled
  2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 3/3] app/testpmd: add debug command Tx metadata set Dekel Peled
  3 siblings, 0 replies; 48+ messages in thread
From: Dekel Peled @ 2018-09-27 13:57 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, dev, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, orika

As described in [1], this series adds option to set metadata value as
match pattern when creating a new flow rule.

This patch introduces additional options in testpmd commands.
New item type "meta" "data", new offload flag "match_metadata".

[1] "ethdev: support metadata as flow rule criteria"

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
 app/test-pmd/cmdline.c                      | 14 ++++++++------
 app/test-pmd/cmdline_flow.c                 | 25 +++++++++++++++++++++++++
 app/test-pmd/config.c                       |  1 +
 app/test-pmd/testpmd.c                      |  4 ++++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  6 +++++-
 5 files changed, 43 insertions(+), 7 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 0cbd340..8cfde40 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -17401,7 +17401,8 @@ struct cmd_config_per_port_tx_offload_result {
 			  "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
 			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
 			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
-			  "mt_lockfree#multi_segs#mbuf_fast_free#security");
+			  "mt_lockfree#multi_segs#mbuf_fast_free#security#"
+			  "match_metadata");
 cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_on_off =
 	TOKEN_STRING_INITIALIZER
 		(struct cmd_config_per_port_tx_offload_result,
@@ -17482,8 +17483,8 @@ struct cmd_config_per_port_tx_offload_result {
 		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
 		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
 		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
-		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
-		    "on|off",
+		    "mt_lockfree|multi_segs|mbuf_fast_free|security|"
+		    "match_metadata on|off",
 	.tokens = {
 		(void *)&cmd_config_per_port_tx_offload_result_port,
 		(void *)&cmd_config_per_port_tx_offload_result_config,
@@ -17533,7 +17534,8 @@ struct cmd_config_per_queue_tx_offload_result {
 			  "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
 			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
 			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
-			  "mt_lockfree#multi_segs#mbuf_fast_free#security");
+			  "mt_lockfree#multi_segs#mbuf_fast_free#security#"
+			  "match_metadata");
 cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_on_off =
 	TOKEN_STRING_INITIALIZER
 		(struct cmd_config_per_queue_tx_offload_result,
@@ -17586,8 +17588,8 @@ struct cmd_config_per_queue_tx_offload_result {
 		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
 		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
 		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
-		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
-		    "on|off",
+		    "mt_lockfree|multi_segs|mbuf_fast_free|security|"
+		    "match_metadata on|off",
 	.tokens = {
 		(void *)&cmd_config_per_queue_tx_offload_result_port,
 		(void *)&cmd_config_per_queue_tx_offload_result_port_id,
diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index 349e822..8f997e4 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -178,6 +178,8 @@ enum index {
 	ITEM_ICMP6_ND_OPT_SLA_ETH_SLA,
 	ITEM_ICMP6_ND_OPT_TLA_ETH,
 	ITEM_ICMP6_ND_OPT_TLA_ETH_TLA,
+	ITEM_META,
+	ITEM_META_DATA,
 
 	/* Validate/create actions. */
 	ACTIONS,
@@ -540,6 +542,7 @@ struct parse_action_priv {
 	ITEM_ICMP6_ND_OPT,
 	ITEM_ICMP6_ND_OPT_SLA_ETH,
 	ITEM_ICMP6_ND_OPT_TLA_ETH,
+	ITEM_META,
 	ZERO,
 };
 
@@ -760,6 +763,12 @@ struct parse_action_priv {
 	ZERO,
 };
 
+static const enum index item_meta[] = {
+	ITEM_META_DATA,
+	ITEM_NEXT,
+	ZERO,
+};
+
 static const enum index next_action[] = {
 	ACTION_END,
 	ACTION_VOID,
@@ -1961,6 +1970,22 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,
 		.args = ARGS(ARGS_ENTRY_HTON
 			     (struct rte_flow_item_icmp6_nd_opt_tla_eth, tla)),
 	},
+	[ITEM_META] = {
+		.name = "meta",
+		.help = "match metadata header",
+		.priv = PRIV_ITEM(META, sizeof(struct rte_flow_item_meta)),
+		.next = NEXT(item_meta),
+		.call = parse_vc,
+	},
+	[ITEM_META_DATA] = {
+		.name = "data",
+		.help = "metadata value",
+		.next = NEXT(item_meta, NEXT_ENTRY(UNSIGNED), item_param),
+		.args = ARGS(ARGS_ENTRY_MASK_HTON(struct rte_flow_item_meta,
+							data,
+							"\xff\xff\xff\xff"
+							"\xff\xff\xff\xff")),
+	},
 
 	/* Validate/create actions. */
 	[ACTIONS] = {
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 7d384d9..274c392 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -1043,6 +1043,7 @@ void print_valid_ports(void)
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_sla_eth)),
 	MK_FLOW_ITEM(ICMP6_ND_OPT_TLA_ETH,
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
+	MK_FLOW_ITEM(META, sizeof(struct rte_flow_item_meta)),
 };
 
 /** Pattern item specification types. */
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 571ecb4..268a80c 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -742,6 +742,10 @@ static void eth_dev_event_callback(char *device_name,
 		      DEV_TX_OFFLOAD_MBUF_FAST_FREE))
 			port->dev_conf.txmode.offloads &=
 				~DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+		if (!(port->dev_info.tx_offload_capa &
+			DEV_TX_OFFLOAD_MATCH_METADATA))
+			port->dev_conf.txmode.offloads &=
+				~DEV_TX_OFFLOAD_MATCH_METADATA;
 		if (numa_support) {
 			if (port_numa[pid] != NUMA_NO_CONFIG)
 				port_per_socket[port_numa[pid]]++;
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index dde205a..853ab83 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -3511,11 +3511,15 @@ This section lists supported pattern items and their attributes, if any.
 
   - ``sla {MAC-48}``: source Ethernet LLA.
 
-- ``icmp6_nd_opt_sla_eth``: match ICMPv6 neighbor discovery target Ethernet
+- ``icmp6_nd_opt_tla_eth``: match ICMPv6 neighbor discovery target Ethernet
   link-layer address option.
 
   - ``tla {MAC-48}``: target Ethernet LLA.
 
+- ``meta``: match application specific metadata.
+
+  - ``data``: metadata value.
+
 Actions list
 ^^^^^^^^^^^^
 
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v3 3/3] app/testpmd: add debug command Tx metadata set
  2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 0/3] *** SUBJECT HERE *** Dekel Peled
                     ` (2 preceding siblings ...)
  2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 2/3] app/testpmd: " Dekel Peled
@ 2018-09-27 13:57   ` Dekel Peled
  2018-10-05 13:27     ` Ferruh Yigit
  3 siblings, 1 reply; 48+ messages in thread
From: Dekel Peled @ 2018-09-27 13:57 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, dev, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, orika

As described in [1],[2] this series adds option to set metadata value as
match pattern when creating a new flow rule.

This patch introduces code for debug porpuse only.
The new debug command takes a 32 bit value and stores it per port.
testpmd will add to any Tx packet sent from this port the metadata
value, and set ol_flags accordingly.

[1] "ethdev: support metadata as flow rule criteria"
[2] "app/testpmd: support metadata as flow rule criteria"

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
 app/test-pmd/cmdline.c                      | 46 +++++++++++++++++++++++++++++
 app/test-pmd/config.c                       |  6 ++++
 app/test-pmd/testpmd.c                      |  1 +
 app/test-pmd/testpmd.h                      |  4 +++
 app/test-pmd/txonly.c                       |  9 ++++++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  7 +++++
 6 files changed, 73 insertions(+)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 8cfde40..0f0e3ee 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -17602,6 +17602,51 @@ struct cmd_config_per_queue_tx_offload_result {
 	}
 };
 
+/* *** ENABLE METADATA INSERTION IN TX PACKETS SENT TO PMD *** */
+struct cmd_tx_metadata_set_result {
+	cmdline_fixed_string_t tx_metadata;
+	cmdline_fixed_string_t set;
+	portid_t port_id;
+	uint32_t metadata;
+};
+
+static void
+cmd_tx_metadata_set_parsed(void *parsed_result,
+		       __attribute__((unused)) struct cmdline *cl,
+		       __attribute__((unused)) void *data)
+{
+	struct cmd_tx_metadata_set_result *res = parsed_result;
+
+	tx_metadata_set(res->port_id, res->metadata);
+}
+
+cmdline_parse_token_string_t cmd_tx_metadata_set_tx_metadata =
+	TOKEN_STRING_INITIALIZER(struct cmd_tx_metadata_set_result,
+				tx_metadata, "tx_metadata");
+cmdline_parse_token_string_t cmd_tx_metadata_set_set =
+	TOKEN_STRING_INITIALIZER(struct cmd_tx_metadata_set_result,
+				 set, "set");
+cmdline_parse_token_num_t cmd_tx_metadata_set_portid =
+	TOKEN_NUM_INITIALIZER(struct cmd_tx_metadata_set_result,
+			      port_id, UINT16);
+cmdline_parse_token_num_t cmd_tx_metadata_set_metadata =
+	TOKEN_NUM_INITIALIZER(struct cmd_tx_metadata_set_result,
+			      metadata, UINT32);
+
+cmdline_parse_inst_t cmd_tx_metadata_set = {
+	.f = cmd_tx_metadata_set_parsed,
+	.data = NULL,
+	.help_str = "tx_metadata set <port_id> <metadata>: "
+		    "Enable metadata insertion in packets sent to PMD",
+	.tokens = {
+		(void *)&cmd_tx_metadata_set_tx_metadata,
+		(void *)&cmd_tx_metadata_set_set,
+		(void *)&cmd_tx_metadata_set_portid,
+		(void *)&cmd_tx_metadata_set_metadata,
+		NULL,
+	},
+};
+
 /* ******************************************************************************** */
 
 /* list of instructions */
@@ -17867,6 +17912,7 @@ struct cmd_config_per_queue_tx_offload_result {
 	(cmdline_parse_inst_t *)&cmd_operate_bpf_ld_parse,
 	(cmdline_parse_inst_t *)&cmd_operate_bpf_unld_parse,
 #endif
+	(cmdline_parse_inst_t *)&cmd_tx_metadata_set,
 	NULL,
 };
 
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 274c392..7aa40d6 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -3845,3 +3845,9 @@ struct igb_ring_desc_16_bytes {
 
 	printf("\n\n");
 }
+
+void
+tx_metadata_set(portid_t port_id, uint32_t metadata)
+{
+	ports[port_id].metadata = metadata;
+}
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 268a80c..caf26be 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -771,6 +771,7 @@ static void eth_dev_event_callback(char *device_name,
 		/* set flag to initialize port/queue */
 		port->need_reconfig = 1;
 		port->need_reconfig_queues = 1;
+		port->metadata = 0;
 	}
 
 	/*
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index a1f6614..54c7e95 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -183,6 +183,8 @@ struct rte_port {
 #ifdef SOFTNIC
 	struct softnic_port     softport;  /**< softnic params */
 #endif
+	/* metadata value to add in tx packets (debug only) */
+	uint32_t                metadata;
 };
 
 /**
@@ -743,6 +745,8 @@ enum print_warning {
 queueid_t get_allowed_max_nb_txq(portid_t *pid);
 int check_nb_txq(queueid_t txq);
 
+void tx_metadata_set(portid_t port_id, uint32_t metadata);
+
 /*
  * Work-around of a compilation error with ICC on invocations of the
  * rte_be_to_cpu_16() function.
diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
index 1f08b6e..b5a4b35 100644
--- a/app/test-pmd/txonly.c
+++ b/app/test-pmd/txonly.c
@@ -253,6 +253,15 @@
 		pkt->l2_len = sizeof(struct ether_hdr);
 		pkt->l3_len = sizeof(struct ipv4_hdr);
 		pkts_burst[nb_pkt] = pkt;
+
+		/*
+		 * If user configured metadata value add it to packet
+		 * and set ol_flags accordingly
+		 */
+		if (ports[fs->tx_port].metadata) {
+			pkt->hash.fdir.hi = ports[fs->tx_port].metadata;
+			pkt->ol_flags |= PKT_TX_METADATA;
+		}
 	}
 	nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_pkt);
 	/*
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 853ab83..dd843a5 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -851,6 +851,13 @@ Disable hardware insertion of a VLAN header in packets sent on a port::
 
    testpmd> tx_vlan reset (port_id)
 
+tx_metadata set
+~~~~~~~~~~~~~~~
+
+Set metadata value to insert in packets sent to PMD::
+
+   testpmd> tx_metadata set (port_id) (value)
+
 csum set
 ~~~~~~~~
 
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v3 0/3] support meadata as flow rule criteria
  2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 0/3] support meadata as flow rule criteria Dekel Peled
@ 2018-10-03 20:46     ` Thomas Monjalon
  2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 " Dekel Peled
                       ` (3 subsequent siblings)
  4 siblings, 0 replies; 48+ messages in thread
From: Thomas Monjalon @ 2018-10-03 20:46 UTC (permalink / raw)
  To: dev
  Cc: Dekel Peled, wenzhuo.lu, jingjing.wu, bernard.iremonger,
	olivier.matz, adrien.mazarguil, ferruh.yigit, arybchenko,
	shahafs, orika

27/09/2018 15:57, Dekel Peled:
> Dekel Peled (3):
>   ethdev: support metadata as flow rule criteria
>   app/testpmd: support metadata as flow rule criteria
>   app/testpmd: add debug command Tx metadata set

Anyone to review this series, please?

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v2 3/3] app/testpmd: add debug command Tx metadata set
  2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 3/3] app/testpmd: add debug command Tx metadata set Dekel Peled
  2018-09-19  5:39   ` Xueming(Steven) Li
@ 2018-10-05 13:19   ` Ferruh Yigit
  2018-10-09 14:30     ` Dekel Peled
  1 sibling, 1 reply; 48+ messages in thread
From: Ferruh Yigit @ 2018-10-05 13:19 UTC (permalink / raw)
  To: Dekel Peled, wenzhuo.lu, jingjing.wu, bernard.iremonger, dev,
	olivier.matz, adrien.mazarguil, thomas, arybchenko
  Cc: shahafs, orika

On 9/16/2018 3:37 PM, Dekel Peled wrote:
> As described in [1],[2] this series adds option to set metadata value as
> match pattern when creating a new flow rule.
> 
> This patch introduces code for debug porpuse only.
> The new debug command takes a 32 bit value and stores it per port.
> testpmd will add to any Tx packet sent from this port the metadata
> value, and set ol_flags accordingly.
> 
> [1] "ethdev: support metadata as flow rule criteria"
> [2] "app/testpmd: support metadata as flow rule criteria"
> 
> Signed-off-by: Dekel Peled <dekelp@mellanox.com>

<...>

> @@ -851,6 +851,13 @@ Disable hardware insertion of a VLAN header in packets sent on a port::
>  
>     testpmd> tx_vlan reset (port_id)
>  
> +tx_metadata set
> +~~~~~~~~~~~~~~~
> +
> +Set metadata value to insert in packets sent to PMD::
> +
> +   testpmd> tx_metadata set (port_id) (value)

My usual testpmd grunting:

Everybody is adding a high level command to testpmd, with own syntax and in the
scope of a specific feature, that nobody else knows about, it makes testpmd
confusing/hard to use.
If this is a command to set a port feature, why not extend existing,
"port config <port_id> ..."

Like "port config <port_id> tx_metadata <value>" ?


And second, I think it is good to have a set & show as pairs, this function sets
the "tx_metadata", is there a way to display existing "tx_metadata"? If not,
what about: "show port <port_id> tx_metadata"?

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v3 3/3] app/testpmd: add debug command Tx metadata set
  2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 3/3] app/testpmd: add debug command Tx metadata set Dekel Peled
@ 2018-10-05 13:27     ` Ferruh Yigit
  0 siblings, 0 replies; 48+ messages in thread
From: Ferruh Yigit @ 2018-10-05 13:27 UTC (permalink / raw)
  To: Dekel Peled, wenzhuo.lu, jingjing.wu, bernard.iremonger, dev,
	olivier.matz, adrien.mazarguil, thomas, arybchenko
  Cc: shahafs, orika

On 9/27/2018 2:57 PM, Dekel Peled wrote:
> As described in [1],[2] this series adds option to set metadata value as
> match pattern when creating a new flow rule.
> 
> This patch introduces code for debug porpuse only.
> The new debug command takes a 32 bit value and stores it per port.
> testpmd will add to any Tx packet sent from this port the metadata
> value, and set ol_flags accordingly.
> 
> [1] "ethdev: support metadata as flow rule criteria"
> [2] "app/testpmd: support metadata as flow rule criteria"
> 
> Signed-off-by: Dekel Peled <dekelp@mellanox.com>

<...>

> @@ -851,6 +851,13 @@ Disable hardware insertion of a VLAN header in packets sent on a port::
>  
>     testpmd> tx_vlan reset (port_id)
>  
> +tx_metadata set
> +~~~~~~~~~~~~~~~
> +
> +Set metadata value to insert in packets sent to PMD::
> +
> +   testpmd> tx_metadata set (port_id) (value)

I have commented to previous version, but same applies here, please check:
https://mails.dpdk.org/archives/dev/2018-October/114553.html

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v3 1/3] ethdev: support metadata as flow rule criteria
  2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
@ 2018-10-05 13:31     ` Ferruh Yigit
  2018-10-05 13:39       ` Andrew Rybchenko
  0 siblings, 1 reply; 48+ messages in thread
From: Ferruh Yigit @ 2018-10-05 13:31 UTC (permalink / raw)
  To: Dekel Peled, wenzhuo.lu, jingjing.wu, bernard.iremonger, dev,
	olivier.matz, adrien.mazarguil, thomas, arybchenko
  Cc: shahafs, orika

On 9/27/2018 2:57 PM, Dekel Peled wrote:
> As described in [1], a new rte_flow item is added to support metadata
> to use as flow rule match pattern.
> The metadata is an opaque item, fully controlled by the application.
> 
> The use of metadata is relevant for egress rules only.
> It can be set in the flow rule using the RTE_FLOW_ITEM_META.
> 
> In order to avoid change in mbuf API, exisitng field buf.hash.fdir.hi
> is used to carry the metadata item. This field is used only in
> ingress packets, so using it for egress metadata will not cause
> conflicts.
> 
> Application should set the packet metadata in the mbuf dedicated field,
> and set the PKT_TX_METADATA flag in the mbuf->ol_flags.
> The NIC will use the packet metadata as match criteria for relevant
> flow rules.
> 
> This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,
> along with corresponding struct rte_flow_item_meta and ol_flag
> PKT_TX_METADATA.
> 
> [1] "[RFC,v2] ethdev: support metadata as flow rule criteria"
>     http://mails.dpdk.org/archives/dev/2018-August/110194.html
> 
> Signed-off-by: Dekel Peled <dekelp@mellanox.com>

<...>

> @@ -526,6 +532,12 @@ struct rte_mbuf {
>  			uint32_t hi;
>  			/**< First 4 flexible bytes or FD ID, dependent on
>  			     PKT_RX_FDIR_* flag in ol_flags. */
> +			/**
> +			 * Above member has optional use on egress:
> +			 * Application specific metadata value
> +			 * for flow rule match.
> +			 * Valid if PKT_TX_METADATA is set.
> +			 */
>  		} fdir;           /**< Filter identifier if FDIR enabled */

Any objection/comment to use hash.fdir.hi for this new "metadata" meaning? Olivier?

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v3 1/3] ethdev: support metadata as flow rule criteria
  2018-10-05 13:31     ` Ferruh Yigit
@ 2018-10-05 13:39       ` Andrew Rybchenko
  2018-10-05 18:20         ` Yongseok Koh
                           ` (2 more replies)
  0 siblings, 3 replies; 48+ messages in thread
From: Andrew Rybchenko @ 2018-10-05 13:39 UTC (permalink / raw)
  To: Ferruh Yigit, Dekel Peled, wenzhuo.lu, jingjing.wu,
	bernard.iremonger, dev, olivier.matz, adrien.mazarguil, thomas
  Cc: shahafs, orika

On 10/5/18 4:31 PM, Ferruh Yigit wrote:
> On 9/27/2018 2:57 PM, Dekel Peled wrote:
>> As described in [1], a new rte_flow item is added to support metadata
>> to use as flow rule match pattern.
>> The metadata is an opaque item, fully controlled by the application.
>>
>> The use of metadata is relevant for egress rules only.
>> It can be set in the flow rule using the RTE_FLOW_ITEM_META.
>>
>> In order to avoid change in mbuf API, exisitng field buf.hash.fdir.hi
>> is used to carry the metadata item. This field is used only in
>> ingress packets, so using it for egress metadata will not cause
>> conflicts.
>>
>> Application should set the packet metadata in the mbuf dedicated field,
>> and set the PKT_TX_METADATA flag in the mbuf->ol_flags.
>> The NIC will use the packet metadata as match criteria for relevant
>> flow rules.
>>
>> This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,
>> along with corresponding struct rte_flow_item_meta and ol_flag
>> PKT_TX_METADATA.
>>
>> [1] "[RFC,v2] ethdev: support metadata as flow rule criteria"
>>      http://mails.dpdk.org/archives/dev/2018-August/110194.html
>>
>> Signed-off-by: Dekel Peled <dekelp@mellanox.com>
> <...>
>
>> @@ -526,6 +532,12 @@ struct rte_mbuf {
>>   			uint32_t hi;
>>   			/**< First 4 flexible bytes or FD ID, dependent on
>>   			     PKT_RX_FDIR_* flag in ol_flags. */
>> +			/**
>> +			 * Above member has optional use on egress:
>> +			 * Application specific metadata value
>> +			 * for flow rule match.
>> +			 * Valid if PKT_TX_METADATA is set.
>> +			 */
>>   		} fdir;           /**< Filter identifier if FDIR enabled */
> Any objection/comment to use hash.fdir.hi for this new "metadata" meaning? Olivier?

As for me, I'd prefer to see dedicated union member something like
it was suggested in [1].

Andrew.

[1] http://mails.dpdk.org/archives/dev/2018-September/111954.html

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v3 1/3] ethdev: support metadata as flow rule criteria
  2018-10-05 13:39       ` Andrew Rybchenko
@ 2018-10-05 18:20         ` Yongseok Koh
  2018-10-08 15:10         ` Dekel Peled
  2018-10-09 14:46         ` Ferruh Yigit
  2 siblings, 0 replies; 48+ messages in thread
From: Yongseok Koh @ 2018-10-05 18:20 UTC (permalink / raw)
  To: Andrew Rybchenko
  Cc: Ferruh Yigit, Dekel Peled, Wenzhuo Lu, Wu, Jingjing,
	bernard.iremonger, dev, Olivier Matz, Adrien Mazarguil,
	Thomas Monjalon, Shahaf Shuler, Ori Kam


> On Oct 5, 2018, at 6:39 AM, Andrew Rybchenko <arybchenko@solarflare.com> wrote:
> 
> On 10/5/18 4:31 PM, Ferruh Yigit wrote:
>> On 9/27/2018 2:57 PM, Dekel Peled wrote:
>>> As described in [1], a new rte_flow item is added to support metadata
>>> to use as flow rule match pattern.
>>> The metadata is an opaque item, fully controlled by the application.
>>> 
>>> The use of metadata is relevant for egress rules only.
>>> It can be set in the flow rule using the RTE_FLOW_ITEM_META.
>>> 
>>> In order to avoid change in mbuf API, exisitng field buf.hash.fdir.hi
>>> is used to carry the metadata item. This field is used only in
>>> ingress packets, so using it for egress metadata will not cause
>>> conflicts.
>>> 
>>> Application should set the packet metadata in the mbuf dedicated field,
>>> and set the PKT_TX_METADATA flag in the mbuf->ol_flags.
>>> The NIC will use the packet metadata as match criteria for relevant
>>> flow rules.
>>> 
>>> This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,
>>> along with corresponding struct rte_flow_item_meta and ol_flag
>>> PKT_TX_METADATA.
>>> 
>>> [1] "[RFC,v2] ethdev: support metadata as flow rule criteria"
>>>     https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmails.dpdk.org%2Farchives%2Fdev%2F2018-August%2F110194.html&amp;data=02%7C01%7Cyskoh%40mellanox.com%7Cefd5b454b5ac4c84947108d62ac82a8c%7Ca652971c7d2e4d9ba6a4d149256f461b%7C0%7C0%7C636743436575292609&amp;sdata=2WbhDkF89hUV16zER4sfhvD5qDjw6geFQqE0kJQgdyM%3D&amp;reserved=0
>>> 
>>> Signed-off-by: Dekel Peled <dekelp@mellanox.com>
>> <...>
>> 
>>> @@ -526,6 +532,12 @@ struct rte_mbuf {
>>>  			uint32_t hi;
>>>  			/**< First 4 flexible bytes or FD ID, dependent on
>>>  			     PKT_RX_FDIR_* flag in ol_flags. */
>>> +			/**
>>> +			 * Above member has optional use on egress:
>>> +			 * Application specific metadata value
>>> +			 * for flow rule match.
>>> +			 * Valid if PKT_TX_METADATA is set.
>>> +			 */
>>>  		} fdir;           /**< Filter identifier if FDIR enabled */
>> Any objection/comment to use hash.fdir.hi for this new "metadata" meaning? Olivier?
> 
> As for me, I'd prefer to see dedicated union member something like
> it was suggested in [1].
> 
> Andrew.
> 
> [1] https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmails.dpdk.org%2Farchives%2Fdev%2F2018-September%2F111954.html&amp;data=02%7C01%7Cyskoh%40mellanox.com%7Cefd5b454b5ac4c84947108d62ac82a8c%7Ca652971c7d2e4d9ba6a4d149256f461b%7C0%7C0%7C636743436575292609&amp;sdata=QbrBkMWIWVMlKb8839FG3U72VfLhRo%2BjGSHkTXT8ocQ%3D&amp;reserved=0

FYI, I also mentioned that when I reviewed mlx5 part of this patchset and Dekel acked.
He'll make the change and submit a new version once he's back to the office.

Thanks,
Yongseok

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v3 1/3] ethdev: support metadata as flow rule criteria
  2018-10-05 13:39       ` Andrew Rybchenko
  2018-10-05 18:20         ` Yongseok Koh
@ 2018-10-08 15:10         ` Dekel Peled
  2018-10-09 14:46         ` Ferruh Yigit
  2 siblings, 0 replies; 48+ messages in thread
From: Dekel Peled @ 2018-10-08 15:10 UTC (permalink / raw)
  To: Andrew Rybchenko, Ferruh Yigit, wenzhuo.lu, jingjing.wu,
	bernard.iremonger, dev, olivier.matz, Adrien Mazarguil,
	Thomas Monjalon
  Cc: Shahaf Shuler, Ori Kam

Thanks, PSB

From: Andrew Rybchenko <arybchenko@solarflare.com> 
Sent: Friday, October 5, 2018 4:40 PM
To: Ferruh Yigit <ferruh.yigit@intel.com>; Dekel Peled <dekelp@mellanox.com>; wenzhuo.lu@intel.com; jingjing.wu@intel.com; bernard.iremonger@intel.com; dev@dpdk.org; olivier.matz@6wind.com; Adrien Mazarguil <adrien.mazarguil@6wind.com>; Thomas Monjalon <thomas@monjalon.net>
Cc: Shahaf Shuler <shahafs@mellanox.com>; Ori Kam <orika@mellanox.com>
Subject: Re: [PATCH v3 1/3] ethdev: support metadata as flow rule criteria

On 10/5/18 4:31 PM, Ferruh Yigit wrote:
On 9/27/2018 2:57 PM, Dekel Peled wrote:
As described in [1], a new rte_flow item is added to support metadata
to use as flow rule match pattern.
The metadata is an opaque item, fully controlled by the application.

The use of metadata is relevant for egress rules only.
It can be set in the flow rule using the RTE_FLOW_ITEM_META.

In order to avoid change in mbuf API, exisitng field buf.hash.fdir.hi
is used to carry the metadata item. This field is used only in
ingress packets, so using it for egress metadata will not cause
conflicts.

Application should set the packet metadata in the mbuf dedicated field,
and set the PKT_TX_METADATA flag in the mbuf->ol_flags.
The NIC will use the packet metadata as match criteria for relevant
flow rules.

This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,
along with corresponding struct rte_flow_item_meta and ol_flag
PKT_TX_METADATA.

[1] "[RFC,v2] ethdev: support metadata as flow rule criteria"
    https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmails.dpdk.org%2Farchives%2Fdev%2F2018-August%2F110194.html&data=02%7C01%7Cdekelp%40mellanox.com%7Ccc5ab6f21cd847d4b45008d62ac82949%7Ca652971c7d2e4d9ba6a4d149256f461b%7C0%7C0%7C636743436510709804&sdata=AtPp27zdfM8G%2BbvgiLW47qSWDJElDrP2l8%2FHpNP04G0%3D&reserved=0

Signed-off-by: Dekel Peled mailto:dekelp@mellanox.com

<...>

@@ -526,6 +532,12 @@ struct rte_mbuf {
 			uint32_t hi;
 			/**< First 4 flexible bytes or FD ID, dependent on
 			     PKT_RX_FDIR_* flag in ol_flags. */
+			/**
+			 * Above member has optional use on egress:
+			 * Application specific metadata value
+			 * for flow rule match.
+			 * Valid if PKT_TX_METADATA is set.
+			 */
 		} fdir;           /**< Filter identifier if FDIR enabled */

Any objection/comment to use hash.fdir.hi for this new "metadata" meaning? Olivier?

As for me, I'd prefer to see dedicated union member something like
it was suggested in [1].

Andrew.

[1] https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmails.dpdk.org%2Farchives%2Fdev%2F2018-September%2F111954.html&data=02%7C01%7Cdekelp%40mellanox.com%7Ccc5ab6f21cd847d4b45008d62ac82949%7Ca652971c7d2e4d9ba6a4d149256f461b%7C0%7C0%7C636743436510709804&sdata=S1iSzBG4NFNSwF%2B12Vu1b2VfXuwcYLha2Vxlybu8tXQ%3D&reserved=0


I will change it as suggested.
Dekel

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v2 3/3] app/testpmd: add debug command Tx metadata set
  2018-10-05 13:19   ` Ferruh Yigit
@ 2018-10-09 14:30     ` Dekel Peled
  0 siblings, 0 replies; 48+ messages in thread
From: Dekel Peled @ 2018-10-09 14:30 UTC (permalink / raw)
  To: Ferruh Yigit, wenzhuo.lu, jingjing.wu, bernard.iremonger, dev,
	olivier.matz, Adrien Mazarguil, Thomas Monjalon, arybchenko
  Cc: Shahaf Shuler, Ori Kam

Thanks, PSB.

> -----Original Message-----
> From: Ferruh Yigit <ferruh.yigit@intel.com>
> Sent: Friday, October 5, 2018 4:20 PM
> To: Dekel Peled <dekelp@mellanox.com>; wenzhuo.lu@intel.com;
> jingjing.wu@intel.com; bernard.iremonger@intel.com; dev@dpdk.org;
> olivier.matz@6wind.com; Adrien Mazarguil <adrien.mazarguil@6wind.com>;
> Thomas Monjalon <thomas@monjalon.net>; arybchenko@solarflare.com
> Cc: Shahaf Shuler <shahafs@mellanox.com>; Ori Kam
> <orika@mellanox.com>
> Subject: Re: [PATCH v2 3/3] app/testpmd: add debug command Tx metadata
> set
> 
> On 9/16/2018 3:37 PM, Dekel Peled wrote:
> > As described in [1],[2] this series adds option to set metadata value
> > as match pattern when creating a new flow rule.
> >
> > This patch introduces code for debug porpuse only.
> > The new debug command takes a 32 bit value and stores it per port.
> > testpmd will add to any Tx packet sent from this port the metadata
> > value, and set ol_flags accordingly.
> >
> > [1] "ethdev: support metadata as flow rule criteria"
> > [2] "app/testpmd: support metadata as flow rule criteria"
> >
> > Signed-off-by: Dekel Peled <dekelp@mellanox.com>
> 
> <...>
> 
> > @@ -851,6 +851,13 @@ Disable hardware insertion of a VLAN header in
> packets sent on a port::
> >
> >     testpmd> tx_vlan reset (port_id)
> >
> > +tx_metadata set
> > +~~~~~~~~~~~~~~~
> > +
> > +Set metadata value to insert in packets sent to PMD::
> > +
> > +   testpmd> tx_metadata set (port_id) (value)
> 
> My usual testpmd grunting:
> 
> Everybody is adding a high level command to testpmd, with own syntax and
> in the scope of a specific feature, that nobody else knows about, it makes
> testpmd confusing/hard to use.
> If this is a command to set a port feature, why not extend existing, "port
> config <port_id> ..."
> 
> Like "port config <port_id> tx_metadata <value>" ?
> 
> 
> And second, I think it is good to have a set & show as pairs, this function sets
> the "tx_metadata", is there a way to display existing "tx_metadata"? If not,
> what about: "show port <port_id> tx_metadata"?

OK, will implement as suggested.


^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v3 1/3] ethdev: support metadata as flow rule criteria
  2018-10-05 13:39       ` Andrew Rybchenko
  2018-10-05 18:20         ` Yongseok Koh
  2018-10-08 15:10         ` Dekel Peled
@ 2018-10-09 14:46         ` Ferruh Yigit
  2018-10-09 14:52           ` Andrew Rybchenko
  2 siblings, 1 reply; 48+ messages in thread
From: Ferruh Yigit @ 2018-10-09 14:46 UTC (permalink / raw)
  To: Andrew Rybchenko, Dekel Peled, wenzhuo.lu, jingjing.wu,
	bernard.iremonger, dev, olivier.matz, adrien.mazarguil, thomas
  Cc: shahafs, orika, Cristian Dumitrescu

On 10/5/2018 2:39 PM, Andrew Rybchenko wrote:
> On 10/5/18 4:31 PM, Ferruh Yigit wrote:
>> On 9/27/2018 2:57 PM, Dekel Peled wrote:
>>> As described in [1], a new rte_flow item is added to support metadata
>>> to use as flow rule match pattern.
>>> The metadata is an opaque item, fully controlled by the application.
>>>
>>> The use of metadata is relevant for egress rules only.
>>> It can be set in the flow rule using the RTE_FLOW_ITEM_META.
>>>
>>> In order to avoid change in mbuf API, exisitng field buf.hash.fdir.hi
>>> is used to carry the metadata item. This field is used only in
>>> ingress packets, so using it for egress metadata will not cause
>>> conflicts.
>>>
>>> Application should set the packet metadata in the mbuf dedicated field,
>>> and set the PKT_TX_METADATA flag in the mbuf->ol_flags.
>>> The NIC will use the packet metadata as match criteria for relevant
>>> flow rules.
>>>
>>> This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,
>>> along with corresponding struct rte_flow_item_meta and ol_flag
>>> PKT_TX_METADATA.
>>>
>>> [1] "[RFC,v2] ethdev: support metadata as flow rule criteria"
>>>      http://mails.dpdk.org/archives/dev/2018-August/110194.html
>>>
>>> Signed-off-by: Dekel Peled <dekelp@mellanox.com>
>> <...>
>>
>>> @@ -526,6 +532,12 @@ struct rte_mbuf {
>>>   			uint32_t hi;
>>>   			/**< First 4 flexible bytes or FD ID, dependent on
>>>   			     PKT_RX_FDIR_* flag in ol_flags. */
>>> +			/**
>>> +			 * Above member has optional use on egress:
>>> +			 * Application specific metadata value
>>> +			 * for flow rule match.
>>> +			 * Valid if PKT_TX_METADATA is set.
>>> +			 */
>>>   		} fdir;           /**< Filter identifier if FDIR enabled */
>> Any objection/comment to use hash.fdir.hi for this new "metadata" meaning? Olivier?
> 
> As for me, I'd prefer to see dedicated union member something like
> it was suggested in [1].

Another comment, it was from Cristian while discussing something else, since
this field is for egress, shouldn't it be somewhere in second cache line
allocated for Tx?

> 
> Andrew.
> 
> [1] http://mails.dpdk.org/archives/dev/2018-September/111954.html
> 

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v3 1/3] ethdev: support metadata as flow rule criteria
  2018-10-09 14:46         ` Ferruh Yigit
@ 2018-10-09 14:52           ` Andrew Rybchenko
  0 siblings, 0 replies; 48+ messages in thread
From: Andrew Rybchenko @ 2018-10-09 14:52 UTC (permalink / raw)
  To: Ferruh Yigit, Dekel Peled, wenzhuo.lu, jingjing.wu,
	bernard.iremonger, dev, olivier.matz, adrien.mazarguil, thomas
  Cc: shahafs, orika, Cristian Dumitrescu

On 10/9/18 5:46 PM, Ferruh Yigit wrote:
> On 10/5/2018 2:39 PM, Andrew Rybchenko wrote:
>> On 10/5/18 4:31 PM, Ferruh Yigit wrote:
>>> On 9/27/2018 2:57 PM, Dekel Peled wrote:
>>>> As described in [1], a new rte_flow item is added to support metadata
>>>> to use as flow rule match pattern.
>>>> The metadata is an opaque item, fully controlled by the application.
>>>>
>>>> The use of metadata is relevant for egress rules only.
>>>> It can be set in the flow rule using the RTE_FLOW_ITEM_META.
>>>>
>>>> In order to avoid change in mbuf API, exisitng field buf.hash.fdir.hi
>>>> is used to carry the metadata item. This field is used only in
>>>> ingress packets, so using it for egress metadata will not cause
>>>> conflicts.
>>>>
>>>> Application should set the packet metadata in the mbuf dedicated field,
>>>> and set the PKT_TX_METADATA flag in the mbuf->ol_flags.
>>>> The NIC will use the packet metadata as match criteria for relevant
>>>> flow rules.
>>>>
>>>> This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,
>>>> along with corresponding struct rte_flow_item_meta and ol_flag
>>>> PKT_TX_METADATA.
>>>>
>>>> [1] "[RFC,v2] ethdev: support metadata as flow rule criteria"
>>>>       http://mails.dpdk.org/archives/dev/2018-August/110194.html
>>>>
>>>> Signed-off-by: Dekel Peled <dekelp@mellanox.com>
>>> <...>
>>>
>>>> @@ -526,6 +532,12 @@ struct rte_mbuf {
>>>>    			uint32_t hi;
>>>>    			/**< First 4 flexible bytes or FD ID, dependent on
>>>>    			     PKT_RX_FDIR_* flag in ol_flags. */
>>>> +			/**
>>>> +			 * Above member has optional use on egress:
>>>> +			 * Application specific metadata value
>>>> +			 * for flow rule match.
>>>> +			 * Valid if PKT_TX_METADATA is set.
>>>> +			 */
>>>>    		} fdir;           /**< Filter identifier if FDIR enabled */
>>> Any objection/comment to use hash.fdir.hi for this new "metadata" meaning? Olivier?
>> As for me, I'd prefer to see dedicated union member something like
>> it was suggested in [1].
> Another comment, it was from Cristian while discussing something else, since
> this field is for egress, shouldn't it be somewhere in second cache line
> allocated for Tx?

Tx writes to the first cache-line as well, so I see no problem in using hash
union for Tx. I think it is better to keep remaining space on the second
cache-line for the future use.

>> Andrew.
>>
>> [1] http://mails.dpdk.org/archives/dev/2018-September/111954.html
>>

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v4 0/3] support meadata as flow rule criteria
  2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 0/3] support meadata as flow rule criteria Dekel Peled
  2018-10-03 20:46     ` Thomas Monjalon
@ 2018-10-11 10:49     ` Dekel Peled
  2018-10-16  8:42       ` Shahaf Shuler
                         ` (4 more replies)
  2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
                       ` (2 subsequent siblings)
  4 siblings, 5 replies; 48+ messages in thread
From: Dekel Peled @ 2018-10-11 10:49 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, dev, orika

This series implements the match-metadata feature described in [1].

[1] "[RFC v2] ethdev: support metadata as flow rule criteria"
	http://mails.dpdk.org/archives/dev/2018-August/110194.html

---	
v4:
Apply code review comments:
* Change location of metadata item in mbuf
* Update debug commands

v3:
* Add link to RFC email.
* Add cover letter subject line.

v2:
* Fix some checkpatch coding style issues (wrongly sent).
---	

Dekel Peled (3):
  ethdev: support metadata as flow rule criteria
  app/testpmd: support metadata as flow rule criteria
  app/testpmd: add Tx metadata debug commands

 app/test-pmd/cmdline.c                      | 114 ++++++++++++++++++++++++++--
 app/test-pmd/cmdline_flow.c                 |  25 ++++++
 app/test-pmd/config.c                       |   1 +
 app/test-pmd/testpmd.c                      |   5 ++
 app/test-pmd/testpmd.h                      |   2 +
 app/test-pmd/txonly.c                       |   9 +++
 doc/guides/prog_guide/rte_flow.rst          |  21 +++++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  13 +++-
 lib/librte_ethdev/rte_ethdev.c              |   1 +
 lib/librte_ethdev/rte_ethdev.h              |   5 ++
 lib/librte_ethdev/rte_flow.c                |   1 +
 lib/librte_ethdev/rte_flow.h                |  24 ++++++
 lib/librte_mbuf/rte_mbuf.c                  |   2 +
 lib/librte_mbuf/rte_mbuf.h                  |  57 +++++++++-----
 14 files changed, 255 insertions(+), 25 deletions(-)

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v4 1/3] ethdev: support metadata as flow rule criteria
  2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 0/3] support meadata as flow rule criteria Dekel Peled
  2018-10-03 20:46     ` Thomas Monjalon
  2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 " Dekel Peled
@ 2018-10-11 10:49     ` Dekel Peled
  2018-10-16 14:11       ` Andrew Rybchenko
  2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 2/3] app/testpmd: " Dekel Peled
  2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 3/3] app/testpmd: add Tx metadata debug commands Dekel Peled
  4 siblings, 1 reply; 48+ messages in thread
From: Dekel Peled @ 2018-10-11 10:49 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, dev, orika

As described in [1], a new rte_flow item is added to support metadata
to use as flow rule match pattern.
The metadata is an opaque item, fully controlled by the application.

The use of metadata is relevant for egress rules only.
It can be set in the flow rule using the RTE_FLOW_ITEM_META.

An additional item 'tx_metadata' is added in union with existing member
'hash' of struct 'rte_mbuf'.
It is used to carry the metadata item.
Currently this union is used only for ingress packets, so using it for
egress metadata will not cause conflicts.

Application should set the packet metadata in the mbuf dedicated field,
and set the PKT_TX_METADATA flag in the mbuf->ol_flags.
The NIC will use the packet metadata as match criteria for relevant
flow rules.

This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,
along with corresponding struct rte_flow_item_meta and ol_flag
PKT_TX_METADATA.

[1] "[RFC,v2] ethdev: support metadata as flow rule criteria"

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
 doc/guides/prog_guide/rte_flow.rst | 21 ++++++++++++++
 lib/librte_ethdev/rte_ethdev.c     |  1 +
 lib/librte_ethdev/rte_ethdev.h     |  5 ++++
 lib/librte_ethdev/rte_flow.c       |  1 +
 lib/librte_ethdev/rte_flow.h       | 24 ++++++++++++++++
 lib/librte_mbuf/rte_mbuf.c         |  2 ++
 lib/librte_mbuf/rte_mbuf.h         | 57 +++++++++++++++++++++++++-------------
 7 files changed, 92 insertions(+), 19 deletions(-)

diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
index b600b2d..8643722 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -1191,6 +1191,27 @@ Normally preceded by any of:
 - `Item: ICMP6_ND_NS`_
 - `Item: ICMP6_ND_OPT`_
 
+Item: ``META``
+^^^^^^^^^^^^^^
+
+Matches an application specific 32 bit metadata item.
+
+- Default ``mask`` matches any 32 bit value.
+
+.. _table_rte_flow_item_meta:
+
+.. table:: META
+
+   +----------+----------+---------------------------+
+   | Field    | Subfield | Value                     |
+   +==========+==========+===========================+
+   | ``spec`` | ``data`` | 32 bit metadata value     |
+   +----------+--------------------------------------+
+   | ``last`` | ``data`` | upper range value         |
+   +----------+----------+---------------------------+
+   | ``mask`` | ``data`` | zeroed to match any value |
+   +----------+----------+---------------------------+
+
 Actions
 ~~~~~~~
 
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index ef99f70..33c2a18 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -157,6 +157,7 @@ struct rte_eth_xstats_name_off {
 	RTE_TX_OFFLOAD_BIT2STR(SECURITY),
 	RTE_TX_OFFLOAD_BIT2STR(UDP_TNL_TSO),
 	RTE_TX_OFFLOAD_BIT2STR(IP_TNL_TSO),
+	RTE_TX_OFFLOAD_BIT2STR(MATCH_METADATA),
 };
 
 #undef RTE_TX_OFFLOAD_BIT2STR
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index 012577b..933f0e0 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -942,6 +942,11 @@ struct rte_eth_conf {
  * for tunnel TSO.
  */
 #define DEV_TX_OFFLOAD_IP_TNL_TSO       0x00080000
+/**
+ * Device supports match on metadata Tx offload..
+ * Application must set PKT_TX_METADATA and mbuf metadata field.
+ */
+#define DEV_TX_OFFLOAD_MATCH_METADATA   0x00100000
 
 #define RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP 0x00000001
 /**< Device supports Rx queue setup after device started*/
diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c
index 00ed67b..5c01aba 100644
--- a/lib/librte_ethdev/rte_flow.c
+++ b/lib/librte_ethdev/rte_flow.c
@@ -66,6 +66,7 @@ struct rte_flow_desc_data {
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_sla_eth)),
 	MK_FLOW_ITEM(ICMP6_ND_OPT_TLA_ETH,
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
+	MK_FLOW_ITEM(META, sizeof(struct rte_flow_item_meta)),
 };
 
 /** Generate flow_action[] entry. */
diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
index 0656e5e..83aa9f4 100644
--- a/lib/librte_ethdev/rte_flow.h
+++ b/lib/librte_ethdev/rte_flow.h
@@ -413,6 +413,14 @@ enum rte_flow_item_type {
 	 * See struct rte_flow_item_mark.
 	 */
 	RTE_FLOW_ITEM_TYPE_MARK,
+
+	/**
+	 * [META]
+	 *
+	 * Matches a metadata value specified in mbuf metadata field.
+	 * See struct rte_flow_item_meta.
+	 */
+	RTE_FLOW_ITEM_TYPE_META,
 };
 
 /**
@@ -1156,6 +1164,22 @@ struct rte_flow_item_icmp6_nd_opt_tla_eth {
 #endif
 
 /**
+ * RTE_FLOW_ITEM_TYPE_META.
+ *
+ * Matches a specified metadata value.
+ */
+struct rte_flow_item_meta {
+	uint32_t data;
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_META. */
+#ifndef __cplusplus
+static const struct rte_flow_item_meta rte_flow_item_meta_mask = {
+	.data = RTE_BE32(UINT32_MAX),
+};
+#endif
+
+/**
  * @warning
  * @b EXPERIMENTAL: this structure may change without prior notice
  *
diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
index e714c5a..4b25ae8 100644
--- a/lib/librte_mbuf/rte_mbuf.c
+++ b/lib/librte_mbuf/rte_mbuf.c
@@ -395,6 +395,7 @@ const char *rte_get_tx_ol_flag_name(uint64_t mask)
 	case PKT_TX_TUNNEL_UDP: return "PKT_TX_TUNNEL_UDP";
 	case PKT_TX_MACSEC: return "PKT_TX_MACSEC";
 	case PKT_TX_SEC_OFFLOAD: return "PKT_TX_SEC_OFFLOAD";
+	case PKT_TX_METADATA: return "PKT_TX_METADATA";
 	default: return NULL;
 	}
 }
@@ -435,6 +436,7 @@ const char *rte_get_tx_ol_flag_name(uint64_t mask)
 		  "PKT_TX_TUNNEL_NONE" },
 		{ PKT_TX_MACSEC, PKT_TX_MACSEC, NULL },
 		{ PKT_TX_SEC_OFFLOAD, PKT_TX_SEC_OFFLOAD, NULL },
+		{ PKT_TX_METADATA, PKT_TX_METADATA, NULL },
 	};
 	const char *name;
 	unsigned int i;
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index a50b05c..1fa38db 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -182,6 +182,11 @@
 /* add new TX flags here */
 
 /**
+ * Indicate that the metadata field in the mbuf is in use.
+ */
+#define PKT_TX_METADATA	(1ULL << 41)
+
+/**
  * UDP Fragmentation Offload flag. This flag is used for enabling UDP
  * fragmentation in SW or in HW. When use UFO, mbuf->tso_segsz is used
  * to store the MSS of UDP fragments.
@@ -342,8 +347,9 @@
 		PKT_TX_QINQ_PKT |        \
 		PKT_TX_VLAN_PKT |        \
 		PKT_TX_TUNNEL_MASK |	 \
-		PKT_TX_MACSEC |		 \
-		PKT_TX_SEC_OFFLOAD)
+		PKT_TX_MACSEC |          \
+		PKT_TX_SEC_OFFLOAD |	 \
+		PKT_TX_METADATA)
 
 /**
  * Mbuf having an external buffer attached. shinfo in mbuf must be filled.
@@ -511,28 +517,41 @@ struct rte_mbuf {
 	/** VLAN TCI (CPU order), valid if PKT_RX_VLAN is set. */
 	uint16_t vlan_tci;
 
+	RTE_STD_C11
 	union {
-		uint32_t rss;     /**< RSS hash result if RSS enabled */
-		struct {
-			RTE_STD_C11
-			union {
-				struct {
-					uint16_t hash;
-					uint16_t id;
+		union {
+			uint32_t rss;     /**< RSS hash result if RSS enabled */
+			struct {
+				union {
+					struct {
+						uint16_t hash;
+						uint16_t id;
+					};
+					uint32_t lo;
+					/**< Second 4 flexible bytes */
 				};
+				uint32_t hi;
+				/**< First 4 flexible bytes or FD ID, dependent
+				 * on PKT_RX_FDIR_* flag in ol_flags.
+				 */
+			} fdir;	/**< Filter identifier if FDIR enabled */
+			struct {
 				uint32_t lo;
-				/**< Second 4 flexible bytes */
-			};
-			uint32_t hi;
-			/**< First 4 flexible bytes or FD ID, dependent on
-			     PKT_RX_FDIR_* flag in ol_flags. */
-		} fdir;           /**< Filter identifier if FDIR enabled */
+				uint32_t hi;
+			} sched;          /**< Hierarchical scheduler */
+			/**< User defined tags. See rte_distributor_process() */
+			uint32_t usr;
+		} hash;                   /**< hash information */
 		struct {
-			uint32_t lo;
+			/**
+			 * Application specific metadata value
+			 * for egress flow rule match.
+			 * Valid if PKT_TX_METADATA is set.
+			 */
+			uint32_t tx_metadata;
 			uint32_t hi;
-		} sched;          /**< Hierarchical scheduler */
-		uint32_t usr;	  /**< User defined tags. See rte_distributor_process() */
-	} hash;                   /**< hash information */
+		};
+	};
 
 	/** Outer VLAN TCI (CPU order), valid if PKT_RX_QINQ is set. */
 	uint16_t vlan_tci_outer;
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v4 2/3] app/testpmd: support metadata as flow rule criteria
  2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 0/3] support meadata as flow rule criteria Dekel Peled
                       ` (2 preceding siblings ...)
  2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
@ 2018-10-11 10:49     ` Dekel Peled
  2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 3/3] app/testpmd: add Tx metadata debug commands Dekel Peled
  4 siblings, 0 replies; 48+ messages in thread
From: Dekel Peled @ 2018-10-11 10:49 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, dev, orika

As described in [1], this series adds option to set metadata value as
match pattern when creating a new flow rule.

This patch introduces additional options in testpmd commands.
New item type "meta" "data", new offload flag "match_metadata".

[1] "ethdev: support metadata as flow rule criteria"

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
 app/test-pmd/cmdline.c                      | 10 +++++-----
 app/test-pmd/cmdline_flow.c                 | 25 +++++++++++++++++++++++++
 app/test-pmd/config.c                       |  1 +
 app/test-pmd/testpmd.c                      |  4 ++++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  6 +++++-
 5 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 0c5399d..d7409be 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -17491,7 +17491,8 @@ struct cmd_config_per_port_tx_offload_result {
 			  "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
 			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
 			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
-			  "mt_lockfree#multi_segs#mbuf_fast_free#security");
+			  "mt_lockfree#multi_segs#mbuf_fast_free#security#"
+			  "match_metadata");
 cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_on_off =
 	TOKEN_STRING_INITIALIZER
 		(struct cmd_config_per_port_tx_offload_result,
@@ -17572,8 +17573,8 @@ struct cmd_config_per_port_tx_offload_result {
 		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
 		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
 		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
-		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
-		    "on|off",
+		    "mt_lockfree|multi_segs|mbuf_fast_free|security|"
+		    "match_metadata on|off",
 	.tokens = {
 		(void *)&cmd_config_per_port_tx_offload_result_port,
 		(void *)&cmd_config_per_port_tx_offload_result_config,
@@ -17676,8 +17677,7 @@ struct cmd_config_per_queue_tx_offload_result {
 		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
 		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
 		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
-		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
-		    "on|off",
+		    "mt_lockfree|multi_segs|mbuf_fast_free|security on|off",
 	.tokens = {
 		(void *)&cmd_config_per_queue_tx_offload_result_port,
 		(void *)&cmd_config_per_queue_tx_offload_result_port_id,
diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index 349e822..8f997e4 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -178,6 +178,8 @@ enum index {
 	ITEM_ICMP6_ND_OPT_SLA_ETH_SLA,
 	ITEM_ICMP6_ND_OPT_TLA_ETH,
 	ITEM_ICMP6_ND_OPT_TLA_ETH_TLA,
+	ITEM_META,
+	ITEM_META_DATA,
 
 	/* Validate/create actions. */
 	ACTIONS,
@@ -540,6 +542,7 @@ struct parse_action_priv {
 	ITEM_ICMP6_ND_OPT,
 	ITEM_ICMP6_ND_OPT_SLA_ETH,
 	ITEM_ICMP6_ND_OPT_TLA_ETH,
+	ITEM_META,
 	ZERO,
 };
 
@@ -760,6 +763,12 @@ struct parse_action_priv {
 	ZERO,
 };
 
+static const enum index item_meta[] = {
+	ITEM_META_DATA,
+	ITEM_NEXT,
+	ZERO,
+};
+
 static const enum index next_action[] = {
 	ACTION_END,
 	ACTION_VOID,
@@ -1961,6 +1970,22 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,
 		.args = ARGS(ARGS_ENTRY_HTON
 			     (struct rte_flow_item_icmp6_nd_opt_tla_eth, tla)),
 	},
+	[ITEM_META] = {
+		.name = "meta",
+		.help = "match metadata header",
+		.priv = PRIV_ITEM(META, sizeof(struct rte_flow_item_meta)),
+		.next = NEXT(item_meta),
+		.call = parse_vc,
+	},
+	[ITEM_META_DATA] = {
+		.name = "data",
+		.help = "metadata value",
+		.next = NEXT(item_meta, NEXT_ENTRY(UNSIGNED), item_param),
+		.args = ARGS(ARGS_ENTRY_MASK_HTON(struct rte_flow_item_meta,
+							data,
+							"\xff\xff\xff\xff"
+							"\xff\xff\xff\xff")),
+	},
 
 	/* Validate/create actions. */
 	[ACTIONS] = {
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 29e8a3f..b16ff7a 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -1052,6 +1052,7 @@ void print_valid_ports(void)
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_sla_eth)),
 	MK_FLOW_ITEM(ICMP6_ND_OPT_TLA_ETH,
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
+	MK_FLOW_ITEM(META, sizeof(struct rte_flow_item_meta)),
 };
 
 /** Pattern item specification types. */
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 001f0e5..a806900 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -742,6 +742,10 @@ static void eth_dev_event_callback(char *device_name,
 		      DEV_TX_OFFLOAD_MBUF_FAST_FREE))
 			port->dev_conf.txmode.offloads &=
 				~DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+		if (!(port->dev_info.tx_offload_capa &
+			DEV_TX_OFFLOAD_MATCH_METADATA))
+			port->dev_conf.txmode.offloads &=
+				~DEV_TX_OFFLOAD_MATCH_METADATA;
 		if (numa_support) {
 			if (port_numa[pid] != NUMA_NO_CONFIG)
 				port_per_socket[port_numa[pid]]++;
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 3a73000..83635c0 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -3518,11 +3518,15 @@ This section lists supported pattern items and their attributes, if any.
 
   - ``sla {MAC-48}``: source Ethernet LLA.
 
-- ``icmp6_nd_opt_sla_eth``: match ICMPv6 neighbor discovery target Ethernet
+- ``icmp6_nd_opt_tla_eth``: match ICMPv6 neighbor discovery target Ethernet
   link-layer address option.
 
   - ``tla {MAC-48}``: target Ethernet LLA.
 
+- ``meta``: match application specific metadata.
+
+  - ``data``: metadata value.
+
 Actions list
 ^^^^^^^^^^^^
 
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v4 3/3] app/testpmd: add Tx metadata debug commands
  2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 0/3] support meadata as flow rule criteria Dekel Peled
                       ` (3 preceding siblings ...)
  2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 2/3] app/testpmd: " Dekel Peled
@ 2018-10-11 10:49     ` Dekel Peled
  4 siblings, 0 replies; 48+ messages in thread
From: Dekel Peled @ 2018-10-11 10:49 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, dev, orika

As described in [1],[2] this series adds option to set metadata value as
match pattern when creating a new flow rule.

This patch introduces code for debug porpuse only.
The new 'config' command takes a 32 bit value and stores it per port:
	port config <port_id> tx_metadata <value>

testpmd will add to any Tx packet sent from this port the metadata
value, and set ol_flags accordingly.

A matching 'show' command is added to read the configured value:
	port config <port_id> tx_metadata <value>

[1] "ethdev: support metadata as flow rule criteria"
[2] "app/testpmd: support metadata as flow rule criteria"

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
 app/test-pmd/cmdline.c                      | 104 ++++++++++++++++++++++++++++
 app/test-pmd/testpmd.c                      |   1 +
 app/test-pmd/testpmd.h                      |   2 +
 app/test-pmd/txonly.c                       |   9 +++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |   7 ++
 5 files changed, 123 insertions(+)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index d7409be..64218b4 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -17690,6 +17690,108 @@ struct cmd_config_per_queue_tx_offload_result {
 	}
 };
 
+/* *** configure tx_metadata for specific port *** */
+struct cmd_config_tx_metadata_specific_result {
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t keyword;
+	uint16_t port_id;
+	cmdline_fixed_string_t item;
+	uint32_t value;
+};
+
+static void
+cmd_config_tx_metadata_specific_parsed(void *parsed_result,
+				__attribute__((unused)) struct cmdline *cl,
+				__attribute__((unused)) void *data)
+{
+	struct cmd_config_tx_metadata_specific_result *res = parsed_result;
+
+	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+		return;
+	ports[res->port_id].tx_metadata = res->value;
+}
+
+cmdline_parse_token_string_t cmd_config_tx_metadata_specific_port =
+	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
+			port, "port");
+cmdline_parse_token_string_t cmd_config_tx_metadata_specific_keyword =
+	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
+			keyword, "config");
+cmdline_parse_token_num_t cmd_config_tx_metadata_specific_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
+			port_id, UINT16);
+cmdline_parse_token_string_t cmd_config_tx_metadata_specific_item =
+	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
+			item, "tx_metadata");
+cmdline_parse_token_num_t cmd_config_tx_metadata_specific_value =
+	TOKEN_NUM_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
+			value, UINT32);
+
+cmdline_parse_inst_t cmd_config_tx_metadata_specific = {
+	.f = cmd_config_tx_metadata_specific_parsed,
+	.data = NULL,
+	.help_str = "port config <port_id> tx_metadata <value>",
+	.tokens = {
+		(void *)&cmd_config_tx_metadata_specific_port,
+		(void *)&cmd_config_tx_metadata_specific_keyword,
+		(void *)&cmd_config_tx_metadata_specific_id,
+		(void *)&cmd_config_tx_metadata_specific_item,
+		(void *)&cmd_config_tx_metadata_specific_value,
+		NULL,
+	},
+};
+
+/* *** display tx_metadata per port configuration *** */
+struct cmd_show_tx_metadata_result {
+	cmdline_fixed_string_t cmd_show;
+	cmdline_fixed_string_t cmd_port;
+	cmdline_fixed_string_t cmd_keyword;
+	portid_t cmd_pid;
+};
+
+static void
+cmd_show_tx_metadata_parsed(void *parsed_result,
+		__attribute__((unused)) struct cmdline *cl,
+		__attribute__((unused)) void *data)
+{
+	struct cmd_show_tx_metadata_result *res = parsed_result;
+
+	if (!rte_eth_dev_is_valid_port(res->cmd_pid)) {
+		printf("invalid port id %u\n", res->cmd_pid);
+		return;
+	}
+	if (!strcmp(res->cmd_keyword, "tx_metadata")) {
+		printf("Port %u tx_metadata: %u\n", res->cmd_pid,
+				ports[res->cmd_pid].tx_metadata);
+	}
+}
+
+cmdline_parse_token_string_t cmd_show_tx_metadata_show =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result,
+			cmd_show, "show");
+cmdline_parse_token_string_t cmd_show_tx_metadata_port =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result,
+			cmd_port, "port");
+cmdline_parse_token_num_t cmd_show_tx_metadata_pid =
+	TOKEN_NUM_INITIALIZER(struct cmd_show_tx_metadata_result,
+			cmd_pid, UINT16);
+cmdline_parse_token_string_t cmd_show_tx_metadata_keyword =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result,
+			cmd_keyword, "tx_metadata");
+
+cmdline_parse_inst_t cmd_show_tx_metadata = {
+	.f = cmd_show_tx_metadata_parsed,
+	.data = NULL,
+	.help_str = "show port <port_id> tx_metadata",
+	.tokens = {
+		(void *)&cmd_show_tx_metadata_show,
+		(void *)&cmd_show_tx_metadata_port,
+		(void *)&cmd_show_tx_metadata_pid,
+		(void *)&cmd_show_tx_metadata_keyword,
+		NULL,
+	},
+};
+
 /* ******************************************************************************** */
 
 /* list of instructions */
@@ -17956,6 +18058,8 @@ struct cmd_config_per_queue_tx_offload_result {
 	(cmdline_parse_inst_t *)&cmd_operate_bpf_ld_parse,
 	(cmdline_parse_inst_t *)&cmd_operate_bpf_unld_parse,
 #endif
+	(cmdline_parse_inst_t *)&cmd_config_tx_metadata_specific,
+	(cmdline_parse_inst_t *)&cmd_show_tx_metadata,
 	NULL,
 };
 
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index a806900..68434da 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -771,6 +771,7 @@ static void eth_dev_event_callback(char *device_name,
 		/* set flag to initialize port/queue */
 		port->need_reconfig = 1;
 		port->need_reconfig_queues = 1;
+		port->tx_metadata = 0;
 	}
 
 	/*
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index a1f6614..ac55311 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -183,6 +183,8 @@ struct rte_port {
 #ifdef SOFTNIC
 	struct softnic_port     softport;  /**< softnic params */
 #endif
+	/**< metadata value to add in Tx packets (debug only). */
+	uint32_t                tx_metadata;
 };
 
 /**
diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
index 1f08b6e..fae84ca 100644
--- a/app/test-pmd/txonly.c
+++ b/app/test-pmd/txonly.c
@@ -253,6 +253,15 @@
 		pkt->l2_len = sizeof(struct ether_hdr);
 		pkt->l3_len = sizeof(struct ipv4_hdr);
 		pkts_burst[nb_pkt] = pkt;
+
+		/*
+		 * If user configured metadata value add it to packet
+		 * and set ol_flags accordingly
+		 */
+		if (ports[fs->tx_port].tx_metadata) {
+			pkt->tx_metadata = ports[fs->tx_port].tx_metadata;
+			pkt->ol_flags |= PKT_TX_METADATA;
+		}
 	}
 	nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_pkt);
 	/*
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 83635c0..7edea33 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -851,6 +851,13 @@ Disable hardware insertion of a VLAN header in packets sent on a port::
 
    testpmd> tx_vlan reset (port_id)
 
+tx_metadata set
+~~~~~~~~~~~~~~~
+
+Set metadata value to insert in packets sent to PMD::
+
+   testpmd> tx_metadata set (port_id) (value)
+
 csum set
 ~~~~~~~~
 
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v4 0/3] support meadata as flow rule criteria
  2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 " Dekel Peled
@ 2018-10-16  8:42       ` Shahaf Shuler
  2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 0/3] support metadata " Dekel Peled
                         ` (3 subsequent siblings)
  4 siblings, 0 replies; 48+ messages in thread
From: Shahaf Shuler @ 2018-10-16  8:42 UTC (permalink / raw)
  To: Dekel Peled, wenzhuo.lu, jingjing.wu, bernard.iremonger,
	olivier.matz, Adrien Mazarguil, Thomas Monjalon, ferruh.yigit,
	arybchenko
  Cc: dev, Ori Kam

Andrew,

Are you OK with the below updates? 
Any other comments on the rest of the patches? 

Thursday, October 11, 2018 1:50 PM, Dekel Peled:
> arybchenko@solarflare.com
> Cc: Shahaf Shuler <shahafs@mellanox.com>; dev@dpdk.org; Ori Kam
> <orika@mellanox.com>
> Subject: [dpdk-dev] [PATCH v4 0/3] support meadata as flow rule criteria
> 
> This series implements the match-metadata feature described in [1].
> 
> [1] "[RFC v2] ethdev: support metadata as flow rule criteria"
> 	https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F
> %2Fmails.dpdk.org%2Farchives%2Fdev%2F2018-
> August%2F110194.html&amp;data=02%7C01%7Cshahafs%40mellanox.com%
> 7C6492a52cd55747e95e8608d62f696abd%7Ca652971c7d2e4d9ba6a4d149256f
> 461b%7C0%7C0%7C636748527156517743&amp;sdata=DrSIJz%2FjKzluPzF6kg
> WH70MXRKIaTe8SrVCq8zlV26U%3D&amp;reserved=0
> 
> ---
> v4:
> Apply code review comments:
> * Change location of metadata item in mbuf
> * Update debug commands
> 
> v3:
> * Add link to RFC email.
> * Add cover letter subject line.
> 
> v2:
> * Fix some checkpatch coding style issues (wrongly sent).
> ---
> 
> Dekel Peled (3):
>   ethdev: support metadata as flow rule criteria
>   app/testpmd: support metadata as flow rule criteria
>   app/testpmd: add Tx metadata debug commands
> 
>  app/test-pmd/cmdline.c                      | 114 ++++++++++++++++++++++++++-
> -
>  app/test-pmd/cmdline_flow.c                 |  25 ++++++
>  app/test-pmd/config.c                       |   1 +
>  app/test-pmd/testpmd.c                      |   5 ++
>  app/test-pmd/testpmd.h                      |   2 +
>  app/test-pmd/txonly.c                       |   9 +++
>  doc/guides/prog_guide/rte_flow.rst          |  21 +++++
>  doc/guides/testpmd_app_ug/testpmd_funcs.rst |  13 +++-
>  lib/librte_ethdev/rte_ethdev.c              |   1 +
>  lib/librte_ethdev/rte_ethdev.h              |   5 ++
>  lib/librte_ethdev/rte_flow.c                |   1 +
>  lib/librte_ethdev/rte_flow.h                |  24 ++++++
>  lib/librte_mbuf/rte_mbuf.c                  |   2 +
>  lib/librte_mbuf/rte_mbuf.h                  |  57 +++++++++-----
>  14 files changed, 255 insertions(+), 25 deletions(-)
> 
> --
> 1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support metadata as flow rule criteria
  2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
@ 2018-10-16 14:11       ` Andrew Rybchenko
  2018-10-17  5:27         ` Dekel Peled
  0 siblings, 1 reply; 48+ messages in thread
From: Andrew Rybchenko @ 2018-10-16 14:11 UTC (permalink / raw)
  To: Dekel Peled, wenzhuo.lu, jingjing.wu, bernard.iremonger,
	olivier.matz, adrien.mazarguil, thomas, ferruh.yigit
  Cc: shahafs, dev, orika, Nikhil Rao

On 10/11/18 1:49 PM, Dekel Peled wrote:
> As described in [1], a new rte_flow item is added to support metadata
> to use as flow rule match pattern.
> The metadata is an opaque item, fully controlled by the application.
>
> The use of metadata is relevant for egress rules only.
> It can be set in the flow rule using the RTE_FLOW_ITEM_META.
>
> An additional item 'tx_metadata' is added in union with existing member
> 'hash' of struct 'rte_mbuf'.
> It is used to carry the metadata item.
> Currently this union is used only for ingress packets, so using it for
> egress metadata will not cause conflicts.
>
> Application should set the packet metadata in the mbuf dedicated field,
> and set the PKT_TX_METADATA flag in the mbuf->ol_flags.
> The NIC will use the packet metadata as match criteria for relevant
> flow rules.
>
> This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,
> along with corresponding struct rte_flow_item_meta and ol_flag
> PKT_TX_METADATA.
>
> [1] "[RFC,v2] ethdev: support metadata as flow rule criteria"
>
> Signed-off-by: Dekel Peled <dekelp@mellanox.com>

[...]

> diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
> index b600b2d..8643722 100644
> --- a/doc/guides/prog_guide/rte_flow.rst
> +++ b/doc/guides/prog_guide/rte_flow.rst
> @@ -1191,6 +1191,27 @@ Normally preceded by any of:
>   - `Item: ICMP6_ND_NS`_
>   - `Item: ICMP6_ND_OPT`_
>   
> +Item: ``META``
> +^^^^^^^^^^^^^^
> +
> +Matches an application specific 32 bit metadata item.
> +
> +- Default ``mask`` matches any 32 bit value.
> +
> +.. _table_rte_flow_item_meta:
> +
> +.. table:: META
> +
> +   +----------+----------+---------------------------+
> +   | Field    | Subfield | Value                     |
> +   +==========+==========+===========================+
> +   | ``spec`` | ``data`` | 32 bit metadata value     |
> +   +----------+--------------------------------------+
> +   | ``last`` | ``data`` | upper range value         |
> +   +----------+----------+---------------------------+
> +   | ``mask`` | ``data`` | zeroed to match any value |
> +   +----------+----------+---------------------------+
> +

Is there a difference between any metadata value and
no metadata value at all?

> diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
> index 012577b..933f0e0 100644
> --- a/lib/librte_ethdev/rte_ethdev.h
> +++ b/lib/librte_ethdev/rte_ethdev.h
> @@ -942,6 +942,11 @@ struct rte_eth_conf {
>    * for tunnel TSO.
>    */
>   #define DEV_TX_OFFLOAD_IP_TNL_TSO       0x00080000
> +/**
> + * Device supports match on metadata Tx offload..
> + * Application must set PKT_TX_METADATA and mbuf metadata field.
> + */
> +#define DEV_TX_OFFLOAD_MATCH_METADATA   0x00100000
>   
>   #define RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP 0x00000001
>   /**< Device supports Rx queue setup after device started*/

> diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
> index a50b05c..1fa38db 100644
> --- a/lib/librte_mbuf/rte_mbuf.h
> +++ b/lib/librte_mbuf/rte_mbuf.h
> @@ -182,6 +182,11 @@
>   /* add new TX flags here */
>   
>   /**
> + * Indicate that the metadata field in the mbuf is in use.
> + */
> +#define PKT_TX_METADATA	(1ULL << 41)
> +
> +/**
>    * UDP Fragmentation Offload flag. This flag is used for enabling UDP
>    * fragmentation in SW or in HW. When use UFO, mbuf->tso_segsz is used
>    * to store the MSS of UDP fragments.
> @@ -342,8 +347,9 @@
>   		PKT_TX_QINQ_PKT |        \
>   		PKT_TX_VLAN_PKT |        \
>   		PKT_TX_TUNNEL_MASK |	 \
> -		PKT_TX_MACSEC |		 \
> -		PKT_TX_SEC_OFFLOAD)
> +		PKT_TX_MACSEC |          \
> +		PKT_TX_SEC_OFFLOAD |	 \
> +		PKT_TX_METADATA)
>   
>   /**
>    * Mbuf having an external buffer attached. shinfo in mbuf must be filled.
> @@ -511,28 +517,41 @@ struct rte_mbuf {
>   	/** VLAN TCI (CPU order), valid if PKT_RX_VLAN is set. */
>   	uint16_t vlan_tci;
>   
> +	RTE_STD_C11
>   	union {
> -		uint32_t rss;     /**< RSS hash result if RSS enabled */
> -		struct {
> -			RTE_STD_C11
> -			union {
> -				struct {
> -					uint16_t hash;
> -					uint16_t id;
> +		union {
> +			uint32_t rss;     /**< RSS hash result if RSS enabled */
> +			struct {
> +				union {
> +					struct {
> +						uint16_t hash;
> +						uint16_t id;
> +					};
> +					uint32_t lo;
> +					/**< Second 4 flexible bytes */
>   				};
> +				uint32_t hi;
> +				/**< First 4 flexible bytes or FD ID, dependent
> +				 * on PKT_RX_FDIR_* flag in ol_flags.
> +				 */
> +			} fdir;	/**< Filter identifier if FDIR enabled */
> +			struct {
>   				uint32_t lo;
> -				/**< Second 4 flexible bytes */
> -			};
> -			uint32_t hi;
> -			/**< First 4 flexible bytes or FD ID, dependent on
> -			     PKT_RX_FDIR_* flag in ol_flags. */
> -		} fdir;           /**< Filter identifier if FDIR enabled */
> +				uint32_t hi;
> +			} sched;          /**< Hierarchical scheduler */
> +			/**< User defined tags. See rte_distributor_process() */
> +			uint32_t usr;
> +		} hash;                   /**< hash information */
>   		struct {
> -			uint32_t lo;
> +			/**
> +			 * Application specific metadata value
> +			 * for egress flow rule match.
> +			 * Valid if PKT_TX_METADATA is set.
> +			 */

Do I understand correctly that it is in CPU byte order?

> +			uint32_t tx_metadata;
>   			uint32_t hi;

I don't know if we need 'hi' here. Right now only one thing is
important - make it clear that it is not used. May be name it 'reserved'
instead of 'hi'.

It is interesting that hash::sched::hi is used for TxQ identification
in rte_event_eth_tx. The patch uses low bytes. So, seem to be fine.
However, if the separate structure is added in union for Tx fields,
it looks strange taking  rte_event_eth_tx into account.
So, I think it would be good document (comments) the purpose
of separate but unnamed structure in the union.

Andrew.

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support metadata as flow rule criteria
  2018-10-16 14:11       ` Andrew Rybchenko
@ 2018-10-17  5:27         ` Dekel Peled
  2018-10-17  6:02           ` Andrew Rybchenko
  0 siblings, 1 reply; 48+ messages in thread
From: Dekel Peled @ 2018-10-17  5:27 UTC (permalink / raw)
  To: Andrew Rybchenko, wenzhuo.lu, jingjing.wu, bernard.iremonger,
	olivier.matz, Adrien Mazarguil, Thomas Monjalon, ferruh.yigit
  Cc: Shahaf Shuler, dev, Ori Kam, Nikhil Rao

Thanks, PSB.

From: Andrew Rybchenko <arybchenko@solarflare.com>
Sent: Tuesday, October 16, 2018 5:12 PM
To: Dekel Peled <dekelp@mellanox.com>; wenzhuo.lu@intel.com; jingjing.wu@intel.com; bernard.iremonger@intel.com; olivier.matz@6wind.com; Adrien Mazarguil <adrien.mazarguil@6wind.com>; Thomas Monjalon <thomas@monjalon.net>; ferruh.yigit@intel.com
Cc: Shahaf Shuler <shahafs@mellanox.com>; dev@dpdk.org; Ori Kam <orika@mellanox.com>; Nikhil Rao <nikhil.rao@intel.com>
Subject: Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support metadata as flow rule criteria

On 10/11/18 1:49 PM, Dekel Peled wrote:

As described in [1], a new rte_flow item is added to support metadata

to use as flow rule match pattern.

The metadata is an opaque item, fully controlled by the application.



The use of metadata is relevant for egress rules only.

It can be set in the flow rule using the RTE_FLOW_ITEM_META.



An additional item 'tx_metadata' is added in union with existing member

'hash' of struct 'rte_mbuf'.

It is used to carry the metadata item.

Currently this union is used only for ingress packets, so using it for

egress metadata will not cause conflicts.



Application should set the packet metadata in the mbuf dedicated field,

and set the PKT_TX_METADATA flag in the mbuf->ol_flags.

The NIC will use the packet metadata as match criteria for relevant

flow rules.



This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,

along with corresponding struct rte_flow_item_meta and ol_flag

PKT_TX_METADATA.



[1] "[RFC,v2] ethdev: support metadata as flow rule criteria"



Signed-off-by: Dekel Peled <dekelp@mellanox.com><mailto:dekelp@mellanox.com>

[...]



diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst

index b600b2d..8643722 100644

--- a/doc/guides/prog_guide/rte_flow.rst

+++ b/doc/guides/prog_guide/rte_flow.rst

@@ -1191,6 +1191,27 @@ Normally preceded by any of:

 - `Item: ICMP6_ND_NS`_

 - `Item: ICMP6_ND_OPT`_



+Item: ``META``

+^^^^^^^^^^^^^^

+

+Matches an application specific 32 bit metadata item.

+

+- Default ``mask`` matches any 32 bit value.

+

+.. _table_rte_flow_item_meta:

+

+.. table:: META

+

+   +----------+----------+---------------------------+

+   | Field    | Subfield | Value                     |

+   +==========+==========+===========================+

+   | ``spec`` | ``data`` | 32 bit metadata value     |

+   +----------+--------------------------------------+

+   | ``last`` | ``data`` | upper range value         |

+   +----------+----------+---------------------------+

+   | ``mask`` | ``data`` | zeroed to match any value |

+   +----------+----------+---------------------------+

+

Is there a difference between any metadata value and
no metadata value at all?


<DP> Value Zero is considered as no metadata value.


diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h

index 012577b..933f0e0 100644

--- a/lib/librte_ethdev/rte_ethdev.h

+++ b/lib/librte_ethdev/rte_ethdev.h

@@ -942,6 +942,11 @@ struct rte_eth_conf {

  * for tunnel TSO.

  */

 #define DEV_TX_OFFLOAD_IP_TNL_TSO       0x00080000

+/**

+ * Device supports match on metadata Tx offload..

+ * Application must set PKT_TX_METADATA and mbuf metadata field.

+ */

+#define DEV_TX_OFFLOAD_MATCH_METADATA   0x00100000



 #define RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP 0x00000001

 /**< Device supports Rx queue setup after device started*/



diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h

index a50b05c..1fa38db 100644

--- a/lib/librte_mbuf/rte_mbuf.h

+++ b/lib/librte_mbuf/rte_mbuf.h

@@ -182,6 +182,11 @@

 /* add new TX flags here */



 /**

+ * Indicate that the metadata field in the mbuf is in use.

+ */

+#define PKT_TX_METADATA       (1ULL << 41)

+

+/**

  * UDP Fragmentation Offload flag. This flag is used for enabling UDP

  * fragmentation in SW or in HW. When use UFO, mbuf->tso_segsz is used

  * to store the MSS of UDP fragments.

@@ -342,8 +347,9 @@

                PKT_TX_QINQ_PKT |        \

                PKT_TX_VLAN_PKT |        \

                PKT_TX_TUNNEL_MASK |    \

-               PKT_TX_MACSEC |         \

-               PKT_TX_SEC_OFFLOAD)

+               PKT_TX_MACSEC |          \

+               PKT_TX_SEC_OFFLOAD |    \

+               PKT_TX_METADATA)



 /**

  * Mbuf having an external buffer attached. shinfo in mbuf must be filled.

@@ -511,28 +517,41 @@ struct rte_mbuf {

        /** VLAN TCI (CPU order), valid if PKT_RX_VLAN is set. */

        uint16_t vlan_tci;



+       RTE_STD_C11

        union {

-               uint32_t rss;     /**< RSS hash result if RSS enabled */

-               struct {

-                       RTE_STD_C11

-                       union {

-                              struct {

-                                      uint16_t hash;

-                                      uint16_t id;

+               union {

+                       uint32_t rss;     /**< RSS hash result if RSS enabled */

+                       struct {

+                              union {

+                                      struct {

+                                              uint16_t hash;

+                                             uint16_t id;

+                                      };

+                                      uint32_t lo;

+                                      /**< Second 4 flexible bytes */

                               };

+                              uint32_t hi;

+                              /**< First 4 flexible bytes or FD ID, dependent

+                               * on PKT_RX_FDIR_* flag in ol_flags.

+                               */

+                       } fdir; /**< Filter identifier if FDIR enabled */

+                       struct {

                               uint32_t lo;

-                              /**< Second 4 flexible bytes */

-                       };

-                       uint32_t hi;

-                       /**< First 4 flexible bytes or FD ID, dependent on

-                            PKT_RX_FDIR_* flag in ol_flags. */

-               } fdir;           /**< Filter identifier if FDIR enabled */

+                              uint32_t hi;

+                       } sched;          /**< Hierarchical scheduler */

+                       /**< User defined tags. See rte_distributor_process() */

+                       uint32_t usr;

+               } hash;                   /**< hash information */

                struct {

-                       uint32_t lo;

+                       /**

+                        * Application specific metadata value

+                        * for egress flow rule match.

+                        * Valid if PKT_TX_METADATA is set.

+                        */

Do I understand correctly that it is in CPU byte order?

<DP> Yes. The metadata value is not sent out to network.


+                       uint32_t tx_metadata;

                        uint32_t hi;

I don't know if we need 'hi' here. Right now only one thing is
important - make it clear that it is not used. May be name it 'reserved'
instead of 'hi'.

<DP> Accepted, I will rename it.

It is interesting that hash::sched::hi is used for TxQ identification
in rte_event_eth_tx. The patch uses low bytes. So, seem to be fine.
However, if the separate structure is added in union for Tx fields,
it looks strange taking  rte_event_eth_tx into account.
So, I think it would be good document (comments) the purpose
of separate but unnamed structure in the union.

<DP> Accepted, I will add comment.

Andrew.

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support metadata as flow rule criteria
  2018-10-17  5:27         ` Dekel Peled
@ 2018-10-17  6:02           ` Andrew Rybchenko
  2018-10-17  7:52             ` Dekel Peled
  0 siblings, 1 reply; 48+ messages in thread
From: Andrew Rybchenko @ 2018-10-17  6:02 UTC (permalink / raw)
  To: Dekel Peled, wenzhuo.lu, jingjing.wu, bernard.iremonger,
	olivier.matz, Adrien Mazarguil, Thomas Monjalon, ferruh.yigit
  Cc: Shahaf Shuler, dev, Ori Kam, Nikhil Rao

On 10/17/18 8:27 AM, Dekel Peled wrote:
>
> Thanks, PSB.
>
> *From:* Andrew Rybchenko <arybchenko@solarflare.com>
> *Sent:* Tuesday, October 16, 2018 5:12 PM
> *To:* Dekel Peled <dekelp@mellanox.com>; wenzhuo.lu@intel.com; 
> jingjing.wu@intel.com; bernard.iremonger@intel.com; 
> olivier.matz@6wind.com; Adrien Mazarguil <adrien.mazarguil@6wind.com>; 
> Thomas Monjalon <thomas@monjalon.net>; ferruh.yigit@intel.com
> *Cc:* Shahaf Shuler <shahafs@mellanox.com>; dev@dpdk.org; Ori Kam 
> <orika@mellanox.com>; Nikhil Rao <nikhil.rao@intel.com>
> *Subject:* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support metadata as 
> flow rule criteria
>
> On 10/11/18 1:49 PM, Dekel Peled wrote:
>
>     As described in [1], a new rte_flow item is added to support metadata
>
>     to use as flow rule match pattern.
>
>     The metadata is an opaque item, fully controlled by the application.
>
>     The use of metadata is relevant for egress rules only.
>
>     It can be set in the flow rule using the RTE_FLOW_ITEM_META.
>
>     An additional item 'tx_metadata' is added in union with existing member
>
>     'hash' of struct 'rte_mbuf'.
>
>     It is used to carry the metadata item.
>
>     Currently this union is used only for ingress packets, so using it for
>
>     egress metadata will not cause conflicts.
>
>     Application should set the packet metadata in the mbuf dedicated field,
>
>     and set the PKT_TX_METADATA flag in the mbuf->ol_flags.
>
>     The NIC will use the packet metadata as match criteria for relevant
>
>     flow rules.
>
>     This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,
>
>     along with corresponding struct rte_flow_item_meta and ol_flag
>
>     PKT_TX_METADATA.
>
>     [1] "[RFC,v2] ethdev: support metadata as flow rule criteria"
>
>     Signed-off-by: Dekel Peled<dekelp@mellanox.com>  <mailto:dekelp@mellanox.com>
>
>
> [...]
>
>
>     diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
>
>     index b600b2d..8643722 100644
>
>     --- a/doc/guides/prog_guide/rte_flow.rst
>
>     +++ b/doc/guides/prog_guide/rte_flow.rst
>
>     @@ -1191,6 +1191,27 @@ Normally preceded by any of:
>
>       - `Item: ICMP6_ND_NS`_
>
>       - `Item: ICMP6_ND_OPT`_
>
>       
>
>     +Item: ``META``
>
>     +^^^^^^^^^^^^^^
>
>     +
>
>     +Matches an application specific 32 bit metadata item.
>
>     +
>
>     +- Default ``mask`` matches any 32 bit value.
>
>     +
>
>     +.. _table_rte_flow_item_meta:
>
>     +
>
>     +.. table:: META
>
>     +
>
>     +   +----------+----------+---------------------------+
>
>     +   | Field    | Subfield | Value                     |
>
>     +   +==========+==========+===========================+
>
>     +   | ``spec`` | ``data`` | 32 bit metadata value     |
>
>     +   +----------+--------------------------------------+
>
>     +   | ``last`` | ``data`` | upper range value         |
>
>     +   +----------+----------+---------------------------+
>
>     +   | ``mask`` | ``data`` | zeroed to match any value |
>
>     +   +----------+----------+---------------------------+
>
>     +
>
>
> Is there a difference between any metadata value and
> no metadata value at all?
>
> <DP> Value Zero is considered as no metadata value.
>

Not sure that I understand.
Is flow rule with no META item equivalent to flow rule with
META item and mask.data==0?
Flow rule with no META item matches packets with and
without metadata.
Flow rule with META item and mask.data==0 could match
packets with metadata provided and any value, or could
be equivalent to no META item at all.
(I'm asking since no IPv4 item and empty IPv4 item are
different things).

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support metadata as flow rule criteria
  2018-10-17  6:02           ` Andrew Rybchenko
@ 2018-10-17  7:52             ` Dekel Peled
  0 siblings, 0 replies; 48+ messages in thread
From: Dekel Peled @ 2018-10-17  7:52 UTC (permalink / raw)
  To: Andrew Rybchenko, wenzhuo.lu, jingjing.wu, bernard.iremonger,
	olivier.matz, Adrien Mazarguil, Thomas Monjalon, ferruh.yigit
  Cc: Shahaf Shuler, dev, Ori Kam, Nikhil Rao



From: Andrew Rybchenko <arybchenko@solarflare.com>
Sent: Wednesday, October 17, 2018 9:03 AM
To: Dekel Peled <dekelp@mellanox.com>; wenzhuo.lu@intel.com; jingjing.wu@intel.com; bernard.iremonger@intel.com; olivier.matz@6wind.com; Adrien Mazarguil <adrien.mazarguil@6wind.com>; Thomas Monjalon <thomas@monjalon.net>; ferruh.yigit@intel.com
Cc: Shahaf Shuler <shahafs@mellanox.com>; dev@dpdk.org; Ori Kam <orika@mellanox.com>; Nikhil Rao <nikhil.rao@intel.com>
Subject: Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support metadata as flow rule criteria

On 10/17/18 8:27 AM, Dekel Peled wrote:
Thanks, PSB.

From: Andrew Rybchenko <arybchenko@solarflare.com><mailto:arybchenko@solarflare.com>
Sent: Tuesday, October 16, 2018 5:12 PM
To: Dekel Peled <dekelp@mellanox.com><mailto:dekelp@mellanox.com>; wenzhuo.lu@intel.com<mailto:wenzhuo.lu@intel.com>; jingjing.wu@intel.com<mailto:jingjing.wu@intel.com>; bernard.iremonger@intel.com<mailto:bernard.iremonger@intel.com>; olivier.matz@6wind.com<mailto:olivier.matz@6wind.com>; Adrien Mazarguil <adrien.mazarguil@6wind.com><mailto:adrien.mazarguil@6wind.com>; Thomas Monjalon <thomas@monjalon.net><mailto:thomas@monjalon.net>; ferruh.yigit@intel.com<mailto:ferruh.yigit@intel.com>
Cc: Shahaf Shuler <shahafs@mellanox.com><mailto:shahafs@mellanox.com>; dev@dpdk.org<mailto:dev@dpdk.org>; Ori Kam <orika@mellanox.com><mailto:orika@mellanox.com>; Nikhil Rao <nikhil.rao@intel.com><mailto:nikhil.rao@intel.com>
Subject: Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support metadata as flow rule criteria

On 10/11/18 1:49 PM, Dekel Peled wrote:

As described in [1], a new rte_flow item is added to support metadata

to use as flow rule match pattern.

The metadata is an opaque item, fully controlled by the application.



The use of metadata is relevant for egress rules only.

It can be set in the flow rule using the RTE_FLOW_ITEM_META.



An additional item 'tx_metadata' is added in union with existing member

'hash' of struct 'rte_mbuf'.

It is used to carry the metadata item.

Currently this union is used only for ingress packets, so using it for

egress metadata will not cause conflicts.



Application should set the packet metadata in the mbuf dedicated field,

and set the PKT_TX_METADATA flag in the mbuf->ol_flags.

The NIC will use the packet metadata as match criteria for relevant

flow rules.



This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,

along with corresponding struct rte_flow_item_meta and ol_flag

PKT_TX_METADATA.



[1] "[RFC,v2] ethdev: support metadata as flow rule criteria"



Signed-off-by: Dekel Peled <dekelp@mellanox.com><mailto:dekelp@mellanox.com>

[...]




diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst

index b600b2d..8643722 100644

--- a/doc/guides/prog_guide/rte_flow.rst

+++ b/doc/guides/prog_guide/rte_flow.rst

@@ -1191,6 +1191,27 @@ Normally preceded by any of:

 - `Item: ICMP6_ND_NS`_

 - `Item: ICMP6_ND_OPT`_



+Item: ``META``

+^^^^^^^^^^^^^^

+

+Matches an application specific 32 bit metadata item.

+

+- Default ``mask`` matches any 32 bit value.

+

+.. _table_rte_flow_item_meta:

+

+.. table:: META

+

+   +----------+----------+---------------------------+

+   | Field    | Subfield | Value                     |

+   +==========+==========+===========================+

+   | ``spec`` | ``data`` | 32 bit metadata value     |

+   +----------+--------------------------------------+

+   | ``last`` | ``data`` | upper range value         |

+   +----------+----------+---------------------------+

+   | ``mask`` | ``data`` | zeroed to match any value |

+   +----------+----------+---------------------------+

+

Is there a difference between any metadata value and
no metadata value at all?



<DP> Value Zero is considered as no metadata value.

Not sure that I understand.
Is flow rule with no META item equivalent to flow rule with
META item and mask.data==0?
Flow rule with no META item matches packets with and
without metadata.
Flow rule with META item and mask.data==0 could match
packets with metadata provided and any value, or could
be equivalent to no META item at all.
(I'm asking since no IPv4 item and empty IPv4 item are
different things).
<DP> mask is not relevant for this item.
I will rephrase the text:
Item: ``META``
^^^^^^^^^^^^^^
Matches an application specific 32 bit metadata item.
- Default ``mask`` matches the specified metadata value.
.. _table_rte_flow_item_meta:
.. table:: META
   +----------+----------+--------------------------------------+
   | Field    | Subfield | Value                                |   +==========+==========+=======================================+
   | ``spec`` | ``data`` | 32 bit metadata value                |
   +----------+-------------------------------------------------+
   | ``last`` | ``data`` | upper range value                    |
   +----------+----------+--------------------------------------+
   | ``mask`` | ``data`` | ignored, default mask matches "spec" |
   +----------+----------+--------------------------------------+


^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v5 0/3] support metadata as flow rule criteria
  2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 " Dekel Peled
  2018-10-16  8:42       ` Shahaf Shuler
@ 2018-10-17 12:03       ` Dekel Peled
  2018-10-21 14:22         ` [dpdk-dev] [PATCH v6 0/2] " Dekel Peled
                           ` (2 more replies)
  2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
                         ` (2 subsequent siblings)
  4 siblings, 3 replies; 48+ messages in thread
From: Dekel Peled @ 2018-10-17 12:03 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, dev, orika

This series implements the match-metadata feature described in [1].

[1] "[RFC v2] ethdev: support metadata as flow rule criteria"
	http://mails.dpdk.org/archives/dev/2018-August/110194.html
	
---	
v5:
Apply code review comments:
* Update mbuf comments for clarity .
* Update feature description in programmer guide.

v4:
Apply code review comments:
* Change location of metadata item in mbuf.
* Update debug commands.

v3:
* Add link to RFC email.
* Add cover letter subject line.

v2:
* Fix some checkpatch coding style issues (wrongly sent).
---	

Dekel Peled (3):
  ethdev: support metadata as flow rule criteria
  app/testpmd: support metadata as flow rule item
  app/testpmd: add Tx metadata debug commands

 app/test-pmd/cmdline.c                      | 114 ++++++++++++++++++++++++++--
 app/test-pmd/cmdline_flow.c                 |  25 ++++++
 app/test-pmd/testpmd.c                      |   5 ++
 app/test-pmd/testpmd.h                      |   2 +
 app/test-pmd/txonly.c                       |   9 +++
 doc/guides/prog_guide/rte_flow.rst          |  21 +++++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  13 +++-
 lib/librte_ethdev/rte_ethdev.c              |   1 +
 lib/librte_ethdev/rte_ethdev.h              |   5 ++
 lib/librte_ethdev/rte_flow.c                |   1 +
 lib/librte_ethdev/rte_flow.h                |  24 ++++++
 lib/librte_mbuf/rte_mbuf.c                  |   2 +
 lib/librte_mbuf/rte_mbuf.h                  |  68 +++++++++++------
 13 files changed, 261 insertions(+), 29 deletions(-)

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v5 1/3] ethdev: support metadata as flow rule criteria
  2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 " Dekel Peled
  2018-10-16  8:42       ` Shahaf Shuler
  2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 0/3] support metadata " Dekel Peled
@ 2018-10-17 12:03       ` Dekel Peled
  2018-10-17 14:04         ` Andrew Rybchenko
  2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 2/3] app/testpmd: support metadata as flow rule item Dekel Peled
  2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 3/3] app/testpmd: add Tx metadata debug commands Dekel Peled
  4 siblings, 1 reply; 48+ messages in thread
From: Dekel Peled @ 2018-10-17 12:03 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, dev, orika

As described in [1], a new rte_flow item is added to support metadata
to use as flow rule match pattern.
The metadata is an opaque item, fully controlled by the application.

The use of metadata is relevant for egress rules only.
It can be set in the flow rule using the RTE_FLOW_ITEM_META.

An additional member 'tx_metadata' is added in union with existing member
'hash' of struct 'rte_mbuf', located to avoid conflicts with existing
fields. This additional member is used to carry the metadata item.

Application should set the packet metadata in the mbuf dedicated field,
and set the PKT_TX_METADATA flag in the mbuf->ol_flags.
The NIC will use the packet metadata as match criteria for relevant
flow rules.

This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,
along with corresponding struct rte_flow_item_meta and ol_flag
PKT_TX_METADATA.

[1] "[RFC,v2] ethdev: support metadata as flow rule criteria"

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
 doc/guides/prog_guide/rte_flow.rst | 21 ++++++++++++
 lib/librte_ethdev/rte_ethdev.c     |  1 +
 lib/librte_ethdev/rte_ethdev.h     |  5 +++
 lib/librte_ethdev/rte_flow.c       |  1 +
 lib/librte_ethdev/rte_flow.h       | 24 ++++++++++++++
 lib/librte_mbuf/rte_mbuf.c         |  2 ++
 lib/librte_mbuf/rte_mbuf.h         | 68 +++++++++++++++++++++++++-------------
 7 files changed, 99 insertions(+), 23 deletions(-)

diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
index 647e938..17470ad 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -1191,6 +1191,27 @@ Normally preceded by any of:
 - `Item: ICMP6_ND_NS`_
 - `Item: ICMP6_ND_OPT`_
 
+Item: ``META``
+^^^^^^^^^^^^^^
+
+Matches an application specific 32 bit metadata item.
+
+- Default ``mask`` matches the specified metadata value.
+
+.. _table_rte_flow_item_meta:
+
+.. table:: META
+
+   +----------+----------+-----------------------+
+   | Field    | Subfield | Value                 |
+   +==========+==========+=======================+
+   | ``spec`` | ``data`` | 32 bit metadata value |
+   +----------+----------------------------------+
+   | ``last`` | ``data`` | ignored               |
+   +----------+----------+-----------------------+
+   | ``mask`` | ``data`` | ignored               |
+   +----------+----------+-----------------------+
+
 Actions
 ~~~~~~~
 
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index 21f1dfb..2a660ce 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -160,6 +160,7 @@ struct rte_eth_xstats_name_off {
 	RTE_TX_OFFLOAD_BIT2STR(UDP_TNL_TSO),
 	RTE_TX_OFFLOAD_BIT2STR(IP_TNL_TSO),
 	RTE_TX_OFFLOAD_BIT2STR(OUTER_UDP_CKSUM),
+	RTE_TX_OFFLOAD_BIT2STR(MATCH_METADATA),
 };
 
 #undef RTE_TX_OFFLOAD_BIT2STR
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index fb40c89..94e9619 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -946,6 +946,11 @@ struct rte_eth_conf {
 #define DEV_TX_OFFLOAD_IP_TNL_TSO       0x00080000
 /** Device supports outer UDP checksum */
 #define DEV_TX_OFFLOAD_OUTER_UDP_CKSUM  0x00100000
+/**
+ * Device supports match on metadata Tx offload..
+ * Application must set PKT_TX_METADATA and mbuf metadata field.
+ */
+#define DEV_TX_OFFLOAD_MATCH_METADATA   0x00200000
 
 #define RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP 0x00000001
 /**< Device supports Rx queue setup after device started*/
diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c
index 1e5cd73..35be710 100644
--- a/lib/librte_ethdev/rte_flow.c
+++ b/lib/librte_ethdev/rte_flow.c
@@ -73,6 +73,7 @@ struct rte_flow_desc_data {
 	MK_FLOW_ITEM(ICMP6_ND_OPT_TLA_ETH,
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
 	MK_FLOW_ITEM(MARK, sizeof(struct rte_flow_item_mark)),
+	MK_FLOW_ITEM(META, sizeof(struct rte_flow_item_meta)),
 };
 
 /** Generate flow_action[] entry. */
diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
index 3ae9de3..d103472 100644
--- a/lib/librte_ethdev/rte_flow.h
+++ b/lib/librte_ethdev/rte_flow.h
@@ -414,6 +414,14 @@ enum rte_flow_item_type {
 	 * See struct rte_flow_item_mark.
 	 */
 	RTE_FLOW_ITEM_TYPE_MARK,
+
+	/**
+	 * [META]
+	 *
+	 * Matches a metadata value specified in mbuf metadata field.
+	 * See struct rte_flow_item_meta.
+	 */
+	RTE_FLOW_ITEM_TYPE_META,
 };
 
 /**
@@ -1157,6 +1165,22 @@ struct rte_flow_item_icmp6_nd_opt_tla_eth {
 #endif
 
 /**
+ * RTE_FLOW_ITEM_TYPE_META.
+ *
+ * Matches a specified metadata value.
+ */
+struct rte_flow_item_meta {
+	uint32_t data;
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_META. */
+#ifndef __cplusplus
+static const struct rte_flow_item_meta rte_flow_item_meta_mask = {
+	.data = RTE_BE32(UINT32_MAX),
+};
+#endif
+
+/**
  * @warning
  * @b EXPERIMENTAL: this structure may change without prior notice
  *
diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
index 5297beb..5baa1ea 100644
--- a/lib/librte_mbuf/rte_mbuf.c
+++ b/lib/librte_mbuf/rte_mbuf.c
@@ -408,6 +408,7 @@ const char *rte_get_tx_ol_flag_name(uint64_t mask)
 	case PKT_TX_TUNNEL_UDP: return "PKT_TX_TUNNEL_UDP";
 	case PKT_TX_MACSEC: return "PKT_TX_MACSEC";
 	case PKT_TX_SEC_OFFLOAD: return "PKT_TX_SEC_OFFLOAD";
+	case PKT_TX_METADATA: return "PKT_TX_METADATA";
 	default: return NULL;
 	}
 }
@@ -449,6 +450,7 @@ const char *rte_get_tx_ol_flag_name(uint64_t mask)
 		{ PKT_TX_MACSEC, PKT_TX_MACSEC, NULL },
 		{ PKT_TX_SEC_OFFLOAD, PKT_TX_SEC_OFFLOAD, NULL },
 		{ PKT_TX_OUTER_UDP_CKSUM, PKT_TX_OUTER_UDP_CKSUM, NULL },
+		{ PKT_TX_METADATA, PKT_TX_METADATA, NULL },
 	};
 	const char *name;
 	unsigned int i;
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index 61f0f1c..3dbc669 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -202,6 +202,11 @@
 /* add new TX flags here */
 
 /**
+ * Indicate that the metadata field in the mbuf is in use.
+ */
+#define PKT_TX_METADATA	(1ULL << 40)
+
+/**
  * Outer UDP checksum offload flag. This flag is used for enabling
  * outer UDP checksum in PMD. To use outer UDP checksum, the user needs to
  * 1) Enable the following in mbuff,
@@ -378,9 +383,10 @@
 		PKT_TX_QINQ_PKT |        \
 		PKT_TX_TUNNEL_MASK |	 \
 		PKT_TX_MACSEC |		 \
-		PKT_TX_SEC_OFFLOAD |	\
-		PKT_TX_UDP_SEG |	\
-		PKT_TX_OUTER_UDP_CKSUM)
+		PKT_TX_SEC_OFFLOAD |	 \
+		PKT_TX_UDP_SEG |	 \
+		PKT_TX_OUTER_UDP_CKSUM | \
+		PKT_TX_METADATA)
 
 /**
  * Mbuf having an external buffer attached. shinfo in mbuf must be filled.
@@ -550,31 +556,47 @@ struct rte_mbuf {
 	/** VLAN TCI (CPU order), valid if PKT_RX_VLAN is set. */
 	uint16_t vlan_tci;
 
+	RTE_STD_C11
 	union {
-		uint32_t rss;     /**< RSS hash result if RSS enabled */
-		struct {
-			RTE_STD_C11
-			union {
-				struct {
-					uint16_t hash;
-					uint16_t id;
+		union {
+			uint32_t rss;     /**< RSS hash result if RSS enabled */
+			struct {
+				union {
+					struct {
+						uint16_t hash;
+						uint16_t id;
+					};
+					uint32_t lo;
+					/**< Second 4 flexible bytes */
 				};
+				uint32_t hi;
+				/**< First 4 flexible bytes or FD ID, dependent
+				 * on PKT_RX_FDIR_* flag in ol_flags.
+				 */
+			} fdir;	/**< Filter identifier if FDIR enabled */
+			struct {
 				uint32_t lo;
-				/**< Second 4 flexible bytes */
-			};
-			uint32_t hi;
-			/**< First 4 flexible bytes or FD ID, dependent on
-			     PKT_RX_FDIR_* flag in ol_flags. */
-		} fdir;           /**< Filter identifier if FDIR enabled */
+				uint32_t hi;
+				/**< The event eth Tx adapter uses this field
+				 * to store Tx queue id.
+				 * @see rte_event_eth_tx_adapter_txq_set()
+				 */
+			} sched;          /**< Hierarchical scheduler */
+			/**< User defined tags. See rte_distributor_process() */
+			uint32_t usr;
+		} hash;                   /**< hash information */
 		struct {
-			uint32_t lo;
-			uint32_t hi;
-			/**< The event eth Tx adapter uses this field to store
-			 * Tx queue id. @see rte_event_eth_tx_adapter_txq_set()
+			/**
+			 * Application specific metadata value
+			 * for egress flow rule match.
+			 * Valid if PKT_TX_METADATA is set.
+			 * Located here to allow conjunct use
+			 * with hash.sched.hi.
 			 */
-		} sched;          /**< Hierarchical scheduler */
-		uint32_t usr;	  /**< User defined tags. See rte_distributor_process() */
-	} hash;                   /**< hash information */
+			uint32_t tx_metadata;
+			uint32_t reserved;
+		};
+	};
 
 	/** Outer VLAN TCI (CPU order), valid if PKT_RX_QINQ is set. */
 	uint16_t vlan_tci_outer;
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v5 2/3] app/testpmd: support metadata as flow rule item
  2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 " Dekel Peled
                         ` (2 preceding siblings ...)
  2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
@ 2018-10-17 12:03       ` Dekel Peled
  2018-10-18 12:26         ` Ori Kam
  2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 3/3] app/testpmd: add Tx metadata debug commands Dekel Peled
  4 siblings, 1 reply; 48+ messages in thread
From: Dekel Peled @ 2018-10-17 12:03 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, dev, orika

As described in [1], this series adds option to set metadata value
as match pattern when creating a new flow rule.

This patch introduces additional options in testpmd commands.
New item type "meta" "data", new offload flag "match_metadata".

[1] "ethdev: support metadata as flow rule criteria"

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
 app/test-pmd/cmdline.c                      | 10 +++++-----
 app/test-pmd/cmdline_flow.c                 | 25 +++++++++++++++++++++++++
 app/test-pmd/testpmd.c                      |  4 ++++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  6 +++++-
 4 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 6e14345..28bbd80 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -18124,7 +18124,8 @@ struct cmd_config_per_port_tx_offload_result {
 			  "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
 			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
 			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
-			  "mt_lockfree#multi_segs#mbuf_fast_free#security");
+			  "mt_lockfree#multi_segs#mbuf_fast_free#security#"
+			  "match_metadata");
 cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_on_off =
 	TOKEN_STRING_INITIALIZER
 		(struct cmd_config_per_port_tx_offload_result,
@@ -18205,8 +18206,8 @@ struct cmd_config_per_port_tx_offload_result {
 		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
 		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
 		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
-		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
-		    "on|off",
+		    "mt_lockfree|multi_segs|mbuf_fast_free|security|"
+		    "match_metadata on|off",
 	.tokens = {
 		(void *)&cmd_config_per_port_tx_offload_result_port,
 		(void *)&cmd_config_per_port_tx_offload_result_config,
@@ -18309,8 +18310,7 @@ struct cmd_config_per_queue_tx_offload_result {
 		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
 		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
 		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
-		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
-		    "on|off",
+		    "mt_lockfree|multi_segs|mbuf_fast_free|security on|off",
 	.tokens = {
 		(void *)&cmd_config_per_queue_tx_offload_result_port,
 		(void *)&cmd_config_per_queue_tx_offload_result_port_id,
diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index 1c72ad9..7ee9b7c 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -178,6 +178,8 @@ enum index {
 	ITEM_ICMP6_ND_OPT_SLA_ETH_SLA,
 	ITEM_ICMP6_ND_OPT_TLA_ETH,
 	ITEM_ICMP6_ND_OPT_TLA_ETH_TLA,
+	ITEM_META,
+	ITEM_META_DATA,
 
 	/* Validate/create actions. */
 	ACTIONS,
@@ -599,6 +601,7 @@ struct parse_action_priv {
 	ITEM_ICMP6_ND_OPT,
 	ITEM_ICMP6_ND_OPT_SLA_ETH,
 	ITEM_ICMP6_ND_OPT_TLA_ETH,
+	ITEM_META,
 	ZERO,
 };
 
@@ -819,6 +822,12 @@ struct parse_action_priv {
 	ZERO,
 };
 
+static const enum index item_meta[] = {
+	ITEM_META_DATA,
+	ITEM_NEXT,
+	ZERO,
+};
+
 static const enum index next_action[] = {
 	ACTION_END,
 	ACTION_VOID,
@@ -2087,6 +2096,22 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,
 		.args = ARGS(ARGS_ENTRY_HTON
 			     (struct rte_flow_item_icmp6_nd_opt_tla_eth, tla)),
 	},
+	[ITEM_META] = {
+		.name = "meta",
+		.help = "match metadata header",
+		.priv = PRIV_ITEM(META, sizeof(struct rte_flow_item_meta)),
+		.next = NEXT(item_meta),
+		.call = parse_vc,
+	},
+	[ITEM_META_DATA] = {
+		.name = "data",
+		.help = "metadata value",
+		.next = NEXT(item_meta, NEXT_ENTRY(UNSIGNED), item_param),
+		.args = ARGS(ARGS_ENTRY_MASK_HTON(struct rte_flow_item_meta,
+							data,
+							"\xff\xff\xff\xff"
+							"\xff\xff\xff\xff")),
+	},
 
 	/* Validate/create actions. */
 	[ACTIONS] = {
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index d550bda..75e960a 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1060,6 +1060,10 @@ struct extmem_param {
 		      DEV_TX_OFFLOAD_MBUF_FAST_FREE))
 			port->dev_conf.txmode.offloads &=
 				~DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+		if (!(port->dev_info.tx_offload_capa &
+			DEV_TX_OFFLOAD_MATCH_METADATA))
+			port->dev_conf.txmode.offloads &=
+				~DEV_TX_OFFLOAD_MATCH_METADATA;
 		if (numa_support) {
 			if (port_numa[pid] != NUMA_NO_CONFIG)
 				port_per_socket[port_numa[pid]]++;
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 8d60bf0..c97f26b 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -3671,11 +3671,15 @@ This section lists supported pattern items and their attributes, if any.
 
   - ``sla {MAC-48}``: source Ethernet LLA.
 
-- ``icmp6_nd_opt_sla_eth``: match ICMPv6 neighbor discovery target Ethernet
+- ``icmp6_nd_opt_tla_eth``: match ICMPv6 neighbor discovery target Ethernet
   link-layer address option.
 
   - ``tla {MAC-48}``: target Ethernet LLA.
 
+- ``meta``: match application specific metadata.
+
+  - ``data``: metadata value.
+
 Actions list
 ^^^^^^^^^^^^
 
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v5 3/3] app/testpmd: add Tx metadata debug commands
  2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 " Dekel Peled
                         ` (3 preceding siblings ...)
  2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 2/3] app/testpmd: support metadata as flow rule item Dekel Peled
@ 2018-10-17 12:03       ` Dekel Peled
  2018-10-18  7:56         ` Ferruh Yigit
  4 siblings, 1 reply; 48+ messages in thread
From: Dekel Peled @ 2018-10-17 12:03 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, dev, orika

As described in [1],[2] this series adds option to set metadata value as
match pattern when creating a new flow rule.

This patch introduces code for debug porpuse only.
The new 'config' command takes a 32 bit value and stores it per port:
	port config <port_id> tx_metadata <value>

testpmd will add to any Tx packet sent from this port the metadata
value, and set ol_flags accordingly.

A matching 'show' command is added to read the configured value:
	port config <port_id> tx_metadata <value>

[1] "ethdev: support metadata as flow rule criteria"
[2] "app/testpmd: support metadata as flow rule criteria"

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
 app/test-pmd/cmdline.c                      | 104 ++++++++++++++++++++++++++++
 app/test-pmd/testpmd.c                      |   1 +
 app/test-pmd/testpmd.h                      |   2 +
 app/test-pmd/txonly.c                       |   9 +++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |   7 ++
 5 files changed, 123 insertions(+)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 28bbd80..fe8d3e0 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -18323,6 +18323,108 @@ struct cmd_config_per_queue_tx_offload_result {
 	}
 };
 
+/* *** configure tx_metadata for specific port *** */
+struct cmd_config_tx_metadata_specific_result {
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t keyword;
+	uint16_t port_id;
+	cmdline_fixed_string_t item;
+	uint32_t value;
+};
+
+static void
+cmd_config_tx_metadata_specific_parsed(void *parsed_result,
+				__attribute__((unused)) struct cmdline *cl,
+				__attribute__((unused)) void *data)
+{
+	struct cmd_config_tx_metadata_specific_result *res = parsed_result;
+
+	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+		return;
+	ports[res->port_id].tx_metadata = res->value;
+}
+
+cmdline_parse_token_string_t cmd_config_tx_metadata_specific_port =
+	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
+			port, "port");
+cmdline_parse_token_string_t cmd_config_tx_metadata_specific_keyword =
+	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
+			keyword, "config");
+cmdline_parse_token_num_t cmd_config_tx_metadata_specific_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
+			port_id, UINT16);
+cmdline_parse_token_string_t cmd_config_tx_metadata_specific_item =
+	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
+			item, "tx_metadata");
+cmdline_parse_token_num_t cmd_config_tx_metadata_specific_value =
+	TOKEN_NUM_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
+			value, UINT32);
+
+cmdline_parse_inst_t cmd_config_tx_metadata_specific = {
+	.f = cmd_config_tx_metadata_specific_parsed,
+	.data = NULL,
+	.help_str = "port config <port_id> tx_metadata <value>",
+	.tokens = {
+		(void *)&cmd_config_tx_metadata_specific_port,
+		(void *)&cmd_config_tx_metadata_specific_keyword,
+		(void *)&cmd_config_tx_metadata_specific_id,
+		(void *)&cmd_config_tx_metadata_specific_item,
+		(void *)&cmd_config_tx_metadata_specific_value,
+		NULL,
+	},
+};
+
+/* *** display tx_metadata per port configuration *** */
+struct cmd_show_tx_metadata_result {
+	cmdline_fixed_string_t cmd_show;
+	cmdline_fixed_string_t cmd_port;
+	cmdline_fixed_string_t cmd_keyword;
+	portid_t cmd_pid;
+};
+
+static void
+cmd_show_tx_metadata_parsed(void *parsed_result,
+		__attribute__((unused)) struct cmdline *cl,
+		__attribute__((unused)) void *data)
+{
+	struct cmd_show_tx_metadata_result *res = parsed_result;
+
+	if (!rte_eth_dev_is_valid_port(res->cmd_pid)) {
+		printf("invalid port id %u\n", res->cmd_pid);
+		return;
+	}
+	if (!strcmp(res->cmd_keyword, "tx_metadata")) {
+		printf("Port %u tx_metadata: %u\n", res->cmd_pid,
+				ports[res->cmd_pid].tx_metadata);
+	}
+}
+
+cmdline_parse_token_string_t cmd_show_tx_metadata_show =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result,
+			cmd_show, "show");
+cmdline_parse_token_string_t cmd_show_tx_metadata_port =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result,
+			cmd_port, "port");
+cmdline_parse_token_num_t cmd_show_tx_metadata_pid =
+	TOKEN_NUM_INITIALIZER(struct cmd_show_tx_metadata_result,
+			cmd_pid, UINT16);
+cmdline_parse_token_string_t cmd_show_tx_metadata_keyword =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result,
+			cmd_keyword, "tx_metadata");
+
+cmdline_parse_inst_t cmd_show_tx_metadata = {
+	.f = cmd_show_tx_metadata_parsed,
+	.data = NULL,
+	.help_str = "show port <port_id> tx_metadata",
+	.tokens = {
+		(void *)&cmd_show_tx_metadata_show,
+		(void *)&cmd_show_tx_metadata_port,
+		(void *)&cmd_show_tx_metadata_pid,
+		(void *)&cmd_show_tx_metadata_keyword,
+		NULL,
+	},
+};
+
 /* ******************************************************************************** */
 
 /* list of instructions */
@@ -18604,6 +18706,8 @@ struct cmd_config_per_queue_tx_offload_result {
 	(cmdline_parse_inst_t *)&cmd_operate_bpf_ld_parse,
 	(cmdline_parse_inst_t *)&cmd_operate_bpf_unld_parse,
 #endif
+	(cmdline_parse_inst_t *)&cmd_config_tx_metadata_specific,
+	(cmdline_parse_inst_t *)&cmd_show_tx_metadata,
 	NULL,
 };
 
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 75e960a..c7ae676 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1089,6 +1089,7 @@ struct extmem_param {
 		/* set flag to initialize port/queue */
 		port->need_reconfig = 1;
 		port->need_reconfig_queues = 1;
+		port->tx_metadata = 0;
 	}
 
 	/*
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 0738105..9d30397 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -194,6 +194,8 @@ struct rte_port {
 #ifdef SOFTNIC
 	struct softnic_port     softport;  /**< softnic params */
 #endif
+	/**< metadata value to add in Tx packets (debug only). */
+	uint32_t                tx_metadata;
 };
 
 /**
diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
index 1f08b6e..fae84ca 100644
--- a/app/test-pmd/txonly.c
+++ b/app/test-pmd/txonly.c
@@ -253,6 +253,15 @@
 		pkt->l2_len = sizeof(struct ether_hdr);
 		pkt->l3_len = sizeof(struct ipv4_hdr);
 		pkts_burst[nb_pkt] = pkt;
+
+		/*
+		 * If user configured metadata value add it to packet
+		 * and set ol_flags accordingly
+		 */
+		if (ports[fs->tx_port].tx_metadata) {
+			pkt->tx_metadata = ports[fs->tx_port].tx_metadata;
+			pkt->ol_flags |= PKT_TX_METADATA;
+		}
 	}
 	nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_pkt);
 	/*
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index c97f26b..a2f86bb 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -857,6 +857,13 @@ Disable hardware insertion of a VLAN header in packets sent on a port::
 
    testpmd> tx_vlan reset (port_id)
 
+tx_metadata set
+~~~~~~~~~~~~~~~
+
+Set metadata value to insert in packets sent to PMD::
+
+   testpmd> tx_metadata set (port_id) (value)
+
 csum set
 ~~~~~~~~
 
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v5 1/3] ethdev: support metadata as flow rule criteria
  2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
@ 2018-10-17 14:04         ` Andrew Rybchenko
  0 siblings, 0 replies; 48+ messages in thread
From: Andrew Rybchenko @ 2018-10-17 14:04 UTC (permalink / raw)
  To: Dekel Peled, wenzhuo.lu, jingjing.wu, bernard.iremonger,
	olivier.matz, adrien.mazarguil, thomas, ferruh.yigit
  Cc: shahafs, dev, orika

On 10/17/18 3:03 PM, Dekel Peled wrote:
> As described in [1], a new rte_flow item is added to support metadata
> to use as flow rule match pattern.
> The metadata is an opaque item, fully controlled by the application.
>
> The use of metadata is relevant for egress rules only.
> It can be set in the flow rule using the RTE_FLOW_ITEM_META.
>
> An additional member 'tx_metadata' is added in union with existing member
> 'hash' of struct 'rte_mbuf', located to avoid conflicts with existing
> fields. This additional member is used to carry the metadata item.
>
> Application should set the packet metadata in the mbuf dedicated field,
> and set the PKT_TX_METADATA flag in the mbuf->ol_flags.
> The NIC will use the packet metadata as match criteria for relevant
> flow rules.
>
> This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,
> along with corresponding struct rte_flow_item_meta and ol_flag
> PKT_TX_METADATA.
>
> [1] "[RFC,v2] ethdev: support metadata as flow rule criteria"
>
> Signed-off-by: Dekel Peled <dekelp@mellanox.com>

Acked-by: Andrew Rybchenko <arybchenko@solarflare.com>

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v5 3/3] app/testpmd: add Tx metadata debug commands
  2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 3/3] app/testpmd: add Tx metadata debug commands Dekel Peled
@ 2018-10-18  7:56         ` Ferruh Yigit
  2018-10-18  8:30           ` Dekel Peled
  0 siblings, 1 reply; 48+ messages in thread
From: Ferruh Yigit @ 2018-10-18  7:56 UTC (permalink / raw)
  To: Dekel Peled, wenzhuo.lu, jingjing.wu, bernard.iremonger,
	olivier.matz, adrien.mazarguil, thomas, arybchenko
  Cc: shahafs, dev, orika

On 10/17/2018 1:03 PM, Dekel Peled wrote:
> As described in [1],[2] this series adds option to set metadata value as
> match pattern when creating a new flow rule.
> 
> This patch introduces code for debug porpuse only.
> The new 'config' command takes a 32 bit value and stores it per port:
> 	port config <port_id> tx_metadata <value>
> 
> testpmd will add to any Tx packet sent from this port the metadata
> value, and set ol_flags accordingly.
> 
> A matching 'show' command is added to read the configured value:
> 	port config <port_id> tx_metadata <value>
> 
> [1] "ethdev: support metadata as flow rule criteria"
> [2] "app/testpmd: support metadata as flow rule criteria"
> 
> Signed-off-by: Dekel Peled <dekelp@mellanox.com>

<...>

> @@ -857,6 +857,13 @@ Disable hardware insertion of a VLAN header in packets sent on a port::
>  
>     testpmd> tx_vlan reset (port_id)
>  
> +tx_metadata set
> +~~~~~~~~~~~~~~~
> +
> +Set metadata value to insert in packets sent to PMD::
> +
> +   testpmd> tx_metadata set (port_id) (value)
> +

Documentation is wrong, also show part is missing, can you please update it?

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v5 3/3] app/testpmd: add Tx metadata debug commands
  2018-10-18  7:56         ` Ferruh Yigit
@ 2018-10-18  8:30           ` Dekel Peled
  0 siblings, 0 replies; 48+ messages in thread
From: Dekel Peled @ 2018-10-18  8:30 UTC (permalink / raw)
  To: Ferruh Yigit, wenzhuo.lu, jingjing.wu, bernard.iremonger,
	olivier.matz, Adrien Mazarguil, Thomas Monjalon, arybchenko
  Cc: Shahaf Shuler, dev, Ori Kam

Thanks, PSB.

> -----Original Message-----
> From: Ferruh Yigit <ferruh.yigit@intel.com>
> Sent: Thursday, October 18, 2018 10:57 AM
> To: Dekel Peled <dekelp@mellanox.com>; wenzhuo.lu@intel.com;
> jingjing.wu@intel.com; bernard.iremonger@intel.com;
> olivier.matz@6wind.com; Adrien Mazarguil <adrien.mazarguil@6wind.com>;
> Thomas Monjalon <thomas@monjalon.net>; arybchenko@solarflare.com
> Cc: Shahaf Shuler <shahafs@mellanox.com>; dev@dpdk.org; Ori Kam
> <orika@mellanox.com>
> Subject: Re: [PATCH v5 3/3] app/testpmd: add Tx metadata debug
> commands
> 
> On 10/17/2018 1:03 PM, Dekel Peled wrote:
> > As described in [1],[2] this series adds option to set metadata value
> > as match pattern when creating a new flow rule.
> >
> > This patch introduces code for debug porpuse only.
> > The new 'config' command takes a 32 bit value and stores it per port:
> > 	port config <port_id> tx_metadata <value>
> >
> > testpmd will add to any Tx packet sent from this port the metadata
> > value, and set ol_flags accordingly.
> >
> > A matching 'show' command is added to read the configured value:
> > 	port config <port_id> tx_metadata <value>
> >
> > [1] "ethdev: support metadata as flow rule criteria"
> > [2] "app/testpmd: support metadata as flow rule criteria"
> >
> > Signed-off-by: Dekel Peled <dekelp@mellanox.com>
> 
> <...>
> 
> > @@ -857,6 +857,13 @@ Disable hardware insertion of a VLAN header in
> packets sent on a port::
> >
> >     testpmd> tx_vlan reset (port_id)
> >
> > +tx_metadata set
> > +~~~~~~~~~~~~~~~
> > +
> > +Set metadata value to insert in packets sent to PMD::
> > +
> > +   testpmd> tx_metadata set (port_id) (value)
> > +
> 
> Documentation is wrong, also show part is missing, can you please update it?

My mistake, I will update.


^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v5 2/3] app/testpmd: support metadata as flow rule item
  2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 2/3] app/testpmd: support metadata as flow rule item Dekel Peled
@ 2018-10-18 12:26         ` Ori Kam
  2018-10-21 13:49           ` Dekel Peled
  0 siblings, 1 reply; 48+ messages in thread
From: Ori Kam @ 2018-10-18 12:26 UTC (permalink / raw)
  To: Dekel Peled, wenzhuo.lu, jingjing.wu, bernard.iremonger,
	olivier.matz, Adrien Mazarguil, Thomas Monjalon, ferruh.yigit,
	arybchenko
  Cc: Shahaf Shuler, dev



> -----Original Message-----
> From: dev <dev-bounces@dpdk.org> On Behalf Of Dekel Peled
> Sent: Wednesday, October 17, 2018 3:04 PM
> To: wenzhuo.lu@intel.com; jingjing.wu@intel.com;
> bernard.iremonger@intel.com; olivier.matz@6wind.com; Adrien Mazarguil
> <adrien.mazarguil@6wind.com>; Thomas Monjalon <thomas@monjalon.net>;
> ferruh.yigit@intel.com; arybchenko@solarflare.com
> Cc: Shahaf Shuler <shahafs@mellanox.com>; dev@dpdk.org; Ori Kam
> <orika@mellanox.com>
> Subject: [dpdk-dev] [PATCH v5 2/3] app/testpmd: support metadata as flow rule
> item
> 
> As described in [1], this series adds option to set metadata value
> as match pattern when creating a new flow rule.
> 
> This patch introduces additional options in testpmd commands.
> New item type "meta" "data", new offload flag "match_metadata".
> 
> [1] "ethdev: support metadata as flow rule criteria"
> 
> Signed-off-by: Dekel Peled <dekelp@mellanox.com>
> ---
>  app/test-pmd/cmdline.c                      | 10 +++++-----
>  app/test-pmd/cmdline_flow.c                 | 25 +++++++++++++++++++++++++
>  app/test-pmd/testpmd.c                      |  4 ++++
>  doc/guides/testpmd_app_ug/testpmd_funcs.rst |  6 +++++-
>  4 files changed, 39 insertions(+), 6 deletions(-)
> 
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
> index 6e14345..28bbd80 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -18124,7 +18124,8 @@ struct cmd_config_per_port_tx_offload_result {
>  			  "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
>  			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
>  			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
> -			  "mt_lockfree#multi_segs#mbuf_fast_free#security");
> +			  "mt_lockfree#multi_segs#mbuf_fast_free#security#"
> +			  "match_metadata");
>  cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_on_off
> =
>  	TOKEN_STRING_INITIALIZER
>  		(struct cmd_config_per_port_tx_offload_result,
> @@ -18205,8 +18206,8 @@ struct cmd_config_per_port_tx_offload_result {
>  		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
>  		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
>  		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
> -		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
> -		    "on|off",
> +		    "mt_lockfree|multi_segs|mbuf_fast_free|security|"
> +		    "match_metadata on|off",
>  	.tokens = {
>  		(void *)&cmd_config_per_port_tx_offload_result_port,
>  		(void *)&cmd_config_per_port_tx_offload_result_config,
> @@ -18309,8 +18310,7 @@ struct cmd_config_per_queue_tx_offload_result {
>  		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
>  		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
>  		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
> -		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
> -		    "on|off",
> +		    "mt_lockfree|multi_segs|mbuf_fast_free|security on|off",

Is this relevant for your patch?

>  	.tokens = {
>  		(void *)&cmd_config_per_queue_tx_offload_result_port,
>  		(void *)&cmd_config_per_queue_tx_offload_result_port_id,
> diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
> index 1c72ad9..7ee9b7c 100644
> --- a/app/test-pmd/cmdline_flow.c
> +++ b/app/test-pmd/cmdline_flow.c
> @@ -178,6 +178,8 @@ enum index {
>  	ITEM_ICMP6_ND_OPT_SLA_ETH_SLA,
>  	ITEM_ICMP6_ND_OPT_TLA_ETH,
>  	ITEM_ICMP6_ND_OPT_TLA_ETH_TLA,
> +	ITEM_META,
> +	ITEM_META_DATA,
> 
>  	/* Validate/create actions. */
>  	ACTIONS,
> @@ -599,6 +601,7 @@ struct parse_action_priv {
>  	ITEM_ICMP6_ND_OPT,
>  	ITEM_ICMP6_ND_OPT_SLA_ETH,
>  	ITEM_ICMP6_ND_OPT_TLA_ETH,
> +	ITEM_META,
>  	ZERO,
>  };
> 
> @@ -819,6 +822,12 @@ struct parse_action_priv {
>  	ZERO,
>  };
> 
> +static const enum index item_meta[] = {
> +	ITEM_META_DATA,
> +	ITEM_NEXT,
> +	ZERO,
> +};
> +
>  static const enum index next_action[] = {
>  	ACTION_END,
>  	ACTION_VOID,
> @@ -2087,6 +2096,22 @@ static int comp_vc_action_rss_queue(struct context
> *, const struct token *,
>  		.args = ARGS(ARGS_ENTRY_HTON
>  			     (struct rte_flow_item_icmp6_nd_opt_tla_eth, tla)),
>  	},
> +	[ITEM_META] = {
> +		.name = "meta",
> +		.help = "match metadata header",
> +		.priv = PRIV_ITEM(META, sizeof(struct rte_flow_item_meta)),
> +		.next = NEXT(item_meta),
> +		.call = parse_vc,
> +	},
> +	[ITEM_META_DATA] = {
> +		.name = "data",
> +		.help = "metadata value",
> +		.next = NEXT(item_meta, NEXT_ENTRY(UNSIGNED),
> item_param),

Do you support all the options? (mask, last ...)

> +		.args = ARGS(ARGS_ENTRY_MASK_HTON(struct

This means that the value is in network byte order.

> rte_flow_item_meta,
> +							data,
> +							"\xff\xff\xff\xff"
> +							"\xff\xff\xff\xff")),
> +	},
> 
>  	/* Validate/create actions. */
>  	[ACTIONS] = {
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> index d550bda..75e960a 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -1060,6 +1060,10 @@ struct extmem_param {
>  		      DEV_TX_OFFLOAD_MBUF_FAST_FREE))
>  			port->dev_conf.txmode.offloads &=
>  				~DEV_TX_OFFLOAD_MBUF_FAST_FREE;
> +		if (!(port->dev_info.tx_offload_capa &
> +			DEV_TX_OFFLOAD_MATCH_METADATA))
> +			port->dev_conf.txmode.offloads &=
> +				~DEV_TX_OFFLOAD_MATCH_METADATA;
>  		if (numa_support) {
>  			if (port_numa[pid] != NUMA_NO_CONFIG)
>  				port_per_socket[port_numa[pid]]++;
> diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> index 8d60bf0..c97f26b 100644
> --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> @@ -3671,11 +3671,15 @@ This section lists supported pattern items and their
> attributes, if any.
> 
>    - ``sla {MAC-48}``: source Ethernet LLA.
> 
> -- ``icmp6_nd_opt_sla_eth``: match ICMPv6 neighbor discovery target Ethernet
> +- ``icmp6_nd_opt_tla_eth``: match ICMPv6 neighbor discovery target Ethernet
>    link-layer address option.

Is this relevant to your patch?

> 
>    - ``tla {MAC-48}``: target Ethernet LLA.
> 
> +- ``meta``: match application specific metadata.
> +
> +  - ``data``: metadata value.

Should show what value to add.
Also missing the documentations for enabling the offload.

> +
>  Actions list
>  ^^^^^^^^^^^^
> 
> --
> 1.8.3.1
Thanks,
Ori

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v5 2/3] app/testpmd: support metadata as flow rule item
  2018-10-18 12:26         ` Ori Kam
@ 2018-10-21 13:49           ` Dekel Peled
  0 siblings, 0 replies; 48+ messages in thread
From: Dekel Peled @ 2018-10-21 13:49 UTC (permalink / raw)
  To: Ori Kam, wenzhuo.lu, jingjing.wu, bernard.iremonger,
	olivier.matz, Adrien Mazarguil, Thomas Monjalon, ferruh.yigit,
	arybchenko
  Cc: Shahaf Shuler, dev

Thanks, PSB.

> -----Original Message-----
> From: Ori Kam
> Sent: Thursday, October 18, 2018 3:26 PM
> To: Dekel Peled <dekelp@mellanox.com>; wenzhuo.lu@intel.com;
> jingjing.wu@intel.com; bernard.iremonger@intel.com;
> olivier.matz@6wind.com; Adrien Mazarguil <adrien.mazarguil@6wind.com>;
> Thomas Monjalon <thomas@monjalon.net>; ferruh.yigit@intel.com;
> arybchenko@solarflare.com
> Cc: Shahaf Shuler <shahafs@mellanox.com>; dev@dpdk.org
> Subject: RE: [dpdk-dev] [PATCH v5 2/3] app/testpmd: support metadata as
> flow rule item
> 
> 
> 
> > -----Original Message-----
> > From: dev <dev-bounces@dpdk.org> On Behalf Of Dekel Peled
> > Sent: Wednesday, October 17, 2018 3:04 PM
> > To: wenzhuo.lu@intel.com; jingjing.wu@intel.com;
> > bernard.iremonger@intel.com; olivier.matz@6wind.com; Adrien Mazarguil
> > <adrien.mazarguil@6wind.com>; Thomas Monjalon
> <thomas@monjalon.net>;
> > ferruh.yigit@intel.com; arybchenko@solarflare.com
> > Cc: Shahaf Shuler <shahafs@mellanox.com>; dev@dpdk.org; Ori Kam
> > <orika@mellanox.com>
> > Subject: [dpdk-dev] [PATCH v5 2/3] app/testpmd: support metadata as
> > flow rule item
> >
> > As described in [1], this series adds option to set metadata value as
> > match pattern when creating a new flow rule.
> >
> > This patch introduces additional options in testpmd commands.
> > New item type "meta" "data", new offload flag "match_metadata".
> >
> > [1] "ethdev: support metadata as flow rule criteria"
> >
> > Signed-off-by: Dekel Peled <dekelp@mellanox.com>
> > ---
> >  app/test-pmd/cmdline.c                      | 10 +++++-----
> >  app/test-pmd/cmdline_flow.c                 | 25 +++++++++++++++++++++++++
> >  app/test-pmd/testpmd.c                      |  4 ++++
> >  doc/guides/testpmd_app_ug/testpmd_funcs.rst |  6 +++++-
> >  4 files changed, 39 insertions(+), 6 deletions(-)
> >
> > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
> > 6e14345..28bbd80 100644
> > --- a/app/test-pmd/cmdline.c
> > +++ b/app/test-pmd/cmdline.c
> > @@ -18124,7 +18124,8 @@ struct
> cmd_config_per_port_tx_offload_result {
> >
> "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
> >  			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
> >  			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
> > -
> "mt_lockfree#multi_segs#mbuf_fast_free#security");
> > +
> "mt_lockfree#multi_segs#mbuf_fast_free#security#"
> > +			  "match_metadata");
> >  cmdline_parse_token_string_t
> > cmd_config_per_port_tx_offload_result_on_off
> > =
> >  	TOKEN_STRING_INITIALIZER
> >  		(struct cmd_config_per_port_tx_offload_result,
> > @@ -18205,8 +18206,8 @@ struct
> cmd_config_per_port_tx_offload_result {
> >  		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
> >  		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
> >  		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
> > -		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
> > -		    "on|off",
> > +		    "mt_lockfree|multi_segs|mbuf_fast_free|security|"
> > +		    "match_metadata on|off",
> >  	.tokens = {
> >  		(void *)&cmd_config_per_port_tx_offload_result_port,
> >  		(void *)&cmd_config_per_port_tx_offload_result_config,
> > @@ -18309,8 +18310,7 @@ struct
> cmd_config_per_queue_tx_offload_result {
> >  		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
> >  		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
> >  		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
> > -		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
> > -		    "on|off",
> > +		    "mt_lockfree|multi_segs|mbuf_fast_free|security
> on|off",
> 
> Is this relevant for your patch?

Removed.

> 
> >  	.tokens = {
> >  		(void *)&cmd_config_per_queue_tx_offload_result_port,
> >  		(void *)&cmd_config_per_queue_tx_offload_result_port_id,
> > diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
> > index 1c72ad9..7ee9b7c 100644
> > --- a/app/test-pmd/cmdline_flow.c
> > +++ b/app/test-pmd/cmdline_flow.c
> > @@ -178,6 +178,8 @@ enum index {
> >  	ITEM_ICMP6_ND_OPT_SLA_ETH_SLA,
> >  	ITEM_ICMP6_ND_OPT_TLA_ETH,
> >  	ITEM_ICMP6_ND_OPT_TLA_ETH_TLA,
> > +	ITEM_META,
> > +	ITEM_META_DATA,
> >
> >  	/* Validate/create actions. */
> >  	ACTIONS,
> > @@ -599,6 +601,7 @@ struct parse_action_priv {
> >  	ITEM_ICMP6_ND_OPT,
> >  	ITEM_ICMP6_ND_OPT_SLA_ETH,
> >  	ITEM_ICMP6_ND_OPT_TLA_ETH,
> > +	ITEM_META,
> >  	ZERO,
> >  };
> >
> > @@ -819,6 +822,12 @@ struct parse_action_priv {
> >  	ZERO,
> >  };
> >
> > +static const enum index item_meta[] = {
> > +	ITEM_META_DATA,
> > +	ITEM_NEXT,
> > +	ZERO,
> > +};
> > +
> >  static const enum index next_action[] = {
> >  	ACTION_END,
> >  	ACTION_VOID,
> > @@ -2087,6 +2096,22 @@ static int comp_vc_action_rss_queue(struct
> > context *, const struct token *,
> >  		.args = ARGS(ARGS_ENTRY_HTON
> >  			     (struct rte_flow_item_icmp6_nd_opt_tla_eth,
> tla)),
> >  	},
> > +	[ITEM_META] = {
> > +		.name = "meta",
> > +		.help = "match metadata header",
> > +		.priv = PRIV_ITEM(META, sizeof(struct
> rte_flow_item_meta)),
> > +		.next = NEXT(item_meta),
> > +		.call = parse_vc,
> > +	},
> > +	[ITEM_META_DATA] = {
> > +		.name = "data",
> > +		.help = "metadata value",
> > +		.next = NEXT(item_meta, NEXT_ENTRY(UNSIGNED),
> > item_param),
> 
> Do you support all the options? (mask, last ...)

Changed to provide 'is' option only.

> 
> > +		.args = ARGS(ARGS_ENTRY_MASK_HTON(struct
> 
> This means that the value is in network byte order.

Yes, will note in variables type.

> 
> > rte_flow_item_meta,
> > +							data,
> > +							"\xff\xff\xff\xff"
> > +							"\xff\xff\xff\xff")),
> > +	},
> >
> >  	/* Validate/create actions. */
> >  	[ACTIONS] = {
> > diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
> > d550bda..75e960a 100644
> > --- a/app/test-pmd/testpmd.c
> > +++ b/app/test-pmd/testpmd.c
> > @@ -1060,6 +1060,10 @@ struct extmem_param {
> >  		      DEV_TX_OFFLOAD_MBUF_FAST_FREE))
> >  			port->dev_conf.txmode.offloads &=
> >  				~DEV_TX_OFFLOAD_MBUF_FAST_FREE;
> > +		if (!(port->dev_info.tx_offload_capa &
> > +			DEV_TX_OFFLOAD_MATCH_METADATA))
> > +			port->dev_conf.txmode.offloads &=
> > +				~DEV_TX_OFFLOAD_MATCH_METADATA;
> >  		if (numa_support) {
> >  			if (port_numa[pid] != NUMA_NO_CONFIG)
> >  				port_per_socket[port_numa[pid]]++;
> > diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> > b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> > index 8d60bf0..c97f26b 100644
> > --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> > +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> > @@ -3671,11 +3671,15 @@ This section lists supported pattern items and
> > their attributes, if any.
> >
> >    - ``sla {MAC-48}``: source Ethernet LLA.
> >
> > -- ``icmp6_nd_opt_sla_eth``: match ICMPv6 neighbor discovery target
> > Ethernet
> > +- ``icmp6_nd_opt_tla_eth``: match ICMPv6 neighbor discovery target
> > +Ethernet
> >    link-layer address option.
> 
> Is this relevant to your patch?

Removed.

> 
> >
> >    - ``tla {MAC-48}``: target Ethernet LLA.
> >
> > +- ``meta``: match application specific metadata.
> > +
> > +  - ``data``: metadata value.
> 
> Should show what value to add.
> Also missing the documentations for enabling the offload.

Added.

> 
> > +
> >  Actions list
> >  ^^^^^^^^^^^^
> >
> > --
> > 1.8.3.1
> Thanks,
> Ori

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v6 0/2] support metadata as flow rule criteria
  2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 0/3] support metadata " Dekel Peled
@ 2018-10-21 14:22         ` Dekel Peled
  2018-10-22 16:14           ` Ferruh Yigit
  2018-10-21 14:22         ` [dpdk-dev] [PATCH v6 1/2] ethdev: " Dekel Peled
  2018-10-21 14:22         ` [dpdk-dev] [PATCH v6 2/2] app/testpmd: support metadata as flow rule item Dekel Peled
  2 siblings, 1 reply; 48+ messages in thread
From: Dekel Peled @ 2018-10-21 14:22 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, dev, orika

This series implements the match-metadata feature described in [1].

[1] "[RFC v2] ethdev: support metadata as flow rule criteria"
	http://mails.dpdk.org/archives/dev/2018-August/110194.html
	
---	
v6:
Apply code review comments:
* Squash testpmd patches into single patch.
* Update documentation.
* testpmd support exact metadata value only ('is' option).

v5:
Apply code review comments:
* Update mbuf comments for clarity .
* Update feature description in programmer guide.

v4:
Apply code review comments:
* Change location of metadata item in mbuf.
* Update debug commands.

v3:
* Add link to RFC email.
* Add cover letter subject line.

v2:
* Fix some checkpatch coding style issues (wrongly sent).
---	

Dekel Peled (2):
  ethdev: support metadata as flow rule criteria
  app/testpmd: support metadata as flow rule item

 app/test-pmd/cmdline.c                      | 111 +++++++++++++++++++++++++++-
 app/test-pmd/cmdline_flow.c                 |  28 +++++++
 app/test-pmd/testpmd.c                      |   5 ++
 app/test-pmd/testpmd.h                      |   2 +
 app/test-pmd/txonly.c                       |   9 +++
 doc/guides/prog_guide/rte_flow.rst          |  21 ++++++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  21 +++++-
 lib/librte_ethdev/rte_ethdev.c              |   1 +
 lib/librte_ethdev/rte_ethdev.h              |   5 ++
 lib/librte_ethdev/rte_flow.c                |   1 +
 lib/librte_ethdev/rte_flow.h                |  24 ++++++
 lib/librte_mbuf/rte_mbuf.c                  |   2 +
 lib/librte_mbuf/rte_mbuf.h                  |  68 +++++++++++------
 13 files changed, 271 insertions(+), 27 deletions(-)

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v6 1/2] ethdev: support metadata as flow rule criteria
  2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 0/3] support metadata " Dekel Peled
  2018-10-21 14:22         ` [dpdk-dev] [PATCH v6 0/2] " Dekel Peled
@ 2018-10-21 14:22         ` Dekel Peled
  2018-10-21 14:22         ` [dpdk-dev] [PATCH v6 2/2] app/testpmd: support metadata as flow rule item Dekel Peled
  2 siblings, 0 replies; 48+ messages in thread
From: Dekel Peled @ 2018-10-21 14:22 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, dev, orika

As described in [1], a new rte_flow item is added to support metadata
to use as flow rule match pattern.
The metadata is an opaque item, fully controlled by the application.

The use of metadata is relevant for egress rules only.
It can be set in the flow rule using the RTE_FLOW_ITEM_META.

An additional member 'tx_metadata' is added in union with existing member
'hash' of struct 'rte_mbuf', located to avoid conflicts with existing
fields. This additional member is used to carry the metadata item.

Application should set the packet metadata in the mbuf dedicated field,
and set the PKT_TX_METADATA flag in the mbuf->ol_flags.
The NIC will use the packet metadata as match criteria for relevant
flow rules.

This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META,
along with corresponding struct rte_flow_item_meta and ol_flag
PKT_TX_METADATA.

[1] "[RFC,v2] ethdev: support metadata as flow rule criteria"

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
Acked-by: Andrew Rybchenko <arybchenko@solarflare.com>

---
 doc/guides/prog_guide/rte_flow.rst | 21 ++++++++++++
 lib/librte_ethdev/rte_ethdev.c     |  1 +
 lib/librte_ethdev/rte_ethdev.h     |  5 +++
 lib/librte_ethdev/rte_flow.c       |  1 +
 lib/librte_ethdev/rte_flow.h       | 24 ++++++++++++++
 lib/librte_mbuf/rte_mbuf.c         |  2 ++
 lib/librte_mbuf/rte_mbuf.h         | 68 +++++++++++++++++++++++++-------------
 7 files changed, 99 insertions(+), 23 deletions(-)

diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
index 647e938..17470ad 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -1191,6 +1191,27 @@ Normally preceded by any of:
 - `Item: ICMP6_ND_NS`_
 - `Item: ICMP6_ND_OPT`_
 
+Item: ``META``
+^^^^^^^^^^^^^^
+
+Matches an application specific 32 bit metadata item.
+
+- Default ``mask`` matches the specified metadata value.
+
+.. _table_rte_flow_item_meta:
+
+.. table:: META
+
+   +----------+----------+-----------------------+
+   | Field    | Subfield | Value                 |
+   +==========+==========+=======================+
+   | ``spec`` | ``data`` | 32 bit metadata value |
+   +----------+----------------------------------+
+   | ``last`` | ``data`` | ignored               |
+   +----------+----------+-----------------------+
+   | ``mask`` | ``data`` | ignored               |
+   +----------+----------+-----------------------+
+
 Actions
 ~~~~~~~
 
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index 21f1dfb..2a660ce 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -160,6 +160,7 @@ struct rte_eth_xstats_name_off {
 	RTE_TX_OFFLOAD_BIT2STR(UDP_TNL_TSO),
 	RTE_TX_OFFLOAD_BIT2STR(IP_TNL_TSO),
 	RTE_TX_OFFLOAD_BIT2STR(OUTER_UDP_CKSUM),
+	RTE_TX_OFFLOAD_BIT2STR(MATCH_METADATA),
 };
 
 #undef RTE_TX_OFFLOAD_BIT2STR
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index fb40c89..94e9619 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -946,6 +946,11 @@ struct rte_eth_conf {
 #define DEV_TX_OFFLOAD_IP_TNL_TSO       0x00080000
 /** Device supports outer UDP checksum */
 #define DEV_TX_OFFLOAD_OUTER_UDP_CKSUM  0x00100000
+/**
+ * Device supports match on metadata Tx offload..
+ * Application must set PKT_TX_METADATA and mbuf metadata field.
+ */
+#define DEV_TX_OFFLOAD_MATCH_METADATA   0x00200000
 
 #define RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP 0x00000001
 /**< Device supports Rx queue setup after device started*/
diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c
index 1e5cd73..35be710 100644
--- a/lib/librte_ethdev/rte_flow.c
+++ b/lib/librte_ethdev/rte_flow.c
@@ -73,6 +73,7 @@ struct rte_flow_desc_data {
 	MK_FLOW_ITEM(ICMP6_ND_OPT_TLA_ETH,
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
 	MK_FLOW_ITEM(MARK, sizeof(struct rte_flow_item_mark)),
+	MK_FLOW_ITEM(META, sizeof(struct rte_flow_item_meta)),
 };
 
 /** Generate flow_action[] entry. */
diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
index 3ae9de3..11903a3 100644
--- a/lib/librte_ethdev/rte_flow.h
+++ b/lib/librte_ethdev/rte_flow.h
@@ -414,6 +414,14 @@ enum rte_flow_item_type {
 	 * See struct rte_flow_item_mark.
 	 */
 	RTE_FLOW_ITEM_TYPE_MARK,
+
+	/**
+	 * [META]
+	 *
+	 * Matches a metadata value specified in mbuf metadata field.
+	 * See struct rte_flow_item_meta.
+	 */
+	RTE_FLOW_ITEM_TYPE_META,
 };
 
 /**
@@ -1157,6 +1165,22 @@ struct rte_flow_item_icmp6_nd_opt_tla_eth {
 #endif
 
 /**
+ * RTE_FLOW_ITEM_TYPE_META.
+ *
+ * Matches a specified metadata value.
+ */
+struct rte_flow_item_meta {
+	rte_be32_t data;
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_META. */
+#ifndef __cplusplus
+static const struct rte_flow_item_meta rte_flow_item_meta_mask = {
+	.data = RTE_BE32(UINT32_MAX),
+};
+#endif
+
+/**
  * @warning
  * @b EXPERIMENTAL: this structure may change without prior notice
  *
diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
index 5297beb..5baa1ea 100644
--- a/lib/librte_mbuf/rte_mbuf.c
+++ b/lib/librte_mbuf/rte_mbuf.c
@@ -408,6 +408,7 @@ const char *rte_get_tx_ol_flag_name(uint64_t mask)
 	case PKT_TX_TUNNEL_UDP: return "PKT_TX_TUNNEL_UDP";
 	case PKT_TX_MACSEC: return "PKT_TX_MACSEC";
 	case PKT_TX_SEC_OFFLOAD: return "PKT_TX_SEC_OFFLOAD";
+	case PKT_TX_METADATA: return "PKT_TX_METADATA";
 	default: return NULL;
 	}
 }
@@ -449,6 +450,7 @@ const char *rte_get_tx_ol_flag_name(uint64_t mask)
 		{ PKT_TX_MACSEC, PKT_TX_MACSEC, NULL },
 		{ PKT_TX_SEC_OFFLOAD, PKT_TX_SEC_OFFLOAD, NULL },
 		{ PKT_TX_OUTER_UDP_CKSUM, PKT_TX_OUTER_UDP_CKSUM, NULL },
+		{ PKT_TX_METADATA, PKT_TX_METADATA, NULL },
 	};
 	const char *name;
 	unsigned int i;
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index 61f0f1c..3dbc669 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -202,6 +202,11 @@
 /* add new TX flags here */
 
 /**
+ * Indicate that the metadata field in the mbuf is in use.
+ */
+#define PKT_TX_METADATA	(1ULL << 40)
+
+/**
  * Outer UDP checksum offload flag. This flag is used for enabling
  * outer UDP checksum in PMD. To use outer UDP checksum, the user needs to
  * 1) Enable the following in mbuff,
@@ -378,9 +383,10 @@
 		PKT_TX_QINQ_PKT |        \
 		PKT_TX_TUNNEL_MASK |	 \
 		PKT_TX_MACSEC |		 \
-		PKT_TX_SEC_OFFLOAD |	\
-		PKT_TX_UDP_SEG |	\
-		PKT_TX_OUTER_UDP_CKSUM)
+		PKT_TX_SEC_OFFLOAD |	 \
+		PKT_TX_UDP_SEG |	 \
+		PKT_TX_OUTER_UDP_CKSUM | \
+		PKT_TX_METADATA)
 
 /**
  * Mbuf having an external buffer attached. shinfo in mbuf must be filled.
@@ -550,31 +556,47 @@ struct rte_mbuf {
 	/** VLAN TCI (CPU order), valid if PKT_RX_VLAN is set. */
 	uint16_t vlan_tci;
 
+	RTE_STD_C11
 	union {
-		uint32_t rss;     /**< RSS hash result if RSS enabled */
-		struct {
-			RTE_STD_C11
-			union {
-				struct {
-					uint16_t hash;
-					uint16_t id;
+		union {
+			uint32_t rss;     /**< RSS hash result if RSS enabled */
+			struct {
+				union {
+					struct {
+						uint16_t hash;
+						uint16_t id;
+					};
+					uint32_t lo;
+					/**< Second 4 flexible bytes */
 				};
+				uint32_t hi;
+				/**< First 4 flexible bytes or FD ID, dependent
+				 * on PKT_RX_FDIR_* flag in ol_flags.
+				 */
+			} fdir;	/**< Filter identifier if FDIR enabled */
+			struct {
 				uint32_t lo;
-				/**< Second 4 flexible bytes */
-			};
-			uint32_t hi;
-			/**< First 4 flexible bytes or FD ID, dependent on
-			     PKT_RX_FDIR_* flag in ol_flags. */
-		} fdir;           /**< Filter identifier if FDIR enabled */
+				uint32_t hi;
+				/**< The event eth Tx adapter uses this field
+				 * to store Tx queue id.
+				 * @see rte_event_eth_tx_adapter_txq_set()
+				 */
+			} sched;          /**< Hierarchical scheduler */
+			/**< User defined tags. See rte_distributor_process() */
+			uint32_t usr;
+		} hash;                   /**< hash information */
 		struct {
-			uint32_t lo;
-			uint32_t hi;
-			/**< The event eth Tx adapter uses this field to store
-			 * Tx queue id. @see rte_event_eth_tx_adapter_txq_set()
+			/**
+			 * Application specific metadata value
+			 * for egress flow rule match.
+			 * Valid if PKT_TX_METADATA is set.
+			 * Located here to allow conjunct use
+			 * with hash.sched.hi.
 			 */
-		} sched;          /**< Hierarchical scheduler */
-		uint32_t usr;	  /**< User defined tags. See rte_distributor_process() */
-	} hash;                   /**< hash information */
+			uint32_t tx_metadata;
+			uint32_t reserved;
+		};
+	};
 
 	/** Outer VLAN TCI (CPU order), valid if PKT_RX_QINQ is set. */
 	uint16_t vlan_tci_outer;
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* [dpdk-dev] [PATCH v6 2/2] app/testpmd: support metadata as flow rule item
  2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 0/3] support metadata " Dekel Peled
  2018-10-21 14:22         ` [dpdk-dev] [PATCH v6 0/2] " Dekel Peled
  2018-10-21 14:22         ` [dpdk-dev] [PATCH v6 1/2] ethdev: " Dekel Peled
@ 2018-10-21 14:22         ` Dekel Peled
  2018-10-22 16:13           ` Ferruh Yigit
  2 siblings, 1 reply; 48+ messages in thread
From: Dekel Peled @ 2018-10-21 14:22 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu, bernard.iremonger, olivier.matz,
	adrien.mazarguil, thomas, ferruh.yigit, arybchenko
  Cc: shahafs, dev, orika

As described in [1], this series adds option to set metadata value
as match pattern when creating a new flow rule.

This patch introduces additional options in testpmd commands:
- New item type "meta" "data"
- New per-port offload flag "match_metadata".

It also adds commands to configure the tx_metadata value to use:
- New 'config' command takes a 32 bit value and stores it per port:
	port config <port_id> tx_metadata <value>
  testpmd will add to any Tx packet sent from this port the metadata
  value, and set ol_flags accordingly.
- A matching 'show' command is added to read the configured value:
	port config <port_id> tx_metadata <value>

[1] "ethdev: support metadata as flow rule criteria"

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
 app/test-pmd/cmdline.c                      | 111 +++++++++++++++++++++++++++-
 app/test-pmd/cmdline_flow.c                 |  28 +++++++
 app/test-pmd/testpmd.c                      |   5 ++
 app/test-pmd/testpmd.h                      |   2 +
 app/test-pmd/txonly.c                       |   9 +++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  21 +++++-
 6 files changed, 172 insertions(+), 4 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 6e14345..86088fd 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -18124,7 +18124,8 @@ struct cmd_config_per_port_tx_offload_result {
 			  "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
 			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
 			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
-			  "mt_lockfree#multi_segs#mbuf_fast_free#security");
+			  "mt_lockfree#multi_segs#mbuf_fast_free#security#"
+			  "match_metadata");
 cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_on_off =
 	TOKEN_STRING_INITIALIZER
 		(struct cmd_config_per_port_tx_offload_result,
@@ -18205,8 +18206,8 @@ struct cmd_config_per_port_tx_offload_result {
 		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
 		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
 		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
-		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
-		    "on|off",
+		    "mt_lockfree|multi_segs|mbuf_fast_free|security|"
+		    "match_metadata on|off",
 	.tokens = {
 		(void *)&cmd_config_per_port_tx_offload_result_port,
 		(void *)&cmd_config_per_port_tx_offload_result_config,
@@ -18323,6 +18324,108 @@ struct cmd_config_per_queue_tx_offload_result {
 	}
 };
 
+/* *** configure tx_metadata for specific port *** */
+struct cmd_config_tx_metadata_specific_result {
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t keyword;
+	uint16_t port_id;
+	cmdline_fixed_string_t item;
+	uint32_t value;
+};
+
+static void
+cmd_config_tx_metadata_specific_parsed(void *parsed_result,
+				__attribute__((unused)) struct cmdline *cl,
+				__attribute__((unused)) void *data)
+{
+	struct cmd_config_tx_metadata_specific_result *res = parsed_result;
+
+	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+		return;
+	ports[res->port_id].tx_metadata = rte_cpu_to_be_32(res->value);
+}
+
+cmdline_parse_token_string_t cmd_config_tx_metadata_specific_port =
+	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
+			port, "port");
+cmdline_parse_token_string_t cmd_config_tx_metadata_specific_keyword =
+	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
+			keyword, "config");
+cmdline_parse_token_num_t cmd_config_tx_metadata_specific_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
+			port_id, UINT16);
+cmdline_parse_token_string_t cmd_config_tx_metadata_specific_item =
+	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
+			item, "tx_metadata");
+cmdline_parse_token_num_t cmd_config_tx_metadata_specific_value =
+	TOKEN_NUM_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
+			value, UINT32);
+
+cmdline_parse_inst_t cmd_config_tx_metadata_specific = {
+	.f = cmd_config_tx_metadata_specific_parsed,
+	.data = NULL,
+	.help_str = "port config <port_id> tx_metadata <value>",
+	.tokens = {
+		(void *)&cmd_config_tx_metadata_specific_port,
+		(void *)&cmd_config_tx_metadata_specific_keyword,
+		(void *)&cmd_config_tx_metadata_specific_id,
+		(void *)&cmd_config_tx_metadata_specific_item,
+		(void *)&cmd_config_tx_metadata_specific_value,
+		NULL,
+	},
+};
+
+/* *** display tx_metadata per port configuration *** */
+struct cmd_show_tx_metadata_result {
+	cmdline_fixed_string_t cmd_show;
+	cmdline_fixed_string_t cmd_port;
+	cmdline_fixed_string_t cmd_keyword;
+	portid_t cmd_pid;
+};
+
+static void
+cmd_show_tx_metadata_parsed(void *parsed_result,
+		__attribute__((unused)) struct cmdline *cl,
+		__attribute__((unused)) void *data)
+{
+	struct cmd_show_tx_metadata_result *res = parsed_result;
+
+	if (!rte_eth_dev_is_valid_port(res->cmd_pid)) {
+		printf("invalid port id %u\n", res->cmd_pid);
+		return;
+	}
+	if (!strcmp(res->cmd_keyword, "tx_metadata")) {
+		printf("Port %u tx_metadata: %u\n", res->cmd_pid,
+				ports[res->cmd_pid].tx_metadata);
+	}
+}
+
+cmdline_parse_token_string_t cmd_show_tx_metadata_show =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result,
+			cmd_show, "show");
+cmdline_parse_token_string_t cmd_show_tx_metadata_port =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result,
+			cmd_port, "port");
+cmdline_parse_token_num_t cmd_show_tx_metadata_pid =
+	TOKEN_NUM_INITIALIZER(struct cmd_show_tx_metadata_result,
+			cmd_pid, UINT16);
+cmdline_parse_token_string_t cmd_show_tx_metadata_keyword =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result,
+			cmd_keyword, "tx_metadata");
+
+cmdline_parse_inst_t cmd_show_tx_metadata = {
+	.f = cmd_show_tx_metadata_parsed,
+	.data = NULL,
+	.help_str = "show port <port_id> tx_metadata",
+	.tokens = {
+		(void *)&cmd_show_tx_metadata_show,
+		(void *)&cmd_show_tx_metadata_port,
+		(void *)&cmd_show_tx_metadata_pid,
+		(void *)&cmd_show_tx_metadata_keyword,
+		NULL,
+	},
+};
+
 /* ******************************************************************************** */
 
 /* list of instructions */
@@ -18604,6 +18707,8 @@ struct cmd_config_per_queue_tx_offload_result {
 	(cmdline_parse_inst_t *)&cmd_operate_bpf_ld_parse,
 	(cmdline_parse_inst_t *)&cmd_operate_bpf_unld_parse,
 #endif
+	(cmdline_parse_inst_t *)&cmd_config_tx_metadata_specific,
+	(cmdline_parse_inst_t *)&cmd_show_tx_metadata,
 	NULL,
 };
 
diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index 1c72ad9..0509c18 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -178,6 +178,8 @@ enum index {
 	ITEM_ICMP6_ND_OPT_SLA_ETH_SLA,
 	ITEM_ICMP6_ND_OPT_TLA_ETH,
 	ITEM_ICMP6_ND_OPT_TLA_ETH_TLA,
+	ITEM_META,
+	ITEM_META_DATA,
 
 	/* Validate/create actions. */
 	ACTIONS,
@@ -561,6 +563,11 @@ struct parse_action_priv {
 	ZERO,
 };
 
+static const enum index item_param_is[] = {
+	ITEM_PARAM_IS,
+	ZERO,
+};
+
 static const enum index next_item[] = {
 	ITEM_END,
 	ITEM_VOID,
@@ -599,6 +606,7 @@ struct parse_action_priv {
 	ITEM_ICMP6_ND_OPT,
 	ITEM_ICMP6_ND_OPT_SLA_ETH,
 	ITEM_ICMP6_ND_OPT_TLA_ETH,
+	ITEM_META,
 	ZERO,
 };
 
@@ -819,6 +827,12 @@ struct parse_action_priv {
 	ZERO,
 };
 
+static const enum index item_meta[] = {
+	ITEM_META_DATA,
+	ITEM_NEXT,
+	ZERO,
+};
+
 static const enum index next_action[] = {
 	ACTION_END,
 	ACTION_VOID,
@@ -2087,6 +2101,20 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,
 		.args = ARGS(ARGS_ENTRY_HTON
 			     (struct rte_flow_item_icmp6_nd_opt_tla_eth, tla)),
 	},
+	[ITEM_META] = {
+		.name = "meta",
+		.help = "match metadata header",
+		.priv = PRIV_ITEM(META, sizeof(struct rte_flow_item_meta)),
+		.next = NEXT(item_meta),
+		.call = parse_vc,
+	},
+	[ITEM_META_DATA] = {
+		.name = "data",
+		.help = "metadata value",
+		.next = NEXT(item_meta, NEXT_ENTRY(UNSIGNED), item_param_is),
+		.args = ARGS(ARGS_ENTRY_MASK_HTON(struct rte_flow_item_meta,
+						  data, "\xff\xff\xff\xff")),
+	},
 
 	/* Validate/create actions. */
 	[ACTIONS] = {
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index d550bda..c7ae676 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1060,6 +1060,10 @@ struct extmem_param {
 		      DEV_TX_OFFLOAD_MBUF_FAST_FREE))
 			port->dev_conf.txmode.offloads &=
 				~DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+		if (!(port->dev_info.tx_offload_capa &
+			DEV_TX_OFFLOAD_MATCH_METADATA))
+			port->dev_conf.txmode.offloads &=
+				~DEV_TX_OFFLOAD_MATCH_METADATA;
 		if (numa_support) {
 			if (port_numa[pid] != NUMA_NO_CONFIG)
 				port_per_socket[port_numa[pid]]++;
@@ -1085,6 +1089,7 @@ struct extmem_param {
 		/* set flag to initialize port/queue */
 		port->need_reconfig = 1;
 		port->need_reconfig_queues = 1;
+		port->tx_metadata = 0;
 	}
 
 	/*
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 0738105..ce92be7 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -194,6 +194,8 @@ struct rte_port {
 #ifdef SOFTNIC
 	struct softnic_port     softport;  /**< softnic params */
 #endif
+	/**< metadata value to insert in Tx packets. */
+	rte_be32_t		tx_metadata;
 };
 
 /**
diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
index 1f08b6e..fae84ca 100644
--- a/app/test-pmd/txonly.c
+++ b/app/test-pmd/txonly.c
@@ -253,6 +253,15 @@
 		pkt->l2_len = sizeof(struct ether_hdr);
 		pkt->l3_len = sizeof(struct ipv4_hdr);
 		pkts_burst[nb_pkt] = pkt;
+
+		/*
+		 * If user configured metadata value add it to packet
+		 * and set ol_flags accordingly
+		 */
+		if (ports[fs->tx_port].tx_metadata) {
+			pkt->tx_metadata = ports[fs->tx_port].tx_metadata;
+			pkt->ol_flags |= PKT_TX_METADATA;
+		}
 	}
 	nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_pkt);
 	/*
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 8d60bf0..334c565 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -423,6 +423,12 @@ List port level and all queue level Tx offloading configuration::
 
    testpmd> show port (port_id) tx_offload configuration
 
+show tx metadata setting
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Show Tx metadata value set for a specific port::
+
+   testpmd> show port (port_id) tx_metadata
 
 Configuration Functions
 -----------------------
@@ -1527,7 +1533,8 @@ Enable or disable a per port Tx offloading on all Tx queues of a port::
                   sctp_cksum, tcp_tso, udp_tso, outer_ipv4_cksum,
                   qinq_insert, vxlan_tnl_tso, gre_tnl_tso,
                   ipip_tnl_tso, geneve_tnl_tso, macsec_insert,
-                  mt_lockfree, multi_segs, mbuf_fast_free, security
+                  mt_lockfree, multi_segs, mbuf_fast_free, security,
+                  match_metadata
 
 This command should be run when the port is stopped, or else it will fail.
 
@@ -2109,6 +2116,14 @@ port config udp_tunnel_port
 Add/remove UDP tunnel port for VXLAN/GENEVE tunneling protocols::
     testpmd> port config (port_id) udp_tunnel_port add|rm vxlan|geneve (udp_port)
 
+port config tx_metadata
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Set Tx metadata value per port.
+testpmd will add this value to any Tx packet sent from this port::
+
+   testpmd> port config (port_id) tx_metadata (value)
+
 Link Bonding Functions
 ----------------------
 
@@ -3676,6 +3691,10 @@ This section lists supported pattern items and their attributes, if any.
 
   - ``tla {MAC-48}``: target Ethernet LLA.
 
+- ``meta``: match application specific metadata.
+
+  - ``data {unsigned}``: metadata value.
+
 Actions list
 ^^^^^^^^^^^^
 
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v6 2/2] app/testpmd: support metadata as flow rule item
  2018-10-21 14:22         ` [dpdk-dev] [PATCH v6 2/2] app/testpmd: support metadata as flow rule item Dekel Peled
@ 2018-10-22 16:13           ` Ferruh Yigit
  0 siblings, 0 replies; 48+ messages in thread
From: Ferruh Yigit @ 2018-10-22 16:13 UTC (permalink / raw)
  To: Dekel Peled, wenzhuo.lu, jingjing.wu, bernard.iremonger,
	olivier.matz, adrien.mazarguil, thomas, arybchenko
  Cc: shahafs, dev, orika

On 10/21/2018 3:22 PM, Dekel Peled wrote:
> As described in [1], this series adds option to set metadata value
> as match pattern when creating a new flow rule.
> 
> This patch introduces additional options in testpmd commands:
> - New item type "meta" "data"
> - New per-port offload flag "match_metadata".
> 
> It also adds commands to configure the tx_metadata value to use:
> - New 'config' command takes a 32 bit value and stores it per port:
> 	port config <port_id> tx_metadata <value>
>   testpmd will add to any Tx packet sent from this port the metadata
>   value, and set ol_flags accordingly.
> - A matching 'show' command is added to read the configured value:
> 	port config <port_id> tx_metadata <value>
> 
> [1] "ethdev: support metadata as flow rule criteria"
> 
> Signed-off-by: Dekel Peled <dekelp@mellanox.com>

Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: [dpdk-dev] [PATCH v6 0/2] support metadata as flow rule criteria
  2018-10-21 14:22         ` [dpdk-dev] [PATCH v6 0/2] " Dekel Peled
@ 2018-10-22 16:14           ` Ferruh Yigit
  0 siblings, 0 replies; 48+ messages in thread
From: Ferruh Yigit @ 2018-10-22 16:14 UTC (permalink / raw)
  To: Dekel Peled, wenzhuo.lu, jingjing.wu, bernard.iremonger,
	olivier.matz, adrien.mazarguil, thomas, arybchenko
  Cc: shahafs, dev, orika

On 10/21/2018 3:22 PM, Dekel Peled wrote:
> This series implements the match-metadata feature described in [1].
> 
> [1] "[RFC v2] ethdev: support metadata as flow rule criteria"
> 	http://mails.dpdk.org/archives/dev/2018-August/110194.html
> 	
> ---	
> v6:
> Apply code review comments:
> * Squash testpmd patches into single patch.
> * Update documentation.
> * testpmd support exact metadata value only ('is' option).
> 
> v5:
> Apply code review comments:
> * Update mbuf comments for clarity .
> * Update feature description in programmer guide.
> 
> v4:
> Apply code review comments:
> * Change location of metadata item in mbuf.
> * Update debug commands.
> 
> v3:
> * Add link to RFC email.
> * Add cover letter subject line.
> 
> v2:
> * Fix some checkpatch coding style issues (wrongly sent).
> ---	
> 
> Dekel Peled (2):
>   ethdev: support metadata as flow rule criteria
>   app/testpmd: support metadata as flow rule item

Series applied to dpdk-next-net/master, thanks.

^ permalink raw reply	[flat|nested] 48+ messages in thread

end of thread, other threads:[~2018-10-22 16:14 UTC | newest]

Thread overview: 48+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-09-16 13:33 [dpdk-dev] [PATCH 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
2018-09-16 13:33 ` [dpdk-dev] [PATCH 2/3] app/testpmd: " Dekel Peled
2018-09-16 13:33 ` [dpdk-dev] [PATCH 3/3] app/testpmd: add debug command tx_metadata set <port-id> <value> Dekel Peled
2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 0/3] *** SUBJECT HERE *** Dekel Peled
2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 0/3] support meadata as flow rule criteria Dekel Peled
2018-10-03 20:46     ` Thomas Monjalon
2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 " Dekel Peled
2018-10-16  8:42       ` Shahaf Shuler
2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 0/3] support metadata " Dekel Peled
2018-10-21 14:22         ` [dpdk-dev] [PATCH v6 0/2] " Dekel Peled
2018-10-22 16:14           ` Ferruh Yigit
2018-10-21 14:22         ` [dpdk-dev] [PATCH v6 1/2] ethdev: " Dekel Peled
2018-10-21 14:22         ` [dpdk-dev] [PATCH v6 2/2] app/testpmd: support metadata as flow rule item Dekel Peled
2018-10-22 16:13           ` Ferruh Yigit
2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
2018-10-17 14:04         ` Andrew Rybchenko
2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 2/3] app/testpmd: support metadata as flow rule item Dekel Peled
2018-10-18 12:26         ` Ori Kam
2018-10-21 13:49           ` Dekel Peled
2018-10-17 12:03       ` [dpdk-dev] [PATCH v5 3/3] app/testpmd: add Tx metadata debug commands Dekel Peled
2018-10-18  7:56         ` Ferruh Yigit
2018-10-18  8:30           ` Dekel Peled
2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
2018-10-16 14:11       ` Andrew Rybchenko
2018-10-17  5:27         ` Dekel Peled
2018-10-17  6:02           ` Andrew Rybchenko
2018-10-17  7:52             ` Dekel Peled
2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 2/3] app/testpmd: " Dekel Peled
2018-10-11 10:49     ` [dpdk-dev] [PATCH v4 3/3] app/testpmd: add Tx metadata debug commands Dekel Peled
2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
2018-10-05 13:31     ` Ferruh Yigit
2018-10-05 13:39       ` Andrew Rybchenko
2018-10-05 18:20         ` Yongseok Koh
2018-10-08 15:10         ` Dekel Peled
2018-10-09 14:46         ` Ferruh Yigit
2018-10-09 14:52           ` Andrew Rybchenko
2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 2/3] app/testpmd: " Dekel Peled
2018-09-27 13:57   ` [dpdk-dev] [PATCH v3 3/3] app/testpmd: add debug command Tx metadata set Dekel Peled
2018-10-05 13:27     ` Ferruh Yigit
2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 1/3] ethdev: support metadata as flow rule criteria Dekel Peled
2018-09-18  7:55   ` Xueming(Steven) Li
2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 2/3] app/testpmd: " Dekel Peled
2018-09-18  8:21   ` Xueming(Steven) Li
2018-09-25 11:32     ` Dekel Peled
2018-09-16 14:37 ` [dpdk-dev] [PATCH v2 3/3] app/testpmd: add debug command Tx metadata set Dekel Peled
2018-09-19  5:39   ` Xueming(Steven) Li
2018-10-05 13:19   ` Ferruh Yigit
2018-10-09 14:30     ` Dekel Peled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).