OCF: Add crypto_clonereq().

This function clones an existing crypto request, but associates the
new request with a specified session.  The intended use case is for
drivers to be able to fall back to software by cloning a request and
dispatch it to an internally allocated software session.

Reviewed by:	markj
Sponsored by:	Chelsio Communications
Differential Revision:	https://reviews.freebsd.org/D33607
This commit is contained in:
John Baldwin 2022-01-04 14:22:12 -08:00
parent 753c851387
commit 74d3f1b63d
4 changed files with 49 additions and 4 deletions

View File

@ -948,7 +948,8 @@ MLINKS+=crypto_driver.9 crypto_copyback.9 \
crypto_driver.9 CRYPTODEV_PROCESS.9 \
crypto_driver.9 hmac_init_ipad.9 \
crypto_driver.9 hmac_init_opad.9
MLINKS+=crypto_request.9 crypto_destroyreq.9 \
MLINKS+=crypto_request.9 crypto_clonereq.9 \
crypto_request.9 crypto_destroyreq.9 \
crypto_request.9 crypto_dispatch.9 \
crypto_request.9 crypto_freereq.9 \
crypto_request.9 crypto_getreq.9 \

View File

@ -38,6 +38,8 @@
.Nd symmetric cryptographic operations
.Sh SYNOPSIS
.In opencrypto/cryptodev.h
.Ft "struct cryptop *"
.Fn crypto_clonereq "crypto_session_t cses" "struct cryptop *crp" "int how"
.Ft int
.Fn crypto_dispatch "struct cryptop *crp"
.Ft int
@ -76,8 +78,10 @@ and is associated with an active session.
.Pp
Requests can either be allocated dynamically or use caller-supplied
storage.
Dynamically allocated requests should be allocated by
Dynamically allocated requests should be allocated by either
.Fn crypto_getreq
or
.Fn crypto_clonereq ,
and freed by
.Fn crypto_freereq
once the request has completed.
@ -87,13 +91,16 @@ at the start of each operation and destroyed by
.Fn crypto_destroyreq
once the request has completed.
.Pp
For both
.Fn crypto_getreq
For
.Fn crypto_clonereq ,
.Fn crypto_getreq ,
and
.Fn crypto_initreq ,
.Fa cses
is a reference to an active session.
For
.Fn crypto_clonereq
and
.Fn crypto_getreq ,
.Fa how
is passed to
@ -103,6 +110,18 @@ and should be set to either
or
.Dv M_WAITOK .
.Pp
.Fn crypto_clonereq
allocates a new request that inherits request inputs such as request buffers
from the original
.Fa crp
request.
However, the new request is associated with the
.Fa cses
session rather than inheriting the session from
.Fa crp .
.Fa crp
must not be a completed request.
.Pp
Once a request has been initialized,
the caller should set fields in the structure to describe
request-specific parameters.

View File

@ -1627,6 +1627,27 @@ crypto_getreq(crypto_session_t cses, int how)
return (crp);
}
/*
* Clone a crypto request, but associate it with the specified session
* rather than inheriting the session from the original request. The
* fields describing the request buffers are copied, but not the
* opaque field or callback function.
*/
struct cryptop *
crypto_clonereq(struct cryptop *crp, crypto_session_t cses, int how)
{
struct cryptop *new;
MPASS((crp->crp_flags & CRYPTO_F_DONE) == 0);
new = crypto_getreq(cses, how);
if (new == NULL)
return (NULL);
memcpy(&new->crp_startcopy, &crp->crp_startcopy,
__rangeof(struct cryptop, crp_startcopy, crp_endcopy));
return (new);
}
/*
* Invoke the callback on behalf of the driver.
*/

View File

@ -425,6 +425,7 @@ struct cryptop {
* should always check and use the new
* value on future requests.
*/
#define crp_startcopy crp_flags
int crp_flags;
#define CRYPTO_F_CBIMM 0x0010 /* Do callback immediately */
@ -457,6 +458,7 @@ struct cryptop {
const void *crp_cipher_key; /* New cipher key if non-NULL. */
const void *crp_auth_key; /* New auth key if non-NULL. */
#define crp_endcopy crp_opaque
void *crp_opaque; /* Opaque pointer, passed along */
@ -622,6 +624,8 @@ void crypto_dispatch_batch(struct cryptopq *crpq, int flags);
int crypto_unblock(uint32_t, int);
void crypto_done(struct cryptop *crp);
struct cryptop *crypto_clonereq(struct cryptop *crp, crypto_session_t cses,
int how);
void crypto_destroyreq(struct cryptop *crp);
void crypto_initreq(struct cryptop *crp, crypto_session_t cses);
void crypto_freereq(struct cryptop *crp);