cryptodev: allocate driver structure statically
[dpdk.git] / drivers / crypto / armv8 / rte_armv8_pmd.c
index 7cce09f..b0d68d1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *   BSD LICENSE
  *
- *   Copyright (C) Cavium networks Ltd. 2017.
+ *   Copyright (C) Cavium, Inc. 2017.
  *
  *   Redistribution and use in source and binary forms, with or without
  *   modification, are permitted provided that the following conditions
@@ -13,7 +13,7 @@
  *       notice, this list of conditions and the following disclaimer in
  *       the documentation and/or other materials provided with the
  *       distribution.
- *     * Neither the name of Cavium networks nor the names of its
+ *     * Neither the name of Cavium, Inc nor the names of its
  *       contributors may be used to endorse or promote products derived
  *       from this software without specific prior written permission.
  *
@@ -291,27 +291,14 @@ auth_set_prerequisites(struct armv8_crypto_session *sess,
                 * Generate authentication key, i_key_pad and o_key_pad.
                 */
                /* Zero memory under key */
-               memset(sess->auth.hmac.key, 0, SHA1_AUTH_KEY_LENGTH);
-
-               if (xform->auth.key.length > SHA1_AUTH_KEY_LENGTH) {
-                       /*
-                        * In case the key is longer than 160 bits
-                        * the algorithm will use SHA1(key) instead.
-                        */
-                       error = sha1_block(NULL, xform->auth.key.data,
-                               sess->auth.hmac.key, xform->auth.key.length);
-                       if (error != 0)
-                               return -1;
-               } else {
-                       /*
-                        * Now copy the given authentication key to the session
-                        * key assuming that the session key is zeroed there is
-                        * no need for additional zero padding if the key is
-                        * shorter than SHA1_AUTH_KEY_LENGTH.
-                        */
-                       rte_memcpy(sess->auth.hmac.key, xform->auth.key.data,
-                                                       xform->auth.key.length);
-               }
+               memset(sess->auth.hmac.key, 0, SHA1_BLOCK_SIZE);
+
+               /*
+                * Now copy the given authentication key to the session
+                * key.
+                */
+               rte_memcpy(sess->auth.hmac.key, xform->auth.key.data,
+                                               xform->auth.key.length);
 
                /* Prepare HMAC padding: key|pattern */
                auth_hmac_pad_prepare(sess, xform);
@@ -337,27 +324,14 @@ auth_set_prerequisites(struct armv8_crypto_session *sess,
                 * Generate authentication key, i_key_pad and o_key_pad.
                 */
                /* Zero memory under key */
-               memset(sess->auth.hmac.key, 0, SHA256_AUTH_KEY_LENGTH);
-
-               if (xform->auth.key.length > SHA256_AUTH_KEY_LENGTH) {
-                       /*
-                        * In case the key is longer than 256 bits
-                        * the algorithm will use SHA256(key) instead.
-                        */
-                       error = sha256_block(NULL, xform->auth.key.data,
-                               sess->auth.hmac.key, xform->auth.key.length);
-                       if (error != 0)
-                               return -1;
-               } else {
-                       /*
-                        * Now copy the given authentication key to the session
-                        * key assuming that the session key is zeroed there is
-                        * no need for additional zero padding if the key is
-                        * shorter than SHA256_AUTH_KEY_LENGTH.
-                        */
-                       rte_memcpy(sess->auth.hmac.key, xform->auth.key.data,
-                                                       xform->auth.key.length);
-               }
+               memset(sess->auth.hmac.key, 0, SHA256_BLOCK_SIZE);
+
+               /*
+                * Now copy the given authentication key to the session
+                * key.
+                */
+               rte_memcpy(sess->auth.hmac.key, xform->auth.key.data,
+                                               xform->auth.key.length);
 
                /* Prepare HMAC padding: key|pattern */
                auth_hmac_pad_prepare(sess, xform);
@@ -417,7 +391,7 @@ armv8_crypto_set_session_chained_parameters(struct armv8_crypto_session *sess,
                order = sess->chain_order;
                break;
        default:
-               return -EINVAL;
+               return -ENOTSUP;
        }
        /* Select cipher direction */
        sess->cipher.direction = cipher_xform->cipher.op;
@@ -437,7 +411,7 @@ armv8_crypto_set_session_chained_parameters(struct armv8_crypto_session *sess,
                sess->cipher.iv.length = 16;
                break;
        default:
-               return -EINVAL;
+               return -ENOTSUP;
        }
        /* Select auth generate/verify */
        sess->auth.operation = auth_xform->auth.op;
@@ -451,7 +425,7 @@ armv8_crypto_set_session_chained_parameters(struct armv8_crypto_session *sess,
                sess->auth.mode = ARMV8_CRYPTO_AUTH_AS_HMAC;
                break;
        default:
-               return -EINVAL;
+               return -ENOTSUP;
        }
 
        /* Set the digest length */
@@ -471,7 +445,7 @@ armv8_crypto_set_session_chained_parameters(struct armv8_crypto_session *sess,
        default: /* Fall through */
                sess->crypto_func = NULL;
                sess->cipher.key_sched = NULL;
-               return -EINVAL;
+               return -ENOTSUP;
        }
 
        if (unlikely(sess->crypto_func == NULL)) {
@@ -525,7 +499,7 @@ armv8_crypto_set_session_parameters(struct armv8_crypto_session *sess,
                break;
        default:
                is_chained_op = false;
-               return -EINVAL;
+               return -ENOTSUP;
        }
 
        /* Set IV offset */
@@ -537,11 +511,11 @@ armv8_crypto_set_session_parameters(struct armv8_crypto_session *sess,
                if (unlikely(ret != 0)) {
                        ARMV8_CRYPTO_LOG_ERR(
                        "Invalid/unsupported chained (cipher/auth) parameters");
-                       return -EINVAL;
+                       return ret;
                }
        } else {
                ARMV8_CRYPTO_LOG_ERR("Invalid/unsupported operation");
-               return -EINVAL;
+               return -ENOTSUP;
        }
 
        return 0;
@@ -555,28 +529,34 @@ get_session(struct armv8_crypto_qp *qp, struct rte_crypto_op *op)
 
        if (op->sess_type == RTE_CRYPTO_OP_WITH_SESSION) {
                /* get existing session */
-               if (likely(op->sym->session != NULL &&
-                               op->sym->session->driver_id ==
-                               cryptodev_driver_id)) {
+               if (likely(op->sym->session != NULL)) {
                        sess = (struct armv8_crypto_session *)
-                               op->sym->session->_private;
+                                       get_session_private_data(
+                                       op->sym->session,
+                                       cryptodev_driver_id);
                }
        } else {
                /* provide internal session */
                void *_sess = NULL;
+               void *_sess_private_data = NULL;
 
-               if (!rte_mempool_get(qp->sess_mp, (void **)&_sess)) {
-                       sess = (struct armv8_crypto_session *)
-                               ((struct rte_cryptodev_sym_session *)_sess)
-                               ->_private;
-
-                       if (unlikely(armv8_crypto_set_session_parameters(
-                                       sess, op->sym->xform) != 0)) {
-                               rte_mempool_put(qp->sess_mp, _sess);
-                               sess = NULL;
-                       } else
-                               op->sym->session = _sess;
+               if (rte_mempool_get(qp->sess_mp, (void **)&_sess))
+                       return NULL;
+
+               if (rte_mempool_get(qp->sess_mp, (void **)&_sess_private_data))
+                       return NULL;
+
+               sess = (struct armv8_crypto_session *)_sess_private_data;
+
+               if (unlikely(armv8_crypto_set_session_parameters(sess,
+                               op->sym->xform) != 0)) {
+                       rte_mempool_put(qp->sess_mp, _sess);
+                       rte_mempool_put(qp->sess_mp, _sess_private_data);
+                       sess = NULL;
                }
+               op->sym->session = (struct rte_cryptodev_sym_session *)_sess;
+               set_session_private_data(op->sym->session, cryptodev_driver_id,
+                       _sess_private_data);
        }
 
        if (unlikely(sess == NULL))
@@ -706,6 +686,9 @@ process_op(const struct armv8_crypto_qp *qp, struct rte_crypto_op *op,
        /* Free session if a session-less crypto op */
        if (op->sess_type == RTE_CRYPTO_OP_SESSIONLESS) {
                memset(sess, 0, sizeof(struct armv8_crypto_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;
        }
@@ -899,15 +882,18 @@ cryptodev_armv8_crypto_uninit(struct rte_vdev_device *vdev)
        return 0;
 }
 
-static struct rte_vdev_driver armv8_crypto_drv = {
+static struct rte_vdev_driver armv8_crypto_pmd_drv = {
        .probe = cryptodev_armv8_crypto_init,
        .remove = cryptodev_armv8_crypto_uninit
 };
 
-RTE_PMD_REGISTER_VDEV(CRYPTODEV_NAME_ARMV8_PMD, armv8_crypto_drv);
+static struct cryptodev_driver armv8_crypto_drv;
+
+RTE_PMD_REGISTER_VDEV(CRYPTODEV_NAME_ARMV8_PMD, armv8_crypto_pmd_drv);
 RTE_PMD_REGISTER_ALIAS(CRYPTODEV_NAME_ARMV8_PMD, cryptodev_armv8_pmd);
 RTE_PMD_REGISTER_PARAM_STRING(CRYPTODEV_NAME_ARMV8_PMD,
        "max_nb_queue_pairs=<int> "
        "max_nb_sessions=<int> "
        "socket_id=<int>");
-RTE_PMD_REGISTER_CRYPTO_DRIVER(armv8_crypto_drv, cryptodev_driver_id);
+RTE_PMD_REGISTER_CRYPTO_DRIVER(armv8_crypto_drv, armv8_crypto_pmd_drv,
+               cryptodev_driver_id);