aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2024-12-15 19:45:21 -0800
committerGarrett D'Amore <garrett@damore.org>2024-12-15 19:45:21 -0800
commit58df588d6737269e5b93996cfe62acfc911269e5 (patch)
treea1d8cf0fe162e09e411bc3bd25bc81c793002146 /src
parent23da22ca9c308d7b577c7ea2ad13a54f2d0e7406 (diff)
downloadnng-58df588d6737269e5b93996cfe62acfc911269e5.tar.gz
nng-58df588d6737269e5b93996cfe62acfc911269e5.tar.bz2
nng-58df588d6737269e5b93996cfe62acfc911269e5.zip
tls transport: use inline SP structures
Diffstat (limited to 'src')
-rw-r--r--src/sp/transport/tls/tls.c205
1 files changed, 69 insertions, 136 deletions
diff --git a/src/sp/transport/tls/tls.c b/src/sp/transport/tls/tls.c
index 6b5a511f..37092e17 100644
--- a/src/sp/transport/tls/tls.c
+++ b/src/sp/transport/tls/tls.c
@@ -28,29 +28,27 @@ typedef struct tlstran_pipe tlstran_pipe;
// tlstran_pipe is one end of a TLS connection.
struct tlstran_pipe {
- nng_stream *tls;
- nni_pipe *npipe;
- uint16_t peer;
- uint16_t proto;
- size_t rcvmax;
- bool closed;
- nni_list_node node;
- nni_list sendq;
- nni_list recvq;
- tlstran_ep *ep;
- nni_atomic_flag reaped;
- nni_reap_node reap;
- uint8_t txlen[sizeof(uint64_t)];
- uint8_t rxlen[sizeof(uint64_t)];
- size_t gottxhead;
- size_t gotrxhead;
- size_t wanttxhead;
- size_t wantrxhead;
- nni_aio txaio;
- nni_aio rxaio;
- nni_aio negoaio;
- nni_msg *rxmsg;
- nni_mtx mtx;
+ nng_stream *tls;
+ nni_pipe *npipe;
+ uint16_t peer;
+ uint16_t proto;
+ size_t rcvmax;
+ bool closed;
+ nni_list_node node;
+ nni_list sendq;
+ nni_list recvq;
+ tlstran_ep *ep;
+ uint8_t txlen[sizeof(uint64_t)];
+ uint8_t rxlen[sizeof(uint64_t)];
+ size_t gottxhead;
+ size_t gotrxhead;
+ size_t wanttxhead;
+ size_t wantrxhead;
+ nni_aio txaio;
+ nni_aio rxaio;
+ nni_aio negoaio;
+ nni_msg *rxmsg;
+ nni_mtx mtx;
};
// Stuff that is common to both dialers and listeners.
@@ -61,15 +59,14 @@ struct tlstran_ep {
bool started;
bool closed;
bool fini;
- int refcnt;
nni_list pipes;
- nni_reap_node reap;
nng_stream_dialer *dialer;
nng_stream_listener *listener;
+ nni_dialer *ndialer;
+ nni_listener *nlistener;
nni_aio *useraio;
nni_aio connaio;
nni_aio timeaio;
- nni_list busypipes; // busy pipes -- ones passed to socket
nni_list waitpipes; // pipes waiting to match to socket
nni_list negopipes; // pipes busy negotiating
const char *host;
@@ -85,16 +82,6 @@ static void tlstran_pipe_nego_cb(void *);
static void tlstran_ep_fini(void *);
static void tlstran_pipe_fini(void *);
-static nni_reap_list tlstran_ep_reap_list = {
- .rl_offset = offsetof(tlstran_ep, reap),
- .rl_func = tlstran_ep_fini,
-};
-
-static nni_reap_list tlstran_pipe_reap_list = {
- .rl_offset = offsetof(tlstran_pipe, reap),
- .rl_func = tlstran_pipe_fini,
-};
-
static void
tlstran_init(void)
{
@@ -120,11 +107,16 @@ tlstran_pipe_close(void *arg)
static void
tlstran_pipe_stop(void *arg)
{
- tlstran_pipe *p = arg;
+ tlstran_pipe *p = arg;
+ tlstran_ep *ep = p->ep;
nni_aio_stop(&p->rxaio);
nni_aio_stop(&p->txaio);
nni_aio_stop(&p->negoaio);
+ nng_stream_stop(p->tls);
+ nni_mtx_lock(&ep->mtx);
+ nni_list_node_remove(&p->node);
+ nni_mtx_unlock(&ep->mtx);
}
static int
@@ -132,6 +124,13 @@ tlstran_pipe_init(void *arg, nni_pipe *npipe)
{
tlstran_pipe *p = arg;
p->npipe = npipe;
+ nni_mtx_init(&p->mtx);
+ nni_aio_init(&p->txaio, tlstran_pipe_send_cb, p);
+ nni_aio_init(&p->rxaio, tlstran_pipe_recv_cb, p);
+ nni_aio_init(&p->negoaio, tlstran_pipe_nego_cb, p);
+ nni_aio_list_init(&p->recvq);
+ nni_aio_list_init(&p->sendq);
+
return (0);
}
@@ -139,56 +138,14 @@ static void
tlstran_pipe_fini(void *arg)
{
tlstran_pipe *p = arg;
- tlstran_ep *ep;
tlstran_pipe_stop(p);
- if ((ep = p->ep) != NULL) {
- nni_mtx_lock(&ep->mtx);
- nni_list_node_remove(&p->node);
- ep->refcnt--;
- if (ep->fini && (ep->refcnt == 0)) {
- nni_reap(&tlstran_ep_reap_list, ep);
- }
- nni_mtx_unlock(&ep->mtx);
- }
nng_stream_free(p->tls);
nni_aio_fini(&p->rxaio);
nni_aio_fini(&p->txaio);
nni_aio_fini(&p->negoaio);
nni_msg_free(p->rxmsg);
- NNI_FREE_STRUCT(p);
-}
-
-static int
-tlstran_pipe_alloc(tlstran_pipe **pipep)
-{
- tlstran_pipe *p;
-
- if ((p = NNI_ALLOC_STRUCT(p)) == NULL) {
- return (NNG_ENOMEM);
- }
- nni_mtx_init(&p->mtx);
-
- nni_aio_init(&p->txaio, tlstran_pipe_send_cb, p);
- nni_aio_init(&p->rxaio, tlstran_pipe_recv_cb, p);
- nni_aio_init(&p->negoaio, tlstran_pipe_nego_cb, p);
- nni_aio_list_init(&p->recvq);
- nni_aio_list_init(&p->sendq);
- nni_atomic_flag_reset(&p->reaped);
-
- *pipep = p;
- return (0);
-}
-
-static void
-tlstran_pipe_reap(tlstran_pipe *p)
-{
- if (!nni_atomic_flag_test_and_set(&p->reaped)) {
- if (p->tls != NULL) {
- nng_stream_close(p->tls);
- }
- nni_reap(&tlstran_pipe_reap_list, p);
- }
+ nni_mtx_fini(&p->mtx);
}
static void
@@ -202,10 +159,9 @@ tlstran_ep_match(tlstran_ep *ep)
return;
}
nni_list_remove(&ep->waitpipes, p);
- nni_list_append(&ep->busypipes, p);
ep->useraio = NULL;
p->rcvmax = ep->rcvmax;
- nni_aio_set_output(aio, 0, p);
+ nni_aio_set_output(aio, 0, p->npipe);
nni_aio_finish(aio, 0, 0);
}
@@ -286,7 +242,8 @@ error:
nni_aio_finish_error(uaio, rv);
}
nni_mtx_unlock(&ep->mtx);
- tlstran_pipe_reap(p);
+ nni_pipe_close(p->npipe);
+ nni_pipe_rele(p->npipe);
}
static void
@@ -598,8 +555,6 @@ tlstran_pipe_start(tlstran_pipe *p, nng_stream *conn, tlstran_ep *ep)
{
nni_iov iov;
- ep->refcnt++;
-
p->tls = conn;
p->ep = ep;
p->proto = ep->proto;
@@ -629,20 +584,12 @@ tlstran_ep_fini(void *arg)
{
tlstran_ep *ep = arg;
- nni_mtx_lock(&ep->mtx);
- ep->fini = true;
- if (ep->refcnt != 0) {
- nni_mtx_unlock(&ep->mtx);
- return;
- }
- nni_mtx_unlock(&ep->mtx);
nng_stream_dialer_free(ep->dialer);
nng_stream_listener_free(ep->listener);
nni_aio_fini(&ep->timeaio);
nni_aio_fini(&ep->connaio);
nni_mtx_fini(&ep->mtx);
- NNI_FREE_STRUCT(ep);
}
static void
@@ -673,13 +620,10 @@ tlstran_ep_close(void *arg)
nng_stream_listener_close(ep->listener);
}
NNI_LIST_FOREACH (&ep->negopipes, p) {
- tlstran_pipe_close(p);
+ nni_pipe_close(p->npipe);
}
NNI_LIST_FOREACH (&ep->waitpipes, p) {
- tlstran_pipe_close(p);
- }
- NNI_LIST_FOREACH (&ep->busypipes, p) {
- tlstran_pipe_close(p);
+ nni_pipe_close(p->npipe);
}
if (ep->useraio != NULL) {
nni_aio_finish_error(ep->useraio, NNG_ECLOSED);
@@ -713,17 +657,17 @@ tlstran_accept_cb(void *arg)
}
conn = nni_aio_get_output(aio, 0);
- if ((rv = tlstran_pipe_alloc(&p)) != 0) {
- nng_stream_free(conn);
- goto error;
- }
if (ep->closed) {
- tlstran_pipe_fini(p);
nng_stream_free(conn);
rv = NNG_ECLOSED;
goto error;
}
+ rv = nni_pipe_alloc_listener((void **) &p, ep->nlistener);
+ if (rv != 0) {
+ nng_stream_free(conn);
+ goto error;
+ }
tlstran_pipe_start(p, conn, ep);
nng_stream_listener_accept(ep->listener, aio);
nni_mtx_unlock(&ep->mtx);
@@ -765,25 +709,24 @@ tlstran_dial_cb(void *arg)
int rv;
nng_stream *conn;
+ nni_mtx_lock(&ep->mtx);
if ((rv = nni_aio_result(aio)) != 0) {
goto error;
}
conn = nni_aio_get_output(aio, 0);
- if ((rv = tlstran_pipe_alloc(&p)) != 0) {
+
+ if (ep->closed) {
nng_stream_free(conn);
+ rv = NNG_ECLOSED;
goto error;
}
- nni_mtx_lock(&ep->mtx);
- if (ep->closed) {
- tlstran_pipe_fini(p);
+
+ if ((rv = nni_pipe_alloc_dialer((void **) &p, ep->ndialer)) != 0) {
nng_stream_free(conn);
- rv = NNG_ECLOSED;
- nni_mtx_unlock(&ep->mtx);
goto error;
- } else {
- tlstran_pipe_start(p, conn, ep);
}
+ tlstran_pipe_start(p, conn, ep);
nni_mtx_unlock(&ep->mtx);
return;
@@ -798,20 +741,15 @@ error:
}
static int
-tlstran_ep_init(tlstran_ep **epp, nng_url *url, nni_sock *sock)
+tlstran_ep_init(tlstran_ep *ep, nni_sock *sock, nni_cb conn_cb)
{
- tlstran_ep *ep;
- NNI_ARG_UNUSED(url);
-
- if ((ep = NNI_ALLOC_STRUCT(ep)) == NULL) {
- return (NNG_ENOMEM);
- }
nni_mtx_init(&ep->mtx);
- NNI_LIST_INIT(&ep->busypipes, tlstran_pipe, node);
NNI_LIST_INIT(&ep->waitpipes, tlstran_pipe, node);
NNI_LIST_INIT(&ep->negopipes, tlstran_pipe, node);
ep->proto = nni_sock_proto_id(sock);
+ nni_aio_init(&ep->connaio, conn_cb, ep);
+ nni_aio_init(&ep->timeaio, tlstran_timer_cb, ep);
#ifdef NNG_ENABLE_STATS
static const nni_stat_info rcv_max_info = {
@@ -824,17 +762,19 @@ tlstran_ep_init(tlstran_ep **epp, nng_url *url, nni_sock *sock)
nni_stat_init(&ep->st_rcv_max, &rcv_max_info);
#endif
- *epp = ep;
return (0);
}
static int
tlstran_ep_init_dialer(void **dp, nng_url *url, nni_dialer *ndialer)
{
- tlstran_ep *ep;
+ tlstran_ep *ep = (void *) dp;
int rv;
nni_sock *sock = nni_dialer_sock(ndialer);
+ tlstran_ep_init(ep, sock, tlstran_dial_cb);
+ ep->ndialer = ndialer;
+
// Check for invalid URL components.
if ((strlen(url->u_path) != 0) && (strcmp(url->u_path, "/") != 0)) {
return (NNG_EADDRINVAL);
@@ -845,30 +785,25 @@ tlstran_ep_init_dialer(void **dp, nng_url *url, nni_dialer *ndialer)
return (NNG_EADDRINVAL);
}
- if ((rv = tlstran_ep_init(&ep, url, sock)) != 0) {
- return (rv);
- }
-
- nni_aio_init(&ep->connaio, tlstran_dial_cb, ep);
-
if ((rv = nng_stream_dialer_alloc_url(&ep->dialer, url)) != 0) {
- tlstran_ep_fini(ep);
return (rv);
}
#ifdef NNG_ENABLE_STATS
nni_dialer_add_stat(ndialer, &ep->st_rcv_max);
#endif
- *dp = ep;
return (0);
}
static int
tlstran_ep_init_listener(void **lp, nng_url *url, nni_listener *nlistener)
{
- tlstran_ep *ep;
+ tlstran_ep *ep = (void *) lp;
int rv;
nni_sock *sock = nni_listener_sock(nlistener);
+ tlstran_ep_init(ep, sock, tlstran_accept_cb);
+ ep->nlistener = nlistener;
+
// Check for invalid URL components.
if ((strlen(url->u_path) != 0) && (strcmp(url->u_path, "/") != 0)) {
return (NNG_EADDRINVAL);
@@ -877,18 +812,13 @@ tlstran_ep_init_listener(void **lp, nng_url *url, nni_listener *nlistener)
(url->u_query != NULL)) {
return (NNG_EADDRINVAL);
}
- if (((rv = tlstran_ep_init(&ep, url, sock)) != 0) ||
- ((rv = nng_stream_listener_alloc_url(&ep->listener, url)) != 0)) {
- tlstran_ep_fini(ep);
+ if ((rv = nng_stream_listener_alloc_url(&ep->listener, url)) != 0) {
return (rv);
}
- nni_aio_init(&ep->connaio, tlstran_accept_cb, ep);
- nni_aio_init(&ep->timeaio, tlstran_timer_cb, ep);
#ifdef NNG_ENABLE_STATS
nni_listener_add_stat(nlistener, &ep->st_rcv_max);
#endif
- *lp = ep;
return (0);
}
@@ -1039,6 +969,7 @@ tlstran_pipe_getopt(
}
static nni_sp_pipe_ops tlstran_pipe_ops = {
+ .p_size = sizeof(tlstran_pipe),
.p_init = tlstran_pipe_init,
.p_fini = tlstran_pipe_fini,
.p_stop = tlstran_pipe_stop,
@@ -1148,6 +1079,7 @@ tlstran_dialer_get_tls(void *arg, nng_tls_config **cfgp)
}
static nni_sp_dialer_ops tlstran_dialer_ops = {
+ .d_size = sizeof(tlstran_ep),
.d_init = tlstran_ep_init_dialer,
.d_fini = tlstran_ep_fini,
.d_connect = tlstran_ep_connect,
@@ -1160,6 +1092,7 @@ static nni_sp_dialer_ops tlstran_dialer_ops = {
};
static nni_sp_listener_ops tlstran_listener_ops = {
+ .l_size = sizeof(tlstran_ep),
.l_init = tlstran_ep_init_listener,
.l_fini = tlstran_ep_fini,
.l_bind = tlstran_ep_bind,