git: 74d3f1b63dbe - main - OCF: Add crypto_clonereq().
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 04 Jan 2022 22:38:47 UTC
The branch main has been updated by jhb:
URL: https://cgit.FreeBSD.org/src/commit/?id=74d3f1b63dbea05038e966cf4bb69a01b0589500
commit 74d3f1b63dbea05038e966cf4bb69a01b0589500
Author: John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2022-01-04 22:22:12 +0000
Commit: John Baldwin <jhb@FreeBSD.org>
CommitDate: 2022-01-04 22:22:12 +0000
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
---
share/man/man9/Makefile | 3 ++-
share/man/man9/crypto_request.9 | 25 ++++++++++++++++++++++---
sys/opencrypto/crypto.c | 21 +++++++++++++++++++++
sys/opencrypto/cryptodev.h | 4 ++++
4 files changed, 49 insertions(+), 4 deletions(-)
diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile
index 150b7b5715c0..e1d2d66b8a26 100644
--- a/share/man/man9/Makefile
+++ b/share/man/man9/Makefile
@@ -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 \
diff --git a/share/man/man9/crypto_request.9 b/share/man/man9/crypto_request.9
index eb259f96be5e..3a05fe2a0340 100644
--- a/share/man/man9/crypto_request.9
+++ b/share/man/man9/crypto_request.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.
diff --git a/sys/opencrypto/crypto.c b/sys/opencrypto/crypto.c
index 0ddde1e50899..acc7b8d2ecb8 100644
--- a/sys/opencrypto/crypto.c
+++ b/sys/opencrypto/crypto.c
@@ -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.
*/
diff --git a/sys/opencrypto/cryptodev.h b/sys/opencrypto/cryptodev.h
index c9638169a8ec..ed396ed86912 100644
--- a/sys/opencrypto/cryptodev.h
+++ b/sys/opencrypto/cryptodev.h
@@ -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);