From nobody Tue Jan 04 22:38:47 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id A1BD11926043; Tue, 4 Jan 2022 22:38:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4JT6wR2dyWz4qYG; Tue, 4 Jan 2022 22:38:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 3A708212E4; Tue, 4 Jan 2022 22:38:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 204Mcl2F088312; Tue, 4 Jan 2022 22:38:47 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 204MclCR088311; Tue, 4 Jan 2022 22:38:47 GMT (envelope-from git) Date: Tue, 4 Jan 2022 22:38:47 GMT Message-Id: <202201042238.204MclCR088311@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: John Baldwin Subject: git: 74d3f1b63dbe - main - OCF: Add crypto_clonereq(). List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 74d3f1b63dbea05038e966cf4bb69a01b0589500 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1641335927; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=CjaQvEma5ew9/v9YluMNBNpi9UIyECpL57QW0VF0sSE=; b=kqhxXanbvsgKAh3sjuJ9eQtkTa+CBJsI6aLUtw1HhEjgpX2aSyOHWKzScPy4BspbHvT4BR gyOj2d9c/8aeb3kNwRYvckNQUQAVg1bx+o6DSruNGXSIv5LElkPWgTYa0btoBGXdqRzpJ0 HBRCyHBrWhr5AitkbQnswIHw8d1UzqPf7mIoMG9lp0T/p7JBWHyqz3pbRWrGarPCCvKOY5 ttIufVzXgpSFAMNS31pShJfjQ0B8a0vdv+u19dkrfWbrNxSUp4sby0dZR2wyJeZDAR2upL Oc/h5GZDoS+sUpILF3s1YVJa74GHeRRc9b5YQumOWgl8tLAo2VaoFeEJLNhGig== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1641335927; a=rsa-sha256; cv=none; b=EnLoCGAQRAdEt93UXX0kyqyG1Qe8i/93uV+Yv2hhawb1Z2vxt56APfOxwGDhqCbOYMzq+L dJNNQXwv1em+xv9yLhE+J+emLq3SbGv8vwjN//PNCheQClbRea5tP2difEeX+Tveg3eRtN +Ej0xy1GgzycxuBpx1dKiDbygkdRso0qtGqcnoAkyPkb4huIuaLNmoXo4IxwlmB/gEr5cr WnoJB9x5ScW0b4uwn6gcb+E1PzJMDvGOfczd+bBlXPmcl53pkenAMbO7Hh2NdNt3vO4ytz NaIYr34f8ZgwSsZvSESkrgU1xjt11FBRWdKibcC3aO4AFx+yCJOeEo4uw+iLDw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=74d3f1b63dbea05038e966cf4bb69a01b0589500 commit 74d3f1b63dbea05038e966cf4bb69a01b0589500 Author: John Baldwin AuthorDate: 2022-01-04 22:22:12 +0000 Commit: John Baldwin 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);