From 53a9740d1dcbad6be4b4c1a10a5f3fcbb97a5be9 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Sun, 25 Feb 2024 17:13:38 -0800 Subject: fixes #1496 Provide NNG_ENABLE_IPV6 option (disabled by default) This also checks if the build system has the definitions for AF_INET6, which might help in some embedded IPv4 only settings. The resolver test is enhanced to include a check for IPv6 enabled in the kernel. IPv6 support is enabled by default, of course. --- src/sp/protocol.c | 5 +-- src/sp/transport/tcp/tcp.c | 82 ++++++++++++++++++++------------------ src/sp/transport/tls/tls.c | 88 ++++++++++++++++++++++------------------- src/sp/transport/ws/websocket.c | 34 +++++++++------- 4 files changed, 113 insertions(+), 96 deletions(-) (limited to 'src/sp') diff --git a/src/sp/protocol.c b/src/sp/protocol.c index 512b27cc..d64c85a3 100644 --- a/src/sp/protocol.c +++ b/src/sp/protocol.c @@ -12,7 +12,6 @@ #include "core/nng_impl.h" - int nni_proto_open(nng_socket *sip, const nni_proto *proto) { @@ -21,8 +20,8 @@ nni_proto_open(nng_socket *sip, const nni_proto *proto) if ((rv = nni_sock_open(&sock, proto)) == 0) { nng_socket s; - s.id = nni_sock_id(sock); // Keep socket held open. - *sip = s; + s.id = nni_sock_id(sock); // Keep socket held open. + *sip = s; } return (rv); } diff --git a/src/sp/transport/tcp/tcp.c b/src/sp/transport/tcp/tcp.c index 1b2a380c..a9075938 100644 --- a/src/sp/transport/tcp/tcp.c +++ b/src/sp/transport/tcp/tcp.c @@ -1,5 +1,5 @@ // -// Copyright 2023 Staysail Systems, Inc. +// Copyright 2024 Staysail Systems, Inc. // Copyright 2018 Capitar IT Group BV // Copyright 2019 Devolutions // @@ -22,14 +22,14 @@ typedef struct tcptran_ep tcptran_ep; // tcp_pipe is one end of a TCP connection. struct tcptran_pipe { - nng_stream * conn; - nni_pipe * npipe; + nng_stream *conn; + nni_pipe *npipe; uint16_t peer; uint16_t proto; size_t rcvmax; bool closed; nni_list_node node; - tcptran_ep * ep; + tcptran_ep *ep; nni_atomic_flag reaped; nni_reap_node reap; uint8_t txlen[sizeof(uint64_t)]; @@ -40,10 +40,10 @@ struct tcptran_pipe { size_t wantrxhead; nni_list recvq; nni_list sendq; - nni_aio * txaio; - nni_aio * rxaio; - nni_aio * negoaio; - nni_msg * rxmsg; + nni_aio *txaio; + nni_aio *rxaio; + nni_aio *negoaio; + nni_msg *rxmsg; nni_mtx mtx; }; @@ -54,18 +54,18 @@ struct tcptran_ep { bool fini; bool started; bool closed; - nng_url * url; - const char * host; // for dialers + nng_url *url; + const char *host; // for dialers nng_sockaddr src; int refcnt; // active pipes - nni_aio * useraio; - nni_aio * connaio; - nni_aio * timeaio; + 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 nni_reap_node reap; - nng_stream_dialer * dialer; + nng_stream_dialer *dialer; nng_stream_listener *listener; #ifdef NNG_ENABLE_STATS @@ -140,7 +140,7 @@ static void tcptran_pipe_fini(void *arg) { tcptran_pipe *p = arg; - tcptran_ep * ep; + tcptran_ep *ep; tcptran_pipe_stop(p); if ((ep = p->ep) != NULL) { @@ -202,7 +202,7 @@ tcptran_pipe_alloc(tcptran_pipe **pipep) static void tcptran_ep_match(tcptran_ep *ep) { - nni_aio * aio; + nni_aio *aio; tcptran_pipe *p; if (((aio = ep->useraio) == NULL) || @@ -221,9 +221,9 @@ static void tcptran_pipe_nego_cb(void *arg) { tcptran_pipe *p = arg; - tcptran_ep * ep = p->ep; - nni_aio * aio = p->negoaio; - nni_aio * uaio; + tcptran_ep *ep = p->ep; + nni_aio *aio = p->negoaio; + nni_aio *uaio; int rv; nni_mtx_lock(&ep->mtx); @@ -302,10 +302,10 @@ tcptran_pipe_send_cb(void *arg) { tcptran_pipe *p = arg; int rv; - nni_aio * aio; + nni_aio *aio; size_t n; - nni_msg * msg; - nni_aio * txaio = p->txaio; + nni_msg *msg; + nni_aio *txaio = p->txaio; nni_mtx_lock(&p->mtx); aio = nni_list_first(&p->sendq); @@ -348,11 +348,11 @@ static void tcptran_pipe_recv_cb(void *arg) { tcptran_pipe *p = arg; - nni_aio * aio; + nni_aio *aio; int rv; size_t n; - nni_msg * msg; - nni_aio * rxaio = p->rxaio; + nni_msg *msg; + nni_aio *rxaio = p->rxaio; nni_mtx_lock(&p->mtx); aio = nni_list_first(&p->recvq); @@ -678,7 +678,7 @@ tcptran_ep_fini(void *arg) static void tcptran_ep_close(void *arg) { - tcptran_ep * ep = arg; + tcptran_ep *ep = arg; tcptran_pipe *p; nni_mtx_lock(&ep->mtx); @@ -715,8 +715,8 @@ static int tcptran_url_parse_source(nng_url *url, nng_sockaddr *sa, const nng_url *surl) { int af; - char * semi; - char * src; + char *semi; + char *src; size_t len; int rv; nni_aio *aio; @@ -740,8 +740,10 @@ tcptran_url_parse_source(nng_url *url, nng_sockaddr *sa, const nng_url *surl) af = NNG_AF_UNSPEC; } else if (strcmp(surl->u_scheme, "tcp4") == 0) { af = NNG_AF_INET; +#ifdef NNG_ENABLE_IPV6 } else if (strcmp(surl->u_scheme, "tcp6") == 0) { af = NNG_AF_INET6; +#endif } else { return (NNG_EADDRINVAL); } @@ -777,11 +779,11 @@ tcptran_timer_cb(void *arg) static void tcptran_accept_cb(void *arg) { - tcptran_ep * ep = arg; - nni_aio * aio = ep->connaio; + tcptran_ep *ep = arg; + nni_aio *aio = ep->connaio; tcptran_pipe *p; int rv; - nng_stream * conn; + nng_stream *conn; nni_mtx_lock(&ep->mtx); @@ -832,11 +834,11 @@ error: static void tcptran_dial_cb(void *arg) { - tcptran_ep * ep = arg; - nni_aio * aio = ep->connaio; + tcptran_ep *ep = arg; + nni_aio *aio = ep->connaio; tcptran_pipe *p; int rv; - nng_stream * conn; + nng_stream *conn; if ((rv = nni_aio_result(aio)) != 0) { goto error; @@ -905,10 +907,10 @@ tcptran_ep_init(tcptran_ep **epp, nng_url *url, nni_sock *sock) static int tcptran_dialer_init(void **dp, nng_url *url, nni_dialer *ndialer) { - tcptran_ep * ep; + tcptran_ep *ep; int rv; nng_sockaddr srcsa; - nni_sock * sock = nni_dialer_sock(ndialer); + nni_sock *sock = nni_dialer_sock(ndialer); nng_url myurl; // Check for invalid URL components. @@ -954,7 +956,7 @@ tcptran_listener_init(void **lp, nng_url *url, nni_listener *nlistener) { tcptran_ep *ep; int rv; - nni_sock * sock = nni_listener_sock(nlistener); + nni_sock *sock = nni_listener_sock(nlistener); // Check for invalid URL components. if ((strlen(url->u_path) != 0) && (strcmp(url->u_path, "/") != 0)) { @@ -1030,7 +1032,7 @@ static int tcptran_ep_get_url(void *arg, void *v, size_t *szp, nni_opt_type t) { tcptran_ep *ep = arg; - char * s; + char *s; int rv; int port = 0; @@ -1243,6 +1245,7 @@ static nni_sp_tran tcp4_tran = { .tran_fini = tcptran_fini, }; +#ifdef NNG_ENABLE_IPV6 static nni_sp_tran tcp6_tran = { .tran_scheme = "tcp6", .tran_dialer = &tcptran_dialer_ops, @@ -1251,6 +1254,7 @@ static nni_sp_tran tcp6_tran = { .tran_init = tcptran_init, .tran_fini = tcptran_fini, }; +#endif #ifndef NNG_ELIDE_DEPRECATED int @@ -1265,5 +1269,7 @@ nni_sp_tcp_register(void) { nni_sp_tran_register(&tcp_tran); nni_sp_tran_register(&tcp4_tran); +#ifdef NNG_ENABLE_IPV6 nni_sp_tran_register(&tcp6_tran); +#endif } diff --git a/src/sp/transport/tls/tls.c b/src/sp/transport/tls/tls.c index c6ef90de..c5e4e90d 100644 --- a/src/sp/transport/tls/tls.c +++ b/src/sp/transport/tls/tls.c @@ -1,5 +1,5 @@ // -// Copyright 2023 Staysail Systems, Inc. +// Copyright 2024 Staysail Systems, Inc. // Copyright 2018 Capitar IT Group BV // Copyright 2019 Devolutions // @@ -28,8 +28,8 @@ typedef struct tlstran_pipe tlstran_pipe; // tlstran_pipe is one end of a TLS connection. struct tlstran_pipe { - nng_stream * tls; - nni_pipe * npipe; + nng_stream *tls; + nni_pipe *npipe; uint16_t peer; uint16_t proto; size_t rcvmax; @@ -37,7 +37,7 @@ struct tlstran_pipe { nni_list_node node; nni_list sendq; nni_list recvq; - tlstran_ep * ep; + tlstran_ep *ep; nni_sockaddr sa; nni_atomic_flag reaped; nni_reap_node reap; @@ -47,10 +47,10 @@ struct tlstran_pipe { size_t gotrxhead; size_t wanttxhead; size_t wantrxhead; - nni_aio * txaio; - nni_aio * rxaio; - nni_aio * negoaio; - nni_msg * rxmsg; + nni_aio *txaio; + nni_aio *rxaio; + nni_aio *negoaio; + nni_msg *rxmsg; nni_mtx mtx; }; @@ -64,18 +64,18 @@ struct tlstran_ep { bool fini; int refcnt; int authmode; - nni_url * url; + nni_url *url; nni_list pipes; nni_reap_node reap; - nng_stream_dialer * dialer; + nng_stream_dialer *dialer; nng_stream_listener *listener; - nni_aio * useraio; - nni_aio * connaio; - nni_aio * timeaio; + 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; + const char *host; nng_sockaddr src; nng_sockaddr sa; nni_stat_item st_rcv_max; @@ -143,7 +143,7 @@ static void tlstran_pipe_fini(void *arg) { tlstran_pipe *p = arg; - tlstran_ep * ep; + tlstran_ep *ep; tlstran_pipe_stop(p); if ((ep = p->ep) != NULL) { @@ -203,7 +203,7 @@ tlstran_pipe_reap(tlstran_pipe *p) static void tlstran_ep_match(tlstran_ep *ep) { - nni_aio * aio; + nni_aio *aio; tlstran_pipe *p; if (((aio = ep->useraio) == NULL) || @@ -222,9 +222,9 @@ static void tlstran_pipe_nego_cb(void *arg) { tlstran_pipe *p = arg; - tlstran_ep * ep = p->ep; - nni_aio * aio = p->negoaio; - nni_aio * uaio; + tlstran_ep *ep = p->ep; + nni_aio *aio = p->negoaio; + nni_aio *uaio; int rv; nni_mtx_lock(&ep->mtx); @@ -302,10 +302,10 @@ tlstran_pipe_send_cb(void *arg) { tlstran_pipe *p = arg; int rv; - nni_aio * aio; + nni_aio *aio; size_t n; - nni_msg * msg; - nni_aio * txaio = p->txaio; + nni_msg *msg; + nni_aio *txaio = p->txaio; nni_mtx_lock(&p->mtx); aio = nni_list_first(&p->sendq); @@ -346,11 +346,11 @@ static void tlstran_pipe_recv_cb(void *arg) { tlstran_pipe *p = arg; - nni_aio * aio; + nni_aio *aio; int rv; size_t n; - nni_msg * msg; - nni_aio * rxaio = p->rxaio; + nni_msg *msg; + nni_aio *rxaio = p->rxaio; nni_mtx_lock(&p->mtx); aio = nni_list_first(&p->recvq); @@ -644,7 +644,7 @@ tlstran_ep_fini(void *arg) static void tlstran_ep_close(void *arg) { - tlstran_ep * ep = arg; + tlstran_ep *ep = arg; tlstran_pipe *p; nni_mtx_lock(&ep->mtx); @@ -680,8 +680,8 @@ static int tlstran_url_parse_source(nni_url *url, nng_sockaddr *sa, const nni_url *surl) { int af; - char * semi; - char * src; + char *semi; + char *src; size_t len; int rv; nni_aio *aio; @@ -705,8 +705,10 @@ tlstran_url_parse_source(nni_url *url, nng_sockaddr *sa, const nni_url *surl) af = NNG_AF_UNSPEC; } else if (strcmp(surl->u_scheme, "tls+tcp4") == 0) { af = NNG_AF_INET; +#ifdef NNG_ENABLE_IPV6 } else if (strcmp(surl->u_scheme, "tls+tcp6") == 0) { af = NNG_AF_INET6; +#endif } else { return (NNG_EADDRINVAL); } @@ -742,11 +744,11 @@ tlstran_timer_cb(void *arg) static void tlstran_accept_cb(void *arg) { - tlstran_ep * ep = arg; - nni_aio * aio = ep->connaio; + tlstran_ep *ep = arg; + nni_aio *aio = ep->connaio; tlstran_pipe *p; int rv; - nng_stream * conn; + nng_stream *conn; nni_mtx_lock(&ep->mtx); @@ -801,11 +803,11 @@ error: static void tlstran_dial_cb(void *arg) { - tlstran_ep * ep = arg; - nni_aio * aio = ep->connaio; + tlstran_ep *ep = arg; + nni_aio *aio = ep->connaio; tlstran_pipe *p; int rv; - nng_stream * conn; + nng_stream *conn; if ((rv = nni_aio_result(aio)) != 0) { goto error; @@ -873,10 +875,10 @@ tlstran_ep_init(tlstran_ep **epp, nng_url *url, nni_sock *sock) static int tlstran_ep_init_dialer(void **dp, nni_url *url, nni_dialer *ndialer) { - tlstran_ep * ep; + tlstran_ep *ep; int rv; nng_sockaddr srcsa; - nni_sock * sock = nni_dialer_sock(ndialer); + nni_sock *sock = nni_dialer_sock(ndialer); nni_url myurl; // Check for invalid URL components. @@ -923,16 +925,18 @@ tlstran_ep_init_listener(void **lp, nni_url *url, nni_listener *nlistener) tlstran_ep *ep; int rv; uint16_t af; - char * host = url->u_hostname; - nni_aio * aio; - nni_sock * sock = nni_listener_sock(nlistener); + char *host = url->u_hostname; + nni_aio *aio; + nni_sock *sock = nni_listener_sock(nlistener); if (strcmp(url->u_scheme, "tls+tcp") == 0) { af = NNG_AF_UNSPEC; } else if (strcmp(url->u_scheme, "tls+tcp4") == 0) { af = NNG_AF_INET; +#ifdef NNG_ENABLE_IPV6 } else if (strcmp(url->u_scheme, "tls+tcp6") == 0) { af = NNG_AF_INET6; +#endif } else { return (NNG_EADDRINVAL); } @@ -1111,7 +1115,7 @@ static int tlstran_ep_get_url(void *arg, void *v, size_t *szp, nni_type t) { tlstran_ep *ep = arg; - char * s; + char *s; int rv; int port = 0; @@ -1268,6 +1272,7 @@ static nni_sp_tran tls4_tran = { .tran_fini = tlstran_fini, }; +#ifdef NNG_ENABLE_IPV6 static nni_sp_tran tls6_tran = { .tran_scheme = "tls+tcp6", .tran_dialer = &tlstran_dialer_ops, @@ -1276,6 +1281,7 @@ static nni_sp_tran tls6_tran = { .tran_init = tlstran_init, .tran_fini = tlstran_fini, }; +#endif int nng_tls_register(void) @@ -1288,5 +1294,7 @@ nni_sp_tls_register(void) { nni_sp_tran_register(&tls_tran); nni_sp_tran_register(&tls4_tran); +#ifdef NNG_ENABLE_IPV6 nni_sp_tran_register(&tls6_tran); +#endif } diff --git a/src/sp/transport/ws/websocket.c b/src/sp/transport/ws/websocket.c index a46ea58b..69509e84 100644 --- a/src/sp/transport/ws/websocket.c +++ b/src/sp/transport/ws/websocket.c @@ -1,5 +1,5 @@ // -// Copyright 2023 Staysail Systems, Inc. +// Copyright 2024 Staysail Systems, Inc. // Copyright 2018 Capitar IT Group BV // Copyright 2019 Devolutions // @@ -27,7 +27,7 @@ struct ws_dialer { uint16_t peer; // remote protocol nni_list aios; nni_mtx mtx; - nni_aio * connaio; + nni_aio *connaio; nng_stream_dialer *dialer; bool started; }; @@ -36,7 +36,7 @@ struct ws_listener { uint16_t peer; // remote protocol nni_list aios; nni_mtx mtx; - nni_aio * accaio; + nni_aio *accaio; nng_stream_listener *listener; bool started; }; @@ -45,10 +45,10 @@ struct ws_pipe { nni_mtx mtx; bool closed; uint16_t peer; - nni_aio * user_txaio; - nni_aio * user_rxaio; - nni_aio * txaio; - nni_aio * rxaio; + nni_aio *user_txaio; + nni_aio *user_rxaio; + nni_aio *txaio; + nni_aio *rxaio; nng_stream *ws; }; @@ -396,10 +396,10 @@ wstran_listener_fini(void *arg) static void wstran_connect_cb(void *arg) { - ws_dialer * d = arg; - ws_pipe * p; - nni_aio * caio = d->connaio; - nni_aio * uaio; + ws_dialer *d = arg; + ws_pipe *p; + nni_aio *caio = d->connaio; + nni_aio *uaio; int rv; nng_stream *ws = NULL; @@ -451,8 +451,8 @@ static void wstran_accept_cb(void *arg) { ws_listener *l = arg; - nni_aio * aaio = l->accaio; - nni_aio * uaio; + nni_aio *aaio = l->accaio; + nni_aio *uaio; int rv; nni_mtx_lock(&l->mtx); @@ -489,7 +489,7 @@ static int wstran_dialer_init(void **dp, nng_url *url, nni_dialer *ndialer) { ws_dialer *d; - nni_sock * s = nni_dialer_sock(ndialer); + nni_sock *s = nni_dialer_sock(ndialer); int rv; char name[64]; @@ -524,7 +524,7 @@ wstran_listener_init(void **lp, nng_url *url, nni_listener *listener) { ws_listener *l; int rv; - nni_sock * s = nni_listener_sock(listener); + nni_sock *s = nni_listener_sock(listener); char name[64]; if ((l = NNI_ALLOC_STRUCT(l)) == NULL) { @@ -713,6 +713,7 @@ static nni_sp_tran wss4_tran = { .tran_fini = wstran_fini, }; +#ifdef NNG_ENABLE_IPV6 static nni_sp_tran wss6_tran = { .tran_scheme = "wss6", .tran_dialer = &ws_dialer_ops, @@ -721,13 +722,16 @@ static nni_sp_tran wss6_tran = { .tran_init = wstran_init, .tran_fini = wstran_fini, }; +#endif void nni_sp_wss_register(void) { nni_sp_tran_register(&wss_tran); nni_sp_tran_register(&wss4_tran); +#ifdef NNG_ENABLE_IPV6 nni_sp_tran_register(&wss6_tran); +#endif } #endif // NNG_TRANSPORT_WSS -- cgit v1.2.3-70-g09d2