git: 6a13905b5ab3 - stable/13 - OCF: Add crypto_clonereq().
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 29 Apr 2022 23:12:29 UTC
The branch stable/13 has been updated by jhb:
URL: https://cgit.FreeBSD.org/src/commit/?id=6a13905b5ab39f2f4ed8f5c9c8b6af204925088d
commit 6a13905b5ab39f2f4ed8f5c9c8b6af204925088d
Author: John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2022-01-04 22:22:12 +0000
Commit: John Baldwin <jhb@FreeBSD.org>
CommitDate: 2022-04-29 22:41:27 +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
(cherry picked from commit 74d3f1b63dbea05038e966cf4bb69a01b0589500)
---
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 a7c3d69f4e70..0c686813118e 100644
--- a/share/man/man9/Makefile
+++ b/share/man/man9/Makefile
@@ -951,7 +951,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 6253e49dfb32..bc71a870f831 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 void
@@ -72,8 +74,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.
@@ -83,13 +87,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
@@ -99,6 +106,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 69dd75ab1d0c..1c5074e847ed 100644
--- a/sys/opencrypto/crypto.c
+++ b/sys/opencrypto/crypto.c
@@ -1847,6 +1847,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 8aa9f80ec696..90ed5f460776 100644
--- a/sys/opencrypto/cryptodev.h
+++ b/sys/opencrypto/cryptodev.h
@@ -463,6 +463,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_BATCH 0x0008 /* Batch op if possible */
@@ -503,6 +504,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 */
@@ -686,6 +688,8 @@ void crypto_done(struct cryptop *crp);
void crypto_kdone(struct cryptkop *);
int crypto_getfeat(int *);
+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);