From aada131b6dde8a915a21be958dda9109bc290648 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Thu, 26 Dec 2024 14:40:13 -0800 Subject: [PATCH] tls: use nni_aio_begin --- src/sp/transport/tls/tls.c | 41 +++++++---------------- src/supplemental/tls/tls_common.c | 54 +++++++++++++------------------ 2 files changed, 33 insertions(+), 62 deletions(-) diff --git a/src/sp/transport/tls/tls.c b/src/sp/transport/tls/tls.c index 9a216f2bc..db301af39 100644 --- a/src/sp/transport/tls/tls.c +++ b/src/sp/transport/tls/tls.c @@ -458,19 +458,11 @@ static void tlstran_pipe_send(void *arg, nni_aio *aio) { tlstran_pipe *p = arg; - int rv; - if (nni_aio_begin(aio) != 0) { - // No way to give the message back to the protocol, so - // we just discard it silently to prevent it from leaking. - nni_msg_free(nni_aio_get_msg(aio)); - nni_aio_set_msg(aio, NULL); - return; - } + nni_aio_reset(aio); nni_mtx_lock(&p->mtx); - if ((rv = nni_aio_schedule(aio, tlstran_pipe_send_cancel, p)) != 0) { + if (!nni_aio_start(aio, tlstran_pipe_send_cancel, p)) { nni_mtx_unlock(&p->mtx); - nni_aio_finish_error(aio, rv); return; } nni_list_append(&p->sendq, aio); @@ -523,15 +515,11 @@ static void tlstran_pipe_recv(void *arg, nni_aio *aio) { tlstran_pipe *p = arg; - int rv; - if (nni_aio_begin(aio) != 0) { - return; - } + nni_aio_reset(aio); nni_mtx_lock(&p->mtx); - if ((rv = nni_aio_schedule(aio, tlstran_pipe_recv_cancel, p)) != 0) { + if (!nni_aio_start(aio, tlstran_pipe_recv_cancel, p)) { nni_mtx_unlock(&p->mtx); - nni_aio_finish_error(aio, rv); return; } @@ -681,7 +669,9 @@ tlstran_accept_cb(void *arg) nni_aio_finish_error(aio, rv); } switch (rv) { - + case NNG_ECLOSED: + case NNG_ESTOPPED: + break; case NNG_ENOMEM: case NNG_ENOFILES: // We need to cool down here, to avoid spinning. @@ -837,12 +827,8 @@ static void tlstran_ep_connect(void *arg, nni_aio *aio) { tlstran_ep *ep = arg; - int rv; - - if (nni_aio_begin(aio) != 0) { - return; - } + nni_aio_reset(aio); nni_mtx_lock(&ep->mtx); if (ep->closed) { nni_mtx_unlock(&ep->mtx); @@ -854,9 +840,8 @@ tlstran_ep_connect(void *arg, nni_aio *aio) nni_aio_finish_error(aio, NNG_EBUSY); return; } - if ((rv = nni_aio_schedule(aio, tlstran_ep_cancel, ep)) != 0) { + if (!nni_aio_start(aio, tlstran_ep_cancel, ep)) { nni_mtx_unlock(&ep->mtx); - nni_aio_finish_error(aio, rv); return; } ep->useraio = aio; @@ -888,11 +873,8 @@ static void tlstran_ep_accept(void *arg, nni_aio *aio) { tlstran_ep *ep = arg; - int rv; - if (nni_aio_begin(aio) != 0) { - return; - } + nni_aio_reset(aio); nni_mtx_lock(&ep->mtx); if (ep->closed) { nni_mtx_unlock(&ep->mtx); @@ -904,9 +886,8 @@ tlstran_ep_accept(void *arg, nni_aio *aio) nni_aio_finish_error(aio, NNG_EBUSY); return; } - if ((rv = nni_aio_schedule(aio, tlstran_ep_cancel, ep)) != 0) { + if (!nni_aio_start(aio, tlstran_ep_cancel, ep)) { nni_mtx_unlock(&ep->mtx); - nni_aio_finish_error(aio, rv); return; } ep->useraio = aio; diff --git a/src/supplemental/tls/tls_common.c b/src/supplemental/tls/tls_common.c index a871e74eb..96255a72d 100644 --- a/src/supplemental/tls/tls_common.c +++ b/src/supplemental/tls/tls_common.c @@ -63,6 +63,7 @@ typedef struct { nni_aio conn_aio; // system aio for connect/accept nni_mtx lock; bool closed; + nni_atomic_flag did_close; bool hs_done; nni_list send_queue; nni_list recv_queue; @@ -180,19 +181,16 @@ static void tls_dialer_dial(void *arg, nng_aio *aio) { tls_dialer *d = arg; - int rv; tls_conn *conn; + int rv; - if (nni_aio_begin(aio) != 0) { - return; - } + nni_aio_reset(aio); if ((rv = tls_alloc(&conn, d->cfg, aio)) != 0) { nni_aio_finish_error(aio, rv); return; } - if ((rv = nni_aio_schedule(aio, tls_conn_cancel, conn)) != 0) { - nni_aio_finish_error(aio, rv); + if (!nni_aio_start(aio, tls_conn_cancel, conn)) { tls_free(conn); return; } @@ -352,16 +350,13 @@ tls_listener_accept(void *arg, nng_aio *aio) int rv; tls_conn *conn; - if (nni_aio_begin(aio) != 0) { - return; - } + nni_aio_reset(aio); if ((rv = tls_alloc(&conn, l->cfg, aio)) != 0) { nni_aio_finish_error(aio, rv); return; } - if ((rv = nni_aio_schedule(aio, tls_conn_cancel, conn)) != 0) { - nni_aio_finish_error(aio, rv); + if (!nni_aio_start(aio, tls_conn_cancel, conn)) { tls_free(conn); return; } @@ -483,21 +478,17 @@ tls_cancel(nni_aio *aio, void *arg, int rv) static void tls_send(void *arg, nni_aio *aio) { - int rv; tls_conn *conn = arg; - if (nni_aio_begin(aio) != 0) { - return; - } + nni_aio_reset(aio); nni_mtx_lock(&conn->lock); - if (conn->closed) { + if (!nni_aio_start(aio, tls_cancel, conn)) { nni_mtx_unlock(&conn->lock); - nni_aio_finish_error(aio, NNG_ECLOSED); return; } - if ((rv = nni_aio_schedule(aio, tls_cancel, conn)) != 0) { + if (conn->closed) { nni_mtx_unlock(&conn->lock); - nni_aio_finish_error(aio, rv); + nni_aio_finish_error(aio, NNG_ECLOSED); return; } nni_list_append(&conn->send_queue, aio); @@ -508,21 +499,17 @@ tls_send(void *arg, nni_aio *aio) static void tls_recv(void *arg, nni_aio *aio) { - int rv; tls_conn *conn = arg; - if (nni_aio_begin(aio) != 0) { - return; - } + nni_aio_reset(aio); nni_mtx_lock(&conn->lock); - if (conn->closed) { + if (!nni_aio_start(aio, tls_cancel, conn)) { nni_mtx_unlock(&conn->lock); - nni_aio_finish_error(aio, NNG_ECLOSED); return; } - if ((rv = nni_aio_schedule(aio, tls_cancel, conn)) != 0) { + if (conn->closed) { nni_mtx_unlock(&conn->lock); - nni_aio_finish_error(aio, rv); + nni_aio_finish_error(aio, NNG_ECLOSED); return; } @@ -536,11 +523,13 @@ tls_close(void *arg) { tls_conn *conn = arg; - nni_mtx_lock(&conn->lock); - conn->ops.close((void *) (conn + 1)); - tls_tcp_error(conn, NNG_ECLOSED); - nni_mtx_unlock(&conn->lock); - nng_stream_close(conn->tcp); + if (!nni_atomic_flag_test_and_set(&conn->did_close)) { + nni_mtx_lock(&conn->lock); + conn->ops.close((void *) (conn + 1)); + tls_tcp_error(conn, NNG_ECLOSED); + nni_mtx_unlock(&conn->lock); + nng_stream_close(conn->tcp); + } } static void @@ -650,6 +639,7 @@ tls_alloc(tls_conn **conn_p, nng_tls_config *cfg, nng_aio *user_aio) nni_aio_set_timeout(&conn->conn_aio, NNG_DURATION_INFINITE); nni_aio_set_timeout(&conn->tcp_send, NNG_DURATION_INFINITE); nni_aio_set_timeout(&conn->tcp_recv, NNG_DURATION_INFINITE); + nni_atomic_flag_reset(&conn->did_close); conn->stream.s_close = tls_close; conn->stream.s_free = tls_free;