mirror of
https://github.com/freebsd/freebsd-src
synced 2024-09-06 17:18:32 +00:00
Consolidate duplicated code into a ktls_ocf_dispatch function.
This function manages the loop around crypto_dispatch and coordination with ktls_ocf_callback. Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D25757
This commit is contained in:
parent
d7d14db9c5
commit
70d1a4351a
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=363461
|
@ -100,6 +100,40 @@ ktls_ocf_callback(struct cryptop *crp)
|
|||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
ktls_ocf_dispatch(struct ocf_session *os, struct cryptop *crp)
|
||||
{
|
||||
struct ocf_operation oo;
|
||||
int error;
|
||||
|
||||
oo.os = os;
|
||||
oo.done = false;
|
||||
|
||||
crp->crp_opaque = &oo;
|
||||
crp->crp_callback = ktls_ocf_callback;
|
||||
for (;;) {
|
||||
error = crypto_dispatch(crp);
|
||||
if (error)
|
||||
break;
|
||||
|
||||
mtx_lock(&os->lock);
|
||||
while (!oo.done)
|
||||
mtx_sleep(&oo, &os->lock, 0, "ocfktls", 0);
|
||||
mtx_unlock(&os->lock);
|
||||
|
||||
if (crp->crp_etype != EAGAIN) {
|
||||
error = crp->crp_etype;
|
||||
break;
|
||||
}
|
||||
|
||||
crp->crp_etype = 0;
|
||||
crp->crp_flags &= ~CRYPTO_F_DONE;
|
||||
oo.done = false;
|
||||
counter_u64_add(ocf_retries, 1);
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
ktls_ocf_tls12_gcm_encrypt(struct ktls_session *tls,
|
||||
const struct tls_record_layer *hdr, uint8_t *trailer, struct iovec *iniov,
|
||||
|
@ -110,7 +144,6 @@ ktls_ocf_tls12_gcm_encrypt(struct ktls_session *tls,
|
|||
struct tls_aead_data ad;
|
||||
struct cryptop crp;
|
||||
struct ocf_session *os;
|
||||
struct ocf_operation oo;
|
||||
struct iovec iov[iovcnt + 1];
|
||||
int i, error;
|
||||
uint16_t tls_comp_len;
|
||||
|
@ -118,9 +151,6 @@ ktls_ocf_tls12_gcm_encrypt(struct ktls_session *tls,
|
|||
|
||||
os = tls->cipher;
|
||||
|
||||
oo.os = os;
|
||||
oo.done = false;
|
||||
|
||||
uio.uio_iov = iniov;
|
||||
uio.uio_iovcnt = iovcnt;
|
||||
uio.uio_offset = 0;
|
||||
|
@ -180,34 +210,13 @@ ktls_ocf_tls12_gcm_encrypt(struct ktls_session *tls,
|
|||
crypto_use_uio(&crp, &uio);
|
||||
if (!inplace)
|
||||
crypto_use_output_uio(&crp, &out_uio);
|
||||
crp.crp_opaque = &oo;
|
||||
crp.crp_callback = ktls_ocf_callback;
|
||||
|
||||
counter_u64_add(ocf_tls12_gcm_crypts, 1);
|
||||
if (inplace)
|
||||
counter_u64_add(ocf_inplace, 1);
|
||||
else
|
||||
counter_u64_add(ocf_separate_output, 1);
|
||||
for (;;) {
|
||||
error = crypto_dispatch(&crp);
|
||||
if (error)
|
||||
break;
|
||||
|
||||
mtx_lock(&os->lock);
|
||||
while (!oo.done)
|
||||
mtx_sleep(&oo, &os->lock, 0, "ocfktls", 0);
|
||||
mtx_unlock(&os->lock);
|
||||
|
||||
if (crp.crp_etype != EAGAIN) {
|
||||
error = crp.crp_etype;
|
||||
break;
|
||||
}
|
||||
|
||||
crp.crp_etype = 0;
|
||||
crp.crp_flags &= ~CRYPTO_F_DONE;
|
||||
oo.done = false;
|
||||
counter_u64_add(ocf_retries, 1);
|
||||
}
|
||||
error = ktls_ocf_dispatch(os, &crp);
|
||||
|
||||
crypto_destroyreq(&crp);
|
||||
return (error);
|
||||
|
@ -223,16 +232,12 @@ ktls_ocf_tls13_gcm_encrypt(struct ktls_session *tls,
|
|||
char nonce[12];
|
||||
struct cryptop crp;
|
||||
struct ocf_session *os;
|
||||
struct ocf_operation oo;
|
||||
struct iovec iov[iovcnt + 1], out_iov[iovcnt + 1];
|
||||
int i, error;
|
||||
bool inplace;
|
||||
|
||||
os = tls->cipher;
|
||||
|
||||
oo.os = os;
|
||||
oo.done = false;
|
||||
|
||||
crypto_initreq(&crp, os->sid);
|
||||
|
||||
/* Setup the nonce. */
|
||||
|
@ -294,8 +299,6 @@ ktls_ocf_tls13_gcm_encrypt(struct ktls_session *tls,
|
|||
|
||||
crp.crp_op = CRYPTO_OP_ENCRYPT | CRYPTO_OP_COMPUTE_DIGEST;
|
||||
crp.crp_flags = CRYPTO_F_CBIMM | CRYPTO_F_IV_SEPARATE;
|
||||
crp.crp_opaque = &oo;
|
||||
crp.crp_callback = ktls_ocf_callback;
|
||||
|
||||
memcpy(crp.crp_iv, nonce, sizeof(nonce));
|
||||
|
||||
|
@ -304,26 +307,7 @@ ktls_ocf_tls13_gcm_encrypt(struct ktls_session *tls,
|
|||
counter_u64_add(ocf_inplace, 1);
|
||||
else
|
||||
counter_u64_add(ocf_separate_output, 1);
|
||||
for (;;) {
|
||||
error = crypto_dispatch(&crp);
|
||||
if (error)
|
||||
break;
|
||||
|
||||
mtx_lock(&os->lock);
|
||||
while (!oo.done)
|
||||
mtx_sleep(&oo, &os->lock, 0, "ocfktls", 0);
|
||||
mtx_unlock(&os->lock);
|
||||
|
||||
if (crp.crp_etype != EAGAIN) {
|
||||
error = crp.crp_etype;
|
||||
break;
|
||||
}
|
||||
|
||||
crp.crp_etype = 0;
|
||||
crp.crp_flags &= ~CRYPTO_F_DONE;
|
||||
oo.done = false;
|
||||
counter_u64_add(ocf_retries, 1);
|
||||
}
|
||||
error = ktls_ocf_dispatch(os, &crp);
|
||||
|
||||
crypto_destroyreq(&crp);
|
||||
return (error);
|
||||
|
|
Loading…
Reference in a new issue