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:
parent
753c851387
commit
74d3f1b63d
@ -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 \
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user