Skip to content

Commit

Permalink
Consolidate duplicated code into a ktls_ocf_dispatch function.
Browse files Browse the repository at this point in the history
This function manages the loop around crypto_dispatch and coordination
with ktls_ocf_callback.

Sponsored by:	Netflix
Differential Revision:	https://reviews.freebsd.org/D25757
  • Loading branch information
bsdjhb committed Jul 23, 2020
1 parent d7d14db commit 70d1a43
Showing 1 changed file with 36 additions and 52 deletions.
88 changes: 36 additions & 52 deletions sys/opencrypto/ktls_ocf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -110,17 +144,13 @@ 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;
bool inplace;

os = tls->cipher;

oo.os = os;
oo.done = false;

uio.uio_iov = iniov;
uio.uio_iovcnt = iovcnt;
uio.uio_offset = 0;
Expand Down Expand Up @@ -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);
Expand All @@ -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. */
Expand Down Expand Up @@ -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));

Expand All @@ -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);
Expand Down

0 comments on commit 70d1a43

Please sign in to comment.