[v5,15/15] net/cnxk: add MACsec stats

Message ID 20230614130901.3245809-16-gakhil@marvell.com (mailing list archive)
State Accepted, archived
Delegated to: Jerin Jacob
Headers
Series net/cnxk: add MACsec support |

Checks

Context Check Description
ci/loongarch-compilation success Compilation OK
ci/checkpatch warning coding style issues
ci/loongarch-unit-testing success Unit Testing PASS
ci/Intel-compilation success Compilation OK
ci/intel-Testing success Testing PASS
ci/iol-broadcom-Functional success Functional Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS
ci/intel-Functional success Functional PASS
ci/iol-abi-testing success Testing PASS
ci/iol-aarch-unit-testing success Testing PASS
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-x86_64-compile-testing success Testing PASS
ci/iol-testing success Testing PASS
ci/iol-x86_64-unit-testing success Testing PASS
ci/iol-unit-testing success Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-aarch64-compile-testing success Testing PASS

Commit Message

Akhil Goyal June 14, 2023, 1:09 p.m. UTC
  Added support for MACsec SC/flow/session stats.

Signed-off-by: Akhil Goyal <gakhil@marvell.com>
---
 doc/guides/rel_notes/release_23_07.rst | 10 ++--
 drivers/net/cnxk/cn10k_ethdev_sec.c    | 11 +++--
 drivers/net/cnxk/cnxk_ethdev_mcs.c     | 64 ++++++++++++++++++++++++++
 drivers/net/cnxk/cnxk_ethdev_mcs.h     |  9 ++++
 4 files changed, 87 insertions(+), 7 deletions(-)
  

Comments

Jerin Jacob June 15, 2023, 7:03 a.m. UTC | #1
On Wed, Jun 14, 2023 at 6:41 PM Akhil Goyal <gakhil@marvell.com> wrote:
>
> Added support for MACsec SC/flow/session stats.
>
> Signed-off-by: Akhil Goyal <gakhil@marvell.com>


Series applied to dpdk-next-net-mrvl/for-next-net. Thanks

> ---
>  doc/guides/rel_notes/release_23_07.rst | 10 ++--
>  drivers/net/cnxk/cn10k_ethdev_sec.c    | 11 +++--
>  drivers/net/cnxk/cnxk_ethdev_mcs.c     | 64 ++++++++++++++++++++++++++
>  drivers/net/cnxk/cnxk_ethdev_mcs.h     |  9 ++++
>  4 files changed, 87 insertions(+), 7 deletions(-)
>
> diff --git a/doc/guides/rel_notes/release_23_07.rst b/doc/guides/rel_notes/release_23_07.rst
> index 915c37529a..d6af8c25a7 100644
> --- a/doc/guides/rel_notes/release_23_07.rst
> +++ b/doc/guides/rel_notes/release_23_07.rst
> @@ -139,6 +139,12 @@ New Features
>    for new capability registers, large passthrough BAR and some
>    performance enhancements for UPT.
>
> +* **Updated Marvell cnxk ethdev driver.**
> +
> +  * Extended ``RTE_FLOW_ACTION_TYPE_PORT_ID`` to redirect traffic across PF ports.
> +  * Added support for Inline MACsec processing using rte_security framework
> +    for CN103 platform.
> +
>  * **Added new algorithms to cryptodev.**
>
>    * Added asymmetric algorithm ShangMi 2 (SM2) along with prime field curve support.
> @@ -155,10 +161,6 @@ New Features
>    * Added support for SM3 hash operations.
>    * Added support for AES-CCM in cn9k and cn10k drivers.
>
> -* **Updated Marvell cnxk ethdev driver.**
> -
> -  * Extended ``RTE_FLOW_ACTION_TYPE_PORT_ID`` to redirect traffic across PF ports.
> -
>  * **Updated OpenSSL crypto driver.**
>
>    * Added SM2 algorithm support in asymmetric crypto operations.
> diff --git a/drivers/net/cnxk/cn10k_ethdev_sec.c b/drivers/net/cnxk/cn10k_ethdev_sec.c
> index f20e573338..b98fc9378e 100644
> --- a/drivers/net/cnxk/cn10k_ethdev_sec.c
> +++ b/drivers/net/cnxk/cn10k_ethdev_sec.c
> @@ -1058,12 +1058,17 @@ cn10k_eth_sec_session_stats_get(void *device, struct rte_security_session *sess,
>  {
>         struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)device;
>         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
> +       struct cnxk_macsec_sess *macsec_sess;
>         struct cnxk_eth_sec_sess *eth_sec;
>         int rc;
>
>         eth_sec = cnxk_eth_sec_sess_get_by_sess(dev, sess);
> -       if (eth_sec == NULL)
> +       if (eth_sec == NULL) {
> +               macsec_sess = cnxk_eth_macsec_sess_get_by_sess(dev, sess);
> +               if (macsec_sess)
> +                       return cnxk_eth_macsec_session_stats_get(dev, macsec_sess, stats);
>                 return -EINVAL;
> +       }
>
>         rc = roc_nix_inl_sa_sync(&dev->nix, eth_sec->sa, eth_sec->inb,
>                             ROC_NIX_INL_SA_OP_FLUSH);
> @@ -1107,6 +1112,6 @@ cn10k_eth_sec_ops_override(void)
>         cnxk_eth_sec_ops.capabilities_get = cn10k_eth_sec_capabilities_get;
>         cnxk_eth_sec_ops.session_update = cn10k_eth_sec_session_update;
>         cnxk_eth_sec_ops.session_stats_get = cn10k_eth_sec_session_stats_get;
> -       cnxk_eth_sec_ops.macsec_sc_stats_get = NULL;
> -       cnxk_eth_sec_ops.macsec_sa_stats_get = NULL;
> +       cnxk_eth_sec_ops.macsec_sc_stats_get = cnxk_eth_macsec_sc_stats_get;
> +       cnxk_eth_sec_ops.macsec_sa_stats_get = cnxk_eth_macsec_sa_stats_get;
>  }
> diff --git a/drivers/net/cnxk/cnxk_ethdev_mcs.c b/drivers/net/cnxk/cnxk_ethdev_mcs.c
> index 87bfcb8b4e..5264774394 100644
> --- a/drivers/net/cnxk/cnxk_ethdev_mcs.c
> +++ b/drivers/net/cnxk/cnxk_ethdev_mcs.c
> @@ -521,6 +521,70 @@ cnxk_mcs_flow_destroy(struct cnxk_eth_dev *dev, void *flow)
>         return ret;
>  }
>
> +int
> +cnxk_eth_macsec_sa_stats_get(void *device, uint16_t sa_id, enum rte_security_macsec_direction dir,
> +                            struct rte_security_macsec_sa_stats *stats)
> +{
> +       RTE_SET_USED(device);
> +       RTE_SET_USED(sa_id);
> +       RTE_SET_USED(dir);
> +       RTE_SET_USED(stats);
> +
> +       return 0;
> +}
> +
> +int
> +cnxk_eth_macsec_sc_stats_get(void *device, uint16_t sc_id, enum rte_security_macsec_direction dir,
> +                            struct rte_security_macsec_sc_stats *stats)
> +{
> +       struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)device;
> +       struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
> +       struct cnxk_mcs_dev *mcs_dev = dev->mcs_dev;
> +       struct roc_mcs_stats_req req = {0};
> +
> +       if (!roc_feature_nix_has_macsec())
> +               return -ENOTSUP;
> +
> +       req.id = sc_id;
> +       req.dir = (dir == RTE_SECURITY_MACSEC_DIR_RX) ? MCS_RX : MCS_TX;
> +
> +       return roc_mcs_sc_stats_get(mcs_dev->mdev, &req, (struct roc_mcs_sc_stats *)stats);
> +}
> +
> +int
> +cnxk_eth_macsec_session_stats_get(struct cnxk_eth_dev *dev, struct cnxk_macsec_sess *sess,
> +                                 struct rte_security_stats *stats)
> +{
> +       struct cnxk_mcs_dev *mcs_dev = dev->mcs_dev;
> +       struct roc_mcs_flowid_stats flow_stats = {0};
> +       struct roc_mcs_port_stats port_stats = {0};
> +       struct roc_mcs_stats_req req = {0};
> +
> +       if (!roc_feature_nix_has_macsec())
> +               return -ENOTSUP;
> +
> +       req.id = sess->flow_id;
> +       req.dir = sess->dir;
> +       roc_mcs_flowid_stats_get(mcs_dev->mdev, &req, &flow_stats);
> +       plt_nix_dbg("\n******* FLOW_ID IDX[%u] STATS dir: %u********\n", sess->flow_id, sess->dir);
> +       plt_nix_dbg("TX: tcam_hit_cnt: 0x%" PRIx64 "\n", flow_stats.tcam_hit_cnt);
> +
> +       req.id = mcs_dev->port_id;
> +       req.dir = sess->dir;
> +       roc_mcs_port_stats_get(mcs_dev->mdev, &req, &port_stats);
> +       plt_nix_dbg("\n********** PORT[0] STATS ****************\n");
> +       plt_nix_dbg("RX tcam_miss_cnt: 0x%" PRIx64 "\n", port_stats.tcam_miss_cnt);
> +       plt_nix_dbg("RX parser_err_cnt: 0x%" PRIx64 "\n", port_stats.parser_err_cnt);
> +       plt_nix_dbg("RX preempt_err_cnt: 0x%" PRIx64 "\n", port_stats.preempt_err_cnt);
> +       plt_nix_dbg("RX sectag_insert_err_cnt: 0x%" PRIx64 "\n", port_stats.sectag_insert_err_cnt);
> +
> +       req.id = sess->secy_id;
> +       req.dir = sess->dir;
> +
> +       return roc_mcs_secy_stats_get(mcs_dev->mdev, &req,
> +                                     (struct roc_mcs_secy_stats *)(&stats->macsec));
> +}
> +
>  static int
>  cnxk_mcs_event_cb(void *userdata, struct roc_mcs_event_desc *desc, void *cb_arg)
>  {
> diff --git a/drivers/net/cnxk/cnxk_ethdev_mcs.h b/drivers/net/cnxk/cnxk_ethdev_mcs.h
> index a9148cc374..131dab10c5 100644
> --- a/drivers/net/cnxk/cnxk_ethdev_mcs.h
> +++ b/drivers/net/cnxk/cnxk_ethdev_mcs.h
> @@ -100,6 +100,15 @@ int cnxk_eth_macsec_sa_destroy(void *device, uint16_t sa_id,
>  int cnxk_eth_macsec_sc_destroy(void *device, uint16_t sc_id,
>                                enum rte_security_macsec_direction dir);
>
> +int cnxk_eth_macsec_sa_stats_get(void *device, uint16_t sa_id,
> +                                enum rte_security_macsec_direction dir,
> +                                struct rte_security_macsec_sa_stats *stats);
> +int cnxk_eth_macsec_sc_stats_get(void *device, uint16_t sa_id,
> +                                enum rte_security_macsec_direction dir,
> +                                struct rte_security_macsec_sc_stats *stats);
> +int cnxk_eth_macsec_session_stats_get(struct cnxk_eth_dev *dev, struct cnxk_macsec_sess *sess,
> +                                     struct rte_security_stats *stats);
> +
>  int cnxk_eth_macsec_session_create(struct cnxk_eth_dev *dev, struct rte_security_session_conf *conf,
>                                    struct rte_security_session *sess);
>  int cnxk_eth_macsec_session_destroy(struct cnxk_eth_dev *dev, struct rte_security_session *sess);
> --
> 2.25.1
>
  

Patch

diff --git a/doc/guides/rel_notes/release_23_07.rst b/doc/guides/rel_notes/release_23_07.rst
index 915c37529a..d6af8c25a7 100644
--- a/doc/guides/rel_notes/release_23_07.rst
+++ b/doc/guides/rel_notes/release_23_07.rst
@@ -139,6 +139,12 @@  New Features
   for new capability registers, large passthrough BAR and some
   performance enhancements for UPT.
 
+* **Updated Marvell cnxk ethdev driver.**
+
+  * Extended ``RTE_FLOW_ACTION_TYPE_PORT_ID`` to redirect traffic across PF ports.
+  * Added support for Inline MACsec processing using rte_security framework
+    for CN103 platform.
+
 * **Added new algorithms to cryptodev.**
 
   * Added asymmetric algorithm ShangMi 2 (SM2) along with prime field curve support.
@@ -155,10 +161,6 @@  New Features
   * Added support for SM3 hash operations.
   * Added support for AES-CCM in cn9k and cn10k drivers.
 
-* **Updated Marvell cnxk ethdev driver.**
-
-  * Extended ``RTE_FLOW_ACTION_TYPE_PORT_ID`` to redirect traffic across PF ports.
-
 * **Updated OpenSSL crypto driver.**
 
   * Added SM2 algorithm support in asymmetric crypto operations.
diff --git a/drivers/net/cnxk/cn10k_ethdev_sec.c b/drivers/net/cnxk/cn10k_ethdev_sec.c
index f20e573338..b98fc9378e 100644
--- a/drivers/net/cnxk/cn10k_ethdev_sec.c
+++ b/drivers/net/cnxk/cn10k_ethdev_sec.c
@@ -1058,12 +1058,17 @@  cn10k_eth_sec_session_stats_get(void *device, struct rte_security_session *sess,
 {
 	struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)device;
 	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct cnxk_macsec_sess *macsec_sess;
 	struct cnxk_eth_sec_sess *eth_sec;
 	int rc;
 
 	eth_sec = cnxk_eth_sec_sess_get_by_sess(dev, sess);
-	if (eth_sec == NULL)
+	if (eth_sec == NULL) {
+		macsec_sess = cnxk_eth_macsec_sess_get_by_sess(dev, sess);
+		if (macsec_sess)
+			return cnxk_eth_macsec_session_stats_get(dev, macsec_sess, stats);
 		return -EINVAL;
+	}
 
 	rc = roc_nix_inl_sa_sync(&dev->nix, eth_sec->sa, eth_sec->inb,
 			    ROC_NIX_INL_SA_OP_FLUSH);
@@ -1107,6 +1112,6 @@  cn10k_eth_sec_ops_override(void)
 	cnxk_eth_sec_ops.capabilities_get = cn10k_eth_sec_capabilities_get;
 	cnxk_eth_sec_ops.session_update = cn10k_eth_sec_session_update;
 	cnxk_eth_sec_ops.session_stats_get = cn10k_eth_sec_session_stats_get;
-	cnxk_eth_sec_ops.macsec_sc_stats_get = NULL;
-	cnxk_eth_sec_ops.macsec_sa_stats_get = NULL;
+	cnxk_eth_sec_ops.macsec_sc_stats_get = cnxk_eth_macsec_sc_stats_get;
+	cnxk_eth_sec_ops.macsec_sa_stats_get = cnxk_eth_macsec_sa_stats_get;
 }
diff --git a/drivers/net/cnxk/cnxk_ethdev_mcs.c b/drivers/net/cnxk/cnxk_ethdev_mcs.c
index 87bfcb8b4e..5264774394 100644
--- a/drivers/net/cnxk/cnxk_ethdev_mcs.c
+++ b/drivers/net/cnxk/cnxk_ethdev_mcs.c
@@ -521,6 +521,70 @@  cnxk_mcs_flow_destroy(struct cnxk_eth_dev *dev, void *flow)
 	return ret;
 }
 
+int
+cnxk_eth_macsec_sa_stats_get(void *device, uint16_t sa_id, enum rte_security_macsec_direction dir,
+			     struct rte_security_macsec_sa_stats *stats)
+{
+	RTE_SET_USED(device);
+	RTE_SET_USED(sa_id);
+	RTE_SET_USED(dir);
+	RTE_SET_USED(stats);
+
+	return 0;
+}
+
+int
+cnxk_eth_macsec_sc_stats_get(void *device, uint16_t sc_id, enum rte_security_macsec_direction dir,
+			     struct rte_security_macsec_sc_stats *stats)
+{
+	struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)device;
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct cnxk_mcs_dev *mcs_dev = dev->mcs_dev;
+	struct roc_mcs_stats_req req = {0};
+
+	if (!roc_feature_nix_has_macsec())
+		return -ENOTSUP;
+
+	req.id = sc_id;
+	req.dir = (dir == RTE_SECURITY_MACSEC_DIR_RX) ? MCS_RX : MCS_TX;
+
+	return roc_mcs_sc_stats_get(mcs_dev->mdev, &req, (struct roc_mcs_sc_stats *)stats);
+}
+
+int
+cnxk_eth_macsec_session_stats_get(struct cnxk_eth_dev *dev, struct cnxk_macsec_sess *sess,
+				  struct rte_security_stats *stats)
+{
+	struct cnxk_mcs_dev *mcs_dev = dev->mcs_dev;
+	struct roc_mcs_flowid_stats flow_stats = {0};
+	struct roc_mcs_port_stats port_stats = {0};
+	struct roc_mcs_stats_req req = {0};
+
+	if (!roc_feature_nix_has_macsec())
+		return -ENOTSUP;
+
+	req.id = sess->flow_id;
+	req.dir = sess->dir;
+	roc_mcs_flowid_stats_get(mcs_dev->mdev, &req, &flow_stats);
+	plt_nix_dbg("\n******* FLOW_ID IDX[%u] STATS dir: %u********\n", sess->flow_id, sess->dir);
+	plt_nix_dbg("TX: tcam_hit_cnt: 0x%" PRIx64 "\n", flow_stats.tcam_hit_cnt);
+
+	req.id = mcs_dev->port_id;
+	req.dir = sess->dir;
+	roc_mcs_port_stats_get(mcs_dev->mdev, &req, &port_stats);
+	plt_nix_dbg("\n********** PORT[0] STATS ****************\n");
+	plt_nix_dbg("RX tcam_miss_cnt: 0x%" PRIx64 "\n", port_stats.tcam_miss_cnt);
+	plt_nix_dbg("RX parser_err_cnt: 0x%" PRIx64 "\n", port_stats.parser_err_cnt);
+	plt_nix_dbg("RX preempt_err_cnt: 0x%" PRIx64 "\n", port_stats.preempt_err_cnt);
+	plt_nix_dbg("RX sectag_insert_err_cnt: 0x%" PRIx64 "\n", port_stats.sectag_insert_err_cnt);
+
+	req.id = sess->secy_id;
+	req.dir = sess->dir;
+
+	return roc_mcs_secy_stats_get(mcs_dev->mdev, &req,
+				      (struct roc_mcs_secy_stats *)(&stats->macsec));
+}
+
 static int
 cnxk_mcs_event_cb(void *userdata, struct roc_mcs_event_desc *desc, void *cb_arg)
 {
diff --git a/drivers/net/cnxk/cnxk_ethdev_mcs.h b/drivers/net/cnxk/cnxk_ethdev_mcs.h
index a9148cc374..131dab10c5 100644
--- a/drivers/net/cnxk/cnxk_ethdev_mcs.h
+++ b/drivers/net/cnxk/cnxk_ethdev_mcs.h
@@ -100,6 +100,15 @@  int cnxk_eth_macsec_sa_destroy(void *device, uint16_t sa_id,
 int cnxk_eth_macsec_sc_destroy(void *device, uint16_t sc_id,
 			       enum rte_security_macsec_direction dir);
 
+int cnxk_eth_macsec_sa_stats_get(void *device, uint16_t sa_id,
+				 enum rte_security_macsec_direction dir,
+				 struct rte_security_macsec_sa_stats *stats);
+int cnxk_eth_macsec_sc_stats_get(void *device, uint16_t sa_id,
+				 enum rte_security_macsec_direction dir,
+				 struct rte_security_macsec_sc_stats *stats);
+int cnxk_eth_macsec_session_stats_get(struct cnxk_eth_dev *dev, struct cnxk_macsec_sess *sess,
+				      struct rte_security_stats *stats);
+
 int cnxk_eth_macsec_session_create(struct cnxk_eth_dev *dev, struct rte_security_session_conf *conf,
 				   struct rte_security_session *sess);
 int cnxk_eth_macsec_session_destroy(struct cnxk_eth_dev *dev, struct rte_security_session *sess);