diff options
| author | Garrett D'Amore <garrett@damore.org> | 2024-12-15 19:45:21 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2024-12-15 19:45:21 -0800 |
| commit | 58df588d6737269e5b93996cfe62acfc911269e5 (patch) | |
| tree | a1d8cf0fe162e09e411bc3bd25bc81c793002146 /src/sp | |
| parent | 23da22ca9c308d7b577c7ea2ad13a54f2d0e7406 (diff) | |
| download | nng-58df588d6737269e5b93996cfe62acfc911269e5.tar.gz nng-58df588d6737269e5b93996cfe62acfc911269e5.tar.bz2 nng-58df588d6737269e5b93996cfe62acfc911269e5.zip | |
tls transport: use inline SP structures
Diffstat (limited to 'src/sp')
| -rw-r--r-- | src/sp/transport/tls/tls.c | 205 |
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, |
