DPDK-dev Archive on lore.kernel.org
 help / color / Atom feed
* [dpdk-dev] [PATCH 0/5] re-implement legacy filter functions by private API
@ 2020-06-11  6:01 Chenxu Di
  2020-06-11  6:01 ` [dpdk-dev] [PATCH 1/5] net/i40e: add private APIs Chenxu Di
                   ` (7 more replies)
  0 siblings, 8 replies; 47+ messages in thread
From: Chenxu Di @ 2020-06-11  6:01 UTC (permalink / raw)
  To: dev; +Cc: beilei.xing, Yang Qiming, Chenxu Di

The legacy filter API will be superseded by rte_flow.
There are also several small features which can not be
implemented in rte_flow.
This patch re-implemented features get_fdir_info, get_fdir_stat and
set_gre_key_len as private API.
This patch also enable RSS action in flow query.

Chenxu Di (5):
  net/i40e: add private APIs
  net/ixgbe: add private APIs
  app/testpmd: re-implement commands by using private API
  net/i40e: enable flow query RSS
  app/testpmd: support query RSS config in flow query

 app/test-pmd/cmdline.c                      |  23 ++--
 app/test-pmd/config.c                       | 129 ++++++++++++++++++--
 doc/guides/rel_notes/release_20_08.rst      |  14 +++
 drivers/net/i40e/i40e_ethdev.c              |   2 +-
 drivers/net/i40e/i40e_ethdev.h              |   5 +
 drivers/net/i40e/i40e_fdir.c                |   4 +-
 drivers/net/i40e/i40e_flow.c                |  51 ++++++++
 drivers/net/i40e/rte_pmd_i40e.c             |  51 ++++++++
 drivers/net/i40e/rte_pmd_i40e.h             |  46 +++++++
 drivers/net/i40e/rte_pmd_i40e_version.map   |   3 +
 drivers/net/ixgbe/ixgbe_ethdev.h            |   4 +
 drivers/net/ixgbe/ixgbe_fdir.c              |   8 +-
 drivers/net/ixgbe/rte_pmd_ixgbe.c           |  33 +++++
 drivers/net/ixgbe/rte_pmd_ixgbe.h           |  31 +++++
 drivers/net/ixgbe/rte_pmd_ixgbe_version.map |   2 +
 15 files changed, 378 insertions(+), 28 deletions(-)

-- 
2.17.1


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

* [dpdk-dev] [PATCH 1/5] net/i40e: add private APIs
  2020-06-11  6:01 [dpdk-dev] [PATCH 0/5] re-implement legacy filter functions by private API Chenxu Di
@ 2020-06-11  6:01 ` Chenxu Di
  2020-06-11  6:01 ` [dpdk-dev] [PATCH 2/5] net/ixgbe: " Chenxu Di
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 47+ messages in thread
From: Chenxu Di @ 2020-06-11  6:01 UTC (permalink / raw)
  To: dev; +Cc: beilei.xing, Yang Qiming, Chenxu Di

The legacy filter API will be superseded by rte_flow.
There are also several small features which can not be
implemented in rte_flow. This patch re-implemented these
features as private API.
Three APIs are added:
rte_pmd_i40e_get_fdir_info.
rte_pmd_i40e_get_fdir_stats.
rte_pmd_i40e_set_gre_key_len.

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 doc/guides/rel_notes/release_20_08.rst    | 14 +++++++
 drivers/net/i40e/i40e_ethdev.c            |  2 +-
 drivers/net/i40e/i40e_ethdev.h            |  5 +++
 drivers/net/i40e/i40e_fdir.c              |  4 +-
 drivers/net/i40e/rte_pmd_i40e.c           | 51 +++++++++++++++++++++++
 drivers/net/i40e/rte_pmd_i40e.h           | 46 ++++++++++++++++++++
 drivers/net/i40e/rte_pmd_i40e_version.map |  3 ++
 7 files changed, 122 insertions(+), 3 deletions(-)

diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst
index dee4ccbb5..550ad33aa 100644
--- a/doc/guides/rel_notes/release_20_08.rst
+++ b/doc/guides/rel_notes/release_20_08.rst
@@ -62,6 +62,20 @@ New Features
 
   * Added new PMD devarg ``reclaim_mem_mode``.
 
+* **Updated the Intel i40e driver.**
+
+  Updated the Intel i40e driver with new features and improvements, including:
+
+  * Re-implemented get_fdir_info and get_fdir_stat in private API.
+  * Re-implemented set_gre_key_len in private API.
+  * Added support for flow query RSS.
+
+* **Updated the Intel ixgbe driver.**
+
+  Updated the Intel ixgbe driver with new features and improvements, including:
+
+  * Re-implemented get_fdir_info and get_fdir_stat in private API.
+
 
 Removed Items
 -------------
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 970a31cb2..674b711d9 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -8787,7 +8787,7 @@ i40e_tunnel_filter_param_check(struct i40e_pf *pf,
 
 #define I40E_GL_PRS_FVBM_MSK_ENA 0x80000000
 #define I40E_GL_PRS_FVBM(_i)     (0x00269760 + ((_i) * 4))
-static int
+int
 i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len)
 {
 	struct i40e_pf *pf = &((struct i40e_adapter *)hw->back)->pf;
diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index e5d0ce53f..192636927 100644
--- a/drivers/net/i40e/i40e_ethdev.h
+++ b/drivers/net/i40e/i40e_ethdev.h
@@ -1270,6 +1270,11 @@ enum i40e_filter_pctype
 				uint16_t flow_type);
 uint16_t i40e_pctype_to_flowtype(const struct i40e_adapter *adapter,
 				 enum i40e_filter_pctype pctype);
+int i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len);
+void i40e_fdir_info_get(struct rte_eth_dev *dev,
+			struct rte_eth_fdir_info *fdir);
+void i40e_fdir_stats_get(struct rte_eth_dev *dev,
+			 struct rte_eth_fdir_stats *stat);
 int i40e_fdir_ctrl_func(struct rte_eth_dev *dev,
 			  enum rte_filter_op filter_op,
 			  void *arg);
diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c
index d59399afe..4a778db4c 100644
--- a/drivers/net/i40e/i40e_fdir.c
+++ b/drivers/net/i40e/i40e_fdir.c
@@ -2169,7 +2169,7 @@ i40e_fdir_info_get_flex_mask(struct i40e_pf *pf,
  * @fdir: a pointer to a structure of type *rte_eth_fdir_info* to be filled with
  *    the flow director information.
  */
-static void
+void
 i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir)
 {
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
@@ -2214,7 +2214,7 @@ i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir)
  * @stat: a pointer to a structure of type *rte_eth_fdir_stats* to be filled with
  *    the flow director statistics.
  */
-static void
+void
 i40e_fdir_stats_get(struct rte_eth_dev *dev, struct rte_eth_fdir_stats *stat)
 {
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
diff --git a/drivers/net/i40e/rte_pmd_i40e.c b/drivers/net/i40e/rte_pmd_i40e.c
index 446e31710..e216e6783 100644
--- a/drivers/net/i40e/rte_pmd_i40e.c
+++ b/drivers/net/i40e/rte_pmd_i40e.c
@@ -3209,6 +3209,57 @@ rte_pmd_i40e_inset_set(uint16_t port, uint8_t pctype,
 	return 0;
 }
 
+int
+rte_pmd_i40e_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_i40e_supported(dev))
+		return -ENOTSUP;
+
+	i40e_fdir_info_get(dev, fdir_info);
+
+	return 0;
+}
+
+int
+rte_pmd_i40e_get_fdir_stats(uint16_t port, struct rte_eth_fdir_stats *fdir_stat)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_i40e_supported(dev))
+		return -ENOTSUP;
+
+	i40e_fdir_stats_get(dev, fdir_stat);
+
+	return 0;
+}
+
+int
+rte_pmd_i40e_set_gre_key_len(uint16_t port, uint8_t len)
+{
+	struct rte_eth_dev *dev;
+	struct i40e_pf *pf;
+	struct i40e_hw *hw;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_i40e_supported(dev))
+		return -ENOTSUP;
+
+	pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
+	hw = I40E_PF_TO_HW(pf);
+
+	return i40e_dev_set_gre_key_len(hw, len);
+}
+
 int
 rte_pmd_i40e_set_switch_dev(uint16_t port_id, struct rte_eth_dev *switch_dev)
 {
diff --git a/drivers/net/i40e/rte_pmd_i40e.h b/drivers/net/i40e/rte_pmd_i40e.h
index 915cdf076..2df23aab7 100644
--- a/drivers/net/i40e/rte_pmd_i40e.h
+++ b/drivers/net/i40e/rte_pmd_i40e.h
@@ -1061,6 +1061,52 @@ rte_pmd_i40e_inset_field_clear(uint64_t *inset, uint8_t field_idx)
 	return 0;
 }
 
+/**
+ * Get port fdir info
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param fdir_info
+ *   The fdir info of the port
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+int
+rte_pmd_i40e_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info);
+
+/**
+ * Get port fdir status
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param fdir_stat
+ *   The fdir status of the port
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+int
+rte_pmd_i40e_get_fdir_stats(uint16_t port,
+			    struct rte_eth_fdir_stats *fdir_stat);
+
+/**
+ * Set GRE key length
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param len
+ *   Length of gre-key
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+int
+rte_pmd_i40e_set_gre_key_len(uint16_t port, uint8_t len);
+
 /**
  * For ipn3ke, i40e works with FPGA.
  * In this situation, i40e get link status from fpga,
diff --git a/drivers/net/i40e/rte_pmd_i40e_version.map b/drivers/net/i40e/rte_pmd_i40e_version.map
index c92c0cf46..f6cd3b356 100644
--- a/drivers/net/i40e/rte_pmd_i40e_version.map
+++ b/drivers/net/i40e/rte_pmd_i40e_version.map
@@ -42,5 +42,8 @@ DPDK_20.0 {
 EXPERIMENTAL {
 	global:
 
+	rte_pmd_i40e_get_fdir_info;
+	rte_pmd_i40e_get_fdir_stats;
+	rte_pmd_i40e_set_gre_key_len;
 	rte_pmd_i40e_set_switch_dev;
 };
-- 
2.17.1


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

* [dpdk-dev] [PATCH 2/5] net/ixgbe: add private APIs
  2020-06-11  6:01 [dpdk-dev] [PATCH 0/5] re-implement legacy filter functions by private API Chenxu Di
  2020-06-11  6:01 ` [dpdk-dev] [PATCH 1/5] net/i40e: add private APIs Chenxu Di
@ 2020-06-11  6:01 ` Chenxu Di
  2020-06-11  6:01 ` [dpdk-dev] [PATCH 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 47+ messages in thread
From: Chenxu Di @ 2020-06-11  6:01 UTC (permalink / raw)
  To: dev; +Cc: beilei.xing, Yang Qiming, Chenxu Di

The legacy filter API will be superseded by rte_flow.
There are also several small features which can not be
implemented in rte_flow. This patch re-implemented these
features as private API.
Two APIs are added:
rte_pmd_ixgbe_get_fdir_info.
rte_pmd_ixgbe_get_fdir_stats.

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 drivers/net/ixgbe/ixgbe_ethdev.h            |  4 +++
 drivers/net/ixgbe/ixgbe_fdir.c              |  8 ++---
 drivers/net/ixgbe/rte_pmd_ixgbe.c           | 33 +++++++++++++++++++++
 drivers/net/ixgbe/rte_pmd_ixgbe.h           | 31 +++++++++++++++++++
 drivers/net/ixgbe/rte_pmd_ixgbe_version.map |  2 ++
 5 files changed, 72 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h
index 3d78b2ee2..9bdef87fb 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.h
+++ b/drivers/net/ixgbe/ixgbe_ethdev.h
@@ -697,6 +697,10 @@ int ixgbe_fdir_set_flexbytes_offset(struct rte_eth_dev *dev,
 int ixgbe_fdir_filter_program(struct rte_eth_dev *dev,
 			      struct ixgbe_fdir_rule *rule,
 			      bool del, bool update);
+void ixgbe_fdir_info_get(struct rte_eth_dev *dev,
+			 struct rte_eth_fdir_info *fdir_info);
+void ixgbe_fdir_stats_get(struct rte_eth_dev *dev,
+			  struct rte_eth_fdir_stats *fdir_stats);
 
 void ixgbe_configure_dcb(struct rte_eth_dev *dev);
 
diff --git a/drivers/net/ixgbe/ixgbe_fdir.c b/drivers/net/ixgbe/ixgbe_fdir.c
index 166dae1e0..6faaa8f06 100644
--- a/drivers/net/ixgbe/ixgbe_fdir.c
+++ b/drivers/net/ixgbe/ixgbe_fdir.c
@@ -109,10 +109,6 @@ static int ixgbe_add_del_fdir_filter(struct rte_eth_dev *dev,
 			      bool del,
 			      bool update);
 static int ixgbe_fdir_flush(struct rte_eth_dev *dev);
-static void ixgbe_fdir_info_get(struct rte_eth_dev *dev,
-			struct rte_eth_fdir_info *fdir_info);
-static void ixgbe_fdir_stats_get(struct rte_eth_dev *dev,
-			struct rte_eth_fdir_stats *fdir_stats);
 
 /**
  * This function is based on ixgbe_fdir_enable_82599() in base/ixgbe_82599.c.
@@ -1414,7 +1410,7 @@ ixgbe_fdir_flush(struct rte_eth_dev *dev)
 }
 
 #define FDIRENTRIES_NUM_SHIFT 10
-static void
+void
 ixgbe_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir_info)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -1473,7 +1469,7 @@ ixgbe_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir_info
 			(uint8_t)((info->mask.flex_bytes_mask & 0xFF00) >> 8);
 }
 
-static void
+void
 ixgbe_fdir_stats_get(struct rte_eth_dev *dev, struct rte_eth_fdir_stats *fdir_stats)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.c b/drivers/net/ixgbe/rte_pmd_ixgbe.c
index 9bff557f9..d2f708242 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe.c
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe.c
@@ -1139,3 +1139,36 @@ rte_pmd_ixgbe_mdio_unlocked_write(uint16_t port, uint32_t reg_addr,
 	}
 	return 0;
 }
+
+int
+rte_pmd_ixgbe_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_ixgbe_supported(dev))
+		return -ENOTSUP;
+
+	ixgbe_fdir_info_get(dev, fdir_info);
+
+	return 0;
+}
+
+int
+rte_pmd_ixgbe_get_fdir_stats(uint16_t port,
+			     struct rte_eth_fdir_stats *fdir_stats)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_ixgbe_supported(dev))
+		return -ENOTSUP;
+
+	ixgbe_fdir_stats_get(dev, fdir_stats);
+
+	return 0;
+}
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.h b/drivers/net/ixgbe/rte_pmd_ixgbe.h
index f62fd761d..41c52ecc1 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe.h
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe.h
@@ -726,4 +726,35 @@ enum {
 __rte_experimental
 int
 rte_pmd_ixgbe_upd_fctrl_sbp(uint16_t port, int enable);
+
+/**
+ * Get port fdir info
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param fdir_info
+ *   The fdir info of the port
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+int
+rte_pmd_ixgbe_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info);
+
+/**
+ * Get port fdir status
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param fdir_stats
+ *   The fdir status of the port
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+int
+rte_pmd_ixgbe_get_fdir_stats(uint16_t port,
+			     struct rte_eth_fdir_stats *fdir_stats);
 #endif /* _PMD_IXGBE_H_ */
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
index 21534dbc3..911f8083f 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
@@ -38,6 +38,8 @@ DPDK_20.0 {
 EXPERIMENTAL {
 	global:
 
+	rte_pmd_ixgbe_get_fdir_info;
+	rte_pmd_ixgbe_get_fdir_stats;
 	rte_pmd_ixgbe_mdio_lock;
 	rte_pmd_ixgbe_mdio_unlock;
 	rte_pmd_ixgbe_mdio_unlocked_read;
-- 
2.17.1


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

* [dpdk-dev] [PATCH 3/5] app/testpmd: re-implement commands by using private API
  2020-06-11  6:01 [dpdk-dev] [PATCH 0/5] re-implement legacy filter functions by private API Chenxu Di
  2020-06-11  6:01 ` [dpdk-dev] [PATCH 1/5] net/i40e: add private APIs Chenxu Di
  2020-06-11  6:01 ` [dpdk-dev] [PATCH 2/5] net/ixgbe: " Chenxu Di
@ 2020-06-11  6:01 ` Chenxu Di
  2020-06-16 20:12   ` Kevin Traynor
  2020-06-11  6:01 ` [dpdk-dev] [PATCH 4/5] net/i40e: enable flow query RSS Chenxu Di
                   ` (4 subsequent siblings)
  7 siblings, 1 reply; 47+ messages in thread
From: Chenxu Di @ 2020-06-11  6:01 UTC (permalink / raw)
  To: dev; +Cc: beilei.xing, Yang Qiming, Chenxu Di

The legacy filter API will be superseded. This patch use
private api to change the implementation of commands
global_config <port_id> gre-key-len <key_len> and
show port fdir <port_id>

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 app/test-pmd/cmdline.c | 23 ++++++++-----
 app/test-pmd/config.c  | 74 +++++++++++++++++++++++++++++++++++-------
 2 files changed, 78 insertions(+), 19 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 996a49876..01d793e89 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -9280,15 +9280,22 @@ cmd_global_config_parsed(void *parsed_result,
 {
 	struct cmd_global_config_result *res = parsed_result;
 	struct rte_eth_global_cfg conf;
-	int ret;
+	int ret = -ENOTSUP;
 
-	memset(&conf, 0, sizeof(conf));
-	conf.cfg_type = RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN;
-	conf.cfg.gre_key_len = res->len;
-	ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE,
-				      RTE_ETH_FILTER_SET, &conf);
-	if (ret != 0)
-		printf("Global config error\n");
+#ifdef RTE_LIBRTE_I40E_PMD
+	if (ret == -ENOTSUP)
+		ret = rte_pmd_i40e_set_gre_key_len(res->port_id, res->len);
+#endif
+	if (ret == -ENOTSUP) {
+		memset(&conf, 0, sizeof(conf));
+		conf.cfg_type = RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN;
+		conf.cfg.gre_key_len = res->len;
+		ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE,
+					      RTE_ETH_FILTER_SET, &conf);
+	}
+
+	if (ret < 0)
+		printf("Global config error: (%s)\n", strerror(-ret));
 }
 
 cmdline_parse_token_string_t cmd_global_config_cmd =
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 016bcb09c..f519246c7 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -3729,30 +3729,82 @@ print_fdir_flow_type(uint32_t flow_types_mask)
 	printf("\n");
 }
 
+static int
+get_fdir_info(portid_t port_id, struct rte_eth_fdir_info *fdir_info)
+{
+	int ret;
+#ifdef RTE_LIBRTE_I40E_PMD
+	ret = rte_pmd_i40e_get_fdir_info(port_id, fdir_info);
+#endif
+#ifdef RTE_LIBRTE_IXGBE_PMD
+	if (ret == -ENOTSUP)
+		ret = rte_pmd_ixgbe_get_fdir_info(port_id, fdir_info);
+#endif
+	if (ret == -ENOTSUP) {
+		ret = rte_eth_dev_filter_supported(port_id,
+						   RTE_ETH_FILTER_FDIR);
+		if (ret < 0) {
+			printf("\n FDIR is not supported on port %-2d\n",
+				port_id);
+			return ret;
+		}
+		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
+					RTE_ETH_FILTER_INFO, fdir_info);
+	}
+
+	if (ret < 0)
+		printf("Get fdir infos error: (%s)\n", strerror(-ret));
+
+	return ret;
+}
+
+static int
+get_fdir_stat(portid_t port_id, struct rte_eth_fdir_stats *fdir_stat)
+{
+	int ret;
+#ifdef RTE_LIBRTE_I40E_PMD
+	ret = rte_pmd_i40e_get_fdir_stats(port_id, fdir_stat);
+#endif
+#ifdef RTE_LIBRTE_IXGBE_PMD
+	if (ret == -ENOTSUP)
+		ret = rte_pmd_ixgbe_get_fdir_stats(port_id, fdir_stat);
+#endif
+	if (ret == -ENOTSUP) {
+		ret = rte_eth_dev_filter_supported(port_id,
+						   RTE_ETH_FILTER_FDIR);
+		if (ret < 0) {
+			printf("\n FDIR is not supported on port %-2d\n",
+				port_id);
+			return ret;
+		}
+		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
+					RTE_ETH_FILTER_STATS, fdir_stat);
+	}
+
+	if (ret < 0)
+		printf("Get fdir infos error: (%s)\n", strerror(-ret));
+
+	return ret;
+}
+
 void
 fdir_get_infos(portid_t port_id)
 {
 	struct rte_eth_fdir_stats fdir_stat;
 	struct rte_eth_fdir_info fdir_info;
-	int ret;
 
 	static const char *fdir_stats_border = "########################";
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
 		return;
-	ret = rte_eth_dev_filter_supported(port_id, RTE_ETH_FILTER_FDIR);
-	if (ret < 0) {
-		printf("\n FDIR is not supported on port %-2d\n",
-			port_id);
-		return;
-	}
 
 	memset(&fdir_info, 0, sizeof(fdir_info));
-	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
-			       RTE_ETH_FILTER_INFO, &fdir_info);
+	if (get_fdir_info(port_id, &fdir_info))
+		return;
 	memset(&fdir_stat, 0, sizeof(fdir_stat));
-	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
-			       RTE_ETH_FILTER_STATS, &fdir_stat);
+	if (get_fdir_stat(port_id, &fdir_stat))
+		return;
+
 	printf("\n  %s FDIR infos for port %-2d     %s\n",
 	       fdir_stats_border, port_id, fdir_stats_border);
 	printf("  MODE: ");
-- 
2.17.1


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

* [dpdk-dev] [PATCH 4/5] net/i40e: enable flow query RSS
  2020-06-11  6:01 [dpdk-dev] [PATCH 0/5] re-implement legacy filter functions by private API Chenxu Di
                   ` (2 preceding siblings ...)
  2020-06-11  6:01 ` [dpdk-dev] [PATCH 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
@ 2020-06-11  6:01 ` Chenxu Di
  2020-06-11  6:01 ` [dpdk-dev] [PATCH 5/5] app/testpmd: support query RSS config in flow query Chenxu Di
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 47+ messages in thread
From: Chenxu Di @ 2020-06-11  6:01 UTC (permalink / raw)
  To: dev; +Cc: beilei.xing, Yang Qiming, Chenxu Di

This patch enables flow query function to get the
configuration ofthe specified rule.

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 drivers/net/i40e/i40e_flow.c | 51 ++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c
index 8f8df6fae..b070802bd 100644
--- a/drivers/net/i40e/i40e_flow.c
+++ b/drivers/net/i40e/i40e_flow.c
@@ -43,6 +43,11 @@ static int i40e_flow_destroy(struct rte_eth_dev *dev,
 			     struct rte_flow_error *error);
 static int i40e_flow_flush(struct rte_eth_dev *dev,
 			   struct rte_flow_error *error);
+static int i40e_flow_query(struct rte_eth_dev *dev,
+			   struct rte_flow *flow,
+			   const struct rte_flow_action *actions,
+			   void *data,
+			   struct rte_flow_error *error);
 static int
 i40e_flow_parse_ethertype_pattern(struct rte_eth_dev *dev,
 				  const struct rte_flow_item *pattern,
@@ -129,6 +134,7 @@ const struct rte_flow_ops i40e_flow_ops = {
 	.create = i40e_flow_create,
 	.destroy = i40e_flow_destroy,
 	.flush = i40e_flow_flush,
+	.query = i40e_flow_query,
 };
 
 static union i40e_filter_t cons_filter;
@@ -5462,3 +5468,48 @@ i40e_flow_flush_rss_filter(struct rte_eth_dev *dev)
 
 	return ret;
 }
+
+static int
+i40e_flow_query(struct rte_eth_dev *dev __rte_unused,
+		struct rte_flow *flow,
+		const struct rte_flow_action *actions,
+		void *data,
+		struct rte_flow_error *error)
+{
+	struct i40e_rss_filter *rss_rule = (struct i40e_rss_filter *)flow->rule;
+	enum rte_filter_type filter_type = flow->filter_type;
+	struct rte_flow_action_rss *rss_conf = data;
+
+	if (!rss_rule) {
+		rte_flow_error_set(error, EINVAL,
+				   RTE_FLOW_ERROR_TYPE_HANDLE,
+				   NULL, "Invalid rule");
+		return -rte_errno;
+	}
+
+	for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
+		switch (actions->type) {
+		case RTE_FLOW_ACTION_TYPE_VOID:
+			break;
+		case RTE_FLOW_ACTION_TYPE_RSS:
+			if (filter_type != RTE_ETH_FILTER_HASH) {
+				rte_flow_error_set(error, ENOTSUP,
+						   RTE_FLOW_ERROR_TYPE_ACTION,
+						   actions,
+						   "action not supported");
+				return -rte_errno;
+			}
+			rte_memcpy(rss_conf,
+				   &rss_rule->rss_filter_info.conf,
+				   sizeof(struct rte_flow_action_rss));
+			break;
+		default:
+			return rte_flow_error_set(error, ENOTSUP,
+						  RTE_FLOW_ERROR_TYPE_ACTION,
+						  actions,
+						  "action not supported");
+		}
+	}
+
+	return 0;
+}
-- 
2.17.1


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

* [dpdk-dev] [PATCH 5/5] app/testpmd: support query RSS config in flow query
  2020-06-11  6:01 [dpdk-dev] [PATCH 0/5] re-implement legacy filter functions by private API Chenxu Di
                   ` (3 preceding siblings ...)
  2020-06-11  6:01 ` [dpdk-dev] [PATCH 4/5] net/i40e: enable flow query RSS Chenxu Di
@ 2020-06-11  6:01 ` Chenxu Di
  2020-06-15  2:18 ` [dpdk-dev] [PATCH v2 0/5] re-implement legacy filter functions by private API Chenxu Di
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 47+ messages in thread
From: Chenxu Di @ 2020-06-11  6:01 UTC (permalink / raw)
  To: dev; +Cc: beilei.xing, Yang Qiming, Chenxu Di

This patch support RSS action in flow query.
It can display the RSS configuration of the specified rule.

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 app/test-pmd/config.c | 55 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index f519246c7..7e3cccf9a 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -1378,6 +1378,56 @@ port_flow_complain(struct rte_flow_error *error)
 	return -err;
 }
 
+static void
+rss_config_display(struct rte_flow_action_rss *rss_conf)
+{
+	uint8_t i;
+
+	if (rss_conf == NULL) {
+		printf("Invalid rule\n");
+		return;
+	}
+
+	printf("RSS:\n"
+	       " queues:");
+	if (rss_conf->queue_num == 0)
+		printf(" none");
+	for (i = 0; i < rss_conf->queue_num; i++)
+		printf(" %d", rss_conf->queue[i]);
+
+	printf("\n function:");
+	switch (rss_conf->func) {
+	case RTE_ETH_HASH_FUNCTION_DEFAULT:
+		printf(" default\n");
+		break;
+	case RTE_ETH_HASH_FUNCTION_TOEPLITZ:
+		printf(" toeplitz\n");
+		break;
+	case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR:
+		printf(" simple_xor\n");
+		break;
+	case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ:
+		printf(" symmetric_toeplitz\n");
+		break;
+	default:
+		printf(" Unknown function\n");
+		return;
+	}
+
+	printf(" types:\n");
+	if (rss_conf->types == 0) {
+		printf("  none\n");
+		return;
+	}
+	for (i = 0; rss_type_table[i].str; i++) {
+		if ((rss_conf->types &
+		    rss_type_table[i].rss_type) ==
+		    rss_type_table[i].rss_type &&
+		    rss_type_table[i].rss_type != 0)
+			printf("  %s\n", rss_type_table[i].str);
+	}
+}
+
 /** Validate flow rule. */
 int
 port_flow_validate(portid_t port_id,
@@ -1564,6 +1614,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
 	const char *name;
 	union {
 		struct rte_flow_query_count count;
+		struct rte_flow_action_rss rss_conf;
 	} query;
 	int ret;
 
@@ -1585,6 +1636,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
 		return port_flow_complain(&error);
 	switch (action->type) {
 	case RTE_FLOW_ACTION_TYPE_COUNT:
+	case RTE_FLOW_ACTION_TYPE_RSS:
 		break;
 	default:
 		printf("Cannot query action type %d (%s)\n",
@@ -1609,6 +1661,9 @@ port_flow_query(portid_t port_id, uint32_t rule,
 		       query.count.hits,
 		       query.count.bytes);
 		break;
+	case RTE_FLOW_ACTION_TYPE_RSS:
+		rss_config_display(&query.rss_conf);
+		break;
 	default:
 		printf("Cannot display result for action type %d (%s)\n",
 		       action->type, name);
-- 
2.17.1


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

* [dpdk-dev] [PATCH v2 0/5] re-implement legacy filter functions by private API
  2020-06-11  6:01 [dpdk-dev] [PATCH 0/5] re-implement legacy filter functions by private API Chenxu Di
                   ` (4 preceding siblings ...)
  2020-06-11  6:01 ` [dpdk-dev] [PATCH 5/5] app/testpmd: support query RSS config in flow query Chenxu Di
@ 2020-06-15  2:18 ` Chenxu Di
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 1/5] net/i40e: add private APIs Chenxu Di
                     ` (4 more replies)
  2020-07-01  8:24 ` [dpdk-dev] [PATCH v3 0/5] re-implement legacy filter functions by private API Chenxu Di
  2020-07-08  1:18 ` [dpdk-dev] [PATCH v4 0/5] re-implement legacy filter functions by private API Chenxu Di
  7 siblings, 5 replies; 47+ messages in thread
From: Chenxu Di @ 2020-06-15  2:18 UTC (permalink / raw)
  To: dev; +Cc: beilei.xing, Yang Qiming, Chenxu Di

The legacy filter API will be superseded by rte_flow.
There are also several small features which can not be
implemented in rte_flow.
This patch re-implemented features get_fdir_info, get_fdir_stat and
set_gre_key_len as private API.
This patch also enable RSS action in flow query.

v2:
-fixed the __rte_experimental flag

Chenxu Di (5):
  net/i40e: add private APIs
  net/ixgbe: add private APIs
  app/testpmd: re-implement commands by using private API
  net/i40e: enable flow query RSS
  app/testpmd: support query RSS config in flow query

 app/test-pmd/cmdline.c                      |  23 ++--
 app/test-pmd/config.c                       | 129 ++++++++++++++++++--
 doc/guides/rel_notes/release_20_08.rst      |  14 +++
 drivers/net/i40e/i40e_ethdev.c              |   2 +-
 drivers/net/i40e/i40e_ethdev.h              |   5 +
 drivers/net/i40e/i40e_fdir.c                |   4 +-
 drivers/net/i40e/i40e_flow.c                |  51 ++++++++
 drivers/net/i40e/rte_pmd_i40e.c             |  51 ++++++++
 drivers/net/i40e/rte_pmd_i40e.h             |  49 ++++++++
 drivers/net/i40e/rte_pmd_i40e_version.map   |   3 +
 drivers/net/ixgbe/ixgbe_ethdev.h            |   4 +
 drivers/net/ixgbe/ixgbe_fdir.c              |   8 +-
 drivers/net/ixgbe/rte_pmd_ixgbe.c           |  33 +++++
 drivers/net/ixgbe/rte_pmd_ixgbe.h           |  33 +++++
 drivers/net/ixgbe/rte_pmd_ixgbe_version.map |   2 +
 15 files changed, 383 insertions(+), 28 deletions(-)

-- 
2.17.1


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

* [dpdk-dev] [PATCH v2 1/5] net/i40e: add private APIs
  2020-06-15  2:18 ` [dpdk-dev] [PATCH v2 0/5] re-implement legacy filter functions by private API Chenxu Di
@ 2020-06-15  2:18   ` Chenxu Di
  2020-06-30  4:22     ` Jeff Guo
  2020-06-30 10:24     ` Yang, Qiming
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 2/5] net/ixgbe: " Chenxu Di
                     ` (3 subsequent siblings)
  4 siblings, 2 replies; 47+ messages in thread
From: Chenxu Di @ 2020-06-15  2:18 UTC (permalink / raw)
  To: dev; +Cc: beilei.xing, Yang Qiming, Chenxu Di

The legacy filter API will be superseded by rte_flow.
There are also several small features which can not be
implemented in rte_flow. This patch re-implemented these
features as private API.
Three APIs are added:
rte_pmd_i40e_get_fdir_info.
rte_pmd_i40e_get_fdir_stats.
rte_pmd_i40e_set_gre_key_len.

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 doc/guides/rel_notes/release_20_08.rst    | 14 +++++++
 drivers/net/i40e/i40e_ethdev.c            |  2 +-
 drivers/net/i40e/i40e_ethdev.h            |  5 +++
 drivers/net/i40e/i40e_fdir.c              |  4 +-
 drivers/net/i40e/rte_pmd_i40e.c           | 51 +++++++++++++++++++++++
 drivers/net/i40e/rte_pmd_i40e.h           | 49 ++++++++++++++++++++++
 drivers/net/i40e/rte_pmd_i40e_version.map |  3 ++
 7 files changed, 125 insertions(+), 3 deletions(-)

diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst
index dee4ccbb5..550ad33aa 100644
--- a/doc/guides/rel_notes/release_20_08.rst
+++ b/doc/guides/rel_notes/release_20_08.rst
@@ -62,6 +62,20 @@ New Features
 
   * Added new PMD devarg ``reclaim_mem_mode``.
 
+* **Updated the Intel i40e driver.**
+
+  Updated the Intel i40e driver with new features and improvements, including:
+
+  * Re-implemented get_fdir_info and get_fdir_stat in private API.
+  * Re-implemented set_gre_key_len in private API.
+  * Added support for flow query RSS.
+
+* **Updated the Intel ixgbe driver.**
+
+  Updated the Intel ixgbe driver with new features and improvements, including:
+
+  * Re-implemented get_fdir_info and get_fdir_stat in private API.
+
 
 Removed Items
 -------------
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 970a31cb2..674b711d9 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -8787,7 +8787,7 @@ i40e_tunnel_filter_param_check(struct i40e_pf *pf,
 
 #define I40E_GL_PRS_FVBM_MSK_ENA 0x80000000
 #define I40E_GL_PRS_FVBM(_i)     (0x00269760 + ((_i) * 4))
-static int
+int
 i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len)
 {
 	struct i40e_pf *pf = &((struct i40e_adapter *)hw->back)->pf;
diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index e5d0ce53f..192636927 100644
--- a/drivers/net/i40e/i40e_ethdev.h
+++ b/drivers/net/i40e/i40e_ethdev.h
@@ -1270,6 +1270,11 @@ enum i40e_filter_pctype
 				uint16_t flow_type);
 uint16_t i40e_pctype_to_flowtype(const struct i40e_adapter *adapter,
 				 enum i40e_filter_pctype pctype);
+int i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len);
+void i40e_fdir_info_get(struct rte_eth_dev *dev,
+			struct rte_eth_fdir_info *fdir);
+void i40e_fdir_stats_get(struct rte_eth_dev *dev,
+			 struct rte_eth_fdir_stats *stat);
 int i40e_fdir_ctrl_func(struct rte_eth_dev *dev,
 			  enum rte_filter_op filter_op,
 			  void *arg);
diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c
index d59399afe..4a778db4c 100644
--- a/drivers/net/i40e/i40e_fdir.c
+++ b/drivers/net/i40e/i40e_fdir.c
@@ -2169,7 +2169,7 @@ i40e_fdir_info_get_flex_mask(struct i40e_pf *pf,
  * @fdir: a pointer to a structure of type *rte_eth_fdir_info* to be filled with
  *    the flow director information.
  */
-static void
+void
 i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir)
 {
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
@@ -2214,7 +2214,7 @@ i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir)
  * @stat: a pointer to a structure of type *rte_eth_fdir_stats* to be filled with
  *    the flow director statistics.
  */
-static void
+void
 i40e_fdir_stats_get(struct rte_eth_dev *dev, struct rte_eth_fdir_stats *stat)
 {
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
diff --git a/drivers/net/i40e/rte_pmd_i40e.c b/drivers/net/i40e/rte_pmd_i40e.c
index 446e31710..e216e6783 100644
--- a/drivers/net/i40e/rte_pmd_i40e.c
+++ b/drivers/net/i40e/rte_pmd_i40e.c
@@ -3209,6 +3209,57 @@ rte_pmd_i40e_inset_set(uint16_t port, uint8_t pctype,
 	return 0;
 }
 
+int
+rte_pmd_i40e_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_i40e_supported(dev))
+		return -ENOTSUP;
+
+	i40e_fdir_info_get(dev, fdir_info);
+
+	return 0;
+}
+
+int
+rte_pmd_i40e_get_fdir_stats(uint16_t port, struct rte_eth_fdir_stats *fdir_stat)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_i40e_supported(dev))
+		return -ENOTSUP;
+
+	i40e_fdir_stats_get(dev, fdir_stat);
+
+	return 0;
+}
+
+int
+rte_pmd_i40e_set_gre_key_len(uint16_t port, uint8_t len)
+{
+	struct rte_eth_dev *dev;
+	struct i40e_pf *pf;
+	struct i40e_hw *hw;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_i40e_supported(dev))
+		return -ENOTSUP;
+
+	pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
+	hw = I40E_PF_TO_HW(pf);
+
+	return i40e_dev_set_gre_key_len(hw, len);
+}
+
 int
 rte_pmd_i40e_set_switch_dev(uint16_t port_id, struct rte_eth_dev *switch_dev)
 {
diff --git a/drivers/net/i40e/rte_pmd_i40e.h b/drivers/net/i40e/rte_pmd_i40e.h
index 915cdf076..0f6715efc 100644
--- a/drivers/net/i40e/rte_pmd_i40e.h
+++ b/drivers/net/i40e/rte_pmd_i40e.h
@@ -1061,6 +1061,55 @@ rte_pmd_i40e_inset_field_clear(uint64_t *inset, uint8_t field_idx)
 	return 0;
 }
 
+/**
+ * Get port fdir info
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param fdir_info
+ *   The fdir info of the port
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+__rte_experimental
+int
+rte_pmd_i40e_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info);
+
+/**
+ * Get port fdir status
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param fdir_stat
+ *   The fdir status of the port
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+__rte_experimental
+int
+rte_pmd_i40e_get_fdir_stats(uint16_t port,
+			    struct rte_eth_fdir_stats *fdir_stat);
+
+/**
+ * Set GRE key length
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param len
+ *   Length of gre-key
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+__rte_experimental
+int
+rte_pmd_i40e_set_gre_key_len(uint16_t port, uint8_t len);
+
 /**
  * For ipn3ke, i40e works with FPGA.
  * In this situation, i40e get link status from fpga,
diff --git a/drivers/net/i40e/rte_pmd_i40e_version.map b/drivers/net/i40e/rte_pmd_i40e_version.map
index c92c0cf46..f6cd3b356 100644
--- a/drivers/net/i40e/rte_pmd_i40e_version.map
+++ b/drivers/net/i40e/rte_pmd_i40e_version.map
@@ -42,5 +42,8 @@ DPDK_20.0 {
 EXPERIMENTAL {
 	global:
 
+	rte_pmd_i40e_get_fdir_info;
+	rte_pmd_i40e_get_fdir_stats;
+	rte_pmd_i40e_set_gre_key_len;
 	rte_pmd_i40e_set_switch_dev;
 };
-- 
2.17.1


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

* [dpdk-dev] [PATCH v2 2/5] net/ixgbe: add private APIs
  2020-06-15  2:18 ` [dpdk-dev] [PATCH v2 0/5] re-implement legacy filter functions by private API Chenxu Di
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 1/5] net/i40e: add private APIs Chenxu Di
@ 2020-06-15  2:18   ` Chenxu Di
  2020-06-30  5:25     ` Jeff Guo
  2020-06-30 10:25     ` Yang, Qiming
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
                     ` (2 subsequent siblings)
  4 siblings, 2 replies; 47+ messages in thread
From: Chenxu Di @ 2020-06-15  2:18 UTC (permalink / raw)
  To: dev; +Cc: beilei.xing, Yang Qiming, Chenxu Di

The legacy filter API will be superseded by rte_flow.
There are also several small features which can not be
implemented in rte_flow. This patch re-implemented these
features as private API.
Two APIs are added:
rte_pmd_ixgbe_get_fdir_info.
rte_pmd_ixgbe_get_fdir_stats.

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 drivers/net/ixgbe/ixgbe_ethdev.h            |  4 +++
 drivers/net/ixgbe/ixgbe_fdir.c              |  8 ++---
 drivers/net/ixgbe/rte_pmd_ixgbe.c           | 33 +++++++++++++++++++++
 drivers/net/ixgbe/rte_pmd_ixgbe.h           | 33 +++++++++++++++++++++
 drivers/net/ixgbe/rte_pmd_ixgbe_version.map |  2 ++
 5 files changed, 74 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h
index 3d78b2ee2..9bdef87fb 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.h
+++ b/drivers/net/ixgbe/ixgbe_ethdev.h
@@ -697,6 +697,10 @@ int ixgbe_fdir_set_flexbytes_offset(struct rte_eth_dev *dev,
 int ixgbe_fdir_filter_program(struct rte_eth_dev *dev,
 			      struct ixgbe_fdir_rule *rule,
 			      bool del, bool update);
+void ixgbe_fdir_info_get(struct rte_eth_dev *dev,
+			 struct rte_eth_fdir_info *fdir_info);
+void ixgbe_fdir_stats_get(struct rte_eth_dev *dev,
+			  struct rte_eth_fdir_stats *fdir_stats);
 
 void ixgbe_configure_dcb(struct rte_eth_dev *dev);
 
diff --git a/drivers/net/ixgbe/ixgbe_fdir.c b/drivers/net/ixgbe/ixgbe_fdir.c
index 166dae1e0..6faaa8f06 100644
--- a/drivers/net/ixgbe/ixgbe_fdir.c
+++ b/drivers/net/ixgbe/ixgbe_fdir.c
@@ -109,10 +109,6 @@ static int ixgbe_add_del_fdir_filter(struct rte_eth_dev *dev,
 			      bool del,
 			      bool update);
 static int ixgbe_fdir_flush(struct rte_eth_dev *dev);
-static void ixgbe_fdir_info_get(struct rte_eth_dev *dev,
-			struct rte_eth_fdir_info *fdir_info);
-static void ixgbe_fdir_stats_get(struct rte_eth_dev *dev,
-			struct rte_eth_fdir_stats *fdir_stats);
 
 /**
  * This function is based on ixgbe_fdir_enable_82599() in base/ixgbe_82599.c.
@@ -1414,7 +1410,7 @@ ixgbe_fdir_flush(struct rte_eth_dev *dev)
 }
 
 #define FDIRENTRIES_NUM_SHIFT 10
-static void
+void
 ixgbe_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir_info)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -1473,7 +1469,7 @@ ixgbe_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir_info
 			(uint8_t)((info->mask.flex_bytes_mask & 0xFF00) >> 8);
 }
 
-static void
+void
 ixgbe_fdir_stats_get(struct rte_eth_dev *dev, struct rte_eth_fdir_stats *fdir_stats)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.c b/drivers/net/ixgbe/rte_pmd_ixgbe.c
index 9bff557f9..d2f708242 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe.c
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe.c
@@ -1139,3 +1139,36 @@ rte_pmd_ixgbe_mdio_unlocked_write(uint16_t port, uint32_t reg_addr,
 	}
 	return 0;
 }
+
+int
+rte_pmd_ixgbe_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_ixgbe_supported(dev))
+		return -ENOTSUP;
+
+	ixgbe_fdir_info_get(dev, fdir_info);
+
+	return 0;
+}
+
+int
+rte_pmd_ixgbe_get_fdir_stats(uint16_t port,
+			     struct rte_eth_fdir_stats *fdir_stats)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_ixgbe_supported(dev))
+		return -ENOTSUP;
+
+	ixgbe_fdir_stats_get(dev, fdir_stats);
+
+	return 0;
+}
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.h b/drivers/net/ixgbe/rte_pmd_ixgbe.h
index f62fd761d..8b6bb99a5 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe.h
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe.h
@@ -726,4 +726,37 @@ enum {
 __rte_experimental
 int
 rte_pmd_ixgbe_upd_fctrl_sbp(uint16_t port, int enable);
+
+/**
+ * Get port fdir info
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param fdir_info
+ *   The fdir info of the port
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+__rte_experimental
+int
+rte_pmd_ixgbe_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info);
+
+/**
+ * Get port fdir status
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param fdir_stats
+ *   The fdir status of the port
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+__rte_experimental
+int
+rte_pmd_ixgbe_get_fdir_stats(uint16_t port,
+			     struct rte_eth_fdir_stats *fdir_stats);
 #endif /* _PMD_IXGBE_H_ */
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
index 21534dbc3..911f8083f 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
@@ -38,6 +38,8 @@ DPDK_20.0 {
 EXPERIMENTAL {
 	global:
 
+	rte_pmd_ixgbe_get_fdir_info;
+	rte_pmd_ixgbe_get_fdir_stats;
 	rte_pmd_ixgbe_mdio_lock;
 	rte_pmd_ixgbe_mdio_unlock;
 	rte_pmd_ixgbe_mdio_unlocked_read;
-- 
2.17.1


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

* [dpdk-dev] [PATCH v2 3/5] app/testpmd: re-implement commands by using private API
  2020-06-15  2:18 ` [dpdk-dev] [PATCH v2 0/5] re-implement legacy filter functions by private API Chenxu Di
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 1/5] net/i40e: add private APIs Chenxu Di
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 2/5] net/ixgbe: " Chenxu Di
@ 2020-06-15  2:18   ` Chenxu Di
  2020-06-30 10:34     ` Yang, Qiming
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 4/5] net/i40e: enable flow query RSS Chenxu Di
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 5/5] app/testpmd: support query RSS config in flow query Chenxu Di
  4 siblings, 1 reply; 47+ messages in thread
From: Chenxu Di @ 2020-06-15  2:18 UTC (permalink / raw)
  To: dev; +Cc: beilei.xing, Yang Qiming, Chenxu Di

The legacy filter API will be superseded. This patch use
private api to change the implementation of commands
global_config <port_id> gre-key-len <key_len> and
show port fdir <port_id>

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 app/test-pmd/cmdline.c | 23 ++++++++-----
 app/test-pmd/config.c  | 74 +++++++++++++++++++++++++++++++++++-------
 2 files changed, 78 insertions(+), 19 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 996a49876..01d793e89 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -9280,15 +9280,22 @@ cmd_global_config_parsed(void *parsed_result,
 {
 	struct cmd_global_config_result *res = parsed_result;
 	struct rte_eth_global_cfg conf;
-	int ret;
+	int ret = -ENOTSUP;
 
-	memset(&conf, 0, sizeof(conf));
-	conf.cfg_type = RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN;
-	conf.cfg.gre_key_len = res->len;
-	ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE,
-				      RTE_ETH_FILTER_SET, &conf);
-	if (ret != 0)
-		printf("Global config error\n");
+#ifdef RTE_LIBRTE_I40E_PMD
+	if (ret == -ENOTSUP)
+		ret = rte_pmd_i40e_set_gre_key_len(res->port_id, res->len);
+#endif
+	if (ret == -ENOTSUP) {
+		memset(&conf, 0, sizeof(conf));
+		conf.cfg_type = RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN;
+		conf.cfg.gre_key_len = res->len;
+		ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE,
+					      RTE_ETH_FILTER_SET, &conf);
+	}
+
+	if (ret < 0)
+		printf("Global config error: (%s)\n", strerror(-ret));
 }
 
 cmdline_parse_token_string_t cmd_global_config_cmd =
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 016bcb09c..f519246c7 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -3729,30 +3729,82 @@ print_fdir_flow_type(uint32_t flow_types_mask)
 	printf("\n");
 }
 
+static int
+get_fdir_info(portid_t port_id, struct rte_eth_fdir_info *fdir_info)
+{
+	int ret;
+#ifdef RTE_LIBRTE_I40E_PMD
+	ret = rte_pmd_i40e_get_fdir_info(port_id, fdir_info);
+#endif
+#ifdef RTE_LIBRTE_IXGBE_PMD
+	if (ret == -ENOTSUP)
+		ret = rte_pmd_ixgbe_get_fdir_info(port_id, fdir_info);
+#endif
+	if (ret == -ENOTSUP) {
+		ret = rte_eth_dev_filter_supported(port_id,
+						   RTE_ETH_FILTER_FDIR);
+		if (ret < 0) {
+			printf("\n FDIR is not supported on port %-2d\n",
+				port_id);
+			return ret;
+		}
+		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
+					RTE_ETH_FILTER_INFO, fdir_info);
+	}
+
+	if (ret < 0)
+		printf("Get fdir infos error: (%s)\n", strerror(-ret));
+
+	return ret;
+}
+
+static int
+get_fdir_stat(portid_t port_id, struct rte_eth_fdir_stats *fdir_stat)
+{
+	int ret;
+#ifdef RTE_LIBRTE_I40E_PMD
+	ret = rte_pmd_i40e_get_fdir_stats(port_id, fdir_stat);
+#endif
+#ifdef RTE_LIBRTE_IXGBE_PMD
+	if (ret == -ENOTSUP)
+		ret = rte_pmd_ixgbe_get_fdir_stats(port_id, fdir_stat);
+#endif
+	if (ret == -ENOTSUP) {
+		ret = rte_eth_dev_filter_supported(port_id,
+						   RTE_ETH_FILTER_FDIR);
+		if (ret < 0) {
+			printf("\n FDIR is not supported on port %-2d\n",
+				port_id);
+			return ret;
+		}
+		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
+					RTE_ETH_FILTER_STATS, fdir_stat);
+	}
+
+	if (ret < 0)
+		printf("Get fdir infos error: (%s)\n", strerror(-ret));
+
+	return ret;
+}
+
 void
 fdir_get_infos(portid_t port_id)
 {
 	struct rte_eth_fdir_stats fdir_stat;
 	struct rte_eth_fdir_info fdir_info;
-	int ret;
 
 	static const char *fdir_stats_border = "########################";
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
 		return;
-	ret = rte_eth_dev_filter_supported(port_id, RTE_ETH_FILTER_FDIR);
-	if (ret < 0) {
-		printf("\n FDIR is not supported on port %-2d\n",
-			port_id);
-		return;
-	}
 
 	memset(&fdir_info, 0, sizeof(fdir_info));
-	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
-			       RTE_ETH_FILTER_INFO, &fdir_info);
+	if (get_fdir_info(port_id, &fdir_info))
+		return;
 	memset(&fdir_stat, 0, sizeof(fdir_stat));
-	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
-			       RTE_ETH_FILTER_STATS, &fdir_stat);
+	if (get_fdir_stat(port_id, &fdir_stat))
+		return;
+
 	printf("\n  %s FDIR infos for port %-2d     %s\n",
 	       fdir_stats_border, port_id, fdir_stats_border);
 	printf("  MODE: ");
-- 
2.17.1


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

* [dpdk-dev] [PATCH v2 4/5] net/i40e: enable flow query RSS
  2020-06-15  2:18 ` [dpdk-dev] [PATCH v2 0/5] re-implement legacy filter functions by private API Chenxu Di
                     ` (2 preceding siblings ...)
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
@ 2020-06-15  2:18   ` Chenxu Di
  2020-06-30  6:48     ` Jeff Guo
  2020-06-30 10:27     ` Yang, Qiming
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 5/5] app/testpmd: support query RSS config in flow query Chenxu Di
  4 siblings, 2 replies; 47+ messages in thread
From: Chenxu Di @ 2020-06-15  2:18 UTC (permalink / raw)
  To: dev; +Cc: beilei.xing, Yang Qiming, Chenxu Di

This patch enables flow query function to get the
configuration ofthe specified rule.

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 drivers/net/i40e/i40e_flow.c | 51 ++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c
index 8f8df6fae..b070802bd 100644
--- a/drivers/net/i40e/i40e_flow.c
+++ b/drivers/net/i40e/i40e_flow.c
@@ -43,6 +43,11 @@ static int i40e_flow_destroy(struct rte_eth_dev *dev,
 			     struct rte_flow_error *error);
 static int i40e_flow_flush(struct rte_eth_dev *dev,
 			   struct rte_flow_error *error);
+static int i40e_flow_query(struct rte_eth_dev *dev,
+			   struct rte_flow *flow,
+			   const struct rte_flow_action *actions,
+			   void *data,
+			   struct rte_flow_error *error);
 static int
 i40e_flow_parse_ethertype_pattern(struct rte_eth_dev *dev,
 				  const struct rte_flow_item *pattern,
@@ -129,6 +134,7 @@ const struct rte_flow_ops i40e_flow_ops = {
 	.create = i40e_flow_create,
 	.destroy = i40e_flow_destroy,
 	.flush = i40e_flow_flush,
+	.query = i40e_flow_query,
 };
 
 static union i40e_filter_t cons_filter;
@@ -5462,3 +5468,48 @@ i40e_flow_flush_rss_filter(struct rte_eth_dev *dev)
 
 	return ret;
 }
+
+static int
+i40e_flow_query(struct rte_eth_dev *dev __rte_unused,
+		struct rte_flow *flow,
+		const struct rte_flow_action *actions,
+		void *data,
+		struct rte_flow_error *error)
+{
+	struct i40e_rss_filter *rss_rule = (struct i40e_rss_filter *)flow->rule;
+	enum rte_filter_type filter_type = flow->filter_type;
+	struct rte_flow_action_rss *rss_conf = data;
+
+	if (!rss_rule) {
+		rte_flow_error_set(error, EINVAL,
+				   RTE_FLOW_ERROR_TYPE_HANDLE,
+				   NULL, "Invalid rule");
+		return -rte_errno;
+	}
+
+	for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
+		switch (actions->type) {
+		case RTE_FLOW_ACTION_TYPE_VOID:
+			break;
+		case RTE_FLOW_ACTION_TYPE_RSS:
+			if (filter_type != RTE_ETH_FILTER_HASH) {
+				rte_flow_error_set(error, ENOTSUP,
+						   RTE_FLOW_ERROR_TYPE_ACTION,
+						   actions,
+						   "action not supported");
+				return -rte_errno;
+			}
+			rte_memcpy(rss_conf,
+				   &rss_rule->rss_filter_info.conf,
+				   sizeof(struct rte_flow_action_rss));
+			break;
+		default:
+			return rte_flow_error_set(error, ENOTSUP,
+						  RTE_FLOW_ERROR_TYPE_ACTION,
+						  actions,
+						  "action not supported");
+		}
+	}
+
+	return 0;
+}
-- 
2.17.1


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

* [dpdk-dev] [PATCH v2 5/5] app/testpmd: support query RSS config in flow query
  2020-06-15  2:18 ` [dpdk-dev] [PATCH v2 0/5] re-implement legacy filter functions by private API Chenxu Di
                     ` (3 preceding siblings ...)
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 4/5] net/i40e: enable flow query RSS Chenxu Di
@ 2020-06-15  2:18   ` Chenxu Di
  2020-06-30  6:37     ` Jeff Guo
  2020-06-30 10:40     ` Yang, Qiming
  4 siblings, 2 replies; 47+ messages in thread
From: Chenxu Di @ 2020-06-15  2:18 UTC (permalink / raw)
  To: dev; +Cc: beilei.xing, Yang Qiming, Chenxu Di

This patch support RSS action in flow query.
It can display the RSS configuration of the specified rule.

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 app/test-pmd/config.c | 55 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index f519246c7..7e3cccf9a 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -1378,6 +1378,56 @@ port_flow_complain(struct rte_flow_error *error)
 	return -err;
 }
 
+static void
+rss_config_display(struct rte_flow_action_rss *rss_conf)
+{
+	uint8_t i;
+
+	if (rss_conf == NULL) {
+		printf("Invalid rule\n");
+		return;
+	}
+
+	printf("RSS:\n"
+	       " queues:");
+	if (rss_conf->queue_num == 0)
+		printf(" none");
+	for (i = 0; i < rss_conf->queue_num; i++)
+		printf(" %d", rss_conf->queue[i]);
+
+	printf("\n function:");
+	switch (rss_conf->func) {
+	case RTE_ETH_HASH_FUNCTION_DEFAULT:
+		printf(" default\n");
+		break;
+	case RTE_ETH_HASH_FUNCTION_TOEPLITZ:
+		printf(" toeplitz\n");
+		break;
+	case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR:
+		printf(" simple_xor\n");
+		break;
+	case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ:
+		printf(" symmetric_toeplitz\n");
+		break;
+	default:
+		printf(" Unknown function\n");
+		return;
+	}
+
+	printf(" types:\n");
+	if (rss_conf->types == 0) {
+		printf("  none\n");
+		return;
+	}
+	for (i = 0; rss_type_table[i].str; i++) {
+		if ((rss_conf->types &
+		    rss_type_table[i].rss_type) ==
+		    rss_type_table[i].rss_type &&
+		    rss_type_table[i].rss_type != 0)
+			printf("  %s\n", rss_type_table[i].str);
+	}
+}
+
 /** Validate flow rule. */
 int
 port_flow_validate(portid_t port_id,
@@ -1564,6 +1614,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
 	const char *name;
 	union {
 		struct rte_flow_query_count count;
+		struct rte_flow_action_rss rss_conf;
 	} query;
 	int ret;
 
@@ -1585,6 +1636,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
 		return port_flow_complain(&error);
 	switch (action->type) {
 	case RTE_FLOW_ACTION_TYPE_COUNT:
+	case RTE_FLOW_ACTION_TYPE_RSS:
 		break;
 	default:
 		printf("Cannot query action type %d (%s)\n",
@@ -1609,6 +1661,9 @@ port_flow_query(portid_t port_id, uint32_t rule,
 		       query.count.hits,
 		       query.count.bytes);
 		break;
+	case RTE_FLOW_ACTION_TYPE_RSS:
+		rss_config_display(&query.rss_conf);
+		break;
 	default:
 		printf("Cannot display result for action type %d (%s)\n",
 		       action->type, name);
-- 
2.17.1


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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: re-implement commands by using private API
  2020-06-11  6:01 ` [dpdk-dev] [PATCH 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
@ 2020-06-16 20:12   ` Kevin Traynor
  2020-06-17 10:12     ` Di, ChenxuX
  0 siblings, 1 reply; 47+ messages in thread
From: Kevin Traynor @ 2020-06-16 20:12 UTC (permalink / raw)
  To: Chenxu Di, dev; +Cc: beilei.xing, Yang Qiming

On 11/06/2020 07:01, Chenxu Di wrote:
> The legacy filter API will be superseded. This patch use
> private api to change the implementation of commands
> global_config <port_id> gre-key-len <key_len> and
> show port fdir <port_id>
> 
> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>  app/test-pmd/cmdline.c | 23 ++++++++-----
>  app/test-pmd/config.c  | 74 +++++++++++++++++++++++++++++++++++-------
>  2 files changed, 78 insertions(+), 19 deletions(-)
> 
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
> index 996a49876..01d793e89 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -9280,15 +9280,22 @@ cmd_global_config_parsed(void *parsed_result,
>  {
>  	struct cmd_global_config_result *res = parsed_result;
>  	struct rte_eth_global_cfg conf;
> -	int ret;
> +	int ret = -ENOTSUP;
>  
> -	memset(&conf, 0, sizeof(conf));
> -	conf.cfg_type = RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN;
> -	conf.cfg.gre_key_len = res->len;
> -	ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE,
> -				      RTE_ETH_FILTER_SET, &conf);
> -	if (ret != 0)
> -		printf("Global config error\n");
> +#ifdef RTE_LIBRTE_I40E_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_i40e_set_gre_key_len(res->port_id, res->len);
> +#endif
> +	if (ret == -ENOTSUP) {
> +		memset(&conf, 0, sizeof(conf));
> +		conf.cfg_type = RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN;
> +		conf.cfg.gre_key_len = res->len;
> +		ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE,
> +					      RTE_ETH_FILTER_SET, &conf);
> +	}
> +
> +	if (ret < 0)
> +		printf("Global config error: (%s)\n", strerror(-ret));
>  }
>  
>  cmdline_parse_token_string_t cmd_global_config_cmd =
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
> index 016bcb09c..f519246c7 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -3729,30 +3729,82 @@ print_fdir_flow_type(uint32_t flow_types_mask)
>  	printf("\n");
>  }
>  
> +static int
> +get_fdir_info(portid_t port_id, struct rte_eth_fdir_info *fdir_info)
> +{
> +	int ret;

this looks like it won't compile if the RTE_LIBRTE_I40E_PMD is
undefined, you'll need to initialize ret

> +#ifdef RTE_LIBRTE_I40E_PMD
> +	ret = rte_pmd_i40e_get_fdir_info(port_id, fdir_info);
> +#endif
> +#ifdef RTE_LIBRTE_IXGBE_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_ixgbe_get_fdir_info(port_id, fdir_info);
> +#endif
> +	if (ret == -ENOTSUP) {
> +		ret = rte_eth_dev_filter_supported(port_id,
> +						   RTE_ETH_FILTER_FDIR);
> +		if (ret < 0) {
> +			printf("\n FDIR is not supported on port %-2d\n",
> +				port_id);
> +			return ret;
> +		}
> +		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> +					RTE_ETH_FILTER_INFO, fdir_info);
> +	}
> +
> +	if (ret < 0)
> +		printf("Get fdir infos error: (%s)\n", strerror(-ret));
> +
> +	return ret;
> +}
> +
> +static int
> +get_fdir_stat(portid_t port_id, struct rte_eth_fdir_stats *fdir_stat)
> +{
> +	int ret;

Same comment as above

> +#ifdef RTE_LIBRTE_I40E_PMD
> +	ret = rte_pmd_i40e_get_fdir_stats(port_id, fdir_stat);
> +#endif
> +#ifdef RTE_LIBRTE_IXGBE_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_ixgbe_get_fdir_stats(port_id, fdir_stat);
> +#endif
> +	if (ret == -ENOTSUP) {
> +		ret = rte_eth_dev_filter_supported(port_id,
> +						   RTE_ETH_FILTER_FDIR);
> +		if (ret < 0) {
> +			printf("\n FDIR is not supported on port %-2d\n",
> +				port_id);
> +			return ret;
> +		}
> +		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> +					RTE_ETH_FILTER_STATS, fdir_stat);
> +	}
> +
> +	if (ret < 0)
> +		printf("Get fdir infos error: (%s)\n", strerror(-ret));
> +
> +	return ret;
> +}
> +
>  void
>  fdir_get_infos(portid_t port_id)
>  {
>  	struct rte_eth_fdir_stats fdir_stat;
>  	struct rte_eth_fdir_info fdir_info;
> -	int ret;
>  
>  	static const char *fdir_stats_border = "########################";
>  
>  	if (port_id_is_invalid(port_id, ENABLED_WARN))
>  		return;
> -	ret = rte_eth_dev_filter_supported(port_id, RTE_ETH_FILTER_FDIR);
> -	if (ret < 0) {
> -		printf("\n FDIR is not supported on port %-2d\n",
> -			port_id);
> -		return;
> -	}
>  
>  	memset(&fdir_info, 0, sizeof(fdir_info));
> -	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> -			       RTE_ETH_FILTER_INFO, &fdir_info);
> +	if (get_fdir_info(port_id, &fdir_info))
> +		return;
>  	memset(&fdir_stat, 0, sizeof(fdir_stat));
> -	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> -			       RTE_ETH_FILTER_STATS, &fdir_stat);
> +	if (get_fdir_stat(port_id, &fdir_stat))
> +		return;
> +
>  	printf("\n  %s FDIR infos for port %-2d     %s\n",
>  	       fdir_stats_border, port_id, fdir_stats_border);
>  	printf("  MODE: ");
> 


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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: re-implement commands by using private API
  2020-06-16 20:12   ` Kevin Traynor
@ 2020-06-17 10:12     ` Di, ChenxuX
  2020-06-30  6:20       ` Jeff Guo
  0 siblings, 1 reply; 47+ messages in thread
From: Di, ChenxuX @ 2020-06-17 10:12 UTC (permalink / raw)
  To: Kevin Traynor, dev; +Cc: Xing, Beilei, Yang, Qiming



> -----Original Message-----
> From: Kevin Traynor [mailto:ktraynor@redhat.com]
> Sent: Wednesday, June 17, 2020 4:12 AM
> To: Di, ChenxuX <chenxux.di@intel.com>; dev@dpdk.org
> Cc: Xing, Beilei <beilei.xing@intel.com>; Yang, Qiming <qiming.yang@intel.com>
> Subject: Re: [dpdk-dev] [PATCH 3/5] app/testpmd: re-implement commands by
> using private API
> 
> On 11/06/2020 07:01, Chenxu Di wrote:
> > The legacy filter API will be superseded. This patch use private api
> > to change the implementation of commands global_config <port_id>
> > gre-key-len <key_len> and show port fdir <port_id>
> >
> > Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> > ---
> >  app/test-pmd/cmdline.c | 23 ++++++++-----  app/test-pmd/config.c  |
> > 74 +++++++++++++++++++++++++++++++++++-------
> >  2 files changed, 78 insertions(+), 19 deletions(-)
> >
> > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
> > 996a49876..01d793e89 100644
> > --- a/app/test-pmd/cmdline.c
> > +++ b/app/test-pmd/cmdline.c
> > @@ -9280,15 +9280,22 @@ cmd_global_config_parsed(void *parsed_result,
> > {
> >  	struct cmd_global_config_result *res = parsed_result;
> >  	struct rte_eth_global_cfg conf;
> > -	int ret;
> > +	int ret = -ENOTSUP;
> >
> > -	memset(&conf, 0, sizeof(conf));
> > -	conf.cfg_type = RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN;
> > -	conf.cfg.gre_key_len = res->len;
> > -	ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE,
> > -				      RTE_ETH_FILTER_SET, &conf);
> > -	if (ret != 0)
> > -		printf("Global config error\n");
> > +#ifdef RTE_LIBRTE_I40E_PMD
> > +	if (ret == -ENOTSUP)
> > +		ret = rte_pmd_i40e_set_gre_key_len(res->port_id, res->len);
> #endif
> > +	if (ret == -ENOTSUP) {
> > +		memset(&conf, 0, sizeof(conf));
> > +		conf.cfg_type = RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN;
> > +		conf.cfg.gre_key_len = res->len;
> > +		ret = rte_eth_dev_filter_ctrl(res->port_id,
> RTE_ETH_FILTER_NONE,
> > +					      RTE_ETH_FILTER_SET, &conf);
> > +	}
> > +
> > +	if (ret < 0)
> > +		printf("Global config error: (%s)\n", strerror(-ret));
> >  }
> >
> >  cmdline_parse_token_string_t cmd_global_config_cmd = diff --git
> > a/app/test-pmd/config.c b/app/test-pmd/config.c index
> > 016bcb09c..f519246c7 100644
> > --- a/app/test-pmd/config.c
> > +++ b/app/test-pmd/config.c
> > @@ -3729,30 +3729,82 @@ print_fdir_flow_type(uint32_t flow_types_mask)
> >  	printf("\n");
> >  }
> >
> > +static int
> > +get_fdir_info(portid_t port_id, struct rte_eth_fdir_info *fdir_info)
> > +{
> > +	int ret;
> 
> this looks like it won't compile if the RTE_LIBRTE_I40E_PMD is undefined, you'll
> need to initialize ret
> 

Yes, got it, I will fix it in next version patch.

> > +#ifdef RTE_LIBRTE_I40E_PMD
> > +	ret = rte_pmd_i40e_get_fdir_info(port_id, fdir_info); #endif #ifdef
> > +RTE_LIBRTE_IXGBE_PMD
> > +	if (ret == -ENOTSUP)
> > +		ret = rte_pmd_ixgbe_get_fdir_info(port_id, fdir_info); #endif
> > +	if (ret == -ENOTSUP) {
> > +		ret = rte_eth_dev_filter_supported(port_id,
> > +						   RTE_ETH_FILTER_FDIR);
> > +		if (ret < 0) {
> > +			printf("\n FDIR is not supported on port %-2d\n",
> > +				port_id);
> > +			return ret;
> > +		}
> > +		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> > +					RTE_ETH_FILTER_INFO, fdir_info);
> > +	}
> > +
> > +	if (ret < 0)
> > +		printf("Get fdir infos error: (%s)\n", strerror(-ret));
> > +
> > +	return ret;
> > +}
> > +
> > +static int
> > +get_fdir_stat(portid_t port_id, struct rte_eth_fdir_stats *fdir_stat)
> > +{
> > +	int ret;
> 
> Same comment as above
> 

OK

> > +#ifdef RTE_LIBRTE_I40E_PMD
> > +	ret = rte_pmd_i40e_get_fdir_stats(port_id, fdir_stat); #endif #ifdef
> > +RTE_LIBRTE_IXGBE_PMD
> > +	if (ret == -ENOTSUP)
> > +		ret = rte_pmd_ixgbe_get_fdir_stats(port_id, fdir_stat); #endif
> > +	if (ret == -ENOTSUP) {
> > +		ret = rte_eth_dev_filter_supported(port_id,
> > +						   RTE_ETH_FILTER_FDIR);
> > +		if (ret < 0) {
> > +			printf("\n FDIR is not supported on port %-2d\n",
> > +				port_id);
> > +			return ret;
> > +		}
> > +		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> > +					RTE_ETH_FILTER_STATS, fdir_stat);
> > +	}
> > +
> > +	if (ret < 0)
> > +		printf("Get fdir infos error: (%s)\n", strerror(-ret));
> > +
> > +	return ret;
> > +}
> > +
> >  void
> >  fdir_get_infos(portid_t port_id)
> >  {
> >  	struct rte_eth_fdir_stats fdir_stat;
> >  	struct rte_eth_fdir_info fdir_info;
> > -	int ret;
> >
> >  	static const char *fdir_stats_border = "########################";
> >
> >  	if (port_id_is_invalid(port_id, ENABLED_WARN))
> >  		return;
> > -	ret = rte_eth_dev_filter_supported(port_id, RTE_ETH_FILTER_FDIR);
> > -	if (ret < 0) {
> > -		printf("\n FDIR is not supported on port %-2d\n",
> > -			port_id);
> > -		return;
> > -	}
> >
> >  	memset(&fdir_info, 0, sizeof(fdir_info));
> > -	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> > -			       RTE_ETH_FILTER_INFO, &fdir_info);
> > +	if (get_fdir_info(port_id, &fdir_info))
> > +		return;
> >  	memset(&fdir_stat, 0, sizeof(fdir_stat));
> > -	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> > -			       RTE_ETH_FILTER_STATS, &fdir_stat);
> > +	if (get_fdir_stat(port_id, &fdir_stat))
> > +		return;
> > +
> >  	printf("\n  %s FDIR infos for port %-2d     %s\n",
> >  	       fdir_stats_border, port_id, fdir_stats_border);
> >  	printf("  MODE: ");
> >


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

* Re: [dpdk-dev] [PATCH v2 1/5] net/i40e: add private APIs
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 1/5] net/i40e: add private APIs Chenxu Di
@ 2020-06-30  4:22     ` Jeff Guo
  2020-06-30 10:24     ` Yang, Qiming
  1 sibling, 0 replies; 47+ messages in thread
From: Jeff Guo @ 2020-06-30  4:22 UTC (permalink / raw)
  To: Chenxu Di, dev; +Cc: beilei.xing, Yang Qiming

hi, chenxu

On 6/15/2020 10:18 AM, Chenxu Di wrote:
> The legacy filter API will be superseded by rte_flow.
> There are also several small features which can not be
> implemented in rte_flow. This patch re-implemented these
> features as private API.
> Three APIs are added:
> rte_pmd_i40e_get_fdir_info.
> rte_pmd_i40e_get_fdir_stats.
> rte_pmd_i40e_set_gre_key_len.
>
> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>   doc/guides/rel_notes/release_20_08.rst    | 14 +++++++
>   drivers/net/i40e/i40e_ethdev.c            |  2 +-
>   drivers/net/i40e/i40e_ethdev.h            |  5 +++
>   drivers/net/i40e/i40e_fdir.c              |  4 +-
>   drivers/net/i40e/rte_pmd_i40e.c           | 51 +++++++++++++++++++++++
>   drivers/net/i40e/rte_pmd_i40e.h           | 49 ++++++++++++++++++++++
>   drivers/net/i40e/rte_pmd_i40e_version.map |  3 ++
>   7 files changed, 125 insertions(+), 3 deletions(-)
>
> diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst
> index dee4ccbb5..550ad33aa 100644
> --- a/doc/guides/rel_notes/release_20_08.rst
> +++ b/doc/guides/rel_notes/release_20_08.rst
> @@ -62,6 +62,20 @@ New Features
>   
>     * Added new PMD devarg ``reclaim_mem_mode``.
>   
> +* **Updated the Intel i40e driver.**
> +
> +  Updated the Intel i40e driver with new features and improvements, including:
> +
> +  * Re-implemented get_fdir_info and get_fdir_stat in private API.
> +  * Re-implemented set_gre_key_len in private API.
> +  * Added support for flow query RSS.
> +
> +* **Updated the Intel ixgbe driver.**
> +
> +  Updated the Intel ixgbe driver with new features and improvements, including:
> +
> +  * Re-implemented get_fdir_info and get_fdir_stat in private API.
> +
>   


Should the ixgbe part of document remove into the next ixgbe patch [2/5]?


>   Removed Items
>   -------------
> diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
> index 970a31cb2..674b711d9 100644
> --- a/drivers/net/i40e/i40e_ethdev.c
> +++ b/drivers/net/i40e/i40e_ethdev.c
> @@ -8787,7 +8787,7 @@ i40e_tunnel_filter_param_check(struct i40e_pf *pf,
>   
>   #define I40E_GL_PRS_FVBM_MSK_ENA 0x80000000
>   #define I40E_GL_PRS_FVBM(_i)     (0x00269760 + ((_i) * 4))
> -static int
> +int
>   i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len)
>   {
>   	struct i40e_pf *pf = &((struct i40e_adapter *)hw->back)->pf;
> diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
> index e5d0ce53f..192636927 100644
> --- a/drivers/net/i40e/i40e_ethdev.h
> +++ b/drivers/net/i40e/i40e_ethdev.h
> @@ -1270,6 +1270,11 @@ enum i40e_filter_pctype
>   				uint16_t flow_type);
>   uint16_t i40e_pctype_to_flowtype(const struct i40e_adapter *adapter,
>   				 enum i40e_filter_pctype pctype);
> +int i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len);
> +void i40e_fdir_info_get(struct rte_eth_dev *dev,
> +			struct rte_eth_fdir_info *fdir);
> +void i40e_fdir_stats_get(struct rte_eth_dev *dev,
> +			 struct rte_eth_fdir_stats *stat);


Please check the alignment.


>   int i40e_fdir_ctrl_func(struct rte_eth_dev *dev,
>   			  enum rte_filter_op filter_op,
>   			  void *arg);
> diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c
> index d59399afe..4a778db4c 100644
> --- a/drivers/net/i40e/i40e_fdir.c
> +++ b/drivers/net/i40e/i40e_fdir.c
> @@ -2169,7 +2169,7 @@ i40e_fdir_info_get_flex_mask(struct i40e_pf *pf,
>    * @fdir: a pointer to a structure of type *rte_eth_fdir_info* to be filled with
>    *    the flow director information.
>    */
> -static void
> +void
>   i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir)
>   {
>   	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
> @@ -2214,7 +2214,7 @@ i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir)
>    * @stat: a pointer to a structure of type *rte_eth_fdir_stats* to be filled with
>    *    the flow director statistics.
>    */
> -static void
> +void
>   i40e_fdir_stats_get(struct rte_eth_dev *dev, struct rte_eth_fdir_stats *stat)
>   {
>   	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
> diff --git a/drivers/net/i40e/rte_pmd_i40e.c b/drivers/net/i40e/rte_pmd_i40e.c
> index 446e31710..e216e6783 100644
> --- a/drivers/net/i40e/rte_pmd_i40e.c
> +++ b/drivers/net/i40e/rte_pmd_i40e.c
> @@ -3209,6 +3209,57 @@ rte_pmd_i40e_inset_set(uint16_t port, uint8_t pctype,
>   	return 0;
>   }
>   
> +int
> +rte_pmd_i40e_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info)
> +{
> +	struct rte_eth_dev *dev;
> +
> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
> +
> +	dev = &rte_eth_devices[port];
> +	if (!is_i40e_supported(dev))
> +		return -ENOTSUP;
> +
> +	i40e_fdir_info_get(dev, fdir_info);
> +
> +	return 0;
> +}
> +
> +int
> +rte_pmd_i40e_get_fdir_stats(uint16_t port, struct rte_eth_fdir_stats *fdir_stat)
> +{
> +	struct rte_eth_dev *dev;
> +
> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
> +
> +	dev = &rte_eth_devices[port];
> +	if (!is_i40e_supported(dev))
> +		return -ENOTSUP;
> +
> +	i40e_fdir_stats_get(dev, fdir_stat);
> +
> +	return 0;
> +}
> +
> +int
> +rte_pmd_i40e_set_gre_key_len(uint16_t port, uint8_t len)
> +{
> +	struct rte_eth_dev *dev;
> +	struct i40e_pf *pf;
> +	struct i40e_hw *hw;
> +
> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
> +
> +	dev = &rte_eth_devices[port];
> +	if (!is_i40e_supported(dev))
> +		return -ENOTSUP;
> +
> +	pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
> +	hw = I40E_PF_TO_HW(pf);
> +
> +	return i40e_dev_set_gre_key_len(hw, len);
> +}
> +
>   int
>   rte_pmd_i40e_set_switch_dev(uint16_t port_id, struct rte_eth_dev *switch_dev)
>   {
> diff --git a/drivers/net/i40e/rte_pmd_i40e.h b/drivers/net/i40e/rte_pmd_i40e.h
> index 915cdf076..0f6715efc 100644
> --- a/drivers/net/i40e/rte_pmd_i40e.h
> +++ b/drivers/net/i40e/rte_pmd_i40e.h
> @@ -1061,6 +1061,55 @@ rte_pmd_i40e_inset_field_clear(uint64_t *inset, uint8_t field_idx)
>   	return 0;
>   }
>   
> +/**
> + * Get port fdir info
> + *
> + * @param port
> + *   The port identifier of the Ethernet device.
> + * @param fdir_info
> + *   The fdir info of the port
> + * @return
> + *   - (0) if successful.
> + *   - (-ENODEV) if *port* invalid.
> + *   - (-ENOTSUP) if operation not supported.
> + */
> +__rte_experimental
> +int
> +rte_pmd_i40e_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info);
> +
> +/**
> + * Get port fdir status
> + *
> + * @param port
> + *   The port identifier of the Ethernet device.
> + * @param fdir_stat
> + *   The fdir status of the port
> + * @return
> + *   - (0) if successful.
> + *   - (-ENODEV) if *port* invalid.
> + *   - (-ENOTSUP) if operation not supported.
> + */
> +__rte_experimental
> +int
> +rte_pmd_i40e_get_fdir_stats(uint16_t port,
> +			    struct rte_eth_fdir_stats *fdir_stat);
> +
> +/**
> + * Set GRE key length
> + *
> + * @param port
> + *   The port identifier of the Ethernet device.
> + * @param len
> + *   Length of gre-key
> + * @return
> + *   - (0) if successful.
> + *   - (-ENODEV) if *port* invalid.
> + *   - (-ENOTSUP) if operation not supported.
> + */
> +__rte_experimental
> +int
> +rte_pmd_i40e_set_gre_key_len(uint16_t port, uint8_t len);
> +
>   /**
>    * For ipn3ke, i40e works with FPGA.
>    * In this situation, i40e get link status from fpga,
> diff --git a/drivers/net/i40e/rte_pmd_i40e_version.map b/drivers/net/i40e/rte_pmd_i40e_version.map
> index c92c0cf46..f6cd3b356 100644
> --- a/drivers/net/i40e/rte_pmd_i40e_version.map
> +++ b/drivers/net/i40e/rte_pmd_i40e_version.map
> @@ -42,5 +42,8 @@ DPDK_20.0 {
>   EXPERIMENTAL {
>   	global:
>   
> +	rte_pmd_i40e_get_fdir_info;
> +	rte_pmd_i40e_get_fdir_stats;
> +	rte_pmd_i40e_set_gre_key_len;
>   	rte_pmd_i40e_set_switch_dev;
>   };

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

* Re: [dpdk-dev] [PATCH v2 2/5] net/ixgbe: add private APIs
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 2/5] net/ixgbe: " Chenxu Di
@ 2020-06-30  5:25     ` Jeff Guo
  2020-06-30 10:25     ` Yang, Qiming
  1 sibling, 0 replies; 47+ messages in thread
From: Jeff Guo @ 2020-06-30  5:25 UTC (permalink / raw)
  To: Chenxu Di, dev; +Cc: beilei.xing, Yang Qiming

hi, chenxu

On 6/15/2020 10:18 AM, Chenxu Di wrote:
> The legacy filter API will be superseded by rte_flow.
> There are also several small features which can not be
> implemented in rte_flow. This patch re-implemented these
> features as private API.
> Two APIs are added:
> rte_pmd_ixgbe_get_fdir_info.
> rte_pmd_ixgbe_get_fdir_stats.
>
> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>   drivers/net/ixgbe/ixgbe_ethdev.h            |  4 +++
>   drivers/net/ixgbe/ixgbe_fdir.c              |  8 ++---
>   drivers/net/ixgbe/rte_pmd_ixgbe.c           | 33 +++++++++++++++++++++
>   drivers/net/ixgbe/rte_pmd_ixgbe.h           | 33 +++++++++++++++++++++
>   drivers/net/ixgbe/rte_pmd_ixgbe_version.map |  2 ++
>   5 files changed, 74 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h
> index 3d78b2ee2..9bdef87fb 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.h
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.h
> @@ -697,6 +697,10 @@ int ixgbe_fdir_set_flexbytes_offset(struct rte_eth_dev *dev,
>   int ixgbe_fdir_filter_program(struct rte_eth_dev *dev,
>   			      struct ixgbe_fdir_rule *rule,
>   			      bool del, bool update);
> +void ixgbe_fdir_info_get(struct rte_eth_dev *dev,
> +			 struct rte_eth_fdir_info *fdir_info);
> +void ixgbe_fdir_stats_get(struct rte_eth_dev *dev,
> +			  struct rte_eth_fdir_stats *fdir_stats);
>   
>   void ixgbe_configure_dcb(struct rte_eth_dev *dev);
>   
> diff --git a/drivers/net/ixgbe/ixgbe_fdir.c b/drivers/net/ixgbe/ixgbe_fdir.c
> index 166dae1e0..6faaa8f06 100644
> --- a/drivers/net/ixgbe/ixgbe_fdir.c
> +++ b/drivers/net/ixgbe/ixgbe_fdir.c
> @@ -109,10 +109,6 @@ static int ixgbe_add_del_fdir_filter(struct rte_eth_dev *dev,
>   			      bool del,
>   			      bool update);
>   static int ixgbe_fdir_flush(struct rte_eth_dev *dev);
> -static void ixgbe_fdir_info_get(struct rte_eth_dev *dev,
> -			struct rte_eth_fdir_info *fdir_info);
> -static void ixgbe_fdir_stats_get(struct rte_eth_dev *dev,
> -			struct rte_eth_fdir_stats *fdir_stats);
>   
>   /**
>    * This function is based on ixgbe_fdir_enable_82599() in base/ixgbe_82599.c.
> @@ -1414,7 +1410,7 @@ ixgbe_fdir_flush(struct rte_eth_dev *dev)
>   }
>   
>   #define FDIRENTRIES_NUM_SHIFT 10
> -static void
> +void
>   ixgbe_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir_info)
>   {
>   	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
> @@ -1473,7 +1469,7 @@ ixgbe_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir_info
>   			(uint8_t)((info->mask.flex_bytes_mask & 0xFF00) >> 8);
>   }
>   
> -static void
> +void
>   ixgbe_fdir_stats_get(struct rte_eth_dev *dev, struct rte_eth_fdir_stats *fdir_stats)
>   {
>   	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
> diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.c b/drivers/net/ixgbe/rte_pmd_ixgbe.c
> index 9bff557f9..d2f708242 100644
> --- a/drivers/net/ixgbe/rte_pmd_ixgbe.c
> +++ b/drivers/net/ixgbe/rte_pmd_ixgbe.c
> @@ -1139,3 +1139,36 @@ rte_pmd_ixgbe_mdio_unlocked_write(uint16_t port, uint32_t reg_addr,
>   	}
>   	return 0;
>   }
> +
> +int
> +rte_pmd_ixgbe_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info)
> +{
> +	struct rte_eth_dev *dev;
> +
> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
> +
> +	dev = &rte_eth_devices[port];
> +	if (!is_ixgbe_supported(dev))
> +		return -ENOTSUP;
> +
> +	ixgbe_fdir_info_get(dev, fdir_info);
> +
> +	return 0;
> +}
> +
> +int
> +rte_pmd_ixgbe_get_fdir_stats(uint16_t port,
> +			     struct rte_eth_fdir_stats *fdir_stats)


Please check the alignment and other places.


> +{
> +	struct rte_eth_dev *dev;
> +
> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
> +
> +	dev = &rte_eth_devices[port];
> +	if (!is_ixgbe_supported(dev))
> +		return -ENOTSUP;
> +
> +	ixgbe_fdir_stats_get(dev, fdir_stats);
> +
> +	return 0;
> +}
> diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.h b/drivers/net/ixgbe/rte_pmd_ixgbe.h
> index f62fd761d..8b6bb99a5 100644
> --- a/drivers/net/ixgbe/rte_pmd_ixgbe.h
> +++ b/drivers/net/ixgbe/rte_pmd_ixgbe.h
> @@ -726,4 +726,37 @@ enum {
>   __rte_experimental
>   int
>   rte_pmd_ixgbe_upd_fctrl_sbp(uint16_t port, int enable);
> +
> +/**
> + * Get port fdir info
> + *
> + * @param port
> + *   The port identifier of the Ethernet device.
> + * @param fdir_info
> + *   The fdir info of the port
> + * @return
> + *   - (0) if successful.
> + *   - (-ENODEV) if *port* invalid.
> + *   - (-ENOTSUP) if operation not supported.
> + */
> +__rte_experimental
> +int
> +rte_pmd_ixgbe_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info);
> +
> +/**
> + * Get port fdir status
> + *
> + * @param port
> + *   The port identifier of the Ethernet device.
> + * @param fdir_stats
> + *   The fdir status of the port
> + * @return
> + *   - (0) if successful.
> + *   - (-ENODEV) if *port* invalid.
> + *   - (-ENOTSUP) if operation not supported.
> + */
> +__rte_experimental
> +int
> +rte_pmd_ixgbe_get_fdir_stats(uint16_t port,
> +			     struct rte_eth_fdir_stats *fdir_stats);
>   #endif /* _PMD_IXGBE_H_ */
> diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
> index 21534dbc3..911f8083f 100644
> --- a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
> +++ b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
> @@ -38,6 +38,8 @@ DPDK_20.0 {
>   EXPERIMENTAL {
>   	global:
>   
> +	rte_pmd_ixgbe_get_fdir_info;
> +	rte_pmd_ixgbe_get_fdir_stats;
>   	rte_pmd_ixgbe_mdio_lock;
>   	rte_pmd_ixgbe_mdio_unlock;
>   	rte_pmd_ixgbe_mdio_unlocked_read;

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: re-implement commands by using private API
  2020-06-17 10:12     ` Di, ChenxuX
@ 2020-06-30  6:20       ` Jeff Guo
  0 siblings, 0 replies; 47+ messages in thread
From: Jeff Guo @ 2020-06-30  6:20 UTC (permalink / raw)
  To: Di, ChenxuX, Kevin Traynor, dev; +Cc: Xing, Beilei, Yang, Qiming

hi, chenxu

On 6/17/2020 6:12 PM, Di, ChenxuX wrote:
>
>> -----Original Message-----
>> From: Kevin Traynor [mailto:ktraynor@redhat.com]
>> Sent: Wednesday, June 17, 2020 4:12 AM
>> To: Di, ChenxuX <chenxux.di@intel.com>; dev@dpdk.org
>> Cc: Xing, Beilei <beilei.xing@intel.com>; Yang, Qiming <qiming.yang@intel.com>
>> Subject: Re: [dpdk-dev] [PATCH 3/5] app/testpmd: re-implement commands by
>> using private API
>>
>> On 11/06/2020 07:01, Chenxu Di wrote:
>>> The legacy filter API will be superseded. This patch use private api
>>> to change the implementation of commands global_config <port_id>
>>> gre-key-len <key_len> and show port fdir <port_id>
>>>
>>> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
>>> ---
>>>   app/test-pmd/cmdline.c | 23 ++++++++-----  app/test-pmd/config.c  |
>>> 74 +++++++++++++++++++++++++++++++++++-------
>>>   2 files changed, 78 insertions(+), 19 deletions(-)
>>>
>>> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
>>> 996a49876..01d793e89 100644
>>> --- a/app/test-pmd/cmdline.c
>>> +++ b/app/test-pmd/cmdline.c
>>> @@ -9280,15 +9280,22 @@ cmd_global_config_parsed(void *parsed_result,
>>> {
>>>   	struct cmd_global_config_result *res = parsed_result;
>>>   	struct rte_eth_global_cfg conf;
>>> -	int ret;
>>> +	int ret = -ENOTSUP;
>>>
>>> -	memset(&conf, 0, sizeof(conf));
>>> -	conf.cfg_type = RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN;
>>> -	conf.cfg.gre_key_len = res->len;
>>> -	ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE,
>>> -				      RTE_ETH_FILTER_SET, &conf);
>>> -	if (ret != 0)
>>> -		printf("Global config error\n");
>>> +#ifdef RTE_LIBRTE_I40E_PMD
>>> +	if (ret == -ENOTSUP)


you init ret to be default value and then check if ret to be default 
value, it that need?


>>> +		ret = rte_pmd_i40e_set_gre_key_len(res->port_id, res->len);
>> #endif
>>> +	if (ret == -ENOTSUP) {
>>> +		memset(&conf, 0, sizeof(conf));
>>> +		conf.cfg_type = RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN;
>>> +		conf.cfg.gre_key_len = res->len;
>>> +		ret = rte_eth_dev_filter_ctrl(res->port_id,
>> RTE_ETH_FILTER_NONE,
>>> +					      RTE_ETH_FILTER_SET, &conf);
>>> +	}
>>> +
>>> +	if (ret < 0)
>>> +		printf("Global config error: (%s)\n", strerror(-ret));
>>>   }
>>>
>>>   cmdline_parse_token_string_t cmd_global_config_cmd = diff --git
>>> a/app/test-pmd/config.c b/app/test-pmd/config.c index
>>> 016bcb09c..f519246c7 100644
>>> --- a/app/test-pmd/config.c
>>> +++ b/app/test-pmd/config.c
>>> @@ -3729,30 +3729,82 @@ print_fdir_flow_type(uint32_t flow_types_mask)
>>>   	printf("\n");
>>>   }
>>>
>>> +static int
>>> +get_fdir_info(portid_t port_id, struct rte_eth_fdir_info *fdir_info)
>>> +{
>>> +	int ret;
>> this looks like it won't compile if the RTE_LIBRTE_I40E_PMD is undefined, you'll
>> need to initialize ret
>>
> Yes, got it, I will fix it in next version patch.
>
>>> +#ifdef RTE_LIBRTE_I40E_PMD
>>> +	ret = rte_pmd_i40e_get_fdir_info(port_id, fdir_info); #endif #ifdef
>>> +RTE_LIBRTE_IXGBE_PMD
>>> +	if (ret == -ENOTSUP)


Suggest not init ret to be -ENOTSUP, so this checking of if (ret == 
-ENOTSUP) is no need.


>>> +		ret = rte_pmd_ixgbe_get_fdir_info(port_id, fdir_info); #endif
>>> +	if (ret == -ENOTSUP) {
>>> +		ret = rte_eth_dev_filter_supported(port_id,
>>> +						   RTE_ETH_FILTER_FDIR);
>>> +		if (ret < 0) {
>>> +			printf("\n FDIR is not supported on port %-2d\n",
>>> +				port_id);
>>> +			return ret;
>>> +		}
>>> +		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
>>> +					RTE_ETH_FILTER_INFO, fdir_info);
>>> +	}
>>> +
>>> +	if (ret < 0)
>>> +		printf("Get fdir infos error: (%s)\n", strerror(-ret));
>>> +
>>> +	return ret;
>>> +}
>>> +
>>> +static int
>>> +get_fdir_stat(portid_t port_id, struct rte_eth_fdir_stats *fdir_stat)
>>> +{
>>> +	int ret;
>> Same comment as above
>>
> OK
>
>>> +#ifdef RTE_LIBRTE_I40E_PMD
>>> +	ret = rte_pmd_i40e_get_fdir_stats(port_id, fdir_stat); #endif #ifdef
>>> +RTE_LIBRTE_IXGBE_PMD
>>> +	if (ret == -ENOTSUP)
>>> +		ret = rte_pmd_ixgbe_get_fdir_stats(port_id, fdir_stat); #endif
>>> +	if (ret == -ENOTSUP) {
>>> +		ret = rte_eth_dev_filter_supported(port_id,
>>> +						   RTE_ETH_FILTER_FDIR);
>>> +		if (ret < 0) {
>>> +			printf("\n FDIR is not supported on port %-2d\n",
>>> +				port_id);
>>> +			return ret;
>>> +		}
>>> +		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
>>> +					RTE_ETH_FILTER_STATS, fdir_stat);
>>> +	}
>>> +
>>> +	if (ret < 0)


if (ret) should be enough.


>>> +		printf("Get fdir infos error: (%s)\n", strerror(-ret));
>>> +
>>> +	return ret;
>>> +}
>>> +
>>>   void
>>>   fdir_get_infos(portid_t port_id)
>>>   {
>>>   	struct rte_eth_fdir_stats fdir_stat;
>>>   	struct rte_eth_fdir_info fdir_info;
>>> -	int ret;
>>>
>>>   	static const char *fdir_stats_border = "########################";
>>>
>>>   	if (port_id_is_invalid(port_id, ENABLED_WARN))
>>>   		return;
>>> -	ret = rte_eth_dev_filter_supported(port_id, RTE_ETH_FILTER_FDIR);
>>> -	if (ret < 0) {
>>> -		printf("\n FDIR is not supported on port %-2d\n",
>>> -			port_id);
>>> -		return;
>>> -	}
>>>
>>>   	memset(&fdir_info, 0, sizeof(fdir_info));
>>> -	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
>>> -			       RTE_ETH_FILTER_INFO, &fdir_info);
>>> +	if (get_fdir_info(port_id, &fdir_info))
>>> +		return;


Suggest print error log out of the caller but not in the calling, it 
should be better.


>>>   	memset(&fdir_stat, 0, sizeof(fdir_stat));
>>> -	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
>>> -			       RTE_ETH_FILTER_STATS, &fdir_stat);
>>> +	if (get_fdir_stat(port_id, &fdir_stat))
>>> +		return;
>>> +
>>>   	printf("\n  %s FDIR infos for port %-2d     %s\n",
>>>   	       fdir_stats_border, port_id, fdir_stats_border);
>>>   	printf("  MODE: ");
>>>

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

* Re: [dpdk-dev] [PATCH v2 5/5] app/testpmd: support query RSS config in flow query
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 5/5] app/testpmd: support query RSS config in flow query Chenxu Di
@ 2020-06-30  6:37     ` Jeff Guo
  2020-06-30 10:40     ` Yang, Qiming
  1 sibling, 0 replies; 47+ messages in thread
From: Jeff Guo @ 2020-06-30  6:37 UTC (permalink / raw)
  To: Chenxu Di, dev; +Cc: beilei.xing, Yang Qiming

hi, chenxu

On 6/15/2020 10:18 AM, Chenxu Di wrote:
> This patch support RSS action in flow query.
> It can display the RSS configuration of the specified rule.


Could you add some example command here for better know the usage and 
the details.


> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>   app/test-pmd/config.c | 55 +++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 55 insertions(+)
>
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
> index f519246c7..7e3cccf9a 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -1378,6 +1378,56 @@ port_flow_complain(struct rte_flow_error *error)
>   	return -err;
>   }
>   
> +static void
> +rss_config_display(struct rte_flow_action_rss *rss_conf)
> +{
> +	uint8_t i;
> +
> +	if (rss_conf == NULL) {
> +		printf("Invalid rule\n");
> +		return;
> +	}
> +
> +	printf("RSS:\n"
> +	       " queues:");
> +	if (rss_conf->queue_num == 0)
> +		printf(" none");
> +	for (i = 0; i < rss_conf->queue_num; i++)
> +		printf(" %d", rss_conf->queue[i]);
> +
> +	printf("\n function:");
> +	switch (rss_conf->func) {
> +	case RTE_ETH_HASH_FUNCTION_DEFAULT:
> +		printf(" default\n");
> +		break;
> +	case RTE_ETH_HASH_FUNCTION_TOEPLITZ:
> +		printf(" toeplitz\n");
> +		break;
> +	case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR:
> +		printf(" simple_xor\n");
> +		break;
> +	case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ:
> +		printf(" symmetric_toeplitz\n");
> +		break;
> +	default:
> +		printf(" Unknown function\n");
> +		return;
> +	}
> +
> +	printf(" types:\n");
> +	if (rss_conf->types == 0) {
> +		printf("  none\n");
> +		return;
> +	}
> +	for (i = 0; rss_type_table[i].str; i++) {
> +		if ((rss_conf->types &
> +		    rss_type_table[i].rss_type) ==
> +		    rss_type_table[i].rss_type &&
> +		    rss_type_table[i].rss_type != 0)
> +			printf("  %s\n", rss_type_table[i].str);
> +	}
> +}
> +
>   /** Validate flow rule. */
>   int
>   port_flow_validate(portid_t port_id,
> @@ -1564,6 +1614,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
>   	const char *name;
>   	union {
>   		struct rte_flow_query_count count;
> +		struct rte_flow_action_rss rss_conf;
>   	} query;
>   	int ret;
>   
> @@ -1585,6 +1636,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
>   		return port_flow_complain(&error);
>   	switch (action->type) {
>   	case RTE_FLOW_ACTION_TYPE_COUNT:
> +	case RTE_FLOW_ACTION_TYPE_RSS:
>   		break;
>   	default:
>   		printf("Cannot query action type %d (%s)\n",
> @@ -1609,6 +1661,9 @@ port_flow_query(portid_t port_id, uint32_t rule,
>   		       query.count.hits,
>   		       query.count.bytes);
>   		break;
> +	case RTE_FLOW_ACTION_TYPE_RSS:
> +		rss_config_display(&query.rss_conf);
> +		break;
>   	default:
>   		printf("Cannot display result for action type %d (%s)\n",
>   		       action->type, name);

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

* Re: [dpdk-dev] [PATCH v2 4/5] net/i40e: enable flow query RSS
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 4/5] net/i40e: enable flow query RSS Chenxu Di
@ 2020-06-30  6:48     ` Jeff Guo
  2020-06-30 10:27     ` Yang, Qiming
  1 sibling, 0 replies; 47+ messages in thread
From: Jeff Guo @ 2020-06-30  6:48 UTC (permalink / raw)
  To: Chenxu Di, dev; +Cc: beilei.xing, Yang Qiming

hi, chenxu

On 6/15/2020 10:18 AM, Chenxu Di wrote:
> This patch enables flow query function to get the
> configuration ofthe specified rule.


"ofthe" should be "of the".


>
> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>   drivers/net/i40e/i40e_flow.c | 51 ++++++++++++++++++++++++++++++++++++
>   1 file changed, 51 insertions(+)
>
> diff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c
> index 8f8df6fae..b070802bd 100644
> --- a/drivers/net/i40e/i40e_flow.c
> +++ b/drivers/net/i40e/i40e_flow.c
> @@ -43,6 +43,11 @@ static int i40e_flow_destroy(struct rte_eth_dev *dev,
>   			     struct rte_flow_error *error);
>   static int i40e_flow_flush(struct rte_eth_dev *dev,
>   			   struct rte_flow_error *error);
> +static int i40e_flow_query(struct rte_eth_dev *dev,
> +			   struct rte_flow *flow,
> +			   const struct rte_flow_action *actions,
> +			   void *data,
> +			   struct rte_flow_error *error);
>   static int
>   i40e_flow_parse_ethertype_pattern(struct rte_eth_dev *dev,
>   				  const struct rte_flow_item *pattern,
> @@ -129,6 +134,7 @@ const struct rte_flow_ops i40e_flow_ops = {
>   	.create = i40e_flow_create,
>   	.destroy = i40e_flow_destroy,
>   	.flush = i40e_flow_flush,
> +	.query = i40e_flow_query,
>   };
>   
>   static union i40e_filter_t cons_filter;
> @@ -5462,3 +5468,48 @@ i40e_flow_flush_rss_filter(struct rte_eth_dev *dev)
>   
>   	return ret;
>   }
> +
> +static int
> +i40e_flow_query(struct rte_eth_dev *dev __rte_unused,
> +		struct rte_flow *flow,
> +		const struct rte_flow_action *actions,
> +		void *data,
> +		struct rte_flow_error *error)


This line is no need to separate and please check also below code.


> +{
> +	struct i40e_rss_filter *rss_rule = (struct i40e_rss_filter *)flow->rule;
> +	enum rte_filter_type filter_type = flow->filter_type;
> +	struct rte_flow_action_rss *rss_conf = data;
> +
> +	if (!rss_rule) {
> +		rte_flow_error_set(error, EINVAL,
> +				   RTE_FLOW_ERROR_TYPE_HANDLE,
> +				   NULL, "Invalid rule");
> +		return -rte_errno;
> +	}
> +
> +	for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
> +		switch (actions->type) {
> +		case RTE_FLOW_ACTION_TYPE_VOID:
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_RSS:
> +			if (filter_type != RTE_ETH_FILTER_HASH) {
> +				rte_flow_error_set(error, ENOTSUP,
> +						   RTE_FLOW_ERROR_TYPE_ACTION,
> +						   actions,
> +						   "action not supported");
> +				return -rte_errno;
> +			}
> +			rte_memcpy(rss_conf,
> +				   &rss_rule->rss_filter_info.conf,
> +				   sizeof(struct rte_flow_action_rss));
> +			break;
> +		default:
> +			return rte_flow_error_set(error, ENOTSUP,
> +						  RTE_FLOW_ERROR_TYPE_ACTION,
> +						  actions,
> +						  "action not supported");
> +		}
> +	}
> +
> +	return 0;
> +}

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

* Re: [dpdk-dev] [PATCH v2 1/5] net/i40e: add private APIs
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 1/5] net/i40e: add private APIs Chenxu Di
  2020-06-30  4:22     ` Jeff Guo
@ 2020-06-30 10:24     ` Yang, Qiming
  2020-07-01  1:30       ` Di, ChenxuX
  1 sibling, 1 reply; 47+ messages in thread
From: Yang, Qiming @ 2020-06-30 10:24 UTC (permalink / raw)
  To: Di, ChenxuX, dev; +Cc: Xing, Beilei



> -----Original Message-----
> From: Di, ChenxuX <chenxux.di@intel.com>
> Sent: Monday, June 15, 2020 10:19
> To: dev@dpdk.org
> Cc: Xing, Beilei <beilei.xing@intel.com>; Yang, Qiming
> <qiming.yang@intel.com>; Di, ChenxuX <chenxux.di@intel.com>
> Subject: [PATCH v2 1/5] net/i40e: add private APIs
> 
> The legacy filter API will be superseded by rte_flow.
> There are also several small features which can not be implemented in
> rte_flow. This patch re-implemented these features as private API.
> Three APIs are added:
> rte_pmd_i40e_get_fdir_info.
> rte_pmd_i40e_get_fdir_stats.
> rte_pmd_i40e_set_gre_key_len.
> 
> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>  doc/guides/rel_notes/release_20_08.rst    | 14 +++++++
>  drivers/net/i40e/i40e_ethdev.c            |  2 +-
>  drivers/net/i40e/i40e_ethdev.h            |  5 +++
>  drivers/net/i40e/i40e_fdir.c              |  4 +-
>  drivers/net/i40e/rte_pmd_i40e.c           | 51 +++++++++++++++++++++++
>  drivers/net/i40e/rte_pmd_i40e.h           | 49 ++++++++++++++++++++++
>  drivers/net/i40e/rte_pmd_i40e_version.map |  3 ++
>  7 files changed, 125 insertions(+), 3 deletions(-)
> 
> diff --git a/doc/guides/rel_notes/release_20_08.rst
> b/doc/guides/rel_notes/release_20_08.rst
> index dee4ccbb5..550ad33aa 100644
> --- a/doc/guides/rel_notes/release_20_08.rst
> +++ b/doc/guides/rel_notes/release_20_08.rst
> @@ -62,6 +62,20 @@ New Features
> 
>    * Added new PMD devarg ``reclaim_mem_mode``.
> 
> +* **Updated the Intel i40e driver.**
> +
> +  Updated the Intel i40e driver with new features and improvements,
> including:
> +
> +  * Re-implemented get_fdir_info and get_fdir_stat in private API.
> +  * Re-implemented set_gre_key_len in private API.
> +  * Added support for flow query RSS.
> +
> +* **Updated the Intel ixgbe driver.**
> +
> +  Updated the Intel ixgbe driver with new features and improvements,
> including:
> +
> +  * Re-implemented get_fdir_info and get_fdir_stat in private API.
> +
> 
>  Removed Items
>  -------------
> diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
> index 970a31cb2..674b711d9 100644
> --- a/drivers/net/i40e/i40e_ethdev.c
> +++ b/drivers/net/i40e/i40e_ethdev.c
> @@ -8787,7 +8787,7 @@ i40e_tunnel_filter_param_check(struct i40e_pf *pf,
> 
>  #define I40E_GL_PRS_FVBM_MSK_ENA 0x80000000
>  #define I40E_GL_PRS_FVBM(_i)     (0x00269760 + ((_i) * 4))
> -static int
> +int
>  i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len)  {
>  	struct i40e_pf *pf = &((struct i40e_adapter *)hw->back)->pf; diff --
> git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
> index e5d0ce53f..192636927 100644
> --- a/drivers/net/i40e/i40e_ethdev.h
> +++ b/drivers/net/i40e/i40e_ethdev.h
> @@ -1270,6 +1270,11 @@ enum i40e_filter_pctype
>  				uint16_t flow_type);
>  uint16_t i40e_pctype_to_flowtype(const struct i40e_adapter *adapter,
>  				 enum i40e_filter_pctype pctype);
> +int i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len); void
> +i40e_fdir_info_get(struct rte_eth_dev *dev,
> +			struct rte_eth_fdir_info *fdir);
> +void i40e_fdir_stats_get(struct rte_eth_dev *dev,
> +			 struct rte_eth_fdir_stats *stat);
>  int i40e_fdir_ctrl_func(struct rte_eth_dev *dev,
>  			  enum rte_filter_op filter_op,
>  			  void *arg);

It doesn't make sense to add the definition here as these functions only called by private API.
I think it better to move these function to private also

[...]


> --
> 2.17.1


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

* Re: [dpdk-dev] [PATCH v2 2/5] net/ixgbe: add private APIs
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 2/5] net/ixgbe: " Chenxu Di
  2020-06-30  5:25     ` Jeff Guo
@ 2020-06-30 10:25     ` Yang, Qiming
  1 sibling, 0 replies; 47+ messages in thread
From: Yang, Qiming @ 2020-06-30 10:25 UTC (permalink / raw)
  To: Di, ChenxuX, dev; +Cc: Xing, Beilei

Same comments as the first one

> -----Original Message-----
> From: Di, ChenxuX <chenxux.di@intel.com>
> Sent: Monday, June 15, 2020 10:19
> To: dev@dpdk.org
> Cc: Xing, Beilei <beilei.xing@intel.com>; Yang, Qiming
> <qiming.yang@intel.com>; Di, ChenxuX <chenxux.di@intel.com>
> Subject: [PATCH v2 2/5] net/ixgbe: add private APIs
> 
> The legacy filter API will be superseded by rte_flow.
> There are also several small features which can not be implemented in
> rte_flow. This patch re-implemented these features as private API.
> Two APIs are added:
> rte_pmd_ixgbe_get_fdir_info.
> rte_pmd_ixgbe_get_fdir_stats.
> 
> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>  drivers/net/ixgbe/ixgbe_ethdev.h            |  4 +++
>  drivers/net/ixgbe/ixgbe_fdir.c              |  8 ++---
>  drivers/net/ixgbe/rte_pmd_ixgbe.c           | 33 +++++++++++++++++++++
>  drivers/net/ixgbe/rte_pmd_ixgbe.h           | 33 +++++++++++++++++++++
>  drivers/net/ixgbe/rte_pmd_ixgbe_version.map |  2 ++
>  5 files changed, 74 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h
> b/drivers/net/ixgbe/ixgbe_ethdev.h
> index 3d78b2ee2..9bdef87fb 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.h
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.h
> @@ -697,6 +697,10 @@ int ixgbe_fdir_set_flexbytes_offset(struct
> rte_eth_dev *dev,  int ixgbe_fdir_filter_program(struct rte_eth_dev *dev,
>  			      struct ixgbe_fdir_rule *rule,
>  			      bool del, bool update);
> +void ixgbe_fdir_info_get(struct rte_eth_dev *dev,
> +			 struct rte_eth_fdir_info *fdir_info); void
> +ixgbe_fdir_stats_get(struct rte_eth_dev *dev,
> +			  struct rte_eth_fdir_stats *fdir_stats);
> 
>  void ixgbe_configure_dcb(struct rte_eth_dev *dev);
> 
> diff --git a/drivers/net/ixgbe/ixgbe_fdir.c b/drivers/net/ixgbe/ixgbe_fdir.c
> index 166dae1e0..6faaa8f06 100644
> --- a/drivers/net/ixgbe/ixgbe_fdir.c
> +++ b/drivers/net/ixgbe/ixgbe_fdir.c
> @@ -109,10 +109,6 @@ static int ixgbe_add_del_fdir_filter(struct
> rte_eth_dev *dev,
>  			      bool del,
>  			      bool update);
>  static int ixgbe_fdir_flush(struct rte_eth_dev *dev); -static void
> ixgbe_fdir_info_get(struct rte_eth_dev *dev,
> -			struct rte_eth_fdir_info *fdir_info);
> -static void ixgbe_fdir_stats_get(struct rte_eth_dev *dev,
> -			struct rte_eth_fdir_stats *fdir_stats);
> 
>  /**
>   * This function is based on ixgbe_fdir_enable_82599() in
> base/ixgbe_82599.c.
> @@ -1414,7 +1410,7 @@ ixgbe_fdir_flush(struct rte_eth_dev *dev)  }
> 
>  #define FDIRENTRIES_NUM_SHIFT 10
> -static void
> +void
>  ixgbe_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info
> *fdir_info)  {
>  	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data-
> >dev_private);
> @@ -1473,7 +1469,7 @@ ixgbe_fdir_info_get(struct rte_eth_dev *dev,
> struct rte_eth_fdir_info *fdir_info
>  			(uint8_t)((info->mask.flex_bytes_mask & 0xFF00) >>
> 8);  }
> 
> -static void
> +void
>  ixgbe_fdir_stats_get(struct rte_eth_dev *dev, struct rte_eth_fdir_stats
> *fdir_stats)  {
>  	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data-
> >dev_private);
> diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.c
> b/drivers/net/ixgbe/rte_pmd_ixgbe.c
> index 9bff557f9..d2f708242 100644
> --- a/drivers/net/ixgbe/rte_pmd_ixgbe.c
> +++ b/drivers/net/ixgbe/rte_pmd_ixgbe.c
> @@ -1139,3 +1139,36 @@ rte_pmd_ixgbe_mdio_unlocked_write(uint16_t
> port, uint32_t reg_addr,
>  	}
>  	return 0;
>  }
> +
> +int
> +rte_pmd_ixgbe_get_fdir_info(uint16_t port, struct rte_eth_fdir_info
> +*fdir_info) {
> +	struct rte_eth_dev *dev;
> +
> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
> +
> +	dev = &rte_eth_devices[port];
> +	if (!is_ixgbe_supported(dev))
> +		return -ENOTSUP;
> +
> +	ixgbe_fdir_info_get(dev, fdir_info);
> +
> +	return 0;
> +}
> +
> +int
> +rte_pmd_ixgbe_get_fdir_stats(uint16_t port,
> +			     struct rte_eth_fdir_stats *fdir_stats) {
> +	struct rte_eth_dev *dev;
> +
> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
> +
> +	dev = &rte_eth_devices[port];
> +	if (!is_ixgbe_supported(dev))
> +		return -ENOTSUP;
> +
> +	ixgbe_fdir_stats_get(dev, fdir_stats);
> +
> +	return 0;
> +}
> diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.h
> b/drivers/net/ixgbe/rte_pmd_ixgbe.h
> index f62fd761d..8b6bb99a5 100644
> --- a/drivers/net/ixgbe/rte_pmd_ixgbe.h
> +++ b/drivers/net/ixgbe/rte_pmd_ixgbe.h
> @@ -726,4 +726,37 @@ enum {
>  __rte_experimental
>  int
>  rte_pmd_ixgbe_upd_fctrl_sbp(uint16_t port, int enable);
> +
> +/**
> + * Get port fdir info
> + *
> + * @param port
> + *   The port identifier of the Ethernet device.
> + * @param fdir_info
> + *   The fdir info of the port
> + * @return
> + *   - (0) if successful.
> + *   - (-ENODEV) if *port* invalid.
> + *   - (-ENOTSUP) if operation not supported.
> + */
> +__rte_experimental
> +int
> +rte_pmd_ixgbe_get_fdir_info(uint16_t port, struct rte_eth_fdir_info
> +*fdir_info);
> +
> +/**
> + * Get port fdir status
> + *
> + * @param port
> + *   The port identifier of the Ethernet device.
> + * @param fdir_stats
> + *   The fdir status of the port
> + * @return
> + *   - (0) if successful.
> + *   - (-ENODEV) if *port* invalid.
> + *   - (-ENOTSUP) if operation not supported.
> + */
> +__rte_experimental
> +int
> +rte_pmd_ixgbe_get_fdir_stats(uint16_t port,
> +			     struct rte_eth_fdir_stats *fdir_stats);
>  #endif /* _PMD_IXGBE_H_ */
> diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
> b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
> index 21534dbc3..911f8083f 100644
> --- a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
> +++ b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
> @@ -38,6 +38,8 @@ DPDK_20.0 {
>  EXPERIMENTAL {
>  	global:
> 
> +	rte_pmd_ixgbe_get_fdir_info;
> +	rte_pmd_ixgbe_get_fdir_stats;
>  	rte_pmd_ixgbe_mdio_lock;
>  	rte_pmd_ixgbe_mdio_unlock;
>  	rte_pmd_ixgbe_mdio_unlocked_read;
> --
> 2.17.1


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

* Re: [dpdk-dev] [PATCH v2 4/5] net/i40e: enable flow query RSS
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 4/5] net/i40e: enable flow query RSS Chenxu Di
  2020-06-30  6:48     ` Jeff Guo
@ 2020-06-30 10:27     ` Yang, Qiming
  2020-07-01  1:15       ` Di, ChenxuX
  1 sibling, 1 reply; 47+ messages in thread
From: Yang, Qiming @ 2020-06-30 10:27 UTC (permalink / raw)
  To: Di, ChenxuX, dev; +Cc: Xing, Beilei



> -----Original Message-----
> From: Di, ChenxuX <chenxux.di@intel.com>
> Sent: Monday, June 15, 2020 10:19
> To: dev@dpdk.org
> Cc: Xing, Beilei <beilei.xing@intel.com>; Yang, Qiming
> <qiming.yang@intel.com>; Di, ChenxuX <chenxux.di@intel.com>
> Subject: [PATCH v2 4/5] net/i40e: enable flow query RSS
> 
> This patch enables flow query function to get the configuration ofthe
> specified rule.
> 
> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>  drivers/net/i40e/i40e_flow.c | 51
> ++++++++++++++++++++++++++++++++++++
>  1 file changed, 51 insertions(+)
> 
> diff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c
> index 8f8df6fae..b070802bd 100644
> --- a/drivers/net/i40e/i40e_flow.c
> +++ b/drivers/net/i40e/i40e_flow.c
> @@ -43,6 +43,11 @@ static int i40e_flow_destroy(struct rte_eth_dev *dev,
>  			     struct rte_flow_error *error);
>  static int i40e_flow_flush(struct rte_eth_dev *dev,
>  			   struct rte_flow_error *error);
> +static int i40e_flow_query(struct rte_eth_dev *dev,
> +			   struct rte_flow *flow,
> +			   const struct rte_flow_action *actions,
> +			   void *data,
> +			   struct rte_flow_error *error);
>  static int
>  i40e_flow_parse_ethertype_pattern(struct rte_eth_dev *dev,
>  				  const struct rte_flow_item *pattern, @@ -
> 129,6 +134,7 @@ const struct rte_flow_ops i40e_flow_ops = {
>  	.create = i40e_flow_create,
>  	.destroy = i40e_flow_destroy,
>  	.flush = i40e_flow_flush,
> +	.query = i40e_flow_query,
>  };
> 
>  static union i40e_filter_t cons_filter; @@ -5462,3 +5468,48 @@
> i40e_flow_flush_rss_filter(struct rte_eth_dev *dev)
> 
>  	return ret;
>  }
> +
> +static int
> +i40e_flow_query(struct rte_eth_dev *dev __rte_unused,
> +		struct rte_flow *flow,
> +		const struct rte_flow_action *actions,
> +		void *data,
> +		struct rte_flow_error *error)
> +{
> +	struct i40e_rss_filter *rss_rule = (struct i40e_rss_filter *)flow->rule;
> +	enum rte_filter_type filter_type = flow->filter_type;
> +	struct rte_flow_action_rss *rss_conf = data;
> +
> +	if (!rss_rule) {
> +		rte_flow_error_set(error, EINVAL,
> +				   RTE_FLOW_ERROR_TYPE_HANDLE,
> +				   NULL, "Invalid rule");
> +		return -rte_errno;
> +	}
> +
> +	for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
> +		switch (actions->type) {
> +		case RTE_FLOW_ACTION_TYPE_VOID:
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_RSS:
> +			if (filter_type != RTE_ETH_FILTER_HASH) {
> +				rte_flow_error_set(error, ENOTSUP,
> +
> RTE_FLOW_ERROR_TYPE_ACTION,
> +						   actions,
> +						   "action not supported");
> +				return -rte_errno;
> +			}
> +			rte_memcpy(rss_conf,
> +				   &rss_rule->rss_filter_info.conf,
> +				   sizeof(struct rte_flow_action_rss));

Don't understand the behavior, what's action means? What's the things this commend query?

> +			break;
> +		default:
> +			return rte_flow_error_set(error, ENOTSUP,
> +
> RTE_FLOW_ERROR_TYPE_ACTION,
> +						  actions,
> +						  "action not supported");
> +		}
> +	}
> +
> +	return 0;
> +}
> --
> 2.17.1


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

* Re: [dpdk-dev] [PATCH v2 3/5] app/testpmd: re-implement commands by using private API
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
@ 2020-06-30 10:34     ` Yang, Qiming
  0 siblings, 0 replies; 47+ messages in thread
From: Yang, Qiming @ 2020-06-30 10:34 UTC (permalink / raw)
  To: Di, ChenxuX, dev; +Cc: Xing, Beilei



> -----Original Message-----
> From: Di, ChenxuX <chenxux.di@intel.com>
> Sent: Monday, June 15, 2020 10:19
> To: dev@dpdk.org
> Cc: Xing, Beilei <beilei.xing@intel.com>; Yang, Qiming
> <qiming.yang@intel.com>; Di, ChenxuX <chenxux.di@intel.com>
> Subject: [PATCH v2 3/5] app/testpmd: re-implement commands by using
> private API
> 
> The legacy filter API will be superseded. This patch use private api to change
> the implementation of commands global_config <port_id> gre-key-len
> <key_len> and show port fdir <port_id>
> 
> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>  app/test-pmd/cmdline.c | 23 ++++++++-----  app/test-pmd/config.c  | 74
> +++++++++++++++++++++++++++++++++++-------
>  2 files changed, 78 insertions(+), 19 deletions(-)
> 
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
> 996a49876..01d793e89 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -9280,15 +9280,22 @@ cmd_global_config_parsed(void *parsed_result,
> {
>  	struct cmd_global_config_result *res = parsed_result;
>  	struct rte_eth_global_cfg conf;
> -	int ret;
> +	int ret = -ENOTSUP;
> 
> -	memset(&conf, 0, sizeof(conf));
> -	conf.cfg_type = RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN;
> -	conf.cfg.gre_key_len = res->len;
> -	ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE,
> -				      RTE_ETH_FILTER_SET, &conf);
> -	if (ret != 0)
> -		printf("Global config error\n");
> +#ifdef RTE_LIBRTE_I40E_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_i40e_set_gre_key_len(res->port_id, res-
> >len); #endif
> +	if (ret == -ENOTSUP) {

Why you double check the ret? recommend

If()
#ifdefine
...
#endif
...

And if it is needed to check ret as you set the return value as - ENOTSUP?
And it's weird to set as NOT SUPPORT, don't change the exist logical.

Below all have the same issue.

> +		memset(&conf, 0, sizeof(conf));
> +		conf.cfg_type = RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN;
> +		conf.cfg.gre_key_len = res->len;
> +		ret = rte_eth_dev_filter_ctrl(res->port_id,
> RTE_ETH_FILTER_NONE,
> +					      RTE_ETH_FILTER_SET, &conf);
> +	}
> +
> +	if (ret < 0)
> +		printf("Global config error: (%s)\n", strerror(-ret));
>  }
> 
>  cmdline_parse_token_string_t cmd_global_config_cmd = diff --git
> a/app/test-pmd/config.c b/app/test-pmd/config.c index
> 016bcb09c..f519246c7 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -3729,30 +3729,82 @@ print_fdir_flow_type(uint32_t flow_types_mask)
>  	printf("\n");
>  }
> 
> +static int
> +get_fdir_info(portid_t port_id, struct rte_eth_fdir_info *fdir_info) {
> +	int ret;
> +#ifdef RTE_LIBRTE_I40E_PMD
> +	ret = rte_pmd_i40e_get_fdir_info(port_id, fdir_info); #endif #ifdef
> +RTE_LIBRTE_IXGBE_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_ixgbe_get_fdir_info(port_id, fdir_info);
> #endif
> +	if (ret == -ENOTSUP) {
> +		ret = rte_eth_dev_filter_supported(port_id,
> +						   RTE_ETH_FILTER_FDIR);
> +		if (ret < 0) {
> +			printf("\n FDIR is not supported on port %-2d\n",
> +				port_id);
> +			return ret;
> +		}
> +		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> +					RTE_ETH_FILTER_INFO, fdir_info);
> +	}
> +
> +	if (ret < 0)
> +		printf("Get fdir infos error: (%s)\n", strerror(-ret));
> +
> +	return ret;
> +}
> +
> +static int
> +get_fdir_stat(portid_t port_id, struct rte_eth_fdir_stats *fdir_stat) {
> +	int ret;
> +#ifdef RTE_LIBRTE_I40E_PMD
> +	ret = rte_pmd_i40e_get_fdir_stats(port_id, fdir_stat); #endif #ifdef
> +RTE_LIBRTE_IXGBE_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_ixgbe_get_fdir_stats(port_id, fdir_stat);
> #endif
> +	if (ret == -ENOTSUP) {
> +		ret = rte_eth_dev_filter_supported(port_id,
> +						   RTE_ETH_FILTER_FDIR);
> +		if (ret < 0) {
> +			printf("\n FDIR is not supported on port %-2d\n",
> +				port_id);
> +			return ret;
> +		}
> +		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> +					RTE_ETH_FILTER_STATS, fdir_stat);
> +	}
> +
> +	if (ret < 0)
> +		printf("Get fdir infos error: (%s)\n", strerror(-ret));
> +
> +	return ret;
> +}
> +
>  void
>  fdir_get_infos(portid_t port_id)
>  {
>  	struct rte_eth_fdir_stats fdir_stat;
>  	struct rte_eth_fdir_info fdir_info;
> -	int ret;
> 
>  	static const char *fdir_stats_border =
> "########################";
> 
>  	if (port_id_is_invalid(port_id, ENABLED_WARN))
>  		return;
> -	ret = rte_eth_dev_filter_supported(port_id, RTE_ETH_FILTER_FDIR);
> -	if (ret < 0) {
> -		printf("\n FDIR is not supported on port %-2d\n",
> -			port_id);
> -		return;
> -	}
> 
>  	memset(&fdir_info, 0, sizeof(fdir_info));
> -	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> -			       RTE_ETH_FILTER_INFO, &fdir_info);
> +	if (get_fdir_info(port_id, &fdir_info))
> +		return;
>  	memset(&fdir_stat, 0, sizeof(fdir_stat));
> -	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> -			       RTE_ETH_FILTER_STATS, &fdir_stat);
> +	if (get_fdir_stat(port_id, &fdir_stat))
> +		return;
> +
>  	printf("\n  %s FDIR infos for port %-2d     %s\n",
>  	       fdir_stats_border, port_id, fdir_stats_border);
>  	printf("  MODE: ");
> --
> 2.17.1


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

* Re: [dpdk-dev] [PATCH v2 5/5] app/testpmd: support query RSS config in flow query
  2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 5/5] app/testpmd: support query RSS config in flow query Chenxu Di
  2020-06-30  6:37     ` Jeff Guo
@ 2020-06-30 10:40     ` Yang, Qiming
  2020-07-01  1:25       ` Di, ChenxuX
  1 sibling, 1 reply; 47+ messages in thread
From: Yang, Qiming @ 2020-06-30 10:40 UTC (permalink / raw)
  To: Di, ChenxuX, dev; +Cc: Xing, Beilei



> -----Original Message-----
> From: Di, ChenxuX <chenxux.di@intel.com>
> Sent: Monday, June 15, 2020 10:19
> To: dev@dpdk.org
> Cc: Xing, Beilei <beilei.xing@intel.com>; Yang, Qiming
> <qiming.yang@intel.com>; Di, ChenxuX <chenxux.di@intel.com>
> Subject: [PATCH v2 5/5] app/testpmd: support query RSS config in flow query
> 
> This patch support RSS action in flow query.
> It can display the RSS configuration of the specified rule.
> 
> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>  app/test-pmd/config.c | 55
> +++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 55 insertions(+)
> 
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index
> f519246c7..7e3cccf9a 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -1378,6 +1378,56 @@ port_flow_complain(struct rte_flow_error *error)
>  	return -err;
>  }
> 
> +static void
> +rss_config_display(struct rte_flow_action_rss *rss_conf) {
> +	uint8_t i;
> +
> +	if (rss_conf == NULL) {
> +		printf("Invalid rule\n");
> +		return;
> +	}
> +
> +	printf("RSS:\n"
> +	       " queues:");

Two lines needed? And why don't you add the space in the end of this printf?

> +	if (rss_conf->queue_num == 0)

If(!rss_conf->queue_num)

> +		printf(" none");
> +	for (i = 0; i < rss_conf->queue_num; i++)
> +		printf(" %d", rss_conf->queue[i]);
> +
> +	printf("\n function:");
> +	switch (rss_conf->func) {
> +	case RTE_ETH_HASH_FUNCTION_DEFAULT:
> +		printf(" default\n");

No needed space

> +		break;
> +	case RTE_ETH_HASH_FUNCTION_TOEPLITZ:
> +		printf(" toeplitz\n");

Same

> +		break;
> +	case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR:
> +		printf(" simple_xor\n");
...

> +		break;
> +	case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ:
> +		printf(" symmetric_toeplitz\n");
..

> +		break;
> +	default:
> +		printf(" Unknown function\n");
...

> +		return;
> +	}
> +
> +	printf(" types:\n");

Same...

> +	if (rss_conf->types == 0) {
> +		printf("  none\n");

Same...

> +		return;
> +	}
> +	for (i = 0; rss_type_table[i].str; i++) {
> +		if ((rss_conf->types &
> +		    rss_type_table[i].rss_type) ==
> +		    rss_type_table[i].rss_type &&
> +		    rss_type_table[i].rss_type != 0)
> +			printf("  %s\n", rss_type_table[i].str);

All the same..

> +	}
> +}
> +
>  /** Validate flow rule. */
>  int
>  port_flow_validate(portid_t port_id,
> @@ -1564,6 +1614,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
>  	const char *name;
>  	union {
>  		struct rte_flow_query_count count;
> +		struct rte_flow_action_rss rss_conf;
>  	} query;
>  	int ret;
> 
> @@ -1585,6 +1636,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
>  		return port_flow_complain(&error);
>  	switch (action->type) {
>  	case RTE_FLOW_ACTION_TYPE_COUNT:
> +	case RTE_FLOW_ACTION_TYPE_RSS:
>  		break;
>  	default:
>  		printf("Cannot query action type %d (%s)\n", @@ -1609,6
> +1661,9 @@ port_flow_query(portid_t port_id, uint32_t rule,
>  		       query.count.hits,
>  		       query.count.bytes);
>  		break;
> +	case RTE_FLOW_ACTION_TYPE_RSS:
> +		rss_config_display(&query.rss_conf);
> +		break;
>  	default:
>  		printf("Cannot display result for action type %d (%s)\n",
>  		       action->type, name);
> --
> 2.17.1


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

* Re: [dpdk-dev] [PATCH v2 4/5] net/i40e: enable flow query RSS
  2020-06-30 10:27     ` Yang, Qiming
@ 2020-07-01  1:15       ` Di, ChenxuX
  0 siblings, 0 replies; 47+ messages in thread
From: Di, ChenxuX @ 2020-07-01  1:15 UTC (permalink / raw)
  To: Yang, Qiming, dev; +Cc: Xing, Beilei

Hi,

> -----Original Message-----
> From: Yang, Qiming
> Sent: Tuesday, June 30, 2020 6:27 PM
> To: Di, ChenxuX <chenxux.di@intel.com>; dev@dpdk.org
> Cc: Xing, Beilei <beilei.xing@intel.com>
> Subject: RE: [PATCH v2 4/5] net/i40e: enable flow query RSS
> 
> 
> 
> > -----Original Message-----
> > From: Di, ChenxuX <chenxux.di@intel.com>
> > Sent: Monday, June 15, 2020 10:19
> > To: dev@dpdk.org
> > Cc: Xing, Beilei <beilei.xing@intel.com>; Yang, Qiming
> > <qiming.yang@intel.com>; Di, ChenxuX <chenxux.di@intel.com>
> > Subject: [PATCH v2 4/5] net/i40e: enable flow query RSS
> >
> > This patch enables flow query function to get the configuration ofthe
> > specified rule.
> >
> > Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> > ---
> >  drivers/net/i40e/i40e_flow.c | 51
> > ++++++++++++++++++++++++++++++++++++
> >  1 file changed, 51 insertions(+)
> >
> > diff --git a/drivers/net/i40e/i40e_flow.c
> > b/drivers/net/i40e/i40e_flow.c index 8f8df6fae..b070802bd 100644
> > --- a/drivers/net/i40e/i40e_flow.c
> > +++ b/drivers/net/i40e/i40e_flow.c
> > @@ -43,6 +43,11 @@ static int i40e_flow_destroy(struct rte_eth_dev *dev,
> >       struct rte_flow_error *error);
> >  static int i40e_flow_flush(struct rte_eth_dev *dev,
> >     struct rte_flow_error *error);
> > +static int i40e_flow_query(struct rte_eth_dev *dev,
> > +   struct rte_flow *flow,
> > +   const struct rte_flow_action *actions,
> > +   void *data,
> > +   struct rte_flow_error *error);
> >  static int
> >  i40e_flow_parse_ethertype_pattern(struct rte_eth_dev *dev,
> >    const struct rte_flow_item *pattern, @@ -
> > 129,6 +134,7 @@ const struct rte_flow_ops i40e_flow_ops = {  .create =
> > i40e_flow_create,  .destroy = i40e_flow_destroy,  .flush =
> > i40e_flow_flush,
> > +.query = i40e_flow_query,
> >  };
> >
> >  static union i40e_filter_t cons_filter; @@ -5462,3 +5468,48 @@
> > i40e_flow_flush_rss_filter(struct rte_eth_dev *dev)
> >
> >  return ret;
> >  }
> > +
> > +static int
> > +i40e_flow_query(struct rte_eth_dev *dev __rte_unused, struct rte_flow
> > +*flow, const struct rte_flow_action *actions, void *data, struct
> > +rte_flow_error *error) { struct i40e_rss_filter *rss_rule = (struct
> > +i40e_rss_filter *)flow->rule; enum rte_filter_type filter_type =
> > +flow->filter_type; struct rte_flow_action_rss *rss_conf = data;
> > +
> > +if (!rss_rule) {
> > +rte_flow_error_set(error, EINVAL,
> > +   RTE_FLOW_ERROR_TYPE_HANDLE,
> > +   NULL, "Invalid rule");
> > +return -rte_errno;
> > +}
> > +
> > +for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) { switch
> > +(actions->type) { case RTE_FLOW_ACTION_TYPE_VOID:
> > +break;
> > +case RTE_FLOW_ACTION_TYPE_RSS:
> > +if (filter_type != RTE_ETH_FILTER_HASH) { rte_flow_error_set(error,
> > +ENOTSUP,
> > +
> > RTE_FLOW_ERROR_TYPE_ACTION,
> > +   actions,
> > +   "action not supported");
> > +return -rte_errno;
> > +}
> > +rte_memcpy(rss_conf,
> > +   &rss_rule->rss_filter_info.conf,
> > +   sizeof(struct rte_flow_action_rss));
> 
> Don't understand the behavior, what's action means? What's the things this
> commend query?
> 

By zhangqi's comment, it will query the configuration of rss rule.
It just return the config and display it.

> > +break;
> > +default:
> > +return rte_flow_error_set(error, ENOTSUP,
> > +
> > RTE_FLOW_ERROR_TYPE_ACTION,
> > +  actions,
> > +  "action not supported");
> > +}
> > +}
> > +
> > +return 0;
> > +}
> > --
> > 2.17.1
> 


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

* Re: [dpdk-dev] [PATCH v2 5/5] app/testpmd: support query RSS config in flow query
  2020-06-30 10:40     ` Yang, Qiming
@ 2020-07-01  1:25       ` Di, ChenxuX
  0 siblings, 0 replies; 47+ messages in thread
From: Di, ChenxuX @ 2020-07-01  1:25 UTC (permalink / raw)
  To: Yang, Qiming, dev; +Cc: Xing, Beilei

Hi,

For the current code about flow query <portid> <ruleid> count 
It is printf("%s:\n"
	" hits_set: %u\n"
	" bytes_set: %u\n"
	" hits: %" PRIu64 "\n"
	" bytes: %" PRIu64 "\n",
	name,
	query.count.hits_set,
	query.count.bytes_set,
	query.count.hits,
	query.count.bytes);
and it will display the info like:
COUNT:
 hits_set: xxx
 bytes_set : xxx
 hits: xxx
 bytes: xxx

so for the code style and info style like it, I add some space in the log to make sure the log like
RSS:
 Queues: none|0|1|...
 Function: default| Toeplitz| simple_xor| symmetric_toeplitz| Unknown function
 Types:
  none
  Ipv4-tcp
  Ipv4-udp
  
For the reason the types may be many types, and if the line in testpmd log is too long.
It may cause error, so the types info is displayed per line and with one more space before.

> -----Original Message-----
> From: Yang, Qiming
> Sent: Tuesday, June 30, 2020 6:41 PM
> To: Di, ChenxuX <chenxux.di@intel.com>; dev@dpdk.org
> Cc: Xing, Beilei <beilei.xing@intel.com>
> Subject: RE: [PATCH v2 5/5] app/testpmd: support query RSS config in flow query
> 
> 
> 
> > -----Original Message-----
> > From: Di, ChenxuX <chenxux.di@intel.com>
> > Sent: Monday, June 15, 2020 10:19
> > To: dev@dpdk.org
> > Cc: Xing, Beilei <beilei.xing@intel.com>; Yang, Qiming
> > <qiming.yang@intel.com>; Di, ChenxuX <chenxux.di@intel.com>
> > Subject: [PATCH v2 5/5] app/testpmd: support query RSS config in flow
> > query
> >
> > This patch support RSS action in flow query.
> > It can display the RSS configuration of the specified rule.
> >
> > Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> > ---
> >  app/test-pmd/config.c | 55
> > +++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 55 insertions(+)
> >
> > diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index
> > f519246c7..7e3cccf9a 100644
> > --- a/app/test-pmd/config.c
> > +++ b/app/test-pmd/config.c
> > @@ -1378,6 +1378,56 @@ port_flow_complain(struct rte_flow_error
> > *error)  return -err;  }
> >
> > +static void
> > +rss_config_display(struct rte_flow_action_rss *rss_conf) { uint8_t i;
> > +
> > +if (rss_conf == NULL) {
> > +printf("Invalid rule\n");
> > +return;
> > +}
> > +
> > +printf("RSS:\n"
> > +       " queues:");
> 
> Two lines needed? And why don't you add the space in the end of this printf?
> 
> > +if (rss_conf->queue_num == 0)
> 
> If(!rss_conf->queue_num)
> 
> > +printf(" none");
> > +for (i = 0; i < rss_conf->queue_num; i++) printf(" %d",
> > +rss_conf->queue[i]);
> > +
> > +printf("\n function:");
> > +switch (rss_conf->func) {
> > +case RTE_ETH_HASH_FUNCTION_DEFAULT:
> > +printf(" default\n");
> 
> No needed space
> 
> > +break;
> > +case RTE_ETH_HASH_FUNCTION_TOEPLITZ:
> > +printf(" toeplitz\n");
> 
> Same
> 
> > +break;
> > +case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR:
> > +printf(" simple_xor\n");
> ...
> 
> > +break;
> > +case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ:
> > +printf(" symmetric_toeplitz\n");
> ..
> 
> > +break;
> > +default:
> > +printf(" Unknown function\n");
> ...
> 
> > +return;
> > +}
> > +
> > +printf(" types:\n");
> 
> Same...
> 
> > +if (rss_conf->types == 0) {
> > +printf("  none\n");
> 
> Same...
> 
> > +return;
> > +}
> > +for (i = 0; rss_type_table[i].str; i++) { if ((rss_conf->types &
> > +    rss_type_table[i].rss_type) ==
> > +    rss_type_table[i].rss_type &&
> > +    rss_type_table[i].rss_type != 0)
> > +printf("  %s\n", rss_type_table[i].str);
> 
> All the same..
> 
> > +}
> > +}
> > +
> >  /** Validate flow rule. */
> >  int
> >  port_flow_validate(portid_t port_id,
> > @@ -1564,6 +1614,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
> > const char *name;  union {  struct rte_flow_query_count count;
> > +struct rte_flow_action_rss rss_conf;
> >  } query;
> >  int ret;
> >
> > @@ -1585,6 +1636,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
> > return port_flow_complain(&error);  switch (action->type) {  case
> > RTE_FLOW_ACTION_TYPE_COUNT:
> > +case RTE_FLOW_ACTION_TYPE_RSS:
> >  break;
> >  default:
> >  printf("Cannot query action type %d (%s)\n", @@ -1609,6
> > +1661,9 @@ port_flow_query(portid_t port_id, uint32_t rule,
> >         query.count.hits,
> >         query.count.bytes);
> >  break;
> > +case RTE_FLOW_ACTION_TYPE_RSS:
> > +rss_config_display(&query.rss_conf);
> > +break;
> >  default:
> >  printf("Cannot display result for action type %d (%s)\n",
> >         action->type, name);
> > --
> > 2.17.1
> 


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

* Re: [dpdk-dev] [PATCH v2 1/5] net/i40e: add private APIs
  2020-06-30 10:24     ` Yang, Qiming
@ 2020-07-01  1:30       ` Di, ChenxuX
  0 siblings, 0 replies; 47+ messages in thread
From: Di, ChenxuX @ 2020-07-01  1:30 UTC (permalink / raw)
  To: Yang, Qiming, dev; +Cc: Xing, Beilei



> -----Original Message-----
> From: Yang, Qiming
> Sent: Tuesday, June 30, 2020 6:25 PM
> To: Di, ChenxuX <chenxux.di@intel.com>; dev@dpdk.org
> Cc: Xing, Beilei <beilei.xing@intel.com>
> Subject: RE: [PATCH v2 1/5] net/i40e: add private APIs
> 
> 
> 
> > -----Original Message-----
> > From: Di, ChenxuX <chenxux.di@intel.com>
> > Sent: Monday, June 15, 2020 10:19
> > To: dev@dpdk.org
> > Cc: Xing, Beilei <beilei.xing@intel.com>; Yang, Qiming
> > <qiming.yang@intel.com>; Di, ChenxuX <chenxux.di@intel.com>
> > Subject: [PATCH v2 1/5] net/i40e: add private APIs
> >
> > The legacy filter API will be superseded by rte_flow.
> > There are also several small features which can not be implemented in
> > rte_flow. This patch re-implemented these features as private API.
> > Three APIs are added:
> > rte_pmd_i40e_get_fdir_info.
> > rte_pmd_i40e_get_fdir_stats.
> > rte_pmd_i40e_set_gre_key_len.
> >
> > Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> > ---
> >  doc/guides/rel_notes/release_20_08.rst    | 14 +++++++
> >  drivers/net/i40e/i40e_ethdev.c            |  2 +-
> >  drivers/net/i40e/i40e_ethdev.h            |  5 +++
> >  drivers/net/i40e/i40e_fdir.c              |  4 +-
> >  drivers/net/i40e/rte_pmd_i40e.c           | 51 +++++++++++++++++++++++
> >  drivers/net/i40e/rte_pmd_i40e.h           | 49 ++++++++++++++++++++++
> >  drivers/net/i40e/rte_pmd_i40e_version.map |  3 ++
> >  7 files changed, 125 insertions(+), 3 deletions(-)
> >
> > diff --git a/doc/guides/rel_notes/release_20_08.rst
> > b/doc/guides/rel_notes/release_20_08.rst
> > index dee4ccbb5..550ad33aa 100644
> > --- a/doc/guides/rel_notes/release_20_08.rst
> > +++ b/doc/guides/rel_notes/release_20_08.rst
> > @@ -62,6 +62,20 @@ New Features
> >
> >    * Added new PMD devarg ``reclaim_mem_mode``.
> >
> > +* **Updated the Intel i40e driver.**
> > +
> > +  Updated the Intel i40e driver with new features and improvements,
> > including:
> > +
> > +  * Re-implemented get_fdir_info and get_fdir_stat in private API.
> > +  * Re-implemented set_gre_key_len in private API.
> > +  * Added support for flow query RSS.
> > +
> > +* **Updated the Intel ixgbe driver.**
> > +
> > +  Updated the Intel ixgbe driver with new features and improvements,
> > including:
> > +
> > +  * Re-implemented get_fdir_info and get_fdir_stat in private API.
> > +
> >
> >  Removed Items
> >  -------------
> > diff --git a/drivers/net/i40e/i40e_ethdev.c
> > b/drivers/net/i40e/i40e_ethdev.c index 970a31cb2..674b711d9 100644
> > --- a/drivers/net/i40e/i40e_ethdev.c
> > +++ b/drivers/net/i40e/i40e_ethdev.c
> > @@ -8787,7 +8787,7 @@ i40e_tunnel_filter_param_check(struct i40e_pf
> > *pf,
> >
> >  #define I40E_GL_PRS_FVBM_MSK_ENA 0x80000000
> >  #define I40E_GL_PRS_FVBM(_i)     (0x00269760 + ((_i) * 4))
> > -static int
> > +int
> >  i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len)  {  struct
> > i40e_pf *pf = &((struct i40e_adapter *)hw->back)->pf; diff -- git
> > a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
> > index e5d0ce53f..192636927 100644
> > --- a/drivers/net/i40e/i40e_ethdev.h
> > +++ b/drivers/net/i40e/i40e_ethdev.h
> > @@ -1270,6 +1270,11 @@ enum i40e_filter_pctype  uint16_t flow_type);
> > uint16_t i40e_pctype_to_flowtype(const struct i40e_adapter *adapter,
> >   enum i40e_filter_pctype pctype);
> > +int i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len); void
> > +i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info
> > +*fdir); void i40e_fdir_stats_get(struct rte_eth_dev *dev,  struct
> > +rte_eth_fdir_stats *stat);
> >  int i40e_fdir_ctrl_func(struct rte_eth_dev *dev,
> >    enum rte_filter_op filter_op,
> >    void *arg);
> 
> It doesn't make sense to add the definition here as these functions only called by
> private API.
> I think it better to move these function to private also
> 

For the reason the legacy filter API and function is not really removed, it will call the function.
It may not be the right time to move the functions to private.

The same as ixgbe.

> [...]
> 
> 
> > --
> > 2.17.1
> 


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

* [dpdk-dev] [PATCH v3 0/5] re-implement legacy filter functions by private API
  2020-06-11  6:01 [dpdk-dev] [PATCH 0/5] re-implement legacy filter functions by private API Chenxu Di
                   ` (5 preceding siblings ...)
  2020-06-15  2:18 ` [dpdk-dev] [PATCH v2 0/5] re-implement legacy filter functions by private API Chenxu Di
@ 2020-07-01  8:24 ` Chenxu Di
  2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 1/5] net/i40e: add private APIs Chenxu Di
                     ` (4 more replies)
  2020-07-08  1:18 ` [dpdk-dev] [PATCH v4 0/5] re-implement legacy filter functions by private API Chenxu Di
  7 siblings, 5 replies; 47+ messages in thread
From: Chenxu Di @ 2020-07-01  8:24 UTC (permalink / raw)
  To: dev; +Cc: Yang Qiming, jia.guo, Chenxu Di

The legacy filter API will be superseded by rte_flow.
There are also several small features which can not be
implemented in rte_flow.
This patch re-implemented features get_fdir_info, get_fdir_stat and
set_gre_key_len as private API.
This patch also enable RSS action in flow query.

v3:
-updated the init of ret in testpmd
-updated the log style
-added sample in commit log
v2:
-fixed the __rte_experimental flag

Chenxu Di (5):
  net/i40e: add private APIs
  net/ixgbe: add private APIs
  app/testpmd: re-implement commands by using private API
  net/i40e: enable flow query RSS
  app/testpmd: support query RSS config in flow query

 app/test-pmd/cmdline.c                      |   6 +
 app/test-pmd/config.c                       | 120 ++++++++++++++++++--
 doc/guides/rel_notes/release_20_08.rst      |  14 +++
 drivers/net/i40e/i40e_ethdev.c              |   2 +-
 drivers/net/i40e/i40e_ethdev.h              |   5 +
 drivers/net/i40e/i40e_fdir.c                |   4 +-
 drivers/net/i40e/i40e_flow.c                |  49 ++++++++
 drivers/net/i40e/rte_pmd_i40e.c             |  51 +++++++++
 drivers/net/i40e/rte_pmd_i40e.h             |  49 ++++++++
 drivers/net/i40e/rte_pmd_i40e_version.map   |   3 +
 drivers/net/ixgbe/ixgbe_ethdev.h            |   4 +
 drivers/net/ixgbe/ixgbe_fdir.c              |   8 +-
 drivers/net/ixgbe/rte_pmd_ixgbe.c           |  33 ++++++
 drivers/net/ixgbe/rte_pmd_ixgbe.h           |  33 ++++++
 drivers/net/ixgbe/rte_pmd_ixgbe_version.map |   2 +
 15 files changed, 364 insertions(+), 19 deletions(-)

-- 
2.17.1


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

* [dpdk-dev] [PATCH v3 1/5] net/i40e: add private APIs
  2020-07-01  8:24 ` [dpdk-dev] [PATCH v3 0/5] re-implement legacy filter functions by private API Chenxu Di
@ 2020-07-01  8:24   ` Chenxu Di
  2020-07-03  5:44     ` Jeff Guo
  2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 2/5] net/ixgbe: " Chenxu Di
                     ` (3 subsequent siblings)
  4 siblings, 1 reply; 47+ messages in thread
From: Chenxu Di @ 2020-07-01  8:24 UTC (permalink / raw)
  To: dev; +Cc: Yang Qiming, jia.guo, Chenxu Di

The legacy filter API will be superseded by rte_flow.
There are also several small features which can not be
implemented in rte_flow. This patch re-implemented these
features as private API.
Three APIs are added:
rte_pmd_i40e_get_fdir_info.
rte_pmd_i40e_get_fdir_stats.
rte_pmd_i40e_set_gre_key_len.

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 doc/guides/rel_notes/release_20_08.rst    |  7 ++++
 drivers/net/i40e/i40e_ethdev.c            |  2 +-
 drivers/net/i40e/i40e_ethdev.h            |  5 +++
 drivers/net/i40e/i40e_fdir.c              |  4 +-
 drivers/net/i40e/rte_pmd_i40e.c           | 51 +++++++++++++++++++++++
 drivers/net/i40e/rte_pmd_i40e.h           | 49 ++++++++++++++++++++++
 drivers/net/i40e/rte_pmd_i40e_version.map |  3 ++
 7 files changed, 118 insertions(+), 3 deletions(-)

diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst
index eaaf11c37..54bfd4322 100644
--- a/doc/guides/rel_notes/release_20_08.rst
+++ b/doc/guides/rel_notes/release_20_08.rst
@@ -84,6 +84,13 @@ New Features
   * Dump ``rte_flow`` memory consumption.
   * Measure packet per second forwarding.
 
+* **Updated the Intel i40e driver.**
+
+  Updated the Intel i40e driver with new features and improvements, including:
+
+  * Re-implemented get_fdir_info and get_fdir_stat in private API.
+  * Re-implemented set_gre_key_len in private API.
+
 
 Removed Items
 -------------
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 970a31cb2..674b711d9 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -8787,7 +8787,7 @@ i40e_tunnel_filter_param_check(struct i40e_pf *pf,
 
 #define I40E_GL_PRS_FVBM_MSK_ENA 0x80000000
 #define I40E_GL_PRS_FVBM(_i)     (0x00269760 + ((_i) * 4))
-static int
+int
 i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len)
 {
 	struct i40e_pf *pf = &((struct i40e_adapter *)hw->back)->pf;
diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index e5d0ce53f..192636927 100644
--- a/drivers/net/i40e/i40e_ethdev.h
+++ b/drivers/net/i40e/i40e_ethdev.h
@@ -1270,6 +1270,11 @@ enum i40e_filter_pctype
 				uint16_t flow_type);
 uint16_t i40e_pctype_to_flowtype(const struct i40e_adapter *adapter,
 				 enum i40e_filter_pctype pctype);
+int i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len);
+void i40e_fdir_info_get(struct rte_eth_dev *dev,
+			struct rte_eth_fdir_info *fdir);
+void i40e_fdir_stats_get(struct rte_eth_dev *dev,
+			 struct rte_eth_fdir_stats *stat);
 int i40e_fdir_ctrl_func(struct rte_eth_dev *dev,
 			  enum rte_filter_op filter_op,
 			  void *arg);
diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c
index d59399afe..4a778db4c 100644
--- a/drivers/net/i40e/i40e_fdir.c
+++ b/drivers/net/i40e/i40e_fdir.c
@@ -2169,7 +2169,7 @@ i40e_fdir_info_get_flex_mask(struct i40e_pf *pf,
  * @fdir: a pointer to a structure of type *rte_eth_fdir_info* to be filled with
  *    the flow director information.
  */
-static void
+void
 i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir)
 {
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
@@ -2214,7 +2214,7 @@ i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir)
  * @stat: a pointer to a structure of type *rte_eth_fdir_stats* to be filled with
  *    the flow director statistics.
  */
-static void
+void
 i40e_fdir_stats_get(struct rte_eth_dev *dev, struct rte_eth_fdir_stats *stat)
 {
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
diff --git a/drivers/net/i40e/rte_pmd_i40e.c b/drivers/net/i40e/rte_pmd_i40e.c
index 446e31710..e216e6783 100644
--- a/drivers/net/i40e/rte_pmd_i40e.c
+++ b/drivers/net/i40e/rte_pmd_i40e.c
@@ -3209,6 +3209,57 @@ rte_pmd_i40e_inset_set(uint16_t port, uint8_t pctype,
 	return 0;
 }
 
+int
+rte_pmd_i40e_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_i40e_supported(dev))
+		return -ENOTSUP;
+
+	i40e_fdir_info_get(dev, fdir_info);
+
+	return 0;
+}
+
+int
+rte_pmd_i40e_get_fdir_stats(uint16_t port, struct rte_eth_fdir_stats *fdir_stat)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_i40e_supported(dev))
+		return -ENOTSUP;
+
+	i40e_fdir_stats_get(dev, fdir_stat);
+
+	return 0;
+}
+
+int
+rte_pmd_i40e_set_gre_key_len(uint16_t port, uint8_t len)
+{
+	struct rte_eth_dev *dev;
+	struct i40e_pf *pf;
+	struct i40e_hw *hw;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_i40e_supported(dev))
+		return -ENOTSUP;
+
+	pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
+	hw = I40E_PF_TO_HW(pf);
+
+	return i40e_dev_set_gre_key_len(hw, len);
+}
+
 int
 rte_pmd_i40e_set_switch_dev(uint16_t port_id, struct rte_eth_dev *switch_dev)
 {
diff --git a/drivers/net/i40e/rte_pmd_i40e.h b/drivers/net/i40e/rte_pmd_i40e.h
index 915cdf076..0f6715efc 100644
--- a/drivers/net/i40e/rte_pmd_i40e.h
+++ b/drivers/net/i40e/rte_pmd_i40e.h
@@ -1061,6 +1061,55 @@ rte_pmd_i40e_inset_field_clear(uint64_t *inset, uint8_t field_idx)
 	return 0;
 }
 
+/**
+ * Get port fdir info
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param fdir_info
+ *   The fdir info of the port
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+__rte_experimental
+int
+rte_pmd_i40e_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info);
+
+/**
+ * Get port fdir status
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param fdir_stat
+ *   The fdir status of the port
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+__rte_experimental
+int
+rte_pmd_i40e_get_fdir_stats(uint16_t port,
+			    struct rte_eth_fdir_stats *fdir_stat);
+
+/**
+ * Set GRE key length
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param len
+ *   Length of gre-key
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+__rte_experimental
+int
+rte_pmd_i40e_set_gre_key_len(uint16_t port, uint8_t len);
+
 /**
  * For ipn3ke, i40e works with FPGA.
  * In this situation, i40e get link status from fpga,
diff --git a/drivers/net/i40e/rte_pmd_i40e_version.map b/drivers/net/i40e/rte_pmd_i40e_version.map
index c92c0cf46..f6cd3b356 100644
--- a/drivers/net/i40e/rte_pmd_i40e_version.map
+++ b/drivers/net/i40e/rte_pmd_i40e_version.map
@@ -42,5 +42,8 @@ DPDK_20.0 {
 EXPERIMENTAL {
 	global:
 
+	rte_pmd_i40e_get_fdir_info;
+	rte_pmd_i40e_get_fdir_stats;
+	rte_pmd_i40e_set_gre_key_len;
 	rte_pmd_i40e_set_switch_dev;
 };
-- 
2.17.1


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

* [dpdk-dev] [PATCH v3 2/5] net/ixgbe: add private APIs
  2020-07-01  8:24 ` [dpdk-dev] [PATCH v3 0/5] re-implement legacy filter functions by private API Chenxu Di
  2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 1/5] net/i40e: add private APIs Chenxu Di
@ 2020-07-01  8:24   ` Chenxu Di
  2020-07-03  5:44     ` Jeff Guo
  2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
                     ` (2 subsequent siblings)
  4 siblings, 1 reply; 47+ messages in thread
From: Chenxu Di @ 2020-07-01  8:24 UTC (permalink / raw)
  To: dev; +Cc: Yang Qiming, jia.guo, Chenxu Di

The legacy filter API will be superseded by rte_flow.
There are also several small features which can not be
implemented in rte_flow. This patch re-implemented these
features as private API.
Two APIs are added:
rte_pmd_ixgbe_get_fdir_info.
rte_pmd_ixgbe_get_fdir_stats.

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 doc/guides/rel_notes/release_20_08.rst      |  6 ++++
 drivers/net/ixgbe/ixgbe_ethdev.h            |  4 +++
 drivers/net/ixgbe/ixgbe_fdir.c              |  8 ++---
 drivers/net/ixgbe/rte_pmd_ixgbe.c           | 33 +++++++++++++++++++++
 drivers/net/ixgbe/rte_pmd_ixgbe.h           | 33 +++++++++++++++++++++
 drivers/net/ixgbe/rte_pmd_ixgbe_version.map |  2 ++
 6 files changed, 80 insertions(+), 6 deletions(-)

diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst
index 54bfd4322..1252a337a 100644
--- a/doc/guides/rel_notes/release_20_08.rst
+++ b/doc/guides/rel_notes/release_20_08.rst
@@ -91,6 +91,12 @@ New Features
   * Re-implemented get_fdir_info and get_fdir_stat in private API.
   * Re-implemented set_gre_key_len in private API.
 
+* **Updated the Intel ixgbe driver.**
+
+  Updated the Intel ixgbe driver with new features and improvements, including:
+
+  * Re-implemented get_fdir_info and get_fdir_stat in private API.
+
 
 Removed Items
 -------------
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h
index 3d78b2ee2..9bdef87fb 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.h
+++ b/drivers/net/ixgbe/ixgbe_ethdev.h
@@ -697,6 +697,10 @@ int ixgbe_fdir_set_flexbytes_offset(struct rte_eth_dev *dev,
 int ixgbe_fdir_filter_program(struct rte_eth_dev *dev,
 			      struct ixgbe_fdir_rule *rule,
 			      bool del, bool update);
+void ixgbe_fdir_info_get(struct rte_eth_dev *dev,
+			 struct rte_eth_fdir_info *fdir_info);
+void ixgbe_fdir_stats_get(struct rte_eth_dev *dev,
+			  struct rte_eth_fdir_stats *fdir_stats);
 
 void ixgbe_configure_dcb(struct rte_eth_dev *dev);
 
diff --git a/drivers/net/ixgbe/ixgbe_fdir.c b/drivers/net/ixgbe/ixgbe_fdir.c
index 166dae1e0..6faaa8f06 100644
--- a/drivers/net/ixgbe/ixgbe_fdir.c
+++ b/drivers/net/ixgbe/ixgbe_fdir.c
@@ -109,10 +109,6 @@ static int ixgbe_add_del_fdir_filter(struct rte_eth_dev *dev,
 			      bool del,
 			      bool update);
 static int ixgbe_fdir_flush(struct rte_eth_dev *dev);
-static void ixgbe_fdir_info_get(struct rte_eth_dev *dev,
-			struct rte_eth_fdir_info *fdir_info);
-static void ixgbe_fdir_stats_get(struct rte_eth_dev *dev,
-			struct rte_eth_fdir_stats *fdir_stats);
 
 /**
  * This function is based on ixgbe_fdir_enable_82599() in base/ixgbe_82599.c.
@@ -1414,7 +1410,7 @@ ixgbe_fdir_flush(struct rte_eth_dev *dev)
 }
 
 #define FDIRENTRIES_NUM_SHIFT 10
-static void
+void
 ixgbe_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir_info)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -1473,7 +1469,7 @@ ixgbe_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir_info
 			(uint8_t)((info->mask.flex_bytes_mask & 0xFF00) >> 8);
 }
 
-static void
+void
 ixgbe_fdir_stats_get(struct rte_eth_dev *dev, struct rte_eth_fdir_stats *fdir_stats)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.c b/drivers/net/ixgbe/rte_pmd_ixgbe.c
index 9bff557f9..d2f708242 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe.c
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe.c
@@ -1139,3 +1139,36 @@ rte_pmd_ixgbe_mdio_unlocked_write(uint16_t port, uint32_t reg_addr,
 	}
 	return 0;
 }
+
+int
+rte_pmd_ixgbe_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_ixgbe_supported(dev))
+		return -ENOTSUP;
+
+	ixgbe_fdir_info_get(dev, fdir_info);
+
+	return 0;
+}
+
+int
+rte_pmd_ixgbe_get_fdir_stats(uint16_t port,
+			     struct rte_eth_fdir_stats *fdir_stats)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_ixgbe_supported(dev))
+		return -ENOTSUP;
+
+	ixgbe_fdir_stats_get(dev, fdir_stats);
+
+	return 0;
+}
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.h b/drivers/net/ixgbe/rte_pmd_ixgbe.h
index f62fd761d..8b6bb99a5 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe.h
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe.h
@@ -726,4 +726,37 @@ enum {
 __rte_experimental
 int
 rte_pmd_ixgbe_upd_fctrl_sbp(uint16_t port, int enable);
+
+/**
+ * Get port fdir info
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param fdir_info
+ *   The fdir info of the port
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+__rte_experimental
+int
+rte_pmd_ixgbe_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info);
+
+/**
+ * Get port fdir status
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param fdir_stats
+ *   The fdir status of the port
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+__rte_experimental
+int
+rte_pmd_ixgbe_get_fdir_stats(uint16_t port,
+			     struct rte_eth_fdir_stats *fdir_stats);
 #endif /* _PMD_IXGBE_H_ */
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
index 21534dbc3..911f8083f 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
@@ -38,6 +38,8 @@ DPDK_20.0 {
 EXPERIMENTAL {
 	global:
 
+	rte_pmd_ixgbe_get_fdir_info;
+	rte_pmd_ixgbe_get_fdir_stats;
 	rte_pmd_ixgbe_mdio_lock;
 	rte_pmd_ixgbe_mdio_unlock;
 	rte_pmd_ixgbe_mdio_unlocked_read;
-- 
2.17.1


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

* [dpdk-dev] [PATCH v3 3/5] app/testpmd: re-implement commands by using private API
  2020-07-01  8:24 ` [dpdk-dev] [PATCH v3 0/5] re-implement legacy filter functions by private API Chenxu Di
  2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 1/5] net/i40e: add private APIs Chenxu Di
  2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 2/5] net/ixgbe: " Chenxu Di
@ 2020-07-01  8:24   ` Chenxu Di
  2020-07-03  5:54     ` Jeff Guo
  2020-07-06  9:10     ` Yang, Qiming
  2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 4/5] net/i40e: enable flow query RSS Chenxu Di
  2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 5/5] app/testpmd: support query RSS config in flow query Chenxu Di
  4 siblings, 2 replies; 47+ messages in thread
From: Chenxu Di @ 2020-07-01  8:24 UTC (permalink / raw)
  To: dev; +Cc: Yang Qiming, jia.guo, Chenxu Di

The legacy filter API will be superseded. This patch use
private api to change the implementation of commands
global_config <port_id> gre-key-len <key_len> and
show port fdir <port_id>

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 app/test-pmd/cmdline.c |  6 ++++
 app/test-pmd/config.c  | 65 +++++++++++++++++++++++++++++++++++-------
 2 files changed, 61 insertions(+), 10 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 996a49876..466c54aa9 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -9287,6 +9287,12 @@ cmd_global_config_parsed(void *parsed_result,
 	conf.cfg.gre_key_len = res->len;
 	ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE,
 				      RTE_ETH_FILTER_SET, &conf);
+
+#ifdef RTE_LIBRTE_I40E_PMD
+	if (ret == -ENOTSUP)
+		ret = rte_pmd_i40e_set_gre_key_len(res->port_id, res->len);
+#endif
+
 	if (ret != 0)
 		printf("Global config error\n");
 }
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index a7112c998..ed341c715 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -3727,6 +3727,50 @@ print_fdir_flow_type(uint32_t flow_types_mask)
 	printf("\n");
 }
 
+static int
+get_fdir_info(portid_t port_id, struct rte_eth_fdir_info *fdir_info)
+{
+	int ret;
+
+	ret = rte_eth_dev_filter_supported(port_id,
+					   RTE_ETH_FILTER_FDIR);
+	if (!ret)
+		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
+					RTE_ETH_FILTER_INFO, fdir_info);
+
+#ifdef RTE_LIBRTE_I40E_PMD
+	if (ret == -ENOTSUP)
+		ret = rte_pmd_i40e_get_fdir_info(port_id, fdir_info);
+#endif
+#ifdef RTE_LIBRTE_IXGBE_PMD
+	if (ret == -ENOTSUP)
+		ret = rte_pmd_ixgbe_get_fdir_info(port_id, fdir_info);
+#endif
+	return ret;
+}
+
+static int
+get_fdir_stat(portid_t port_id, struct rte_eth_fdir_stats *fdir_stat)
+{
+	int ret;
+
+	ret = rte_eth_dev_filter_supported(port_id,
+					   RTE_ETH_FILTER_FDIR);
+	if (!ret)
+		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
+					RTE_ETH_FILTER_STATS, fdir_stat);
+
+#ifdef RTE_LIBRTE_I40E_PMD
+	if (ret == -ENOTSUP)
+		ret = rte_pmd_i40e_get_fdir_stats(port_id, fdir_stat);
+#endif
+#ifdef RTE_LIBRTE_IXGBE_PMD
+	if (ret == -ENOTSUP)
+		ret = rte_pmd_ixgbe_get_fdir_stats(port_id, fdir_stat);
+#endif
+	return ret;
+}
+
 void
 fdir_get_infos(portid_t port_id)
 {
@@ -3738,19 +3782,20 @@ fdir_get_infos(portid_t port_id)
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
 		return;
-	ret = rte_eth_dev_filter_supported(port_id, RTE_ETH_FILTER_FDIR);
-	if (ret < 0) {
-		printf("\n FDIR is not supported on port %-2d\n",
-			port_id);
-		return;
-	}
 
 	memset(&fdir_info, 0, sizeof(fdir_info));
-	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
-			       RTE_ETH_FILTER_INFO, &fdir_info);
+	ret = get_fdir_info(port_id, &fdir_info);
+	if (ret) {
+		printf("Get fdir infos error: (%s)\n", strerror(-ret));
+		return;
+	}
 	memset(&fdir_stat, 0, sizeof(fdir_stat));
-	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
-			       RTE_ETH_FILTER_STATS, &fdir_stat);
+	ret = get_fdir_stat(port_id, &fdir_stat);
+	if (ret) {
+		printf("Get fdir status error: (%s)\n", strerror(-ret));
+		return;
+	}
+
 	printf("\n  %s FDIR infos for port %-2d     %s\n",
 	       fdir_stats_border, port_id, fdir_stats_border);
 	printf("  MODE: ");
-- 
2.17.1


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

* [dpdk-dev] [PATCH v3 4/5] net/i40e: enable flow query RSS
  2020-07-01  8:24 ` [dpdk-dev] [PATCH v3 0/5] re-implement legacy filter functions by private API Chenxu Di
                     ` (2 preceding siblings ...)
  2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
@ 2020-07-01  8:24   ` Chenxu Di
  2020-07-03  5:57     ` Jeff Guo
  2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 5/5] app/testpmd: support query RSS config in flow query Chenxu Di
  4 siblings, 1 reply; 47+ messages in thread
From: Chenxu Di @ 2020-07-01  8:24 UTC (permalink / raw)
  To: dev; +Cc: Yang Qiming, jia.guo, Chenxu Di

This patch enables flow query function to get the
configuration of the specified rule.

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 doc/guides/rel_notes/release_20_08.rst |  1 +
 drivers/net/i40e/i40e_flow.c           | 49 ++++++++++++++++++++++++++
 2 files changed, 50 insertions(+)

diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst
index 1252a337a..a7fb3136d 100644
--- a/doc/guides/rel_notes/release_20_08.rst
+++ b/doc/guides/rel_notes/release_20_08.rst
@@ -90,6 +90,7 @@ New Features
 
   * Re-implemented get_fdir_info and get_fdir_stat in private API.
   * Re-implemented set_gre_key_len in private API.
+  * Added support for flow query RSS.
 
 * **Updated the Intel ixgbe driver.**
 
diff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c
index 8f8df6fae..4186a5df2 100644
--- a/drivers/net/i40e/i40e_flow.c
+++ b/drivers/net/i40e/i40e_flow.c
@@ -43,6 +43,10 @@ static int i40e_flow_destroy(struct rte_eth_dev *dev,
 			     struct rte_flow_error *error);
 static int i40e_flow_flush(struct rte_eth_dev *dev,
 			   struct rte_flow_error *error);
+static int i40e_flow_query(struct rte_eth_dev *dev,
+			   struct rte_flow *flow,
+			   const struct rte_flow_action *actions,
+			   void *data, struct rte_flow_error *error);
 static int
 i40e_flow_parse_ethertype_pattern(struct rte_eth_dev *dev,
 				  const struct rte_flow_item *pattern,
@@ -129,6 +133,7 @@ const struct rte_flow_ops i40e_flow_ops = {
 	.create = i40e_flow_create,
 	.destroy = i40e_flow_destroy,
 	.flush = i40e_flow_flush,
+	.query = i40e_flow_query,
 };
 
 static union i40e_filter_t cons_filter;
@@ -5462,3 +5467,47 @@ i40e_flow_flush_rss_filter(struct rte_eth_dev *dev)
 
 	return ret;
 }
+
+static int
+i40e_flow_query(struct rte_eth_dev *dev __rte_unused,
+		struct rte_flow *flow,
+		const struct rte_flow_action *actions,
+		void *data, struct rte_flow_error *error)
+{
+	struct i40e_rss_filter *rss_rule = (struct i40e_rss_filter *)flow->rule;
+	enum rte_filter_type filter_type = flow->filter_type;
+	struct rte_flow_action_rss *rss_conf = data;
+
+	if (!rss_rule) {
+		rte_flow_error_set(error, EINVAL,
+				   RTE_FLOW_ERROR_TYPE_HANDLE,
+				   NULL, "Invalid rule");
+		return -rte_errno;
+	}
+
+	for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
+		switch (actions->type) {
+		case RTE_FLOW_ACTION_TYPE_VOID:
+			break;
+		case RTE_FLOW_ACTION_TYPE_RSS:
+			if (filter_type != RTE_ETH_FILTER_HASH) {
+				rte_flow_error_set(error, ENOTSUP,
+						   RTE_FLOW_ERROR_TYPE_ACTION,
+						   actions,
+						   "action not supported");
+				return -rte_errno;
+			}
+			rte_memcpy(rss_conf,
+				   &rss_rule->rss_filter_info.conf,
+				   sizeof(struct rte_flow_action_rss));
+			break;
+		default:
+			return rte_flow_error_set(error, ENOTSUP,
+						  RTE_FLOW_ERROR_TYPE_ACTION,
+						  actions,
+						  "action not supported");
+		}
+	}
+
+	return 0;
+}
-- 
2.17.1


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

* [dpdk-dev] [PATCH v3 5/5] app/testpmd: support query RSS config in flow query
  2020-07-01  8:24 ` [dpdk-dev] [PATCH v3 0/5] re-implement legacy filter functions by private API Chenxu Di
                     ` (3 preceding siblings ...)
  2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 4/5] net/i40e: enable flow query RSS Chenxu Di
@ 2020-07-01  8:24   ` Chenxu Di
  4 siblings, 0 replies; 47+ messages in thread
From: Chenxu Di @ 2020-07-01  8:24 UTC (permalink / raw)
  To: dev; +Cc: Yang Qiming, jia.guo, Chenxu Di

This patch support RSS action in flow query.
It can display the RSS configuration of the specified rule.

For example:
we can create an RSS rule by command "flow create 0 ingress
pattern eth / ipv4 / tcp / end actions rss types ipv4-tcp
l3-src-only l4-dst-only end queues end func symmetric_toeplitz
 / end" and then query it "flow query 0 0 rss"
the log will be follow
RSS:
 queues: none
 function: symmetric_toeplitz
 types:
  ipv4-tcp
  l3-src-only
  l4-dst-only

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 app/test-pmd/config.c | 55 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index ed341c715..df2ea5d81 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -1376,6 +1376,56 @@ port_flow_complain(struct rte_flow_error *error)
 	return -err;
 }
 
+static void
+rss_config_display(struct rte_flow_action_rss *rss_conf)
+{
+	uint8_t i;
+
+	if (rss_conf == NULL) {
+		printf("Invalid rule\n");
+		return;
+	}
+
+	printf("RSS:\n"
+	       " queues: ");
+	if (rss_conf->queue_num == 0)
+		printf("none\n");
+	for (i = 0; i < rss_conf->queue_num; i++)
+		printf("%d\n", rss_conf->queue[i]);
+
+	printf(" function: ");
+	switch (rss_conf->func) {
+	case RTE_ETH_HASH_FUNCTION_DEFAULT:
+		printf("default\n");
+		break;
+	case RTE_ETH_HASH_FUNCTION_TOEPLITZ:
+		printf("toeplitz\n");
+		break;
+	case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR:
+		printf("simple_xor\n");
+		break;
+	case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ:
+		printf("symmetric_toeplitz\n");
+		break;
+	default:
+		printf("Unknown function\n");
+		return;
+	}
+
+	printf(" types:\n");
+	if (rss_conf->types == 0) {
+		printf("  none\n");
+		return;
+	}
+	for (i = 0; rss_type_table[i].str; i++) {
+		if ((rss_conf->types &
+		    rss_type_table[i].rss_type) ==
+		    rss_type_table[i].rss_type &&
+		    rss_type_table[i].rss_type != 0)
+			printf("  %s\n", rss_type_table[i].str);
+	}
+}
+
 /** Validate flow rule. */
 int
 port_flow_validate(portid_t port_id,
@@ -1562,6 +1612,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
 	const char *name;
 	union {
 		struct rte_flow_query_count count;
+		struct rte_flow_action_rss rss_conf;
 	} query;
 	int ret;
 
@@ -1583,6 +1634,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
 		return port_flow_complain(&error);
 	switch (action->type) {
 	case RTE_FLOW_ACTION_TYPE_COUNT:
+	case RTE_FLOW_ACTION_TYPE_RSS:
 		break;
 	default:
 		printf("Cannot query action type %d (%s)\n",
@@ -1607,6 +1659,9 @@ port_flow_query(portid_t port_id, uint32_t rule,
 		       query.count.hits,
 		       query.count.bytes);
 		break;
+	case RTE_FLOW_ACTION_TYPE_RSS:
+		rss_config_display(&query.rss_conf);
+		break;
 	default:
 		printf("Cannot display result for action type %d (%s)\n",
 		       action->type, name);
-- 
2.17.1


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

* Re: [dpdk-dev] [PATCH v3 1/5] net/i40e: add private APIs
  2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 1/5] net/i40e: add private APIs Chenxu Di
@ 2020-07-03  5:44     ` Jeff Guo
  0 siblings, 0 replies; 47+ messages in thread
From: Jeff Guo @ 2020-07-03  5:44 UTC (permalink / raw)
  To: Chenxu Di, dev; +Cc: Yang Qiming


On 7/1/2020 4:24 PM, Chenxu Di wrote:
> The legacy filter API will be superseded by rte_flow.
> There are also several small features which can not be
> implemented in rte_flow. This patch re-implemented these
> features as private API.
> Three APIs are added:
> rte_pmd_i40e_get_fdir_info.
> rte_pmd_i40e_get_fdir_stats.
> rte_pmd_i40e_set_gre_key_len.
>
> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>   doc/guides/rel_notes/release_20_08.rst    |  7 ++++
>   drivers/net/i40e/i40e_ethdev.c            |  2 +-
>   drivers/net/i40e/i40e_ethdev.h            |  5 +++
>   drivers/net/i40e/i40e_fdir.c              |  4 +-
>   drivers/net/i40e/rte_pmd_i40e.c           | 51 +++++++++++++++++++++++
>   drivers/net/i40e/rte_pmd_i40e.h           | 49 ++++++++++++++++++++++
>   drivers/net/i40e/rte_pmd_i40e_version.map |  3 ++
>   7 files changed, 118 insertions(+), 3 deletions(-)
>
> diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst
> index eaaf11c37..54bfd4322 100644
> --- a/doc/guides/rel_notes/release_20_08.rst
> +++ b/doc/guides/rel_notes/release_20_08.rst
> @@ -84,6 +84,13 @@ New Features
>     * Dump ``rte_flow`` memory consumption.
>     * Measure packet per second forwarding.
>   
> +* **Updated the Intel i40e driver.**
> +
> +  Updated the Intel i40e driver with new features and improvements, including:
> +
> +  * Re-implemented get_fdir_info and get_fdir_stat in private API.
> +  * Re-implemented set_gre_key_len in private API.
> +
>   
>   Removed Items
>   -------------
> diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
> index 970a31cb2..674b711d9 100644
> --- a/drivers/net/i40e/i40e_ethdev.c
> +++ b/drivers/net/i40e/i40e_ethdev.c
> @@ -8787,7 +8787,7 @@ i40e_tunnel_filter_param_check(struct i40e_pf *pf,
>   
>   #define I40E_GL_PRS_FVBM_MSK_ENA 0x80000000
>   #define I40E_GL_PRS_FVBM(_i)     (0x00269760 + ((_i) * 4))
> -static int
> +int
>   i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len)
>   {
>   	struct i40e_pf *pf = &((struct i40e_adapter *)hw->back)->pf;
> diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
> index e5d0ce53f..192636927 100644
> --- a/drivers/net/i40e/i40e_ethdev.h
> +++ b/drivers/net/i40e/i40e_ethdev.h
> @@ -1270,6 +1270,11 @@ enum i40e_filter_pctype
>   				uint16_t flow_type);
>   uint16_t i40e_pctype_to_flowtype(const struct i40e_adapter *adapter,
>   				 enum i40e_filter_pctype pctype);
> +int i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len);
> +void i40e_fdir_info_get(struct rte_eth_dev *dev,
> +			struct rte_eth_fdir_info *fdir);
> +void i40e_fdir_stats_get(struct rte_eth_dev *dev,
> +			 struct rte_eth_fdir_stats *stat);
>   int i40e_fdir_ctrl_func(struct rte_eth_dev *dev,
>   			  enum rte_filter_op filter_op,
>   			  void *arg);
> diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c
> index d59399afe..4a778db4c 100644
> --- a/drivers/net/i40e/i40e_fdir.c
> +++ b/drivers/net/i40e/i40e_fdir.c
> @@ -2169,7 +2169,7 @@ i40e_fdir_info_get_flex_mask(struct i40e_pf *pf,
>    * @fdir: a pointer to a structure of type *rte_eth_fdir_info* to be filled with
>    *    the flow director information.
>    */
> -static void
> +void
>   i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir)
>   {
>   	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
> @@ -2214,7 +2214,7 @@ i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir)
>    * @stat: a pointer to a structure of type *rte_eth_fdir_stats* to be filled with
>    *    the flow director statistics.
>    */
> -static void
> +void
>   i40e_fdir_stats_get(struct rte_eth_dev *dev, struct rte_eth_fdir_stats *stat)
>   {
>   	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
> diff --git a/drivers/net/i40e/rte_pmd_i40e.c b/drivers/net/i40e/rte_pmd_i40e.c
> index 446e31710..e216e6783 100644
> --- a/drivers/net/i40e/rte_pmd_i40e.c
> +++ b/drivers/net/i40e/rte_pmd_i40e.c
> @@ -3209,6 +3209,57 @@ rte_pmd_i40e_inset_set(uint16_t port, uint8_t pctype,
>   	return 0;
>   }
>   
> +int
> +rte_pmd_i40e_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info)
> +{
> +	struct rte_eth_dev *dev;
> +
> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
> +
> +	dev = &rte_eth_devices[port];
> +	if (!is_i40e_supported(dev))
> +		return -ENOTSUP;
> +
> +	i40e_fdir_info_get(dev, fdir_info);
> +
> +	return 0;
> +}
> +
> +int
> +rte_pmd_i40e_get_fdir_stats(uint16_t port, struct rte_eth_fdir_stats *fdir_stat)
> +{
> +	struct rte_eth_dev *dev;
> +
> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
> +
> +	dev = &rte_eth_devices[port];
> +	if (!is_i40e_supported(dev))
> +		return -ENOTSUP;
> +
> +	i40e_fdir_stats_get(dev, fdir_stat);
> +
> +	return 0;
> +}
> +
> +int
> +rte_pmd_i40e_set_gre_key_len(uint16_t port, uint8_t len)
> +{
> +	struct rte_eth_dev *dev;
> +	struct i40e_pf *pf;
> +	struct i40e_hw *hw;
> +
> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
> +
> +	dev = &rte_eth_devices[port];
> +	if (!is_i40e_supported(dev))
> +		return -ENOTSUP;
> +
> +	pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
> +	hw = I40E_PF_TO_HW(pf);
> +
> +	return i40e_dev_set_gre_key_len(hw, len);
> +}
> +
>   int
>   rte_pmd_i40e_set_switch_dev(uint16_t port_id, struct rte_eth_dev *switch_dev)
>   {
> diff --git a/drivers/net/i40e/rte_pmd_i40e.h b/drivers/net/i40e/rte_pmd_i40e.h
> index 915cdf076..0f6715efc 100644
> --- a/drivers/net/i40e/rte_pmd_i40e.h
> +++ b/drivers/net/i40e/rte_pmd_i40e.h
> @@ -1061,6 +1061,55 @@ rte_pmd_i40e_inset_field_clear(uint64_t *inset, uint8_t field_idx)
>   	return 0;
>   }
>   
> +/**
> + * Get port fdir info
> + *
> + * @param port
> + *   The port identifier of the Ethernet device.
> + * @param fdir_info
> + *   The fdir info of the port
> + * @return
> + *   - (0) if successful.
> + *   - (-ENODEV) if *port* invalid.
> + *   - (-ENOTSUP) if operation not supported.
> + */
> +__rte_experimental
> +int
> +rte_pmd_i40e_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info);
> +
> +/**
> + * Get port fdir status
> + *
> + * @param port
> + *   The port identifier of the Ethernet device.
> + * @param fdir_stat
> + *   The fdir status of the port
> + * @return
> + *   - (0) if successful.
> + *   - (-ENODEV) if *port* invalid.
> + *   - (-ENOTSUP) if operation not supported.
> + */
> +__rte_experimental
> +int
> +rte_pmd_i40e_get_fdir_stats(uint16_t port,
> +			    struct rte_eth_fdir_stats *fdir_stat);
> +
> +/**
> + * Set GRE key length
> + *
> + * @param port
> + *   The port identifier of the Ethernet device.
> + * @param len
> + *   Length of gre-key
> + * @return
> + *   - (0) if successful.
> + *   - (-ENODEV) if *port* invalid.
> + *   - (-ENOTSUP) if operation not supported.
> + */
> +__rte_experimental
> +int
> +rte_pmd_i40e_set_gre_key_len(uint16_t port, uint8_t len);
> +
>   /**
>    * For ipn3ke, i40e works with FPGA.
>    * In this situation, i40e get link status from fpga,
> diff --git a/drivers/net/i40e/rte_pmd_i40e_version.map b/drivers/net/i40e/rte_pmd_i40e_version.map
> index c92c0cf46..f6cd3b356 100644
> --- a/drivers/net/i40e/rte_pmd_i40e_version.map
> +++ b/drivers/net/i40e/rte_pmd_i40e_version.map
> @@ -42,5 +42,8 @@ DPDK_20.0 {
>   EXPERIMENTAL {
>   	global:
>   
> +	rte_pmd_i40e_get_fdir_info;
> +	rte_pmd_i40e_get_fdir_stats;
> +	rte_pmd_i40e_set_gre_key_len;
>   	rte_pmd_i40e_set_switch_dev;
>   };

Acked-by: Jeff Guo <jia.guo@intel.com <mailto:jia.guo@intel.com>>


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

* Re: [dpdk-dev] [PATCH v3 2/5] net/ixgbe: add private APIs
  2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 2/5] net/ixgbe: " Chenxu Di
@ 2020-07-03  5:44     ` Jeff Guo
  0 siblings, 0 replies; 47+ messages in thread
From: Jeff Guo @ 2020-07-03  5:44 UTC (permalink / raw)
  To: Chenxu Di, dev; +Cc: Yang Qiming


On 7/1/2020 4:24 PM, Chenxu Di wrote:
> The legacy filter API will be superseded by rte_flow.
> There are also several small features which can not be
> implemented in rte_flow. This patch re-implemented these
> features as private API.
> Two APIs are added:
> rte_pmd_ixgbe_get_fdir_info.
> rte_pmd_ixgbe_get_fdir_stats.
>
> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>   doc/guides/rel_notes/release_20_08.rst      |  6 ++++
>   drivers/net/ixgbe/ixgbe_ethdev.h            |  4 +++
>   drivers/net/ixgbe/ixgbe_fdir.c              |  8 ++---
>   drivers/net/ixgbe/rte_pmd_ixgbe.c           | 33 +++++++++++++++++++++
>   drivers/net/ixgbe/rte_pmd_ixgbe.h           | 33 +++++++++++++++++++++
>   drivers/net/ixgbe/rte_pmd_ixgbe_version.map |  2 ++
>   6 files changed, 80 insertions(+), 6 deletions(-)
>
> diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst
> index 54bfd4322..1252a337a 100644
> --- a/doc/guides/rel_notes/release_20_08.rst
> +++ b/doc/guides/rel_notes/release_20_08.rst
> @@ -91,6 +91,12 @@ New Features
>     * Re-implemented get_fdir_info and get_fdir_stat in private API.
>     * Re-implemented set_gre_key_len in private API.
>   
> +* **Updated the Intel ixgbe driver.**
> +
> +  Updated the Intel ixgbe driver with new features and improvements, including:
> +
> +  * Re-implemented get_fdir_info and get_fdir_stat in private API.
> +
>   
>   Removed Items
>   -------------
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h
> index 3d78b2ee2..9bdef87fb 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.h
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.h
> @@ -697,6 +697,10 @@ int ixgbe_fdir_set_flexbytes_offset(struct rte_eth_dev *dev,
>   int ixgbe_fdir_filter_program(struct rte_eth_dev *dev,
>   			      struct ixgbe_fdir_rule *rule,
>   			      bool del, bool update);
> +void ixgbe_fdir_info_get(struct rte_eth_dev *dev,
> +			 struct rte_eth_fdir_info *fdir_info);
> +void ixgbe_fdir_stats_get(struct rte_eth_dev *dev,
> +			  struct rte_eth_fdir_stats *fdir_stats);
>   
>   void ixgbe_configure_dcb(struct rte_eth_dev *dev);
>   
> diff --git a/drivers/net/ixgbe/ixgbe_fdir.c b/drivers/net/ixgbe/ixgbe_fdir.c
> index 166dae1e0..6faaa8f06 100644
> --- a/drivers/net/ixgbe/ixgbe_fdir.c
> +++ b/drivers/net/ixgbe/ixgbe_fdir.c
> @@ -109,10 +109,6 @@ static int ixgbe_add_del_fdir_filter(struct rte_eth_dev *dev,
>   			      bool del,
>   			      bool update);
>   static int ixgbe_fdir_flush(struct rte_eth_dev *dev);
> -static void ixgbe_fdir_info_get(struct rte_eth_dev *dev,
> -			struct rte_eth_fdir_info *fdir_info);
> -static void ixgbe_fdir_stats_get(struct rte_eth_dev *dev,
> -			struct rte_eth_fdir_stats *fdir_stats);
>   
>   /**
>    * This function is based on ixgbe_fdir_enable_82599() in base/ixgbe_82599.c.
> @@ -1414,7 +1410,7 @@ ixgbe_fdir_flush(struct rte_eth_dev *dev)
>   }
>   
>   #define FDIRENTRIES_NUM_SHIFT 10
> -static void
> +void
>   ixgbe_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir_info)
>   {
>   	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
> @@ -1473,7 +1469,7 @@ ixgbe_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir_info
>   			(uint8_t)((info->mask.flex_bytes_mask & 0xFF00) >> 8);
>   }
>   
> -static void
> +void
>   ixgbe_fdir_stats_get(struct rte_eth_dev *dev, struct rte_eth_fdir_stats *fdir_stats)
>   {
>   	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
> diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.c b/drivers/net/ixgbe/rte_pmd_ixgbe.c
> index 9bff557f9..d2f708242 100644
> --- a/drivers/net/ixgbe/rte_pmd_ixgbe.c
> +++ b/drivers/net/ixgbe/rte_pmd_ixgbe.c
> @@ -1139,3 +1139,36 @@ rte_pmd_ixgbe_mdio_unlocked_write(uint16_t port, uint32_t reg_addr,
>   	}
>   	return 0;
>   }
> +
> +int
> +rte_pmd_ixgbe_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info)
> +{
> +	struct rte_eth_dev *dev;
> +
> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
> +
> +	dev = &rte_eth_devices[port];
> +	if (!is_ixgbe_supported(dev))
> +		return -ENOTSUP;
> +
> +	ixgbe_fdir_info_get(dev, fdir_info);
> +
> +	return 0;
> +}
> +
> +int
> +rte_pmd_ixgbe_get_fdir_stats(uint16_t port,
> +			     struct rte_eth_fdir_stats *fdir_stats)
> +{
> +	struct rte_eth_dev *dev;
> +
> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
> +
> +	dev = &rte_eth_devices[port];
> +	if (!is_ixgbe_supported(dev))
> +		return -ENOTSUP;
> +
> +	ixgbe_fdir_stats_get(dev, fdir_stats);
> +
> +	return 0;
> +}
> diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.h b/drivers/net/ixgbe/rte_pmd_ixgbe.h
> index f62fd761d..8b6bb99a5 100644
> --- a/drivers/net/ixgbe/rte_pmd_ixgbe.h
> +++ b/drivers/net/ixgbe/rte_pmd_ixgbe.h
> @@ -726,4 +726,37 @@ enum {
>   __rte_experimental
>   int
>   rte_pmd_ixgbe_upd_fctrl_sbp(uint16_t port, int enable);
> +
> +/**
> + * Get port fdir info
> + *
> + * @param port
> + *   The port identifier of the Ethernet device.
> + * @param fdir_info
> + *   The fdir info of the port
> + * @return
> + *   - (0) if successful.
> + *   - (-ENODEV) if *port* invalid.
> + *   - (-ENOTSUP) if operation not supported.
> + */
> +__rte_experimental
> +int
> +rte_pmd_ixgbe_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info);
> +
> +/**
> + * Get port fdir status
> + *
> + * @param port
> + *   The port identifier of the Ethernet device.
> + * @param fdir_stats
> + *   The fdir status of the port
> + * @return
> + *   - (0) if successful.
> + *   - (-ENODEV) if *port* invalid.
> + *   - (-ENOTSUP) if operation not supported.
> + */
> +__rte_experimental
> +int
> +rte_pmd_ixgbe_get_fdir_stats(uint16_t port,
> +			     struct rte_eth_fdir_stats *fdir_stats);
>   #endif /* _PMD_IXGBE_H_ */
> diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
> index 21534dbc3..911f8083f 100644
> --- a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
> +++ b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
> @@ -38,6 +38,8 @@ DPDK_20.0 {
>   EXPERIMENTAL {
>   	global:
>   
> +	rte_pmd_ixgbe_get_fdir_info;
> +	rte_pmd_ixgbe_get_fdir_stats;
>   	rte_pmd_ixgbe_mdio_lock;
>   	rte_pmd_ixgbe_mdio_unlock;
>   	rte_pmd_ixgbe_mdio_unlocked_read;


Acked-by: Jeff Guo <jia.guo@intel.com <mailto:jia.guo@intel.com>>


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

* Re: [dpdk-dev] [PATCH v3 3/5] app/testpmd: re-implement commands by using private API
  2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
@ 2020-07-03  5:54     ` Jeff Guo
  2020-07-06  9:10     ` Yang, Qiming
  1 sibling, 0 replies; 47+ messages in thread
From: Jeff Guo @ 2020-07-03  5:54 UTC (permalink / raw)
  To: Chenxu Di, dev; +Cc: Yang Qiming

hi, chenxu

Please use --in-relpy-to  next time to help reviewers check all relevant 
comments,

and some minor comment, after fix it you could bring my ACK in the 
coming version, thanks.

On 7/1/2020 4:24 PM, Chenxu Di wrote:
> The legacy filter API will be superseded. This patch use
> private api to change the implementation of commands
> global_config <port_id> gre-key-len <key_len> and
> show port fdir <port_id>
>
> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>   app/test-pmd/cmdline.c |  6 ++++
>   app/test-pmd/config.c  | 65 +++++++++++++++++++++++++++++++++++-------
>   2 files changed, 61 insertions(+), 10 deletions(-)
>
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
> index 996a49876..466c54aa9 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -9287,6 +9287,12 @@ cmd_global_config_parsed(void *parsed_result,
>   	conf.cfg.gre_key_len = res->len;
>   	ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE,
>   				      RTE_ETH_FILTER_SET, &conf);
> +


This blank line is no need.


> +#ifdef RTE_LIBRTE_I40E_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_i40e_set_gre_key_len(res->port_id, res->len);
> +#endif
> +


This blank line is also no need, since if the above macro is no defined, 
there will be two blank lines here.


>   	if (ret != 0)
>   		printf("Global config error\n");
>   }
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
> index a7112c998..ed341c715 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -3727,6 +3727,50 @@ print_fdir_flow_type(uint32_t flow_types_mask)
>   	printf("\n");
>   }
>   
> +static int
> +get_fdir_info(portid_t port_id, struct rte_eth_fdir_info *fdir_info)
> +{
> +	int ret;
> +
> +	ret = rte_eth_dev_filter_supported(port_id,
> +					   RTE_ETH_FILTER_FDIR);
> +	if (!ret)
> +		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> +					RTE_ETH_FILTER_INFO, fdir_info);
> +
> +#ifdef RTE_LIBRTE_I40E_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_i40e_get_fdir_info(port_id, fdir_info);
> +#endif
> +#ifdef RTE_LIBRTE_IXGBE_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_ixgbe_get_fdir_info(port_id, fdir_info);
> +#endif
> +	return ret;
> +}
> +
> +static int
> +get_fdir_stat(portid_t port_id, struct rte_eth_fdir_stats *fdir_stat)
> +{
> +	int ret;
> +
> +	ret = rte_eth_dev_filter_supported(port_id,
> +					   RTE_ETH_FILTER_FDIR);
> +	if (!ret)
> +		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> +					RTE_ETH_FILTER_STATS, fdir_stat);
> +
> +#ifdef RTE_LIBRTE_I40E_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_i40e_get_fdir_stats(port_id, fdir_stat);
> +#endif
> +#ifdef RTE_LIBRTE_IXGBE_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_ixgbe_get_fdir_stats(port_id, fdir_stat);
> +#endif
> +	return ret;
> +}
> +
>   void
>   fdir_get_infos(portid_t port_id)
>   {
> @@ -3738,19 +3782,20 @@ fdir_get_infos(portid_t port_id)
>   
>   	if (port_id_is_invalid(port_id, ENABLED_WARN))
>   		return;
> -	ret = rte_eth_dev_filter_supported(port_id, RTE_ETH_FILTER_FDIR);
> -	if (ret < 0) {
> -		printf("\n FDIR is not supported on port %-2d\n",
> -			port_id);
> -		return;
> -	}
>   
>   	memset(&fdir_info, 0, sizeof(fdir_info));
> -	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> -			       RTE_ETH_FILTER_INFO, &fdir_info);
> +	ret = get_fdir_info(port_id, &fdir_info);
> +	if (ret) {
> +		printf("Get fdir infos error: (%s)\n", strerror(-ret));
> +		return;
> +	}
>   	memset(&fdir_stat, 0, sizeof(fdir_stat));
> -	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> -			       RTE_ETH_FILTER_STATS, &fdir_stat);
> +	ret = get_fdir_stat(port_id, &fdir_stat);
> +	if (ret) {
> +		printf("Get fdir status error: (%s)\n", strerror(-ret));
> +		return;
> +	}
> +
>   	printf("\n  %s FDIR infos for port %-2d     %s\n",
>   	       fdir_stats_border, port_id, fdir_stats_border);
>   	printf("  MODE: ");

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

* Re: [dpdk-dev] [PATCH v3 4/5] net/i40e: enable flow query RSS
  2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 4/5] net/i40e: enable flow query RSS Chenxu Di
@ 2020-07-03  5:57     ` Jeff Guo
  0 siblings, 0 replies; 47+ messages in thread
From: Jeff Guo @ 2020-07-03  5:57 UTC (permalink / raw)
  To: Chenxu Di, dev; +Cc: Yang Qiming


On 7/1/2020 4:24 PM, Chenxu Di wrote:
> This patch enables flow query function to get the
> configuration of the specified rule.
>
> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>   doc/guides/rel_notes/release_20_08.rst |  1 +
>   drivers/net/i40e/i40e_flow.c           | 49 ++++++++++++++++++++++++++
>   2 files changed, 50 insertions(+)
>
> diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst
> index 1252a337a..a7fb3136d 100644
> --- a/doc/guides/rel_notes/release_20_08.rst
> +++ b/doc/guides/rel_notes/release_20_08.rst
> @@ -90,6 +90,7 @@ New Features
>   
>     * Re-implemented get_fdir_info and get_fdir_stat in private API.
>     * Re-implemented set_gre_key_len in private API.
> +  * Added support for flow query RSS.
>   
>   * **Updated the Intel ixgbe driver.**
>   
> diff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c
> index 8f8df6fae..4186a5df2 100644
> --- a/drivers/net/i40e/i40e_flow.c
> +++ b/drivers/net/i40e/i40e_flow.c
> @@ -43,6 +43,10 @@ static int i40e_flow_destroy(struct rte_eth_dev *dev,
>   			     struct rte_flow_error *error);
>   static int i40e_flow_flush(struct rte_eth_dev *dev,
>   			   struct rte_flow_error *error);
> +static int i40e_flow_query(struct rte_eth_dev *dev,
> +			   struct rte_flow *flow,
> +			   const struct rte_flow_action *actions,
> +			   void *data, struct rte_flow_error *error);
>   static int
>   i40e_flow_parse_ethertype_pattern(struct rte_eth_dev *dev,
>   				  const struct rte_flow_item *pattern,
> @@ -129,6 +133,7 @@ const struct rte_flow_ops i40e_flow_ops = {
>   	.create = i40e_flow_create,
>   	.destroy = i40e_flow_destroy,
>   	.flush = i40e_flow_flush,
> +	.query = i40e_flow_query,
>   };
>   
>   static union i40e_filter_t cons_filter;
> @@ -5462,3 +5467,47 @@ i40e_flow_flush_rss_filter(struct rte_eth_dev *dev)
>   
>   	return ret;
>   }
> +
> +static int
> +i40e_flow_query(struct rte_eth_dev *dev __rte_unused,
> +		struct rte_flow *flow,
> +		const struct rte_flow_action *actions,
> +		void *data, struct rte_flow_error *error)
> +{
> +	struct i40e_rss_filter *rss_rule = (struct i40e_rss_filter *)flow->rule;
> +	enum rte_filter_type filter_type = flow->filter_type;
> +	struct rte_flow_action_rss *rss_conf = data;
> +
> +	if (!rss_rule) {
> +		rte_flow_error_set(error, EINVAL,
> +				   RTE_FLOW_ERROR_TYPE_HANDLE,
> +				   NULL, "Invalid rule");
> +		return -rte_errno;
> +	}
> +
> +	for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
> +		switch (actions->type) {
> +		case RTE_FLOW_ACTION_TYPE_VOID:
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_RSS:
> +			if (filter_type != RTE_ETH_FILTER_HASH) {
> +				rte_flow_error_set(error, ENOTSUP,
> +						   RTE_FLOW_ERROR_TYPE_ACTION,
> +						   actions,
> +						   "action not supported");
> +				return -rte_errno;
> +			}
> +			rte_memcpy(rss_conf,
> +				   &rss_rule->rss_filter_info.conf,
> +				   sizeof(struct rte_flow_action_rss));
> +			break;
> +		default:
> +			return rte_flow_error_set(error, ENOTSUP,
> +						  RTE_FLOW_ERROR_TYPE_ACTION,
> +						  actions,
> +						  "action not supported");
> +		}
> +	}
> +
> +	return 0;
> +}


Acked-by: Jeff Guo <jia.guo@intel.com <mailto:jia.guo@intel.com>>


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

* Re: [dpdk-dev] [PATCH v3 3/5] app/testpmd: re-implement commands by using private API
  2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
  2020-07-03  5:54     ` Jeff Guo
@ 2020-07-06  9:10     ` Yang, Qiming
  1 sibling, 0 replies; 47+ messages in thread
From: Yang, Qiming @ 2020-07-06  9:10 UTC (permalink / raw)
  To: Di, ChenxuX, dev; +Cc: Guo, Jia



> -----Original Message-----
> From: Di, ChenxuX <chenxux.di@intel.com>
> Sent: Wednesday, July 1, 2020 16:25
> To: dev@dpdk.org
> Cc: Yang, Qiming <qiming.yang@intel.com>; Guo, Jia <jia.guo@intel.com>; Di,
> ChenxuX <chenxux.di@intel.com>
> Subject: [PATCH v3 3/5] app/testpmd: re-implement commands by using
> private API
> 
> The legacy filter API will be superseded. This patch use private api to change
> the implementation of commands global_config <port_id> gre-key-len
> <key_len> and show port fdir <port_id>
> 
> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>  app/test-pmd/cmdline.c |  6 ++++
>  app/test-pmd/config.c  | 65 +++++++++++++++++++++++++++++++++++---
> ----
>  2 files changed, 61 insertions(+), 10 deletions(-)
> 
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
> 996a49876..466c54aa9 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -9287,6 +9287,12 @@ cmd_global_config_parsed(void *parsed_result,
>  	conf.cfg.gre_key_len = res->len;
>  	ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE,
>  				      RTE_ETH_FILTER_SET, &conf);
> +
> +#ifdef RTE_LIBRTE_I40E_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_i40e_set_gre_key_len(res->port_id, res-
> >len); #endif
> +
>  	if (ret != 0)
>  		printf("Global config error\n");
>  }
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index
> a7112c998..ed341c715 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -3727,6 +3727,50 @@ print_fdir_flow_type(uint32_t flow_types_mask)
>  	printf("\n");
>  }
> 
> +static int
> +get_fdir_info(portid_t port_id, struct rte_eth_fdir_info *fdir_info) {
> +	int ret;
> +
> +	ret = rte_eth_dev_filter_supported(port_id,
> +					   RTE_ETH_FILTER_FDIR);
> +	if (!ret)
> +		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> +					RTE_ETH_FILTER_INFO, fdir_info);
> +
> +#ifdef RTE_LIBRTE_I40E_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_i40e_get_fdir_info(port_id, fdir_info); #endif

No return value check.

> #ifdef
> +RTE_LIBRTE_IXGBE_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_ixgbe_get_fdir_info(port_id, fdir_info);
> #endif

We'd better use
If(ret == -ENOTSUP)
#ifdef RTE_LIBRTE_I40E_PMD
...
#endif
#ifdef RTE_LIBRTE_IXGBE_PMD
...
#endif

Same issue in patch 5

> +	return ret;
> +}
> +
> +static int
> +get_fdir_stat(portid_t port_id, struct rte_eth_fdir_stats *fdir_stat) {
> +	int ret;
> +
> +	ret = rte_eth_dev_filter_supported(port_id,
> +					   RTE_ETH_FILTER_FDIR);
> +	if (!ret)
> +		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> +					RTE_ETH_FILTER_STATS, fdir_stat);
> +
> +#ifdef RTE_LIBRTE_I40E_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_i40e_get_fdir_stats(port_id, fdir_stat); #endif
> #ifdef
> +RTE_LIBRTE_IXGBE_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_ixgbe_get_fdir_stats(port_id, fdir_stat);
> #endif

Same as above

> +	return ret;
> +}
> +
>  void
>  fdir_get_infos(portid_t port_id)
>  {
> @@ -3738,19 +3782,20 @@ fdir_get_infos(portid_t port_id)
> 
>  	if (port_id_is_invalid(port_id, ENABLED_WARN))
>  		return;
> -	ret = rte_eth_dev_filter_supported(port_id, RTE_ETH_FILTER_FDIR);
> -	if (ret < 0) {
> -		printf("\n FDIR is not supported on port %-2d\n",
> -			port_id);
> -		return;
> -	}
> 
>  	memset(&fdir_info, 0, sizeof(fdir_info));
> -	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> -			       RTE_ETH_FILTER_INFO, &fdir_info);
> +	ret = get_fdir_info(port_id, &fdir_info);
> +	if (ret) {
> +		printf("Get fdir infos error: (%s)\n", strerror(-ret));
> +		return;
> +	}
>  	memset(&fdir_stat, 0, sizeof(fdir_stat));
> -	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> -			       RTE_ETH_FILTER_STATS, &fdir_stat);
> +	ret = get_fdir_stat(port_id, &fdir_stat);

Why you add new function here, it's no need to do that

> +	if (ret) {
> +		printf("Get fdir status error: (%s)\n", strerror(-ret));
> +		return;
> +	}
> +
>  	printf("\n  %s FDIR infos for port %-2d     %s\n",
>  	       fdir_stats_border, port_id, fdir_stats_border);
>  	printf("  MODE: ");
> --
> 2.17.1


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

* [dpdk-dev] [PATCH v4 0/5] re-implement legacy filter functions by private API
  2020-06-11  6:01 [dpdk-dev] [PATCH 0/5] re-implement legacy filter functions by private API Chenxu Di
                   ` (6 preceding siblings ...)
  2020-07-01  8:24 ` [dpdk-dev] [PATCH v3 0/5] re-implement legacy filter functions by private API Chenxu Di
@ 2020-07-08  1:18 ` Chenxu Di
  2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 1/5] net/i40e: add private APIs Chenxu Di
                     ` (5 more replies)
  7 siblings, 6 replies; 47+ messages in thread
From: Chenxu Di @ 2020-07-08  1:18 UTC (permalink / raw)
  To: dev; +Cc: Yang Qiming, Chenxu Di

The legacy filter API will be superseded by rte_flow.
There are also several small features which can not be
implemented in rte_flow.
This patch re-implemented features get_fdir_info, get_fdir_stat and
set_gre_key_len as private API.
This patch also enable RSS action in flow query.

v4:
-updated code in testpmd
v3:
-updated the init of ret in testpmd
-updated the log style
v2:
-fixed the __rte_experimental flag

Chenxu Di (5):
  net/i40e: add private APIs
  net/ixgbe: add private APIs
  app/testpmd: re-implement commands by using private API
  net/i40e: enable flow query RSS
  app/testpmd: support query RSS config in flow query

 app/test-pmd/cmdline.c                      |   4 +
 app/test-pmd/config.c                       | 112 ++++++++++++++++++--
 doc/guides/rel_notes/release_20_08.rst      |  14 +++
 drivers/net/i40e/i40e_ethdev.c              |   2 +-
 drivers/net/i40e/i40e_ethdev.h              |   5 +
 drivers/net/i40e/i40e_fdir.c                |   4 +-
 drivers/net/i40e/i40e_flow.c                |  49 +++++++++
 drivers/net/i40e/rte_pmd_i40e.c             |  51 +++++++++
 drivers/net/i40e/rte_pmd_i40e.h             |  49 +++++++++
 drivers/net/i40e/rte_pmd_i40e_version.map   |   3 +
 drivers/net/ixgbe/ixgbe_ethdev.h            |   4 +
 drivers/net/ixgbe/ixgbe_fdir.c              |   8 +-
 drivers/net/ixgbe/rte_pmd_ixgbe.c           |  33 ++++++
 drivers/net/ixgbe/rte_pmd_ixgbe.h           |  33 ++++++
 drivers/net/ixgbe/rte_pmd_ixgbe_version.map |   2 +
 15 files changed, 353 insertions(+), 20 deletions(-)

-- 
2.17.1


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

* [dpdk-dev] [PATCH v4 1/5] net/i40e: add private APIs
  2020-07-08  1:18 ` [dpdk-dev] [PATCH v4 0/5] re-implement legacy filter functions by private API Chenxu Di
@ 2020-07-08  1:18   ` Chenxu Di
  2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 2/5] net/ixgbe: " Chenxu Di
                     ` (4 subsequent siblings)
  5 siblings, 0 replies; 47+ messages in thread
From: Chenxu Di @ 2020-07-08  1:18 UTC (permalink / raw)
  To: dev; +Cc: Yang Qiming, Chenxu Di

The legacy filter API will be superseded by rte_flow.
There are also several small features which can not be
implemented in rte_flow. This patch re-implemented these
features as private API.
Three APIs are added:
rte_pmd_i40e_get_fdir_info.
rte_pmd_i40e_get_fdir_stats.
rte_pmd_i40e_set_gre_key_len.

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
Acked-by: Jeff Guo <jia.guo@intel.com>
---
 doc/guides/rel_notes/release_20_08.rst    |  7 ++++
 drivers/net/i40e/i40e_ethdev.c            |  2 +-
 drivers/net/i40e/i40e_ethdev.h            |  5 +++
 drivers/net/i40e/i40e_fdir.c              |  4 +-
 drivers/net/i40e/rte_pmd_i40e.c           | 51 +++++++++++++++++++++++
 drivers/net/i40e/rte_pmd_i40e.h           | 49 ++++++++++++++++++++++
 drivers/net/i40e/rte_pmd_i40e_version.map |  3 ++
 7 files changed, 118 insertions(+), 3 deletions(-)

diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst
index eaa9d13b5..93a793299 100644
--- a/doc/guides/rel_notes/release_20_08.rst
+++ b/doc/guides/rel_notes/release_20_08.rst
@@ -97,6 +97,13 @@ New Features
 
   Updated Marvell octeontx2 driver with cn98xx support.
 
+* **Updated the Intel i40e driver.**
+
+  Updated the Intel i40e driver with new features and improvements, including:
+
+  * Re-implemented get_fdir_info and get_fdir_stat in private API.
+  * Re-implemented set_gre_key_len in private API.
+
 * **Updated the Intel ice driver.**
 
   Updated the Intel ice driver with new features and improvements, including:
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 777e14926..392b133b8 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -8775,7 +8775,7 @@ i40e_tunnel_filter_param_check(struct i40e_pf *pf,
 
 #define I40E_GL_PRS_FVBM_MSK_ENA 0x80000000
 #define I40E_GL_PRS_FVBM(_i)     (0x00269760 + ((_i) * 4))
-static int
+int
 i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len)
 {
 	struct i40e_pf *pf = &((struct i40e_adapter *)hw->back)->pf;
diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index e5d0ce53f..192636927 100644
--- a/drivers/net/i40e/i40e_ethdev.h
+++ b/drivers/net/i40e/i40e_ethdev.h
@@ -1270,6 +1270,11 @@ enum i40e_filter_pctype
 				uint16_t flow_type);
 uint16_t i40e_pctype_to_flowtype(const struct i40e_adapter *adapter,
 				 enum i40e_filter_pctype pctype);
+int i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len);
+void i40e_fdir_info_get(struct rte_eth_dev *dev,
+			struct rte_eth_fdir_info *fdir);
+void i40e_fdir_stats_get(struct rte_eth_dev *dev,
+			 struct rte_eth_fdir_stats *stat);
 int i40e_fdir_ctrl_func(struct rte_eth_dev *dev,
 			  enum rte_filter_op filter_op,
 			  void *arg);
diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c
index d59399afe..4a778db4c 100644
--- a/drivers/net/i40e/i40e_fdir.c
+++ b/drivers/net/i40e/i40e_fdir.c
@@ -2169,7 +2169,7 @@ i40e_fdir_info_get_flex_mask(struct i40e_pf *pf,
  * @fdir: a pointer to a structure of type *rte_eth_fdir_info* to be filled with
  *    the flow director information.
  */
-static void
+void
 i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir)
 {
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
@@ -2214,7 +2214,7 @@ i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir)
  * @stat: a pointer to a structure of type *rte_eth_fdir_stats* to be filled with
  *    the flow director statistics.
  */
-static void
+void
 i40e_fdir_stats_get(struct rte_eth_dev *dev, struct rte_eth_fdir_stats *stat)
 {
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
diff --git a/drivers/net/i40e/rte_pmd_i40e.c b/drivers/net/i40e/rte_pmd_i40e.c
index 446e31710..e216e6783 100644
--- a/drivers/net/i40e/rte_pmd_i40e.c
+++ b/drivers/net/i40e/rte_pmd_i40e.c
@@ -3209,6 +3209,57 @@ rte_pmd_i40e_inset_set(uint16_t port, uint8_t pctype,
 	return 0;
 }
 
+int
+rte_pmd_i40e_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_i40e_supported(dev))
+		return -ENOTSUP;
+
+	i40e_fdir_info_get(dev, fdir_info);
+
+	return 0;
+}
+
+int
+rte_pmd_i40e_get_fdir_stats(uint16_t port, struct rte_eth_fdir_stats *fdir_stat)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_i40e_supported(dev))
+		return -ENOTSUP;
+
+	i40e_fdir_stats_get(dev, fdir_stat);
+
+	return 0;
+}
+
+int
+rte_pmd_i40e_set_gre_key_len(uint16_t port, uint8_t len)
+{
+	struct rte_eth_dev *dev;
+	struct i40e_pf *pf;
+	struct i40e_hw *hw;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_i40e_supported(dev))
+		return -ENOTSUP;
+
+	pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
+	hw = I40E_PF_TO_HW(pf);
+
+	return i40e_dev_set_gre_key_len(hw, len);
+}
+
 int
 rte_pmd_i40e_set_switch_dev(uint16_t port_id, struct rte_eth_dev *switch_dev)
 {
diff --git a/drivers/net/i40e/rte_pmd_i40e.h b/drivers/net/i40e/rte_pmd_i40e.h
index 915cdf076..0f6715efc 100644
--- a/drivers/net/i40e/rte_pmd_i40e.h
+++ b/drivers/net/i40e/rte_pmd_i40e.h
@@ -1061,6 +1061,55 @@ rte_pmd_i40e_inset_field_clear(uint64_t *inset, uint8_t field_idx)
 	return 0;
 }
 
+/**
+ * Get port fdir info
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param fdir_info
+ *   The fdir info of the port
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+__rte_experimental
+int
+rte_pmd_i40e_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info);
+
+/**
+ * Get port fdir status
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param fdir_stat
+ *   The fdir status of the port
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+__rte_experimental
+int
+rte_pmd_i40e_get_fdir_stats(uint16_t port,
+			    struct rte_eth_fdir_stats *fdir_stat);
+
+/**
+ * Set GRE key length
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param len
+ *   Length of gre-key
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+__rte_experimental
+int
+rte_pmd_i40e_set_gre_key_len(uint16_t port, uint8_t len);
+
 /**
  * For ipn3ke, i40e works with FPGA.
  * In this situation, i40e get link status from fpga,
diff --git a/drivers/net/i40e/rte_pmd_i40e_version.map b/drivers/net/i40e/rte_pmd_i40e_version.map
index c92c0cf46..f6cd3b356 100644
--- a/drivers/net/i40e/rte_pmd_i40e_version.map
+++ b/drivers/net/i40e/rte_pmd_i40e_version.map
@@ -42,5 +42,8 @@ DPDK_20.0 {
 EXPERIMENTAL {
 	global:
 
+	rte_pmd_i40e_get_fdir_info;
+	rte_pmd_i40e_get_fdir_stats;
+	rte_pmd_i40e_set_gre_key_len;
 	rte_pmd_i40e_set_switch_dev;
 };
-- 
2.17.1


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

* [dpdk-dev] [PATCH v4 2/5] net/ixgbe: add private APIs
  2020-07-08  1:18 ` [dpdk-dev] [PATCH v4 0/5] re-implement legacy filter functions by private API Chenxu Di
  2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 1/5] net/i40e: add private APIs Chenxu Di
@ 2020-07-08  1:18   ` Chenxu Di
  2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
                     ` (3 subsequent siblings)
  5 siblings, 0 replies; 47+ messages in thread
From: Chenxu Di @ 2020-07-08  1:18 UTC (permalink / raw)
  To: dev; +Cc: Yang Qiming, Chenxu Di

The legacy filter API will be superseded by rte_flow.
There are also several small features which can not be
implemented in rte_flow. This patch re-implemented these
features as private API.
Two APIs are added:
rte_pmd_ixgbe_get_fdir_info.
rte_pmd_ixgbe_get_fdir_stats.

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
Acked-by: Jeff Guo <jia.guo@intel.com>
---
 doc/guides/rel_notes/release_20_08.rst      |  6 ++++
 drivers/net/ixgbe/ixgbe_ethdev.h            |  4 +++
 drivers/net/ixgbe/ixgbe_fdir.c              |  8 ++---
 drivers/net/ixgbe/rte_pmd_ixgbe.c           | 33 +++++++++++++++++++++
 drivers/net/ixgbe/rte_pmd_ixgbe.h           | 33 +++++++++++++++++++++
 drivers/net/ixgbe/rte_pmd_ixgbe_version.map |  2 ++
 6 files changed, 80 insertions(+), 6 deletions(-)

diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst
index 93a793299..0eec5b08a 100644
--- a/doc/guides/rel_notes/release_20_08.rst
+++ b/doc/guides/rel_notes/release_20_08.rst
@@ -104,6 +104,12 @@ New Features
   * Re-implemented get_fdir_info and get_fdir_stat in private API.
   * Re-implemented set_gre_key_len in private API.
 
+* **Updated the Intel ixgbe driver.**
+
+  Updated the Intel ixgbe driver with new features and improvements, including:
+
+  * Re-implemented get_fdir_info and get_fdir_stat in private API.
+
 * **Updated the Intel ice driver.**
 
   Updated the Intel ice driver with new features and improvements, including:
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h
index 3d78b2ee2..9bdef87fb 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.h
+++ b/drivers/net/ixgbe/ixgbe_ethdev.h
@@ -697,6 +697,10 @@ int ixgbe_fdir_set_flexbytes_offset(struct rte_eth_dev *dev,
 int ixgbe_fdir_filter_program(struct rte_eth_dev *dev,
 			      struct ixgbe_fdir_rule *rule,
 			      bool del, bool update);
+void ixgbe_fdir_info_get(struct rte_eth_dev *dev,
+			 struct rte_eth_fdir_info *fdir_info);
+void ixgbe_fdir_stats_get(struct rte_eth_dev *dev,
+			  struct rte_eth_fdir_stats *fdir_stats);
 
 void ixgbe_configure_dcb(struct rte_eth_dev *dev);
 
diff --git a/drivers/net/ixgbe/ixgbe_fdir.c b/drivers/net/ixgbe/ixgbe_fdir.c
index 166dae1e0..6faaa8f06 100644
--- a/drivers/net/ixgbe/ixgbe_fdir.c
+++ b/drivers/net/ixgbe/ixgbe_fdir.c
@@ -109,10 +109,6 @@ static int ixgbe_add_del_fdir_filter(struct rte_eth_dev *dev,
 			      bool del,
 			      bool update);
 static int ixgbe_fdir_flush(struct rte_eth_dev *dev);
-static void ixgbe_fdir_info_get(struct rte_eth_dev *dev,
-			struct rte_eth_fdir_info *fdir_info);
-static void ixgbe_fdir_stats_get(struct rte_eth_dev *dev,
-			struct rte_eth_fdir_stats *fdir_stats);
 
 /**
  * This function is based on ixgbe_fdir_enable_82599() in base/ixgbe_82599.c.
@@ -1414,7 +1410,7 @@ ixgbe_fdir_flush(struct rte_eth_dev *dev)
 }
 
 #define FDIRENTRIES_NUM_SHIFT 10
-static void
+void
 ixgbe_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir_info)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -1473,7 +1469,7 @@ ixgbe_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir_info
 			(uint8_t)((info->mask.flex_bytes_mask & 0xFF00) >> 8);
 }
 
-static void
+void
 ixgbe_fdir_stats_get(struct rte_eth_dev *dev, struct rte_eth_fdir_stats *fdir_stats)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.c b/drivers/net/ixgbe/rte_pmd_ixgbe.c
index 9bff557f9..d2f708242 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe.c
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe.c
@@ -1139,3 +1139,36 @@ rte_pmd_ixgbe_mdio_unlocked_write(uint16_t port, uint32_t reg_addr,
 	}
 	return 0;
 }
+
+int
+rte_pmd_ixgbe_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_ixgbe_supported(dev))
+		return -ENOTSUP;
+
+	ixgbe_fdir_info_get(dev, fdir_info);
+
+	return 0;
+}
+
+int
+rte_pmd_ixgbe_get_fdir_stats(uint16_t port,
+			     struct rte_eth_fdir_stats *fdir_stats)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	if (!is_ixgbe_supported(dev))
+		return -ENOTSUP;
+
+	ixgbe_fdir_stats_get(dev, fdir_stats);
+
+	return 0;
+}
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.h b/drivers/net/ixgbe/rte_pmd_ixgbe.h
index f62fd761d..8b6bb99a5 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe.h
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe.h
@@ -726,4 +726,37 @@ enum {
 __rte_experimental
 int
 rte_pmd_ixgbe_upd_fctrl_sbp(uint16_t port, int enable);
+
+/**
+ * Get port fdir info
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param fdir_info
+ *   The fdir info of the port
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+__rte_experimental
+int
+rte_pmd_ixgbe_get_fdir_info(uint16_t port, struct rte_eth_fdir_info *fdir_info);
+
+/**
+ * Get port fdir status
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param fdir_stats
+ *   The fdir status of the port
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-ENOTSUP) if operation not supported.
+ */
+__rte_experimental
+int
+rte_pmd_ixgbe_get_fdir_stats(uint16_t port,
+			     struct rte_eth_fdir_stats *fdir_stats);
 #endif /* _PMD_IXGBE_H_ */
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
index 21534dbc3..911f8083f 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
@@ -38,6 +38,8 @@ DPDK_20.0 {
 EXPERIMENTAL {
 	global:
 
+	rte_pmd_ixgbe_get_fdir_info;
+	rte_pmd_ixgbe_get_fdir_stats;
 	rte_pmd_ixgbe_mdio_lock;
 	rte_pmd_ixgbe_mdio_unlock;
 	rte_pmd_ixgbe_mdio_unlocked_read;
-- 
2.17.1


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

* [dpdk-dev] [PATCH v4 3/5] app/testpmd: re-implement commands by using private API
  2020-07-08  1:18 ` [dpdk-dev] [PATCH v4 0/5] re-implement legacy filter functions by private API Chenxu Di
  2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 1/5] net/i40e: add private APIs Chenxu Di
  2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 2/5] net/ixgbe: " Chenxu Di
@ 2020-07-08  1:18   ` Chenxu Di
  2020-07-08  3:31     ` Yang, Qiming
  2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 4/5] net/i40e: enable flow query RSS Chenxu Di
                     ` (2 subsequent siblings)
  5 siblings, 1 reply; 47+ messages in thread
From: Chenxu Di @ 2020-07-08  1:18 UTC (permalink / raw)
  To: dev; +Cc: Yang Qiming, Chenxu Di

The legacy filter API will be superseded. This patch use
private api to change the implementation of commands
global_config <port_id> gre-key-len <key_len> and
show port fdir <port_id>

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 app/test-pmd/cmdline.c |  4 +++
 app/test-pmd/config.c  | 57 ++++++++++++++++++++++++++++++++++--------
 2 files changed, 50 insertions(+), 11 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 81c87c8c3..39ad93838 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -9291,6 +9291,10 @@ cmd_global_config_parsed(void *parsed_result,
 	conf.cfg.gre_key_len = res->len;
 	ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE,
 				      RTE_ETH_FILTER_SET, &conf);
+#ifdef RTE_LIBRTE_I40E_PMD
+	if (ret == -ENOTSUP)
+		ret = rte_pmd_i40e_set_gre_key_len(res->port_id, res->len);
+#endif
 	if (ret != 0)
 		printf("Global config error\n");
 }
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 75013100f..cf14b584f 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -3746,30 +3746,65 @@ print_fdir_flow_type(uint32_t flow_types_mask)
 	printf("\n");
 }
 
+static int
+get_fdir_info(portid_t port_id, struct rte_eth_fdir_info *fdir_info,
+		    struct rte_eth_fdir_stats *fdir_stat)
+{
+	int ret;
+
+	ret = rte_eth_dev_filter_supported(port_id, RTE_ETH_FILTER_FDIR);
+	if (!ret) {
+		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
+			       RTE_ETH_FILTER_INFO, fdir_info);
+		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
+			       RTE_ETH_FILTER_STATS, fdir_stat);
+		return 0;
+	}
+
+#ifdef RTE_LIBRTE_I40E_PMD
+	if (ret == -ENOTSUP) {
+		ret = rte_pmd_i40e_get_fdir_info(port_id, fdir_info);
+		if (!ret)
+			ret = rte_pmd_i40e_get_fdir_stats(port_id, fdir_stat);
+	}
+#endif
+#ifdef RTE_LIBRTE_IXGBE_PMD
+	if (ret == -ENOTSUP) {
+		ret = rte_pmd_ixgbe_get_fdir_info(port_id, fdir_info);
+		if (!ret)
+			ret = rte_pmd_ixgbe_get_fdir_stats(port_id, fdir_stat);
+	}
+#endif
+	switch (ret) {
+	case 0:
+		break;
+	case -ENOTSUP:
+		printf("\n FDIR is not supported on port %-2d\n",
+			port_id);
+		break;
+	default:
+		printf("programming error: (%s)\n", strerror(-ret));
+		break;
+	}
+	return ret;
+}
+
 void
 fdir_get_infos(portid_t port_id)
 {
 	struct rte_eth_fdir_stats fdir_stat;
 	struct rte_eth_fdir_info fdir_info;
-	int ret;
 
 	static const char *fdir_stats_border = "########################";
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
 		return;
-	ret = rte_eth_dev_filter_supported(port_id, RTE_ETH_FILTER_FDIR);
-	if (ret < 0) {
-		printf("\n FDIR is not supported on port %-2d\n",
-			port_id);
-		return;
-	}
 
 	memset(&fdir_info, 0, sizeof(fdir_info));
-	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
-			       RTE_ETH_FILTER_INFO, &fdir_info);
 	memset(&fdir_stat, 0, sizeof(fdir_stat));
-	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
-			       RTE_ETH_FILTER_STATS, &fdir_stat);
+	if (get_fdir_info(port_id, &fdir_info, &fdir_stat))
+		return;
+
 	printf("\n  %s FDIR infos for port %-2d     %s\n",
 	       fdir_stats_border, port_id, fdir_stats_border);
 	printf("  MODE: ");
-- 
2.17.1


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

* [dpdk-dev] [PATCH v4 4/5] net/i40e: enable flow query RSS
  2020-07-08  1:18 ` [dpdk-dev] [PATCH v4 0/5] re-implement legacy filter functions by private API Chenxu Di
                     ` (2 preceding siblings ...)
  2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
@ 2020-07-08  1:18   ` Chenxu Di
  2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 5/5] app/testpmd: support query RSS config in flow query Chenxu Di
  2020-07-08  9:05   ` [dpdk-dev] [PATCH v4 0/5] re-implement legacy filter functions by private API Zhang, Qi Z
  5 siblings, 0 replies; 47+ messages in thread
From: Chenxu Di @ 2020-07-08  1:18 UTC (permalink / raw)
  To: dev; +Cc: Yang Qiming, Chenxu Di

This patch enables flow query function to get the
configuration of the specified rule.

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
Acked-by: Jeff Guo <jia.guo@intel.com>
---
 doc/guides/rel_notes/release_20_08.rst |  1 +
 drivers/net/i40e/i40e_flow.c           | 49 ++++++++++++++++++++++++++
 2 files changed, 50 insertions(+)

diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst
index 0eec5b08a..18d653b3d 100644
--- a/doc/guides/rel_notes/release_20_08.rst
+++ b/doc/guides/rel_notes/release_20_08.rst
@@ -103,6 +103,7 @@ New Features
 
   * Re-implemented get_fdir_info and get_fdir_stat in private API.
   * Re-implemented set_gre_key_len in private API.
+  * Added support for flow query RSS.
 
 * **Updated the Intel ixgbe driver.**
 
diff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c
index 8f8df6fae..4186a5df2 100644
--- a/drivers/net/i40e/i40e_flow.c
+++ b/drivers/net/i40e/i40e_flow.c
@@ -43,6 +43,10 @@ static int i40e_flow_destroy(struct rte_eth_dev *dev,
 			     struct rte_flow_error *error);
 static int i40e_flow_flush(struct rte_eth_dev *dev,
 			   struct rte_flow_error *error);
+static int i40e_flow_query(struct rte_eth_dev *dev,
+			   struct rte_flow *flow,
+			   const struct rte_flow_action *actions,
+			   void *data, struct rte_flow_error *error);
 static int
 i40e_flow_parse_ethertype_pattern(struct rte_eth_dev *dev,
 				  const struct rte_flow_item *pattern,
@@ -129,6 +133,7 @@ const struct rte_flow_ops i40e_flow_ops = {
 	.create = i40e_flow_create,
 	.destroy = i40e_flow_destroy,
 	.flush = i40e_flow_flush,
+	.query = i40e_flow_query,
 };
 
 static union i40e_filter_t cons_filter;
@@ -5462,3 +5467,47 @@ i40e_flow_flush_rss_filter(struct rte_eth_dev *dev)
 
 	return ret;
 }
+
+static int
+i40e_flow_query(struct rte_eth_dev *dev __rte_unused,
+		struct rte_flow *flow,
+		const struct rte_flow_action *actions,
+		void *data, struct rte_flow_error *error)
+{
+	struct i40e_rss_filter *rss_rule = (struct i40e_rss_filter *)flow->rule;
+	enum rte_filter_type filter_type = flow->filter_type;
+	struct rte_flow_action_rss *rss_conf = data;
+
+	if (!rss_rule) {
+		rte_flow_error_set(error, EINVAL,
+				   RTE_FLOW_ERROR_TYPE_HANDLE,
+				   NULL, "Invalid rule");
+		return -rte_errno;
+	}
+
+	for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
+		switch (actions->type) {
+		case RTE_FLOW_ACTION_TYPE_VOID:
+			break;
+		case RTE_FLOW_ACTION_TYPE_RSS:
+			if (filter_type != RTE_ETH_FILTER_HASH) {
+				rte_flow_error_set(error, ENOTSUP,
+						   RTE_FLOW_ERROR_TYPE_ACTION,
+						   actions,
+						   "action not supported");
+				return -rte_errno;
+			}
+			rte_memcpy(rss_conf,
+				   &rss_rule->rss_filter_info.conf,
+				   sizeof(struct rte_flow_action_rss));
+			break;
+		default:
+			return rte_flow_error_set(error, ENOTSUP,
+						  RTE_FLOW_ERROR_TYPE_ACTION,
+						  actions,
+						  "action not supported");
+		}
+	}
+
+	return 0;
+}
-- 
2.17.1


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

* [dpdk-dev] [PATCH v4 5/5] app/testpmd: support query RSS config in flow query
  2020-07-08  1:18 ` [dpdk-dev] [PATCH v4 0/5] re-implement legacy filter functions by private API Chenxu Di
                     ` (3 preceding siblings ...)
  2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 4/5] net/i40e: enable flow query RSS Chenxu Di
@ 2020-07-08  1:18   ` Chenxu Di
  2020-07-08  3:32     ` Yang, Qiming
  2020-07-08  9:05   ` [dpdk-dev] [PATCH v4 0/5] re-implement legacy filter functions by private API Zhang, Qi Z
  5 siblings, 1 reply; 47+ messages in thread
From: Chenxu Di @ 2020-07-08  1:18 UTC (permalink / raw)
  To: dev; +Cc: Yang Qiming, Chenxu Di

This patch support RSS action in flow query.
It can display the RSS configuration of the specified rule.

For example:
we can create an RSS rule by command "flow create 0 ingress
pattern eth / ipv4 / tcp / end actions rss types ipv4-tcp
l3-src-only l4-dst-only end queues end func symmetric_toeplitz
 / end" and then query it "flow query 0 0 rss"
the log will be follow
RSS:
 queues: none
 function: symmetric_toeplitz
 types:
  ipv4-tcp
  l3-src-only
  l4-dst-only

Signed-off-by: Chenxu Di <chenxux.di@intel.com>
---
 app/test-pmd/config.c | 55 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index cf14b584f..53a9b97d6 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -1395,6 +1395,56 @@ port_flow_complain(struct rte_flow_error *error)
 	return -err;
 }
 
+static void
+rss_config_display(struct rte_flow_action_rss *rss_conf)
+{
+	uint8_t i;
+
+	if (rss_conf == NULL) {
+		printf("Invalid rule\n");
+		return;
+	}
+
+	printf("RSS:\n"
+	       " queues: ");
+	if (rss_conf->queue_num == 0)
+		printf("none\n");
+	for (i = 0; i < rss_conf->queue_num; i++)
+		printf("%d\n", rss_conf->queue[i]);
+
+	printf(" function: ");
+	switch (rss_conf->func) {
+	case RTE_ETH_HASH_FUNCTION_DEFAULT:
+		printf("default\n");
+		break;
+	case RTE_ETH_HASH_FUNCTION_TOEPLITZ:
+		printf("toeplitz\n");
+		break;
+	case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR:
+		printf("simple_xor\n");
+		break;
+	case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ:
+		printf("symmetric_toeplitz\n");
+		break;
+	default:
+		printf("Unknown function\n");
+		return;
+	}
+
+	printf(" types:\n");
+	if (rss_conf->types == 0) {
+		printf("  none\n");
+		return;
+	}
+	for (i = 0; rss_type_table[i].str; i++) {
+		if ((rss_conf->types &
+		    rss_type_table[i].rss_type) ==
+		    rss_type_table[i].rss_type &&
+		    rss_type_table[i].rss_type != 0)
+			printf("  %s\n", rss_type_table[i].str);
+	}
+}
+
 /** Validate flow rule. */
 int
 port_flow_validate(portid_t port_id,
@@ -1581,6 +1631,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
 	const char *name;
 	union {
 		struct rte_flow_query_count count;
+		struct rte_flow_action_rss rss_conf;
 	} query;
 	int ret;
 
@@ -1602,6 +1653,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
 		return port_flow_complain(&error);
 	switch (action->type) {
 	case RTE_FLOW_ACTION_TYPE_COUNT:
+	case RTE_FLOW_ACTION_TYPE_RSS:
 		break;
 	default:
 		printf("Cannot query action type %d (%s)\n",
@@ -1626,6 +1678,9 @@ port_flow_query(portid_t port_id, uint32_t rule,
 		       query.count.hits,
 		       query.count.bytes);
 		break;
+	case RTE_FLOW_ACTION_TYPE_RSS:
+		rss_config_display(&query.rss_conf);
+		break;
 	default:
 		printf("Cannot display result for action type %d (%s)\n",
 		       action->type, name);
-- 
2.17.1


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

* Re: [dpdk-dev] [PATCH v4 3/5] app/testpmd: re-implement commands by using private API
  2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
@ 2020-07-08  3:31     ` Yang, Qiming
  0 siblings, 0 replies; 47+ messages in thread
From: Yang, Qiming @ 2020-07-08  3:31 UTC (permalink / raw)
  To: Di, ChenxuX, dev

Acked-by: Qiming Yang <qiming.yang@intel.com>

> -----Original Message-----
> From: Di, ChenxuX <chenxux.di@intel.com>
> Sent: Wednesday, July 8, 2020 09:19
> To: dev@dpdk.org
> Cc: Yang, Qiming <qiming.yang@intel.com>; Di, ChenxuX
> <chenxux.di@intel.com>
> Subject: [PATCH v4 3/5] app/testpmd: re-implement commands by using
> private API
> 
> The legacy filter API will be superseded. This patch use private api to change
> the implementation of commands global_config <port_id> gre-key-len
> <key_len> and show port fdir <port_id>
> 
> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>  app/test-pmd/cmdline.c |  4 +++
>  app/test-pmd/config.c  | 57 ++++++++++++++++++++++++++++++++++----
> ----
>  2 files changed, 50 insertions(+), 11 deletions(-)
> 
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
> 81c87c8c3..39ad93838 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -9291,6 +9291,10 @@ cmd_global_config_parsed(void *parsed_result,
>  	conf.cfg.gre_key_len = res->len;
>  	ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE,
>  				      RTE_ETH_FILTER_SET, &conf);
> +#ifdef RTE_LIBRTE_I40E_PMD
> +	if (ret == -ENOTSUP)
> +		ret = rte_pmd_i40e_set_gre_key_len(res->port_id, res-
> >len); #endif
>  	if (ret != 0)
>  		printf("Global config error\n");
>  }
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index
> 75013100f..cf14b584f 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -3746,30 +3746,65 @@ print_fdir_flow_type(uint32_t flow_types_mask)
>  	printf("\n");
>  }
> 
> +static int
> +get_fdir_info(portid_t port_id, struct rte_eth_fdir_info *fdir_info,
> +		    struct rte_eth_fdir_stats *fdir_stat) {
> +	int ret;
> +
> +	ret = rte_eth_dev_filter_supported(port_id, RTE_ETH_FILTER_FDIR);
> +	if (!ret) {
> +		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> +			       RTE_ETH_FILTER_INFO, fdir_info);
> +		rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> +			       RTE_ETH_FILTER_STATS, fdir_stat);
> +		return 0;
> +	}
> +
> +#ifdef RTE_LIBRTE_I40E_PMD
> +	if (ret == -ENOTSUP) {
> +		ret = rte_pmd_i40e_get_fdir_info(port_id, fdir_info);
> +		if (!ret)
> +			ret = rte_pmd_i40e_get_fdir_stats(port_id,
> fdir_stat);
> +	}
> +#endif
> +#ifdef RTE_LIBRTE_IXGBE_PMD
> +	if (ret == -ENOTSUP) {
> +		ret = rte_pmd_ixgbe_get_fdir_info(port_id, fdir_info);
> +		if (!ret)
> +			ret = rte_pmd_ixgbe_get_fdir_stats(port_id,
> fdir_stat);
> +	}
> +#endif
> +	switch (ret) {
> +	case 0:
> +		break;
> +	case -ENOTSUP:
> +		printf("\n FDIR is not supported on port %-2d\n",
> +			port_id);
> +		break;
> +	default:
> +		printf("programming error: (%s)\n", strerror(-ret));
> +		break;
> +	}
> +	return ret;
> +}
> +
>  void
>  fdir_get_infos(portid_t port_id)
>  {
>  	struct rte_eth_fdir_stats fdir_stat;
>  	struct rte_eth_fdir_info fdir_info;
> -	int ret;
> 
>  	static const char *fdir_stats_border =
> "########################";
> 
>  	if (port_id_is_invalid(port_id, ENABLED_WARN))
>  		return;
> -	ret = rte_eth_dev_filter_supported(port_id, RTE_ETH_FILTER_FDIR);
> -	if (ret < 0) {
> -		printf("\n FDIR is not supported on port %-2d\n",
> -			port_id);
> -		return;
> -	}
> 
>  	memset(&fdir_info, 0, sizeof(fdir_info));
> -	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> -			       RTE_ETH_FILTER_INFO, &fdir_info);
>  	memset(&fdir_stat, 0, sizeof(fdir_stat));
> -	rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
> -			       RTE_ETH_FILTER_STATS, &fdir_stat);
> +	if (get_fdir_info(port_id, &fdir_info, &fdir_stat))
> +		return;
> +
>  	printf("\n  %s FDIR infos for port %-2d     %s\n",
>  	       fdir_stats_border, port_id, fdir_stats_border);
>  	printf("  MODE: ");
> --
> 2.17.1


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

* Re: [dpdk-dev] [PATCH v4 5/5] app/testpmd: support query RSS config in flow query
  2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 5/5] app/testpmd: support query RSS config in flow query Chenxu Di
@ 2020-07-08  3:32     ` Yang, Qiming
  0 siblings, 0 replies; 47+ messages in thread
From: Yang, Qiming @ 2020-07-08  3:32 UTC (permalink / raw)
  To: Di, ChenxuX, dev

Acke-by: Qiming Yang <qiming.yang@intel.com>

> -----Original Message-----
> From: Di, ChenxuX <chenxux.di@intel.com>
> Sent: Wednesday, July 8, 2020 09:19
> To: dev@dpdk.org
> Cc: Yang, Qiming <qiming.yang@intel.com>; Di, ChenxuX
> <chenxux.di@intel.com>
> Subject: [PATCH v4 5/5] app/testpmd: support query RSS config in flow query
> 
> This patch support RSS action in flow query.
> It can display the RSS configuration of the specified rule.
> 
> For example:
> we can create an RSS rule by command "flow create 0 ingress pattern eth /
> ipv4 / tcp / end actions rss types ipv4-tcp l3-src-only l4-dst-only end queues
> end func symmetric_toeplitz  / end" and then query it "flow query 0 0 rss"
> the log will be follow
> RSS:
>  queues: none
>  function: symmetric_toeplitz
>  types:
>   ipv4-tcp
>   l3-src-only
>   l4-dst-only
> 
> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
> ---
>  app/test-pmd/config.c | 55
> +++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 55 insertions(+)
> 
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index
> cf14b584f..53a9b97d6 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -1395,6 +1395,56 @@ port_flow_complain(struct rte_flow_error *error)
>  	return -err;
>  }
> 
> +static void
> +rss_config_display(struct rte_flow_action_rss *rss_conf) {
> +	uint8_t i;
> +
> +	if (rss_conf == NULL) {
> +		printf("Invalid rule\n");
> +		return;
> +	}
> +
> +	printf("RSS:\n"
> +	       " queues: ");
> +	if (rss_conf->queue_num == 0)
> +		printf("none\n");
> +	for (i = 0; i < rss_conf->queue_num; i++)
> +		printf("%d\n", rss_conf->queue[i]);
> +
> +	printf(" function: ");
> +	switch (rss_conf->func) {
> +	case RTE_ETH_HASH_FUNCTION_DEFAULT:
> +		printf("default\n");
> +		break;
> +	case RTE_ETH_HASH_FUNCTION_TOEPLITZ:
> +		printf("toeplitz\n");
> +		break;
> +	case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR:
> +		printf("simple_xor\n");
> +		break;
> +	case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ:
> +		printf("symmetric_toeplitz\n");
> +		break;
> +	default:
> +		printf("Unknown function\n");
> +		return;
> +	}
> +
> +	printf(" types:\n");
> +	if (rss_conf->types == 0) {
> +		printf("  none\n");
> +		return;
> +	}
> +	for (i = 0; rss_type_table[i].str; i++) {
> +		if ((rss_conf->types &
> +		    rss_type_table[i].rss_type) ==
> +		    rss_type_table[i].rss_type &&
> +		    rss_type_table[i].rss_type != 0)
> +			printf("  %s\n", rss_type_table[i].str);
> +	}
> +}
> +
>  /** Validate flow rule. */
>  int
>  port_flow_validate(portid_t port_id,
> @@ -1581,6 +1631,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
>  	const char *name;
>  	union {
>  		struct rte_flow_query_count count;
> +		struct rte_flow_action_rss rss_conf;
>  	} query;
>  	int ret;
> 
> @@ -1602,6 +1653,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
>  		return port_flow_complain(&error);
>  	switch (action->type) {
>  	case RTE_FLOW_ACTION_TYPE_COUNT:
> +	case RTE_FLOW_ACTION_TYPE_RSS:
>  		break;
>  	default:
>  		printf("Cannot query action type %d (%s)\n", @@ -1626,6
> +1678,9 @@ port_flow_query(portid_t port_id, uint32_t rule,
>  		       query.count.hits,
>  		       query.count.bytes);
>  		break;
> +	case RTE_FLOW_ACTION_TYPE_RSS:
> +		rss_config_display(&query.rss_conf);
> +		break;
>  	default:
>  		printf("Cannot display result for action type %d (%s)\n",
>  		       action->type, name);
> --
> 2.17.1


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

* Re: [dpdk-dev] [PATCH v4 0/5] re-implement legacy filter functions by private API
  2020-07-08  1:18 ` [dpdk-dev] [PATCH v4 0/5] re-implement legacy filter functions by private API Chenxu Di
                     ` (4 preceding siblings ...)
  2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 5/5] app/testpmd: support query RSS config in flow query Chenxu Di
@ 2020-07-08  9:05   ` Zhang, Qi Z
  5 siblings, 0 replies; 47+ messages in thread
From: Zhang, Qi Z @ 2020-07-08  9:05 UTC (permalink / raw)
  To: Di, ChenxuX, dev; +Cc: Yang, Qiming, Di, ChenxuX



> -----Original Message-----
> From: dev <dev-bounces@dpdk.org> On Behalf Of Chenxu Di
> Sent: Wednesday, July 8, 2020 9:19 AM
> To: dev@dpdk.org
> Cc: Yang, Qiming <qiming.yang@intel.com>; Di, ChenxuX
> <chenxux.di@intel.com>
> Subject: [dpdk-dev] [PATCH v4 0/5] re-implement legacy filter functions by
> private API
> 
> The legacy filter API will be superseded by rte_flow.
> There are also several small features which can not be implemented in
> rte_flow.
> This patch re-implemented features get_fdir_info, get_fdir_stat and
> set_gre_key_len as private API.
> This patch also enable RSS action in flow query.
> 
> v4:
> -updated code in testpmd
> v3:
> -updated the init of ret in testpmd
> -updated the log style
> v2:
> -fixed the __rte_experimental flag
> 
> Chenxu Di (5):
>   net/i40e: add private APIs
>   net/ixgbe: add private APIs
>   app/testpmd: re-implement commands by using private API
>   net/i40e: enable flow query RSS
>   app/testpmd: support query RSS config in flow query
> 
>  app/test-pmd/cmdline.c                      |   4 +
>  app/test-pmd/config.c                       | 112
> ++++++++++++++++++--
>  doc/guides/rel_notes/release_20_08.rst      |  14 +++
>  drivers/net/i40e/i40e_ethdev.c              |   2 +-
>  drivers/net/i40e/i40e_ethdev.h              |   5 +
>  drivers/net/i40e/i40e_fdir.c                |   4 +-
>  drivers/net/i40e/i40e_flow.c                |  49 +++++++++
>  drivers/net/i40e/rte_pmd_i40e.c             |  51 +++++++++
>  drivers/net/i40e/rte_pmd_i40e.h             |  49 +++++++++
>  drivers/net/i40e/rte_pmd_i40e_version.map   |   3 +
>  drivers/net/ixgbe/ixgbe_ethdev.h            |   4 +
>  drivers/net/ixgbe/ixgbe_fdir.c              |   8 +-
>  drivers/net/ixgbe/rte_pmd_ixgbe.c           |  33 ++++++
>  drivers/net/ixgbe/rte_pmd_ixgbe.h           |  33 ++++++
>  drivers/net/ixgbe/rte_pmd_ixgbe_version.map |   2 +
>  15 files changed, 353 insertions(+), 20 deletions(-)
> 
> --
> 2.17.1

Applied to dpdk-next-net-intel.

Thanks
Qi


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

end of thread, back to index

Thread overview: 47+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-11  6:01 [dpdk-dev] [PATCH 0/5] re-implement legacy filter functions by private API Chenxu Di
2020-06-11  6:01 ` [dpdk-dev] [PATCH 1/5] net/i40e: add private APIs Chenxu Di
2020-06-11  6:01 ` [dpdk-dev] [PATCH 2/5] net/ixgbe: " Chenxu Di
2020-06-11  6:01 ` [dpdk-dev] [PATCH 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
2020-06-16 20:12   ` Kevin Traynor
2020-06-17 10:12     ` Di, ChenxuX
2020-06-30  6:20       ` Jeff Guo
2020-06-11  6:01 ` [dpdk-dev] [PATCH 4/5] net/i40e: enable flow query RSS Chenxu Di
2020-06-11  6:01 ` [dpdk-dev] [PATCH 5/5] app/testpmd: support query RSS config in flow query Chenxu Di
2020-06-15  2:18 ` [dpdk-dev] [PATCH v2 0/5] re-implement legacy filter functions by private API Chenxu Di
2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 1/5] net/i40e: add private APIs Chenxu Di
2020-06-30  4:22     ` Jeff Guo
2020-06-30 10:24     ` Yang, Qiming
2020-07-01  1:30       ` Di, ChenxuX
2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 2/5] net/ixgbe: " Chenxu Di
2020-06-30  5:25     ` Jeff Guo
2020-06-30 10:25     ` Yang, Qiming
2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
2020-06-30 10:34     ` Yang, Qiming
2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 4/5] net/i40e: enable flow query RSS Chenxu Di
2020-06-30  6:48     ` Jeff Guo
2020-06-30 10:27     ` Yang, Qiming
2020-07-01  1:15       ` Di, ChenxuX
2020-06-15  2:18   ` [dpdk-dev] [PATCH v2 5/5] app/testpmd: support query RSS config in flow query Chenxu Di
2020-06-30  6:37     ` Jeff Guo
2020-06-30 10:40     ` Yang, Qiming
2020-07-01  1:25       ` Di, ChenxuX
2020-07-01  8:24 ` [dpdk-dev] [PATCH v3 0/5] re-implement legacy filter functions by private API Chenxu Di
2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 1/5] net/i40e: add private APIs Chenxu Di
2020-07-03  5:44     ` Jeff Guo
2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 2/5] net/ixgbe: " Chenxu Di
2020-07-03  5:44     ` Jeff Guo
2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
2020-07-03  5:54     ` Jeff Guo
2020-07-06  9:10     ` Yang, Qiming
2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 4/5] net/i40e: enable flow query RSS Chenxu Di
2020-07-03  5:57     ` Jeff Guo
2020-07-01  8:24   ` [dpdk-dev] [PATCH v3 5/5] app/testpmd: support query RSS config in flow query Chenxu Di
2020-07-08  1:18 ` [dpdk-dev] [PATCH v4 0/5] re-implement legacy filter functions by private API Chenxu Di
2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 1/5] net/i40e: add private APIs Chenxu Di
2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 2/5] net/ixgbe: " Chenxu Di
2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 3/5] app/testpmd: re-implement commands by using private API Chenxu Di
2020-07-08  3:31     ` Yang, Qiming
2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 4/5] net/i40e: enable flow query RSS Chenxu Di
2020-07-08  1:18   ` [dpdk-dev] [PATCH v4 5/5] app/testpmd: support query RSS config in flow query Chenxu Di
2020-07-08  3:32     ` Yang, Qiming
2020-07-08  9:05   ` [dpdk-dev] [PATCH v4 0/5] re-implement legacy filter functions by private API Zhang, Qi Z

DPDK-dev Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/dpdk-dev/0 dpdk-dev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dpdk-dev dpdk-dev/ https://lore.kernel.org/dpdk-dev \
		dev@dpdk.org
	public-inbox-index dpdk-dev

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.dpdk.dev


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git