cryptodev: introduce an unified wrapper for crypto operation

We use an opaque point to the VirtIOCryptoReq which
can support different packets based on different
algorithms.

Signed-off-by: Gonglei <arei.gonglei@huawei.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
Gonglei 2016-10-28 16:33:29 +08:00 committed by Michael S. Tsirkin
parent 04b9b37edd
commit d6634ac09a
3 changed files with 38 additions and 13 deletions

View File

@ -30,6 +30,8 @@
#include "qapi-visit.h" #include "qapi-visit.h"
#include "qemu/config-file.h" #include "qemu/config-file.h"
#include "qom/object_interfaces.h" #include "qom/object_interfaces.h"
#include "hw/virtio/virtio-crypto.h"
static QTAILQ_HEAD(, CryptoDevBackendClient) crypto_clients; static QTAILQ_HEAD(, CryptoDevBackendClient) crypto_clients;
@ -105,7 +107,7 @@ int cryptodev_backend_sym_close_session(
return -1; return -1;
} }
int cryptodev_backend_sym_operation( static int cryptodev_backend_sym_operation(
CryptoDevBackend *backend, CryptoDevBackend *backend,
CryptoDevBackendSymOpInfo *op_info, CryptoDevBackendSymOpInfo *op_info,
uint32_t queue_index, Error **errp) uint32_t queue_index, Error **errp)
@ -117,7 +119,29 @@ int cryptodev_backend_sym_operation(
return bc->do_sym_op(backend, op_info, queue_index, errp); return bc->do_sym_op(backend, op_info, queue_index, errp);
} }
return -1; return -VIRTIO_CRYPTO_ERR;
}
int cryptodev_backend_crypto_operation(
CryptoDevBackend *backend,
void *opaque,
uint32_t queue_index, Error **errp)
{
VirtIOCryptoReq *req = opaque;
if (req->flags == CRYPTODEV_BACKEND_ALG_SYM) {
CryptoDevBackendSymOpInfo *op_info;
op_info = req->u.sym_op_info;
return cryptodev_backend_sym_operation(backend,
op_info, queue_index, errp);
} else {
error_setg(errp, "Unsupported cryptodev alg type: %" PRIu32 "",
req->flags);
return -VIRTIO_CRYPTO_NOTSUPP;
}
return -VIRTIO_CRYPTO_ERR;
} }
static void static void

View File

@ -634,15 +634,15 @@ virtio_crypto_handle_request(VirtIOCryptoReq *request)
/* Set request's parameter */ /* Set request's parameter */
request->flags = CRYPTODEV_BACKEND_ALG_SYM; request->flags = CRYPTODEV_BACKEND_ALG_SYM;
request->u.sym_op_info = sym_op_info; request->u.sym_op_info = sym_op_info;
ret = cryptodev_backend_sym_operation(vcrypto->cryptodev, ret = cryptodev_backend_crypto_operation(vcrypto->cryptodev,
sym_op_info, queue_index, &local_err); request, queue_index, &local_err);
if (ret < 0) { if (ret < 0) {
status = VIRTIO_CRYPTO_ERR; status = -ret;
if (local_err) { if (local_err) {
error_report_err(local_err); error_report_err(local_err);
} }
} else { /* ret >= 0 */ } else { /* ret == VIRTIO_CRYPTO_OK */
status = VIRTIO_CRYPTO_OK; status = ret;
} }
virtio_crypto_req_complete(request, status); virtio_crypto_req_complete(request, status);
virtio_crypto_free_request(request); virtio_crypto_free_request(request);

View File

@ -278,20 +278,21 @@ int cryptodev_backend_sym_close_session(
uint32_t queue_index, Error **errp); uint32_t queue_index, Error **errp);
/** /**
* cryptodev_backend_sym_operation: * cryptodev_backend_crypto_operation:
* @backend: the cryptodev backend object * @backend: the cryptodev backend object
* @op_info: parameters needed by symmetric crypto operation * @opaque: pointer to a VirtIOCryptoReq object
* @queue_index: queue index of cryptodev backend client * @queue_index: queue index of cryptodev backend client
* @errp: pointer to a NULL-initialized error object * @errp: pointer to a NULL-initialized error object
* *
* Do symmetric crypto operation, such as encryption and * Do crypto operation, such as encryption and
* decryption * decryption
* *
* Returns: 0 on success, or Negative on error * Returns: VIRTIO_CRYPTO_OK on success,
* or -VIRTIO_CRYPTO_* on error
*/ */
int cryptodev_backend_sym_operation( int cryptodev_backend_crypto_operation(
CryptoDevBackend *backend, CryptoDevBackend *backend,
CryptoDevBackendSymOpInfo *op_info, void *opaque,
uint32_t queue_index, Error **errp); uint32_t queue_index, Error **errp);
#endif /* CRYPTODEV_H */ #endif /* CRYPTODEV_H */