Fixes and improvements in crypto cnxk
Subsystems (2)
cover Fixes and improvements in crypto cnxk
Add following features
- TLS record processing offload (TLS 1.2-1.3, DTLS 1.2)
- Rx inject to allow lookaside packets to be injected to ethdev Rx
- Use PDCP_CHAIN opcode instead of PDCP opcode for cipher-only and auth only cases
Aakash Sasidharan (1):
crypto/cnxk: enable digest gen for zero len input
Akhil Goyal (1):
common/cnxk: fix memory leak
Anoob Joseph (6):
crypto/cnxk: use common macro
crypto/cnxk: return microcode completion code common/cnxk: update opad-ipad gen to handle TLS common/cnxk: add TLS record contexts crypto/cnxk: separate IPsec from security common code crypto/cnxk: add PMD APIs for raw submission to CPT
Gowrishankar Muthukrishnan (1):
crypto/cnxk: fix ECDH pubkey verify in cn9k
Rahul Bhansali (2):
common/cnxk: add Rx inject configs
crypto/cnxk: Rx inject config update
Tejasree Kondoj (3):
crypto/cnxk: fallback to SG if headroom is not available crypto/cnxk: replace PDCP with PDCP chain opcode crypto/cnxk: add CPT SG mode debug
Vidya Sagar Velumuri (10):
crypto/cnxk: enable Rx inject in security lookaside crypto/cnxk: enable Rx inject for 103 crypto/cnxk: rename security caps as IPsec security caps crypto/cnxk: add TLS record session ops crypto/cnxk: add TLS record datapath handling crypto/cnxk: add TLS capability
crypto/cnxk: validate the combinations supported in TLS crypto/cnxk: use a single function for opad ipad crypto/cnxk: add support for TLS 1.3 crypto/cnxk: add TLS 1.3 capability
doc/api/doxy-api-index.md | 1 + doc/api/doxy-api.conf.in | 1 + doc/guides/cryptodevs/cnxk.rst | 12 + doc/guides/rel_notes/release_24_03.rst | 6 + drivers/common/cnxk/cnxk_security.c | 65 +- drivers/common/cnxk/cnxk_security.h | 15 +- drivers/common/cnxk/hw/cpt.h | 12 +- drivers/common/cnxk/roc_cpt.c | 14 +- drivers/common/cnxk/roc_cpt.h | 7 +- drivers/common/cnxk/roc_cpt_priv.h | 2 +- drivers/common/cnxk/roc_idev.c | 44 + drivers/common/cnxk/roc_idev.h | 5 + drivers/common/cnxk/roc_idev_priv.h | 6 + drivers/common/cnxk/roc_ie_ot.c | 14 +- drivers/common/cnxk/roc_ie_ot_tls.h | 225 +++++ drivers/common/cnxk/roc_mbox.h | 2 + drivers/common/cnxk/roc_nix.c | 2 + drivers/common/cnxk/roc_nix_inl.c | 2 +- drivers/common/cnxk/roc_nix_inl_dev.c | 2 +- drivers/common/cnxk/roc_se.c | 379 +++----- drivers/common/cnxk/roc_se.h | 38 +- drivers/common/cnxk/version.map | 5 + drivers/crypto/cnxk/cn10k_cryptodev.c | 2 +- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 400 ++++++++- drivers/crypto/cnxk/cn10k_cryptodev_ops.h | 11 + drivers/crypto/cnxk/cn10k_cryptodev_sec.c | 134 +++ drivers/crypto/cnxk/cn10k_cryptodev_sec.h | 68 ++ drivers/crypto/cnxk/cn10k_ipsec.c | 134 +-- drivers/crypto/cnxk/cn10k_ipsec.h | 38 +- drivers/crypto/cnxk/cn10k_ipsec_la_ops.h | 19 +- drivers/crypto/cnxk/cn10k_tls.c | 830 ++++++++++++++++++ drivers/crypto/cnxk/cn10k_tls.h | 35 + drivers/crypto/cnxk/cn10k_tls_ops.h | 322 +++++++ drivers/crypto/cnxk/cn9k_cryptodev_ops.c | 68 +- drivers/crypto/cnxk/cn9k_cryptodev_ops.h | 62 ++ drivers/crypto/cnxk/cn9k_ipsec_la_ops.h | 16 +- drivers/crypto/cnxk/cnxk_cryptodev.c | 3 + drivers/crypto/cnxk/cnxk_cryptodev.h | 24 +- .../crypto/cnxk/cnxk_cryptodev_capabilities.c | 375 +++++++- drivers/crypto/cnxk/cnxk_cryptodev_devargs.c | 31 + drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 128 ++- drivers/crypto/cnxk/cnxk_cryptodev_ops.h | 7 + drivers/crypto/cnxk/cnxk_se.h | 98 +-- drivers/crypto/cnxk/cnxk_sg.h | 4 +- drivers/crypto/cnxk/meson.build | 4 +- drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h | 46 + drivers/crypto/cnxk/version.map | 3 + 47 files changed, 3015 insertions(+), 706 deletions(-) create mode 100644 drivers/common/cnxk/roc_ie_ot_tls.h create mode 100644 drivers/crypto/cnxk/cn10k_cryptodev_sec.c create mode 100644 drivers/crypto/cnxk/cn10k_cryptodev_sec.h create mode 100644 drivers/crypto/cnxk/cn10k_tls.c create mode 100644 drivers/crypto/cnxk/cn10k_tls.h create mode 100644 drivers/crypto/cnxk/cn10k_tls_ops.h create mode 100644 drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h
Signature · 1 line
2.25.1
PATCH 1/24 common/cnxk: fix memory leak
From: Akhil Goyal <[email protected]>
dev_init() acquires some resources which need to be cleaned in case a failure is observed afterwards.
--- drivers/common/cnxk/roc_cpt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/common/cnxk/roc_cpt.c +2 -1
@@ -756,7 +756,7 @@ roc_cpt_dev_init(struct roc_cpt *roc_cpt) rc =dev_init (dev, pci_dev);if (rc) {plt_err ("Failed to init roc device" ); - goto fail; +return rc; } cpt->pci_dev = pci_dev;
@@ -788,6 +788,7 @@ roc_cpt_dev_init(struct roc_cpt *roc_cpt)return 0 ; fail: +dev_fini (dev, pci_dev);return rc; }
Signature · 1 line
2.25.1
PATCH 2/24 crypto/cnxk: use common macro
In reply to Anoob JosephHaving different macros for same purpose may cause issues if one is updated without updating the other. Use same macro by including the header.
--- drivers/crypto/cnxk/cnxk_cryptodev.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/crypto/cnxk/cnxk_cryptodev.h +3 -3
@@ -8,12 +8,12 @@#include <rte_cryptodev.h> #include <rte_security.h> +#include "roc_ae.h" #include "roc_cpt.h" #define CNXK_CPT_MAX_CAPS 55#define CNXK_SEC_CRYPTO_MAX_CAPS 16#define CNXK_SEC_MAX_CAPS 9 -#define CNXK_AE_EC_ID_MAX 9/** * Device private data */
@@ -23,8 +23,8 @@ struct cnxk_cpt_vf {struct rte_cryptodev_capabilities sec_crypto_caps[CNXK_SEC_CRYPTO_MAX_CAPS ];struct rte_security_capability sec_caps[CNXK_SEC_MAX_CAPS ]; -uint64_t cnxk_fpm_iova[CNXK_AE_EC_ID_MAX ]; -struct roc_ae_ec_group *ec_grp[CNXK_AE_EC_ID_MAX ]; +uint64_t cnxk_fpm_iova[ROC_AE_EC_ID_PMAX ]; +struct roc_ae_ec_group *ec_grp[ROC_AE_EC_ID_PMAX ];uint16_t max_qps_limit; };
Signature · 1 line
2.25.1
PATCH 3/24 crypto/cnxk: fallback to SG if headroom is not available
In reply to Anoob JosephFrom: Tejasree Kondoj <[email protected]>
Falling back to SG mode for cn9k lookaside IPsec
if headroom is not available.
--- drivers/crypto/cnxk/cn9k_ipsec_la_ops.h | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
drivers/crypto/cnxk/cn9k_ipsec_la_ops.h +1 -7
@@ -82,19 +82,13 @@ process_outb_sa(struct cpt_qp_meta_info *m_info, struct rte_crypto_op *cop, extend_tail = rlen - dlen; pkt_len += extend_tail; -if (likely (m_src->next ==NULL )) { +if (likely ((m_src->next ==NULL ) && (hdr_len <= data_off))) {if (unlikely (extend_tail >rte_pktmbuf_tailroom (m_src))) {plt_dp_err ("Not enough tail room (required: %d, available: %d)" , extend_tail,rte_pktmbuf_tailroom (m_src));return -ENOMEM ; } -if (unlikely (hdr_len > data_off)) { -plt_dp_err ("Not enough head room (required: %d, available: %d)" , hdr_len, -rte_pktmbuf_headroom (m_src)); -return -ENOMEM ; - } - m_src->data_len = pkt_len; hdr =PLT_PTR_ADD (m_src->buf_addr, data_off - hdr_len);
Signature · 1 line
2.25.1
PATCH 4/24 crypto/cnxk: return microcode completion code
In reply to Anoob JosephReturn microcode completion code in case of errors. This allows applications to check the failure reasons in more granularity.
--- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +2 -0
@@ -823,6 +823,7 @@ cn10k_cpt_sec_post_process(struct rte_crypto_op *cop, struct cpt_cn10k_res_s *rebreak ;default : cop->status =RTE_CRYPTO_OP_STATUS_ERROR ; + cop->aux_flags = res->uc_compcode;return ; }
@@ -884,6 +885,7 @@ cn10k_cpt_dequeue_post_process(struct cnxk_cpt_qp *qp,plt_dp_info ("Request failed with microcode error" );plt_dp_info ("MC completion code 0x%x" , res->uc_compcode); + cop->aux_flags = uc_compcode; goto temp_sess_free; }
Signature · 1 line
2.25.1
PATCH 5/24 crypto/cnxk: fix ECDH pubkey verify in cn9k
In reply to Anoob JosephFrom: Gowrishankar Muthukrishnan <[email protected]>
Fix ECDH pubkey verify in cn9k.
--- drivers/crypto/cnxk/cn9k_cryptodev_ops.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/crypto/cnxk/cn9k_cryptodev_ops.c +11 -1
@@ -578,7 +578,17 @@ cn9k_cpt_dequeue_post_process(struct cnxk_cpt_qp *qp, struct rte_crypto_op *cop,if (unlikely (res->uc_compcode)) {if (res->uc_compcode ==ROC_SE_ERR_GC_ICV_MISCOMPARE ) cop->status =RTE_CRYPTO_OP_STATUS_AUTH_FAILED ; -else +else if (cop->type ==RTE_CRYPTO_OP_TYPE_ASYMMETRIC && + cop->sess_type ==RTE_CRYPTO_OP_WITH_SESSION && + cop->asym->ecdh.ke_type ==RTE_CRYPTO_ASYM_KE_PUB_KEY_VERIFY ) { +if (res->uc_compcode ==ROC_AE_ERR_ECC_POINT_NOT_ON_CURVE ) { + cop->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return ; + }else if (res->uc_compcode ==ROC_AE_ERR_ECC_PAI ) { + cop->status =RTE_CRYPTO_OP_STATUS_SUCCESS ; +return ; + } + }else cop->status =RTE_CRYPTO_OP_STATUS_ERROR ;plt_dp_info ("Request failed with microcode error" );
Signature · 1 line
2.25.1
PATCH 6/24 crypto/cnxk: enable digest gen for zero len input
In reply to Anoob JosephFrom: Aakash Sasidharan <[email protected]>
With zero length input, digest generation fails with incorrect value. Fix this by completely avoiding the gather component when the input packet has zero data length.
--- drivers/crypto/cnxk/cnxk_se.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/cnxk/cnxk_se.h +1 -1
@@ -2479,7 +2479,7 @@ prepare_iov_from_pkt(struct rte_mbuf *pkt, struct roc_se_iov_ptr *iovec, uint32_void *seg_data =NULL ;int32_t seg_size =0 ; -if (!pkt) { +if (!pkt || pkt->data_len ==0 ) { iovec->buf_cnt =0 ;return 0 ; }
Signature · 1 line
2.25.1
PATCH 7/24 crypto/cnxk: enable Rx inject in security lookaside
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add Rx inject fastpath API.
Add devargs to specify an LF to be used for Rx inject. When the RX inject feature flag is enabled:
1. Reserve a CPT LF to use for RX Inject mode.
2. Enable RXC and disable full packet mode for that LF.
--- doc/guides/cryptodevs/cnxk.rst | 12 ++ doc/guides/rel_notes/release_24_03.rst | 3 + drivers/common/cnxk/hw/cpt.h | 9 ++ drivers/common/cnxk/roc_cpt.c | 11 +- drivers/common/cnxk/roc_cpt.h | 3 +- drivers/common/cnxk/roc_cpt_priv.h | 2 +- drivers/common/cnxk/roc_ie_ot.c | 14 +-- drivers/common/cnxk/roc_mbox.h | 2 + drivers/common/cnxk/roc_nix_inl.c | 2 +- drivers/common/cnxk/roc_nix_inl_dev.c | 2 +- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 123 +++++++++++++++++++ drivers/crypto/cnxk/cn10k_cryptodev_ops.h | 8 ++ drivers/crypto/cnxk/cn10k_ipsec.c | 4 + drivers/crypto/cnxk/cn10k_ipsec.h | 2 + drivers/crypto/cnxk/cnxk_cryptodev.c | 3 + drivers/crypto/cnxk/cnxk_cryptodev.h | 3 + drivers/crypto/cnxk/cnxk_cryptodev_devargs.c | 31 +++++ drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 27 +++- drivers/crypto/cnxk/version.map | 3 + 19 files changed, 249 insertions(+), 15 deletions(-)
doc/guides/cryptodevs/cnxk.rst +12 -0
@@ -187,6 +187,18 @@ Runtime Config Options With the above configuration, the number of maximum queue pairs supported by the device is limited to 4. +- ``LF ID for RX injection in case of fallback mechanism`` (default ``60``) + + LF ID for RX Injection in fallback mechanism of security. + Can be configured during runtime by using ``rx_inj_lf`` ``devargs`` parameter. + + For example:: + + -a 0002:20:00.1,rx_inj_lf=20 + + With the above configuration, LF 20 will be used by the device for RX Injection + in security in fallback mechanism secnario. + Debugging Options -----------------
doc/guides/rel_notes/release_24_03.rst +3 -0
@@ -55,6 +55,9 @@ New Features Also, make sure to start the actual text at the margin. ======================================================= +* **Updated Marvell cnxk crypto driver.** + + * Added support for Rx inject in crypto_cn10k. Removed Items -------------
drivers/common/cnxk/hw/cpt.h +9 -0
@@ -237,6 +237,15 @@ struct cpt_inst_s { uint64_t doneint : 1; uint64_t nixtx_addr : 60; } s; +struct { +uint64_t nixtxl :3 ; +uint64_t doneint :1 ; +uint64_t chan :12 ; +uint64_t l2_len :8 ; +uint64_t et_offset :8 ; +uint64_t match_id :16 ; +uint64_t sso_pf_func :16 ; + } hw_s;uint64_t u64; } w0;
drivers/common/cnxk/roc_cpt.c +8 -3
@@ -463,7 +463,7 @@ cpt_available_lfs_get(struct dev *dev, uint16_t *nb_lf)int cpt_lfs_alloc (struct dev *dev,uint8_t eng_grpmsk,uint8_t blkaddr,bool inl_dev_sso, -bool ctx_ilen_valid,uint8_t ctx_ilen) +bool ctx_ilen_valid,uint8_t ctx_ilen,bool rxc_ena,uint16_t rx_inj_lf) {struct cpt_lf_alloc_req_msg *req;struct mbox *mbox =mbox_get (dev->mbox);
@@ -489,6 +489,10 @@ cpt_lfs_alloc(struct dev *dev, uint8_t eng_grpmsk, uint8_t blkaddr, bool inl_dev req->blkaddr = blkaddr; req->ctx_ilen_valid = ctx_ilen_valid; req->ctx_ilen = ctx_ilen; +if (rxc_ena) { + req->rxc_ena =1 ; + req->rxc_ena_lf_id = rx_inj_lf; + } rc =mbox_process (mbox); exit:
@@ -586,7 +590,7 @@ cpt_iq_init(struct roc_cpt_lf *lf) }int -roc_cpt_dev_configure (struct roc_cpt *roc_cpt,int nb_lf) +roc_cpt_dev_configure (struct roc_cpt *roc_cpt,int nb_lf,bool rxc_ena,uint16_t rx_inj_lf) {struct cpt *cpt =roc_cpt_to_cpt_priv (roc_cpt);uint8_t blkaddr[ROC_CPT_MAX_BLKS ];
@@ -630,7 +634,8 @@ roc_cpt_dev_configure(struct roc_cpt *roc_cpt, int nb_lf) ctx_ilen = (PLT_ALIGN (ROC_OT_IPSEC_SA_SZ_MAX ,ROC_ALIGN ) /128 ) -1 ; } - rc =cpt_lfs_alloc (&cpt->dev, eng_grpmsk, blkaddr[blknum], false, ctx_ilen_valid, ctx_ilen); + rc =cpt_lfs_alloc (&cpt->dev, eng_grpmsk, blkaddr[blknum], false, ctx_ilen_valid, ctx_ilen, + rxc_ena, rx_inj_lf);if (rc) goto lfs_detach;
drivers/common/cnxk/roc_cpt.h +2 -1
@@ -171,7 +171,8 @@ int __roc_api roc_cpt_dev_init(struct roc_cpt *roc_cpt); int __roc_api roc_cpt_dev_fini(struct roc_cpt *roc_cpt); int __roc_api roc_cpt_eng_grp_add(struct roc_cpt *roc_cpt,enum cpt_eng_type eng_type); -int __roc_api roc_cpt_dev_configure(struct roc_cpt *roc_cpt, int nb_lf); +int __roc_api roc_cpt_dev_configure(struct roc_cpt *roc_cpt, int nb_lf, bool rxc_ena, +uint16_t rx_inj_lf); void __roc_api roc_cpt_dev_clear(struct roc_cpt *roc_cpt); int __roc_api roc_cpt_lf_init(struct roc_cpt *roc_cpt, struct roc_cpt_lf *lf); void __roc_api roc_cpt_lf_fini(struct roc_cpt_lf *lf);
drivers/common/cnxk/roc_cpt_priv.h +1 -1
@@ -22,7 +22,7 @@ int cpt_lfs_attach(struct dev *dev, uint8_t blkaddr, bool modify, uint16_t nb_lf);int cpt_lfs_detach (struct dev *dev);int cpt_lfs_alloc (struct dev *dev,uint8_t eng_grpmsk,uint8_t blk,bool inl_dev_sso, -bool ctx_ilen_valid,uint8_t ctx_ilen); +bool ctx_ilen_valid,uint8_t ctx_ilen,bool rxc_ena,uint16_t rx_inj_lf);int cpt_lfs_free (struct dev *dev);int cpt_lf_init (struct roc_cpt_lf *lf);void cpt_lf_fini (struct roc_cpt_lf *lf);
drivers/common/cnxk/roc_ie_ot.c +7 -7
@@ -12,13 +12,13 @@ roc_ot_ipsec_inb_sa_init(struct roc_ot_ipsec_inb_sa *sa, bool is_inline)memset (sa,0 ,sizeof (struct roc_ot_ipsec_inb_sa )); -if (is_inline) { - sa->w0.s.pkt_output =ROC_IE_OT_SA_PKT_OUTPUT_NO_FRAG ; - sa->w0.s.pkt_format =ROC_IE_OT_SA_PKT_FMT_META ; - sa->w0.s.pkind =ROC_IE_OT_CPT_PKIND ; - sa->w0.s.et_ovrwr =1 ; - sa->w2.s.l3hdr_on_err =1 ; - } + sa->w0.s.pkt_output =ROC_IE_OT_SA_PKT_OUTPUT_NO_FRAG ; + sa->w0.s.pkt_format =ROC_IE_OT_SA_PKT_FMT_META ; + sa->w0.s.pkind =ROC_IE_OT_CPT_PKIND ; + sa->w0.s.et_ovrwr =1 ; + sa->w2.s.l3hdr_on_err =1 ; + +PLT_SET_USED (is_inline); offset = offsetof(struct roc_ot_ipsec_inb_sa , ctx); sa->w0.s.hw_ctx_off = offset /ROC_CTX_UNIT_8B ;
drivers/common/cnxk/roc_mbox.h +2 -0
@@ -2022,6 +2022,8 @@ struct cpt_lf_alloc_req_msg { uint8_t __io blkaddr; uint8_t __io ctx_ilen_valid : 1; uint8_t __io ctx_ilen : 7; + uint8_t __io rxc_ena : 1; + uint8_t __io rxc_ena_lf_id : 7; };#define CPT_INLINE_INBOUND 0
drivers/common/cnxk/roc_nix_inl.c +1 -1
@@ -986,7 +986,7 @@ roc_nix_inl_outb_init(struct roc_nix *roc_nix)1ULL <<ROC_CPT_DFLT_ENG_GRP_SE_IE | 1ULL << ROC_CPT_DFLT_ENG_GRP_AE); rc =cpt_lfs_alloc (dev, eng_grpmask, blkaddr, - !roc_nix->ipsec_out_sso_pffunc, ctx_ilen_valid, ctx_ilen); + !roc_nix->ipsec_out_sso_pffunc, ctx_ilen_valid, ctx_ilen, false,0 );if (rc) {plt_err ("Failed to alloc CPT LF resources, rc=%d" , rc); goto lf_detach;
drivers/common/cnxk/roc_nix_inl_dev.c +1 -1
@@ -194,7 +194,7 @@ nix_inl_cpt_setup(struct nix_inl_dev *inl_dev, bool inl_dev_sso) } rc =cpt_lfs_alloc (dev, eng_grpmask,RVU_BLOCK_ADDR_CPT0 , inl_dev_sso, ctx_ilen_valid, - ctx_ilen); + ctx_ilen, false,0 );if (rc) {plt_err ("Failed to alloc CPT LF resources, rc=%d" , rc);return rc;
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +123 -0
141 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_cryptodev_ops.h +8 -0
@@ -16,6 +16,14 @@ extern struct rte_cryptodev_ops cn10k_cpt_ops;void cn10k_cpt_set_enqdeq_fns (struct rte_cryptodev *dev,struct cnxk_cpt_vf *vf); +__rte_internal +uint16_t __rte_hot cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct rte_mbuf **pkts, +struct rte_security_session **sess, +uint16_t nb_pkts); + +__rte_internal +int cn10k_cryptodev_sec_rx_inject_configure(void *device, uint16_t port_id, bool enable); +__rte_internal uint16_t __rte_hot cn10k_cpt_sg_ver1_crypto_adapter_enqueue(void *ws, struct rte_event ev[],uint16_t nb_events);
drivers/crypto/cnxk/cn10k_ipsec.c +4 -0
@@ -10,6 +10,7 @@#include <rte_security_driver.h> #include <rte_udp.h> +#include "cn10k_cryptodev_ops.h" #include "cn10k_ipsec.h" #include "cnxk_cryptodev.h" #include "cnxk_cryptodev_ops.h"
@@ -297,6 +298,7 @@ cn10k_sec_session_create(void *device, struct rte_security_session_conf *conf,if (conf->protocol !=RTE_SECURITY_PROTOCOL_IPSEC )return -ENOTSUP ; + ((struct cn10k_sec_session *)sess)->userdata = conf->userdata;return cn10k_ipsec_session_create (device, &conf->ipsec, conf->crypto_xform, sess); }
@@ -458,4 +460,6 @@ cn10k_sec_ops_override(void) cnxk_sec_ops.session_get_size = cn10k_sec_session_get_size; cnxk_sec_ops.session_stats_get = cn10k_sec_session_stats_get; cnxk_sec_ops.session_update = cn10k_sec_session_update; + cnxk_sec_ops.inb_pkt_rx_inject = cn10k_cryptodev_sec_inb_rx_inject; + cnxk_sec_ops.rx_inject_configure = cn10k_cryptodev_sec_rx_inject_configure; }
drivers/crypto/cnxk/cn10k_ipsec.h +2 -0
@@ -38,6 +38,8 @@ struct cn10k_sec_session {bool is_outbound;/** Queue pair */ struct cnxk_cpt_qp *qp; +/** Userdata to be set for Rx inject */ +void *userdata;/** * End of SW mutable area
drivers/crypto/cnxk/cnxk_cryptodev.c +3 -0
@@ -24,6 +24,9 @@ cnxk_cpt_default_ff_get(void)if (roc_model_is_cn10k ()) ff |=RTE_CRYPTODEV_FF_SECURITY_INNER_CSUM |RTE_CRYPTODEV_FF_SYM_RAW_DP ; +if (roc_model_is_cn10ka_b0 ()) + ff |=RTE_CRYPTODEV_FF_SECURITY_RX_INJECT ; +return ff; }
drivers/crypto/cnxk/cnxk_cryptodev.h +3 -0
@@ -18,6 +18,8 @@* Device private data */ struct cnxk_cpt_vf { +struct roc_cpt_lmtline rx_inj_lmtline; +uint16_t rx_inj_pf_func;struct roc_cpt cpt;struct rte_cryptodev_capabilities crypto_caps[CNXK_CPT_MAX_CAPS ];struct rte_cryptodev_capabilities
@@ -26,6 +28,7 @@ struct cnxk_cpt_vf {uint64_t cnxk_fpm_iova[ROC_AE_EC_ID_PMAX ];struct roc_ae_ec_group *ec_grp[ROC_AE_EC_ID_PMAX ];uint16_t max_qps_limit; +uint16_t rx_inj_lf; };uint64_t cnxk_cpt_default_ff_get (void );
drivers/crypto/cnxk/cnxk_cryptodev_devargs.c +31 -0
@@ -9,6 +9,23 @@#define CNXK_MAX_QPS_LIMIT "max_qps_limit"#define CNXK_MAX_QPS_LIMIT_MIN 1#define CNXK_MAX_QPS_LIMIT_MAX (ROC_CPT_MAX_LFS - 1) +#define CNXK_RX_INJ_LF "rx_inj_lf" + +static int +parse_rx_inj_lf (const char *key,const char *value,void *extra_args) +{ +RTE_SET_USED (key); +uint32_t val; + + val =atoi (value); + +if (val <CNXK_MAX_QPS_LIMIT_MIN || val >CNXK_MAX_QPS_LIMIT_MAX ) +return -EINVAL ; + + *(uint16_t *)extra_args = val; + +return 0 ; +}static int parse_max_qps_limit (const char *key,const char *value,void *extra_args)
@@ -31,8 +48,12 @@ cnxk_cpt_parse_devargs(struct rte_devargs *devargs, struct cnxk_cpt_vf *vf) {uint16_t max_qps_limit =CNXK_MAX_QPS_LIMIT_MAX ;struct rte_kvargs *kvlist; +uint16_t rx_inj_lf;int rc; +/* Set to max value as default so that the feature is disabled by default. */ + rx_inj_lf =CNXK_MAX_QPS_LIMIT_MAX ; +if (devargs ==NULL ) goto null_devargs;
@@ -48,10 +69,20 @@ cnxk_cpt_parse_devargs(struct rte_devargs *devargs, struct cnxk_cpt_vf *vf)rte_kvargs_free (kvlist); goto exit; } + + rc =rte_kvargs_process (kvlist,CNXK_RX_INJ_LF , parse_rx_inj_lf, &rx_inj_lf); +if (rc <0 ) { +plt_err ("rx_inj_lf should in the range <%d-%d>" ,CNXK_MAX_QPS_LIMIT_MIN , + max_qps_limit -1 ); +rte_kvargs_free (kvlist); + goto exit; + } +rte_kvargs_free (kvlist); null_devargs: vf->max_qps_limit = max_qps_limit; + vf->rx_inj_lf = rx_inj_lf;return 0 ; exit:
drivers/crypto/cnxk/cnxk_cryptodev_ops.c +26 -1
@@ -5,6 +5,7 @@#include <rte_cryptodev.h> #include <cryptodev_pmd.h> #include <rte_errno.h> +#include <rte_security_driver.h> #include "roc_ae_fpm_tables.h" #include "roc_cpt.h"
@@ -95,6 +96,7 @@ cnxk_cpt_dev_config(struct rte_cryptodev *dev, struct rte_cryptodev_config *confstruct cnxk_cpt_vf *vf = dev->data->dev_private;struct roc_cpt *roc_cpt = &vf->cpt;uint16_t nb_lf_avail, nb_lf; +bool rxc_ena = false;int ret;/* If this is a reconfigure attempt, clear the device and configure again */
@@ -111,7 +113,13 @@ cnxk_cpt_dev_config(struct rte_cryptodev *dev, struct rte_cryptodev_config *confif (nb_lf > nb_lf_avail)return -ENOTSUP ; - ret =roc_cpt_dev_configure (roc_cpt, nb_lf); +if (dev->feature_flags &RTE_CRYPTODEV_FF_SECURITY_RX_INJECT ) { +if (rte_security_dynfield_register () <0 ) +return -ENOTSUP ; + rxc_ena = true; + } + + ret =roc_cpt_dev_configure (roc_cpt, nb_lf, rxc_ena, vf->rx_inj_lf);if (ret) {plt_err ("Could not configure device" );return ret;
@@ -208,6 +216,10 @@ cnxk_cpt_dev_info_get(struct rte_cryptodev *dev, info->sym.max_nb_sessions =0 ; info->min_mbuf_headroom_req =CNXK_CPT_MIN_HEADROOM_REQ ; info->min_mbuf_tailroom_req =CNXK_CPT_MIN_TAILROOM_REQ ; + +/* If the LF ID for RX Inject is less than the available lfs. */ +if (vf->rx_inj_lf > info->max_nb_queue_pairs) + info->feature_flags &= ~RTE_CRYPTODEV_FF_SECURITY_RX_INJECT ; } static void
@@ -452,6 +464,19 @@ cnxk_cpt_queue_pair_setup(struct rte_cryptodev *dev, uint16_t qp_id, qp->sess_mp = conf->mp_session; dev->data->queue_pairs[qp_id] = qp; +if (qp_id == vf->rx_inj_lf) { + ret =roc_cpt_lmtline_init (roc_cpt, &vf->rx_inj_lmtline, vf->rx_inj_lf); +if (ret) { +plt_err ("Could not init lmtline Rx inject" ); + goto exit; + } + + vf->rx_inj_pf_func = qp->lf.pf_func; + +/* Block the queue for other submissions */ + qp->pend_q.pq_mask =0 ; + } +return 0 ; exit:
drivers/crypto/cnxk/version.map +3 -0
@@ -8,5 +8,8 @@ INTERNAL { cn10k_cpt_crypto_adapter_dequeue; cn10k_cpt_crypto_adapter_vector_dequeue; + cn10k_cryptodev_sec_inb_rx_inject; + cn10k_cryptodev_sec_rx_inject_configure; + local: *; };
Signature · 1 line
2.25.1
PATCH 8/24 common/cnxk: add Rx inject configs
In reply to Anoob JosephFrom: Rahul Bhansali <[email protected]>
Add Rx inject config for feature enable/disable, and store Rx chan value per port.
--- drivers/common/cnxk/roc_idev.c | 44 +++++++++++++++++++++++++++++ drivers/common/cnxk/roc_idev.h | 5 ++++ drivers/common/cnxk/roc_idev_priv.h | 6 ++++ drivers/common/cnxk/roc_nix.c | 2 ++ drivers/common/cnxk/version.map | 4 +++ 5 files changed, 61 insertions(+)
drivers/common/cnxk/roc_idev.c +44 -0
@@ -310,3 +310,47 @@ roc_idev_nix_inl_meta_aura_get(void)return idev->inl_cfg.meta_aura;return 0 ; } + +uint8_t +roc_idev_nix_rx_inject_get (uint16_t port) +{ +struct idev_cfg *idev; + + idev =idev_get_cfg (); +if (idev !=NULL && port <PLT_MAX_ETHPORTS ) +return idev->inl_rx_inj_cfg.rx_inject_en[port]; + +return 0 ; +} + +void +roc_idev_nix_rx_inject_set (uint16_t port,uint8_t enable) +{ +struct idev_cfg *idev; + + idev =idev_get_cfg (); +if (idev !=NULL && port <PLT_MAX_ETHPORTS ) +__atomic_store_n (&idev->inl_rx_inj_cfg.rx_inject_en[port], enable, + __ATOMIC_RELEASE); +} + +uint16_t * +roc_idev_nix_rx_chan_base_get (void ) +{ +struct idev_cfg *idev =idev_get_cfg (); + +if (idev !=NULL ) +return (uint16_t *)&idev->inl_rx_inj_cfg.chan; + +return NULL ; +} + +void +roc_idev_nix_rx_chan_set (uint16_t port,uint16_t chan) +{ +struct idev_cfg *idev; + + idev =idev_get_cfg (); +if (idev !=NULL && port <PLT_MAX_ETHPORTS ) +__atomic_store_n (&idev->inl_rx_inj_cfg.chan[port], chan, __ATOMIC_RELEASE); +}
drivers/common/cnxk/roc_idev.h +5 -0
@@ -22,4 +22,9 @@ struct roc_nix_list *__roc_api roc_idev_nix_list_get(void); struct roc_mcs *__roc_api roc_idev_mcs_get(uint8_t mcs_idx); void __roc_api roc_idev_mcs_set(struct roc_mcs *mcs); void __roc_api roc_idev_mcs_free(struct roc_mcs *mcs); + +uint8_t __roc_api roc_idev_nix_rx_inject_get(uint16_t port); +void __roc_api roc_idev_nix_rx_inject_set(uint16_t port, uint8_t enable); +uint16_t *__roc_api roc_idev_nix_rx_chan_base_get(void); +void __roc_api roc_idev_nix_rx_chan_set(uint16_t port, uint16_t chan);#endif /* _ROC_IDEV_H_ */
drivers/common/cnxk/roc_idev_priv.h +6 -0
@@ -19,6 +19,11 @@ struct idev_nix_inl_cfg {uint32_t refs; }; +struct idev_nix_inl_rx_inj_cfg { +uint16_t chan[PLT_MAX_ETHPORTS ]; +uint8_t rx_inject_en[PLT_MAX_ETHPORTS ]; +}; +struct idev_cfg {uint16_t sso_pf_func;uint16_t npa_pf_func;
@@ -35,6 +40,7 @@ struct idev_cfg {struct nix_inl_dev *nix_inl_dev;struct idev_nix_inl_cfg inl_cfg;struct roc_nix_list roc_nix_list; +struct idev_nix_inl_rx_inj_cfg inl_rx_inj_cfg;plt_spinlock_t nix_inl_dev_lock;plt_spinlock_t npa_dev_lock; };
drivers/common/cnxk/roc_nix.c +2 -0
@@ -223,6 +223,8 @@ roc_nix_lf_alloc(struct roc_nix *roc_nix, uint32_t nb_rxq, uint32_t nb_txq, nix->nb_rx_queues = nb_rxq; nix->nb_tx_queues = nb_txq; +roc_idev_nix_rx_chan_set (roc_nix->port_id, rsp->rx_chan_base); + nix->rqs =plt_zmalloc (sizeof (struct roc_nix_rq *) * nb_rxq,0 );if (!nix->rqs) { rc = -ENOMEM ;
drivers/common/cnxk/version.map +4 -0
@@ -105,6 +105,10 @@ INTERNAL { roc_idev_num_lmtlines_get; roc_idev_nix_inl_meta_aura_get; roc_idev_nix_list_get; + roc_idev_nix_rx_chan_base_get; + roc_idev_nix_rx_chan_set; + roc_idev_nix_rx_inject_get; + roc_idev_nix_rx_inject_set; roc_ml_reg_read64; roc_ml_reg_write64; roc_ml_reg_read32;
Signature · 1 line
2.25.1
PATCH 9/24 crypto/cnxk: Rx inject config update
In reply to Anoob JosephFrom: Rahul Bhansali <[email protected]>
- Update chan in CPT inst from port's Rx chan
- Set Rx inject config in Idev struct
--- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 4 +++- drivers/crypto/cnxk/cn10k_ipsec.c | 3 +++ drivers/crypto/cnxk/cnxk_cryptodev.h | 1 + drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 2 ++ 4 files changed, 9 insertions(+), 1 deletion(-)
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +3 -1
@@ -15,6 +15,7 @@#else #include "roc_io_generic.h" #endif +#include "roc_idev.h" #include "roc_sso.h" #include "roc_sso_dp.h"
@@ -1122,6 +1123,7 @@ cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct rte_mbuf **pkts, inst->dptr = dptr; inst->rptr = dptr; + inst->w0.hw_s.chan = *(vf->rx_chan_base + m->port); inst->w0.hw_s.l2_len = l2_len; inst->w0.hw_s.et_offset = l2_len -2 ;
@@ -1653,7 +1655,7 @@ cn10k_cryptodev_sec_rx_inject_configure(void *device, uint16_t port_id, bool enaif (ret)return -ENOTSUP ; -RTE_SET_USED (enable); +roc_idev_nix_rx_inject_set (port_id, enable);return 0 ; }
drivers/crypto/cnxk/cn10k_ipsec.c +3 -0
@@ -192,6 +192,9 @@ cn10k_ipsec_inb_sa_create(struct roc_cpt *roc_cpt, struct roc_cpt_lf *lf, sec_sess->is_outbound = false; sec_sess->inst.w7 =ipsec_cpt_inst_w7_get (roc_cpt, in_sa); +/* Save index/SPI in cookie, specific required for Rx Inject */ + sa_dptr->w1.s.cookie =0xFFFFFFFF ; +/* pre-populate CPT INST word 4 */ inst_w4.u64 =0 ; inst_w4.s.opcode_major =ROC_IE_OT_MAJOR_OP_PROCESS_INBOUND_IPSEC |ROC_IE_OT_INPLACE_BIT ;
drivers/crypto/cnxk/cnxk_cryptodev.h +1 -0
@@ -20,6 +20,7 @@struct cnxk_cpt_vf {struct roc_cpt_lmtline rx_inj_lmtline;uint16_t rx_inj_pf_func; +uint16_t *rx_chan_base;struct roc_cpt cpt;struct rte_cryptodev_capabilities crypto_caps[CNXK_CPT_MAX_CAPS ];struct rte_cryptodev_capabilities
drivers/crypto/cnxk/cnxk_cryptodev_ops.c +2 -0
@@ -10,6 +10,7 @@#include "roc_ae_fpm_tables.h" #include "roc_cpt.h" #include "roc_errata.h" +#include "roc_idev.h" #include "roc_ie_on.h" #include "cnxk_ae.h"
@@ -117,6 +118,7 @@ cnxk_cpt_dev_config(struct rte_cryptodev *dev, struct rte_cryptodev_config *confif (rte_security_dynfield_register () <0 )return -ENOTSUP ; rxc_ena = true; + vf->rx_chan_base =roc_idev_nix_rx_chan_base_get (); } ret =roc_cpt_dev_configure (roc_cpt, nb_lf, rxc_ena, vf->rx_inj_lf);
Signature · 1 line
2.25.1
PATCH 10/24 crypto/cnxk: enable Rx inject for 103
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Enable Rx inject feature for 103XX
--- drivers/crypto/cnxk/cnxk_cryptodev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/cnxk/cnxk_cryptodev.c +1 -1
@@ -24,7 +24,7 @@ cnxk_cpt_default_ff_get(void)if (roc_model_is_cn10k ()) ff |=RTE_CRYPTODEV_FF_SECURITY_INNER_CSUM |RTE_CRYPTODEV_FF_SYM_RAW_DP ; -if (roc_model_is_cn10ka_b0 ()) +if (roc_model_is_cn10ka_b0 () ||roc_model_is_cn10kb ()) ff |=RTE_CRYPTODEV_FF_SECURITY_RX_INJECT ;return ff;
Signature · 1 line
2.25.1
PATCH 11/24 crypto/cnxk: rename security caps as IPsec security caps
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Security capabilities would vary between IPsec and other new offloads. Rename existing security caps to indicate that they are IPsec specific ones.
Rename and change the scope of common functions, inorder to avoid code duplication. These functions can be used by both IPsec and TLS
--- drivers/common/cnxk/cnxk_security.c | 13 ++-- drivers/common/cnxk/cnxk_security.h | 17 +++-- drivers/common/cnxk/version.map | 1 + drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 18 ++++- drivers/crypto/cnxk/cn10k_ipsec.c | 46 +++++++----- drivers/crypto/cnxk/cn10k_ipsec.h | 9 ++- drivers/crypto/cnxk/cn10k_ipsec_la_ops.h | 18 ++--- drivers/crypto/cnxk/cn9k_ipsec_la_ops.h | 8 +- drivers/crypto/cnxk/cnxk_cryptodev.h | 10 +-- .../crypto/cnxk/cnxk_cryptodev_capabilities.c | 73 ++++++++++--------- drivers/crypto/cnxk/cnxk_sg.h | 4 +- 11 files changed, 123 insertions(+), 94 deletions(-)
drivers/common/cnxk/cnxk_security.c +6 -7
@@ -8,9 +8,8 @@#include "roc_api.h" -static void -ipsec_hmac_opad_ipad_gen (struct rte_crypto_sym_xform *auth_xform, -uint8_t *hmac_opad_ipad) +void +cnxk_sec_opad_ipad_gen (struct rte_crypto_sym_xform *auth_xform,uint8_t *hmac_opad_ipad) {const uint8_t *key = auth_xform->auth.key.data;uint32_t length = auth_xform->auth.key.length;
@@ -192,7 +191,7 @@ ot_ipsec_sa_common_param_fill(union roc_ot_ipsec_sa_word2 *w2,const uint8_t *auth_key = auth_xfrm->auth.key.data;roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else { -ipsec_hmac_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); } tmp_key = (uint64_t *)hmac_opad_ipad;
@@ -741,7 +740,7 @@ onf_ipsec_sa_common_param_fill(struct roc_ie_onf_sa_ctl *ctl, uint8_t *salt, key = cipher_xfrm->cipher.key.data; length = cipher_xfrm->cipher.key.length; -ipsec_hmac_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); }switch (length) {
@@ -1374,7 +1373,7 @@ cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -ipsec_hmac_opad_ipad_gen (auth_xform, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad); } }
@@ -1441,7 +1440,7 @@ cnxk_on_ipsec_inb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -ipsec_hmac_opad_ipad_gen (auth_xform, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad); } }
drivers/common/cnxk/cnxk_security.h +9 -8
@@ -61,14 +61,15 @@ bool __roc_api cnxk_onf_ipsec_inb_sa_valid(struct roc_onf_ipsec_inb_sa *sa); bool __roc_api cnxk_onf_ipsec_outb_sa_valid(struct roc_onf_ipsec_outb_sa *sa);/* [CN9K] */ -int __roc_api -cnxk_on_ipsec_inb_sa_create (struct rte_security_ipsec_xform *ipsec, -struct rte_crypto_sym_xform *crypto_xform, -struct roc_ie_on_inb_sa *in_sa); +int __roc_api cnxk_on_ipsec_inb_sa_create(struct rte_security_ipsec_xform *ipsec, +struct rte_crypto_sym_xform *crypto_xform, +struct roc_ie_on_inb_sa *in_sa); -int __roc_api -cnxk_on_ipsec_outb_sa_create (struct rte_security_ipsec_xform *ipsec, -struct rte_crypto_sym_xform *crypto_xform, -struct roc_ie_on_outb_sa *out_sa); +int __roc_api cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipsec, +struct rte_crypto_sym_xform *crypto_xform, +struct roc_ie_on_outb_sa *out_sa); + +__rte_internal +void cnxk_sec_opad_ipad_gen(struct rte_crypto_sym_xform *auth_xform, uint8_t *hmac_opad_ipad);#endif /* _CNXK_SECURITY_H__ */
drivers/common/cnxk/version.map +1 -0
@@ -1,6 +1,7 @@ INTERNAL { global: + cnxk_sec_opad_ipad_gen; cnxk_ipsec_icvlen_get; cnxk_ipsec_ivlen_get; cnxk_ipsec_outb_rlens_get;
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +15 -3
@@ -80,8 +80,9 @@ cn10k_cpt_sym_temp_sess_create(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op) } static __rte_always_inline int __rte_hot -cpt_sec_inst_fill (struct cnxk_cpt_qp *qp,struct rte_crypto_op *op,struct cn10k_sec_session *sess, -struct cpt_inst_s *inst,struct cpt_inflight_req *infl_req,const bool is_sg_ver2) +cpt_sec_ipsec_inst_fill (struct cnxk_cpt_qp *qp,struct rte_crypto_op *op, +struct cn10k_sec_session *sess,struct cpt_inst_s *inst, +struct cpt_inflight_req *infl_req,const bool is_sg_ver2) {struct rte_crypto_sym_op *sym_op = op->sym;int ret;
@@ -91,7 +92,7 @@ cpt_sec_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op, struct cn10kreturn -ENOTSUP ; } -if (sess->is_outbound) +if (sess->ipsec.is_outbound) ret =process_outb_sa (&qp->lf, op, sess, &qp->meta_info, infl_req, inst, is_sg_ver2);else
@@ -100,6 +101,17 @@ cpt_sec_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op, struct cn10kreturn ret; } +static __rte_always_inline int __rte_hot +cpt_sec_inst_fill (struct cnxk_cpt_qp *qp,struct rte_crypto_op *op,struct cn10k_sec_session *sess, +struct cpt_inst_s *inst,struct cpt_inflight_req *infl_req,const bool is_sg_ver2) +{ + +if (sess->proto ==RTE_SECURITY_PROTOCOL_IPSEC ) +return cpt_sec_ipsec_inst_fill (qp, op, sess, &inst[0 ], infl_req, is_sg_ver2); + +return 0 ; +} +static inline int cn10k_cpt_fill_inst (struct cnxk_cpt_qp *qp,struct rte_crypto_op *ops[],struct cpt_inst_s inst[],struct cpt_inflight_req *infl_req,const bool is_sg_ver2)
drivers/crypto/cnxk/cn10k_ipsec.c +28 -18
121 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_ipsec.h +7 -2
@@ -29,13 +29,18 @@ struct cn10k_sec_session {/** PMD private space */ +enum rte_security_session_protocol proto;/** Pre-populated CPT inst words */ struct cnxk_cpt_inst_tmpl inst;uint16_t max_extended_len;uint16_t iv_offset;uint8_t iv_length; -uint8_t ip_csum; -bool is_outbound; +union { +struct { +uint8_t ip_csum; +bool is_outbound; + } ipsec; + };/** Queue pair */ struct cnxk_cpt_qp *qp;/** Userdata to be set for Rx inject */
drivers/crypto/cnxk/cn10k_ipsec_la_ops.h +9 -9
@@ -121,7 +121,7 @@ process_outb_sa(struct roc_cpt_lf *lf, struct rte_crypto_op *cop, struct cn10k_s i =0 ; gather_comp = (struct roc_sglist_comp *)((uint8_t *)m_data +8 ); - i =fill_ipsec_sg_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg_comp_from_pkt (gather_comp, i, m_src); ((uint16_t *)in_buffer)[2 ] =rte_cpu_to_be_16 (i); g_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -132,7 +132,7 @@ process_outb_sa(struct roc_cpt_lf *lf, struct rte_crypto_op *cop, struct cn10k_s i =0 ; scatter_comp = (struct roc_sglist_comp *)((uint8_t *)gather_comp + g_size_bytes); - i =fill_ipsec_sg_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg_comp_from_pkt (scatter_comp, i, m_src); ((uint16_t *)in_buffer)[3 ] =rte_cpu_to_be_16 (i); s_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -170,7 +170,7 @@ process_outb_sa(struct roc_cpt_lf *lf, struct rte_crypto_op *cop, struct cn10k_s i =0 ; gather_comp = (struct roc_sg2list_comp *)((uint8_t *)m_data); - i =fill_ipsec_sg2_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg2_comp_from_pkt (gather_comp, i, m_src); cpt_inst_w5.s.gather_sz = ((i +2 ) /3 ); g_size_bytes = ((i +2 ) /3 ) *sizeof (struct roc_sg2list_comp );
@@ -181,7 +181,7 @@ process_outb_sa(struct roc_cpt_lf *lf, struct rte_crypto_op *cop, struct cn10k_s i =0 ; scatter_comp = (struct roc_sg2list_comp *)((uint8_t *)gather_comp + g_size_bytes); - i =fill_ipsec_sg2_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg2_comp_from_pkt (scatter_comp, i, m_src); cpt_inst_w6.s.scatter_sz = ((i +2 ) /3 );
@@ -211,7 +211,7 @@ process_inb_sa(struct rte_crypto_op *cop, struct cn10k_sec_session *sess, struct inst->w4.u64 = sess->inst.w4 |rte_pktmbuf_pkt_len (m_src); dptr =rte_pktmbuf_mtod (m_src, uint64_t); inst->dptr = dptr; - m_src->ol_flags |= (uint64_t )sess->ip_csum; + m_src->ol_flags |= (uint64_t )sess->ipsec.ip_csum; }else if (is_sg_ver2 == false) {struct roc_sglist_comp *scatter_comp, *gather_comp;uint32_t g_size_bytes, s_size_bytes;
@@ -234,7 +234,7 @@ process_inb_sa(struct rte_crypto_op *cop, struct cn10k_sec_session *sess, struct/* Input Gather List */ i =0 ; gather_comp = (struct roc_sglist_comp *)((uint8_t *)m_data +8 ); - i =fill_ipsec_sg_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg_comp_from_pkt (gather_comp, i, m_src); ((uint16_t *)in_buffer)[2 ] =rte_cpu_to_be_16 (i); g_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -242,7 +242,7 @@ process_inb_sa(struct rte_crypto_op *cop, struct cn10k_sec_session *sess, struct/* Output Scatter List */ i =0 ; scatter_comp = (struct roc_sglist_comp *)((uint8_t *)gather_comp + g_size_bytes); - i =fill_ipsec_sg_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg_comp_from_pkt (scatter_comp, i, m_src); ((uint16_t *)in_buffer)[3 ] =rte_cpu_to_be_16 (i); s_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -270,7 +270,7 @@ process_inb_sa(struct rte_crypto_op *cop, struct cn10k_sec_session *sess, struct i =0 ; gather_comp = (struct roc_sg2list_comp *)((uint8_t *)m_data); - i =fill_ipsec_sg2_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg2_comp_from_pkt (gather_comp, i, m_src); cpt_inst_w5.s.gather_sz = ((i +2 ) /3 ); g_size_bytes = ((i +2 ) /3 ) *sizeof (struct roc_sg2list_comp );
@@ -278,7 +278,7 @@ process_inb_sa(struct rte_crypto_op *cop, struct cn10k_sec_session *sess, struct/* Output Scatter List */ i =0 ; scatter_comp = (struct roc_sg2list_comp *)((uint8_t *)gather_comp + g_size_bytes); - i =fill_ipsec_sg2_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg2_comp_from_pkt (scatter_comp, i, m_src); cpt_inst_w6.s.scatter_sz = ((i +2 ) /3 );
drivers/crypto/cnxk/cn9k_ipsec_la_ops.h +4 -4
@@ -132,7 +132,7 @@ process_outb_sa(struct cpt_qp_meta_info *m_info, struct rte_crypto_op *cop, gather_comp = (struct roc_sglist_comp *)((uint8_t *)m_data +8 ); i =fill_sg_comp (gather_comp, i, (uint64_t )hdr, hdr_len); - i =fill_ipsec_sg_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg_comp_from_pkt (gather_comp, i, m_src); ((uint16_t *)in_buffer)[2 ] =rte_cpu_to_be_16 (i); g_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -146,7 +146,7 @@ process_outb_sa(struct cpt_qp_meta_info *m_info, struct rte_crypto_op *cop, scatter_comp = (struct roc_sglist_comp *)((uint8_t *)gather_comp + g_size_bytes); i =fill_sg_comp (scatter_comp, i, (uint64_t )hdr, hdr_len); - i =fill_ipsec_sg_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg_comp_from_pkt (scatter_comp, i, m_src); ((uint16_t *)in_buffer)[3 ] =rte_cpu_to_be_16 (i); s_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -228,7 +228,7 @@ process_inb_sa(struct cpt_qp_meta_info *m_info, struct rte_crypto_op *cop,*/ i =0 ; gather_comp = (struct roc_sglist_comp *)((uint8_t *)m_data +8 ); - i =fill_ipsec_sg_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg_comp_from_pkt (gather_comp, i, m_src); ((uint16_t *)in_buffer)[2 ] =rte_cpu_to_be_16 (i); g_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -239,7 +239,7 @@ process_inb_sa(struct cpt_qp_meta_info *m_info, struct rte_crypto_op *cop, i =0 ; scatter_comp = (struct roc_sglist_comp *)((uint8_t *)gather_comp + g_size_bytes); i =fill_sg_comp (scatter_comp, i, (uint64_t )hdr, hdr_len); - i =fill_ipsec_sg_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg_comp_from_pkt (scatter_comp, i, m_src); ((uint16_t *)in_buffer)[3 ] =rte_cpu_to_be_16 (i); s_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
drivers/crypto/cnxk/cnxk_cryptodev.h +5 -5
@@ -11,9 +11,10 @@#include "roc_ae.h" #include "roc_cpt.h" -#define CNXK_CPT_MAX_CAPS 55 -#define CNXK_SEC_CRYPTO_MAX_CAPS 16 -#define CNXK_SEC_MAX_CAPS 9 +#define CNXK_CPT_MAX_CAPS 55 +#define CNXK_SEC_IPSEC_CRYPTO_MAX_CAPS 16 +#define CNXK_SEC_MAX_CAPS 9 +/** * Device private data */
@@ -23,8 +24,7 @@ struct cnxk_cpt_vf {uint16_t *rx_chan_base;struct roc_cpt cpt;struct rte_cryptodev_capabilities crypto_caps[CNXK_CPT_MAX_CAPS ]; -struct rte_cryptodev_capabilities - sec_crypto_caps[CNXK_SEC_CRYPTO_MAX_CAPS ]; +struct rte_cryptodev_capabilities sec_ipsec_crypto_caps[CNXK_SEC_IPSEC_CRYPTO_MAX_CAPS ];struct rte_security_capability sec_caps[CNXK_SEC_MAX_CAPS ];uint64_t cnxk_fpm_iova[ROC_AE_EC_ID_PMAX ];struct roc_ae_ec_group *ec_grp[ROC_AE_EC_ID_PMAX ];
drivers/crypto/cnxk/cnxk_cryptodev_capabilities.c +37 -36
177 lines not on this page · raw message
drivers/crypto/cnxk/cnxk_sg.h +2 -2
@@ -129,7 +129,7 @@ fill_sg_comp_from_iov(struct roc_sglist_comp *list, uint32_t i, struct roc_se_io } static __rte_always_inline uint32_t -fill_ipsec_sg_comp_from_pkt (struct roc_sglist_comp *list,uint32_t i,struct rte_mbuf *pkt) +fill_sg_comp_from_pkt (struct roc_sglist_comp *list,uint32_t i,struct rte_mbuf *pkt) {uint32_t buf_sz;void *vaddr;
@@ -150,7 +150,7 @@ fill_ipsec_sg_comp_from_pkt(struct roc_sglist_comp *list, uint32_t i, struct rte } static __rte_always_inline uint32_t -fill_ipsec_sg2_comp_from_pkt (struct roc_sg2list_comp *list,uint32_t i,struct rte_mbuf *pkt) +fill_sg2_comp_from_pkt (struct roc_sg2list_comp *list,uint32_t i,struct rte_mbuf *pkt) {uint32_t buf_sz;void *vaddr;
Signature · 1 line
2.25.1
PATCH 12/24 common/cnxk: update opad-ipad gen to handle TLS
In reply to Anoob JosephFor TLS opcodes, ipad is at the offset 64 as compared to the packed implementation for IPsec. Extend the function to handle TLS contexts as well.
--- drivers/common/cnxk/cnxk_security.c | 15 ++++++++------- drivers/common/cnxk/cnxk_security.h | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-)
drivers/common/cnxk/cnxk_security.c +8 -7
@@ -9,7 +9,8 @@#include "roc_api.h" void -cnxk_sec_opad_ipad_gen (struct rte_crypto_sym_xform *auth_xform,uint8_t *hmac_opad_ipad) +cnxk_sec_opad_ipad_gen (struct rte_crypto_sym_xform *auth_xform,uint8_t *hmac_opad_ipad, +bool is_tls) {const uint8_t *key = auth_xform->auth.key.data;uint32_t length = auth_xform->auth.key.length;
@@ -29,11 +30,11 @@ cnxk_sec_opad_ipad_gen(struct rte_crypto_sym_xform *auth_xform, uint8_t *hmac_opswitch (auth_xform->auth.algo) {case RTE_CRYPTO_AUTH_MD5_HMAC :roc_hash_md5_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ]); -roc_hash_md5_gen (ipad, (uint32_t *)&hmac_opad_ipad[24 ]); +roc_hash_md5_gen (ipad, (uint32_t *)&hmac_opad_ipad[is_tls ?64 :24 ]);break ;case RTE_CRYPTO_AUTH_SHA1_HMAC :roc_hash_sha1_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ]); -roc_hash_sha1_gen (ipad, (uint32_t *)&hmac_opad_ipad[24 ]); +roc_hash_sha1_gen (ipad, (uint32_t *)&hmac_opad_ipad[is_tls ?64 :24 ]);break ;case RTE_CRYPTO_AUTH_SHA256_HMAC :roc_hash_sha256_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ],256 );
@@ -191,7 +192,7 @@ ot_ipsec_sa_common_param_fill(union roc_ot_ipsec_sa_word2 *w2,const uint8_t *auth_key = auth_xfrm->auth.key.data;roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else { -cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad, false); } tmp_key = (uint64_t *)hmac_opad_ipad;
@@ -740,7 +741,7 @@ onf_ipsec_sa_common_param_fill(struct roc_ie_onf_sa_ctl *ctl, uint8_t *salt, key = cipher_xfrm->cipher.key.data; length = cipher_xfrm->cipher.key.length; -cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad, false); }switch (length) {
@@ -1373,7 +1374,7 @@ cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad, false); } }
@@ -1440,7 +1441,7 @@ cnxk_on_ipsec_inb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad, false); } }
drivers/common/cnxk/cnxk_security.h +2 -1
@@ -70,6 +70,7 @@ int __roc_api cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipse struct roc_ie_on_outb_sa *out_sa);__rte_internal -void cnxk_sec_opad_ipad_gen(struct rte_crypto_sym_xform *auth_xform, uint8_t *hmac_opad_ipad); +void cnxk_sec_opad_ipad_gen(struct rte_crypto_sym_xform *auth_xform, uint8_t *hmac_opad_ipad, +bool is_tls);#endif /* _CNXK_SECURITY_H__ */
Signature · 1 line
2.25.1
PATCH 13/24 common/cnxk: add TLS record contexts
In reply to Anoob JosephAdd TLS record read and write contexts.
--- drivers/common/cnxk/roc_cpt.h | 4 +- drivers/common/cnxk/roc_ie_ot_tls.h | 199 ++++++++++++++++++++++++++++ drivers/common/cnxk/roc_se.h | 11 ++ 3 files changed, 211 insertions(+), 3 deletions(-) create mode 100644 drivers/common/cnxk/roc_ie_ot_tls.h
drivers/common/cnxk/roc_cpt.h +1 -3
@@ -55,6 +55,7 @@#define ROC_CPT_AES_CBC_IV_LEN 16#define ROC_CPT_SHA1_HMAC_LEN 12#define ROC_CPT_SHA2_HMAC_LEN 16 +#define ROC_CPT_DES_IV_LEN 8#define ROC_CPT_DES3_KEY_LEN 24#define ROC_CPT_AES128_KEY_LEN 16
@@ -71,9 +72,6 @@#define ROC_CPT_DES_BLOCK_LENGTH 8#define ROC_CPT_AES_BLOCK_LENGTH 16 -#define ROC_CPT_AES_GCM_ROUNDUP_BYTE_LEN 4 -#define ROC_CPT_AES_CBC_ROUNDUP_BYTE_LEN 16 -/* Salt length for AES-CTR/GCM/CCM and AES-GMAC */ #define ROC_CPT_SALT_LEN 4
drivers/common/cnxk/roc_ie_ot_tls.h new file +199 -0
199 lines not on this page · raw message
drivers/common/cnxk/roc_se.h +11 -0
@@ -5,6 +5,8 @@#ifndef __ROC_SE_H__#define __ROC_SE_H__ +#include "roc_constants.h" +/* SE opcodes */ #define ROC_SE_MAJOR_OP_FC 0x33#define ROC_SE_FC_MINOR_OP_ENCRYPT 0x0
@@ -162,6 +164,15 @@ typedef enum {ROC_SE_ERR_GC_ICV_MISCOMPARE =0x4c ,ROC_SE_ERR_GC_DATA_UNALIGNED =0x4d , +ROC_SE_ERR_SSL_RECORD_LEN_INVALID =0x82 , +ROC_SE_ERR_SSL_CTX_LEN_INVALID =0x83 , +ROC_SE_ERR_SSL_CIPHER_UNSUPPORTED =0x84 , +ROC_SE_ERR_SSL_MAC_UNSUPPORTED =0x85 , +ROC_SE_ERR_SSL_VERSION_UNSUPPORTED =0x86 , +ROC_SE_ERR_SSL_MAC_MISMATCH =0x89 , +ROC_SE_ERR_SSL_PKT_REPLAY_SEQ_OUT_OF_WINDOW =0xC1 , +ROC_SE_ERR_SSL_PKT_REPLAY_SEQ =0xC9 , +/* API Layer */ ROC_SE_ERR_REQ_PENDING =0xfe , ROC_SE_ERR_REQ_TIMEOUT = 0xff,
Signature · 1 line
2.25.1
PATCH 14/24 crypto/cnxk: separate IPsec from security common code
In reply to Anoob JosephThe current structs and functions assume only IPsec offload. Separate it out to allow for addition of TLS.
--- drivers/crypto/cnxk/cn10k_cryptodev.c | 2 +- drivers/crypto/cnxk/cn10k_cryptodev_sec.c | 127 ++++++++++++++++++++++ drivers/crypto/cnxk/cn10k_cryptodev_sec.h | 61 +++++++++++ drivers/crypto/cnxk/cn10k_ipsec.c | 127 +++------------------- drivers/crypto/cnxk/cn10k_ipsec.h | 45 +++----- drivers/crypto/cnxk/cn10k_ipsec_la_ops.h | 1 + drivers/crypto/cnxk/meson.build | 1 + 7 files changed, 218 insertions(+), 146 deletions(-) create mode 100644 drivers/crypto/cnxk/cn10k_cryptodev_sec.c create mode 100644 drivers/crypto/cnxk/cn10k_cryptodev_sec.h
drivers/crypto/cnxk/cn10k_cryptodev.c +1 -1
@@ -12,7 +12,7 @@#include "cn10k_cryptodev.h" #include "cn10k_cryptodev_ops.h" -#include "cn10k_ipsec.h" +#include "cn10k_cryptodev_sec.h" #include "cnxk_cryptodev.h" #include "cnxk_cryptodev_capabilities.h" #include "cnxk_cryptodev_sec.h"
drivers/crypto/cnxk/cn10k_cryptodev_sec.c new file +127 -0
127 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_cryptodev_sec.h new file +61 -0
61 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_ipsec.c +13 -114
200 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_ipsec.h +14 -31
57 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_ipsec_la_ops.h +1 -0
@@ -11,6 +11,7 @@#include "roc_ie.h" #include "cn10k_cryptodev.h" +#include "cn10k_cryptodev_sec.h" #include "cn10k_ipsec.h" #include "cnxk_cryptodev.h" #include "cnxk_cryptodev_ops.h"
drivers/crypto/cnxk/meson.build +1 -0
@@ -14,6 +14,7 @@ sources = files( 'cn9k_ipsec.c', 'cn10k_cryptodev.c', 'cn10k_cryptodev_ops.c', + 'cn10k_cryptodev_sec.c', 'cn10k_ipsec.c', 'cnxk_cryptodev.c', 'cnxk_cryptodev_capabilities.c',
Signature · 1 line
2.25.1
PATCH 15/24 crypto/cnxk: add TLS record session ops
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add TLS record session ops for creating and destroying security sessions. Add support for both read and write sessions.
--- drivers/crypto/cnxk/cn10k_cryptodev_sec.h | 8 + drivers/crypto/cnxk/cn10k_tls.c | 758 ++++++++++++++++++++++ drivers/crypto/cnxk/cn10k_tls.h | 35 + drivers/crypto/cnxk/meson.build | 1 + 4 files changed, 802 insertions(+) create mode 100644 drivers/crypto/cnxk/cn10k_tls.c create mode 100644 drivers/crypto/cnxk/cn10k_tls.h
drivers/crypto/cnxk/cn10k_cryptodev_sec.h +8 -0
@@ -11,6 +11,7 @@#include "roc_cpt.h" #include "cn10k_ipsec.h" +#include "cn10k_tls.h" struct cn10k_sec_session {struct rte_security_session rte_sess;
@@ -28,6 +29,12 @@ struct cn10k_sec_session {uint8_t ip_csum;bool is_outbound; } ipsec; +struct { +uint8_t enable_padding :1 ; +uint8_t hdr_len :4 ; +uint8_t rvsd :3 ; +bool is_write; + } tls; };/** Queue pair */ struct cnxk_cpt_qp *qp;
@@ -39,6 +46,7 @@ struct cn10k_sec_session {*/ union {struct cn10k_ipsec_sa sa; +struct cn10k_tls_record tls_rec; }; }__rte_aligned (ROC_ALIGN );
drivers/crypto/cnxk/cn10k_tls.c new file +758 -0
758 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_tls.h new file +35 -0
@@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: BSD-3-Clause +* Copyright(C) 2023 Marvell. +*/ + +#ifndef __CN10K_TLS_H__ +#define __CN10K_TLS_H__ + +#include <rte_crypto_sym.h> +#include <rte_security.h> + +#include "roc_ie_ot_tls.h" + +#include "cnxk_cryptodev.h" +#include "cnxk_cryptodev_ops.h" + +/* Forward declaration */ +struct cn10k_sec_session ; + +struct cn10k_tls_record { +union { +/** Read SA */ +struct roc_ie_ot_tls_read_sa read_sa; +/** Write SA */ +struct roc_ie_ot_tls_write_sa write_sa; + }; +}__rte_aligned (ROC_ALIGN ); + +int cn10k_tls_record_session_create (struct cnxk_cpt_vf *vf,struct cnxk_cpt_qp *qp, +struct rte_security_tls_record_xform *tls_xfrm, +struct rte_crypto_sym_xform *crypto_xfrm, +struct rte_security_session *sess); + +int cn10k_sec_tls_session_destroy (struct cnxk_cpt_qp *qp,struct cn10k_sec_session *sess); + +#endif /* __CN10K_TLS_H__ */
drivers/crypto/cnxk/meson.build +1 -0
@@ -16,6 +16,7 @@ sources = files( 'cn10k_cryptodev_ops.c', 'cn10k_cryptodev_sec.c', 'cn10k_ipsec.c', + 'cn10k_tls.c', 'cnxk_cryptodev.c', 'cnxk_cryptodev_capabilities.c', 'cnxk_cryptodev_devargs.c',
Signature · 1 line
2.25.1
PATCH 16/24 crypto/cnxk: add TLS record datapath handling
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add support for TLS record handling in datapath.
--- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 57 +++- drivers/crypto/cnxk/cn10k_cryptodev_sec.c | 7 + drivers/crypto/cnxk/cn10k_tls_ops.h | 322 ++++++++++++++++++++++ 3 files changed, 380 insertions(+), 6 deletions(-) create mode 100644 drivers/crypto/cnxk/cn10k_tls_ops.h
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +51 -6
@@ -20,11 +20,14 @@#include "roc_sso_dp.h" #include "cn10k_cryptodev.h" -#include "cn10k_cryptodev_ops.h" #include "cn10k_cryptodev_event_dp.h" +#include "cn10k_cryptodev_ops.h" +#include "cn10k_cryptodev_sec.h" #include "cn10k_eventdev.h" #include "cn10k_ipsec.h" #include "cn10k_ipsec_la_ops.h" +#include "cn10k_tls.h" +#include "cn10k_tls_ops.h" #include "cnxk_ae.h" #include "cnxk_cryptodev.h" #include "cnxk_cryptodev_ops.h"
@@ -101,6 +104,18 @@ cpt_sec_ipsec_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op,return ret; } +static __rte_always_inline int __rte_hot +cpt_sec_tls_inst_fill (struct cnxk_cpt_qp *qp,struct rte_crypto_op *op, +struct cn10k_sec_session *sess,struct cpt_inst_s *inst, +struct cpt_inflight_req *infl_req,const bool is_sg_ver2) +{ +if (sess->tls.is_write) +return process_tls_write (&qp->lf, op, sess, &qp->meta_info, infl_req, inst, + is_sg_ver2); +else +return process_tls_read (op, sess, &qp->meta_info, infl_req, inst, is_sg_ver2); +} + static __rte_always_inline int __rte_hotcpt_sec_inst_fill (struct cnxk_cpt_qp *qp,struct rte_crypto_op *op,struct cn10k_sec_session *sess,struct cpt_inst_s *inst,struct cpt_inflight_req *infl_req,const bool is_sg_ver2)
@@ -108,6 +123,8 @@ cpt_sec_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op, struct cn10kif (sess->proto ==RTE_SECURITY_PROTOCOL_IPSEC )return cpt_sec_ipsec_inst_fill (qp, op, sess, &inst[0 ], infl_req, is_sg_ver2); +else if (sess->proto ==RTE_SECURITY_PROTOCOL_TLS_RECORD ) +return cpt_sec_tls_inst_fill (qp, op, sess, &inst[0 ], infl_req, is_sg_ver2);return 0 ; }
@@ -812,7 +829,7 @@ cn10k_cpt_sg_ver2_crypto_adapter_enqueue(void *ws, struct rte_event ev[], uint16 }static inline void -cn10k_cpt_sec_post_process (struct rte_crypto_op *cop,struct cpt_cn10k_res_s *res) +cn10k_cpt_ipsec_post_process (struct rte_crypto_op *cop,struct cpt_cn10k_res_s *res) {struct rte_mbuf *mbuf = cop->sym->m_src;const uint16_t m_len = res->rlen;
@@ -849,10 +866,38 @@ cn10k_cpt_sec_post_process(struct rte_crypto_op *cop, struct cpt_cn10k_res_s *re }static inline void -cn10k_cpt_dequeue_post_process (struct cnxk_cpt_qp *qp, -struct rte_crypto_op *cop, -struct cpt_inflight_req *infl_req, -struct cpt_cn10k_res_s *res) +cn10k_cpt_tls_post_process (struct rte_crypto_op *cop,struct cpt_cn10k_res_s *res) +{ +struct rte_mbuf *mbuf = cop->sym->m_src; +const uint16_t m_len = res->rlen; + +if (!res->uc_compcode) { +if (mbuf->next ==NULL ) + mbuf->data_len = m_len; + mbuf->pkt_len = m_len; + }else { + cop->status =RTE_CRYPTO_OP_STATUS_ERROR ; + cop->aux_flags = res->uc_compcode; +plt_err ("crypto op failed with UC compcode: 0x%x" , res->uc_compcode); + } +} + +static inline void +cn10k_cpt_sec_post_process (struct rte_crypto_op *cop,struct cpt_cn10k_res_s *res) +{ +struct rte_crypto_sym_op *sym_op = cop->sym; +struct cn10k_sec_session *sess; + + sess = sym_op->session; +if (sess->proto ==RTE_SECURITY_PROTOCOL_IPSEC ) +cn10k_cpt_ipsec_post_process (cop, res); +else if (sess->proto ==RTE_SECURITY_PROTOCOL_TLS_RECORD ) +cn10k_cpt_tls_post_process (cop, res); +} + +static inline void +cn10k_cpt_dequeue_post_process (struct cnxk_cpt_qp *qp,struct rte_crypto_op *cop, +struct cpt_inflight_req *infl_req,struct cpt_cn10k_res_s *res) {const uint8_t uc_compcode = res->uc_compcode;const uint8_t compcode = res->compcode;
drivers/crypto/cnxk/cn10k_cryptodev_sec.c +7 -0
@@ -32,6 +32,10 @@ cn10k_sec_session_create(void *dev, struct rte_security_session_conf *conf,return cn10k_ipsec_session_create (vf, qp, &conf->ipsec, conf->crypto_xform, sess); } +if (conf->protocol ==RTE_SECURITY_PROTOCOL_TLS_RECORD ) +return cn10k_tls_record_session_create (vf, qp, &conf->tls_record, + conf->crypto_xform, sess); +return -ENOTSUP ; }
@@ -54,6 +58,9 @@ cn10k_sec_session_destroy(void *dev, struct rte_security_session *sec_sess)if (cn10k_sec_sess->proto ==RTE_SECURITY_PROTOCOL_IPSEC )return cn10k_sec_ipsec_session_destroy (qp, cn10k_sec_sess); +if (cn10k_sec_sess->proto ==RTE_SECURITY_PROTOCOL_TLS_RECORD ) +return cn10k_sec_tls_session_destroy (qp, cn10k_sec_sess); +return -EINVAL ; }
drivers/crypto/cnxk/cn10k_tls_ops.h new file +322 -0
322 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH 17/24 crypto/cnxk: add TLS capability
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add TLS 1.2 record read and write capability.
Add DTLS 1.2 record read and write capability.
--- doc/guides/rel_notes/release_24_03.rst | 2 + drivers/common/cnxk/hw/cpt.h | 3 +- drivers/crypto/cnxk/cnxk_cryptodev.h | 12 +- .../crypto/cnxk/cnxk_cryptodev_capabilities.c | 210 ++++++++++++++++++ 4 files changed, 223 insertions(+), 4 deletions(-)
doc/guides/rel_notes/release_24_03.rst +2 -0
@@ -58,6 +58,8 @@ New Features * **Updated Marvell cnxk crypto driver.** * Added support for Rx inject in crypto_cn10k. + * Added support for TLS record processing in crypto_cn10k. Supports TLS 1.2 + and DTLS 1.2. Removed Items -------------
drivers/common/cnxk/hw/cpt.h +2 -1
@@ -80,7 +80,8 @@ union cpt_eng_caps { uint64_t __io sg_ver2 : 1; uint64_t __io sm2 : 1; uint64_t __io pdcp_chain_zuc256 : 1; - uint64_t __io reserved_38_63 : 26; + uint64_t __io tls : 1; + uint64_t __io reserved_39_63 : 25; }; };
drivers/crypto/cnxk/cnxk_cryptodev.h +9 -3
@@ -11,9 +11,11 @@#include "roc_ae.h" #include "roc_cpt.h" -#define CNXK_CPT_MAX_CAPS 55 -#define CNXK_SEC_IPSEC_CRYPTO_MAX_CAPS 16 -#define CNXK_SEC_MAX_CAPS 9 +#define CNXK_CPT_MAX_CAPS 55 +#define CNXK_SEC_IPSEC_CRYPTO_MAX_CAPS 16 +#define CNXK_SEC_TLS_1_3_CRYPTO_MAX_CAPS 2 +#define CNXK_SEC_TLS_1_2_CRYPTO_MAX_CAPS 6 +#define CNXK_SEC_MAX_CAPS 17/** * Device private data
@@ -25,6 +27,10 @@ struct cnxk_cpt_vf {struct roc_cpt cpt;struct rte_cryptodev_capabilities crypto_caps[CNXK_CPT_MAX_CAPS ];struct rte_cryptodev_capabilities sec_ipsec_crypto_caps[CNXK_SEC_IPSEC_CRYPTO_MAX_CAPS ]; +struct rte_cryptodev_capabilities sec_tls_1_3_crypto_caps[CNXK_SEC_TLS_1_3_CRYPTO_MAX_CAPS ]; +struct rte_cryptodev_capabilities sec_tls_1_2_crypto_caps[CNXK_SEC_TLS_1_2_CRYPTO_MAX_CAPS ]; +struct rte_cryptodev_capabilities + sec_dtls_1_2_crypto_caps[CNXK_SEC_TLS_1_2_CRYPTO_MAX_CAPS ];struct rte_security_capability sec_caps[CNXK_SEC_MAX_CAPS ];uint64_t cnxk_fpm_iova[ROC_AE_EC_ID_PMAX ];struct roc_ae_ec_group *ec_grp[ROC_AE_EC_ID_PMAX ];
drivers/crypto/cnxk/cnxk_cryptodev_capabilities.c +210 -0
246 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH 18/24 crypto/cnxk: add PMD APIs for raw submission to CPT
In reply to Anoob JosephAdd PMD APIs to allow applications to directly submit CPT instructions to hardware.
--- doc/api/doxy-api-index.md | 1 + doc/api/doxy-api.conf.in | 1 + doc/guides/rel_notes/release_24_03.rst | 1 + drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 75 ++++++++--------- drivers/crypto/cnxk/cn10k_cryptodev_ops.h | 3 + drivers/crypto/cnxk/cn9k_cryptodev_ops.c | 56 ------------- drivers/crypto/cnxk/cn9k_cryptodev_ops.h | 62 ++++++++++++++ drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 99 +++++++++++++++++++++++ drivers/crypto/cnxk/meson.build | 2 +- drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h | 46 +++++++++++ 10 files changed, 252 insertions(+), 94 deletions(-) create mode 100644 drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h
doc/api/doxy-api-index.md +1 -0
@@ -49,6 +49,7 @@ The public API headers are grouped by topics: [iavf](@ref rte_pmd_iavf.h), [bnxt](@ref rte_pmd_bnxt.h), [cnxk](@ref rte_pmd_cnxk.h), + [cnxk_crypto](@ref rte_pmd_cnxk_crypto.h), [cnxk_eventdev](@ref rte_pmd_cnxk_eventdev.h), [cnxk_mempool](@ref rte_pmd_cnxk_mempool.h), [dpaa](@ref rte_pmd_dpaa.h),
doc/api/doxy-api.conf.in +1 -0
@@ -6,6 +6,7 @@ PROJECT_NUMBER = @VERSION@ USE_MDFILE_AS_MAINPAGE = @TOPDIR@/doc/api/doxy-api-index.md INPUT = @TOPDIR@/doc/api/doxy-api-index.md \ @TOPDIR@/drivers/bus/vdev \ + @TOPDIR@/drivers/crypto/cnxk \ @TOPDIR@/drivers/crypto/scheduler \ @TOPDIR@/drivers/dma/dpaa2 \ @TOPDIR@/drivers/event/dlb2 \
doc/guides/rel_notes/release_24_03.rst +1 -0
@@ -60,6 +60,7 @@ New Features * Added support for Rx inject in crypto_cn10k. * Added support for TLS record processing in crypto_cn10k. Supports TLS 1.2 and DTLS 1.2. + * Added PMD API to allow raw submission of instructions to CPT. Removed Items -------------
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +38 -37
181 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_cryptodev_ops.h +3 -0
@@ -12,6 +12,9 @@#include "cnxk_cryptodev.h" +#define CN10K_PKTS_PER_LOOP 32 +#define CN10K_PKTS_PER_STEORL 16 +extern struct rte_cryptodev_ops cn10k_cpt_ops;void cn10k_cpt_set_enqdeq_fns (struct rte_cryptodev *dev,struct cnxk_cpt_vf *vf);
drivers/crypto/cnxk/cn9k_cryptodev_ops.c +0 -56
62 lines not on this page · raw message
drivers/crypto/cnxk/cn9k_cryptodev_ops.h +62 -0
70 lines not on this page · raw message
drivers/crypto/cnxk/cnxk_cryptodev_ops.c +99 -0
114 lines not on this page · raw message
drivers/crypto/cnxk/meson.build +1 -1
@@ -24,8 +24,8 @@ sources = files( 'cnxk_cryptodev_sec.c', ) +headers = files('rte_pmd_cnxk_crypto.h') deps += ['bus_pci', 'common_cnxk', 'security', 'eventdev'] - includes += include_directories('../../../lib/net', '../../event/cnxk') if get_option('buildtype').contains('debug')
drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h new file +46 -0
46 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH 19/24 crypto/cnxk: replace PDCP with PDCP chain opcode
In reply to Anoob JosephFrom: Tejasree Kondoj <[email protected]>
Replacing PDCP opcode with PDCP chain opcode.
--- drivers/common/cnxk/roc_se.c | 331 +++++++++------------------------- drivers/common/cnxk/roc_se.h | 18 +- drivers/crypto/cnxk/cnxk_se.h | 96 +++++----- 3 files changed, 135 insertions(+), 310 deletions(-)
drivers/common/cnxk/roc_se.c +89 -242
@@ -88,13 +88,20 @@ cpt_ciph_type_set(roc_se_cipher_type type, struct roc_se_ctx *ctx, uint16_t key_ fc_type =ROC_SE_FC_GEN ;break ;case ROC_SE_ZUC_EEA3 : -if (chained_op) { -if (unlikely (key_len !=16 )) +if (unlikely (key_len !=16 )) { +/* +* ZUC 256 is not supported with older microcode +* where pdcp_iv_offset is 16 +*/ +if (chained_op || (ctx->pdcp_iv_offset ==16 )) { +plt_err ("ZUC 256 is not supported with chained operations" );return -1 ; + } + } +if (chained_op) fc_type =ROC_SE_PDCP_CHAIN ; - }else { +else fc_type =ROC_SE_PDCP ; - }break ;case ROC_SE_SNOW3G_UEA2 :if (unlikely (key_len !=16 ))
@@ -197,33 +204,6 @@ cpt_hmac_opad_ipad_gen(roc_se_auth_type auth_type, const uint8_t *key, uint16_t } } -static int -cpt_pdcp_key_type_set (struct roc_se_zuc_snow3g_ctx *zs_ctx,uint16_t key_len) -{ -roc_se_aes_type key_type =0 ; - -if (roc_model_is_cn9k ()) { -if (key_len !=16 ) { -plt_err ("Only key len 16 is supported on cn9k" ); -return -ENOTSUP ; - } - } - -switch (key_len) { -case 16 : - key_type =ROC_SE_AES_128_BIT ; -break ; -case 32 : - key_type =ROC_SE_AES_256_BIT ; -break ; -default : -plt_err ("Invalid AES key len" ); -return -ENOTSUP ; - } - zs_ctx->zuc.otk_ctx.w0.s.key_len = key_type; -return 0 ; -} -static int cpt_pdcp_chain_key_type_get (uint16_t key_len) {
@@ -247,36 +227,6 @@ cpt_pdcp_chain_key_type_get(uint16_t key_len)return key_type; } -static int -cpt_pdcp_mac_len_set (struct roc_se_zuc_snow3g_ctx *zs_ctx,uint16_t mac_len) -{ -roc_se_pdcp_mac_len_type mac_type =0 ; - -if (roc_model_is_cn9k ()) { -if (mac_len !=4 ) { -plt_err ("Only mac len 4 is supported on cn9k" ); -return -ENOTSUP ; - } - } - -switch (mac_len) { -case 4 : - mac_type =ROC_SE_PDCP_MAC_LEN_32_BIT ; -break ; -case 8 : - mac_type =ROC_SE_PDCP_MAC_LEN_64_BIT ; -break ; -case 16 : - mac_type =ROC_SE_PDCP_MAC_LEN_128_BIT ; -break ; -default : -plt_err ("Invalid ZUC MAC len" ); -return -ENOTSUP ; - } - zs_ctx->zuc.otk_ctx.w0.s.mac_len = mac_type; -return 0 ; -} -static void cpt_zuc_const_update (uint8_t *zuc_const,int key_len,int mac_len) {
@@ -300,32 +250,27 @@ cpt_zuc_const_update(uint8_t *zuc_const, int key_len, int mac_len) }int -roc_se_auth_key_set (struct roc_se_ctx *se_ctx,roc_se_auth_type type, -const uint8_t *key,uint16_t key_len,uint16_t mac_len) +roc_se_auth_key_set (struct roc_se_ctx *se_ctx,roc_se_auth_type type,const uint8_t *key, +uint16_t key_len,uint16_t mac_len) { -struct roc_se_zuc_snow3g_chain_ctx *zs_ch_ctx; -struct roc_se_zuc_snow3g_ctx *zs_ctx;struct roc_se_kasumi_ctx *k_ctx; +struct roc_se_pdcp_ctx *pctx;struct roc_se_context *fctx;uint8_t opcode_minor; -uint8_t pdcp_alg;bool chained_op; -int ret;if (se_ctx ==NULL )return -1 ; - zs_ctx = &se_ctx->se_ctx.zs_ctx; - zs_ch_ctx = &se_ctx->se_ctx.zs_ch_ctx; + pctx = &se_ctx->se_ctx.pctx; k_ctx = &se_ctx->se_ctx.k_ctx; fctx = &se_ctx->se_ctx.fctx; chained_op = se_ctx->ciph_then_auth || se_ctx->auth_then_ciph;if ((type >=ROC_SE_ZUC_EIA3 ) && (type <=ROC_SE_KASUMI_F9_ECB )) { -uint8_t *zuc_const;uint32_t keyx[4 ]; -uint8_t *ci_key; +int key_type;if (!key_len)return -1 ;
@@ -335,98 +280,64 @@ roc_se_auth_key_set(struct roc_se_ctx *se_ctx, roc_se_auth_type type,return -1 ; } -if (roc_model_is_cn9k ()) { - ci_key = zs_ctx->zuc.onk_ctx.ci_key; - zuc_const = zs_ctx->zuc.onk_ctx.zuc_const; - }else { - ci_key = zs_ctx->zuc.otk_ctx.ci_key; - zuc_const = zs_ctx->zuc.otk_ctx.zuc_const; - } -/* For ZUC/SNOW3G/Kasumi */ switch (type) {case ROC_SE_SNOW3G_UIA2 : -if (chained_op) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; - zs_ch_ctx->zuc.onk_ctx.w0.s.state_conf = -ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - ctx->w0.s.auth_type = -ROC_SE_PDCP_CHAIN_ALG_TYPE_SNOW3G ; - ctx->w0.s.mac_len = mac_len; - ctx->w0.s.auth_key_len = key_len; - se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; -cpt_snow3g_key_gen (key, keyx); -memcpy (ctx->st.auth_key, keyx, key_len); - }else { - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_SNOW3G ; - zs_ctx->zuc.otk_ctx.w0.s.mac_len = -ROC_SE_PDCP_MAC_LEN_32_BIT ; -cpt_snow3g_key_gen (key, keyx); -memcpy (ci_key, keyx, key_len); + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.auth_type =ROC_SE_PDCP_CHAIN_ALG_TYPE_SNOW3G ; + pctx->w0.s.mac_len = mac_len; + pctx->w0.s.auth_key_len = key_len; + se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; +cpt_snow3g_key_gen (key, keyx); +memcpy (pctx->st.auth_key, keyx, key_len); + +if (!chained_op) se_ctx->fc_type =ROC_SE_PDCP ; - } se_ctx->pdcp_auth_alg =ROC_SE_PDCP_ALG_TYPE_SNOW3G ; se_ctx->zsk_flags =0x1 ;break ;case ROC_SE_ZUC_EIA3 : -if (chained_op) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; - ctx->w0.s.state_conf = -ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - ctx->w0.s.auth_type = -ROC_SE_PDCP_CHAIN_ALG_TYPE_ZUC ; - ctx->w0.s.mac_len = mac_len; - ctx->w0.s.auth_key_len = key_len; -memcpy (ctx->st.auth_key, key, key_len); -cpt_zuc_const_update (ctx->st.auth_zuc_const, - key_len, mac_len); - se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; - }else { - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_ZUC ; - ret =cpt_pdcp_key_type_set (zs_ctx, key_len); -if (ret) -return ret; - ret =cpt_pdcp_mac_len_set (zs_ctx, mac_len); -if (ret) -return ret; -memcpy (ci_key, key, key_len); -if (key_len ==32 ) -roc_se_zuc_bytes_swap (ci_key, key_len); -cpt_zuc_const_update (zuc_const, key_len, - mac_len); - se_ctx->fc_type =ROC_SE_PDCP ; +if (unlikely (key_len !=16 )) { +/* +* ZUC 256 is not supported with older microcode +* where pdcp_iv_offset is 16 +*/ +if (chained_op || (se_ctx->pdcp_iv_offset ==16 )) { +plt_err ("ZUC 256 is not supported with chained operations" ); +return -1 ; + } } + key_type =cpt_pdcp_chain_key_type_get (key_len); +if (key_type <0 ) +return key_type; + pctx->w0.s.auth_key_len = key_type; + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.auth_type =ROC_SE_PDCP_CHAIN_ALG_TYPE_ZUC ; + pctx->w0.s.mac_len = mac_len; +memcpy (pctx->st.auth_key, key, key_len); +if (key_len ==32 ) +roc_se_zuc_bytes_swap (pctx->st.auth_key, key_len); +cpt_zuc_const_update (pctx->st.auth_zuc_const, key_len, mac_len); + se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; + +if (!chained_op) + se_ctx->fc_type =ROC_SE_PDCP ; se_ctx->pdcp_auth_alg =ROC_SE_PDCP_ALG_TYPE_ZUC ; se_ctx->zsk_flags =0x1 ;break ;case ROC_SE_AES_CMAC_EIA2 : -if (chained_op) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; -int key_type; - key_type =cpt_pdcp_chain_key_type_get (key_len); -if (key_type <0 ) -return key_type; - ctx->w0.s.auth_key_len = key_type; - ctx->w0.s.state_conf = -ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - ctx->w0.s.auth_type = -ROC_SE_PDCP_ALG_TYPE_AES_CTR ; - ctx->w0.s.mac_len = mac_len; -memcpy (ctx->st.auth_key, key, key_len); - se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; - }else { - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_AES_CTR ; - zs_ctx->zuc.otk_ctx.w0.s.mac_len = -ROC_SE_PDCP_MAC_LEN_32_BIT ; -memcpy (ci_key, key, key_len); + key_type =cpt_pdcp_chain_key_type_get (key_len); +if (key_type <0 ) +return key_type; + pctx->w0.s.auth_key_len = key_type; + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.auth_type =ROC_SE_PDCP_ALG_TYPE_AES_CTR ; + pctx->w0.s.mac_len = mac_len; +memcpy (pctx->st.auth_key, key, key_len); + se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; + +if (!chained_op) se_ctx->fc_type =ROC_SE_PDCP ; - } se_ctx->pdcp_auth_alg =ROC_SE_PDCP_ALG_TYPE_AES_CMAC ; se_ctx->eia2 =1 ; se_ctx->zsk_flags =0x1 ;
@@ -454,11 +365,8 @@ roc_se_auth_key_set(struct roc_se_ctx *se_ctx, roc_se_auth_type type, se_ctx->mac_len = mac_len; se_ctx->hash_type = type; - pdcp_alg = zs_ctx->zuc.otk_ctx.w0.s.alg_type;if (chained_op) opcode_minor = se_ctx->ciph_then_auth ?2 :3 ; -else if (roc_model_is_cn9k ()) - opcode_minor = ((1 <<7 ) | (pdcp_alg <<5 ) |1 );else opcode_minor = ((1 <<4 ) |1 );
@@ -513,29 +421,18 @@ int roc_se_ciph_key_set(struct roc_se_ctx *se_ctx, roc_se_cipher_type type, const uint8_t *key, uint16_t key_len) { - bool chained_op = se_ctx->ciph_then_auth || se_ctx->auth_then_ciph; -struct roc_se_zuc_snow3g_ctx *zs_ctx = &se_ctx->se_ctx.zs_ctx; struct roc_se_context *fctx = &se_ctx->se_ctx.fctx; -struct roc_se_zuc_snow3g_chain_ctx *zs_ch_ctx; +struct roc_se_pdcp_ctx *pctx;uint8_t opcode_minor =0 ; -uint8_t *zuc_const;uint32_t keyx[4 ]; -uint8_t *ci_key; +int key_type;int i, ret;/* For NULL cipher, no processing required. */ if (type ==ROC_SE_PASSTHROUGH )return 0 ; - zs_ch_ctx = &se_ctx->se_ctx.zs_ch_ctx; - -if (roc_model_is_cn9k ()) { - ci_key = zs_ctx->zuc.onk_ctx.ci_key; - zuc_const = zs_ctx->zuc.onk_ctx.zuc_const; - }else { - ci_key = zs_ctx->zuc.otk_ctx.ci_key; - zuc_const = zs_ctx->zuc.otk_ctx.zuc_const; - } + pctx = &se_ctx->se_ctx.pctx;if ((type ==ROC_SE_AES_GCM ) || (type ==ROC_SE_AES_CCM )) se_ctx->template_w4.s.opcode_minor =BIT (5 );
@@ -615,72 +512,38 @@ roc_se_ciph_key_set(struct roc_se_ctx *se_ctx, roc_se_cipher_type type, const ui fctx->enc.enc_cipher =ROC_SE_DES3_CBC ; goto success;case ROC_SE_SNOW3G_UEA2 : -if (chained_op == true) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; - zs_ch_ctx->zuc.onk_ctx.w0.s.state_conf = -ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - zs_ch_ctx->zuc.onk_ctx.w0.s.cipher_type = -ROC_SE_PDCP_CHAIN_ALG_TYPE_SNOW3G ; - zs_ch_ctx->zuc.onk_ctx.w0.s.ci_key_len = key_len; -cpt_snow3g_key_gen (key, keyx); -memcpy (ctx->st.ci_key, keyx, key_len); - }else { - zs_ctx->zuc.otk_ctx.w0.s.key_len =ROC_SE_AES_128_BIT ; - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_SNOW3G ; -cpt_snow3g_key_gen (key, keyx); -memcpy (ci_key, keyx, key_len); - } + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.cipher_type =ROC_SE_PDCP_CHAIN_ALG_TYPE_SNOW3G ; + pctx->w0.s.ci_key_len = key_len; +cpt_snow3g_key_gen (key, keyx); +memcpy (pctx->st.ci_key, keyx, key_len); se_ctx->pdcp_ci_alg =ROC_SE_PDCP_ALG_TYPE_SNOW3G ; se_ctx->zsk_flags =0 ; goto success;case ROC_SE_ZUC_EEA3 : -if (chained_op == true) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; - zs_ch_ctx->zuc.onk_ctx.w0.s.state_conf = -ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - zs_ch_ctx->zuc.onk_ctx.w0.s.cipher_type = -ROC_SE_PDCP_CHAIN_ALG_TYPE_ZUC ; -memcpy (ctx->st.ci_key, key, key_len); -memcpy (ctx->st.ci_zuc_const, zuc_key128,32 ); - zs_ch_ctx->zuc.onk_ctx.w0.s.ci_key_len = key_len; - }else { - ret =cpt_pdcp_key_type_set (zs_ctx, key_len); -if (ret) -return ret; - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_ZUC ; -memcpy (ci_key, key, key_len); -if (key_len ==32 ) { -roc_se_zuc_bytes_swap (ci_key, key_len); -memcpy (zuc_const, zuc_key256,16 ); - }else -memcpy (zuc_const, zuc_key128,32 ); - } - + key_type =cpt_pdcp_chain_key_type_get (key_len); +if (key_type <0 ) +return key_type; + pctx->w0.s.ci_key_len = key_type; + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.cipher_type =ROC_SE_PDCP_CHAIN_ALG_TYPE_ZUC ; +memcpy (pctx->st.ci_key, key, key_len); +if (key_len ==32 ) { +roc_se_zuc_bytes_swap (pctx->st.ci_key, key_len); +memcpy (pctx->st.ci_zuc_const, zuc_key256,16 ); + }else +memcpy (pctx->st.ci_zuc_const, zuc_key128,32 ); se_ctx->pdcp_ci_alg =ROC_SE_PDCP_ALG_TYPE_ZUC ; se_ctx->zsk_flags =0 ; goto success;case ROC_SE_AES_CTR_EEA2 : -if (chained_op == true) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; -int key_type; - key_type =cpt_pdcp_chain_key_type_get (key_len); -if (key_type <0 ) -return key_type; - ctx->w0.s.ci_key_len = key_type; - ctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - ctx->w0.s.cipher_type =ROC_SE_PDCP_ALG_TYPE_AES_CTR ; -memcpy (ctx->st.ci_key, key, key_len); - }else { - zs_ctx->zuc.otk_ctx.w0.s.key_len =ROC_SE_AES_128_BIT ; - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_AES_CTR ; -memcpy (ci_key, key, key_len); - } + key_type =cpt_pdcp_chain_key_type_get (key_len); +if (key_type <0 ) +return key_type; + pctx->w0.s.ci_key_len = key_type; + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.cipher_type =ROC_SE_PDCP_ALG_TYPE_AES_CTR ; +memcpy (pctx->st.ci_key, key, key_len); se_ctx->pdcp_ci_alg =ROC_SE_PDCP_ALG_TYPE_AES_CTR ; se_ctx->zsk_flags =0 ; goto success;
@@ -720,20 +583,6 @@ roc_se_ciph_key_set(struct roc_se_ctx *se_ctx, roc_se_cipher_type type, const uireturn 0 ; } -void -roc_se_ctx_swap (struct roc_se_ctx *se_ctx) -{ -struct roc_se_zuc_snow3g_ctx *zs_ctx = &se_ctx->se_ctx.zs_ctx; - -if (roc_model_is_cn9k ()) -return ; - -if (se_ctx->fc_type ==ROC_SE_PDCP_CHAIN ) -return ; - - zs_ctx->zuc.otk_ctx.w0.u64 =htobe64 (zs_ctx->zuc.otk_ctx.w0.u64); -} -void roc_se_ctx_init (struct roc_se_ctx *roc_se_ctx) {
@@ -745,15 +594,13 @@ roc_se_ctx_init(struct roc_se_ctx *roc_se_ctx)case ROC_SE_FC_GEN : ctx_len =sizeof (struct roc_se_context );break ; +case ROC_SE_PDCP_CHAIN :case ROC_SE_PDCP : - ctx_len =sizeof (struct roc_se_zuc_snow3g_ctx ); + ctx_len =sizeof (struct roc_se_pdcp_ctx );break ;case ROC_SE_KASUMI : ctx_len =sizeof (struct roc_se_kasumi_ctx );break ; -case ROC_SE_PDCP_CHAIN : - ctx_len =sizeof (struct roc_se_zuc_snow3g_chain_ctx ); -break ;case ROC_SE_SM : ctx_len =sizeof (struct roc_se_sm_context );break ;
drivers/common/cnxk/roc_se.h +2 -16
@@ -246,7 +246,7 @@ struct roc_se_onk_zuc_ctx {uint8_t zuc_const[32 ]; }; -struct roc_se_onk_zuc_chain_ctx { +struct roc_se_pdcp_ctx { union { uint64_t u64; struct {
@@ -278,19 +278,6 @@ struct roc_se_onk_zuc_chain_ctx { } st; }; -struct roc_se_zuc_snow3g_chain_ctx { -union { -struct roc_se_onk_zuc_chain_ctx onk_ctx; - } zuc; -}; - -struct roc_se_zuc_snow3g_ctx { -union { -struct roc_se_onk_zuc_ctx onk_ctx; -struct roc_se_otk_zuc_ctx otk_ctx; - } zuc; -}; -struct roc_se_kasumi_ctx {uint8_t reg_A[8 ];uint8_t ci_key[16 ];
@@ -356,8 +343,7 @@ struct roc_se_ctx { } w0;union {struct roc_se_context fctx; -struct roc_se_zuc_snow3g_ctx zs_ctx; -struct roc_se_zuc_snow3g_chain_ctx zs_ch_ctx; +struct roc_se_pdcp_ctx pctx;struct roc_se_kasumi_ctx k_ctx;struct roc_se_sm_context sm_ctx; };
drivers/crypto/cnxk/cnxk_se.h +44 -52
212 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH 20/24 crypto/cnxk: validate the combinations supported in TLS
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Validate the cipher and auth combination to allow only the ones supported by hardware.
--- drivers/crypto/cnxk/cn10k_tls.c | 35 ++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-)
drivers/crypto/cnxk/cn10k_tls.c +34 -1
@@ -17,6 +17,36 @@#include "cnxk_cryptodev_ops.h" #include "cnxk_security.h" +static int +tls_xform_cipher_auth_verify (struct rte_crypto_sym_xform *cipher_xform, +struct rte_crypto_sym_xform *auth_xform) +{ +enum rte_crypto_cipher_algorithm c_algo = cipher_xform->cipher.algo; +enum rte_crypto_auth_algorithm a_algo = auth_xform->auth.algo; +int ret = -ENOTSUP ; + +switch (c_algo) { +case RTE_CRYPTO_CIPHER_NULL : +if ((a_algo ==RTE_CRYPTO_AUTH_MD5_HMAC ) || (a_algo ==RTE_CRYPTO_AUTH_SHA1_HMAC ) || + (a_algo ==RTE_CRYPTO_AUTH_SHA256_HMAC )) + ret =0 ; +break ; +case RTE_CRYPTO_CIPHER_3DES_CBC : +if (a_algo ==RTE_CRYPTO_AUTH_SHA1_HMAC ) + ret =0 ; +break ; +case RTE_CRYPTO_CIPHER_AES_CBC : +if ((a_algo ==RTE_CRYPTO_AUTH_SHA1_HMAC ) || + (a_algo ==RTE_CRYPTO_AUTH_SHA256_HMAC )) + ret =0 ; +break ; +default : +break ; + } + +return ret; +} +static int tls_xform_cipher_verify (struct rte_crypto_sym_xform *crypto_xform) {
@@ -138,7 +168,10 @@ cnxk_tls_xform_verify(struct rte_security_tls_record_xform *tls_xform, ret =tls_xform_cipher_verify (cipher_xform);if (!ret) -return tls_xform_auth_verify (auth_xform); + ret =tls_xform_auth_verify (auth_xform); + +if (cipher_xform && !ret) +return tls_xform_cipher_auth_verify (cipher_xform, auth_xform);return ret; }
Signature · 1 line
2.25.1
PATCH 21/24 crypto/cnxk: use a single function for opad ipad
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Use a single function for opad and ipad generation for IPsec, TLS and flexi crypto.
--- drivers/common/cnxk/cnxk_security.c | 65 ++++++----------------------- drivers/common/cnxk/cnxk_security.h | 5 --- drivers/common/cnxk/roc_se.c | 48 ++++++++++++++------- drivers/common/cnxk/roc_se.h | 9 ++++ drivers/common/cnxk/version.map | 2 +- drivers/crypto/cnxk/cn10k_tls.c | 8 +++- 6 files changed, 61 insertions(+), 76 deletions(-)
drivers/common/cnxk/cnxk_security.c +13 -52
@@ -8,55 +8,9 @@#include "roc_api.h" -void -cnxk_sec_opad_ipad_gen (struct rte_crypto_sym_xform *auth_xform,uint8_t *hmac_opad_ipad, -bool is_tls) -{ -const uint8_t *key = auth_xform->auth.key.data; -uint32_t length = auth_xform->auth.key.length; -uint8_t opad[128 ] = {[0 ...127 ] =0x5c }; -uint8_t ipad[128 ] = {[0 ...127 ] =0x36 }; -uint32_t i; - -/* HMAC OPAD and IPAD */ -for (i =0 ; i <128 && i < length; i++) { - opad[i] = opad[i] ^ key[i]; - ipad[i] = ipad[i] ^ key[i]; - } - -/* Precompute hash of HMAC OPAD and IPAD to avoid -* per packet computation -*/ -switch (auth_xform->auth.algo) { -case RTE_CRYPTO_AUTH_MD5_HMAC : -roc_hash_md5_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ]); -roc_hash_md5_gen (ipad, (uint32_t *)&hmac_opad_ipad[is_tls ?64 :24 ]); -break ; -case RTE_CRYPTO_AUTH_SHA1_HMAC : -roc_hash_sha1_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ]); -roc_hash_sha1_gen (ipad, (uint32_t *)&hmac_opad_ipad[is_tls ?64 :24 ]); -break ; -case RTE_CRYPTO_AUTH_SHA256_HMAC : -roc_hash_sha256_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ],256 ); -roc_hash_sha256_gen (ipad, (uint32_t *)&hmac_opad_ipad[64 ],256 ); -break ; -case RTE_CRYPTO_AUTH_SHA384_HMAC : -roc_hash_sha512_gen (opad, (uint64_t *)&hmac_opad_ipad[0 ],384 ); -roc_hash_sha512_gen (ipad, (uint64_t *)&hmac_opad_ipad[64 ],384 ); -break ; -case RTE_CRYPTO_AUTH_SHA512_HMAC : -roc_hash_sha512_gen (opad, (uint64_t *)&hmac_opad_ipad[0 ],512 ); -roc_hash_sha512_gen (ipad, (uint64_t *)&hmac_opad_ipad[64 ],512 ); -break ; -default : -break ; - } -} -static int -ot_ipsec_sa_common_param_fill (union roc_ot_ipsec_sa_word2 *w2, -uint8_t *cipher_key,uint8_t *salt_key, -uint8_t *hmac_opad_ipad, +ot_ipsec_sa_common_param_fill (union roc_ot_ipsec_sa_word2 *w2,uint8_t *cipher_key, +uint8_t *salt_key,uint8_t *hmac_opad_ipad,struct rte_security_ipsec_xform *ipsec_xfrm,struct rte_crypto_sym_xform *crypto_xfrm) {
@@ -192,7 +146,9 @@ ot_ipsec_sa_common_param_fill(union roc_ot_ipsec_sa_word2 *w2,const uint8_t *auth_key = auth_xfrm->auth.key.data;roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else { -cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad, false); +roc_se_hmac_opad_ipad_gen (w2->s.auth_type, auth_xfrm->auth.key.data, + auth_xfrm->auth.key.length, &hmac_opad_ipad[0 ], +ROC_SE_IPSEC ); } tmp_key = (uint64_t *)hmac_opad_ipad;
@@ -741,7 +697,8 @@ onf_ipsec_sa_common_param_fill(struct roc_ie_onf_sa_ctl *ctl, uint8_t *salt, key = cipher_xfrm->cipher.key.data; length = cipher_xfrm->cipher.key.length; -cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad, false); +roc_se_hmac_opad_ipad_gen (ctl->auth_type, auth_xfrm->auth.key.data, + auth_xfrm->auth.key.length, hmac_opad_ipad,ROC_SE_IPSEC ); }switch (length) {
@@ -1374,7 +1331,9 @@ cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad, false); +roc_se_hmac_opad_ipad_gen ( + out_sa->common_sa.ctl.auth_type, auth_xform->auth.key.data, + auth_xform->auth.key.length, &hmac_opad_ipad[0 ],ROC_SE_IPSEC ); } }
@@ -1441,7 +1400,9 @@ cnxk_on_ipsec_inb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad, false); +roc_se_hmac_opad_ipad_gen ( + in_sa->common_sa.ctl.auth_type, auth_xform->auth.key.data, + auth_xform->auth.key.length, &hmac_opad_ipad[0 ],ROC_SE_IPSEC ); } }
drivers/common/cnxk/cnxk_security.h +0 -5
@@ -68,9 +68,4 @@ int __roc_api cnxk_on_ipsec_inb_sa_create(struct rte_security_ipsec_xform *ipsec int __roc_api cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipsec,struct rte_crypto_sym_xform *crypto_xform,struct roc_ie_on_outb_sa *out_sa); - -__rte_internal -void cnxk_sec_opad_ipad_gen(struct rte_crypto_sym_xform *auth_xform, uint8_t *hmac_opad_ipad, -bool is_tls); -#endif /* _CNXK_SECURITY_H__ */
drivers/common/cnxk/roc_se.c +32 -16
81 lines not on this page · raw message
drivers/common/cnxk/roc_se.h +9 -0
@@ -191,6 +191,12 @@ typedef enum { ROC_SE_PDCP_MAC_LEN_128_BIT = 0x3 } roc_se_pdcp_mac_len_type; +typedef enum { +ROC_SE_IPSEC =0x0 , +ROC_SE_TLS =0x1 , +ROC_SE_FC =0x2 , +}roc_se_op_type ; +struct roc_se_enc_context {uint64_t iv_source :1 ;uint64_t aes_key :2 ;
@@ -401,4 +407,7 @@ int __roc_api roc_se_ciph_key_set(struct roc_se_ctx *se_ctx, roc_se_cipher_type void __roc_api roc_se_ctx_swap(struct roc_se_ctx *se_ctx); void __roc_api roc_se_ctx_init(struct roc_se_ctx *se_ctx); +void __roc_api roc_se_hmac_opad_ipad_gen(roc_se_auth_type auth_type, const uint8_t *key, +uint16_t length,uint8_t *opad_ipad, +roc_se_op_type op_type);#endif /* __ROC_SE_H__ */
drivers/common/cnxk/version.map +1 -1
@@ -1,7 +1,6 @@ INTERNAL { global: - cnxk_sec_opad_ipad_gen; cnxk_ipsec_icvlen_get; cnxk_ipsec_ivlen_get; cnxk_ipsec_outb_rlens_get;
@@ -472,6 +471,7 @@ INTERNAL { roc_plt_init; roc_plt_init_cb_register; roc_plt_lmt_validate; + roc_se_hmac_opad_ipad_gen; roc_sso_dev_fini; roc_sso_dev_init; roc_sso_dump;
drivers/crypto/cnxk/cn10k_tls.c +6 -2
@@ -376,7 +376,9 @@ tls_read_sa_fill(struct roc_ie_ot_tls_read_sa *read_sa,else return -EINVAL ; -cnxk_sec_opad_ipad_gen (auth_xfrm, read_sa->opad_ipad, true); +roc_se_hmac_opad_ipad_gen (read_sa->w2.s.mac_select, auth_xfrm->auth.key.data, + auth_xfrm->auth.key.length, read_sa->opad_ipad,ROC_SE_TLS ); + tmp = (uint64_t *)read_sa->opad_ipad;for (i =0 ; i < (int )(ROC_CTX_MAX_OPAD_IPAD_LEN /sizeof (uint64_t )); i++) tmp[i] =rte_be_to_cpu_64 (tmp[i]);
@@ -503,7 +505,9 @@ tls_write_sa_fill(struct roc_ie_ot_tls_write_sa *write_sa,else return -EINVAL ; -cnxk_sec_opad_ipad_gen (auth_xfrm, write_sa->opad_ipad, true); +roc_se_hmac_opad_ipad_gen (write_sa->w2.s.mac_select, auth_xfrm->auth.key.data, + auth_xfrm->auth.key.length, write_sa->opad_ipad, +ROC_SE_TLS ); } tmp_key = (uint64_t *)write_sa->opad_ipad;
Signature · 1 line
2.25.1
PATCH 22/24 crypto/cnxk: add support for TLS 1.3
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add support for TLS-1.3.
--- drivers/common/cnxk/roc_ie_ot_tls.h | 50 +++++-- drivers/crypto/cnxk/cn10k_cryptodev_sec.h | 3 +- drivers/crypto/cnxk/cn10k_tls.c | 159 +++++++++++++--------- 3 files changed, 136 insertions(+), 76 deletions(-)
drivers/common/cnxk/roc_ie_ot_tls.h +38 -12
@@ -17,8 +17,10 @@ (PLT_ALIGN_CEIL (ROC_IE_OT_TLS_AR_WIN_SIZE_MAX ,BITS_PER_LONG_LONG ) /BITS_PER_LONG_LONG ) /* CN10K TLS opcodes */ -#define ROC_IE_OT_TLS_MAJOR_OP_RECORD_ENC 0x16UL -#define ROC_IE_OT_TLS_MAJOR_OP_RECORD_DEC 0x17UL +#define ROC_IE_OT_TLS_MAJOR_OP_RECORD_ENC 0x16UL +#define ROC_IE_OT_TLS_MAJOR_OP_RECORD_DEC 0x17UL +#define ROC_IE_OT_TLS13_MAJOR_OP_RECORD_ENC 0x18UL +#define ROC_IE_OT_TLS13_MAJOR_OP_RECORD_DEC 0x19UL#define ROC_IE_OT_TLS_CTX_MAX_OPAD_IPAD_LEN 128#define ROC_IE_OT_TLS_CTX_MAX_KEY_IV_LEN 48
@@ -42,6 +44,7 @@ enum roc_ie_ot_tls_cipher_type {enum roc_ie_ot_tls_ver {ROC_IE_OT_TLS_VERSION_TLS_12 =1 ,ROC_IE_OT_TLS_VERSION_DTLS_12 =2 , +ROC_IE_OT_TLS_VERSION_TLS_13 =3 , };enum roc_ie_ot_tls_aes_key_len {
@@ -131,11 +134,23 @@ struct roc_ie_ot_tls_read_sa {/* Word4 - Word9 */ uint8_t cipher_key[ROC_IE_OT_TLS_CTX_MAX_KEY_IV_LEN ]; -/* Word10 - Word25 */ -uint8_t opad_ipad[ROC_IE_OT_TLS_CTX_MAX_OPAD_IPAD_LEN ]; +union { +struct { +/* Word10 */ +uint64_t w10_rsvd6; + +/* Word11 - Word25 */ +struct roc_ie_ot_tls_read_ctx_update_reg ctx; + } tls_13; + +struct { +/* Word10 - Word25 */ +uint8_t opad_ipad[ROC_IE_OT_TLS_CTX_MAX_OPAD_IPAD_LEN ]; -/* Word26 - Word32 */ -struct roc_ie_ot_tls_read_ctx_update_reg ctx; +/* Word26 - Word95 */ +struct roc_ie_ot_tls_read_ctx_update_reg ctx; + } tls_12; + }; };struct roc_ie_ot_tls_write_sa {
@@ -187,13 +202,24 @@ struct roc_ie_ot_tls_write_sa {/* Word4 - Word9 */ uint8_t cipher_key[ROC_IE_OT_TLS_CTX_MAX_KEY_IV_LEN ]; -/* Word10 - Word25 */ -uint8_t opad_ipad[ROC_IE_OT_TLS_CTX_MAX_OPAD_IPAD_LEN ]; +union { +struct { +/* Word10 */ +uint64_t w10_rsvd7; + +uint64_t seq_num; + } tls_13; + +struct { +/* Word10 - Word25 */ +uint8_t opad_ipad[ROC_IE_OT_TLS_CTX_MAX_OPAD_IPAD_LEN ]; -/* Word26 */ -uint64_t w26_rsvd7; +/* Word26 */ +uint64_t w26_rsvd7; -/* Word27 */ - uint64_t seq_num; +/* Word27 */ +uint64_t seq_num; + } tls_12; + }; };#endif /* __ROC_IE_OT_TLS_H__ */
drivers/crypto/cnxk/cn10k_cryptodev_sec.h +1 -2
@@ -31,8 +31,7 @@ struct cn10k_sec_session { } ipsec;struct {uint8_t enable_padding :1 ; -uint8_t hdr_len :4 ; -uint8_t rvsd :3 ; +uint8_t rvsd :7 ;bool is_write; } tls; };
drivers/crypto/cnxk/cn10k_tls.c +97 -62
307 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH 23/24 crypto/cnxk: add TLS 1.3 capability
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add TLS 1.3 record read and write capability
--- doc/guides/rel_notes/release_24_03.rst | 4 +- .../crypto/cnxk/cnxk_cryptodev_capabilities.c | 92 +++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-)
doc/guides/rel_notes/release_24_03.rst +2 -2
@@ -58,8 +58,8 @@ New Features * **Updated Marvell cnxk crypto driver.** * Added support for Rx inject in crypto_cn10k. - * Added support for TLS record processing in crypto_cn10k. Supports TLS 1.2 - and DTLS 1.2. + * Added support for TLS record processing in crypto_cn10k. Supports TLS 1.2, + DTLS 1.2 and TLS 1.3. * Added PMD API to allow raw submission of instructions to CPT. Removed Items
drivers/crypto/cnxk/cnxk_cryptodev_capabilities.c +92 -0
122 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH 24/24 crypto/cnxk: add CPT SG mode debug
In reply to Anoob JosephFrom: Tejasree Kondoj <[email protected]>
Adding CPT SG mode debug dump.
--- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 135 +++++++++++++++++++++- drivers/crypto/cnxk/cnxk_cryptodev_ops.h | 7 ++ 2 files changed, 141 insertions(+), 1 deletion(-)
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +134 -1
@@ -2,9 +2,10 @@* Copyright(C) 2021 Marvell. */ -#include <rte_cryptodev.h> #include <cryptodev_pmd.h> +#include <rte_cryptodev.h> #include <rte_event_crypto_adapter.h> +#include <rte_hexdump.h> #include <rte_ip.h> #include <ethdev_driver.h>
@@ -103,6 +104,104 @@ cpt_sec_ipsec_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op,return ret; } +#ifdef CPT_INST_DEBUG_ENABLE +static inline void +cpt_request_data_sgv2_mode_dump (uint8_t *in_buffer,bool glist,uint16_t components) +{ +struct roc_se_buf_ptr list_ptr[ROC_MAX_SG_CNT ]; +const char *list = glist ?"glist" :"slist" ; +struct roc_sg2list_comp *sg_ptr =NULL ; +uint16_t list_cnt =0 ; +char suffix[64 ]; +int i, j; + + sg_ptr = (void *)in_buffer; +for (i =0 ; i < components; i++) { +for (j =0 ; j < sg_ptr->u.s.valid_segs; j++) { + list_ptr[i *3 + j].size = sg_ptr->u.s.len[j]; + list_ptr[i *3 + j].vaddr = (void *)sg_ptr->ptr[j]; + list_ptr[i *3 + j].vaddr = list_ptr[i *3 + j].vaddr; + list_cnt++; + } + sg_ptr++; + } + +printf ("Current %s: %u\n" , list, list_cnt); + +for (i =0 ; i < list_cnt; i++) { +snprintf (suffix,sizeof (suffix),"%s[%d]: vaddr 0x%" PRIx64", vaddr %p len %u" , + list, i, (uint64_t )list_ptr[i].vaddr, list_ptr[i].vaddr, list_ptr[i].size); +rte_hexdump (stdout, suffix, list_ptr[i].vaddr, list_ptr[i].size); + } +} + +static inline void +cpt_request_data_sg_mode_dump (uint8_t *in_buffer,bool glist) +{ +struct roc_se_buf_ptr list_ptr[ROC_MAX_SG_CNT ]; +const char *list = glist ?"glist" :"slist" ; +struct roc_sglist_comp *sg_ptr =NULL ; +uint16_t list_cnt, components; +char suffix[64 ]; +int i; + + sg_ptr = (void *)(in_buffer +8 ); + list_cnt =rte_be_to_cpu_16 ((((uint16_t *)in_buffer)[2 ])); +if (!glist) { + components = list_cnt /4 ; +if (list_cnt %4 ) + components++; + sg_ptr += components; + list_cnt =rte_be_to_cpu_16 ((((uint16_t *)in_buffer)[3 ])); + } + +printf ("Current %s: %u\n" , list, list_cnt); + components = list_cnt /4 ; +for (i =0 ; i < components; i++) { + list_ptr[i *4 +0 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[0 ]); + list_ptr[i *4 +1 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[1 ]); + list_ptr[i *4 +2 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[2 ]); + list_ptr[i *4 +3 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[3 ]); + list_ptr[i *4 +0 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[0 ]); + list_ptr[i *4 +1 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[1 ]); + list_ptr[i *4 +2 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[2 ]); + list_ptr[i *4 +3 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[3 ]); + list_ptr[i *4 +0 ].vaddr = list_ptr[i *4 +0 ].vaddr; + list_ptr[i *4 +1 ].vaddr = list_ptr[i *4 +1 ].vaddr; + list_ptr[i *4 +2 ].vaddr = list_ptr[i *4 +2 ].vaddr; + list_ptr[i *4 +3 ].vaddr = list_ptr[i *4 +3 ].vaddr; + sg_ptr++; + } + + components = list_cnt %4 ; +switch (components) { +case 3 : + list_ptr[i *4 +2 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[2 ]); + list_ptr[i *4 +2 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[2 ]); + list_ptr[i *4 +2 ].vaddr = list_ptr[i *4 +2 ].vaddr; +/* FALLTHROUGH */ +case 2 : + list_ptr[i *4 +1 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[1 ]); + list_ptr[i *4 +1 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[1 ]); + list_ptr[i *4 +1 ].vaddr = list_ptr[i *4 +1 ].vaddr; +/* FALLTHROUGH */ +case 1 : + list_ptr[i *4 +0 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[0 ]); + list_ptr[i *4 +0 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[0 ]); + list_ptr[i *4 +0 ].vaddr = list_ptr[i *4 +0 ].vaddr; +break ; +default : +break ; + } + +for (i =0 ; i < list_cnt; i++) { +snprintf (suffix,sizeof (suffix),"%s[%d]: vaddr 0x%" PRIx64", vaddr %p len %u" , + list, i, (uint64_t )list_ptr[i].vaddr, list_ptr[i].vaddr, list_ptr[i].size); +rte_hexdump (stdout, suffix, list_ptr[i].vaddr, list_ptr[i].size); + } +} +#endif + static __rte_always_inline int __rte_hot cpt_sec_tls_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op, struct cn10k_sec_session *sess, struct cpt_inst_s *inst,
@@ -205,6 +304,31 @@ cn10k_cpt_fill_inst(struct cnxk_cpt_qp *qp, struct rte_crypto_op *ops[], struct inst[0 ].w7.u64 = w7; +#ifdef CPT_INST_DEBUG_ENABLE + infl_req->dptr = (uint8_t *)inst[0 ].dptr; + infl_req->rptr = (uint8_t *)inst[0 ].rptr; + infl_req->is_sg_ver2 = is_sg_ver2; + infl_req->scatter_sz = inst[0 ].w6.s.scatter_sz; + infl_req->opcode_major = inst[0 ].w4.s.opcode_major; + +rte_hexdump (stdout,"cptr" , (void *)(uint64_t )inst[0 ].w7.s.cptr,128 ); +printf ("major opcode:%d\n" , inst[0 ].w4.s.opcode_major); +printf ("minor opcode:%d\n" , inst[0 ].w4.s.opcode_minor); +printf ("param1:%d\n" , inst[0 ].w4.s.param1); +printf ("param2:%d\n" , inst[0 ].w4.s.param2); +printf ("dlen:%d\n" , inst[0 ].w4.s.dlen); + +if (is_sg_ver2) { +cpt_request_data_sgv2_mode_dump ((void *)inst[0 ].dptr,1 , inst[0 ].w5.s.gather_sz); +cpt_request_data_sgv2_mode_dump ((void *)inst[0 ].rptr,0 , inst[0 ].w6.s.scatter_sz); + }else { +if (infl_req->opcode_major >>7 ) { +cpt_request_data_sg_mode_dump ((void *)inst[0 ].dptr,1 ); +cpt_request_data_sg_mode_dump ((void *)inst[0 ].dptr,0 ); + } + } +#endif +return 1 ; }
@@ -935,6 +1059,15 @@ cn10k_cpt_dequeue_post_process(struct cnxk_cpt_qp *qp, struct rte_crypto_op *cop }if (likely (compcode ==CPT_COMP_GOOD )) { +#ifdef CPT_INST_DEBUG_ENABLE +if (infl_req->is_sg_ver2) +cpt_request_data_sgv2_mode_dump (infl_req->rptr,0 , infl_req->scatter_sz); +else { +if (infl_req->opcode_major >>7 ) +cpt_request_data_sg_mode_dump (infl_req->dptr,0 ); + } +#endif +if (unlikely (uc_compcode)) {if (uc_compcode ==ROC_SE_ERR_GC_ICV_MISCOMPARE ) cop->status =RTE_CRYPTO_OP_STATUS_AUTH_FAILED ;
drivers/crypto/cnxk/cnxk_cryptodev_ops.h +7 -0
@@ -51,6 +51,13 @@ struct cpt_inflight_req { };void *mdata;uint8_t op_flags; +#ifdef CPT_INST_DEBUG_ENABLE +uint8_t scatter_sz; +uint8_t opcode_major; +uint8_t is_sg_ver2; +uint8_t *dptr; +uint8_t *rptr; +#endif void *qp; }__rte_aligned (ROC_ALIGN );
Signature · 1 line
2.25.1
v2 cover Fixes and improvements in crypto cnxk
In reply to Anoob JosephAdd following features
- TLS record processing offload (TLS 1.2-1.3, DTLS 1.2)
- Rx inject to allow lookaside packets to be injected to ethdev Rx
- Use PDCP_CHAIN opcode instead of PDCP opcode for cipher-only and auth only cases
- PMD API to submit instructions directly to hardware
Changes in v2
- Addressed checkpatch issue
- Addressed build error with stdatomic
Aakash Sasidharan (1):
crypto/cnxk: enable digest gen for zero len input
Akhil Goyal (1):
common/cnxk: fix memory leak
Anoob Joseph (6):
crypto/cnxk: use common macro
crypto/cnxk: return microcode completion code common/cnxk: update opad-ipad gen to handle TLS common/cnxk: add TLS record contexts crypto/cnxk: separate IPsec from security common code crypto/cnxk: add PMD APIs for raw submission to CPT
Gowrishankar Muthukrishnan (1):
crypto/cnxk: fix ECDH pubkey verify in cn9k
Rahul Bhansali (2):
common/cnxk: add Rx inject configs
crypto/cnxk: Rx inject config update
Tejasree Kondoj (3):
crypto/cnxk: fallback to SG if headroom is not available crypto/cnxk: replace PDCP with PDCP chain opcode crypto/cnxk: add CPT SG mode debug
Vidya Sagar Velumuri (10):
crypto/cnxk: enable Rx inject in security lookaside crypto/cnxk: enable Rx inject for 103 crypto/cnxk: rename security caps as IPsec security caps crypto/cnxk: add TLS record session ops crypto/cnxk: add TLS record datapath handling crypto/cnxk: add TLS capability
crypto/cnxk: validate the combinations supported in TLS crypto/cnxk: use a single function for opad ipad crypto/cnxk: add support for TLS 1.3 crypto/cnxk: add TLS 1.3 capability
doc/api/doxy-api-index.md | 1 + doc/api/doxy-api.conf.in | 1 + doc/guides/cryptodevs/cnxk.rst | 12 + doc/guides/rel_notes/release_24_03.rst | 6 + drivers/common/cnxk/cnxk_security.c | 65 +- drivers/common/cnxk/cnxk_security.h | 15 +- drivers/common/cnxk/hw/cpt.h | 12 +- drivers/common/cnxk/roc_cpt.c | 14 +- drivers/common/cnxk/roc_cpt.h | 7 +- drivers/common/cnxk/roc_cpt_priv.h | 2 +- drivers/common/cnxk/roc_idev.c | 44 + drivers/common/cnxk/roc_idev.h | 5 + drivers/common/cnxk/roc_idev_priv.h | 6 + drivers/common/cnxk/roc_ie_ot.c | 14 +- drivers/common/cnxk/roc_ie_ot_tls.h | 225 +++++ drivers/common/cnxk/roc_mbox.h | 2 + drivers/common/cnxk/roc_nix.c | 2 + drivers/common/cnxk/roc_nix_inl.c | 2 +- drivers/common/cnxk/roc_nix_inl_dev.c | 2 +- drivers/common/cnxk/roc_se.c | 379 +++----- drivers/common/cnxk/roc_se.h | 38 +- drivers/common/cnxk/version.map | 5 + drivers/crypto/cnxk/cn10k_cryptodev.c | 2 +- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 401 ++++++++- drivers/crypto/cnxk/cn10k_cryptodev_ops.h | 11 + drivers/crypto/cnxk/cn10k_cryptodev_sec.c | 134 +++ drivers/crypto/cnxk/cn10k_cryptodev_sec.h | 68 ++ drivers/crypto/cnxk/cn10k_ipsec.c | 134 +-- drivers/crypto/cnxk/cn10k_ipsec.h | 38 +- drivers/crypto/cnxk/cn10k_ipsec_la_ops.h | 19 +- drivers/crypto/cnxk/cn10k_tls.c | 830 ++++++++++++++++++ drivers/crypto/cnxk/cn10k_tls.h | 35 + drivers/crypto/cnxk/cn10k_tls_ops.h | 322 +++++++ drivers/crypto/cnxk/cn9k_cryptodev_ops.c | 68 +- drivers/crypto/cnxk/cn9k_cryptodev_ops.h | 62 ++ drivers/crypto/cnxk/cn9k_ipsec_la_ops.h | 16 +- drivers/crypto/cnxk/cnxk_cryptodev.c | 3 + drivers/crypto/cnxk/cnxk_cryptodev.h | 24 +- .../crypto/cnxk/cnxk_cryptodev_capabilities.c | 375 +++++++- drivers/crypto/cnxk/cnxk_cryptodev_devargs.c | 31 + drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 128 ++- drivers/crypto/cnxk/cnxk_cryptodev_ops.h | 7 + drivers/crypto/cnxk/cnxk_se.h | 98 +-- drivers/crypto/cnxk/cnxk_sg.h | 4 +- drivers/crypto/cnxk/meson.build | 4 +- drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h | 46 + drivers/crypto/cnxk/version.map | 3 + 47 files changed, 3016 insertions(+), 706 deletions(-) create mode 100644 drivers/common/cnxk/roc_ie_ot_tls.h create mode 100644 drivers/crypto/cnxk/cn10k_cryptodev_sec.c create mode 100644 drivers/crypto/cnxk/cn10k_cryptodev_sec.h create mode 100644 drivers/crypto/cnxk/cn10k_tls.c create mode 100644 drivers/crypto/cnxk/cn10k_tls.h create mode 100644 drivers/crypto/cnxk/cn10k_tls_ops.h create mode 100644 drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h
Signature · 1 line
2.25.1
PATCH v2 1/24 common/cnxk: fix memory leak
From: Akhil Goyal <[email protected]>
dev_init() acquires some resources which need to be cleaned in case a failure is observed afterwards.
--- drivers/common/cnxk/roc_cpt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/common/cnxk/roc_cpt.c +2 -1
@@ -756,7 +756,7 @@ roc_cpt_dev_init(struct roc_cpt *roc_cpt) rc =dev_init (dev, pci_dev);if (rc) {plt_err ("Failed to init roc device" ); - goto fail; +return rc; } cpt->pci_dev = pci_dev;
@@ -788,6 +788,7 @@ roc_cpt_dev_init(struct roc_cpt *roc_cpt)return 0 ; fail: +dev_fini (dev, pci_dev);return rc; }
Signature · 1 line
2.25.1
PATCH v2 2/24 crypto/cnxk: use common macro
In reply to Anoob JosephHaving different macros for same purpose may cause issues if one is updated without updating the other. Use same macro by including the header.
--- drivers/crypto/cnxk/cnxk_cryptodev.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/crypto/cnxk/cnxk_cryptodev.h +3 -3
@@ -8,12 +8,12 @@#include <rte_cryptodev.h> #include <rte_security.h> +#include "roc_ae.h" #include "roc_cpt.h" #define CNXK_CPT_MAX_CAPS 55#define CNXK_SEC_CRYPTO_MAX_CAPS 16#define CNXK_SEC_MAX_CAPS 9 -#define CNXK_AE_EC_ID_MAX 9/** * Device private data */
@@ -23,8 +23,8 @@ struct cnxk_cpt_vf {struct rte_cryptodev_capabilities sec_crypto_caps[CNXK_SEC_CRYPTO_MAX_CAPS ];struct rte_security_capability sec_caps[CNXK_SEC_MAX_CAPS ]; -uint64_t cnxk_fpm_iova[CNXK_AE_EC_ID_MAX ]; -struct roc_ae_ec_group *ec_grp[CNXK_AE_EC_ID_MAX ]; +uint64_t cnxk_fpm_iova[ROC_AE_EC_ID_PMAX ]; +struct roc_ae_ec_group *ec_grp[ROC_AE_EC_ID_PMAX ];uint16_t max_qps_limit; };
Signature · 1 line
2.25.1
PATCH v2 3/24 crypto/cnxk: fallback to SG if headroom is not available
In reply to Anoob JosephFrom: Tejasree Kondoj <[email protected]>
Falling back to SG mode for cn9k lookaside IPsec
if headroom is not available.
--- drivers/crypto/cnxk/cn9k_ipsec_la_ops.h | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
drivers/crypto/cnxk/cn9k_ipsec_la_ops.h +1 -7
@@ -82,19 +82,13 @@ process_outb_sa(struct cpt_qp_meta_info *m_info, struct rte_crypto_op *cop, extend_tail = rlen - dlen; pkt_len += extend_tail; -if (likely (m_src->next ==NULL )) { +if (likely ((m_src->next ==NULL ) && (hdr_len <= data_off))) {if (unlikely (extend_tail >rte_pktmbuf_tailroom (m_src))) {plt_dp_err ("Not enough tail room (required: %d, available: %d)" , extend_tail,rte_pktmbuf_tailroom (m_src));return -ENOMEM ; } -if (unlikely (hdr_len > data_off)) { -plt_dp_err ("Not enough head room (required: %d, available: %d)" , hdr_len, -rte_pktmbuf_headroom (m_src)); -return -ENOMEM ; - } - m_src->data_len = pkt_len; hdr =PLT_PTR_ADD (m_src->buf_addr, data_off - hdr_len);
Signature · 1 line
2.25.1
PATCH v2 4/24 crypto/cnxk: return microcode completion code
In reply to Anoob JosephReturn microcode completion code in case of errors. This allows applications to check the failure reasons in more granularity.
--- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +2 -0
@@ -823,6 +823,7 @@ cn10k_cpt_sec_post_process(struct rte_crypto_op *cop, struct cpt_cn10k_res_s *rebreak ;default : cop->status =RTE_CRYPTO_OP_STATUS_ERROR ; + cop->aux_flags = res->uc_compcode;return ; }
@@ -884,6 +885,7 @@ cn10k_cpt_dequeue_post_process(struct cnxk_cpt_qp *qp,plt_dp_info ("Request failed with microcode error" );plt_dp_info ("MC completion code 0x%x" , res->uc_compcode); + cop->aux_flags = uc_compcode; goto temp_sess_free; }
Signature · 1 line
2.25.1
PATCH v2 5/24 crypto/cnxk: fix ECDH pubkey verify in cn9k
In reply to Anoob JosephFrom: Gowrishankar Muthukrishnan <[email protected]>
Fix ECDH pubkey verify in cn9k.
--- drivers/crypto/cnxk/cn9k_cryptodev_ops.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/crypto/cnxk/cn9k_cryptodev_ops.c +11 -1
@@ -578,7 +578,17 @@ cn9k_cpt_dequeue_post_process(struct cnxk_cpt_qp *qp, struct rte_crypto_op *cop,if (unlikely (res->uc_compcode)) {if (res->uc_compcode ==ROC_SE_ERR_GC_ICV_MISCOMPARE ) cop->status =RTE_CRYPTO_OP_STATUS_AUTH_FAILED ; -else +else if (cop->type ==RTE_CRYPTO_OP_TYPE_ASYMMETRIC && + cop->sess_type ==RTE_CRYPTO_OP_WITH_SESSION && + cop->asym->ecdh.ke_type ==RTE_CRYPTO_ASYM_KE_PUB_KEY_VERIFY ) { +if (res->uc_compcode ==ROC_AE_ERR_ECC_POINT_NOT_ON_CURVE ) { + cop->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return ; + }else if (res->uc_compcode ==ROC_AE_ERR_ECC_PAI ) { + cop->status =RTE_CRYPTO_OP_STATUS_SUCCESS ; +return ; + } + }else cop->status =RTE_CRYPTO_OP_STATUS_ERROR ;plt_dp_info ("Request failed with microcode error" );
Signature · 1 line
2.25.1
PATCH v2 6/24 crypto/cnxk: enable digest gen for zero len input
In reply to Anoob JosephFrom: Aakash Sasidharan <[email protected]>
With zero length input, digest generation fails with incorrect value. Fix this by completely avoiding the gather component when the input packet has zero data length.
--- drivers/crypto/cnxk/cnxk_se.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/cnxk/cnxk_se.h +1 -1
@@ -2479,7 +2479,7 @@ prepare_iov_from_pkt(struct rte_mbuf *pkt, struct roc_se_iov_ptr *iovec, uint32_void *seg_data =NULL ;int32_t seg_size =0 ; -if (!pkt) { +if (!pkt || pkt->data_len ==0 ) { iovec->buf_cnt =0 ;return 0 ; }
Signature · 1 line
2.25.1
PATCH v2 7/24 crypto/cnxk: enable Rx inject in security lookaside
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add Rx inject fastpath API.
Add devargs to specify an LF to be used for Rx inject. When the RX inject feature flag is enabled:
1. Reserve a CPT LF to use for RX Inject mode.
2. Enable RXC and disable full packet mode for that LF.
--- doc/guides/cryptodevs/cnxk.rst | 12 ++ doc/guides/rel_notes/release_24_03.rst | 3 + drivers/common/cnxk/hw/cpt.h | 9 ++ drivers/common/cnxk/roc_cpt.c | 11 +- drivers/common/cnxk/roc_cpt.h | 3 +- drivers/common/cnxk/roc_cpt_priv.h | 2 +- drivers/common/cnxk/roc_ie_ot.c | 14 +-- drivers/common/cnxk/roc_mbox.h | 2 + drivers/common/cnxk/roc_nix_inl.c | 2 +- drivers/common/cnxk/roc_nix_inl_dev.c | 2 +- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 124 +++++++++++++++++++ drivers/crypto/cnxk/cn10k_cryptodev_ops.h | 8 ++ drivers/crypto/cnxk/cn10k_ipsec.c | 4 + drivers/crypto/cnxk/cn10k_ipsec.h | 2 + drivers/crypto/cnxk/cnxk_cryptodev.c | 3 + drivers/crypto/cnxk/cnxk_cryptodev.h | 3 + drivers/crypto/cnxk/cnxk_cryptodev_devargs.c | 31 +++++ drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 27 +++- drivers/crypto/cnxk/version.map | 3 + 19 files changed, 250 insertions(+), 15 deletions(-)
doc/guides/cryptodevs/cnxk.rst +12 -0
@@ -187,6 +187,18 @@ Runtime Config Options With the above configuration, the number of maximum queue pairs supported by the device is limited to 4. +- ``LF ID for RX injection in case of fallback mechanism`` (default ``60``) + + LF ID for RX Injection in fallback mechanism of security. + Can be configured during runtime by using ``rx_inj_lf`` ``devargs`` parameter. + + For example:: + + -a 0002:20:00.1,rx_inj_lf=20 + + With the above configuration, LF 20 will be used by the device for RX Injection + in security in fallback mechanism secnario. + Debugging Options -----------------
doc/guides/rel_notes/release_24_03.rst +3 -0
@@ -55,6 +55,9 @@ New Features Also, make sure to start the actual text at the margin. ======================================================= +* **Updated Marvell cnxk crypto driver.** + + * Added support for Rx inject in crypto_cn10k. Removed Items -------------
drivers/common/cnxk/hw/cpt.h +9 -0
@@ -237,6 +237,15 @@ struct cpt_inst_s { uint64_t doneint : 1; uint64_t nixtx_addr : 60; } s; +struct { +uint64_t nixtxl :3 ; +uint64_t doneint :1 ; +uint64_t chan :12 ; +uint64_t l2_len :8 ; +uint64_t et_offset :8 ; +uint64_t match_id :16 ; +uint64_t sso_pf_func :16 ; + } hw_s;uint64_t u64; } w0;
drivers/common/cnxk/roc_cpt.c +8 -3
@@ -463,7 +463,7 @@ cpt_available_lfs_get(struct dev *dev, uint16_t *nb_lf)int cpt_lfs_alloc (struct dev *dev,uint8_t eng_grpmsk,uint8_t blkaddr,bool inl_dev_sso, -bool ctx_ilen_valid,uint8_t ctx_ilen) +bool ctx_ilen_valid,uint8_t ctx_ilen,bool rxc_ena,uint16_t rx_inj_lf) {struct cpt_lf_alloc_req_msg *req;struct mbox *mbox =mbox_get (dev->mbox);
@@ -489,6 +489,10 @@ cpt_lfs_alloc(struct dev *dev, uint8_t eng_grpmsk, uint8_t blkaddr, bool inl_dev req->blkaddr = blkaddr; req->ctx_ilen_valid = ctx_ilen_valid; req->ctx_ilen = ctx_ilen; +if (rxc_ena) { + req->rxc_ena =1 ; + req->rxc_ena_lf_id = rx_inj_lf; + } rc =mbox_process (mbox); exit:
@@ -586,7 +590,7 @@ cpt_iq_init(struct roc_cpt_lf *lf) }int -roc_cpt_dev_configure (struct roc_cpt *roc_cpt,int nb_lf) +roc_cpt_dev_configure (struct roc_cpt *roc_cpt,int nb_lf,bool rxc_ena,uint16_t rx_inj_lf) {struct cpt *cpt =roc_cpt_to_cpt_priv (roc_cpt);uint8_t blkaddr[ROC_CPT_MAX_BLKS ];
@@ -630,7 +634,8 @@ roc_cpt_dev_configure(struct roc_cpt *roc_cpt, int nb_lf) ctx_ilen = (PLT_ALIGN (ROC_OT_IPSEC_SA_SZ_MAX ,ROC_ALIGN ) /128 ) -1 ; } - rc =cpt_lfs_alloc (&cpt->dev, eng_grpmsk, blkaddr[blknum], false, ctx_ilen_valid, ctx_ilen); + rc =cpt_lfs_alloc (&cpt->dev, eng_grpmsk, blkaddr[blknum], false, ctx_ilen_valid, ctx_ilen, + rxc_ena, rx_inj_lf);if (rc) goto lfs_detach;
drivers/common/cnxk/roc_cpt.h +2 -1
@@ -171,7 +171,8 @@ int __roc_api roc_cpt_dev_init(struct roc_cpt *roc_cpt); int __roc_api roc_cpt_dev_fini(struct roc_cpt *roc_cpt); int __roc_api roc_cpt_eng_grp_add(struct roc_cpt *roc_cpt,enum cpt_eng_type eng_type); -int __roc_api roc_cpt_dev_configure(struct roc_cpt *roc_cpt, int nb_lf); +int __roc_api roc_cpt_dev_configure(struct roc_cpt *roc_cpt, int nb_lf, bool rxc_ena, +uint16_t rx_inj_lf); void __roc_api roc_cpt_dev_clear(struct roc_cpt *roc_cpt); int __roc_api roc_cpt_lf_init(struct roc_cpt *roc_cpt, struct roc_cpt_lf *lf); void __roc_api roc_cpt_lf_fini(struct roc_cpt_lf *lf);
drivers/common/cnxk/roc_cpt_priv.h +1 -1
@@ -22,7 +22,7 @@ int cpt_lfs_attach(struct dev *dev, uint8_t blkaddr, bool modify, uint16_t nb_lf);int cpt_lfs_detach (struct dev *dev);int cpt_lfs_alloc (struct dev *dev,uint8_t eng_grpmsk,uint8_t blk,bool inl_dev_sso, -bool ctx_ilen_valid,uint8_t ctx_ilen); +bool ctx_ilen_valid,uint8_t ctx_ilen,bool rxc_ena,uint16_t rx_inj_lf);int cpt_lfs_free (struct dev *dev);int cpt_lf_init (struct roc_cpt_lf *lf);void cpt_lf_fini (struct roc_cpt_lf *lf);
drivers/common/cnxk/roc_ie_ot.c +7 -7
@@ -12,13 +12,13 @@ roc_ot_ipsec_inb_sa_init(struct roc_ot_ipsec_inb_sa *sa, bool is_inline)memset (sa,0 ,sizeof (struct roc_ot_ipsec_inb_sa )); -if (is_inline) { - sa->w0.s.pkt_output =ROC_IE_OT_SA_PKT_OUTPUT_NO_FRAG ; - sa->w0.s.pkt_format =ROC_IE_OT_SA_PKT_FMT_META ; - sa->w0.s.pkind =ROC_IE_OT_CPT_PKIND ; - sa->w0.s.et_ovrwr =1 ; - sa->w2.s.l3hdr_on_err =1 ; - } + sa->w0.s.pkt_output =ROC_IE_OT_SA_PKT_OUTPUT_NO_FRAG ; + sa->w0.s.pkt_format =ROC_IE_OT_SA_PKT_FMT_META ; + sa->w0.s.pkind =ROC_IE_OT_CPT_PKIND ; + sa->w0.s.et_ovrwr =1 ; + sa->w2.s.l3hdr_on_err =1 ; + +PLT_SET_USED (is_inline); offset = offsetof(struct roc_ot_ipsec_inb_sa , ctx); sa->w0.s.hw_ctx_off = offset /ROC_CTX_UNIT_8B ;
drivers/common/cnxk/roc_mbox.h +2 -0
@@ -2022,6 +2022,8 @@ struct cpt_lf_alloc_req_msg { uint8_t __io blkaddr; uint8_t __io ctx_ilen_valid : 1; uint8_t __io ctx_ilen : 7; + uint8_t __io rxc_ena : 1; + uint8_t __io rxc_ena_lf_id : 7; };#define CPT_INLINE_INBOUND 0
drivers/common/cnxk/roc_nix_inl.c +1 -1
@@ -986,7 +986,7 @@ roc_nix_inl_outb_init(struct roc_nix *roc_nix)1ULL <<ROC_CPT_DFLT_ENG_GRP_SE_IE | 1ULL << ROC_CPT_DFLT_ENG_GRP_AE); rc =cpt_lfs_alloc (dev, eng_grpmask, blkaddr, - !roc_nix->ipsec_out_sso_pffunc, ctx_ilen_valid, ctx_ilen); + !roc_nix->ipsec_out_sso_pffunc, ctx_ilen_valid, ctx_ilen, false,0 );if (rc) {plt_err ("Failed to alloc CPT LF resources, rc=%d" , rc); goto lf_detach;
drivers/common/cnxk/roc_nix_inl_dev.c +1 -1
@@ -194,7 +194,7 @@ nix_inl_cpt_setup(struct nix_inl_dev *inl_dev, bool inl_dev_sso) } rc =cpt_lfs_alloc (dev, eng_grpmask,RVU_BLOCK_ADDR_CPT0 , inl_dev_sso, ctx_ilen_valid, - ctx_ilen); + ctx_ilen, false,0 );if (rc) {plt_err ("Failed to alloc CPT LF resources, rc=%d" , rc);return rc;
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +124 -0
142 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_cryptodev_ops.h +8 -0
@@ -16,6 +16,14 @@ extern struct rte_cryptodev_ops cn10k_cpt_ops;void cn10k_cpt_set_enqdeq_fns (struct rte_cryptodev *dev,struct cnxk_cpt_vf *vf); +__rte_internal +uint16_t __rte_hot cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct rte_mbuf **pkts, +struct rte_security_session **sess, +uint16_t nb_pkts); + +__rte_internal +int cn10k_cryptodev_sec_rx_inject_configure(void *device, uint16_t port_id, bool enable); +__rte_internal uint16_t __rte_hot cn10k_cpt_sg_ver1_crypto_adapter_enqueue(void *ws, struct rte_event ev[],uint16_t nb_events);
drivers/crypto/cnxk/cn10k_ipsec.c +4 -0
@@ -10,6 +10,7 @@#include <rte_security_driver.h> #include <rte_udp.h> +#include "cn10k_cryptodev_ops.h" #include "cn10k_ipsec.h" #include "cnxk_cryptodev.h" #include "cnxk_cryptodev_ops.h"
@@ -297,6 +298,7 @@ cn10k_sec_session_create(void *device, struct rte_security_session_conf *conf,if (conf->protocol !=RTE_SECURITY_PROTOCOL_IPSEC )return -ENOTSUP ; + ((struct cn10k_sec_session *)sess)->userdata = conf->userdata;return cn10k_ipsec_session_create (device, &conf->ipsec, conf->crypto_xform, sess); }
@@ -458,4 +460,6 @@ cn10k_sec_ops_override(void) cnxk_sec_ops.session_get_size = cn10k_sec_session_get_size; cnxk_sec_ops.session_stats_get = cn10k_sec_session_stats_get; cnxk_sec_ops.session_update = cn10k_sec_session_update; + cnxk_sec_ops.inb_pkt_rx_inject = cn10k_cryptodev_sec_inb_rx_inject; + cnxk_sec_ops.rx_inject_configure = cn10k_cryptodev_sec_rx_inject_configure; }
drivers/crypto/cnxk/cn10k_ipsec.h +2 -0
@@ -38,6 +38,8 @@ struct cn10k_sec_session {bool is_outbound;/** Queue pair */ struct cnxk_cpt_qp *qp; +/** Userdata to be set for Rx inject */ +void *userdata;/** * End of SW mutable area
drivers/crypto/cnxk/cnxk_cryptodev.c +3 -0
@@ -24,6 +24,9 @@ cnxk_cpt_default_ff_get(void)if (roc_model_is_cn10k ()) ff |=RTE_CRYPTODEV_FF_SECURITY_INNER_CSUM |RTE_CRYPTODEV_FF_SYM_RAW_DP ; +if (roc_model_is_cn10ka_b0 ()) + ff |=RTE_CRYPTODEV_FF_SECURITY_RX_INJECT ; +return ff; }
drivers/crypto/cnxk/cnxk_cryptodev.h +3 -0
@@ -18,6 +18,8 @@* Device private data */ struct cnxk_cpt_vf { +struct roc_cpt_lmtline rx_inj_lmtline; +uint16_t rx_inj_pf_func;struct roc_cpt cpt;struct rte_cryptodev_capabilities crypto_caps[CNXK_CPT_MAX_CAPS ];struct rte_cryptodev_capabilities
@@ -26,6 +28,7 @@ struct cnxk_cpt_vf {uint64_t cnxk_fpm_iova[ROC_AE_EC_ID_PMAX ];struct roc_ae_ec_group *ec_grp[ROC_AE_EC_ID_PMAX ];uint16_t max_qps_limit; +uint16_t rx_inj_lf; };uint64_t cnxk_cpt_default_ff_get (void );
drivers/crypto/cnxk/cnxk_cryptodev_devargs.c +31 -0
@@ -9,6 +9,23 @@#define CNXK_MAX_QPS_LIMIT "max_qps_limit"#define CNXK_MAX_QPS_LIMIT_MIN 1#define CNXK_MAX_QPS_LIMIT_MAX (ROC_CPT_MAX_LFS - 1) +#define CNXK_RX_INJ_LF "rx_inj_lf" + +static int +parse_rx_inj_lf (const char *key,const char *value,void *extra_args) +{ +RTE_SET_USED (key); +uint32_t val; + + val =atoi (value); + +if (val <CNXK_MAX_QPS_LIMIT_MIN || val >CNXK_MAX_QPS_LIMIT_MAX ) +return -EINVAL ; + + *(uint16_t *)extra_args = val; + +return 0 ; +}static int parse_max_qps_limit (const char *key,const char *value,void *extra_args)
@@ -31,8 +48,12 @@ cnxk_cpt_parse_devargs(struct rte_devargs *devargs, struct cnxk_cpt_vf *vf) {uint16_t max_qps_limit =CNXK_MAX_QPS_LIMIT_MAX ;struct rte_kvargs *kvlist; +uint16_t rx_inj_lf;int rc; +/* Set to max value as default so that the feature is disabled by default. */ + rx_inj_lf =CNXK_MAX_QPS_LIMIT_MAX ; +if (devargs ==NULL ) goto null_devargs;
@@ -48,10 +69,20 @@ cnxk_cpt_parse_devargs(struct rte_devargs *devargs, struct cnxk_cpt_vf *vf)rte_kvargs_free (kvlist); goto exit; } + + rc =rte_kvargs_process (kvlist,CNXK_RX_INJ_LF , parse_rx_inj_lf, &rx_inj_lf); +if (rc <0 ) { +plt_err ("rx_inj_lf should in the range <%d-%d>" ,CNXK_MAX_QPS_LIMIT_MIN , + max_qps_limit -1 ); +rte_kvargs_free (kvlist); + goto exit; + } +rte_kvargs_free (kvlist); null_devargs: vf->max_qps_limit = max_qps_limit; + vf->rx_inj_lf = rx_inj_lf;return 0 ; exit:
drivers/crypto/cnxk/cnxk_cryptodev_ops.c +26 -1
@@ -5,6 +5,7 @@#include <rte_cryptodev.h> #include <cryptodev_pmd.h> #include <rte_errno.h> +#include <rte_security_driver.h> #include "roc_ae_fpm_tables.h" #include "roc_cpt.h"
@@ -95,6 +96,7 @@ cnxk_cpt_dev_config(struct rte_cryptodev *dev, struct rte_cryptodev_config *confstruct cnxk_cpt_vf *vf = dev->data->dev_private;struct roc_cpt *roc_cpt = &vf->cpt;uint16_t nb_lf_avail, nb_lf; +bool rxc_ena = false;int ret;/* If this is a reconfigure attempt, clear the device and configure again */
@@ -111,7 +113,13 @@ cnxk_cpt_dev_config(struct rte_cryptodev *dev, struct rte_cryptodev_config *confif (nb_lf > nb_lf_avail)return -ENOTSUP ; - ret =roc_cpt_dev_configure (roc_cpt, nb_lf); +if (dev->feature_flags &RTE_CRYPTODEV_FF_SECURITY_RX_INJECT ) { +if (rte_security_dynfield_register () <0 ) +return -ENOTSUP ; + rxc_ena = true; + } + + ret =roc_cpt_dev_configure (roc_cpt, nb_lf, rxc_ena, vf->rx_inj_lf);if (ret) {plt_err ("Could not configure device" );return ret;
@@ -208,6 +216,10 @@ cnxk_cpt_dev_info_get(struct rte_cryptodev *dev, info->sym.max_nb_sessions =0 ; info->min_mbuf_headroom_req =CNXK_CPT_MIN_HEADROOM_REQ ; info->min_mbuf_tailroom_req =CNXK_CPT_MIN_TAILROOM_REQ ; + +/* If the LF ID for RX Inject is less than the available lfs. */ +if (vf->rx_inj_lf > info->max_nb_queue_pairs) + info->feature_flags &= ~RTE_CRYPTODEV_FF_SECURITY_RX_INJECT ; } static void
@@ -452,6 +464,19 @@ cnxk_cpt_queue_pair_setup(struct rte_cryptodev *dev, uint16_t qp_id, qp->sess_mp = conf->mp_session; dev->data->queue_pairs[qp_id] = qp; +if (qp_id == vf->rx_inj_lf) { + ret =roc_cpt_lmtline_init (roc_cpt, &vf->rx_inj_lmtline, vf->rx_inj_lf); +if (ret) { +plt_err ("Could not init lmtline Rx inject" ); + goto exit; + } + + vf->rx_inj_pf_func = qp->lf.pf_func; + +/* Block the queue for other submissions */ + qp->pend_q.pq_mask =0 ; + } +return 0 ; exit:
drivers/crypto/cnxk/version.map +3 -0
@@ -8,5 +8,8 @@ INTERNAL { cn10k_cpt_crypto_adapter_dequeue; cn10k_cpt_crypto_adapter_vector_dequeue; + cn10k_cryptodev_sec_inb_rx_inject; + cn10k_cryptodev_sec_rx_inject_configure; + local: *; };
Signature · 1 line
2.25.1
RE: [PATCH v2 07/24] crypto/cnxk: enable Rx inject in security lookaside
Quoted 6 lines
Subject: [PATCH v2 07/24]
crypto/cnxk: enable Rx inject in security lookasideFrom: Vidya Sagar Velumuri <[email protected]>
Add Rx inject fastpath API.
Add devargs to specify an LF to be used for Rx inject.
It is better to specify the name of the devarg in description.
Quoted 8 lines
When the RX inject feature flag is enabled:
1. Reserve a CPT LF to use for RX Inject mode.
2. Enable RXC and disable full packet mode for that LF.Signed-off-by Anoob Joseph <[email protected]>Signed-off-by Vidya Sagar Velumuri <[email protected]>--- doc/guides/cryptodevs/cnxk.rst | 12 ++
Should we also update the cn10k.ini file for supporting the new feature flag?
Quoted 25 lines
doc/guides/rel_notes/release_24_03.rst | 3 + drivers/common/cnxk/hw/cpt.h | 9 ++ drivers/common/cnxk/roc_cpt.c | 11 +- drivers/common/cnxk/roc_cpt.h | 3 +- drivers/common/cnxk/roc_cpt_priv.h | 2 +- drivers/common/cnxk/roc_ie_ot.c | 14 +-- drivers/common/cnxk/roc_mbox.h | 2 + drivers/common/cnxk/roc_nix_inl.c | 2 +- drivers/common/cnxk/roc_nix_inl_dev.c | 2 +- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 124 +++++++++++++++++++ drivers/crypto/cnxk/cn10k_cryptodev_ops.h | 8 ++ drivers/crypto/cnxk/cn10k_ipsec.c | 4 + drivers/crypto/cnxk/cn10k_ipsec.h | 2 + drivers/crypto/cnxk/cnxk_cryptodev.c | 3 + drivers/crypto/cnxk/cnxk_cryptodev.h | 3 + drivers/crypto/cnxk/cnxk_cryptodev_devargs.c | 31 +++++ drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 27 +++- drivers/crypto/cnxk/version.map | 3 + 19 files changed, 250 insertions(+), 15 deletions(-)doc/guides/cryptodevs/cnxk.rst +0
-0
doc/guides/cryptodevs/cnxk.rst Runtime Config Options · line 193
Quoted 7 lines
doc/guides/cryptodevs/cnxk.rst +4
-0@@ -187,6 +187,18 @@ Runtime Config Options With the above configuration, the number of maximum queue pairs supported by the device is limited to 4. +- ``LF ID for RX injection in case of fallback mechanism`` (default ``60``) + + LF ID for RX Injection in fallback mechanism of security. + Can be configured during runtime by using ``rx_inj_lf`` ``devargs`` parameter.
Can we rename it to rx_inject_lf to improve readability for user? Or can this be rx_inject_qp as for dpdk user LF term is not exposed? And we map it to a qp internally. Right?
Quoted 8 lines
doc/guides/cryptodevs/cnxk.rst +6
-0+ + For example:: + + -a 0002:20:00.1,rx_inj_lf=20 + + With the above configuration, LF 20 will be used by the device for RXInjection
+ in security in fallback mechanism secnario.
Spell check scenario
Quoted 10 lines
doc/guides/cryptodevs/cnxk.rst +1
-0+ Debugging Options -----------------doc/guides/rel_notes/release_24_03.rst +0
-0
doc/guides/rel_notes/release_24_03.rst New Features · line 61
Quoted 7 lines
doc/guides/rel_notes/release_24_03.rst +3
-0@@ -55,6 +55,9 @@ New Features Also, make sure to start the actual text at the margin. ======================================================= +* **Updated Marvell cnxk crypto driver.** + + * Added support for Rx inject in crypto_cn10k.
Add an extra line here.
PATCH v2 8/24 common/cnxk: add Rx inject configs
In reply to Anoob JosephFrom: Rahul Bhansali <[email protected]>
Add Rx inject config for feature enable/disable, and store Rx chan value per port.
--- drivers/common/cnxk/roc_idev.c | 44 +++++++++++++++++++++++++++++ drivers/common/cnxk/roc_idev.h | 5 ++++ drivers/common/cnxk/roc_idev_priv.h | 6 ++++ drivers/common/cnxk/roc_nix.c | 2 ++ drivers/common/cnxk/version.map | 4 +++ 5 files changed, 61 insertions(+)
drivers/common/cnxk/roc_idev.c +44 -0
@@ -310,3 +310,47 @@ roc_idev_nix_inl_meta_aura_get(void)return idev->inl_cfg.meta_aura;return 0 ; } + +uint8_t +roc_idev_nix_rx_inject_get (uint16_t port) +{ +struct idev_cfg *idev; + + idev =idev_get_cfg (); +if (idev !=NULL && port <PLT_MAX_ETHPORTS ) +return idev->inl_rx_inj_cfg.rx_inject_en[port]; + +return 0 ; +} + +void +roc_idev_nix_rx_inject_set (uint16_t port,uint8_t enable) +{ +struct idev_cfg *idev; + + idev =idev_get_cfg (); +if (idev !=NULL && port <PLT_MAX_ETHPORTS ) +__atomic_store_n (&idev->inl_rx_inj_cfg.rx_inject_en[port], enable, + __ATOMIC_RELEASE); +} + +uint16_t * +roc_idev_nix_rx_chan_base_get (void ) +{ +struct idev_cfg *idev =idev_get_cfg (); + +if (idev !=NULL ) +return (uint16_t *)&idev->inl_rx_inj_cfg.chan; + +return NULL ; +} + +void +roc_idev_nix_rx_chan_set (uint16_t port,uint16_t chan) +{ +struct idev_cfg *idev; + + idev =idev_get_cfg (); +if (idev !=NULL && port <PLT_MAX_ETHPORTS ) +__atomic_store_n (&idev->inl_rx_inj_cfg.chan[port], chan, __ATOMIC_RELEASE); +}
drivers/common/cnxk/roc_idev.h +5 -0
@@ -22,4 +22,9 @@ struct roc_nix_list *__roc_api roc_idev_nix_list_get(void); struct roc_mcs *__roc_api roc_idev_mcs_get(uint8_t mcs_idx); void __roc_api roc_idev_mcs_set(struct roc_mcs *mcs); void __roc_api roc_idev_mcs_free(struct roc_mcs *mcs); + +uint8_t __roc_api roc_idev_nix_rx_inject_get(uint16_t port); +void __roc_api roc_idev_nix_rx_inject_set(uint16_t port, uint8_t enable); +uint16_t *__roc_api roc_idev_nix_rx_chan_base_get(void); +void __roc_api roc_idev_nix_rx_chan_set(uint16_t port, uint16_t chan);#endif /* _ROC_IDEV_H_ */
drivers/common/cnxk/roc_idev_priv.h +6 -0
@@ -19,6 +19,11 @@ struct idev_nix_inl_cfg {uint32_t refs; }; +struct idev_nix_inl_rx_inj_cfg { +uint16_t chan[PLT_MAX_ETHPORTS ]; +uint8_t rx_inject_en[PLT_MAX_ETHPORTS ]; +}; +struct idev_cfg {uint16_t sso_pf_func;uint16_t npa_pf_func;
@@ -35,6 +40,7 @@ struct idev_cfg {struct nix_inl_dev *nix_inl_dev;struct idev_nix_inl_cfg inl_cfg;struct roc_nix_list roc_nix_list; +struct idev_nix_inl_rx_inj_cfg inl_rx_inj_cfg;plt_spinlock_t nix_inl_dev_lock;plt_spinlock_t npa_dev_lock; };
drivers/common/cnxk/roc_nix.c +2 -0
@@ -223,6 +223,8 @@ roc_nix_lf_alloc(struct roc_nix *roc_nix, uint32_t nb_rxq, uint32_t nb_txq, nix->nb_rx_queues = nb_rxq; nix->nb_tx_queues = nb_txq; +roc_idev_nix_rx_chan_set (roc_nix->port_id, rsp->rx_chan_base); + nix->rqs =plt_zmalloc (sizeof (struct roc_nix_rq *) * nb_rxq,0 );if (!nix->rqs) { rc = -ENOMEM ;
drivers/common/cnxk/version.map +4 -0
@@ -105,6 +105,10 @@ INTERNAL { roc_idev_num_lmtlines_get; roc_idev_nix_inl_meta_aura_get; roc_idev_nix_list_get; + roc_idev_nix_rx_chan_base_get; + roc_idev_nix_rx_chan_set; + roc_idev_nix_rx_inject_get; + roc_idev_nix_rx_inject_set; roc_ml_reg_read64; roc_ml_reg_write64; roc_ml_reg_read32;
Signature · 1 line
2.25.1
PATCH v2 9/24 crypto/cnxk: Rx inject config update
In reply to Anoob JosephFrom: Rahul Bhansali <[email protected]>
- Update chan in CPT inst from port's Rx chan
- Set Rx inject config in Idev struct
--- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 4 +++- drivers/crypto/cnxk/cn10k_ipsec.c | 3 +++ drivers/crypto/cnxk/cnxk_cryptodev.h | 1 + drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 2 ++ 4 files changed, 9 insertions(+), 1 deletion(-)
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +3 -1
@@ -15,6 +15,7 @@#else #include "roc_io_generic.h" #endif +#include "roc_idev.h" #include "roc_sso.h" #include "roc_sso_dp.h"
@@ -1122,6 +1123,7 @@ cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct rte_mbuf **pkts, inst->dptr = dptr; inst->rptr = dptr; + inst->w0.hw_s.chan = *(vf->rx_chan_base + m->port); inst->w0.hw_s.l2_len = l2_len; inst->w0.hw_s.et_offset = l2_len -2 ;
@@ -1654,7 +1656,7 @@ cn10k_cryptodev_sec_rx_inject_configure(void *device, uint16_t port_id, bool enaif (ret)return -ENOTSUP ; -RTE_SET_USED (enable); +roc_idev_nix_rx_inject_set (port_id, enable);return 0 ; }
drivers/crypto/cnxk/cn10k_ipsec.c +3 -0
@@ -192,6 +192,9 @@ cn10k_ipsec_inb_sa_create(struct roc_cpt *roc_cpt, struct roc_cpt_lf *lf, sec_sess->is_outbound = false; sec_sess->inst.w7 =ipsec_cpt_inst_w7_get (roc_cpt, in_sa); +/* Save index/SPI in cookie, specific required for Rx Inject */ + sa_dptr->w1.s.cookie =0xFFFFFFFF ; +/* pre-populate CPT INST word 4 */ inst_w4.u64 =0 ; inst_w4.s.opcode_major =ROC_IE_OT_MAJOR_OP_PROCESS_INBOUND_IPSEC |ROC_IE_OT_INPLACE_BIT ;
drivers/crypto/cnxk/cnxk_cryptodev.h +1 -0
@@ -20,6 +20,7 @@struct cnxk_cpt_vf {struct roc_cpt_lmtline rx_inj_lmtline;uint16_t rx_inj_pf_func; +uint16_t *rx_chan_base;struct roc_cpt cpt;struct rte_cryptodev_capabilities crypto_caps[CNXK_CPT_MAX_CAPS ];struct rte_cryptodev_capabilities
drivers/crypto/cnxk/cnxk_cryptodev_ops.c +2 -0
@@ -10,6 +10,7 @@#include "roc_ae_fpm_tables.h" #include "roc_cpt.h" #include "roc_errata.h" +#include "roc_idev.h" #include "roc_ie_on.h" #include "cnxk_ae.h"
@@ -117,6 +118,7 @@ cnxk_cpt_dev_config(struct rte_cryptodev *dev, struct rte_cryptodev_config *confif (rte_security_dynfield_register () <0 )return -ENOTSUP ; rxc_ena = true; + vf->rx_chan_base =roc_idev_nix_rx_chan_base_get (); } ret =roc_cpt_dev_configure (roc_cpt, nb_lf, rxc_ena, vf->rx_inj_lf);
Signature · 1 line
2.25.1
PATCH v2 10/24 crypto/cnxk: enable Rx inject for 103
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Enable Rx inject feature for 103XX
--- drivers/crypto/cnxk/cnxk_cryptodev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/cnxk/cnxk_cryptodev.c +1 -1
@@ -24,7 +24,7 @@ cnxk_cpt_default_ff_get(void)if (roc_model_is_cn10k ()) ff |=RTE_CRYPTODEV_FF_SECURITY_INNER_CSUM |RTE_CRYPTODEV_FF_SYM_RAW_DP ; -if (roc_model_is_cn10ka_b0 ()) +if (roc_model_is_cn10ka_b0 () ||roc_model_is_cn10kb ()) ff |=RTE_CRYPTODEV_FF_SECURITY_RX_INJECT ;return ff;
Signature · 1 line
2.25.1
PATCH v2 11/24 crypto/cnxk: rename security caps as IPsec security caps
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Security capabilities would vary between IPsec and other new offloads. Rename existing security caps to indicate that they are IPsec specific ones.
Rename and change the scope of common functions, inorder to avoid code duplication. These functions can be used by both IPsec and TLS
--- drivers/common/cnxk/cnxk_security.c | 13 ++-- drivers/common/cnxk/cnxk_security.h | 17 +++-- drivers/common/cnxk/version.map | 1 + drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 18 ++++- drivers/crypto/cnxk/cn10k_ipsec.c | 46 +++++++----- drivers/crypto/cnxk/cn10k_ipsec.h | 9 ++- drivers/crypto/cnxk/cn10k_ipsec_la_ops.h | 18 ++--- drivers/crypto/cnxk/cn9k_ipsec_la_ops.h | 8 +- drivers/crypto/cnxk/cnxk_cryptodev.h | 10 +-- .../crypto/cnxk/cnxk_cryptodev_capabilities.c | 73 ++++++++++--------- drivers/crypto/cnxk/cnxk_sg.h | 4 +- 11 files changed, 123 insertions(+), 94 deletions(-)
drivers/common/cnxk/cnxk_security.c +6 -7
@@ -8,9 +8,8 @@#include "roc_api.h" -static void -ipsec_hmac_opad_ipad_gen (struct rte_crypto_sym_xform *auth_xform, -uint8_t *hmac_opad_ipad) +void +cnxk_sec_opad_ipad_gen (struct rte_crypto_sym_xform *auth_xform,uint8_t *hmac_opad_ipad) {const uint8_t *key = auth_xform->auth.key.data;uint32_t length = auth_xform->auth.key.length;
@@ -192,7 +191,7 @@ ot_ipsec_sa_common_param_fill(union roc_ot_ipsec_sa_word2 *w2,const uint8_t *auth_key = auth_xfrm->auth.key.data;roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else { -ipsec_hmac_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); } tmp_key = (uint64_t *)hmac_opad_ipad;
@@ -741,7 +740,7 @@ onf_ipsec_sa_common_param_fill(struct roc_ie_onf_sa_ctl *ctl, uint8_t *salt, key = cipher_xfrm->cipher.key.data; length = cipher_xfrm->cipher.key.length; -ipsec_hmac_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); }switch (length) {
@@ -1374,7 +1373,7 @@ cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -ipsec_hmac_opad_ipad_gen (auth_xform, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad); } }
@@ -1441,7 +1440,7 @@ cnxk_on_ipsec_inb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -ipsec_hmac_opad_ipad_gen (auth_xform, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad); } }
drivers/common/cnxk/cnxk_security.h +9 -8
@@ -61,14 +61,15 @@ bool __roc_api cnxk_onf_ipsec_inb_sa_valid(struct roc_onf_ipsec_inb_sa *sa); bool __roc_api cnxk_onf_ipsec_outb_sa_valid(struct roc_onf_ipsec_outb_sa *sa);/* [CN9K] */ -int __roc_api -cnxk_on_ipsec_inb_sa_create (struct rte_security_ipsec_xform *ipsec, -struct rte_crypto_sym_xform *crypto_xform, -struct roc_ie_on_inb_sa *in_sa); +int __roc_api cnxk_on_ipsec_inb_sa_create(struct rte_security_ipsec_xform *ipsec, +struct rte_crypto_sym_xform *crypto_xform, +struct roc_ie_on_inb_sa *in_sa); -int __roc_api -cnxk_on_ipsec_outb_sa_create (struct rte_security_ipsec_xform *ipsec, -struct rte_crypto_sym_xform *crypto_xform, -struct roc_ie_on_outb_sa *out_sa); +int __roc_api cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipsec, +struct rte_crypto_sym_xform *crypto_xform, +struct roc_ie_on_outb_sa *out_sa); + +__rte_internal +void cnxk_sec_opad_ipad_gen(struct rte_crypto_sym_xform *auth_xform, uint8_t *hmac_opad_ipad);#endif /* _CNXK_SECURITY_H__ */
drivers/common/cnxk/version.map +1 -0
@@ -1,6 +1,7 @@ INTERNAL { global: + cnxk_sec_opad_ipad_gen; cnxk_ipsec_icvlen_get; cnxk_ipsec_ivlen_get; cnxk_ipsec_outb_rlens_get;
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +15 -3
@@ -80,8 +80,9 @@ cn10k_cpt_sym_temp_sess_create(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op) } static __rte_always_inline int __rte_hot -cpt_sec_inst_fill (struct cnxk_cpt_qp *qp,struct rte_crypto_op *op,struct cn10k_sec_session *sess, -struct cpt_inst_s *inst,struct cpt_inflight_req *infl_req,const bool is_sg_ver2) +cpt_sec_ipsec_inst_fill (struct cnxk_cpt_qp *qp,struct rte_crypto_op *op, +struct cn10k_sec_session *sess,struct cpt_inst_s *inst, +struct cpt_inflight_req *infl_req,const bool is_sg_ver2) {struct rte_crypto_sym_op *sym_op = op->sym;int ret;
@@ -91,7 +92,7 @@ cpt_sec_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op, struct cn10kreturn -ENOTSUP ; } -if (sess->is_outbound) +if (sess->ipsec.is_outbound) ret =process_outb_sa (&qp->lf, op, sess, &qp->meta_info, infl_req, inst, is_sg_ver2);else
@@ -100,6 +101,17 @@ cpt_sec_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op, struct cn10kreturn ret; } +static __rte_always_inline int __rte_hot +cpt_sec_inst_fill (struct cnxk_cpt_qp *qp,struct rte_crypto_op *op,struct cn10k_sec_session *sess, +struct cpt_inst_s *inst,struct cpt_inflight_req *infl_req,const bool is_sg_ver2) +{ + +if (sess->proto ==RTE_SECURITY_PROTOCOL_IPSEC ) +return cpt_sec_ipsec_inst_fill (qp, op, sess, &inst[0 ], infl_req, is_sg_ver2); + +return 0 ; +} +static inline int cn10k_cpt_fill_inst (struct cnxk_cpt_qp *qp,struct rte_crypto_op *ops[],struct cpt_inst_s inst[],struct cpt_inflight_req *infl_req,const bool is_sg_ver2)
drivers/crypto/cnxk/cn10k_ipsec.c +28 -18
121 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_ipsec.h +7 -2
@@ -29,13 +29,18 @@ struct cn10k_sec_session {/** PMD private space */ +enum rte_security_session_protocol proto;/** Pre-populated CPT inst words */ struct cnxk_cpt_inst_tmpl inst;uint16_t max_extended_len;uint16_t iv_offset;uint8_t iv_length; -uint8_t ip_csum; -bool is_outbound; +union { +struct { +uint8_t ip_csum; +bool is_outbound; + } ipsec; + };/** Queue pair */ struct cnxk_cpt_qp *qp;/** Userdata to be set for Rx inject */
drivers/crypto/cnxk/cn10k_ipsec_la_ops.h +9 -9
@@ -121,7 +121,7 @@ process_outb_sa(struct roc_cpt_lf *lf, struct rte_crypto_op *cop, struct cn10k_s i =0 ; gather_comp = (struct roc_sglist_comp *)((uint8_t *)m_data +8 ); - i =fill_ipsec_sg_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg_comp_from_pkt (gather_comp, i, m_src); ((uint16_t *)in_buffer)[2 ] =rte_cpu_to_be_16 (i); g_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -132,7 +132,7 @@ process_outb_sa(struct roc_cpt_lf *lf, struct rte_crypto_op *cop, struct cn10k_s i =0 ; scatter_comp = (struct roc_sglist_comp *)((uint8_t *)gather_comp + g_size_bytes); - i =fill_ipsec_sg_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg_comp_from_pkt (scatter_comp, i, m_src); ((uint16_t *)in_buffer)[3 ] =rte_cpu_to_be_16 (i); s_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -170,7 +170,7 @@ process_outb_sa(struct roc_cpt_lf *lf, struct rte_crypto_op *cop, struct cn10k_s i =0 ; gather_comp = (struct roc_sg2list_comp *)((uint8_t *)m_data); - i =fill_ipsec_sg2_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg2_comp_from_pkt (gather_comp, i, m_src); cpt_inst_w5.s.gather_sz = ((i +2 ) /3 ); g_size_bytes = ((i +2 ) /3 ) *sizeof (struct roc_sg2list_comp );
@@ -181,7 +181,7 @@ process_outb_sa(struct roc_cpt_lf *lf, struct rte_crypto_op *cop, struct cn10k_s i =0 ; scatter_comp = (struct roc_sg2list_comp *)((uint8_t *)gather_comp + g_size_bytes); - i =fill_ipsec_sg2_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg2_comp_from_pkt (scatter_comp, i, m_src); cpt_inst_w6.s.scatter_sz = ((i +2 ) /3 );
@@ -211,7 +211,7 @@ process_inb_sa(struct rte_crypto_op *cop, struct cn10k_sec_session *sess, struct inst->w4.u64 = sess->inst.w4 |rte_pktmbuf_pkt_len (m_src); dptr =rte_pktmbuf_mtod (m_src, uint64_t); inst->dptr = dptr; - m_src->ol_flags |= (uint64_t )sess->ip_csum; + m_src->ol_flags |= (uint64_t )sess->ipsec.ip_csum; }else if (is_sg_ver2 == false) {struct roc_sglist_comp *scatter_comp, *gather_comp;uint32_t g_size_bytes, s_size_bytes;
@@ -234,7 +234,7 @@ process_inb_sa(struct rte_crypto_op *cop, struct cn10k_sec_session *sess, struct/* Input Gather List */ i =0 ; gather_comp = (struct roc_sglist_comp *)((uint8_t *)m_data +8 ); - i =fill_ipsec_sg_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg_comp_from_pkt (gather_comp, i, m_src); ((uint16_t *)in_buffer)[2 ] =rte_cpu_to_be_16 (i); g_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -242,7 +242,7 @@ process_inb_sa(struct rte_crypto_op *cop, struct cn10k_sec_session *sess, struct/* Output Scatter List */ i =0 ; scatter_comp = (struct roc_sglist_comp *)((uint8_t *)gather_comp + g_size_bytes); - i =fill_ipsec_sg_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg_comp_from_pkt (scatter_comp, i, m_src); ((uint16_t *)in_buffer)[3 ] =rte_cpu_to_be_16 (i); s_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -270,7 +270,7 @@ process_inb_sa(struct rte_crypto_op *cop, struct cn10k_sec_session *sess, struct i =0 ; gather_comp = (struct roc_sg2list_comp *)((uint8_t *)m_data); - i =fill_ipsec_sg2_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg2_comp_from_pkt (gather_comp, i, m_src); cpt_inst_w5.s.gather_sz = ((i +2 ) /3 ); g_size_bytes = ((i +2 ) /3 ) *sizeof (struct roc_sg2list_comp );
@@ -278,7 +278,7 @@ process_inb_sa(struct rte_crypto_op *cop, struct cn10k_sec_session *sess, struct/* Output Scatter List */ i =0 ; scatter_comp = (struct roc_sg2list_comp *)((uint8_t *)gather_comp + g_size_bytes); - i =fill_ipsec_sg2_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg2_comp_from_pkt (scatter_comp, i, m_src); cpt_inst_w6.s.scatter_sz = ((i +2 ) /3 );
drivers/crypto/cnxk/cn9k_ipsec_la_ops.h +4 -4
@@ -132,7 +132,7 @@ process_outb_sa(struct cpt_qp_meta_info *m_info, struct rte_crypto_op *cop, gather_comp = (struct roc_sglist_comp *)((uint8_t *)m_data +8 ); i =fill_sg_comp (gather_comp, i, (uint64_t )hdr, hdr_len); - i =fill_ipsec_sg_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg_comp_from_pkt (gather_comp, i, m_src); ((uint16_t *)in_buffer)[2 ] =rte_cpu_to_be_16 (i); g_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -146,7 +146,7 @@ process_outb_sa(struct cpt_qp_meta_info *m_info, struct rte_crypto_op *cop, scatter_comp = (struct roc_sglist_comp *)((uint8_t *)gather_comp + g_size_bytes); i =fill_sg_comp (scatter_comp, i, (uint64_t )hdr, hdr_len); - i =fill_ipsec_sg_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg_comp_from_pkt (scatter_comp, i, m_src); ((uint16_t *)in_buffer)[3 ] =rte_cpu_to_be_16 (i); s_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -228,7 +228,7 @@ process_inb_sa(struct cpt_qp_meta_info *m_info, struct rte_crypto_op *cop,*/ i =0 ; gather_comp = (struct roc_sglist_comp *)((uint8_t *)m_data +8 ); - i =fill_ipsec_sg_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg_comp_from_pkt (gather_comp, i, m_src); ((uint16_t *)in_buffer)[2 ] =rte_cpu_to_be_16 (i); g_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -239,7 +239,7 @@ process_inb_sa(struct cpt_qp_meta_info *m_info, struct rte_crypto_op *cop, i =0 ; scatter_comp = (struct roc_sglist_comp *)((uint8_t *)gather_comp + g_size_bytes); i =fill_sg_comp (scatter_comp, i, (uint64_t )hdr, hdr_len); - i =fill_ipsec_sg_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg_comp_from_pkt (scatter_comp, i, m_src); ((uint16_t *)in_buffer)[3 ] =rte_cpu_to_be_16 (i); s_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
drivers/crypto/cnxk/cnxk_cryptodev.h +5 -5
@@ -11,9 +11,10 @@#include "roc_ae.h" #include "roc_cpt.h" -#define CNXK_CPT_MAX_CAPS 55 -#define CNXK_SEC_CRYPTO_MAX_CAPS 16 -#define CNXK_SEC_MAX_CAPS 9 +#define CNXK_CPT_MAX_CAPS 55 +#define CNXK_SEC_IPSEC_CRYPTO_MAX_CAPS 16 +#define CNXK_SEC_MAX_CAPS 9 +/** * Device private data */
@@ -23,8 +24,7 @@ struct cnxk_cpt_vf {uint16_t *rx_chan_base;struct roc_cpt cpt;struct rte_cryptodev_capabilities crypto_caps[CNXK_CPT_MAX_CAPS ]; -struct rte_cryptodev_capabilities - sec_crypto_caps[CNXK_SEC_CRYPTO_MAX_CAPS ]; +struct rte_cryptodev_capabilities sec_ipsec_crypto_caps[CNXK_SEC_IPSEC_CRYPTO_MAX_CAPS ];struct rte_security_capability sec_caps[CNXK_SEC_MAX_CAPS ];uint64_t cnxk_fpm_iova[ROC_AE_EC_ID_PMAX ];struct roc_ae_ec_group *ec_grp[ROC_AE_EC_ID_PMAX ];
drivers/crypto/cnxk/cnxk_cryptodev_capabilities.c +37 -36
177 lines not on this page · raw message
drivers/crypto/cnxk/cnxk_sg.h +2 -2
@@ -129,7 +129,7 @@ fill_sg_comp_from_iov(struct roc_sglist_comp *list, uint32_t i, struct roc_se_io } static __rte_always_inline uint32_t -fill_ipsec_sg_comp_from_pkt (struct roc_sglist_comp *list,uint32_t i,struct rte_mbuf *pkt) +fill_sg_comp_from_pkt (struct roc_sglist_comp *list,uint32_t i,struct rte_mbuf *pkt) {uint32_t buf_sz;void *vaddr;
@@ -150,7 +150,7 @@ fill_ipsec_sg_comp_from_pkt(struct roc_sglist_comp *list, uint32_t i, struct rte } static __rte_always_inline uint32_t -fill_ipsec_sg2_comp_from_pkt (struct roc_sg2list_comp *list,uint32_t i,struct rte_mbuf *pkt) +fill_sg2_comp_from_pkt (struct roc_sg2list_comp *list,uint32_t i,struct rte_mbuf *pkt) {uint32_t buf_sz;void *vaddr;
Signature · 1 line
2.25.1
PATCH v2 12/24 common/cnxk: update opad-ipad gen to handle TLS
In reply to Anoob JosephFor TLS opcodes, ipad is at the offset 64 as compared to the packed implementation for IPsec. Extend the function to handle TLS contexts as well.
--- drivers/common/cnxk/cnxk_security.c | 15 ++++++++------- drivers/common/cnxk/cnxk_security.h | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-)
drivers/common/cnxk/cnxk_security.c +8 -7
@@ -9,7 +9,8 @@#include "roc_api.h" void -cnxk_sec_opad_ipad_gen (struct rte_crypto_sym_xform *auth_xform,uint8_t *hmac_opad_ipad) +cnxk_sec_opad_ipad_gen (struct rte_crypto_sym_xform *auth_xform,uint8_t *hmac_opad_ipad, +bool is_tls) {const uint8_t *key = auth_xform->auth.key.data;uint32_t length = auth_xform->auth.key.length;
@@ -29,11 +30,11 @@ cnxk_sec_opad_ipad_gen(struct rte_crypto_sym_xform *auth_xform, uint8_t *hmac_opswitch (auth_xform->auth.algo) {case RTE_CRYPTO_AUTH_MD5_HMAC :roc_hash_md5_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ]); -roc_hash_md5_gen (ipad, (uint32_t *)&hmac_opad_ipad[24 ]); +roc_hash_md5_gen (ipad, (uint32_t *)&hmac_opad_ipad[is_tls ?64 :24 ]);break ;case RTE_CRYPTO_AUTH_SHA1_HMAC :roc_hash_sha1_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ]); -roc_hash_sha1_gen (ipad, (uint32_t *)&hmac_opad_ipad[24 ]); +roc_hash_sha1_gen (ipad, (uint32_t *)&hmac_opad_ipad[is_tls ?64 :24 ]);break ;case RTE_CRYPTO_AUTH_SHA256_HMAC :roc_hash_sha256_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ],256 );
@@ -191,7 +192,7 @@ ot_ipsec_sa_common_param_fill(union roc_ot_ipsec_sa_word2 *w2,const uint8_t *auth_key = auth_xfrm->auth.key.data;roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else { -cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad, false); } tmp_key = (uint64_t *)hmac_opad_ipad;
@@ -740,7 +741,7 @@ onf_ipsec_sa_common_param_fill(struct roc_ie_onf_sa_ctl *ctl, uint8_t *salt, key = cipher_xfrm->cipher.key.data; length = cipher_xfrm->cipher.key.length; -cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad, false); }switch (length) {
@@ -1373,7 +1374,7 @@ cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad, false); } }
@@ -1440,7 +1441,7 @@ cnxk_on_ipsec_inb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad, false); } }
drivers/common/cnxk/cnxk_security.h +2 -1
@@ -70,6 +70,7 @@ int __roc_api cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipse struct roc_ie_on_outb_sa *out_sa);__rte_internal -void cnxk_sec_opad_ipad_gen(struct rte_crypto_sym_xform *auth_xform, uint8_t *hmac_opad_ipad); +void cnxk_sec_opad_ipad_gen(struct rte_crypto_sym_xform *auth_xform, uint8_t *hmac_opad_ipad, +bool is_tls);#endif /* _CNXK_SECURITY_H__ */
Signature · 1 line
2.25.1
PATCH v2 13/24 common/cnxk: add TLS record contexts
In reply to Anoob JosephAdd TLS record read and write contexts.
--- drivers/common/cnxk/roc_cpt.h | 4 +- drivers/common/cnxk/roc_ie_ot_tls.h | 199 ++++++++++++++++++++++++++++ drivers/common/cnxk/roc_se.h | 11 ++ 3 files changed, 211 insertions(+), 3 deletions(-) create mode 100644 drivers/common/cnxk/roc_ie_ot_tls.h
drivers/common/cnxk/roc_cpt.h +1 -3
@@ -55,6 +55,7 @@#define ROC_CPT_AES_CBC_IV_LEN 16#define ROC_CPT_SHA1_HMAC_LEN 12#define ROC_CPT_SHA2_HMAC_LEN 16 +#define ROC_CPT_DES_IV_LEN 8#define ROC_CPT_DES3_KEY_LEN 24#define ROC_CPT_AES128_KEY_LEN 16
@@ -71,9 +72,6 @@#define ROC_CPT_DES_BLOCK_LENGTH 8#define ROC_CPT_AES_BLOCK_LENGTH 16 -#define ROC_CPT_AES_GCM_ROUNDUP_BYTE_LEN 4 -#define ROC_CPT_AES_CBC_ROUNDUP_BYTE_LEN 16 -/* Salt length for AES-CTR/GCM/CCM and AES-GMAC */ #define ROC_CPT_SALT_LEN 4
drivers/common/cnxk/roc_ie_ot_tls.h new file +199 -0
199 lines not on this page · raw message
drivers/common/cnxk/roc_se.h +11 -0
@@ -5,6 +5,8 @@#ifndef __ROC_SE_H__#define __ROC_SE_H__ +#include "roc_constants.h" +/* SE opcodes */ #define ROC_SE_MAJOR_OP_FC 0x33#define ROC_SE_FC_MINOR_OP_ENCRYPT 0x0
@@ -162,6 +164,15 @@ typedef enum {ROC_SE_ERR_GC_ICV_MISCOMPARE =0x4c ,ROC_SE_ERR_GC_DATA_UNALIGNED =0x4d , +ROC_SE_ERR_SSL_RECORD_LEN_INVALID =0x82 , +ROC_SE_ERR_SSL_CTX_LEN_INVALID =0x83 , +ROC_SE_ERR_SSL_CIPHER_UNSUPPORTED =0x84 , +ROC_SE_ERR_SSL_MAC_UNSUPPORTED =0x85 , +ROC_SE_ERR_SSL_VERSION_UNSUPPORTED =0x86 , +ROC_SE_ERR_SSL_MAC_MISMATCH =0x89 , +ROC_SE_ERR_SSL_PKT_REPLAY_SEQ_OUT_OF_WINDOW =0xC1 , +ROC_SE_ERR_SSL_PKT_REPLAY_SEQ =0xC9 , +/* API Layer */ ROC_SE_ERR_REQ_PENDING =0xfe , ROC_SE_ERR_REQ_TIMEOUT = 0xff,
Signature · 1 line
2.25.1
PATCH v2 14/24 crypto/cnxk: separate IPsec from security common code
In reply to Anoob JosephThe current structs and functions assume only IPsec offload. Separate it out to allow for addition of TLS.
--- drivers/crypto/cnxk/cn10k_cryptodev.c | 2 +- drivers/crypto/cnxk/cn10k_cryptodev_sec.c | 127 ++++++++++++++++++++++ drivers/crypto/cnxk/cn10k_cryptodev_sec.h | 61 +++++++++++ drivers/crypto/cnxk/cn10k_ipsec.c | 127 +++------------------- drivers/crypto/cnxk/cn10k_ipsec.h | 45 +++----- drivers/crypto/cnxk/cn10k_ipsec_la_ops.h | 1 + drivers/crypto/cnxk/meson.build | 1 + 7 files changed, 218 insertions(+), 146 deletions(-) create mode 100644 drivers/crypto/cnxk/cn10k_cryptodev_sec.c create mode 100644 drivers/crypto/cnxk/cn10k_cryptodev_sec.h
drivers/crypto/cnxk/cn10k_cryptodev.c +1 -1
@@ -12,7 +12,7 @@#include "cn10k_cryptodev.h" #include "cn10k_cryptodev_ops.h" -#include "cn10k_ipsec.h" +#include "cn10k_cryptodev_sec.h" #include "cnxk_cryptodev.h" #include "cnxk_cryptodev_capabilities.h" #include "cnxk_cryptodev_sec.h"
drivers/crypto/cnxk/cn10k_cryptodev_sec.c new file +127 -0
127 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_cryptodev_sec.h new file +61 -0
61 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_ipsec.c +13 -114
200 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_ipsec.h +14 -31
57 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_ipsec_la_ops.h +1 -0
@@ -11,6 +11,7 @@#include "roc_ie.h" #include "cn10k_cryptodev.h" +#include "cn10k_cryptodev_sec.h" #include "cn10k_ipsec.h" #include "cnxk_cryptodev.h" #include "cnxk_cryptodev_ops.h"
drivers/crypto/cnxk/meson.build +1 -0
@@ -14,6 +14,7 @@ sources = files( 'cn9k_ipsec.c', 'cn10k_cryptodev.c', 'cn10k_cryptodev_ops.c', + 'cn10k_cryptodev_sec.c', 'cn10k_ipsec.c', 'cnxk_cryptodev.c', 'cnxk_cryptodev_capabilities.c',
Signature · 1 line
2.25.1
PATCH v2 15/24 crypto/cnxk: add TLS record session ops
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add TLS record session ops for creating and destroying security sessions. Add support for both read and write sessions.
--- drivers/crypto/cnxk/cn10k_cryptodev_sec.h | 8 + drivers/crypto/cnxk/cn10k_tls.c | 758 ++++++++++++++++++++++ drivers/crypto/cnxk/cn10k_tls.h | 35 + drivers/crypto/cnxk/meson.build | 1 + 4 files changed, 802 insertions(+) create mode 100644 drivers/crypto/cnxk/cn10k_tls.c create mode 100644 drivers/crypto/cnxk/cn10k_tls.h
drivers/crypto/cnxk/cn10k_cryptodev_sec.h +8 -0
@@ -11,6 +11,7 @@#include "roc_cpt.h" #include "cn10k_ipsec.h" +#include "cn10k_tls.h" struct cn10k_sec_session {struct rte_security_session rte_sess;
@@ -28,6 +29,12 @@ struct cn10k_sec_session {uint8_t ip_csum;bool is_outbound; } ipsec; +struct { +uint8_t enable_padding :1 ; +uint8_t hdr_len :4 ; +uint8_t rvsd :3 ; +bool is_write; + } tls; };/** Queue pair */ struct cnxk_cpt_qp *qp;
@@ -39,6 +46,7 @@ struct cn10k_sec_session {*/ union {struct cn10k_ipsec_sa sa; +struct cn10k_tls_record tls_rec; }; }__rte_aligned (ROC_ALIGN );
drivers/crypto/cnxk/cn10k_tls.c new file +758 -0
758 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_tls.h new file +35 -0
@@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: BSD-3-Clause +* Copyright(C) 2023 Marvell. +*/ + +#ifndef __CN10K_TLS_H__ +#define __CN10K_TLS_H__ + +#include <rte_crypto_sym.h> +#include <rte_security.h> + +#include "roc_ie_ot_tls.h" + +#include "cnxk_cryptodev.h" +#include "cnxk_cryptodev_ops.h" + +/* Forward declaration */ +struct cn10k_sec_session ; + +struct cn10k_tls_record { +union { +/** Read SA */ +struct roc_ie_ot_tls_read_sa read_sa; +/** Write SA */ +struct roc_ie_ot_tls_write_sa write_sa; + }; +}__rte_aligned (ROC_ALIGN ); + +int cn10k_tls_record_session_create (struct cnxk_cpt_vf *vf,struct cnxk_cpt_qp *qp, +struct rte_security_tls_record_xform *tls_xfrm, +struct rte_crypto_sym_xform *crypto_xfrm, +struct rte_security_session *sess); + +int cn10k_sec_tls_session_destroy (struct cnxk_cpt_qp *qp,struct cn10k_sec_session *sess); + +#endif /* __CN10K_TLS_H__ */
drivers/crypto/cnxk/meson.build +1 -0
@@ -16,6 +16,7 @@ sources = files( 'cn10k_cryptodev_ops.c', 'cn10k_cryptodev_sec.c', 'cn10k_ipsec.c', + 'cn10k_tls.c', 'cnxk_cryptodev.c', 'cnxk_cryptodev_capabilities.c', 'cnxk_cryptodev_devargs.c',
Signature · 1 line
2.25.1
PATCH v2 16/24 crypto/cnxk: add TLS record datapath handling
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add support for TLS record handling in datapath.
--- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 57 +++- drivers/crypto/cnxk/cn10k_cryptodev_sec.c | 7 + drivers/crypto/cnxk/cn10k_tls_ops.h | 322 ++++++++++++++++++++++ 3 files changed, 380 insertions(+), 6 deletions(-) create mode 100644 drivers/crypto/cnxk/cn10k_tls_ops.h
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +51 -6
@@ -20,11 +20,14 @@#include "roc_sso_dp.h" #include "cn10k_cryptodev.h" -#include "cn10k_cryptodev_ops.h" #include "cn10k_cryptodev_event_dp.h" +#include "cn10k_cryptodev_ops.h" +#include "cn10k_cryptodev_sec.h" #include "cn10k_eventdev.h" #include "cn10k_ipsec.h" #include "cn10k_ipsec_la_ops.h" +#include "cn10k_tls.h" +#include "cn10k_tls_ops.h" #include "cnxk_ae.h" #include "cnxk_cryptodev.h" #include "cnxk_cryptodev_ops.h"
@@ -101,6 +104,18 @@ cpt_sec_ipsec_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op,return ret; } +static __rte_always_inline int __rte_hot +cpt_sec_tls_inst_fill (struct cnxk_cpt_qp *qp,struct rte_crypto_op *op, +struct cn10k_sec_session *sess,struct cpt_inst_s *inst, +struct cpt_inflight_req *infl_req,const bool is_sg_ver2) +{ +if (sess->tls.is_write) +return process_tls_write (&qp->lf, op, sess, &qp->meta_info, infl_req, inst, + is_sg_ver2); +else +return process_tls_read (op, sess, &qp->meta_info, infl_req, inst, is_sg_ver2); +} + static __rte_always_inline int __rte_hotcpt_sec_inst_fill (struct cnxk_cpt_qp *qp,struct rte_crypto_op *op,struct cn10k_sec_session *sess,struct cpt_inst_s *inst,struct cpt_inflight_req *infl_req,const bool is_sg_ver2)
@@ -108,6 +123,8 @@ cpt_sec_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op, struct cn10kif (sess->proto ==RTE_SECURITY_PROTOCOL_IPSEC )return cpt_sec_ipsec_inst_fill (qp, op, sess, &inst[0 ], infl_req, is_sg_ver2); +else if (sess->proto ==RTE_SECURITY_PROTOCOL_TLS_RECORD ) +return cpt_sec_tls_inst_fill (qp, op, sess, &inst[0 ], infl_req, is_sg_ver2);return 0 ; }
@@ -812,7 +829,7 @@ cn10k_cpt_sg_ver2_crypto_adapter_enqueue(void *ws, struct rte_event ev[], uint16 }static inline void -cn10k_cpt_sec_post_process (struct rte_crypto_op *cop,struct cpt_cn10k_res_s *res) +cn10k_cpt_ipsec_post_process (struct rte_crypto_op *cop,struct cpt_cn10k_res_s *res) {struct rte_mbuf *mbuf = cop->sym->m_src;const uint16_t m_len = res->rlen;
@@ -849,10 +866,38 @@ cn10k_cpt_sec_post_process(struct rte_crypto_op *cop, struct cpt_cn10k_res_s *re }static inline void -cn10k_cpt_dequeue_post_process (struct cnxk_cpt_qp *qp, -struct rte_crypto_op *cop, -struct cpt_inflight_req *infl_req, -struct cpt_cn10k_res_s *res) +cn10k_cpt_tls_post_process (struct rte_crypto_op *cop,struct cpt_cn10k_res_s *res) +{ +struct rte_mbuf *mbuf = cop->sym->m_src; +const uint16_t m_len = res->rlen; + +if (!res->uc_compcode) { +if (mbuf->next ==NULL ) + mbuf->data_len = m_len; + mbuf->pkt_len = m_len; + }else { + cop->status =RTE_CRYPTO_OP_STATUS_ERROR ; + cop->aux_flags = res->uc_compcode; +plt_err ("crypto op failed with UC compcode: 0x%x" , res->uc_compcode); + } +} + +static inline void +cn10k_cpt_sec_post_process (struct rte_crypto_op *cop,struct cpt_cn10k_res_s *res) +{ +struct rte_crypto_sym_op *sym_op = cop->sym; +struct cn10k_sec_session *sess; + + sess = sym_op->session; +if (sess->proto ==RTE_SECURITY_PROTOCOL_IPSEC ) +cn10k_cpt_ipsec_post_process (cop, res); +else if (sess->proto ==RTE_SECURITY_PROTOCOL_TLS_RECORD ) +cn10k_cpt_tls_post_process (cop, res); +} + +static inline void +cn10k_cpt_dequeue_post_process (struct cnxk_cpt_qp *qp,struct rte_crypto_op *cop, +struct cpt_inflight_req *infl_req,struct cpt_cn10k_res_s *res) {const uint8_t uc_compcode = res->uc_compcode;const uint8_t compcode = res->compcode;
drivers/crypto/cnxk/cn10k_cryptodev_sec.c +7 -0
@@ -32,6 +32,10 @@ cn10k_sec_session_create(void *dev, struct rte_security_session_conf *conf,return cn10k_ipsec_session_create (vf, qp, &conf->ipsec, conf->crypto_xform, sess); } +if (conf->protocol ==RTE_SECURITY_PROTOCOL_TLS_RECORD ) +return cn10k_tls_record_session_create (vf, qp, &conf->tls_record, + conf->crypto_xform, sess); +return -ENOTSUP ; }
@@ -54,6 +58,9 @@ cn10k_sec_session_destroy(void *dev, struct rte_security_session *sec_sess)if (cn10k_sec_sess->proto ==RTE_SECURITY_PROTOCOL_IPSEC )return cn10k_sec_ipsec_session_destroy (qp, cn10k_sec_sess); +if (cn10k_sec_sess->proto ==RTE_SECURITY_PROTOCOL_TLS_RECORD ) +return cn10k_sec_tls_session_destroy (qp, cn10k_sec_sess); +return -EINVAL ; }
drivers/crypto/cnxk/cn10k_tls_ops.h new file +322 -0
322 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH v2 17/24 crypto/cnxk: add TLS capability
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add TLS 1.2 record read and write capability.
Add DTLS 1.2 record read and write capability.
--- doc/guides/rel_notes/release_24_03.rst | 2 + drivers/common/cnxk/hw/cpt.h | 3 +- drivers/crypto/cnxk/cnxk_cryptodev.h | 12 +- .../crypto/cnxk/cnxk_cryptodev_capabilities.c | 210 ++++++++++++++++++ 4 files changed, 223 insertions(+), 4 deletions(-)
doc/guides/rel_notes/release_24_03.rst +2 -0
@@ -58,6 +58,8 @@ New Features * **Updated Marvell cnxk crypto driver.** * Added support for Rx inject in crypto_cn10k. + * Added support for TLS record processing in crypto_cn10k. Supports TLS 1.2 + and DTLS 1.2. Removed Items -------------
drivers/common/cnxk/hw/cpt.h +2 -1
@@ -80,7 +80,8 @@ union cpt_eng_caps { uint64_t __io sg_ver2 : 1; uint64_t __io sm2 : 1; uint64_t __io pdcp_chain_zuc256 : 1; - uint64_t __io reserved_38_63 : 26; + uint64_t __io tls : 1; + uint64_t __io reserved_39_63 : 25; }; };
drivers/crypto/cnxk/cnxk_cryptodev.h +9 -3
@@ -11,9 +11,11 @@#include "roc_ae.h" #include "roc_cpt.h" -#define CNXK_CPT_MAX_CAPS 55 -#define CNXK_SEC_IPSEC_CRYPTO_MAX_CAPS 16 -#define CNXK_SEC_MAX_CAPS 9 +#define CNXK_CPT_MAX_CAPS 55 +#define CNXK_SEC_IPSEC_CRYPTO_MAX_CAPS 16 +#define CNXK_SEC_TLS_1_3_CRYPTO_MAX_CAPS 2 +#define CNXK_SEC_TLS_1_2_CRYPTO_MAX_CAPS 6 +#define CNXK_SEC_MAX_CAPS 17/** * Device private data
@@ -25,6 +27,10 @@ struct cnxk_cpt_vf {struct roc_cpt cpt;struct rte_cryptodev_capabilities crypto_caps[CNXK_CPT_MAX_CAPS ];struct rte_cryptodev_capabilities sec_ipsec_crypto_caps[CNXK_SEC_IPSEC_CRYPTO_MAX_CAPS ]; +struct rte_cryptodev_capabilities sec_tls_1_3_crypto_caps[CNXK_SEC_TLS_1_3_CRYPTO_MAX_CAPS ]; +struct rte_cryptodev_capabilities sec_tls_1_2_crypto_caps[CNXK_SEC_TLS_1_2_CRYPTO_MAX_CAPS ]; +struct rte_cryptodev_capabilities + sec_dtls_1_2_crypto_caps[CNXK_SEC_TLS_1_2_CRYPTO_MAX_CAPS ];struct rte_security_capability sec_caps[CNXK_SEC_MAX_CAPS ];uint64_t cnxk_fpm_iova[ROC_AE_EC_ID_PMAX ];struct roc_ae_ec_group *ec_grp[ROC_AE_EC_ID_PMAX ];
drivers/crypto/cnxk/cnxk_cryptodev_capabilities.c +210 -0
246 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH v2 18/24 crypto/cnxk: add PMD APIs for raw submission to CPT
In reply to Anoob JosephAdd PMD APIs to allow applications to directly submit CPT instructions to hardware.
--- doc/api/doxy-api-index.md | 1 + doc/api/doxy-api.conf.in | 1 + doc/guides/rel_notes/release_24_03.rst | 1 + drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 75 ++++++++--------- drivers/crypto/cnxk/cn10k_cryptodev_ops.h | 3 + drivers/crypto/cnxk/cn9k_cryptodev_ops.c | 56 ------------- drivers/crypto/cnxk/cn9k_cryptodev_ops.h | 62 ++++++++++++++ drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 99 +++++++++++++++++++++++ drivers/crypto/cnxk/meson.build | 2 +- drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h | 46 +++++++++++ 10 files changed, 252 insertions(+), 94 deletions(-) create mode 100644 drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h
doc/api/doxy-api-index.md +1 -0
@@ -49,6 +49,7 @@ The public API headers are grouped by topics: [iavf](@ref rte_pmd_iavf.h), [bnxt](@ref rte_pmd_bnxt.h), [cnxk](@ref rte_pmd_cnxk.h), + [cnxk_crypto](@ref rte_pmd_cnxk_crypto.h), [cnxk_eventdev](@ref rte_pmd_cnxk_eventdev.h), [cnxk_mempool](@ref rte_pmd_cnxk_mempool.h), [dpaa](@ref rte_pmd_dpaa.h),
doc/api/doxy-api.conf.in +1 -0
@@ -6,6 +6,7 @@ PROJECT_NUMBER = @VERSION@ USE_MDFILE_AS_MAINPAGE = @TOPDIR@/doc/api/doxy-api-index.md INPUT = @TOPDIR@/doc/api/doxy-api-index.md \ @TOPDIR@/drivers/bus/vdev \ + @TOPDIR@/drivers/crypto/cnxk \ @TOPDIR@/drivers/crypto/scheduler \ @TOPDIR@/drivers/dma/dpaa2 \ @TOPDIR@/drivers/event/dlb2 \
doc/guides/rel_notes/release_24_03.rst +1 -0
@@ -60,6 +60,7 @@ New Features * Added support for Rx inject in crypto_cn10k. * Added support for TLS record processing in crypto_cn10k. Supports TLS 1.2 and DTLS 1.2. + * Added PMD API to allow raw submission of instructions to CPT. Removed Items -------------
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +38 -37
181 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_cryptodev_ops.h +3 -0
@@ -12,6 +12,9 @@#include "cnxk_cryptodev.h" +#define CN10K_PKTS_PER_LOOP 32 +#define CN10K_PKTS_PER_STEORL 16 +extern struct rte_cryptodev_ops cn10k_cpt_ops;void cn10k_cpt_set_enqdeq_fns (struct rte_cryptodev *dev,struct cnxk_cpt_vf *vf);
drivers/crypto/cnxk/cn9k_cryptodev_ops.c +0 -56
62 lines not on this page · raw message
drivers/crypto/cnxk/cn9k_cryptodev_ops.h +62 -0
70 lines not on this page · raw message
drivers/crypto/cnxk/cnxk_cryptodev_ops.c +99 -0
114 lines not on this page · raw message
drivers/crypto/cnxk/meson.build +1 -1
@@ -24,8 +24,8 @@ sources = files( 'cnxk_cryptodev_sec.c', ) +headers = files('rte_pmd_cnxk_crypto.h') deps += ['bus_pci', 'common_cnxk', 'security', 'eventdev'] - includes += include_directories('../../../lib/net', '../../event/cnxk') if get_option('buildtype').contains('debug')
drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h new file +46 -0
46 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH v2 19/24 crypto/cnxk: replace PDCP with PDCP chain opcode
In reply to Anoob JosephFrom: Tejasree Kondoj <[email protected]>
Replacing PDCP opcode with PDCP chain opcode.
--- drivers/common/cnxk/roc_se.c | 331 +++++++++------------------------- drivers/common/cnxk/roc_se.h | 18 +- drivers/crypto/cnxk/cnxk_se.h | 96 +++++----- 3 files changed, 135 insertions(+), 310 deletions(-)
drivers/common/cnxk/roc_se.c +89 -242
@@ -88,13 +88,20 @@ cpt_ciph_type_set(roc_se_cipher_type type, struct roc_se_ctx *ctx, uint16_t key_ fc_type =ROC_SE_FC_GEN ;break ;case ROC_SE_ZUC_EEA3 : -if (chained_op) { -if (unlikely (key_len !=16 )) +if (unlikely (key_len !=16 )) { +/* +* ZUC 256 is not supported with older microcode +* where pdcp_iv_offset is 16 +*/ +if (chained_op || (ctx->pdcp_iv_offset ==16 )) { +plt_err ("ZUC 256 is not supported with chained operations" );return -1 ; + } + } +if (chained_op) fc_type =ROC_SE_PDCP_CHAIN ; - }else { +else fc_type =ROC_SE_PDCP ; - }break ;case ROC_SE_SNOW3G_UEA2 :if (unlikely (key_len !=16 ))
@@ -197,33 +204,6 @@ cpt_hmac_opad_ipad_gen(roc_se_auth_type auth_type, const uint8_t *key, uint16_t } } -static int -cpt_pdcp_key_type_set (struct roc_se_zuc_snow3g_ctx *zs_ctx,uint16_t key_len) -{ -roc_se_aes_type key_type =0 ; - -if (roc_model_is_cn9k ()) { -if (key_len !=16 ) { -plt_err ("Only key len 16 is supported on cn9k" ); -return -ENOTSUP ; - } - } - -switch (key_len) { -case 16 : - key_type =ROC_SE_AES_128_BIT ; -break ; -case 32 : - key_type =ROC_SE_AES_256_BIT ; -break ; -default : -plt_err ("Invalid AES key len" ); -return -ENOTSUP ; - } - zs_ctx->zuc.otk_ctx.w0.s.key_len = key_type; -return 0 ; -} -static int cpt_pdcp_chain_key_type_get (uint16_t key_len) {
@@ -247,36 +227,6 @@ cpt_pdcp_chain_key_type_get(uint16_t key_len)return key_type; } -static int -cpt_pdcp_mac_len_set (struct roc_se_zuc_snow3g_ctx *zs_ctx,uint16_t mac_len) -{ -roc_se_pdcp_mac_len_type mac_type =0 ; - -if (roc_model_is_cn9k ()) { -if (mac_len !=4 ) { -plt_err ("Only mac len 4 is supported on cn9k" ); -return -ENOTSUP ; - } - } - -switch (mac_len) { -case 4 : - mac_type =ROC_SE_PDCP_MAC_LEN_32_BIT ; -break ; -case 8 : - mac_type =ROC_SE_PDCP_MAC_LEN_64_BIT ; -break ; -case 16 : - mac_type =ROC_SE_PDCP_MAC_LEN_128_BIT ; -break ; -default : -plt_err ("Invalid ZUC MAC len" ); -return -ENOTSUP ; - } - zs_ctx->zuc.otk_ctx.w0.s.mac_len = mac_type; -return 0 ; -} -static void cpt_zuc_const_update (uint8_t *zuc_const,int key_len,int mac_len) {
@@ -300,32 +250,27 @@ cpt_zuc_const_update(uint8_t *zuc_const, int key_len, int mac_len) }int -roc_se_auth_key_set (struct roc_se_ctx *se_ctx,roc_se_auth_type type, -const uint8_t *key,uint16_t key_len,uint16_t mac_len) +roc_se_auth_key_set (struct roc_se_ctx *se_ctx,roc_se_auth_type type,const uint8_t *key, +uint16_t key_len,uint16_t mac_len) { -struct roc_se_zuc_snow3g_chain_ctx *zs_ch_ctx; -struct roc_se_zuc_snow3g_ctx *zs_ctx;struct roc_se_kasumi_ctx *k_ctx; +struct roc_se_pdcp_ctx *pctx;struct roc_se_context *fctx;uint8_t opcode_minor; -uint8_t pdcp_alg;bool chained_op; -int ret;if (se_ctx ==NULL )return -1 ; - zs_ctx = &se_ctx->se_ctx.zs_ctx; - zs_ch_ctx = &se_ctx->se_ctx.zs_ch_ctx; + pctx = &se_ctx->se_ctx.pctx; k_ctx = &se_ctx->se_ctx.k_ctx; fctx = &se_ctx->se_ctx.fctx; chained_op = se_ctx->ciph_then_auth || se_ctx->auth_then_ciph;if ((type >=ROC_SE_ZUC_EIA3 ) && (type <=ROC_SE_KASUMI_F9_ECB )) { -uint8_t *zuc_const;uint32_t keyx[4 ]; -uint8_t *ci_key; +int key_type;if (!key_len)return -1 ;
@@ -335,98 +280,64 @@ roc_se_auth_key_set(struct roc_se_ctx *se_ctx, roc_se_auth_type type,return -1 ; } -if (roc_model_is_cn9k ()) { - ci_key = zs_ctx->zuc.onk_ctx.ci_key; - zuc_const = zs_ctx->zuc.onk_ctx.zuc_const; - }else { - ci_key = zs_ctx->zuc.otk_ctx.ci_key; - zuc_const = zs_ctx->zuc.otk_ctx.zuc_const; - } -/* For ZUC/SNOW3G/Kasumi */ switch (type) {case ROC_SE_SNOW3G_UIA2 : -if (chained_op) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; - zs_ch_ctx->zuc.onk_ctx.w0.s.state_conf = -ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - ctx->w0.s.auth_type = -ROC_SE_PDCP_CHAIN_ALG_TYPE_SNOW3G ; - ctx->w0.s.mac_len = mac_len; - ctx->w0.s.auth_key_len = key_len; - se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; -cpt_snow3g_key_gen (key, keyx); -memcpy (ctx->st.auth_key, keyx, key_len); - }else { - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_SNOW3G ; - zs_ctx->zuc.otk_ctx.w0.s.mac_len = -ROC_SE_PDCP_MAC_LEN_32_BIT ; -cpt_snow3g_key_gen (key, keyx); -memcpy (ci_key, keyx, key_len); + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.auth_type =ROC_SE_PDCP_CHAIN_ALG_TYPE_SNOW3G ; + pctx->w0.s.mac_len = mac_len; + pctx->w0.s.auth_key_len = key_len; + se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; +cpt_snow3g_key_gen (key, keyx); +memcpy (pctx->st.auth_key, keyx, key_len); + +if (!chained_op) se_ctx->fc_type =ROC_SE_PDCP ; - } se_ctx->pdcp_auth_alg =ROC_SE_PDCP_ALG_TYPE_SNOW3G ; se_ctx->zsk_flags =0x1 ;break ;case ROC_SE_ZUC_EIA3 : -if (chained_op) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; - ctx->w0.s.state_conf = -ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - ctx->w0.s.auth_type = -ROC_SE_PDCP_CHAIN_ALG_TYPE_ZUC ; - ctx->w0.s.mac_len = mac_len; - ctx->w0.s.auth_key_len = key_len; -memcpy (ctx->st.auth_key, key, key_len); -cpt_zuc_const_update (ctx->st.auth_zuc_const, - key_len, mac_len); - se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; - }else { - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_ZUC ; - ret =cpt_pdcp_key_type_set (zs_ctx, key_len); -if (ret) -return ret; - ret =cpt_pdcp_mac_len_set (zs_ctx, mac_len); -if (ret) -return ret; -memcpy (ci_key, key, key_len); -if (key_len ==32 ) -roc_se_zuc_bytes_swap (ci_key, key_len); -cpt_zuc_const_update (zuc_const, key_len, - mac_len); - se_ctx->fc_type =ROC_SE_PDCP ; +if (unlikely (key_len !=16 )) { +/* +* ZUC 256 is not supported with older microcode +* where pdcp_iv_offset is 16 +*/ +if (chained_op || (se_ctx->pdcp_iv_offset ==16 )) { +plt_err ("ZUC 256 is not supported with chained operations" ); +return -1 ; + } } + key_type =cpt_pdcp_chain_key_type_get (key_len); +if (key_type <0 ) +return key_type; + pctx->w0.s.auth_key_len = key_type; + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.auth_type =ROC_SE_PDCP_CHAIN_ALG_TYPE_ZUC ; + pctx->w0.s.mac_len = mac_len; +memcpy (pctx->st.auth_key, key, key_len); +if (key_len ==32 ) +roc_se_zuc_bytes_swap (pctx->st.auth_key, key_len); +cpt_zuc_const_update (pctx->st.auth_zuc_const, key_len, mac_len); + se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; + +if (!chained_op) + se_ctx->fc_type =ROC_SE_PDCP ; se_ctx->pdcp_auth_alg =ROC_SE_PDCP_ALG_TYPE_ZUC ; se_ctx->zsk_flags =0x1 ;break ;case ROC_SE_AES_CMAC_EIA2 : -if (chained_op) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; -int key_type; - key_type =cpt_pdcp_chain_key_type_get (key_len); -if (key_type <0 ) -return key_type; - ctx->w0.s.auth_key_len = key_type; - ctx->w0.s.state_conf = -ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - ctx->w0.s.auth_type = -ROC_SE_PDCP_ALG_TYPE_AES_CTR ; - ctx->w0.s.mac_len = mac_len; -memcpy (ctx->st.auth_key, key, key_len); - se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; - }else { - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_AES_CTR ; - zs_ctx->zuc.otk_ctx.w0.s.mac_len = -ROC_SE_PDCP_MAC_LEN_32_BIT ; -memcpy (ci_key, key, key_len); + key_type =cpt_pdcp_chain_key_type_get (key_len); +if (key_type <0 ) +return key_type; + pctx->w0.s.auth_key_len = key_type; + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.auth_type =ROC_SE_PDCP_ALG_TYPE_AES_CTR ; + pctx->w0.s.mac_len = mac_len; +memcpy (pctx->st.auth_key, key, key_len); + se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; + +if (!chained_op) se_ctx->fc_type =ROC_SE_PDCP ; - } se_ctx->pdcp_auth_alg =ROC_SE_PDCP_ALG_TYPE_AES_CMAC ; se_ctx->eia2 =1 ; se_ctx->zsk_flags =0x1 ;
@@ -454,11 +365,8 @@ roc_se_auth_key_set(struct roc_se_ctx *se_ctx, roc_se_auth_type type, se_ctx->mac_len = mac_len; se_ctx->hash_type = type; - pdcp_alg = zs_ctx->zuc.otk_ctx.w0.s.alg_type;if (chained_op) opcode_minor = se_ctx->ciph_then_auth ?2 :3 ; -else if (roc_model_is_cn9k ()) - opcode_minor = ((1 <<7 ) | (pdcp_alg <<5 ) |1 );else opcode_minor = ((1 <<4 ) |1 );
@@ -513,29 +421,18 @@ int roc_se_ciph_key_set(struct roc_se_ctx *se_ctx, roc_se_cipher_type type, const uint8_t *key, uint16_t key_len) { - bool chained_op = se_ctx->ciph_then_auth || se_ctx->auth_then_ciph; -struct roc_se_zuc_snow3g_ctx *zs_ctx = &se_ctx->se_ctx.zs_ctx; struct roc_se_context *fctx = &se_ctx->se_ctx.fctx; -struct roc_se_zuc_snow3g_chain_ctx *zs_ch_ctx; +struct roc_se_pdcp_ctx *pctx;uint8_t opcode_minor =0 ; -uint8_t *zuc_const;uint32_t keyx[4 ]; -uint8_t *ci_key; +int key_type;int i, ret;/* For NULL cipher, no processing required. */ if (type ==ROC_SE_PASSTHROUGH )return 0 ; - zs_ch_ctx = &se_ctx->se_ctx.zs_ch_ctx; - -if (roc_model_is_cn9k ()) { - ci_key = zs_ctx->zuc.onk_ctx.ci_key; - zuc_const = zs_ctx->zuc.onk_ctx.zuc_const; - }else { - ci_key = zs_ctx->zuc.otk_ctx.ci_key; - zuc_const = zs_ctx->zuc.otk_ctx.zuc_const; - } + pctx = &se_ctx->se_ctx.pctx;if ((type ==ROC_SE_AES_GCM ) || (type ==ROC_SE_AES_CCM )) se_ctx->template_w4.s.opcode_minor =BIT (5 );
@@ -615,72 +512,38 @@ roc_se_ciph_key_set(struct roc_se_ctx *se_ctx, roc_se_cipher_type type, const ui fctx->enc.enc_cipher =ROC_SE_DES3_CBC ; goto success;case ROC_SE_SNOW3G_UEA2 : -if (chained_op == true) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; - zs_ch_ctx->zuc.onk_ctx.w0.s.state_conf = -ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - zs_ch_ctx->zuc.onk_ctx.w0.s.cipher_type = -ROC_SE_PDCP_CHAIN_ALG_TYPE_SNOW3G ; - zs_ch_ctx->zuc.onk_ctx.w0.s.ci_key_len = key_len; -cpt_snow3g_key_gen (key, keyx); -memcpy (ctx->st.ci_key, keyx, key_len); - }else { - zs_ctx->zuc.otk_ctx.w0.s.key_len =ROC_SE_AES_128_BIT ; - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_SNOW3G ; -cpt_snow3g_key_gen (key, keyx); -memcpy (ci_key, keyx, key_len); - } + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.cipher_type =ROC_SE_PDCP_CHAIN_ALG_TYPE_SNOW3G ; + pctx->w0.s.ci_key_len = key_len; +cpt_snow3g_key_gen (key, keyx); +memcpy (pctx->st.ci_key, keyx, key_len); se_ctx->pdcp_ci_alg =ROC_SE_PDCP_ALG_TYPE_SNOW3G ; se_ctx->zsk_flags =0 ; goto success;case ROC_SE_ZUC_EEA3 : -if (chained_op == true) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; - zs_ch_ctx->zuc.onk_ctx.w0.s.state_conf = -ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - zs_ch_ctx->zuc.onk_ctx.w0.s.cipher_type = -ROC_SE_PDCP_CHAIN_ALG_TYPE_ZUC ; -memcpy (ctx->st.ci_key, key, key_len); -memcpy (ctx->st.ci_zuc_const, zuc_key128,32 ); - zs_ch_ctx->zuc.onk_ctx.w0.s.ci_key_len = key_len; - }else { - ret =cpt_pdcp_key_type_set (zs_ctx, key_len); -if (ret) -return ret; - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_ZUC ; -memcpy (ci_key, key, key_len); -if (key_len ==32 ) { -roc_se_zuc_bytes_swap (ci_key, key_len); -memcpy (zuc_const, zuc_key256,16 ); - }else -memcpy (zuc_const, zuc_key128,32 ); - } - + key_type =cpt_pdcp_chain_key_type_get (key_len); +if (key_type <0 ) +return key_type; + pctx->w0.s.ci_key_len = key_type; + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.cipher_type =ROC_SE_PDCP_CHAIN_ALG_TYPE_ZUC ; +memcpy (pctx->st.ci_key, key, key_len); +if (key_len ==32 ) { +roc_se_zuc_bytes_swap (pctx->st.ci_key, key_len); +memcpy (pctx->st.ci_zuc_const, zuc_key256,16 ); + }else +memcpy (pctx->st.ci_zuc_const, zuc_key128,32 ); se_ctx->pdcp_ci_alg =ROC_SE_PDCP_ALG_TYPE_ZUC ; se_ctx->zsk_flags =0 ; goto success;case ROC_SE_AES_CTR_EEA2 : -if (chained_op == true) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; -int key_type; - key_type =cpt_pdcp_chain_key_type_get (key_len); -if (key_type <0 ) -return key_type; - ctx->w0.s.ci_key_len = key_type; - ctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - ctx->w0.s.cipher_type =ROC_SE_PDCP_ALG_TYPE_AES_CTR ; -memcpy (ctx->st.ci_key, key, key_len); - }else { - zs_ctx->zuc.otk_ctx.w0.s.key_len =ROC_SE_AES_128_BIT ; - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_AES_CTR ; -memcpy (ci_key, key, key_len); - } + key_type =cpt_pdcp_chain_key_type_get (key_len); +if (key_type <0 ) +return key_type; + pctx->w0.s.ci_key_len = key_type; + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.cipher_type =ROC_SE_PDCP_ALG_TYPE_AES_CTR ; +memcpy (pctx->st.ci_key, key, key_len); se_ctx->pdcp_ci_alg =ROC_SE_PDCP_ALG_TYPE_AES_CTR ; se_ctx->zsk_flags =0 ; goto success;
@@ -720,20 +583,6 @@ roc_se_ciph_key_set(struct roc_se_ctx *se_ctx, roc_se_cipher_type type, const uireturn 0 ; } -void -roc_se_ctx_swap (struct roc_se_ctx *se_ctx) -{ -struct roc_se_zuc_snow3g_ctx *zs_ctx = &se_ctx->se_ctx.zs_ctx; - -if (roc_model_is_cn9k ()) -return ; - -if (se_ctx->fc_type ==ROC_SE_PDCP_CHAIN ) -return ; - - zs_ctx->zuc.otk_ctx.w0.u64 =htobe64 (zs_ctx->zuc.otk_ctx.w0.u64); -} -void roc_se_ctx_init (struct roc_se_ctx *roc_se_ctx) {
@@ -745,15 +594,13 @@ roc_se_ctx_init(struct roc_se_ctx *roc_se_ctx)case ROC_SE_FC_GEN : ctx_len =sizeof (struct roc_se_context );break ; +case ROC_SE_PDCP_CHAIN :case ROC_SE_PDCP : - ctx_len =sizeof (struct roc_se_zuc_snow3g_ctx ); + ctx_len =sizeof (struct roc_se_pdcp_ctx );break ;case ROC_SE_KASUMI : ctx_len =sizeof (struct roc_se_kasumi_ctx );break ; -case ROC_SE_PDCP_CHAIN : - ctx_len =sizeof (struct roc_se_zuc_snow3g_chain_ctx ); -break ;case ROC_SE_SM : ctx_len =sizeof (struct roc_se_sm_context );break ;
drivers/common/cnxk/roc_se.h +2 -16
@@ -246,7 +246,7 @@ struct roc_se_onk_zuc_ctx {uint8_t zuc_const[32 ]; }; -struct roc_se_onk_zuc_chain_ctx { +struct roc_se_pdcp_ctx { union { uint64_t u64; struct {
@@ -278,19 +278,6 @@ struct roc_se_onk_zuc_chain_ctx { } st; }; -struct roc_se_zuc_snow3g_chain_ctx { -union { -struct roc_se_onk_zuc_chain_ctx onk_ctx; - } zuc; -}; - -struct roc_se_zuc_snow3g_ctx { -union { -struct roc_se_onk_zuc_ctx onk_ctx; -struct roc_se_otk_zuc_ctx otk_ctx; - } zuc; -}; -struct roc_se_kasumi_ctx {uint8_t reg_A[8 ];uint8_t ci_key[16 ];
@@ -356,8 +343,7 @@ struct roc_se_ctx { } w0;union {struct roc_se_context fctx; -struct roc_se_zuc_snow3g_ctx zs_ctx; -struct roc_se_zuc_snow3g_chain_ctx zs_ch_ctx; +struct roc_se_pdcp_ctx pctx;struct roc_se_kasumi_ctx k_ctx;struct roc_se_sm_context sm_ctx; };
drivers/crypto/cnxk/cnxk_se.h +44 -52
212 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH v2 20/24 crypto/cnxk: validate the combinations supported in TLS
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Validate the cipher and auth combination to allow only the ones supported by hardware.
--- drivers/crypto/cnxk/cn10k_tls.c | 35 ++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-)
drivers/crypto/cnxk/cn10k_tls.c +34 -1
@@ -17,6 +17,36 @@#include "cnxk_cryptodev_ops.h" #include "cnxk_security.h" +static int +tls_xform_cipher_auth_verify (struct rte_crypto_sym_xform *cipher_xform, +struct rte_crypto_sym_xform *auth_xform) +{ +enum rte_crypto_cipher_algorithm c_algo = cipher_xform->cipher.algo; +enum rte_crypto_auth_algorithm a_algo = auth_xform->auth.algo; +int ret = -ENOTSUP ; + +switch (c_algo) { +case RTE_CRYPTO_CIPHER_NULL : +if ((a_algo ==RTE_CRYPTO_AUTH_MD5_HMAC ) || (a_algo ==RTE_CRYPTO_AUTH_SHA1_HMAC ) || + (a_algo ==RTE_CRYPTO_AUTH_SHA256_HMAC )) + ret =0 ; +break ; +case RTE_CRYPTO_CIPHER_3DES_CBC : +if (a_algo ==RTE_CRYPTO_AUTH_SHA1_HMAC ) + ret =0 ; +break ; +case RTE_CRYPTO_CIPHER_AES_CBC : +if ((a_algo ==RTE_CRYPTO_AUTH_SHA1_HMAC ) || + (a_algo ==RTE_CRYPTO_AUTH_SHA256_HMAC )) + ret =0 ; +break ; +default : +break ; + } + +return ret; +} +static int tls_xform_cipher_verify (struct rte_crypto_sym_xform *crypto_xform) {
@@ -138,7 +168,10 @@ cnxk_tls_xform_verify(struct rte_security_tls_record_xform *tls_xform, ret =tls_xform_cipher_verify (cipher_xform);if (!ret) -return tls_xform_auth_verify (auth_xform); + ret =tls_xform_auth_verify (auth_xform); + +if (cipher_xform && !ret) +return tls_xform_cipher_auth_verify (cipher_xform, auth_xform);return ret; }
Signature · 1 line
2.25.1
PATCH v2 21/24 crypto/cnxk: use a single function for opad ipad
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Use a single function for opad and ipad generation for IPsec, TLS and flexi crypto.
--- drivers/common/cnxk/cnxk_security.c | 65 ++++++----------------------- drivers/common/cnxk/cnxk_security.h | 5 --- drivers/common/cnxk/roc_se.c | 48 ++++++++++++++------- drivers/common/cnxk/roc_se.h | 9 ++++ drivers/common/cnxk/version.map | 2 +- drivers/crypto/cnxk/cn10k_tls.c | 8 +++- 6 files changed, 61 insertions(+), 76 deletions(-)
drivers/common/cnxk/cnxk_security.c +13 -52
@@ -8,55 +8,9 @@#include "roc_api.h" -void -cnxk_sec_opad_ipad_gen (struct rte_crypto_sym_xform *auth_xform,uint8_t *hmac_opad_ipad, -bool is_tls) -{ -const uint8_t *key = auth_xform->auth.key.data; -uint32_t length = auth_xform->auth.key.length; -uint8_t opad[128 ] = {[0 ...127 ] =0x5c }; -uint8_t ipad[128 ] = {[0 ...127 ] =0x36 }; -uint32_t i; - -/* HMAC OPAD and IPAD */ -for (i =0 ; i <128 && i < length; i++) { - opad[i] = opad[i] ^ key[i]; - ipad[i] = ipad[i] ^ key[i]; - } - -/* Precompute hash of HMAC OPAD and IPAD to avoid -* per packet computation -*/ -switch (auth_xform->auth.algo) { -case RTE_CRYPTO_AUTH_MD5_HMAC : -roc_hash_md5_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ]); -roc_hash_md5_gen (ipad, (uint32_t *)&hmac_opad_ipad[is_tls ?64 :24 ]); -break ; -case RTE_CRYPTO_AUTH_SHA1_HMAC : -roc_hash_sha1_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ]); -roc_hash_sha1_gen (ipad, (uint32_t *)&hmac_opad_ipad[is_tls ?64 :24 ]); -break ; -case RTE_CRYPTO_AUTH_SHA256_HMAC : -roc_hash_sha256_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ],256 ); -roc_hash_sha256_gen (ipad, (uint32_t *)&hmac_opad_ipad[64 ],256 ); -break ; -case RTE_CRYPTO_AUTH_SHA384_HMAC : -roc_hash_sha512_gen (opad, (uint64_t *)&hmac_opad_ipad[0 ],384 ); -roc_hash_sha512_gen (ipad, (uint64_t *)&hmac_opad_ipad[64 ],384 ); -break ; -case RTE_CRYPTO_AUTH_SHA512_HMAC : -roc_hash_sha512_gen (opad, (uint64_t *)&hmac_opad_ipad[0 ],512 ); -roc_hash_sha512_gen (ipad, (uint64_t *)&hmac_opad_ipad[64 ],512 ); -break ; -default : -break ; - } -} -static int -ot_ipsec_sa_common_param_fill (union roc_ot_ipsec_sa_word2 *w2, -uint8_t *cipher_key,uint8_t *salt_key, -uint8_t *hmac_opad_ipad, +ot_ipsec_sa_common_param_fill (union roc_ot_ipsec_sa_word2 *w2,uint8_t *cipher_key, +uint8_t *salt_key,uint8_t *hmac_opad_ipad,struct rte_security_ipsec_xform *ipsec_xfrm,struct rte_crypto_sym_xform *crypto_xfrm) {
@@ -192,7 +146,9 @@ ot_ipsec_sa_common_param_fill(union roc_ot_ipsec_sa_word2 *w2,const uint8_t *auth_key = auth_xfrm->auth.key.data;roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else { -cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad, false); +roc_se_hmac_opad_ipad_gen (w2->s.auth_type, auth_xfrm->auth.key.data, + auth_xfrm->auth.key.length, &hmac_opad_ipad[0 ], +ROC_SE_IPSEC ); } tmp_key = (uint64_t *)hmac_opad_ipad;
@@ -741,7 +697,8 @@ onf_ipsec_sa_common_param_fill(struct roc_ie_onf_sa_ctl *ctl, uint8_t *salt, key = cipher_xfrm->cipher.key.data; length = cipher_xfrm->cipher.key.length; -cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad, false); +roc_se_hmac_opad_ipad_gen (ctl->auth_type, auth_xfrm->auth.key.data, + auth_xfrm->auth.key.length, hmac_opad_ipad,ROC_SE_IPSEC ); }switch (length) {
@@ -1374,7 +1331,9 @@ cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad, false); +roc_se_hmac_opad_ipad_gen ( + out_sa->common_sa.ctl.auth_type, auth_xform->auth.key.data, + auth_xform->auth.key.length, &hmac_opad_ipad[0 ],ROC_SE_IPSEC ); } }
@@ -1441,7 +1400,9 @@ cnxk_on_ipsec_inb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad, false); +roc_se_hmac_opad_ipad_gen ( + in_sa->common_sa.ctl.auth_type, auth_xform->auth.key.data, + auth_xform->auth.key.length, &hmac_opad_ipad[0 ],ROC_SE_IPSEC ); } }
drivers/common/cnxk/cnxk_security.h +0 -5
@@ -68,9 +68,4 @@ int __roc_api cnxk_on_ipsec_inb_sa_create(struct rte_security_ipsec_xform *ipsec int __roc_api cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipsec,struct rte_crypto_sym_xform *crypto_xform,struct roc_ie_on_outb_sa *out_sa); - -__rte_internal -void cnxk_sec_opad_ipad_gen(struct rte_crypto_sym_xform *auth_xform, uint8_t *hmac_opad_ipad, -bool is_tls); -#endif /* _CNXK_SECURITY_H__ */
drivers/common/cnxk/roc_se.c +32 -16
81 lines not on this page · raw message
drivers/common/cnxk/roc_se.h +9 -0
@@ -191,6 +191,12 @@ typedef enum { ROC_SE_PDCP_MAC_LEN_128_BIT = 0x3 } roc_se_pdcp_mac_len_type; +typedef enum { +ROC_SE_IPSEC =0x0 , +ROC_SE_TLS =0x1 , +ROC_SE_FC =0x2 , +}roc_se_op_type ; +struct roc_se_enc_context {uint64_t iv_source :1 ;uint64_t aes_key :2 ;
@@ -401,4 +407,7 @@ int __roc_api roc_se_ciph_key_set(struct roc_se_ctx *se_ctx, roc_se_cipher_type void __roc_api roc_se_ctx_swap(struct roc_se_ctx *se_ctx); void __roc_api roc_se_ctx_init(struct roc_se_ctx *se_ctx); +void __roc_api roc_se_hmac_opad_ipad_gen(roc_se_auth_type auth_type, const uint8_t *key, +uint16_t length,uint8_t *opad_ipad, +roc_se_op_type op_type);#endif /* __ROC_SE_H__ */
drivers/common/cnxk/version.map +1 -1
@@ -1,7 +1,6 @@ INTERNAL { global: - cnxk_sec_opad_ipad_gen; cnxk_ipsec_icvlen_get; cnxk_ipsec_ivlen_get; cnxk_ipsec_outb_rlens_get;
@@ -472,6 +471,7 @@ INTERNAL { roc_plt_init; roc_plt_init_cb_register; roc_plt_lmt_validate; + roc_se_hmac_opad_ipad_gen; roc_sso_dev_fini; roc_sso_dev_init; roc_sso_dump;
drivers/crypto/cnxk/cn10k_tls.c +6 -2
@@ -376,7 +376,9 @@ tls_read_sa_fill(struct roc_ie_ot_tls_read_sa *read_sa,else return -EINVAL ; -cnxk_sec_opad_ipad_gen (auth_xfrm, read_sa->opad_ipad, true); +roc_se_hmac_opad_ipad_gen (read_sa->w2.s.mac_select, auth_xfrm->auth.key.data, + auth_xfrm->auth.key.length, read_sa->opad_ipad,ROC_SE_TLS ); + tmp = (uint64_t *)read_sa->opad_ipad;for (i =0 ; i < (int )(ROC_CTX_MAX_OPAD_IPAD_LEN /sizeof (uint64_t )); i++) tmp[i] =rte_be_to_cpu_64 (tmp[i]);
@@ -503,7 +505,9 @@ tls_write_sa_fill(struct roc_ie_ot_tls_write_sa *write_sa,else return -EINVAL ; -cnxk_sec_opad_ipad_gen (auth_xfrm, write_sa->opad_ipad, true); +roc_se_hmac_opad_ipad_gen (write_sa->w2.s.mac_select, auth_xfrm->auth.key.data, + auth_xfrm->auth.key.length, write_sa->opad_ipad, +ROC_SE_TLS ); } tmp_key = (uint64_t *)write_sa->opad_ipad;
Signature · 1 line
2.25.1
PATCH v2 22/24 crypto/cnxk: add support for TLS 1.3
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add support for TLS-1.3.
--- drivers/common/cnxk/roc_ie_ot_tls.h | 50 +++++-- drivers/crypto/cnxk/cn10k_cryptodev_sec.h | 3 +- drivers/crypto/cnxk/cn10k_tls.c | 159 +++++++++++++--------- 3 files changed, 136 insertions(+), 76 deletions(-)
drivers/common/cnxk/roc_ie_ot_tls.h +38 -12
@@ -17,8 +17,10 @@ (PLT_ALIGN_CEIL (ROC_IE_OT_TLS_AR_WIN_SIZE_MAX ,BITS_PER_LONG_LONG ) /BITS_PER_LONG_LONG ) /* CN10K TLS opcodes */ -#define ROC_IE_OT_TLS_MAJOR_OP_RECORD_ENC 0x16UL -#define ROC_IE_OT_TLS_MAJOR_OP_RECORD_DEC 0x17UL +#define ROC_IE_OT_TLS_MAJOR_OP_RECORD_ENC 0x16UL +#define ROC_IE_OT_TLS_MAJOR_OP_RECORD_DEC 0x17UL +#define ROC_IE_OT_TLS13_MAJOR_OP_RECORD_ENC 0x18UL +#define ROC_IE_OT_TLS13_MAJOR_OP_RECORD_DEC 0x19UL#define ROC_IE_OT_TLS_CTX_MAX_OPAD_IPAD_LEN 128#define ROC_IE_OT_TLS_CTX_MAX_KEY_IV_LEN 48
@@ -42,6 +44,7 @@ enum roc_ie_ot_tls_cipher_type {enum roc_ie_ot_tls_ver {ROC_IE_OT_TLS_VERSION_TLS_12 =1 ,ROC_IE_OT_TLS_VERSION_DTLS_12 =2 , +ROC_IE_OT_TLS_VERSION_TLS_13 =3 , };enum roc_ie_ot_tls_aes_key_len {
@@ -131,11 +134,23 @@ struct roc_ie_ot_tls_read_sa {/* Word4 - Word9 */ uint8_t cipher_key[ROC_IE_OT_TLS_CTX_MAX_KEY_IV_LEN ]; -/* Word10 - Word25 */ -uint8_t opad_ipad[ROC_IE_OT_TLS_CTX_MAX_OPAD_IPAD_LEN ]; +union { +struct { +/* Word10 */ +uint64_t w10_rsvd6; + +/* Word11 - Word25 */ +struct roc_ie_ot_tls_read_ctx_update_reg ctx; + } tls_13; + +struct { +/* Word10 - Word25 */ +uint8_t opad_ipad[ROC_IE_OT_TLS_CTX_MAX_OPAD_IPAD_LEN ]; -/* Word26 - Word32 */ -struct roc_ie_ot_tls_read_ctx_update_reg ctx; +/* Word26 - Word95 */ +struct roc_ie_ot_tls_read_ctx_update_reg ctx; + } tls_12; + }; };struct roc_ie_ot_tls_write_sa {
@@ -187,13 +202,24 @@ struct roc_ie_ot_tls_write_sa {/* Word4 - Word9 */ uint8_t cipher_key[ROC_IE_OT_TLS_CTX_MAX_KEY_IV_LEN ]; -/* Word10 - Word25 */ -uint8_t opad_ipad[ROC_IE_OT_TLS_CTX_MAX_OPAD_IPAD_LEN ]; +union { +struct { +/* Word10 */ +uint64_t w10_rsvd7; + +uint64_t seq_num; + } tls_13; + +struct { +/* Word10 - Word25 */ +uint8_t opad_ipad[ROC_IE_OT_TLS_CTX_MAX_OPAD_IPAD_LEN ]; -/* Word26 */ -uint64_t w26_rsvd7; +/* Word26 */ +uint64_t w26_rsvd7; -/* Word27 */ - uint64_t seq_num; +/* Word27 */ +uint64_t seq_num; + } tls_12; + }; };#endif /* __ROC_IE_OT_TLS_H__ */
drivers/crypto/cnxk/cn10k_cryptodev_sec.h +1 -2
@@ -31,8 +31,7 @@ struct cn10k_sec_session { } ipsec;struct {uint8_t enable_padding :1 ; -uint8_t hdr_len :4 ; -uint8_t rvsd :3 ; +uint8_t rvsd :7 ;bool is_write; } tls; };
drivers/crypto/cnxk/cn10k_tls.c +97 -62
307 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH v2 23/24 crypto/cnxk: add TLS 1.3 capability
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add TLS 1.3 record read and write capability
--- doc/guides/rel_notes/release_24_03.rst | 4 +- .../crypto/cnxk/cnxk_cryptodev_capabilities.c | 92 +++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-)
doc/guides/rel_notes/release_24_03.rst +2 -2
@@ -58,8 +58,8 @@ New Features * **Updated Marvell cnxk crypto driver.** * Added support for Rx inject in crypto_cn10k. - * Added support for TLS record processing in crypto_cn10k. Supports TLS 1.2 - and DTLS 1.2. + * Added support for TLS record processing in crypto_cn10k. Supports TLS 1.2, + DTLS 1.2 and TLS 1.3. * Added PMD API to allow raw submission of instructions to CPT. Removed Items
drivers/crypto/cnxk/cnxk_cryptodev_capabilities.c +92 -0
122 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH v2 24/24 crypto/cnxk: add CPT SG mode debug
In reply to Anoob JosephFrom: Tejasree Kondoj <[email protected]>
Adding CPT SG mode debug dump.
--- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 135 +++++++++++++++++++++- drivers/crypto/cnxk/cnxk_cryptodev_ops.h | 7 ++ 2 files changed, 141 insertions(+), 1 deletion(-)
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +134 -1
@@ -2,9 +2,10 @@* Copyright(C) 2021 Marvell. */ -#include <rte_cryptodev.h> #include <cryptodev_pmd.h> +#include <rte_cryptodev.h> #include <rte_event_crypto_adapter.h> +#include <rte_hexdump.h> #include <rte_ip.h> #include <ethdev_driver.h>
@@ -103,6 +104,104 @@ cpt_sec_ipsec_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op,return ret; } +#ifdef CPT_INST_DEBUG_ENABLE +static inline void +cpt_request_data_sgv2_mode_dump (uint8_t *in_buffer,bool glist,uint16_t components) +{ +struct roc_se_buf_ptr list_ptr[ROC_MAX_SG_CNT ]; +const char *list = glist ?"glist" :"slist" ; +struct roc_sg2list_comp *sg_ptr =NULL ; +uint16_t list_cnt =0 ; +char suffix[64 ]; +int i, j; + + sg_ptr = (void *)in_buffer; +for (i =0 ; i < components; i++) { +for (j =0 ; j < sg_ptr->u.s.valid_segs; j++) { + list_ptr[i *3 + j].size = sg_ptr->u.s.len[j]; + list_ptr[i *3 + j].vaddr = (void *)sg_ptr->ptr[j]; + list_ptr[i *3 + j].vaddr = list_ptr[i *3 + j].vaddr; + list_cnt++; + } + sg_ptr++; + } + +printf ("Current %s: %u\n" , list, list_cnt); + +for (i =0 ; i < list_cnt; i++) { +snprintf (suffix,sizeof (suffix),"%s[%d]: vaddr 0x%" PRIx64", vaddr %p len %u" , + list, i, (uint64_t )list_ptr[i].vaddr, list_ptr[i].vaddr, list_ptr[i].size); +rte_hexdump (stdout, suffix, list_ptr[i].vaddr, list_ptr[i].size); + } +} + +static inline void +cpt_request_data_sg_mode_dump (uint8_t *in_buffer,bool glist) +{ +struct roc_se_buf_ptr list_ptr[ROC_MAX_SG_CNT ]; +const char *list = glist ?"glist" :"slist" ; +struct roc_sglist_comp *sg_ptr =NULL ; +uint16_t list_cnt, components; +char suffix[64 ]; +int i; + + sg_ptr = (void *)(in_buffer +8 ); + list_cnt =rte_be_to_cpu_16 ((((uint16_t *)in_buffer)[2 ])); +if (!glist) { + components = list_cnt /4 ; +if (list_cnt %4 ) + components++; + sg_ptr += components; + list_cnt =rte_be_to_cpu_16 ((((uint16_t *)in_buffer)[3 ])); + } + +printf ("Current %s: %u\n" , list, list_cnt); + components = list_cnt /4 ; +for (i =0 ; i < components; i++) { + list_ptr[i *4 +0 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[0 ]); + list_ptr[i *4 +1 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[1 ]); + list_ptr[i *4 +2 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[2 ]); + list_ptr[i *4 +3 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[3 ]); + list_ptr[i *4 +0 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[0 ]); + list_ptr[i *4 +1 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[1 ]); + list_ptr[i *4 +2 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[2 ]); + list_ptr[i *4 +3 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[3 ]); + list_ptr[i *4 +0 ].vaddr = list_ptr[i *4 +0 ].vaddr; + list_ptr[i *4 +1 ].vaddr = list_ptr[i *4 +1 ].vaddr; + list_ptr[i *4 +2 ].vaddr = list_ptr[i *4 +2 ].vaddr; + list_ptr[i *4 +3 ].vaddr = list_ptr[i *4 +3 ].vaddr; + sg_ptr++; + } + + components = list_cnt %4 ; +switch (components) { +case 3 : + list_ptr[i *4 +2 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[2 ]); + list_ptr[i *4 +2 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[2 ]); + list_ptr[i *4 +2 ].vaddr = list_ptr[i *4 +2 ].vaddr; +/* FALLTHROUGH */ +case 2 : + list_ptr[i *4 +1 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[1 ]); + list_ptr[i *4 +1 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[1 ]); + list_ptr[i *4 +1 ].vaddr = list_ptr[i *4 +1 ].vaddr; +/* FALLTHROUGH */ +case 1 : + list_ptr[i *4 +0 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[0 ]); + list_ptr[i *4 +0 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[0 ]); + list_ptr[i *4 +0 ].vaddr = list_ptr[i *4 +0 ].vaddr; +break ; +default : +break ; + } + +for (i =0 ; i < list_cnt; i++) { +snprintf (suffix,sizeof (suffix),"%s[%d]: vaddr 0x%" PRIx64", vaddr %p len %u" , + list, i, (uint64_t )list_ptr[i].vaddr, list_ptr[i].vaddr, list_ptr[i].size); +rte_hexdump (stdout, suffix, list_ptr[i].vaddr, list_ptr[i].size); + } +} +#endif + static __rte_always_inline int __rte_hot cpt_sec_tls_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op, struct cn10k_sec_session *sess, struct cpt_inst_s *inst,
@@ -205,6 +304,31 @@ cn10k_cpt_fill_inst(struct cnxk_cpt_qp *qp, struct rte_crypto_op *ops[], struct inst[0 ].w7.u64 = w7; +#ifdef CPT_INST_DEBUG_ENABLE + infl_req->dptr = (uint8_t *)inst[0 ].dptr; + infl_req->rptr = (uint8_t *)inst[0 ].rptr; + infl_req->is_sg_ver2 = is_sg_ver2; + infl_req->scatter_sz = inst[0 ].w6.s.scatter_sz; + infl_req->opcode_major = inst[0 ].w4.s.opcode_major; + +rte_hexdump (stdout,"cptr" , (void *)(uint64_t )inst[0 ].w7.s.cptr,128 ); +printf ("major opcode:%d\n" , inst[0 ].w4.s.opcode_major); +printf ("minor opcode:%d\n" , inst[0 ].w4.s.opcode_minor); +printf ("param1:%d\n" , inst[0 ].w4.s.param1); +printf ("param2:%d\n" , inst[0 ].w4.s.param2); +printf ("dlen:%d\n" , inst[0 ].w4.s.dlen); + +if (is_sg_ver2) { +cpt_request_data_sgv2_mode_dump ((void *)inst[0 ].dptr,1 , inst[0 ].w5.s.gather_sz); +cpt_request_data_sgv2_mode_dump ((void *)inst[0 ].rptr,0 , inst[0 ].w6.s.scatter_sz); + }else { +if (infl_req->opcode_major >>7 ) { +cpt_request_data_sg_mode_dump ((void *)inst[0 ].dptr,1 ); +cpt_request_data_sg_mode_dump ((void *)inst[0 ].dptr,0 ); + } + } +#endif +return 1 ; }
@@ -935,6 +1059,15 @@ cn10k_cpt_dequeue_post_process(struct cnxk_cpt_qp *qp, struct rte_crypto_op *cop }if (likely (compcode ==CPT_COMP_GOOD )) { +#ifdef CPT_INST_DEBUG_ENABLE +if (infl_req->is_sg_ver2) +cpt_request_data_sgv2_mode_dump (infl_req->rptr,0 , infl_req->scatter_sz); +else { +if (infl_req->opcode_major >>7 ) +cpt_request_data_sg_mode_dump (infl_req->dptr,0 ); + } +#endif +if (unlikely (uc_compcode)) {if (uc_compcode ==ROC_SE_ERR_GC_ICV_MISCOMPARE ) cop->status =RTE_CRYPTO_OP_STATUS_AUTH_FAILED ;
drivers/crypto/cnxk/cnxk_cryptodev_ops.h +7 -0
@@ -51,6 +51,13 @@ struct cpt_inflight_req { };void *mdata;uint8_t op_flags; +#ifdef CPT_INST_DEBUG_ENABLE +uint8_t scatter_sz; +uint8_t opcode_major; +uint8_t is_sg_ver2; +uint8_t *dptr; +uint8_t *rptr; +#endif void *qp; }__rte_aligned (ROC_ALIGN );
Signature · 1 line
2.25.1
Quoted 39 lines
Subject: [PATCH v2 00/24] Fixes and improvements in crypto cnxk
Add following features
- TLS record processing offload (TLS 1.2-1.3, DTLS 1.2)
- Rx inject to allow lookaside packets to be injected to ethdev Rx
- UsePDCP_CHAINopcode instead of PDCP opcode for cipher-only and auth only cases
- PMD API to submit instructions directly to hardwareChanges in v2
- Addressed checkpatch issue
- Addressed build error with stdatomicAakash Sasidharan (1):
crypto/cnxk: enable digest gen for zero len inputAkhil Goyal (1):
common/cnxk: fix memory leakAnoob Joseph (6):
crypto/cnxk: use common macro
crypto/cnxk: return microcode completion code common/cnxk: update opad-ipad gen to handle TLS common/cnxk: add TLS record contextscrypto/cnxk: separate IPsec from security common codecrypto/cnxk: add PMD APIs for raw submission to CPTGowrishankar Muthukrishnan (1):
crypto/cnxk: fix ECDH pubkey verify in cn9kRahul Bhansali (2):
common/cnxk: add Rx inject configs
crypto/cnxk: Rx inject config updateTejasree Kondoj (3):
crypto/cnxk: fallback to SG if headroom is not availablecrypto/cnxk: replace PDCP with PDCP chain opcodecrypto/cnxk: add CPT SG mode debug
Quoted 11 lines
Vidya Sagar Velumuri (10):
crypto/cnxk: enable Rx inject in security lookasidecrypto/cnxk: enable Rx inject for 103crypto/cnxk: rename security caps as IPsec security capscrypto/cnxk: add TLS record session opscrypto/cnxk: add TLS record datapath handlingcrypto/cnxk: add TLS capability
crypto/cnxk: validate the combinations supported in TLScrypto/cnxk: use a single function for opad ipadcrypto/cnxk: add support for TLS 1.3crypto/cnxk: add TLS 1.3 capability
Apart from the comment on 7/24 patch
Series Acked-by Akhil Goyal <[email protected]>
v3 cover Fixes and improvements in crypto cnxk
In reply to Anoob JosephAdd following features
- TLS record processing offload (TLS 1.2-1.3, DTLS 1.2)
- Rx inject to allow lookaside packets to be injected to ethdev Rx
- Use PDCP_CHAIN opcode instead of PDCP opcode for cipher-only and auth only cases
- PMD API to submit instructions directly to hardware
Changes in v3
- Addressed Akhil's commments on Rx inject patch
- Updated license year to 2024
Changes in v2
- Addressed checkpatch issue
- Addressed build error with stdatomic
Aakash Sasidharan (1):
crypto/cnxk: enable digest gen for zero len input
Akhil Goyal (1):
common/cnxk: fix memory leak
Anoob Joseph (6):
crypto/cnxk: use common macro
crypto/cnxk: return microcode completion code common/cnxk: update opad-ipad gen to handle TLS common/cnxk: add TLS record contexts crypto/cnxk: separate IPsec from security common code crypto/cnxk: add PMD APIs for raw submission to CPT
Gowrishankar Muthukrishnan (1):
crypto/cnxk: fix ECDH pubkey verify in cn9k
Rahul Bhansali (2):
common/cnxk: add Rx inject configs
crypto/cnxk: Rx inject config update
Tejasree Kondoj (3):
crypto/cnxk: fallback to SG if headroom is not available crypto/cnxk: replace PDCP with PDCP chain opcode crypto/cnxk: add CPT SG mode debug
Vidya Sagar Velumuri (10):
crypto/cnxk: enable Rx inject in security lookaside crypto/cnxk: enable Rx inject for 103 crypto/cnxk: rename security caps as IPsec security caps crypto/cnxk: add TLS record session ops crypto/cnxk: add TLS record datapath handling crypto/cnxk: add TLS capability
crypto/cnxk: validate the combinations supported in TLS crypto/cnxk: use a single function for opad ipad crypto/cnxk: add support for TLS 1.3 crypto/cnxk: add TLS 1.3 capability
doc/api/doxy-api-index.md | 1 + doc/api/doxy-api.conf.in | 1 + doc/guides/cryptodevs/cnxk.rst | 12 + doc/guides/cryptodevs/features/cn10k.ini | 1 + doc/guides/rel_notes/release_24_03.rst | 7 + drivers/common/cnxk/cnxk_security.c | 65 +- drivers/common/cnxk/cnxk_security.h | 15 +- drivers/common/cnxk/hw/cpt.h | 12 +- drivers/common/cnxk/roc_cpt.c | 14 +- drivers/common/cnxk/roc_cpt.h | 7 +- drivers/common/cnxk/roc_cpt_priv.h | 2 +- drivers/common/cnxk/roc_idev.c | 44 + drivers/common/cnxk/roc_idev.h | 5 + drivers/common/cnxk/roc_idev_priv.h | 6 + drivers/common/cnxk/roc_ie_ot.c | 14 +- drivers/common/cnxk/roc_ie_ot_tls.h | 225 +++++ drivers/common/cnxk/roc_mbox.h | 2 + drivers/common/cnxk/roc_nix.c | 2 + drivers/common/cnxk/roc_nix_inl.c | 2 +- drivers/common/cnxk/roc_nix_inl_dev.c | 2 +- drivers/common/cnxk/roc_se.c | 379 +++----- drivers/common/cnxk/roc_se.h | 38 +- drivers/common/cnxk/version.map | 5 + drivers/crypto/cnxk/cn10k_cryptodev.c | 2 +- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 401 ++++++++- drivers/crypto/cnxk/cn10k_cryptodev_ops.h | 11 + drivers/crypto/cnxk/cn10k_cryptodev_sec.c | 134 +++ drivers/crypto/cnxk/cn10k_cryptodev_sec.h | 68 ++ drivers/crypto/cnxk/cn10k_ipsec.c | 134 +-- drivers/crypto/cnxk/cn10k_ipsec.h | 38 +- drivers/crypto/cnxk/cn10k_ipsec_la_ops.h | 19 +- drivers/crypto/cnxk/cn10k_tls.c | 830 ++++++++++++++++++ drivers/crypto/cnxk/cn10k_tls.h | 35 + drivers/crypto/cnxk/cn10k_tls_ops.h | 322 +++++++ drivers/crypto/cnxk/cn9k_cryptodev_ops.c | 68 +- drivers/crypto/cnxk/cn9k_cryptodev_ops.h | 62 ++ drivers/crypto/cnxk/cn9k_ipsec_la_ops.h | 16 +- drivers/crypto/cnxk/cnxk_cryptodev.c | 3 + drivers/crypto/cnxk/cnxk_cryptodev.h | 24 +- .../crypto/cnxk/cnxk_cryptodev_capabilities.c | 375 +++++++- drivers/crypto/cnxk/cnxk_cryptodev_devargs.c | 31 + drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 128 ++- drivers/crypto/cnxk/cnxk_cryptodev_ops.h | 7 + drivers/crypto/cnxk/cnxk_se.h | 98 +-- drivers/crypto/cnxk/cnxk_sg.h | 4 +- drivers/crypto/cnxk/meson.build | 4 +- drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h | 46 + drivers/crypto/cnxk/version.map | 3 + 48 files changed, 3018 insertions(+), 706 deletions(-) create mode 100644 drivers/common/cnxk/roc_ie_ot_tls.h create mode 100644 drivers/crypto/cnxk/cn10k_cryptodev_sec.c create mode 100644 drivers/crypto/cnxk/cn10k_cryptodev_sec.h create mode 100644 drivers/crypto/cnxk/cn10k_tls.c create mode 100644 drivers/crypto/cnxk/cn10k_tls.h create mode 100644 drivers/crypto/cnxk/cn10k_tls_ops.h create mode 100644 drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h
Signature · 1 line
2.25.1
PATCH v3 1/24 common/cnxk: fix memory leak
From: Akhil Goyal <[email protected]>
dev_init() acquires some resources which need to be cleaned in case a failure is observed afterwards.
--- drivers/common/cnxk/roc_cpt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/common/cnxk/roc_cpt.c +2 -1
@@ -756,7 +756,7 @@ roc_cpt_dev_init(struct roc_cpt *roc_cpt) rc =dev_init (dev, pci_dev);if (rc) {plt_err ("Failed to init roc device" ); - goto fail; +return rc; } cpt->pci_dev = pci_dev;
@@ -788,6 +788,7 @@ roc_cpt_dev_init(struct roc_cpt *roc_cpt)return 0 ; fail: +dev_fini (dev, pci_dev);return rc; }
Signature · 1 line
2.25.1
PATCH v3 2/24 crypto/cnxk: use common macro
In reply to Anoob JosephHaving different macros for same purpose may cause issues if one is updated without updating the other. Use same macro by including the header.
--- drivers/crypto/cnxk/cnxk_cryptodev.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/crypto/cnxk/cnxk_cryptodev.h +3 -3
@@ -8,12 +8,12 @@#include <rte_cryptodev.h> #include <rte_security.h> +#include "roc_ae.h" #include "roc_cpt.h" #define CNXK_CPT_MAX_CAPS 55#define CNXK_SEC_CRYPTO_MAX_CAPS 16#define CNXK_SEC_MAX_CAPS 9 -#define CNXK_AE_EC_ID_MAX 9/** * Device private data */
@@ -23,8 +23,8 @@ struct cnxk_cpt_vf {struct rte_cryptodev_capabilities sec_crypto_caps[CNXK_SEC_CRYPTO_MAX_CAPS ];struct rte_security_capability sec_caps[CNXK_SEC_MAX_CAPS ]; -uint64_t cnxk_fpm_iova[CNXK_AE_EC_ID_MAX ]; -struct roc_ae_ec_group *ec_grp[CNXK_AE_EC_ID_MAX ]; +uint64_t cnxk_fpm_iova[ROC_AE_EC_ID_PMAX ]; +struct roc_ae_ec_group *ec_grp[ROC_AE_EC_ID_PMAX ];uint16_t max_qps_limit; };
Signature · 1 line
2.25.1
PATCH v3 3/24 crypto/cnxk: fallback to SG if headroom is not available
In reply to Anoob JosephFrom: Tejasree Kondoj <[email protected]>
Falling back to SG mode for cn9k lookaside IPsec
if headroom is not available.
--- drivers/crypto/cnxk/cn9k_ipsec_la_ops.h | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
drivers/crypto/cnxk/cn9k_ipsec_la_ops.h +1 -7
@@ -82,19 +82,13 @@ process_outb_sa(struct cpt_qp_meta_info *m_info, struct rte_crypto_op *cop, extend_tail = rlen - dlen; pkt_len += extend_tail; -if (likely (m_src->next ==NULL )) { +if (likely ((m_src->next ==NULL ) && (hdr_len <= data_off))) {if (unlikely (extend_tail >rte_pktmbuf_tailroom (m_src))) {plt_dp_err ("Not enough tail room (required: %d, available: %d)" , extend_tail,rte_pktmbuf_tailroom (m_src));return -ENOMEM ; } -if (unlikely (hdr_len > data_off)) { -plt_dp_err ("Not enough head room (required: %d, available: %d)" , hdr_len, -rte_pktmbuf_headroom (m_src)); -return -ENOMEM ; - } - m_src->data_len = pkt_len; hdr =PLT_PTR_ADD (m_src->buf_addr, data_off - hdr_len);
Signature · 1 line
2.25.1
PATCH v3 4/24 crypto/cnxk: return microcode completion code
In reply to Anoob JosephReturn microcode completion code in case of errors. This allows applications to check the failure reasons in more granularity.
--- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +2 -0
@@ -823,6 +823,7 @@ cn10k_cpt_sec_post_process(struct rte_crypto_op *cop, struct cpt_cn10k_res_s *rebreak ;default : cop->status =RTE_CRYPTO_OP_STATUS_ERROR ; + cop->aux_flags = res->uc_compcode;return ; }
@@ -884,6 +885,7 @@ cn10k_cpt_dequeue_post_process(struct cnxk_cpt_qp *qp,plt_dp_info ("Request failed with microcode error" );plt_dp_info ("MC completion code 0x%x" , res->uc_compcode); + cop->aux_flags = uc_compcode; goto temp_sess_free; }
Signature · 1 line
2.25.1
PATCH v3 5/24 crypto/cnxk: fix ECDH pubkey verify in cn9k
In reply to Anoob JosephFrom: Gowrishankar Muthukrishnan <[email protected]>
Fix ECDH pubkey verify in cn9k.
--- drivers/crypto/cnxk/cn9k_cryptodev_ops.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/crypto/cnxk/cn9k_cryptodev_ops.c +11 -1
@@ -578,7 +578,17 @@ cn9k_cpt_dequeue_post_process(struct cnxk_cpt_qp *qp, struct rte_crypto_op *cop,if (unlikely (res->uc_compcode)) {if (res->uc_compcode ==ROC_SE_ERR_GC_ICV_MISCOMPARE ) cop->status =RTE_CRYPTO_OP_STATUS_AUTH_FAILED ; -else +else if (cop->type ==RTE_CRYPTO_OP_TYPE_ASYMMETRIC && + cop->sess_type ==RTE_CRYPTO_OP_WITH_SESSION && + cop->asym->ecdh.ke_type ==RTE_CRYPTO_ASYM_KE_PUB_KEY_VERIFY ) { +if (res->uc_compcode ==ROC_AE_ERR_ECC_POINT_NOT_ON_CURVE ) { + cop->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return ; + }else if (res->uc_compcode ==ROC_AE_ERR_ECC_PAI ) { + cop->status =RTE_CRYPTO_OP_STATUS_SUCCESS ; +return ; + } + }else cop->status =RTE_CRYPTO_OP_STATUS_ERROR ;plt_dp_info ("Request failed with microcode error" );
Signature · 1 line
2.25.1
PATCH v3 6/24 crypto/cnxk: enable digest gen for zero len input
In reply to Anoob JosephFrom: Aakash Sasidharan <[email protected]>
With zero length input, digest generation fails with incorrect value. Fix this by completely avoiding the gather component when the input packet has zero data length.
--- drivers/crypto/cnxk/cnxk_se.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/cnxk/cnxk_se.h +1 -1
@@ -2479,7 +2479,7 @@ prepare_iov_from_pkt(struct rte_mbuf *pkt, struct roc_se_iov_ptr *iovec, uint32_void *seg_data =NULL ;int32_t seg_size =0 ; -if (!pkt) { +if (!pkt || pkt->data_len ==0 ) { iovec->buf_cnt =0 ;return 0 ; }
Signature · 1 line
2.25.1
PATCH v3 7/24 crypto/cnxk: enable Rx inject in security lookaside
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add Rx inject fastpath API.
Add devargs "rx_inject_qp" to specify the QP to be used for Rx inject. When the RX inject feature flag is enabled:
1. Reserve a queue pair to use for RX Inject mode.
2. Enable RXC and disable full packet mode for that queue pair.
--- doc/guides/cryptodevs/cnxk.rst | 12 ++ doc/guides/cryptodevs/features/cn10k.ini | 1 + doc/guides/rel_notes/release_24_03.rst | 4 + drivers/common/cnxk/hw/cpt.h | 9 ++ drivers/common/cnxk/roc_cpt.c | 11 +- drivers/common/cnxk/roc_cpt.h | 3 +- drivers/common/cnxk/roc_cpt_priv.h | 2 +- drivers/common/cnxk/roc_ie_ot.c | 14 +-- drivers/common/cnxk/roc_mbox.h | 2 + drivers/common/cnxk/roc_nix_inl.c | 2 +- drivers/common/cnxk/roc_nix_inl_dev.c | 2 +- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 124 +++++++++++++++++++ drivers/crypto/cnxk/cn10k_cryptodev_ops.h | 8 ++ drivers/crypto/cnxk/cn10k_ipsec.c | 4 + drivers/crypto/cnxk/cn10k_ipsec.h | 2 + drivers/crypto/cnxk/cnxk_cryptodev.c | 3 + drivers/crypto/cnxk/cnxk_cryptodev.h | 3 + drivers/crypto/cnxk/cnxk_cryptodev_devargs.c | 31 +++++ drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 27 +++- drivers/crypto/cnxk/version.map | 3 + 20 files changed, 252 insertions(+), 15 deletions(-)
doc/guides/cryptodevs/cnxk.rst +12 -0
@@ -187,6 +187,18 @@ Runtime Config Options With the above configuration, the number of maximum queue pairs supported by the device is limited to 4. +- ``QP ID for RX injection in case of fallback mechanism`` (default ``60``) + + QP ID for RX Injection in fallback mechanism of security. + Can be configured during runtime by using ``rx_inject_qp`` ``devargs`` parameter. + + For example:: + + -a 0002:20:00.1,rx_inject_qp=20 + + With the above configuration, QP 20 will be used by the device for RX Injection + in security in fallback mechanism scenario. + Debugging Options -----------------
doc/guides/cryptodevs/features/cn10k.ini +1 -0
@@ -19,6 +19,7 @@ RSA PRIV OP KEY QT = Y Digest encrypted = Y Sym raw data path API = Y Inner checksum = Y +Rx Injection = Y ; ; Supported crypto algorithms of 'cn10k' crypto driver.
doc/guides/rel_notes/release_24_03.rst +4 -0
@@ -55,6 +55,10 @@ New Features Also, make sure to start the actual text at the margin. ======================================================= +* **Updated Marvell cnxk crypto driver.** + + * Added support for Rx inject in crypto_cn10k. + Removed Items -------------
drivers/common/cnxk/hw/cpt.h +9 -0
@@ -237,6 +237,15 @@ struct cpt_inst_s { uint64_t doneint : 1; uint64_t nixtx_addr : 60; } s; +struct { +uint64_t nixtxl :3 ; +uint64_t doneint :1 ; +uint64_t chan :12 ; +uint64_t l2_len :8 ; +uint64_t et_offset :8 ; +uint64_t match_id :16 ; +uint64_t sso_pf_func :16 ; + } hw_s;uint64_t u64; } w0;
drivers/common/cnxk/roc_cpt.c +8 -3
@@ -463,7 +463,7 @@ cpt_available_lfs_get(struct dev *dev, uint16_t *nb_lf)int cpt_lfs_alloc (struct dev *dev,uint8_t eng_grpmsk,uint8_t blkaddr,bool inl_dev_sso, -bool ctx_ilen_valid,uint8_t ctx_ilen) +bool ctx_ilen_valid,uint8_t ctx_ilen,bool rxc_ena,uint16_t rx_inject_qp) {struct cpt_lf_alloc_req_msg *req;struct mbox *mbox =mbox_get (dev->mbox);
@@ -489,6 +489,10 @@ cpt_lfs_alloc(struct dev *dev, uint8_t eng_grpmsk, uint8_t blkaddr, bool inl_dev req->blkaddr = blkaddr; req->ctx_ilen_valid = ctx_ilen_valid; req->ctx_ilen = ctx_ilen; +if (rxc_ena) { + req->rxc_ena =1 ; + req->rxc_ena_lf_id = rx_inject_qp; + } rc =mbox_process (mbox); exit:
@@ -586,7 +590,7 @@ cpt_iq_init(struct roc_cpt_lf *lf) }int -roc_cpt_dev_configure (struct roc_cpt *roc_cpt,int nb_lf) +roc_cpt_dev_configure (struct roc_cpt *roc_cpt,int nb_lf,bool rxc_ena,uint16_t rx_inject_qp) {struct cpt *cpt =roc_cpt_to_cpt_priv (roc_cpt);uint8_t blkaddr[ROC_CPT_MAX_BLKS ];
@@ -630,7 +634,8 @@ roc_cpt_dev_configure(struct roc_cpt *roc_cpt, int nb_lf) ctx_ilen = (PLT_ALIGN (ROC_OT_IPSEC_SA_SZ_MAX ,ROC_ALIGN ) /128 ) -1 ; } - rc =cpt_lfs_alloc (&cpt->dev, eng_grpmsk, blkaddr[blknum], false, ctx_ilen_valid, ctx_ilen); + rc =cpt_lfs_alloc (&cpt->dev, eng_grpmsk, blkaddr[blknum], false, ctx_ilen_valid, ctx_ilen, + rxc_ena, rx_inject_qp);if (rc) goto lfs_detach;
drivers/common/cnxk/roc_cpt.h +2 -1
@@ -171,7 +171,8 @@ int __roc_api roc_cpt_dev_init(struct roc_cpt *roc_cpt); int __roc_api roc_cpt_dev_fini(struct roc_cpt *roc_cpt); int __roc_api roc_cpt_eng_grp_add(struct roc_cpt *roc_cpt,enum cpt_eng_type eng_type); -int __roc_api roc_cpt_dev_configure(struct roc_cpt *roc_cpt, int nb_lf); +int __roc_api roc_cpt_dev_configure(struct roc_cpt *roc_cpt, int nb_lf, bool rxc_ena, +uint16_t rx_inject_qp); void __roc_api roc_cpt_dev_clear(struct roc_cpt *roc_cpt); int __roc_api roc_cpt_lf_init(struct roc_cpt *roc_cpt, struct roc_cpt_lf *lf); void __roc_api roc_cpt_lf_fini(struct roc_cpt_lf *lf);
drivers/common/cnxk/roc_cpt_priv.h +1 -1
@@ -22,7 +22,7 @@ int cpt_lfs_attach(struct dev *dev, uint8_t blkaddr, bool modify, uint16_t nb_lf);int cpt_lfs_detach (struct dev *dev);int cpt_lfs_alloc (struct dev *dev,uint8_t eng_grpmsk,uint8_t blk,bool inl_dev_sso, -bool ctx_ilen_valid,uint8_t ctx_ilen); +bool ctx_ilen_valid,uint8_t ctx_ilen,bool rxc_ena,uint16_t rx_inject_qp);int cpt_lfs_free (struct dev *dev);int cpt_lf_init (struct roc_cpt_lf *lf);void cpt_lf_fini (struct roc_cpt_lf *lf);
drivers/common/cnxk/roc_ie_ot.c +7 -7
@@ -12,13 +12,13 @@ roc_ot_ipsec_inb_sa_init(struct roc_ot_ipsec_inb_sa *sa, bool is_inline)memset (sa,0 ,sizeof (struct roc_ot_ipsec_inb_sa )); -if (is_inline) { - sa->w0.s.pkt_output =ROC_IE_OT_SA_PKT_OUTPUT_NO_FRAG ; - sa->w0.s.pkt_format =ROC_IE_OT_SA_PKT_FMT_META ; - sa->w0.s.pkind =ROC_IE_OT_CPT_PKIND ; - sa->w0.s.et_ovrwr =1 ; - sa->w2.s.l3hdr_on_err =1 ; - } + sa->w0.s.pkt_output =ROC_IE_OT_SA_PKT_OUTPUT_NO_FRAG ; + sa->w0.s.pkt_format =ROC_IE_OT_SA_PKT_FMT_META ; + sa->w0.s.pkind =ROC_IE_OT_CPT_PKIND ; + sa->w0.s.et_ovrwr =1 ; + sa->w2.s.l3hdr_on_err =1 ; + +PLT_SET_USED (is_inline); offset = offsetof(struct roc_ot_ipsec_inb_sa , ctx); sa->w0.s.hw_ctx_off = offset /ROC_CTX_UNIT_8B ;
drivers/common/cnxk/roc_mbox.h +2 -0
@@ -2022,6 +2022,8 @@ struct cpt_lf_alloc_req_msg { uint8_t __io blkaddr; uint8_t __io ctx_ilen_valid : 1; uint8_t __io ctx_ilen : 7; + uint8_t __io rxc_ena : 1; + uint8_t __io rxc_ena_lf_id : 7; };#define CPT_INLINE_INBOUND 0
drivers/common/cnxk/roc_nix_inl.c +1 -1
@@ -986,7 +986,7 @@ roc_nix_inl_outb_init(struct roc_nix *roc_nix)1ULL <<ROC_CPT_DFLT_ENG_GRP_SE_IE | 1ULL << ROC_CPT_DFLT_ENG_GRP_AE); rc =cpt_lfs_alloc (dev, eng_grpmask, blkaddr, - !roc_nix->ipsec_out_sso_pffunc, ctx_ilen_valid, ctx_ilen); + !roc_nix->ipsec_out_sso_pffunc, ctx_ilen_valid, ctx_ilen, false,0 );if (rc) {plt_err ("Failed to alloc CPT LF resources, rc=%d" , rc); goto lf_detach;
drivers/common/cnxk/roc_nix_inl_dev.c +1 -1
@@ -194,7 +194,7 @@ nix_inl_cpt_setup(struct nix_inl_dev *inl_dev, bool inl_dev_sso) } rc =cpt_lfs_alloc (dev, eng_grpmask,RVU_BLOCK_ADDR_CPT0 , inl_dev_sso, ctx_ilen_valid, - ctx_ilen); + ctx_ilen, false,0 );if (rc) {plt_err ("Failed to alloc CPT LF resources, rc=%d" , rc);return rc;
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +124 -0
142 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_cryptodev_ops.h +8 -0
@@ -16,6 +16,14 @@ extern struct rte_cryptodev_ops cn10k_cpt_ops;void cn10k_cpt_set_enqdeq_fns (struct rte_cryptodev *dev,struct cnxk_cpt_vf *vf); +__rte_internal +uint16_t __rte_hot cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct rte_mbuf **pkts, +struct rte_security_session **sess, +uint16_t nb_pkts); + +__rte_internal +int cn10k_cryptodev_sec_rx_inject_configure(void *device, uint16_t port_id, bool enable); +__rte_internal uint16_t __rte_hot cn10k_cpt_sg_ver1_crypto_adapter_enqueue(void *ws, struct rte_event ev[],uint16_t nb_events);
drivers/crypto/cnxk/cn10k_ipsec.c +4 -0
@@ -10,6 +10,7 @@#include <rte_security_driver.h> #include <rte_udp.h> +#include "cn10k_cryptodev_ops.h" #include "cn10k_ipsec.h" #include "cnxk_cryptodev.h" #include "cnxk_cryptodev_ops.h"
@@ -297,6 +298,7 @@ cn10k_sec_session_create(void *device, struct rte_security_session_conf *conf,if (conf->protocol !=RTE_SECURITY_PROTOCOL_IPSEC )return -ENOTSUP ; + ((struct cn10k_sec_session *)sess)->userdata = conf->userdata;return cn10k_ipsec_session_create (device, &conf->ipsec, conf->crypto_xform, sess); }
@@ -458,4 +460,6 @@ cn10k_sec_ops_override(void) cnxk_sec_ops.session_get_size = cn10k_sec_session_get_size; cnxk_sec_ops.session_stats_get = cn10k_sec_session_stats_get; cnxk_sec_ops.session_update = cn10k_sec_session_update; + cnxk_sec_ops.inb_pkt_rx_inject = cn10k_cryptodev_sec_inb_rx_inject; + cnxk_sec_ops.rx_inject_configure = cn10k_cryptodev_sec_rx_inject_configure; }
drivers/crypto/cnxk/cn10k_ipsec.h +2 -0
@@ -38,6 +38,8 @@ struct cn10k_sec_session {bool is_outbound;/** Queue pair */ struct cnxk_cpt_qp *qp; +/** Userdata to be set for Rx inject */ +void *userdata;/** * End of SW mutable area
drivers/crypto/cnxk/cnxk_cryptodev.c +3 -0
@@ -24,6 +24,9 @@ cnxk_cpt_default_ff_get(void)if (roc_model_is_cn10k ()) ff |=RTE_CRYPTODEV_FF_SECURITY_INNER_CSUM |RTE_CRYPTODEV_FF_SYM_RAW_DP ; +if (roc_model_is_cn10ka_b0 ()) + ff |=RTE_CRYPTODEV_FF_SECURITY_RX_INJECT ; +return ff; }
drivers/crypto/cnxk/cnxk_cryptodev.h +3 -0
@@ -18,6 +18,8 @@* Device private data */ struct cnxk_cpt_vf { +struct roc_cpt_lmtline rx_inj_lmtline; +uint16_t rx_inj_pf_func;struct roc_cpt cpt;struct rte_cryptodev_capabilities crypto_caps[CNXK_CPT_MAX_CAPS ];struct rte_cryptodev_capabilities
@@ -26,6 +28,7 @@ struct cnxk_cpt_vf {uint64_t cnxk_fpm_iova[ROC_AE_EC_ID_PMAX ];struct roc_ae_ec_group *ec_grp[ROC_AE_EC_ID_PMAX ];uint16_t max_qps_limit; +uint16_t rx_inject_qp; };uint64_t cnxk_cpt_default_ff_get (void );
drivers/crypto/cnxk/cnxk_cryptodev_devargs.c +31 -0
@@ -9,6 +9,23 @@#define CNXK_MAX_QPS_LIMIT "max_qps_limit"#define CNXK_MAX_QPS_LIMIT_MIN 1#define CNXK_MAX_QPS_LIMIT_MAX (ROC_CPT_MAX_LFS - 1) +#define CNXK_RX_INJECT_QP "rx_inject_qp" + +static int +parse_rx_inject_qp (const char *key,const char *value,void *extra_args) +{ +RTE_SET_USED (key); +uint32_t val; + + val =atoi (value); + +if (val <CNXK_MAX_QPS_LIMIT_MIN || val >CNXK_MAX_QPS_LIMIT_MAX ) +return -EINVAL ; + + *(uint16_t *)extra_args = val; + +return 0 ; +}static int parse_max_qps_limit (const char *key,const char *value,void *extra_args)
@@ -31,8 +48,12 @@ cnxk_cpt_parse_devargs(struct rte_devargs *devargs, struct cnxk_cpt_vf *vf) {uint16_t max_qps_limit =CNXK_MAX_QPS_LIMIT_MAX ;struct rte_kvargs *kvlist; +uint16_t rx_inject_qp;int rc; +/* Set to max value as default so that the feature is disabled by default. */ + rx_inject_qp =CNXK_MAX_QPS_LIMIT_MAX ; +if (devargs ==NULL ) goto null_devargs;
@@ -48,10 +69,20 @@ cnxk_cpt_parse_devargs(struct rte_devargs *devargs, struct cnxk_cpt_vf *vf)rte_kvargs_free (kvlist); goto exit; } + + rc =rte_kvargs_process (kvlist,CNXK_RX_INJECT_QP , parse_rx_inject_qp, &rx_inject_qp); +if (rc <0 ) { +plt_err ("rx_inject_qp should in the range <%d-%d>" ,CNXK_MAX_QPS_LIMIT_MIN , + max_qps_limit -1 ); +rte_kvargs_free (kvlist); + goto exit; + } +rte_kvargs_free (kvlist); null_devargs: vf->max_qps_limit = max_qps_limit; + vf->rx_inject_qp = rx_inject_qp;return 0 ; exit:
drivers/crypto/cnxk/cnxk_cryptodev_ops.c +26 -1
@@ -5,6 +5,7 @@#include <rte_cryptodev.h> #include <cryptodev_pmd.h> #include <rte_errno.h> +#include <rte_security_driver.h> #include "roc_ae_fpm_tables.h" #include "roc_cpt.h"
@@ -95,6 +96,7 @@ cnxk_cpt_dev_config(struct rte_cryptodev *dev, struct rte_cryptodev_config *confstruct cnxk_cpt_vf *vf = dev->data->dev_private;struct roc_cpt *roc_cpt = &vf->cpt;uint16_t nb_lf_avail, nb_lf; +bool rxc_ena = false;int ret;/* If this is a reconfigure attempt, clear the device and configure again */
@@ -111,7 +113,13 @@ cnxk_cpt_dev_config(struct rte_cryptodev *dev, struct rte_cryptodev_config *confif (nb_lf > nb_lf_avail)return -ENOTSUP ; - ret =roc_cpt_dev_configure (roc_cpt, nb_lf); +if (dev->feature_flags &RTE_CRYPTODEV_FF_SECURITY_RX_INJECT ) { +if (rte_security_dynfield_register () <0 ) +return -ENOTSUP ; + rxc_ena = true; + } + + ret =roc_cpt_dev_configure (roc_cpt, nb_lf, rxc_ena, vf->rx_inject_qp);if (ret) {plt_err ("Could not configure device" );return ret;
@@ -208,6 +216,10 @@ cnxk_cpt_dev_info_get(struct rte_cryptodev *dev, info->sym.max_nb_sessions =0 ; info->min_mbuf_headroom_req =CNXK_CPT_MIN_HEADROOM_REQ ; info->min_mbuf_tailroom_req =CNXK_CPT_MIN_TAILROOM_REQ ; + +/* If the LF ID for RX Inject is less than the available lfs. */ +if (vf->rx_inject_qp > info->max_nb_queue_pairs) + info->feature_flags &= ~RTE_CRYPTODEV_FF_SECURITY_RX_INJECT ; } static void
@@ -452,6 +464,19 @@ cnxk_cpt_queue_pair_setup(struct rte_cryptodev *dev, uint16_t qp_id, qp->sess_mp = conf->mp_session; dev->data->queue_pairs[qp_id] = qp; +if (qp_id == vf->rx_inject_qp) { + ret =roc_cpt_lmtline_init (roc_cpt, &vf->rx_inj_lmtline, vf->rx_inject_qp); +if (ret) { +plt_err ("Could not init lmtline Rx inject" ); + goto exit; + } + + vf->rx_inj_pf_func = qp->lf.pf_func; + +/* Block the queue for other submissions */ + qp->pend_q.pq_mask =0 ; + } +return 0 ; exit:
drivers/crypto/cnxk/version.map +3 -0
@@ -8,5 +8,8 @@ INTERNAL { cn10k_cpt_crypto_adapter_dequeue; cn10k_cpt_crypto_adapter_vector_dequeue; + cn10k_cryptodev_sec_inb_rx_inject; + cn10k_cryptodev_sec_rx_inject_configure; + local: *; };
Signature · 1 line
2.25.1
PATCH v3 8/24 common/cnxk: add Rx inject configs
In reply to Anoob JosephFrom: Rahul Bhansali <[email protected]>
Add Rx inject config for feature enable/disable, and store Rx chan value per port.
--- drivers/common/cnxk/roc_idev.c | 44 +++++++++++++++++++++++++++++ drivers/common/cnxk/roc_idev.h | 5 ++++ drivers/common/cnxk/roc_idev_priv.h | 6 ++++ drivers/common/cnxk/roc_nix.c | 2 ++ drivers/common/cnxk/version.map | 4 +++ 5 files changed, 61 insertions(+)
drivers/common/cnxk/roc_idev.c +44 -0
@@ -310,3 +310,47 @@ roc_idev_nix_inl_meta_aura_get(void)return idev->inl_cfg.meta_aura;return 0 ; } + +uint8_t +roc_idev_nix_rx_inject_get (uint16_t port) +{ +struct idev_cfg *idev; + + idev =idev_get_cfg (); +if (idev !=NULL && port <PLT_MAX_ETHPORTS ) +return idev->inl_rx_inj_cfg.rx_inject_en[port]; + +return 0 ; +} + +void +roc_idev_nix_rx_inject_set (uint16_t port,uint8_t enable) +{ +struct idev_cfg *idev; + + idev =idev_get_cfg (); +if (idev !=NULL && port <PLT_MAX_ETHPORTS ) +__atomic_store_n (&idev->inl_rx_inj_cfg.rx_inject_en[port], enable, + __ATOMIC_RELEASE); +} + +uint16_t * +roc_idev_nix_rx_chan_base_get (void ) +{ +struct idev_cfg *idev =idev_get_cfg (); + +if (idev !=NULL ) +return (uint16_t *)&idev->inl_rx_inj_cfg.chan; + +return NULL ; +} + +void +roc_idev_nix_rx_chan_set (uint16_t port,uint16_t chan) +{ +struct idev_cfg *idev; + + idev =idev_get_cfg (); +if (idev !=NULL && port <PLT_MAX_ETHPORTS ) +__atomic_store_n (&idev->inl_rx_inj_cfg.chan[port], chan, __ATOMIC_RELEASE); +}
drivers/common/cnxk/roc_idev.h +5 -0
@@ -22,4 +22,9 @@ struct roc_nix_list *__roc_api roc_idev_nix_list_get(void); struct roc_mcs *__roc_api roc_idev_mcs_get(uint8_t mcs_idx); void __roc_api roc_idev_mcs_set(struct roc_mcs *mcs); void __roc_api roc_idev_mcs_free(struct roc_mcs *mcs); + +uint8_t __roc_api roc_idev_nix_rx_inject_get(uint16_t port); +void __roc_api roc_idev_nix_rx_inject_set(uint16_t port, uint8_t enable); +uint16_t *__roc_api roc_idev_nix_rx_chan_base_get(void); +void __roc_api roc_idev_nix_rx_chan_set(uint16_t port, uint16_t chan);#endif /* _ROC_IDEV_H_ */
drivers/common/cnxk/roc_idev_priv.h +6 -0
@@ -19,6 +19,11 @@ struct idev_nix_inl_cfg {uint32_t refs; }; +struct idev_nix_inl_rx_inj_cfg { +uint16_t chan[PLT_MAX_ETHPORTS ]; +uint8_t rx_inject_en[PLT_MAX_ETHPORTS ]; +}; +struct idev_cfg {uint16_t sso_pf_func;uint16_t npa_pf_func;
@@ -35,6 +40,7 @@ struct idev_cfg {struct nix_inl_dev *nix_inl_dev;struct idev_nix_inl_cfg inl_cfg;struct roc_nix_list roc_nix_list; +struct idev_nix_inl_rx_inj_cfg inl_rx_inj_cfg;plt_spinlock_t nix_inl_dev_lock;plt_spinlock_t npa_dev_lock; };
drivers/common/cnxk/roc_nix.c +2 -0
@@ -223,6 +223,8 @@ roc_nix_lf_alloc(struct roc_nix *roc_nix, uint32_t nb_rxq, uint32_t nb_txq, nix->nb_rx_queues = nb_rxq; nix->nb_tx_queues = nb_txq; +roc_idev_nix_rx_chan_set (roc_nix->port_id, rsp->rx_chan_base); + nix->rqs =plt_zmalloc (sizeof (struct roc_nix_rq *) * nb_rxq,0 );if (!nix->rqs) { rc = -ENOMEM ;
drivers/common/cnxk/version.map +4 -0
@@ -105,6 +105,10 @@ INTERNAL { roc_idev_num_lmtlines_get; roc_idev_nix_inl_meta_aura_get; roc_idev_nix_list_get; + roc_idev_nix_rx_chan_base_get; + roc_idev_nix_rx_chan_set; + roc_idev_nix_rx_inject_get; + roc_idev_nix_rx_inject_set; roc_ml_reg_read64; roc_ml_reg_write64; roc_ml_reg_read32;
Signature · 1 line
2.25.1
PATCH v3 9/24 crypto/cnxk: Rx inject config update
In reply to Anoob JosephFrom: Rahul Bhansali <[email protected]>
- Update chan in CPT inst from port's Rx chan
- Set Rx inject config in Idev struct
--- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 4 +++- drivers/crypto/cnxk/cn10k_ipsec.c | 3 +++ drivers/crypto/cnxk/cnxk_cryptodev.h | 1 + drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 2 ++ 4 files changed, 9 insertions(+), 1 deletion(-)
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +3 -1
@@ -15,6 +15,7 @@#else #include "roc_io_generic.h" #endif +#include "roc_idev.h" #include "roc_sso.h" #include "roc_sso_dp.h"
@@ -1122,6 +1123,7 @@ cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct rte_mbuf **pkts, inst->dptr = dptr; inst->rptr = dptr; + inst->w0.hw_s.chan = *(vf->rx_chan_base + m->port); inst->w0.hw_s.l2_len = l2_len; inst->w0.hw_s.et_offset = l2_len -2 ;
@@ -1654,7 +1656,7 @@ cn10k_cryptodev_sec_rx_inject_configure(void *device, uint16_t port_id, bool enaif (ret)return -ENOTSUP ; -RTE_SET_USED (enable); +roc_idev_nix_rx_inject_set (port_id, enable);return 0 ; }
drivers/crypto/cnxk/cn10k_ipsec.c +3 -0
@@ -192,6 +192,9 @@ cn10k_ipsec_inb_sa_create(struct roc_cpt *roc_cpt, struct roc_cpt_lf *lf, sec_sess->is_outbound = false; sec_sess->inst.w7 =ipsec_cpt_inst_w7_get (roc_cpt, in_sa); +/* Save index/SPI in cookie, specific required for Rx Inject */ + sa_dptr->w1.s.cookie =0xFFFFFFFF ; +/* pre-populate CPT INST word 4 */ inst_w4.u64 =0 ; inst_w4.s.opcode_major =ROC_IE_OT_MAJOR_OP_PROCESS_INBOUND_IPSEC |ROC_IE_OT_INPLACE_BIT ;
drivers/crypto/cnxk/cnxk_cryptodev.h +1 -0
@@ -20,6 +20,7 @@struct cnxk_cpt_vf {struct roc_cpt_lmtline rx_inj_lmtline;uint16_t rx_inj_pf_func; +uint16_t *rx_chan_base;struct roc_cpt cpt;struct rte_cryptodev_capabilities crypto_caps[CNXK_CPT_MAX_CAPS ];struct rte_cryptodev_capabilities
drivers/crypto/cnxk/cnxk_cryptodev_ops.c +2 -0
@@ -10,6 +10,7 @@#include "roc_ae_fpm_tables.h" #include "roc_cpt.h" #include "roc_errata.h" +#include "roc_idev.h" #include "roc_ie_on.h" #include "cnxk_ae.h"
@@ -117,6 +118,7 @@ cnxk_cpt_dev_config(struct rte_cryptodev *dev, struct rte_cryptodev_config *confif (rte_security_dynfield_register () <0 )return -ENOTSUP ; rxc_ena = true; + vf->rx_chan_base =roc_idev_nix_rx_chan_base_get (); } ret =roc_cpt_dev_configure (roc_cpt, nb_lf, rxc_ena, vf->rx_inject_qp);
Signature · 1 line
2.25.1
PATCH v3 10/24 crypto/cnxk: enable Rx inject for 103
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Enable Rx inject feature for 103XX
--- drivers/crypto/cnxk/cnxk_cryptodev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/cnxk/cnxk_cryptodev.c +1 -1
@@ -24,7 +24,7 @@ cnxk_cpt_default_ff_get(void)if (roc_model_is_cn10k ()) ff |=RTE_CRYPTODEV_FF_SECURITY_INNER_CSUM |RTE_CRYPTODEV_FF_SYM_RAW_DP ; -if (roc_model_is_cn10ka_b0 ()) +if (roc_model_is_cn10ka_b0 () ||roc_model_is_cn10kb ()) ff |=RTE_CRYPTODEV_FF_SECURITY_RX_INJECT ;return ff;
Signature · 1 line
2.25.1
PATCH v3 11/24 crypto/cnxk: rename security caps as IPsec security caps
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Security capabilities would vary between IPsec and other new offloads. Rename existing security caps to indicate that they are IPsec specific ones.
Rename and change the scope of common functions, inorder to avoid code duplication. These functions can be used by both IPsec and TLS
--- drivers/common/cnxk/cnxk_security.c | 13 ++-- drivers/common/cnxk/cnxk_security.h | 17 +++-- drivers/common/cnxk/version.map | 1 + drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 18 ++++- drivers/crypto/cnxk/cn10k_ipsec.c | 46 +++++++----- drivers/crypto/cnxk/cn10k_ipsec.h | 9 ++- drivers/crypto/cnxk/cn10k_ipsec_la_ops.h | 18 ++--- drivers/crypto/cnxk/cn9k_ipsec_la_ops.h | 8 +- drivers/crypto/cnxk/cnxk_cryptodev.h | 10 +-- .../crypto/cnxk/cnxk_cryptodev_capabilities.c | 73 ++++++++++--------- drivers/crypto/cnxk/cnxk_sg.h | 4 +- 11 files changed, 123 insertions(+), 94 deletions(-)
drivers/common/cnxk/cnxk_security.c +6 -7
@@ -8,9 +8,8 @@#include "roc_api.h" -static void -ipsec_hmac_opad_ipad_gen (struct rte_crypto_sym_xform *auth_xform, -uint8_t *hmac_opad_ipad) +void +cnxk_sec_opad_ipad_gen (struct rte_crypto_sym_xform *auth_xform,uint8_t *hmac_opad_ipad) {const uint8_t *key = auth_xform->auth.key.data;uint32_t length = auth_xform->auth.key.length;
@@ -192,7 +191,7 @@ ot_ipsec_sa_common_param_fill(union roc_ot_ipsec_sa_word2 *w2,const uint8_t *auth_key = auth_xfrm->auth.key.data;roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else { -ipsec_hmac_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); } tmp_key = (uint64_t *)hmac_opad_ipad;
@@ -741,7 +740,7 @@ onf_ipsec_sa_common_param_fill(struct roc_ie_onf_sa_ctl *ctl, uint8_t *salt, key = cipher_xfrm->cipher.key.data; length = cipher_xfrm->cipher.key.length; -ipsec_hmac_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); }switch (length) {
@@ -1374,7 +1373,7 @@ cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -ipsec_hmac_opad_ipad_gen (auth_xform, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad); } }
@@ -1441,7 +1440,7 @@ cnxk_on_ipsec_inb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -ipsec_hmac_opad_ipad_gen (auth_xform, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad); } }
drivers/common/cnxk/cnxk_security.h +9 -8
@@ -61,14 +61,15 @@ bool __roc_api cnxk_onf_ipsec_inb_sa_valid(struct roc_onf_ipsec_inb_sa *sa); bool __roc_api cnxk_onf_ipsec_outb_sa_valid(struct roc_onf_ipsec_outb_sa *sa);/* [CN9K] */ -int __roc_api -cnxk_on_ipsec_inb_sa_create (struct rte_security_ipsec_xform *ipsec, -struct rte_crypto_sym_xform *crypto_xform, -struct roc_ie_on_inb_sa *in_sa); +int __roc_api cnxk_on_ipsec_inb_sa_create(struct rte_security_ipsec_xform *ipsec, +struct rte_crypto_sym_xform *crypto_xform, +struct roc_ie_on_inb_sa *in_sa); -int __roc_api -cnxk_on_ipsec_outb_sa_create (struct rte_security_ipsec_xform *ipsec, -struct rte_crypto_sym_xform *crypto_xform, -struct roc_ie_on_outb_sa *out_sa); +int __roc_api cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipsec, +struct rte_crypto_sym_xform *crypto_xform, +struct roc_ie_on_outb_sa *out_sa); + +__rte_internal +void cnxk_sec_opad_ipad_gen(struct rte_crypto_sym_xform *auth_xform, uint8_t *hmac_opad_ipad);#endif /* _CNXK_SECURITY_H__ */
drivers/common/cnxk/version.map +1 -0
@@ -1,6 +1,7 @@ INTERNAL { global: + cnxk_sec_opad_ipad_gen; cnxk_ipsec_icvlen_get; cnxk_ipsec_ivlen_get; cnxk_ipsec_outb_rlens_get;
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +15 -3
@@ -80,8 +80,9 @@ cn10k_cpt_sym_temp_sess_create(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op) } static __rte_always_inline int __rte_hot -cpt_sec_inst_fill (struct cnxk_cpt_qp *qp,struct rte_crypto_op *op,struct cn10k_sec_session *sess, -struct cpt_inst_s *inst,struct cpt_inflight_req *infl_req,const bool is_sg_ver2) +cpt_sec_ipsec_inst_fill (struct cnxk_cpt_qp *qp,struct rte_crypto_op *op, +struct cn10k_sec_session *sess,struct cpt_inst_s *inst, +struct cpt_inflight_req *infl_req,const bool is_sg_ver2) {struct rte_crypto_sym_op *sym_op = op->sym;int ret;
@@ -91,7 +92,7 @@ cpt_sec_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op, struct cn10kreturn -ENOTSUP ; } -if (sess->is_outbound) +if (sess->ipsec.is_outbound) ret =process_outb_sa (&qp->lf, op, sess, &qp->meta_info, infl_req, inst, is_sg_ver2);else
@@ -100,6 +101,17 @@ cpt_sec_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op, struct cn10kreturn ret; } +static __rte_always_inline int __rte_hot +cpt_sec_inst_fill (struct cnxk_cpt_qp *qp,struct rte_crypto_op *op,struct cn10k_sec_session *sess, +struct cpt_inst_s *inst,struct cpt_inflight_req *infl_req,const bool is_sg_ver2) +{ + +if (sess->proto ==RTE_SECURITY_PROTOCOL_IPSEC ) +return cpt_sec_ipsec_inst_fill (qp, op, sess, &inst[0 ], infl_req, is_sg_ver2); + +return 0 ; +} +static inline int cn10k_cpt_fill_inst (struct cnxk_cpt_qp *qp,struct rte_crypto_op *ops[],struct cpt_inst_s inst[],struct cpt_inflight_req *infl_req,const bool is_sg_ver2)
drivers/crypto/cnxk/cn10k_ipsec.c +28 -18
121 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_ipsec.h +7 -2
@@ -29,13 +29,18 @@ struct cn10k_sec_session {/** PMD private space */ +enum rte_security_session_protocol proto;/** Pre-populated CPT inst words */ struct cnxk_cpt_inst_tmpl inst;uint16_t max_extended_len;uint16_t iv_offset;uint8_t iv_length; -uint8_t ip_csum; -bool is_outbound; +union { +struct { +uint8_t ip_csum; +bool is_outbound; + } ipsec; + };/** Queue pair */ struct cnxk_cpt_qp *qp;/** Userdata to be set for Rx inject */
drivers/crypto/cnxk/cn10k_ipsec_la_ops.h +9 -9
@@ -121,7 +121,7 @@ process_outb_sa(struct roc_cpt_lf *lf, struct rte_crypto_op *cop, struct cn10k_s i =0 ; gather_comp = (struct roc_sglist_comp *)((uint8_t *)m_data +8 ); - i =fill_ipsec_sg_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg_comp_from_pkt (gather_comp, i, m_src); ((uint16_t *)in_buffer)[2 ] =rte_cpu_to_be_16 (i); g_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -132,7 +132,7 @@ process_outb_sa(struct roc_cpt_lf *lf, struct rte_crypto_op *cop, struct cn10k_s i =0 ; scatter_comp = (struct roc_sglist_comp *)((uint8_t *)gather_comp + g_size_bytes); - i =fill_ipsec_sg_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg_comp_from_pkt (scatter_comp, i, m_src); ((uint16_t *)in_buffer)[3 ] =rte_cpu_to_be_16 (i); s_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -170,7 +170,7 @@ process_outb_sa(struct roc_cpt_lf *lf, struct rte_crypto_op *cop, struct cn10k_s i =0 ; gather_comp = (struct roc_sg2list_comp *)((uint8_t *)m_data); - i =fill_ipsec_sg2_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg2_comp_from_pkt (gather_comp, i, m_src); cpt_inst_w5.s.gather_sz = ((i +2 ) /3 ); g_size_bytes = ((i +2 ) /3 ) *sizeof (struct roc_sg2list_comp );
@@ -181,7 +181,7 @@ process_outb_sa(struct roc_cpt_lf *lf, struct rte_crypto_op *cop, struct cn10k_s i =0 ; scatter_comp = (struct roc_sg2list_comp *)((uint8_t *)gather_comp + g_size_bytes); - i =fill_ipsec_sg2_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg2_comp_from_pkt (scatter_comp, i, m_src); cpt_inst_w6.s.scatter_sz = ((i +2 ) /3 );
@@ -211,7 +211,7 @@ process_inb_sa(struct rte_crypto_op *cop, struct cn10k_sec_session *sess, struct inst->w4.u64 = sess->inst.w4 |rte_pktmbuf_pkt_len (m_src); dptr =rte_pktmbuf_mtod (m_src, uint64_t); inst->dptr = dptr; - m_src->ol_flags |= (uint64_t )sess->ip_csum; + m_src->ol_flags |= (uint64_t )sess->ipsec.ip_csum; }else if (is_sg_ver2 == false) {struct roc_sglist_comp *scatter_comp, *gather_comp;uint32_t g_size_bytes, s_size_bytes;
@@ -234,7 +234,7 @@ process_inb_sa(struct rte_crypto_op *cop, struct cn10k_sec_session *sess, struct/* Input Gather List */ i =0 ; gather_comp = (struct roc_sglist_comp *)((uint8_t *)m_data +8 ); - i =fill_ipsec_sg_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg_comp_from_pkt (gather_comp, i, m_src); ((uint16_t *)in_buffer)[2 ] =rte_cpu_to_be_16 (i); g_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -242,7 +242,7 @@ process_inb_sa(struct rte_crypto_op *cop, struct cn10k_sec_session *sess, struct/* Output Scatter List */ i =0 ; scatter_comp = (struct roc_sglist_comp *)((uint8_t *)gather_comp + g_size_bytes); - i =fill_ipsec_sg_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg_comp_from_pkt (scatter_comp, i, m_src); ((uint16_t *)in_buffer)[3 ] =rte_cpu_to_be_16 (i); s_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -270,7 +270,7 @@ process_inb_sa(struct rte_crypto_op *cop, struct cn10k_sec_session *sess, struct i =0 ; gather_comp = (struct roc_sg2list_comp *)((uint8_t *)m_data); - i =fill_ipsec_sg2_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg2_comp_from_pkt (gather_comp, i, m_src); cpt_inst_w5.s.gather_sz = ((i +2 ) /3 ); g_size_bytes = ((i +2 ) /3 ) *sizeof (struct roc_sg2list_comp );
@@ -278,7 +278,7 @@ process_inb_sa(struct rte_crypto_op *cop, struct cn10k_sec_session *sess, struct/* Output Scatter List */ i =0 ; scatter_comp = (struct roc_sg2list_comp *)((uint8_t *)gather_comp + g_size_bytes); - i =fill_ipsec_sg2_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg2_comp_from_pkt (scatter_comp, i, m_src); cpt_inst_w6.s.scatter_sz = ((i +2 ) /3 );
drivers/crypto/cnxk/cn9k_ipsec_la_ops.h +4 -4
@@ -132,7 +132,7 @@ process_outb_sa(struct cpt_qp_meta_info *m_info, struct rte_crypto_op *cop, gather_comp = (struct roc_sglist_comp *)((uint8_t *)m_data +8 ); i =fill_sg_comp (gather_comp, i, (uint64_t )hdr, hdr_len); - i =fill_ipsec_sg_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg_comp_from_pkt (gather_comp, i, m_src); ((uint16_t *)in_buffer)[2 ] =rte_cpu_to_be_16 (i); g_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -146,7 +146,7 @@ process_outb_sa(struct cpt_qp_meta_info *m_info, struct rte_crypto_op *cop, scatter_comp = (struct roc_sglist_comp *)((uint8_t *)gather_comp + g_size_bytes); i =fill_sg_comp (scatter_comp, i, (uint64_t )hdr, hdr_len); - i =fill_ipsec_sg_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg_comp_from_pkt (scatter_comp, i, m_src); ((uint16_t *)in_buffer)[3 ] =rte_cpu_to_be_16 (i); s_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -228,7 +228,7 @@ process_inb_sa(struct cpt_qp_meta_info *m_info, struct rte_crypto_op *cop,*/ i =0 ; gather_comp = (struct roc_sglist_comp *)((uint8_t *)m_data +8 ); - i =fill_ipsec_sg_comp_from_pkt (gather_comp, i, m_src); + i =fill_sg_comp_from_pkt (gather_comp, i, m_src); ((uint16_t *)in_buffer)[2 ] =rte_cpu_to_be_16 (i); g_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
@@ -239,7 +239,7 @@ process_inb_sa(struct cpt_qp_meta_info *m_info, struct rte_crypto_op *cop, i =0 ; scatter_comp = (struct roc_sglist_comp *)((uint8_t *)gather_comp + g_size_bytes); i =fill_sg_comp (scatter_comp, i, (uint64_t )hdr, hdr_len); - i =fill_ipsec_sg_comp_from_pkt (scatter_comp, i, m_src); + i =fill_sg_comp_from_pkt (scatter_comp, i, m_src); ((uint16_t *)in_buffer)[3 ] =rte_cpu_to_be_16 (i); s_size_bytes = ((i +3 ) /4 ) *sizeof (struct roc_sglist_comp );
drivers/crypto/cnxk/cnxk_cryptodev.h +5 -5
@@ -11,9 +11,10 @@#include "roc_ae.h" #include "roc_cpt.h" -#define CNXK_CPT_MAX_CAPS 55 -#define CNXK_SEC_CRYPTO_MAX_CAPS 16 -#define CNXK_SEC_MAX_CAPS 9 +#define CNXK_CPT_MAX_CAPS 55 +#define CNXK_SEC_IPSEC_CRYPTO_MAX_CAPS 16 +#define CNXK_SEC_MAX_CAPS 9 +/** * Device private data */
@@ -23,8 +24,7 @@ struct cnxk_cpt_vf {uint16_t *rx_chan_base;struct roc_cpt cpt;struct rte_cryptodev_capabilities crypto_caps[CNXK_CPT_MAX_CAPS ]; -struct rte_cryptodev_capabilities - sec_crypto_caps[CNXK_SEC_CRYPTO_MAX_CAPS ]; +struct rte_cryptodev_capabilities sec_ipsec_crypto_caps[CNXK_SEC_IPSEC_CRYPTO_MAX_CAPS ];struct rte_security_capability sec_caps[CNXK_SEC_MAX_CAPS ];uint64_t cnxk_fpm_iova[ROC_AE_EC_ID_PMAX ];struct roc_ae_ec_group *ec_grp[ROC_AE_EC_ID_PMAX ];
drivers/crypto/cnxk/cnxk_cryptodev_capabilities.c +37 -36
177 lines not on this page · raw message
drivers/crypto/cnxk/cnxk_sg.h +2 -2
@@ -129,7 +129,7 @@ fill_sg_comp_from_iov(struct roc_sglist_comp *list, uint32_t i, struct roc_se_io } static __rte_always_inline uint32_t -fill_ipsec_sg_comp_from_pkt (struct roc_sglist_comp *list,uint32_t i,struct rte_mbuf *pkt) +fill_sg_comp_from_pkt (struct roc_sglist_comp *list,uint32_t i,struct rte_mbuf *pkt) {uint32_t buf_sz;void *vaddr;
@@ -150,7 +150,7 @@ fill_ipsec_sg_comp_from_pkt(struct roc_sglist_comp *list, uint32_t i, struct rte } static __rte_always_inline uint32_t -fill_ipsec_sg2_comp_from_pkt (struct roc_sg2list_comp *list,uint32_t i,struct rte_mbuf *pkt) +fill_sg2_comp_from_pkt (struct roc_sg2list_comp *list,uint32_t i,struct rte_mbuf *pkt) {uint32_t buf_sz;void *vaddr;
Signature · 1 line
2.25.1
PATCH v3 12/24 common/cnxk: update opad-ipad gen to handle TLS
In reply to Anoob JosephFor TLS opcodes, ipad is at the offset 64 as compared to the packed implementation for IPsec. Extend the function to handle TLS contexts as well.
--- drivers/common/cnxk/cnxk_security.c | 15 ++++++++------- drivers/common/cnxk/cnxk_security.h | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-)
drivers/common/cnxk/cnxk_security.c +8 -7
@@ -9,7 +9,8 @@#include "roc_api.h" void -cnxk_sec_opad_ipad_gen (struct rte_crypto_sym_xform *auth_xform,uint8_t *hmac_opad_ipad) +cnxk_sec_opad_ipad_gen (struct rte_crypto_sym_xform *auth_xform,uint8_t *hmac_opad_ipad, +bool is_tls) {const uint8_t *key = auth_xform->auth.key.data;uint32_t length = auth_xform->auth.key.length;
@@ -29,11 +30,11 @@ cnxk_sec_opad_ipad_gen(struct rte_crypto_sym_xform *auth_xform, uint8_t *hmac_opswitch (auth_xform->auth.algo) {case RTE_CRYPTO_AUTH_MD5_HMAC :roc_hash_md5_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ]); -roc_hash_md5_gen (ipad, (uint32_t *)&hmac_opad_ipad[24 ]); +roc_hash_md5_gen (ipad, (uint32_t *)&hmac_opad_ipad[is_tls ?64 :24 ]);break ;case RTE_CRYPTO_AUTH_SHA1_HMAC :roc_hash_sha1_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ]); -roc_hash_sha1_gen (ipad, (uint32_t *)&hmac_opad_ipad[24 ]); +roc_hash_sha1_gen (ipad, (uint32_t *)&hmac_opad_ipad[is_tls ?64 :24 ]);break ;case RTE_CRYPTO_AUTH_SHA256_HMAC :roc_hash_sha256_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ],256 );
@@ -191,7 +192,7 @@ ot_ipsec_sa_common_param_fill(union roc_ot_ipsec_sa_word2 *w2,const uint8_t *auth_key = auth_xfrm->auth.key.data;roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else { -cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad, false); } tmp_key = (uint64_t *)hmac_opad_ipad;
@@ -740,7 +741,7 @@ onf_ipsec_sa_common_param_fill(struct roc_ie_onf_sa_ctl *ctl, uint8_t *salt, key = cipher_xfrm->cipher.key.data; length = cipher_xfrm->cipher.key.length; -cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad, false); }switch (length) {
@@ -1373,7 +1374,7 @@ cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad, false); } }
@@ -1440,7 +1441,7 @@ cnxk_on_ipsec_inb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad); +cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad, false); } }
drivers/common/cnxk/cnxk_security.h +2 -1
@@ -70,6 +70,7 @@ int __roc_api cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipse struct roc_ie_on_outb_sa *out_sa);__rte_internal -void cnxk_sec_opad_ipad_gen(struct rte_crypto_sym_xform *auth_xform, uint8_t *hmac_opad_ipad); +void cnxk_sec_opad_ipad_gen(struct rte_crypto_sym_xform *auth_xform, uint8_t *hmac_opad_ipad, +bool is_tls);#endif /* _CNXK_SECURITY_H__ */
Signature · 1 line
2.25.1
PATCH v3 13/24 common/cnxk: add TLS record contexts
In reply to Anoob JosephAdd TLS record read and write contexts.
--- drivers/common/cnxk/roc_cpt.h | 4 +- drivers/common/cnxk/roc_ie_ot_tls.h | 199 ++++++++++++++++++++++++++++ drivers/common/cnxk/roc_se.h | 11 ++ 3 files changed, 211 insertions(+), 3 deletions(-) create mode 100644 drivers/common/cnxk/roc_ie_ot_tls.h
drivers/common/cnxk/roc_cpt.h +1 -3
@@ -55,6 +55,7 @@#define ROC_CPT_AES_CBC_IV_LEN 16#define ROC_CPT_SHA1_HMAC_LEN 12#define ROC_CPT_SHA2_HMAC_LEN 16 +#define ROC_CPT_DES_IV_LEN 8#define ROC_CPT_DES3_KEY_LEN 24#define ROC_CPT_AES128_KEY_LEN 16
@@ -71,9 +72,6 @@#define ROC_CPT_DES_BLOCK_LENGTH 8#define ROC_CPT_AES_BLOCK_LENGTH 16 -#define ROC_CPT_AES_GCM_ROUNDUP_BYTE_LEN 4 -#define ROC_CPT_AES_CBC_ROUNDUP_BYTE_LEN 16 -/* Salt length for AES-CTR/GCM/CCM and AES-GMAC */ #define ROC_CPT_SALT_LEN 4
drivers/common/cnxk/roc_ie_ot_tls.h new file +199 -0
199 lines not on this page · raw message
drivers/common/cnxk/roc_se.h +11 -0
@@ -5,6 +5,8 @@#ifndef __ROC_SE_H__#define __ROC_SE_H__ +#include "roc_constants.h" +/* SE opcodes */ #define ROC_SE_MAJOR_OP_FC 0x33#define ROC_SE_FC_MINOR_OP_ENCRYPT 0x0
@@ -162,6 +164,15 @@ typedef enum {ROC_SE_ERR_GC_ICV_MISCOMPARE =0x4c ,ROC_SE_ERR_GC_DATA_UNALIGNED =0x4d , +ROC_SE_ERR_SSL_RECORD_LEN_INVALID =0x82 , +ROC_SE_ERR_SSL_CTX_LEN_INVALID =0x83 , +ROC_SE_ERR_SSL_CIPHER_UNSUPPORTED =0x84 , +ROC_SE_ERR_SSL_MAC_UNSUPPORTED =0x85 , +ROC_SE_ERR_SSL_VERSION_UNSUPPORTED =0x86 , +ROC_SE_ERR_SSL_MAC_MISMATCH =0x89 , +ROC_SE_ERR_SSL_PKT_REPLAY_SEQ_OUT_OF_WINDOW =0xC1 , +ROC_SE_ERR_SSL_PKT_REPLAY_SEQ =0xC9 , +/* API Layer */ ROC_SE_ERR_REQ_PENDING =0xfe , ROC_SE_ERR_REQ_TIMEOUT = 0xff,
Signature · 1 line
2.25.1
PATCH v3 14/24 crypto/cnxk: separate IPsec from security common code
In reply to Anoob JosephThe current structs and functions assume only IPsec offload. Separate it out to allow for addition of TLS.
--- drivers/crypto/cnxk/cn10k_cryptodev.c | 2 +- drivers/crypto/cnxk/cn10k_cryptodev_sec.c | 127 ++++++++++++++++++++++ drivers/crypto/cnxk/cn10k_cryptodev_sec.h | 61 +++++++++++ drivers/crypto/cnxk/cn10k_ipsec.c | 127 +++------------------- drivers/crypto/cnxk/cn10k_ipsec.h | 45 +++----- drivers/crypto/cnxk/cn10k_ipsec_la_ops.h | 1 + drivers/crypto/cnxk/meson.build | 1 + 7 files changed, 218 insertions(+), 146 deletions(-) create mode 100644 drivers/crypto/cnxk/cn10k_cryptodev_sec.c create mode 100644 drivers/crypto/cnxk/cn10k_cryptodev_sec.h
drivers/crypto/cnxk/cn10k_cryptodev.c +1 -1
@@ -12,7 +12,7 @@#include "cn10k_cryptodev.h" #include "cn10k_cryptodev_ops.h" -#include "cn10k_ipsec.h" +#include "cn10k_cryptodev_sec.h" #include "cnxk_cryptodev.h" #include "cnxk_cryptodev_capabilities.h" #include "cnxk_cryptodev_sec.h"
drivers/crypto/cnxk/cn10k_cryptodev_sec.c new file +127 -0
127 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_cryptodev_sec.h new file +61 -0
61 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_ipsec.c +13 -114
200 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_ipsec.h +14 -31
57 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_ipsec_la_ops.h +1 -0
@@ -11,6 +11,7 @@#include "roc_ie.h" #include "cn10k_cryptodev.h" +#include "cn10k_cryptodev_sec.h" #include "cn10k_ipsec.h" #include "cnxk_cryptodev.h" #include "cnxk_cryptodev_ops.h"
drivers/crypto/cnxk/meson.build +1 -0
@@ -14,6 +14,7 @@ sources = files( 'cn9k_ipsec.c', 'cn10k_cryptodev.c', 'cn10k_cryptodev_ops.c', + 'cn10k_cryptodev_sec.c', 'cn10k_ipsec.c', 'cnxk_cryptodev.c', 'cnxk_cryptodev_capabilities.c',
Signature · 1 line
2.25.1
PATCH v3 15/24 crypto/cnxk: add TLS record session ops
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add TLS record session ops for creating and destroying security sessions. Add support for both read and write sessions.
--- drivers/crypto/cnxk/cn10k_cryptodev_sec.h | 8 + drivers/crypto/cnxk/cn10k_tls.c | 758 ++++++++++++++++++++++ drivers/crypto/cnxk/cn10k_tls.h | 35 + drivers/crypto/cnxk/meson.build | 1 + 4 files changed, 802 insertions(+) create mode 100644 drivers/crypto/cnxk/cn10k_tls.c create mode 100644 drivers/crypto/cnxk/cn10k_tls.h
drivers/crypto/cnxk/cn10k_cryptodev_sec.h +8 -0
@@ -11,6 +11,7 @@#include "roc_cpt.h" #include "cn10k_ipsec.h" +#include "cn10k_tls.h" struct cn10k_sec_session {struct rte_security_session rte_sess;
@@ -28,6 +29,12 @@ struct cn10k_sec_session {uint8_t ip_csum;bool is_outbound; } ipsec; +struct { +uint8_t enable_padding :1 ; +uint8_t hdr_len :4 ; +uint8_t rvsd :3 ; +bool is_write; + } tls; };/** Queue pair */ struct cnxk_cpt_qp *qp;
@@ -39,6 +46,7 @@ struct cn10k_sec_session {*/ union {struct cn10k_ipsec_sa sa; +struct cn10k_tls_record tls_rec; }; }__rte_aligned (ROC_ALIGN );
drivers/crypto/cnxk/cn10k_tls.c new file +758 -0
758 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_tls.h new file +35 -0
@@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: BSD-3-Clause +* Copyright(C) 2024 Marvell. +*/ + +#ifndef __CN10K_TLS_H__ +#define __CN10K_TLS_H__ + +#include <rte_crypto_sym.h> +#include <rte_security.h> + +#include "roc_ie_ot_tls.h" + +#include "cnxk_cryptodev.h" +#include "cnxk_cryptodev_ops.h" + +/* Forward declaration */ +struct cn10k_sec_session ; + +struct cn10k_tls_record { +union { +/** Read SA */ +struct roc_ie_ot_tls_read_sa read_sa; +/** Write SA */ +struct roc_ie_ot_tls_write_sa write_sa; + }; +}__rte_aligned (ROC_ALIGN ); + +int cn10k_tls_record_session_create (struct cnxk_cpt_vf *vf,struct cnxk_cpt_qp *qp, +struct rte_security_tls_record_xform *tls_xfrm, +struct rte_crypto_sym_xform *crypto_xfrm, +struct rte_security_session *sess); + +int cn10k_sec_tls_session_destroy (struct cnxk_cpt_qp *qp,struct cn10k_sec_session *sess); + +#endif /* __CN10K_TLS_H__ */
drivers/crypto/cnxk/meson.build +1 -0
@@ -16,6 +16,7 @@ sources = files( 'cn10k_cryptodev_ops.c', 'cn10k_cryptodev_sec.c', 'cn10k_ipsec.c', + 'cn10k_tls.c', 'cnxk_cryptodev.c', 'cnxk_cryptodev_capabilities.c', 'cnxk_cryptodev_devargs.c',
Signature · 1 line
2.25.1
PATCH v3 16/24 crypto/cnxk: add TLS record datapath handling
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add support for TLS record handling in datapath.
--- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 57 +++- drivers/crypto/cnxk/cn10k_cryptodev_sec.c | 7 + drivers/crypto/cnxk/cn10k_tls_ops.h | 322 ++++++++++++++++++++++ 3 files changed, 380 insertions(+), 6 deletions(-) create mode 100644 drivers/crypto/cnxk/cn10k_tls_ops.h
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +51 -6
@@ -20,11 +20,14 @@#include "roc_sso_dp.h" #include "cn10k_cryptodev.h" -#include "cn10k_cryptodev_ops.h" #include "cn10k_cryptodev_event_dp.h" +#include "cn10k_cryptodev_ops.h" +#include "cn10k_cryptodev_sec.h" #include "cn10k_eventdev.h" #include "cn10k_ipsec.h" #include "cn10k_ipsec_la_ops.h" +#include "cn10k_tls.h" +#include "cn10k_tls_ops.h" #include "cnxk_ae.h" #include "cnxk_cryptodev.h" #include "cnxk_cryptodev_ops.h"
@@ -101,6 +104,18 @@ cpt_sec_ipsec_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op,return ret; } +static __rte_always_inline int __rte_hot +cpt_sec_tls_inst_fill (struct cnxk_cpt_qp *qp,struct rte_crypto_op *op, +struct cn10k_sec_session *sess,struct cpt_inst_s *inst, +struct cpt_inflight_req *infl_req,const bool is_sg_ver2) +{ +if (sess->tls.is_write) +return process_tls_write (&qp->lf, op, sess, &qp->meta_info, infl_req, inst, + is_sg_ver2); +else +return process_tls_read (op, sess, &qp->meta_info, infl_req, inst, is_sg_ver2); +} + static __rte_always_inline int __rte_hotcpt_sec_inst_fill (struct cnxk_cpt_qp *qp,struct rte_crypto_op *op,struct cn10k_sec_session *sess,struct cpt_inst_s *inst,struct cpt_inflight_req *infl_req,const bool is_sg_ver2)
@@ -108,6 +123,8 @@ cpt_sec_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op, struct cn10kif (sess->proto ==RTE_SECURITY_PROTOCOL_IPSEC )return cpt_sec_ipsec_inst_fill (qp, op, sess, &inst[0 ], infl_req, is_sg_ver2); +else if (sess->proto ==RTE_SECURITY_PROTOCOL_TLS_RECORD ) +return cpt_sec_tls_inst_fill (qp, op, sess, &inst[0 ], infl_req, is_sg_ver2);return 0 ; }
@@ -812,7 +829,7 @@ cn10k_cpt_sg_ver2_crypto_adapter_enqueue(void *ws, struct rte_event ev[], uint16 }static inline void -cn10k_cpt_sec_post_process (struct rte_crypto_op *cop,struct cpt_cn10k_res_s *res) +cn10k_cpt_ipsec_post_process (struct rte_crypto_op *cop,struct cpt_cn10k_res_s *res) {struct rte_mbuf *mbuf = cop->sym->m_src;const uint16_t m_len = res->rlen;
@@ -849,10 +866,38 @@ cn10k_cpt_sec_post_process(struct rte_crypto_op *cop, struct cpt_cn10k_res_s *re }static inline void -cn10k_cpt_dequeue_post_process (struct cnxk_cpt_qp *qp, -struct rte_crypto_op *cop, -struct cpt_inflight_req *infl_req, -struct cpt_cn10k_res_s *res) +cn10k_cpt_tls_post_process (struct rte_crypto_op *cop,struct cpt_cn10k_res_s *res) +{ +struct rte_mbuf *mbuf = cop->sym->m_src; +const uint16_t m_len = res->rlen; + +if (!res->uc_compcode) { +if (mbuf->next ==NULL ) + mbuf->data_len = m_len; + mbuf->pkt_len = m_len; + }else { + cop->status =RTE_CRYPTO_OP_STATUS_ERROR ; + cop->aux_flags = res->uc_compcode; +plt_err ("crypto op failed with UC compcode: 0x%x" , res->uc_compcode); + } +} + +static inline void +cn10k_cpt_sec_post_process (struct rte_crypto_op *cop,struct cpt_cn10k_res_s *res) +{ +struct rte_crypto_sym_op *sym_op = cop->sym; +struct cn10k_sec_session *sess; + + sess = sym_op->session; +if (sess->proto ==RTE_SECURITY_PROTOCOL_IPSEC ) +cn10k_cpt_ipsec_post_process (cop, res); +else if (sess->proto ==RTE_SECURITY_PROTOCOL_TLS_RECORD ) +cn10k_cpt_tls_post_process (cop, res); +} + +static inline void +cn10k_cpt_dequeue_post_process (struct cnxk_cpt_qp *qp,struct rte_crypto_op *cop, +struct cpt_inflight_req *infl_req,struct cpt_cn10k_res_s *res) {const uint8_t uc_compcode = res->uc_compcode;const uint8_t compcode = res->compcode;
drivers/crypto/cnxk/cn10k_cryptodev_sec.c +7 -0
@@ -32,6 +32,10 @@ cn10k_sec_session_create(void *dev, struct rte_security_session_conf *conf,return cn10k_ipsec_session_create (vf, qp, &conf->ipsec, conf->crypto_xform, sess); } +if (conf->protocol ==RTE_SECURITY_PROTOCOL_TLS_RECORD ) +return cn10k_tls_record_session_create (vf, qp, &conf->tls_record, + conf->crypto_xform, sess); +return -ENOTSUP ; }
@@ -54,6 +58,9 @@ cn10k_sec_session_destroy(void *dev, struct rte_security_session *sec_sess)if (cn10k_sec_sess->proto ==RTE_SECURITY_PROTOCOL_IPSEC )return cn10k_sec_ipsec_session_destroy (qp, cn10k_sec_sess); +if (cn10k_sec_sess->proto ==RTE_SECURITY_PROTOCOL_TLS_RECORD ) +return cn10k_sec_tls_session_destroy (qp, cn10k_sec_sess); +return -EINVAL ; }
drivers/crypto/cnxk/cn10k_tls_ops.h new file +322 -0
322 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH v3 17/24 crypto/cnxk: add TLS capability
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add TLS 1.2 record read and write capability.
Add DTLS 1.2 record read and write capability.
--- doc/guides/rel_notes/release_24_03.rst | 2 + drivers/common/cnxk/hw/cpt.h | 3 +- drivers/crypto/cnxk/cnxk_cryptodev.h | 12 +- .../crypto/cnxk/cnxk_cryptodev_capabilities.c | 210 ++++++++++++++++++ 4 files changed, 223 insertions(+), 4 deletions(-)
doc/guides/rel_notes/release_24_03.rst +2 -0
@@ -58,6 +58,8 @@ New Features * **Updated Marvell cnxk crypto driver.** * Added support for Rx inject in crypto_cn10k. + * Added support for TLS record processing in crypto_cn10k. Supports TLS 1.2 + and DTLS 1.2. Removed Items
drivers/common/cnxk/hw/cpt.h +2 -1
@@ -80,7 +80,8 @@ union cpt_eng_caps { uint64_t __io sg_ver2 : 1; uint64_t __io sm2 : 1; uint64_t __io pdcp_chain_zuc256 : 1; - uint64_t __io reserved_38_63 : 26; + uint64_t __io tls : 1; + uint64_t __io reserved_39_63 : 25; }; };
drivers/crypto/cnxk/cnxk_cryptodev.h +9 -3
@@ -11,9 +11,11 @@#include "roc_ae.h" #include "roc_cpt.h" -#define CNXK_CPT_MAX_CAPS 55 -#define CNXK_SEC_IPSEC_CRYPTO_MAX_CAPS 16 -#define CNXK_SEC_MAX_CAPS 9 +#define CNXK_CPT_MAX_CAPS 55 +#define CNXK_SEC_IPSEC_CRYPTO_MAX_CAPS 16 +#define CNXK_SEC_TLS_1_3_CRYPTO_MAX_CAPS 2 +#define CNXK_SEC_TLS_1_2_CRYPTO_MAX_CAPS 6 +#define CNXK_SEC_MAX_CAPS 17/** * Device private data
@@ -25,6 +27,10 @@ struct cnxk_cpt_vf {struct roc_cpt cpt;struct rte_cryptodev_capabilities crypto_caps[CNXK_CPT_MAX_CAPS ];struct rte_cryptodev_capabilities sec_ipsec_crypto_caps[CNXK_SEC_IPSEC_CRYPTO_MAX_CAPS ]; +struct rte_cryptodev_capabilities sec_tls_1_3_crypto_caps[CNXK_SEC_TLS_1_3_CRYPTO_MAX_CAPS ]; +struct rte_cryptodev_capabilities sec_tls_1_2_crypto_caps[CNXK_SEC_TLS_1_2_CRYPTO_MAX_CAPS ]; +struct rte_cryptodev_capabilities + sec_dtls_1_2_crypto_caps[CNXK_SEC_TLS_1_2_CRYPTO_MAX_CAPS ];struct rte_security_capability sec_caps[CNXK_SEC_MAX_CAPS ];uint64_t cnxk_fpm_iova[ROC_AE_EC_ID_PMAX ];struct roc_ae_ec_group *ec_grp[ROC_AE_EC_ID_PMAX ];
drivers/crypto/cnxk/cnxk_cryptodev_capabilities.c +210 -0
246 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH v3 18/24 crypto/cnxk: add PMD APIs for raw submission to CPT
In reply to Anoob JosephAdd PMD APIs to allow applications to directly submit CPT instructions to hardware.
--- doc/api/doxy-api-index.md | 1 + doc/api/doxy-api.conf.in | 1 + doc/guides/rel_notes/release_24_03.rst | 1 + drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 75 ++++++++--------- drivers/crypto/cnxk/cn10k_cryptodev_ops.h | 3 + drivers/crypto/cnxk/cn9k_cryptodev_ops.c | 56 ------------- drivers/crypto/cnxk/cn9k_cryptodev_ops.h | 62 ++++++++++++++ drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 99 +++++++++++++++++++++++ drivers/crypto/cnxk/meson.build | 2 +- drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h | 46 +++++++++++ 10 files changed, 252 insertions(+), 94 deletions(-) create mode 100644 drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h
doc/api/doxy-api-index.md +1 -0
@@ -49,6 +49,7 @@ The public API headers are grouped by topics: [iavf](@ref rte_pmd_iavf.h), [bnxt](@ref rte_pmd_bnxt.h), [cnxk](@ref rte_pmd_cnxk.h), + [cnxk_crypto](@ref rte_pmd_cnxk_crypto.h), [cnxk_eventdev](@ref rte_pmd_cnxk_eventdev.h), [cnxk_mempool](@ref rte_pmd_cnxk_mempool.h), [dpaa](@ref rte_pmd_dpaa.h),
doc/api/doxy-api.conf.in +1 -0
@@ -6,6 +6,7 @@ PROJECT_NUMBER = @VERSION@ USE_MDFILE_AS_MAINPAGE = @TOPDIR@/doc/api/doxy-api-index.md INPUT = @TOPDIR@/doc/api/doxy-api-index.md \ @TOPDIR@/drivers/bus/vdev \ + @TOPDIR@/drivers/crypto/cnxk \ @TOPDIR@/drivers/crypto/scheduler \ @TOPDIR@/drivers/dma/dpaa2 \ @TOPDIR@/drivers/event/dlb2 \
doc/guides/rel_notes/release_24_03.rst +1 -0
@@ -60,6 +60,7 @@ New Features * Added support for Rx inject in crypto_cn10k. * Added support for TLS record processing in crypto_cn10k. Supports TLS 1.2 and DTLS 1.2. + * Added PMD API to allow raw submission of instructions to CPT. Removed Items
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +38 -37
181 lines not on this page · raw message
drivers/crypto/cnxk/cn10k_cryptodev_ops.h +3 -0
@@ -12,6 +12,9 @@#include "cnxk_cryptodev.h" +#define CN10K_PKTS_PER_LOOP 32 +#define CN10K_PKTS_PER_STEORL 16 +extern struct rte_cryptodev_ops cn10k_cpt_ops;void cn10k_cpt_set_enqdeq_fns (struct rte_cryptodev *dev,struct cnxk_cpt_vf *vf);
drivers/crypto/cnxk/cn9k_cryptodev_ops.c +0 -56
62 lines not on this page · raw message
drivers/crypto/cnxk/cn9k_cryptodev_ops.h +62 -0
70 lines not on this page · raw message
drivers/crypto/cnxk/cnxk_cryptodev_ops.c +99 -0
114 lines not on this page · raw message
drivers/crypto/cnxk/meson.build +1 -1
@@ -24,8 +24,8 @@ sources = files( 'cnxk_cryptodev_sec.c', ) +headers = files('rte_pmd_cnxk_crypto.h') deps += ['bus_pci', 'common_cnxk', 'security', 'eventdev'] - includes += include_directories('../../../lib/net', '../../event/cnxk') if get_option('buildtype').contains('debug')
drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h new file +46 -0
46 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH v3 19/24 crypto/cnxk: replace PDCP with PDCP chain opcode
In reply to Anoob JosephFrom: Tejasree Kondoj <[email protected]>
Replacing PDCP opcode with PDCP chain opcode.
--- drivers/common/cnxk/roc_se.c | 331 +++++++++------------------------- drivers/common/cnxk/roc_se.h | 18 +- drivers/crypto/cnxk/cnxk_se.h | 96 +++++----- 3 files changed, 135 insertions(+), 310 deletions(-)
drivers/common/cnxk/roc_se.c +89 -242
@@ -88,13 +88,20 @@ cpt_ciph_type_set(roc_se_cipher_type type, struct roc_se_ctx *ctx, uint16_t key_ fc_type =ROC_SE_FC_GEN ;break ;case ROC_SE_ZUC_EEA3 : -if (chained_op) { -if (unlikely (key_len !=16 )) +if (unlikely (key_len !=16 )) { +/* +* ZUC 256 is not supported with older microcode +* where pdcp_iv_offset is 16 +*/ +if (chained_op || (ctx->pdcp_iv_offset ==16 )) { +plt_err ("ZUC 256 is not supported with chained operations" );return -1 ; + } + } +if (chained_op) fc_type =ROC_SE_PDCP_CHAIN ; - }else { +else fc_type =ROC_SE_PDCP ; - }break ;case ROC_SE_SNOW3G_UEA2 :if (unlikely (key_len !=16 ))
@@ -197,33 +204,6 @@ cpt_hmac_opad_ipad_gen(roc_se_auth_type auth_type, const uint8_t *key, uint16_t } } -static int -cpt_pdcp_key_type_set (struct roc_se_zuc_snow3g_ctx *zs_ctx,uint16_t key_len) -{ -roc_se_aes_type key_type =0 ; - -if (roc_model_is_cn9k ()) { -if (key_len !=16 ) { -plt_err ("Only key len 16 is supported on cn9k" ); -return -ENOTSUP ; - } - } - -switch (key_len) { -case 16 : - key_type =ROC_SE_AES_128_BIT ; -break ; -case 32 : - key_type =ROC_SE_AES_256_BIT ; -break ; -default : -plt_err ("Invalid AES key len" ); -return -ENOTSUP ; - } - zs_ctx->zuc.otk_ctx.w0.s.key_len = key_type; -return 0 ; -} -static int cpt_pdcp_chain_key_type_get (uint16_t key_len) {
@@ -247,36 +227,6 @@ cpt_pdcp_chain_key_type_get(uint16_t key_len)return key_type; } -static int -cpt_pdcp_mac_len_set (struct roc_se_zuc_snow3g_ctx *zs_ctx,uint16_t mac_len) -{ -roc_se_pdcp_mac_len_type mac_type =0 ; - -if (roc_model_is_cn9k ()) { -if (mac_len !=4 ) { -plt_err ("Only mac len 4 is supported on cn9k" ); -return -ENOTSUP ; - } - } - -switch (mac_len) { -case 4 : - mac_type =ROC_SE_PDCP_MAC_LEN_32_BIT ; -break ; -case 8 : - mac_type =ROC_SE_PDCP_MAC_LEN_64_BIT ; -break ; -case 16 : - mac_type =ROC_SE_PDCP_MAC_LEN_128_BIT ; -break ; -default : -plt_err ("Invalid ZUC MAC len" ); -return -ENOTSUP ; - } - zs_ctx->zuc.otk_ctx.w0.s.mac_len = mac_type; -return 0 ; -} -static void cpt_zuc_const_update (uint8_t *zuc_const,int key_len,int mac_len) {
@@ -300,32 +250,27 @@ cpt_zuc_const_update(uint8_t *zuc_const, int key_len, int mac_len) }int -roc_se_auth_key_set (struct roc_se_ctx *se_ctx,roc_se_auth_type type, -const uint8_t *key,uint16_t key_len,uint16_t mac_len) +roc_se_auth_key_set (struct roc_se_ctx *se_ctx,roc_se_auth_type type,const uint8_t *key, +uint16_t key_len,uint16_t mac_len) { -struct roc_se_zuc_snow3g_chain_ctx *zs_ch_ctx; -struct roc_se_zuc_snow3g_ctx *zs_ctx;struct roc_se_kasumi_ctx *k_ctx; +struct roc_se_pdcp_ctx *pctx;struct roc_se_context *fctx;uint8_t opcode_minor; -uint8_t pdcp_alg;bool chained_op; -int ret;if (se_ctx ==NULL )return -1 ; - zs_ctx = &se_ctx->se_ctx.zs_ctx; - zs_ch_ctx = &se_ctx->se_ctx.zs_ch_ctx; + pctx = &se_ctx->se_ctx.pctx; k_ctx = &se_ctx->se_ctx.k_ctx; fctx = &se_ctx->se_ctx.fctx; chained_op = se_ctx->ciph_then_auth || se_ctx->auth_then_ciph;if ((type >=ROC_SE_ZUC_EIA3 ) && (type <=ROC_SE_KASUMI_F9_ECB )) { -uint8_t *zuc_const;uint32_t keyx[4 ]; -uint8_t *ci_key; +int key_type;if (!key_len)return -1 ;
@@ -335,98 +280,64 @@ roc_se_auth_key_set(struct roc_se_ctx *se_ctx, roc_se_auth_type type,return -1 ; } -if (roc_model_is_cn9k ()) { - ci_key = zs_ctx->zuc.onk_ctx.ci_key; - zuc_const = zs_ctx->zuc.onk_ctx.zuc_const; - }else { - ci_key = zs_ctx->zuc.otk_ctx.ci_key; - zuc_const = zs_ctx->zuc.otk_ctx.zuc_const; - } -/* For ZUC/SNOW3G/Kasumi */ switch (type) {case ROC_SE_SNOW3G_UIA2 : -if (chained_op) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; - zs_ch_ctx->zuc.onk_ctx.w0.s.state_conf = -ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - ctx->w0.s.auth_type = -ROC_SE_PDCP_CHAIN_ALG_TYPE_SNOW3G ; - ctx->w0.s.mac_len = mac_len; - ctx->w0.s.auth_key_len = key_len; - se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; -cpt_snow3g_key_gen (key, keyx); -memcpy (ctx->st.auth_key, keyx, key_len); - }else { - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_SNOW3G ; - zs_ctx->zuc.otk_ctx.w0.s.mac_len = -ROC_SE_PDCP_MAC_LEN_32_BIT ; -cpt_snow3g_key_gen (key, keyx); -memcpy (ci_key, keyx, key_len); + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.auth_type =ROC_SE_PDCP_CHAIN_ALG_TYPE_SNOW3G ; + pctx->w0.s.mac_len = mac_len; + pctx->w0.s.auth_key_len = key_len; + se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; +cpt_snow3g_key_gen (key, keyx); +memcpy (pctx->st.auth_key, keyx, key_len); + +if (!chained_op) se_ctx->fc_type =ROC_SE_PDCP ; - } se_ctx->pdcp_auth_alg =ROC_SE_PDCP_ALG_TYPE_SNOW3G ; se_ctx->zsk_flags =0x1 ;break ;case ROC_SE_ZUC_EIA3 : -if (chained_op) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; - ctx->w0.s.state_conf = -ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - ctx->w0.s.auth_type = -ROC_SE_PDCP_CHAIN_ALG_TYPE_ZUC ; - ctx->w0.s.mac_len = mac_len; - ctx->w0.s.auth_key_len = key_len; -memcpy (ctx->st.auth_key, key, key_len); -cpt_zuc_const_update (ctx->st.auth_zuc_const, - key_len, mac_len); - se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; - }else { - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_ZUC ; - ret =cpt_pdcp_key_type_set (zs_ctx, key_len); -if (ret) -return ret; - ret =cpt_pdcp_mac_len_set (zs_ctx, mac_len); -if (ret) -return ret; -memcpy (ci_key, key, key_len); -if (key_len ==32 ) -roc_se_zuc_bytes_swap (ci_key, key_len); -cpt_zuc_const_update (zuc_const, key_len, - mac_len); - se_ctx->fc_type =ROC_SE_PDCP ; +if (unlikely (key_len !=16 )) { +/* +* ZUC 256 is not supported with older microcode +* where pdcp_iv_offset is 16 +*/ +if (chained_op || (se_ctx->pdcp_iv_offset ==16 )) { +plt_err ("ZUC 256 is not supported with chained operations" ); +return -1 ; + } } + key_type =cpt_pdcp_chain_key_type_get (key_len); +if (key_type <0 ) +return key_type; + pctx->w0.s.auth_key_len = key_type; + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.auth_type =ROC_SE_PDCP_CHAIN_ALG_TYPE_ZUC ; + pctx->w0.s.mac_len = mac_len; +memcpy (pctx->st.auth_key, key, key_len); +if (key_len ==32 ) +roc_se_zuc_bytes_swap (pctx->st.auth_key, key_len); +cpt_zuc_const_update (pctx->st.auth_zuc_const, key_len, mac_len); + se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; + +if (!chained_op) + se_ctx->fc_type =ROC_SE_PDCP ; se_ctx->pdcp_auth_alg =ROC_SE_PDCP_ALG_TYPE_ZUC ; se_ctx->zsk_flags =0x1 ;break ;case ROC_SE_AES_CMAC_EIA2 : -if (chained_op) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; -int key_type; - key_type =cpt_pdcp_chain_key_type_get (key_len); -if (key_type <0 ) -return key_type; - ctx->w0.s.auth_key_len = key_type; - ctx->w0.s.state_conf = -ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - ctx->w0.s.auth_type = -ROC_SE_PDCP_ALG_TYPE_AES_CTR ; - ctx->w0.s.mac_len = mac_len; -memcpy (ctx->st.auth_key, key, key_len); - se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; - }else { - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_AES_CTR ; - zs_ctx->zuc.otk_ctx.w0.s.mac_len = -ROC_SE_PDCP_MAC_LEN_32_BIT ; -memcpy (ci_key, key, key_len); + key_type =cpt_pdcp_chain_key_type_get (key_len); +if (key_type <0 ) +return key_type; + pctx->w0.s.auth_key_len = key_type; + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.auth_type =ROC_SE_PDCP_ALG_TYPE_AES_CTR ; + pctx->w0.s.mac_len = mac_len; +memcpy (pctx->st.auth_key, key, key_len); + se_ctx->fc_type =ROC_SE_PDCP_CHAIN ; + +if (!chained_op) se_ctx->fc_type =ROC_SE_PDCP ; - } se_ctx->pdcp_auth_alg =ROC_SE_PDCP_ALG_TYPE_AES_CMAC ; se_ctx->eia2 =1 ; se_ctx->zsk_flags =0x1 ;
@@ -454,11 +365,8 @@ roc_se_auth_key_set(struct roc_se_ctx *se_ctx, roc_se_auth_type type, se_ctx->mac_len = mac_len; se_ctx->hash_type = type; - pdcp_alg = zs_ctx->zuc.otk_ctx.w0.s.alg_type;if (chained_op) opcode_minor = se_ctx->ciph_then_auth ?2 :3 ; -else if (roc_model_is_cn9k ()) - opcode_minor = ((1 <<7 ) | (pdcp_alg <<5 ) |1 );else opcode_minor = ((1 <<4 ) |1 );
@@ -513,29 +421,18 @@ int roc_se_ciph_key_set(struct roc_se_ctx *se_ctx, roc_se_cipher_type type, const uint8_t *key, uint16_t key_len) { - bool chained_op = se_ctx->ciph_then_auth || se_ctx->auth_then_ciph; -struct roc_se_zuc_snow3g_ctx *zs_ctx = &se_ctx->se_ctx.zs_ctx; struct roc_se_context *fctx = &se_ctx->se_ctx.fctx; -struct roc_se_zuc_snow3g_chain_ctx *zs_ch_ctx; +struct roc_se_pdcp_ctx *pctx;uint8_t opcode_minor =0 ; -uint8_t *zuc_const;uint32_t keyx[4 ]; -uint8_t *ci_key; +int key_type;int i, ret;/* For NULL cipher, no processing required. */ if (type ==ROC_SE_PASSTHROUGH )return 0 ; - zs_ch_ctx = &se_ctx->se_ctx.zs_ch_ctx; - -if (roc_model_is_cn9k ()) { - ci_key = zs_ctx->zuc.onk_ctx.ci_key; - zuc_const = zs_ctx->zuc.onk_ctx.zuc_const; - }else { - ci_key = zs_ctx->zuc.otk_ctx.ci_key; - zuc_const = zs_ctx->zuc.otk_ctx.zuc_const; - } + pctx = &se_ctx->se_ctx.pctx;if ((type ==ROC_SE_AES_GCM ) || (type ==ROC_SE_AES_CCM )) se_ctx->template_w4.s.opcode_minor =BIT (5 );
@@ -615,72 +512,38 @@ roc_se_ciph_key_set(struct roc_se_ctx *se_ctx, roc_se_cipher_type type, const ui fctx->enc.enc_cipher =ROC_SE_DES3_CBC ; goto success;case ROC_SE_SNOW3G_UEA2 : -if (chained_op == true) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; - zs_ch_ctx->zuc.onk_ctx.w0.s.state_conf = -ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - zs_ch_ctx->zuc.onk_ctx.w0.s.cipher_type = -ROC_SE_PDCP_CHAIN_ALG_TYPE_SNOW3G ; - zs_ch_ctx->zuc.onk_ctx.w0.s.ci_key_len = key_len; -cpt_snow3g_key_gen (key, keyx); -memcpy (ctx->st.ci_key, keyx, key_len); - }else { - zs_ctx->zuc.otk_ctx.w0.s.key_len =ROC_SE_AES_128_BIT ; - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_SNOW3G ; -cpt_snow3g_key_gen (key, keyx); -memcpy (ci_key, keyx, key_len); - } + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.cipher_type =ROC_SE_PDCP_CHAIN_ALG_TYPE_SNOW3G ; + pctx->w0.s.ci_key_len = key_len; +cpt_snow3g_key_gen (key, keyx); +memcpy (pctx->st.ci_key, keyx, key_len); se_ctx->pdcp_ci_alg =ROC_SE_PDCP_ALG_TYPE_SNOW3G ; se_ctx->zsk_flags =0 ; goto success;case ROC_SE_ZUC_EEA3 : -if (chained_op == true) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; - zs_ch_ctx->zuc.onk_ctx.w0.s.state_conf = -ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - zs_ch_ctx->zuc.onk_ctx.w0.s.cipher_type = -ROC_SE_PDCP_CHAIN_ALG_TYPE_ZUC ; -memcpy (ctx->st.ci_key, key, key_len); -memcpy (ctx->st.ci_zuc_const, zuc_key128,32 ); - zs_ch_ctx->zuc.onk_ctx.w0.s.ci_key_len = key_len; - }else { - ret =cpt_pdcp_key_type_set (zs_ctx, key_len); -if (ret) -return ret; - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_ZUC ; -memcpy (ci_key, key, key_len); -if (key_len ==32 ) { -roc_se_zuc_bytes_swap (ci_key, key_len); -memcpy (zuc_const, zuc_key256,16 ); - }else -memcpy (zuc_const, zuc_key128,32 ); - } - + key_type =cpt_pdcp_chain_key_type_get (key_len); +if (key_type <0 ) +return key_type; + pctx->w0.s.ci_key_len = key_type; + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.cipher_type =ROC_SE_PDCP_CHAIN_ALG_TYPE_ZUC ; +memcpy (pctx->st.ci_key, key, key_len); +if (key_len ==32 ) { +roc_se_zuc_bytes_swap (pctx->st.ci_key, key_len); +memcpy (pctx->st.ci_zuc_const, zuc_key256,16 ); + }else +memcpy (pctx->st.ci_zuc_const, zuc_key128,32 ); se_ctx->pdcp_ci_alg =ROC_SE_PDCP_ALG_TYPE_ZUC ; se_ctx->zsk_flags =0 ; goto success;case ROC_SE_AES_CTR_EEA2 : -if (chained_op == true) { -struct roc_se_onk_zuc_chain_ctx *ctx = - &zs_ch_ctx->zuc.onk_ctx; -int key_type; - key_type =cpt_pdcp_chain_key_type_get (key_len); -if (key_type <0 ) -return key_type; - ctx->w0.s.ci_key_len = key_type; - ctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; - ctx->w0.s.cipher_type =ROC_SE_PDCP_ALG_TYPE_AES_CTR ; -memcpy (ctx->st.ci_key, key, key_len); - }else { - zs_ctx->zuc.otk_ctx.w0.s.key_len =ROC_SE_AES_128_BIT ; - zs_ctx->zuc.otk_ctx.w0.s.alg_type = -ROC_SE_PDCP_ALG_TYPE_AES_CTR ; -memcpy (ci_key, key, key_len); - } + key_type =cpt_pdcp_chain_key_type_get (key_len); +if (key_type <0 ) +return key_type; + pctx->w0.s.ci_key_len = key_type; + pctx->w0.s.state_conf =ROC_SE_PDCP_CHAIN_CTX_KEY_IV ; + pctx->w0.s.cipher_type =ROC_SE_PDCP_ALG_TYPE_AES_CTR ; +memcpy (pctx->st.ci_key, key, key_len); se_ctx->pdcp_ci_alg =ROC_SE_PDCP_ALG_TYPE_AES_CTR ; se_ctx->zsk_flags =0 ; goto success;
@@ -720,20 +583,6 @@ roc_se_ciph_key_set(struct roc_se_ctx *se_ctx, roc_se_cipher_type type, const uireturn 0 ; } -void -roc_se_ctx_swap (struct roc_se_ctx *se_ctx) -{ -struct roc_se_zuc_snow3g_ctx *zs_ctx = &se_ctx->se_ctx.zs_ctx; - -if (roc_model_is_cn9k ()) -return ; - -if (se_ctx->fc_type ==ROC_SE_PDCP_CHAIN ) -return ; - - zs_ctx->zuc.otk_ctx.w0.u64 =htobe64 (zs_ctx->zuc.otk_ctx.w0.u64); -} -void roc_se_ctx_init (struct roc_se_ctx *roc_se_ctx) {
@@ -745,15 +594,13 @@ roc_se_ctx_init(struct roc_se_ctx *roc_se_ctx)case ROC_SE_FC_GEN : ctx_len =sizeof (struct roc_se_context );break ; +case ROC_SE_PDCP_CHAIN :case ROC_SE_PDCP : - ctx_len =sizeof (struct roc_se_zuc_snow3g_ctx ); + ctx_len =sizeof (struct roc_se_pdcp_ctx );break ;case ROC_SE_KASUMI : ctx_len =sizeof (struct roc_se_kasumi_ctx );break ; -case ROC_SE_PDCP_CHAIN : - ctx_len =sizeof (struct roc_se_zuc_snow3g_chain_ctx ); -break ;case ROC_SE_SM : ctx_len =sizeof (struct roc_se_sm_context );break ;
drivers/common/cnxk/roc_se.h +2 -16
@@ -246,7 +246,7 @@ struct roc_se_onk_zuc_ctx {uint8_t zuc_const[32 ]; }; -struct roc_se_onk_zuc_chain_ctx { +struct roc_se_pdcp_ctx { union { uint64_t u64; struct {
@@ -278,19 +278,6 @@ struct roc_se_onk_zuc_chain_ctx { } st; }; -struct roc_se_zuc_snow3g_chain_ctx { -union { -struct roc_se_onk_zuc_chain_ctx onk_ctx; - } zuc; -}; - -struct roc_se_zuc_snow3g_ctx { -union { -struct roc_se_onk_zuc_ctx onk_ctx; -struct roc_se_otk_zuc_ctx otk_ctx; - } zuc; -}; -struct roc_se_kasumi_ctx {uint8_t reg_A[8 ];uint8_t ci_key[16 ];
@@ -356,8 +343,7 @@ struct roc_se_ctx { } w0;union {struct roc_se_context fctx; -struct roc_se_zuc_snow3g_ctx zs_ctx; -struct roc_se_zuc_snow3g_chain_ctx zs_ch_ctx; +struct roc_se_pdcp_ctx pctx;struct roc_se_kasumi_ctx k_ctx;struct roc_se_sm_context sm_ctx; };
drivers/crypto/cnxk/cnxk_se.h +44 -52
212 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH v3 20/24 crypto/cnxk: validate the combinations supported in TLS
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Validate the cipher and auth combination to allow only the ones supported by hardware.
--- drivers/crypto/cnxk/cn10k_tls.c | 35 ++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-)
drivers/crypto/cnxk/cn10k_tls.c +34 -1
@@ -17,6 +17,36 @@#include "cnxk_cryptodev_ops.h" #include "cnxk_security.h" +static int +tls_xform_cipher_auth_verify (struct rte_crypto_sym_xform *cipher_xform, +struct rte_crypto_sym_xform *auth_xform) +{ +enum rte_crypto_cipher_algorithm c_algo = cipher_xform->cipher.algo; +enum rte_crypto_auth_algorithm a_algo = auth_xform->auth.algo; +int ret = -ENOTSUP ; + +switch (c_algo) { +case RTE_CRYPTO_CIPHER_NULL : +if ((a_algo ==RTE_CRYPTO_AUTH_MD5_HMAC ) || (a_algo ==RTE_CRYPTO_AUTH_SHA1_HMAC ) || + (a_algo ==RTE_CRYPTO_AUTH_SHA256_HMAC )) + ret =0 ; +break ; +case RTE_CRYPTO_CIPHER_3DES_CBC : +if (a_algo ==RTE_CRYPTO_AUTH_SHA1_HMAC ) + ret =0 ; +break ; +case RTE_CRYPTO_CIPHER_AES_CBC : +if ((a_algo ==RTE_CRYPTO_AUTH_SHA1_HMAC ) || + (a_algo ==RTE_CRYPTO_AUTH_SHA256_HMAC )) + ret =0 ; +break ; +default : +break ; + } + +return ret; +} +static int tls_xform_cipher_verify (struct rte_crypto_sym_xform *crypto_xform) {
@@ -138,7 +168,10 @@ cnxk_tls_xform_verify(struct rte_security_tls_record_xform *tls_xform, ret =tls_xform_cipher_verify (cipher_xform);if (!ret) -return tls_xform_auth_verify (auth_xform); + ret =tls_xform_auth_verify (auth_xform); + +if (cipher_xform && !ret) +return tls_xform_cipher_auth_verify (cipher_xform, auth_xform);return ret; }
Signature · 1 line
2.25.1
PATCH v3 21/24 crypto/cnxk: use a single function for opad ipad
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Use a single function for opad and ipad generation for IPsec, TLS and flexi crypto.
--- drivers/common/cnxk/cnxk_security.c | 65 ++++++----------------------- drivers/common/cnxk/cnxk_security.h | 5 --- drivers/common/cnxk/roc_se.c | 48 ++++++++++++++------- drivers/common/cnxk/roc_se.h | 9 ++++ drivers/common/cnxk/version.map | 2 +- drivers/crypto/cnxk/cn10k_tls.c | 8 +++- 6 files changed, 61 insertions(+), 76 deletions(-)
drivers/common/cnxk/cnxk_security.c +13 -52
@@ -8,55 +8,9 @@#include "roc_api.h" -void -cnxk_sec_opad_ipad_gen (struct rte_crypto_sym_xform *auth_xform,uint8_t *hmac_opad_ipad, -bool is_tls) -{ -const uint8_t *key = auth_xform->auth.key.data; -uint32_t length = auth_xform->auth.key.length; -uint8_t opad[128 ] = {[0 ...127 ] =0x5c }; -uint8_t ipad[128 ] = {[0 ...127 ] =0x36 }; -uint32_t i; - -/* HMAC OPAD and IPAD */ -for (i =0 ; i <128 && i < length; i++) { - opad[i] = opad[i] ^ key[i]; - ipad[i] = ipad[i] ^ key[i]; - } - -/* Precompute hash of HMAC OPAD and IPAD to avoid -* per packet computation -*/ -switch (auth_xform->auth.algo) { -case RTE_CRYPTO_AUTH_MD5_HMAC : -roc_hash_md5_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ]); -roc_hash_md5_gen (ipad, (uint32_t *)&hmac_opad_ipad[is_tls ?64 :24 ]); -break ; -case RTE_CRYPTO_AUTH_SHA1_HMAC : -roc_hash_sha1_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ]); -roc_hash_sha1_gen (ipad, (uint32_t *)&hmac_opad_ipad[is_tls ?64 :24 ]); -break ; -case RTE_CRYPTO_AUTH_SHA256_HMAC : -roc_hash_sha256_gen (opad, (uint32_t *)&hmac_opad_ipad[0 ],256 ); -roc_hash_sha256_gen (ipad, (uint32_t *)&hmac_opad_ipad[64 ],256 ); -break ; -case RTE_CRYPTO_AUTH_SHA384_HMAC : -roc_hash_sha512_gen (opad, (uint64_t *)&hmac_opad_ipad[0 ],384 ); -roc_hash_sha512_gen (ipad, (uint64_t *)&hmac_opad_ipad[64 ],384 ); -break ; -case RTE_CRYPTO_AUTH_SHA512_HMAC : -roc_hash_sha512_gen (opad, (uint64_t *)&hmac_opad_ipad[0 ],512 ); -roc_hash_sha512_gen (ipad, (uint64_t *)&hmac_opad_ipad[64 ],512 ); -break ; -default : -break ; - } -} -static int -ot_ipsec_sa_common_param_fill (union roc_ot_ipsec_sa_word2 *w2, -uint8_t *cipher_key,uint8_t *salt_key, -uint8_t *hmac_opad_ipad, +ot_ipsec_sa_common_param_fill (union roc_ot_ipsec_sa_word2 *w2,uint8_t *cipher_key, +uint8_t *salt_key,uint8_t *hmac_opad_ipad,struct rte_security_ipsec_xform *ipsec_xfrm,struct rte_crypto_sym_xform *crypto_xfrm) {
@@ -192,7 +146,9 @@ ot_ipsec_sa_common_param_fill(union roc_ot_ipsec_sa_word2 *w2,const uint8_t *auth_key = auth_xfrm->auth.key.data;roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else { -cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad, false); +roc_se_hmac_opad_ipad_gen (w2->s.auth_type, auth_xfrm->auth.key.data, + auth_xfrm->auth.key.length, &hmac_opad_ipad[0 ], +ROC_SE_IPSEC ); } tmp_key = (uint64_t *)hmac_opad_ipad;
@@ -741,7 +697,8 @@ onf_ipsec_sa_common_param_fill(struct roc_ie_onf_sa_ctl *ctl, uint8_t *salt, key = cipher_xfrm->cipher.key.data; length = cipher_xfrm->cipher.key.length; -cnxk_sec_opad_ipad_gen (auth_xfrm, hmac_opad_ipad, false); +roc_se_hmac_opad_ipad_gen (ctl->auth_type, auth_xfrm->auth.key.data, + auth_xfrm->auth.key.length, hmac_opad_ipad,ROC_SE_IPSEC ); }switch (length) {
@@ -1374,7 +1331,9 @@ cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad, false); +roc_se_hmac_opad_ipad_gen ( + out_sa->common_sa.ctl.auth_type, auth_xform->auth.key.data, + auth_xform->auth.key.length, &hmac_opad_ipad[0 ],ROC_SE_IPSEC ); } }
@@ -1441,7 +1400,9 @@ cnxk_on_ipsec_inb_sa_create(struct rte_security_ipsec_xform *ipsec,roc_aes_xcbc_key_derive (auth_key, hmac_opad_ipad); }else if (auth_xform->auth.algo !=RTE_CRYPTO_AUTH_NULL ) { -cnxk_sec_opad_ipad_gen (auth_xform, hmac_opad_ipad, false); +roc_se_hmac_opad_ipad_gen ( + in_sa->common_sa.ctl.auth_type, auth_xform->auth.key.data, + auth_xform->auth.key.length, &hmac_opad_ipad[0 ],ROC_SE_IPSEC ); } }
drivers/common/cnxk/cnxk_security.h +0 -5
@@ -68,9 +68,4 @@ int __roc_api cnxk_on_ipsec_inb_sa_create(struct rte_security_ipsec_xform *ipsec int __roc_api cnxk_on_ipsec_outb_sa_create(struct rte_security_ipsec_xform *ipsec,struct rte_crypto_sym_xform *crypto_xform,struct roc_ie_on_outb_sa *out_sa); - -__rte_internal -void cnxk_sec_opad_ipad_gen(struct rte_crypto_sym_xform *auth_xform, uint8_t *hmac_opad_ipad, -bool is_tls); -#endif /* _CNXK_SECURITY_H__ */
drivers/common/cnxk/roc_se.c +32 -16
81 lines not on this page · raw message
drivers/common/cnxk/roc_se.h +9 -0
@@ -191,6 +191,12 @@ typedef enum { ROC_SE_PDCP_MAC_LEN_128_BIT = 0x3 } roc_se_pdcp_mac_len_type; +typedef enum { +ROC_SE_IPSEC =0x0 , +ROC_SE_TLS =0x1 , +ROC_SE_FC =0x2 , +}roc_se_op_type ; +struct roc_se_enc_context {uint64_t iv_source :1 ;uint64_t aes_key :2 ;
@@ -401,4 +407,7 @@ int __roc_api roc_se_ciph_key_set(struct roc_se_ctx *se_ctx, roc_se_cipher_type void __roc_api roc_se_ctx_swap(struct roc_se_ctx *se_ctx); void __roc_api roc_se_ctx_init(struct roc_se_ctx *se_ctx); +void __roc_api roc_se_hmac_opad_ipad_gen(roc_se_auth_type auth_type, const uint8_t *key, +uint16_t length,uint8_t *opad_ipad, +roc_se_op_type op_type);#endif /* __ROC_SE_H__ */
drivers/common/cnxk/version.map +1 -1
@@ -1,7 +1,6 @@ INTERNAL { global: - cnxk_sec_opad_ipad_gen; cnxk_ipsec_icvlen_get; cnxk_ipsec_ivlen_get; cnxk_ipsec_outb_rlens_get;
@@ -472,6 +471,7 @@ INTERNAL { roc_plt_init; roc_plt_init_cb_register; roc_plt_lmt_validate; + roc_se_hmac_opad_ipad_gen; roc_sso_dev_fini; roc_sso_dev_init; roc_sso_dump;
drivers/crypto/cnxk/cn10k_tls.c +6 -2
@@ -376,7 +376,9 @@ tls_read_sa_fill(struct roc_ie_ot_tls_read_sa *read_sa,else return -EINVAL ; -cnxk_sec_opad_ipad_gen (auth_xfrm, read_sa->opad_ipad, true); +roc_se_hmac_opad_ipad_gen (read_sa->w2.s.mac_select, auth_xfrm->auth.key.data, + auth_xfrm->auth.key.length, read_sa->opad_ipad,ROC_SE_TLS ); + tmp = (uint64_t *)read_sa->opad_ipad;for (i =0 ; i < (int )(ROC_CTX_MAX_OPAD_IPAD_LEN /sizeof (uint64_t )); i++) tmp[i] =rte_be_to_cpu_64 (tmp[i]);
@@ -503,7 +505,9 @@ tls_write_sa_fill(struct roc_ie_ot_tls_write_sa *write_sa,else return -EINVAL ; -cnxk_sec_opad_ipad_gen (auth_xfrm, write_sa->opad_ipad, true); +roc_se_hmac_opad_ipad_gen (write_sa->w2.s.mac_select, auth_xfrm->auth.key.data, + auth_xfrm->auth.key.length, write_sa->opad_ipad, +ROC_SE_TLS ); } tmp_key = (uint64_t *)write_sa->opad_ipad;
Signature · 1 line
2.25.1
PATCH v3 22/24 crypto/cnxk: add support for TLS 1.3
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add support for TLS-1.3.
--- drivers/common/cnxk/roc_ie_ot_tls.h | 50 +++++-- drivers/crypto/cnxk/cn10k_cryptodev_sec.h | 3 +- drivers/crypto/cnxk/cn10k_tls.c | 159 +++++++++++++--------- 3 files changed, 136 insertions(+), 76 deletions(-)
drivers/common/cnxk/roc_ie_ot_tls.h +38 -12
@@ -17,8 +17,10 @@ (PLT_ALIGN_CEIL (ROC_IE_OT_TLS_AR_WIN_SIZE_MAX ,BITS_PER_LONG_LONG ) /BITS_PER_LONG_LONG ) /* CN10K TLS opcodes */ -#define ROC_IE_OT_TLS_MAJOR_OP_RECORD_ENC 0x16UL -#define ROC_IE_OT_TLS_MAJOR_OP_RECORD_DEC 0x17UL +#define ROC_IE_OT_TLS_MAJOR_OP_RECORD_ENC 0x16UL +#define ROC_IE_OT_TLS_MAJOR_OP_RECORD_DEC 0x17UL +#define ROC_IE_OT_TLS13_MAJOR_OP_RECORD_ENC 0x18UL +#define ROC_IE_OT_TLS13_MAJOR_OP_RECORD_DEC 0x19UL#define ROC_IE_OT_TLS_CTX_MAX_OPAD_IPAD_LEN 128#define ROC_IE_OT_TLS_CTX_MAX_KEY_IV_LEN 48
@@ -42,6 +44,7 @@ enum roc_ie_ot_tls_cipher_type {enum roc_ie_ot_tls_ver {ROC_IE_OT_TLS_VERSION_TLS_12 =1 ,ROC_IE_OT_TLS_VERSION_DTLS_12 =2 , +ROC_IE_OT_TLS_VERSION_TLS_13 =3 , };enum roc_ie_ot_tls_aes_key_len {
@@ -131,11 +134,23 @@ struct roc_ie_ot_tls_read_sa {/* Word4 - Word9 */ uint8_t cipher_key[ROC_IE_OT_TLS_CTX_MAX_KEY_IV_LEN ]; -/* Word10 - Word25 */ -uint8_t opad_ipad[ROC_IE_OT_TLS_CTX_MAX_OPAD_IPAD_LEN ]; +union { +struct { +/* Word10 */ +uint64_t w10_rsvd6; + +/* Word11 - Word25 */ +struct roc_ie_ot_tls_read_ctx_update_reg ctx; + } tls_13; + +struct { +/* Word10 - Word25 */ +uint8_t opad_ipad[ROC_IE_OT_TLS_CTX_MAX_OPAD_IPAD_LEN ]; -/* Word26 - Word32 */ -struct roc_ie_ot_tls_read_ctx_update_reg ctx; +/* Word26 - Word95 */ +struct roc_ie_ot_tls_read_ctx_update_reg ctx; + } tls_12; + }; };struct roc_ie_ot_tls_write_sa {
@@ -187,13 +202,24 @@ struct roc_ie_ot_tls_write_sa {/* Word4 - Word9 */ uint8_t cipher_key[ROC_IE_OT_TLS_CTX_MAX_KEY_IV_LEN ]; -/* Word10 - Word25 */ -uint8_t opad_ipad[ROC_IE_OT_TLS_CTX_MAX_OPAD_IPAD_LEN ]; +union { +struct { +/* Word10 */ +uint64_t w10_rsvd7; + +uint64_t seq_num; + } tls_13; + +struct { +/* Word10 - Word25 */ +uint8_t opad_ipad[ROC_IE_OT_TLS_CTX_MAX_OPAD_IPAD_LEN ]; -/* Word26 */ -uint64_t w26_rsvd7; +/* Word26 */ +uint64_t w26_rsvd7; -/* Word27 */ - uint64_t seq_num; +/* Word27 */ +uint64_t seq_num; + } tls_12; + }; };#endif /* __ROC_IE_OT_TLS_H__ */
drivers/crypto/cnxk/cn10k_cryptodev_sec.h +1 -2
@@ -31,8 +31,7 @@ struct cn10k_sec_session { } ipsec;struct {uint8_t enable_padding :1 ; -uint8_t hdr_len :4 ; -uint8_t rvsd :3 ; +uint8_t rvsd :7 ;bool is_write; } tls; };
drivers/crypto/cnxk/cn10k_tls.c +97 -62
307 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH v3 23/24 crypto/cnxk: add TLS 1.3 capability
In reply to Anoob JosephFrom: Vidya Sagar Velumuri <[email protected]>
Add TLS 1.3 record read and write capability
--- doc/guides/rel_notes/release_24_03.rst | 4 +- .../crypto/cnxk/cnxk_cryptodev_capabilities.c | 92 +++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-)
doc/guides/rel_notes/release_24_03.rst +2 -2
@@ -58,8 +58,8 @@ New Features * **Updated Marvell cnxk crypto driver.** * Added support for Rx inject in crypto_cn10k. - * Added support for TLS record processing in crypto_cn10k. Supports TLS 1.2 - and DTLS 1.2. + * Added support for TLS record processing in crypto_cn10k. Supports TLS 1.2, + DTLS 1.2 and TLS 1.3. * Added PMD API to allow raw submission of instructions to CPT.
drivers/crypto/cnxk/cnxk_cryptodev_capabilities.c +92 -0
122 lines not on this page · raw message
Signature · 1 line
2.25.1
PATCH v3 24/24 crypto/cnxk: add CPT SG mode debug
In reply to Anoob JosephFrom: Tejasree Kondoj <[email protected]>
Adding CPT SG mode debug dump.
--- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 135 +++++++++++++++++++++- drivers/crypto/cnxk/cnxk_cryptodev_ops.h | 7 ++ 2 files changed, 141 insertions(+), 1 deletion(-)
drivers/crypto/cnxk/cn10k_cryptodev_ops.c +134 -1
@@ -2,9 +2,10 @@* Copyright(C) 2021 Marvell. */ -#include <rte_cryptodev.h> #include <cryptodev_pmd.h> +#include <rte_cryptodev.h> #include <rte_event_crypto_adapter.h> +#include <rte_hexdump.h> #include <rte_ip.h> #include <ethdev_driver.h>
@@ -103,6 +104,104 @@ cpt_sec_ipsec_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op,return ret; } +#ifdef CPT_INST_DEBUG_ENABLE +static inline void +cpt_request_data_sgv2_mode_dump (uint8_t *in_buffer,bool glist,uint16_t components) +{ +struct roc_se_buf_ptr list_ptr[ROC_MAX_SG_CNT ]; +const char *list = glist ?"glist" :"slist" ; +struct roc_sg2list_comp *sg_ptr =NULL ; +uint16_t list_cnt =0 ; +char suffix[64 ]; +int i, j; + + sg_ptr = (void *)in_buffer; +for (i =0 ; i < components; i++) { +for (j =0 ; j < sg_ptr->u.s.valid_segs; j++) { + list_ptr[i *3 + j].size = sg_ptr->u.s.len[j]; + list_ptr[i *3 + j].vaddr = (void *)sg_ptr->ptr[j]; + list_ptr[i *3 + j].vaddr = list_ptr[i *3 + j].vaddr; + list_cnt++; + } + sg_ptr++; + } + +printf ("Current %s: %u\n" , list, list_cnt); + +for (i =0 ; i < list_cnt; i++) { +snprintf (suffix,sizeof (suffix),"%s[%d]: vaddr 0x%" PRIx64", vaddr %p len %u" , + list, i, (uint64_t )list_ptr[i].vaddr, list_ptr[i].vaddr, list_ptr[i].size); +rte_hexdump (stdout, suffix, list_ptr[i].vaddr, list_ptr[i].size); + } +} + +static inline void +cpt_request_data_sg_mode_dump (uint8_t *in_buffer,bool glist) +{ +struct roc_se_buf_ptr list_ptr[ROC_MAX_SG_CNT ]; +const char *list = glist ?"glist" :"slist" ; +struct roc_sglist_comp *sg_ptr =NULL ; +uint16_t list_cnt, components; +char suffix[64 ]; +int i; + + sg_ptr = (void *)(in_buffer +8 ); + list_cnt =rte_be_to_cpu_16 ((((uint16_t *)in_buffer)[2 ])); +if (!glist) { + components = list_cnt /4 ; +if (list_cnt %4 ) + components++; + sg_ptr += components; + list_cnt =rte_be_to_cpu_16 ((((uint16_t *)in_buffer)[3 ])); + } + +printf ("Current %s: %u\n" , list, list_cnt); + components = list_cnt /4 ; +for (i =0 ; i < components; i++) { + list_ptr[i *4 +0 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[0 ]); + list_ptr[i *4 +1 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[1 ]); + list_ptr[i *4 +2 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[2 ]); + list_ptr[i *4 +3 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[3 ]); + list_ptr[i *4 +0 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[0 ]); + list_ptr[i *4 +1 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[1 ]); + list_ptr[i *4 +2 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[2 ]); + list_ptr[i *4 +3 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[3 ]); + list_ptr[i *4 +0 ].vaddr = list_ptr[i *4 +0 ].vaddr; + list_ptr[i *4 +1 ].vaddr = list_ptr[i *4 +1 ].vaddr; + list_ptr[i *4 +2 ].vaddr = list_ptr[i *4 +2 ].vaddr; + list_ptr[i *4 +3 ].vaddr = list_ptr[i *4 +3 ].vaddr; + sg_ptr++; + } + + components = list_cnt %4 ; +switch (components) { +case 3 : + list_ptr[i *4 +2 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[2 ]); + list_ptr[i *4 +2 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[2 ]); + list_ptr[i *4 +2 ].vaddr = list_ptr[i *4 +2 ].vaddr; +/* FALLTHROUGH */ +case 2 : + list_ptr[i *4 +1 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[1 ]); + list_ptr[i *4 +1 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[1 ]); + list_ptr[i *4 +1 ].vaddr = list_ptr[i *4 +1 ].vaddr; +/* FALLTHROUGH */ +case 1 : + list_ptr[i *4 +0 ].size =rte_be_to_cpu_16 (sg_ptr->u.s.len[0 ]); + list_ptr[i *4 +0 ].vaddr = (void *)rte_be_to_cpu_64 (sg_ptr->ptr[0 ]); + list_ptr[i *4 +0 ].vaddr = list_ptr[i *4 +0 ].vaddr; +break ; +default : +break ; + } + +for (i =0 ; i < list_cnt; i++) { +snprintf (suffix,sizeof (suffix),"%s[%d]: vaddr 0x%" PRIx64", vaddr %p len %u" , + list, i, (uint64_t )list_ptr[i].vaddr, list_ptr[i].vaddr, list_ptr[i].size); +rte_hexdump (stdout, suffix, list_ptr[i].vaddr, list_ptr[i].size); + } +} +#endif + static __rte_always_inline int __rte_hot cpt_sec_tls_inst_fill(struct cnxk_cpt_qp *qp, struct rte_crypto_op *op, struct cn10k_sec_session *sess, struct cpt_inst_s *inst,
@@ -205,6 +304,31 @@ cn10k_cpt_fill_inst(struct cnxk_cpt_qp *qp, struct rte_crypto_op *ops[], struct inst[0 ].w7.u64 = w7; +#ifdef CPT_INST_DEBUG_ENABLE + infl_req->dptr = (uint8_t *)inst[0 ].dptr; + infl_req->rptr = (uint8_t *)inst[0 ].rptr; + infl_req->is_sg_ver2 = is_sg_ver2; + infl_req->scatter_sz = inst[0 ].w6.s.scatter_sz; + infl_req->opcode_major = inst[0 ].w4.s.opcode_major; + +rte_hexdump (stdout,"cptr" , (void *)(uint64_t )inst[0 ].w7.s.cptr,128 ); +printf ("major opcode:%d\n" , inst[0 ].w4.s.opcode_major); +printf ("minor opcode:%d\n" , inst[0 ].w4.s.opcode_minor); +printf ("param1:%d\n" , inst[0 ].w4.s.param1); +printf ("param2:%d\n" , inst[0 ].w4.s.param2); +printf ("dlen:%d\n" , inst[0 ].w4.s.dlen); + +if (is_sg_ver2) { +cpt_request_data_sgv2_mode_dump ((void *)inst[0 ].dptr,1 , inst[0 ].w5.s.gather_sz); +cpt_request_data_sgv2_mode_dump ((void *)inst[0 ].rptr,0 , inst[0 ].w6.s.scatter_sz); + }else { +if (infl_req->opcode_major >>7 ) { +cpt_request_data_sg_mode_dump ((void *)inst[0 ].dptr,1 ); +cpt_request_data_sg_mode_dump ((void *)inst[0 ].dptr,0 ); + } + } +#endif +return 1 ; }
@@ -935,6 +1059,15 @@ cn10k_cpt_dequeue_post_process(struct cnxk_cpt_qp *qp, struct rte_crypto_op *cop }if (likely (compcode ==CPT_COMP_GOOD )) { +#ifdef CPT_INST_DEBUG_ENABLE +if (infl_req->is_sg_ver2) +cpt_request_data_sgv2_mode_dump (infl_req->rptr,0 , infl_req->scatter_sz); +else { +if (infl_req->opcode_major >>7 ) +cpt_request_data_sg_mode_dump (infl_req->dptr,0 ); + } +#endif +if (unlikely (uc_compcode)) {if (uc_compcode ==ROC_SE_ERR_GC_ICV_MISCOMPARE ) cop->status =RTE_CRYPTO_OP_STATUS_AUTH_FAILED ;
drivers/crypto/cnxk/cnxk_cryptodev_ops.h +7 -0
@@ -51,6 +51,13 @@ struct cpt_inflight_req { };void *mdata;uint8_t op_flags; +#ifdef CPT_INST_DEBUG_ENABLE +uint8_t scatter_sz; +uint8_t opcode_major; +uint8_t is_sg_ver2; +uint8_t *dptr; +uint8_t *rptr; +#endif void *qp; }__rte_aligned (ROC_ALIGN );
Signature · 1 line
2.25.1
Quoted 112 lines
Subject: [PATCH v3 00/24] Fixes and improvements in crypto cnxk
Add following features
- TLS record processing offload (TLS 1.2-1.3, DTLS 1.2)
- Rx inject to allow lookaside packets to be injected to ethdev Rx
- UsePDCP_CHAINopcode instead of PDCP opcode for cipher-only and auth only cases
- PMD API to submit instructions directly to hardwareChanges in v3
- Addressed Akhil's commments on Rx inject patch
- Updated license year to 2024Changes in v2
- Addressed checkpatch issue
- Addressed build error with stdatomicAakash Sasidharan (1):
crypto/cnxk: enable digest gen for zero len inputAkhil Goyal (1):
common/cnxk: fix memory leakAnoob Joseph (6):
crypto/cnxk: use common macro
crypto/cnxk: return microcode completion code common/cnxk: update opad-ipad gen to handle TLS common/cnxk: add TLS record contextscrypto/cnxk: separate IPsec from security common codecrypto/cnxk: add PMD APIs for raw submission to CPTGowrishankar Muthukrishnan (1):
crypto/cnxk: fix ECDH pubkey verify in cn9kRahul Bhansali (2):
common/cnxk: add Rx inject configs
crypto/cnxk: Rx inject config updateTejasree Kondoj (3):
crypto/cnxk: fallback to SG if headroom is not availablecrypto/cnxk: replace PDCP with PDCP chain opcodecrypto/cnxk: add CPT SG mode debugVidya Sagar Velumuri (10):
crypto/cnxk: enable Rx inject in security lookasidecrypto/cnxk: enable Rx inject for 103crypto/cnxk: rename security caps as IPsec security capscrypto/cnxk: add TLS record session opscrypto/cnxk: add TLS record datapath handlingcrypto/cnxk: add TLS capability
crypto/cnxk: validate the combinations supported in TLScrypto/cnxk: use a single function for opad ipadcrypto/cnxk: add support for TLS 1.3crypto/cnxk: add TLS 1.3 capabilitydoc/api/doxy-api-index.md | 1 + doc/api/doxy-api.conf.in | 1 + doc/guides/cryptodevs/cnxk.rst | 12 + doc/guides/cryptodevs/features/cn10k.ini | 1 + doc/guides/rel_notes/release_24_03.rst | 7 + drivers/common/cnxk/cnxk_security.c | 65 +- drivers/common/cnxk/cnxk_security.h | 15 +- drivers/common/cnxk/hw/cpt.h | 12 +- drivers/common/cnxk/roc_cpt.c | 14 +- drivers/common/cnxk/roc_cpt.h | 7 +- drivers/common/cnxk/roc_cpt_priv.h | 2 +- drivers/common/cnxk/roc_idev.c | 44 + drivers/common/cnxk/roc_idev.h | 5 + drivers/common/cnxk/roc_idev_priv.h | 6 + drivers/common/cnxk/roc_ie_ot.c | 14 +- drivers/common/cnxk/roc_ie_ot_tls.h | 225 +++++ drivers/common/cnxk/roc_mbox.h | 2 + drivers/common/cnxk/roc_nix.c | 2 + drivers/common/cnxk/roc_nix_inl.c | 2 +- drivers/common/cnxk/roc_nix_inl_dev.c | 2 +- drivers/common/cnxk/roc_se.c | 379 +++----- drivers/common/cnxk/roc_se.h | 38 +- drivers/common/cnxk/version.map | 5 + drivers/crypto/cnxk/cn10k_cryptodev.c | 2 +- drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 401 ++++++++- drivers/crypto/cnxk/cn10k_cryptodev_ops.h | 11 + drivers/crypto/cnxk/cn10k_cryptodev_sec.c | 134 +++ drivers/crypto/cnxk/cn10k_cryptodev_sec.h | 68 ++ drivers/crypto/cnxk/cn10k_ipsec.c | 134 +-- drivers/crypto/cnxk/cn10k_ipsec.h | 38 +- drivers/crypto/cnxk/cn10k_ipsec_la_ops.h | 19 +- drivers/crypto/cnxk/cn10k_tls.c | 830 ++++++++++++++++++ drivers/crypto/cnxk/cn10k_tls.h | 35 + drivers/crypto/cnxk/cn10k_tls_ops.h | 322 +++++++ drivers/crypto/cnxk/cn9k_cryptodev_ops.c | 68 +- drivers/crypto/cnxk/cn9k_cryptodev_ops.h | 62 ++ drivers/crypto/cnxk/cn9k_ipsec_la_ops.h | 16 +- drivers/crypto/cnxk/cnxk_cryptodev.c | 3 + drivers/crypto/cnxk/cnxk_cryptodev.h | 24 +- .../crypto/cnxk/cnxk_cryptodev_capabilities.c | 375 +++++++- drivers/crypto/cnxk/cnxk_cryptodev_devargs.c | 31 + drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 128 ++- drivers/crypto/cnxk/cnxk_cryptodev_ops.h | 7 + drivers/crypto/cnxk/cnxk_se.h | 98 +-- drivers/crypto/cnxk/cnxk_sg.h | 4 +- drivers/crypto/cnxk/meson.build | 4 +- drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h | 46 + drivers/crypto/cnxk/version.map | 3 + 48 files changed, 3018 insertions(+), 706 deletions(-) create mode 100644 drivers/common/cnxk/roc_ie_ot_tls.h create mode 100644 drivers/crypto/cnxk/cn10k_cryptodev_sec.c create mode 100644 drivers/crypto/cnxk/cn10k_cryptodev_sec.h create mode 100644 drivers/crypto/cnxk/cn10k_tls.c create mode 100644 drivers/crypto/cnxk/cn10k_tls.h create mode 100644 drivers/crypto/cnxk/cn10k_tls_ops.h create mode 100644 drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h
Quoted 2 lines
--
2.25.1
Series applied to dpdk-next-crypto
Fixed documentation compilation issue and updated release notes and patch description/title for some of the patches.