git.droids-corp.org
/
dpdk.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
cryptodev: allocate driver structure statically
[dpdk.git]
/
drivers
/
crypto
/
aesni_gcm
/
aesni_gcm_pmd.c
diff --git
a/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c
b/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c
index
1ef83fa
..
483ed87
100644
(file)
--- a/
drivers/crypto/aesni_gcm/aesni_gcm_pmd.c
+++ b/
drivers/crypto/aesni_gcm/aesni_gcm_pmd.c
@@
-63,7
+63,7
@@
aesni_gcm_set_session_parameters(const struct aesni_gcm_ops *gcm_ops,
if (auth_xform->auth.algo != RTE_CRYPTO_AUTH_AES_GMAC) {
GCM_LOG_ERR("Only AES GMAC is supported as an "
"authentication only algorithm");
if (auth_xform->auth.algo != RTE_CRYPTO_AUTH_AES_GMAC) {
GCM_LOG_ERR("Only AES GMAC is supported as an "
"authentication only algorithm");
- return -E
INVAL
;
+ return -E
NOTSUP
;
}
/* Set IV parameters */
sess->iv.offset = auth_xform->auth.iv.offset;
}
/* Set IV parameters */
sess->iv.offset = auth_xform->auth.iv.offset;
@@
-86,7
+86,7
@@
aesni_gcm_set_session_parameters(const struct aesni_gcm_ops *gcm_ops,
if (aead_xform->aead.algo != RTE_CRYPTO_AEAD_AES_GCM) {
GCM_LOG_ERR("The only combined operation "
"supported is AES GCM");
if (aead_xform->aead.algo != RTE_CRYPTO_AEAD_AES_GCM) {
GCM_LOG_ERR("The only combined operation "
"supported is AES GCM");
- return -E
INVAL
;
+ return -E
NOTSUP
;
}
/* Set IV parameters */
}
/* Set IV parameters */
@@
-102,11
+102,11
@@
aesni_gcm_set_session_parameters(const struct aesni_gcm_ops *gcm_ops,
key_length = aead_xform->aead.key.length;
key = aead_xform->aead.key.data;
key_length = aead_xform->aead.key.length;
key = aead_xform->aead.key.data;
- sess->aad_length = aead_xform->aead.a
dd_auth_data
_length;
+ sess->aad_length = aead_xform->aead.a
ad
_length;
digest_length = aead_xform->aead.digest_length;
} else {
GCM_LOG_ERR("Wrong xform type, has to be AEAD or authentication");
digest_length = aead_xform->aead.digest_length;
} else {
GCM_LOG_ERR("Wrong xform type, has to be AEAD or authentication");
- return -E
INVAL
;
+ return -E
NOTSUP
;
}
}
@@
-129,7
+129,7
@@
aesni_gcm_set_session_parameters(const struct aesni_gcm_ops *gcm_ops,
sess->key = AESNI_GCM_KEY_256;
break;
default:
sess->key = AESNI_GCM_KEY_256;
break;
default:
- GCM_LOG_ERR("
Unsupporte
d key length");
+ GCM_LOG_ERR("
Invali
d key length");
return -EINVAL;
}
return -EINVAL;
}
@@
-155,26
+155,37
@@
aesni_gcm_get_session(struct aesni_gcm_qp *qp, struct rte_crypto_op *op)
struct rte_crypto_sym_op *sym_op = op->sym;
if (op->sess_type == RTE_CRYPTO_OP_WITH_SESSION) {
struct rte_crypto_sym_op *sym_op = op->sym;
if (op->sess_type == RTE_CRYPTO_OP_WITH_SESSION) {
- if (
unlikely(sym_op->session->driver_id !=
-
cryptodev_driver_id)
)
- return sess;
-
-
sess = (struct aesni_gcm_session *)sym_op->session->_private
;
+ if (
likely(sym_op->session != NULL))
+
sess = (struct aesni_gcm_session *
)
+ get_session_private_data(
+ sym_op->session,
+
cryptodev_driver_id)
;
} else {
void *_sess;
} else {
void *_sess;
+ void *_sess_private_data = NULL;
- if (rte_mempool_get(qp->sess_mp, &_sess))
- return
sess
;
+ if (rte_mempool_get(qp->sess_mp,
(void **)
&_sess))
+ return
NULL
;
-
sess = (struct aesni_gcm_session *
)
-
((struct rte_cryptodev_sym_session *)_sess)->_private
;
+
if (rte_mempool_get(qp->sess_mp, (void **)&_sess_private_data)
)
+
return NULL
;
- if (unlikely(aesni_gcm_set_session_parameters(qp->ops, sess,
- sym_op->xform) != 0)) {
+ sess = (struct aesni_gcm_session *)_sess_private_data;
+
+ if (unlikely(aesni_gcm_set_session_parameters(qp->ops,
+ sess, sym_op->xform) != 0)) {
rte_mempool_put(qp->sess_mp, _sess);
rte_mempool_put(qp->sess_mp, _sess);
+ rte_mempool_put(qp->sess_mp, _sess_private_data);
sess = NULL;
}
sess = NULL;
}
+ sym_op->session = (struct rte_cryptodev_sym_session *)_sess;
+ set_session_private_data(sym_op->session, cryptodev_driver_id,
+ _sess_private_data);
}
}
+
+ if (unlikely(sess == NULL))
+ op->status = RTE_CRYPTO_OP_STATUS_INVALID_SESSION;
+
return sess;
}
return sess;
}
@@
-213,7
+224,7
@@
process_gcm_crypto_op(struct aesni_gcm_qp *qp, struct rte_crypto_op *op,
RTE_ASSERT(m_src != NULL);
RTE_ASSERT(m_src != NULL);
- while (offset >= m_src->data_len) {
+ while (offset >= m_src->data_len
&& data_length != 0
) {
offset -= m_src->data_len;
m_src = m_src->next;
offset -= m_src->data_len;
m_src = m_src->next;
@@
-374,13
+385,11
@@
process_gcm_crypto_op(struct aesni_gcm_qp *qp, struct rte_crypto_op *op,
* - Returns NULL on invalid job
*/
static void
* - Returns NULL on invalid job
*/
static void
-post_process_gcm_crypto_op(struct rte_crypto_op *op)
+post_process_gcm_crypto_op(struct rte_crypto_op *op,
+ struct aesni_gcm_session *session)
{
struct rte_mbuf *m = op->sym->m_dst ? op->sym->m_dst : op->sym->m_src;
{
struct rte_mbuf *m = op->sym->m_dst ? op->sym->m_dst : op->sym->m_src;
- struct aesni_gcm_session *session =
- (struct aesni_gcm_session *)op->sym->session->_private;
-
op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
/* Verify digest if required */
op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
/* Verify digest if required */
@@
-415,6
+424,7
@@
post_process_gcm_crypto_op(struct rte_crypto_op *op)
* Process a completed GCM request
*
* @param qp Queue Pair to process
* Process a completed GCM request
*
* @param qp Queue Pair to process
+ * @param op Crypto operation
* @param job JOB_AES_HMAC job
*
* @return
* @param job JOB_AES_HMAC job
*
* @return
@@
-422,12
+432,17
@@
post_process_gcm_crypto_op(struct rte_crypto_op *op)
*/
static void
handle_completed_gcm_crypto_op(struct aesni_gcm_qp *qp,
*/
static void
handle_completed_gcm_crypto_op(struct aesni_gcm_qp *qp,
- struct rte_crypto_op *op)
+ struct rte_crypto_op *op,
+ struct aesni_gcm_session *sess)
{
{
- post_process_gcm_crypto_op(op);
+ post_process_gcm_crypto_op(op
, sess
);
/* Free session if a session-less crypto op */
if (op->sess_type == RTE_CRYPTO_OP_SESSIONLESS) {
/* Free session if a session-less crypto op */
if (op->sess_type == RTE_CRYPTO_OP_SESSIONLESS) {
+ memset(sess, 0, sizeof(struct aesni_gcm_session));
+ memset(op->sym->session, 0,
+ rte_cryptodev_get_header_session_size());
+ rte_mempool_put(qp->sess_mp, sess);
rte_mempool_put(qp->sess_mp, op->sym->session);
op->sym->session = NULL;
}
rte_mempool_put(qp->sess_mp, op->sym->session);
op->sym->session = NULL;
}
@@
-462,7
+477,7
@@
aesni_gcm_pmd_dequeue_burst(void *queue_pair,
break;
}
break;
}
- handle_completed_gcm_crypto_op(qp, ops[i]);
+ handle_completed_gcm_crypto_op(qp, ops[i]
, sess
);
}
qp->qp_stats.dequeued_count += i;
}
qp->qp_stats.dequeued_count += i;
@@
-615,10
+630,13
@@
static struct rte_vdev_driver aesni_gcm_pmd_drv = {
.remove = aesni_gcm_remove
};
.remove = aesni_gcm_remove
};
+static struct cryptodev_driver aesni_gcm_crypto_drv;
+
RTE_PMD_REGISTER_VDEV(CRYPTODEV_NAME_AESNI_GCM_PMD, aesni_gcm_pmd_drv);
RTE_PMD_REGISTER_ALIAS(CRYPTODEV_NAME_AESNI_GCM_PMD, cryptodev_aesni_gcm_pmd);
RTE_PMD_REGISTER_PARAM_STRING(CRYPTODEV_NAME_AESNI_GCM_PMD,
"max_nb_queue_pairs=<int> "
"max_nb_sessions=<int> "
"socket_id=<int>");
RTE_PMD_REGISTER_VDEV(CRYPTODEV_NAME_AESNI_GCM_PMD, aesni_gcm_pmd_drv);
RTE_PMD_REGISTER_ALIAS(CRYPTODEV_NAME_AESNI_GCM_PMD, cryptodev_aesni_gcm_pmd);
RTE_PMD_REGISTER_PARAM_STRING(CRYPTODEV_NAME_AESNI_GCM_PMD,
"max_nb_queue_pairs=<int> "
"max_nb_sessions=<int> "
"socket_id=<int>");
-RTE_PMD_REGISTER_CRYPTO_DRIVER(aesni_gcm_pmd_drv, cryptodev_driver_id);
+RTE_PMD_REGISTER_CRYPTO_DRIVER(aesni_gcm_crypto_drv, aesni_gcm_pmd_drv,
+ cryptodev_driver_id);