diff options
| author | Garrett D'Amore <garrett@damore.org> | 2024-11-21 22:48:32 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2024-11-21 22:48:32 -0800 |
| commit | 925ac884f8bce34ad27fe18e851ebcecfe311356 (patch) | |
| tree | f5ef6ed18876688a695af49a89df12114505f65f | |
| parent | 7ea8abadec355eb7ea9f71fc2e2bdd73c1c77c62 (diff) | |
| download | nng-925ac884f8bce34ad27fe18e851ebcecfe311356.tar.gz nng-925ac884f8bce34ad27fe18e851ebcecfe311356.tar.bz2 nng-925ac884f8bce34ad27fe18e851ebcecfe311356.zip | |
Collect the bound port as part of the URL at bind time.
This is a step on cleaning up our logic around NNG_OPT_URL.
| -rw-r--r-- | include/nng/nng.h | 5 | ||||
| -rw-r--r-- | src/core/listener.c | 2 | ||||
| -rw-r--r-- | src/core/sockaddr.c | 18 | ||||
| -rw-r--r-- | src/sp/transport.h | 6 | ||||
| -rw-r--r-- | src/sp/transport/inproc/inproc.c | 3 | ||||
| -rw-r--r-- | src/sp/transport/ipc/ipc.c | 4 | ||||
| -rw-r--r-- | src/sp/transport/socket/sockfd.c | 4 | ||||
| -rw-r--r-- | src/sp/transport/tcp/tcp.c | 8 | ||||
| -rw-r--r-- | src/sp/transport/tls/tls.c | 9 | ||||
| -rw-r--r-- | src/sp/transport/udp/udp.c | 5 | ||||
| -rw-r--r-- | src/sp/transport/ws/websocket.c | 6 | ||||
| -rw-r--r-- | src/sp/transport/zerotier/zerotier.c | 3 |
12 files changed, 62 insertions, 11 deletions
diff --git a/include/nng/nng.h b/include/nng/nng.h index f6b0a179..49b5da05 100644 --- a/include/nng/nng.h +++ b/include/nng/nng.h @@ -270,6 +270,11 @@ NNG_DECL int nng_socket_raw(nng_socket id, bool *rawp); NNG_DECL const char *nng_str_sockaddr( const nng_sockaddr *sa, char *buf, size_t bufsz); +// Obtain a port number (for NNG_AF_INET and NNG_AF_INET6this will be 16 bits +// maximum, but other address familiies may have larger port numbers.) For +// address that don't have the concept of port numbers, zero will be returned. +uint32_t nng_sockaddr_port(const nng_sockaddr *sa); + // Arguably the pipe callback functions could be handled as an option, // but with the need to specify an argument, we find it best to unify // this as a separate function to pass in the argument and the callback. diff --git a/src/core/listener.c b/src/core/listener.c index c6c37abe..3ef142c2 100644 --- a/src/core/listener.c +++ b/src/core/listener.c @@ -393,7 +393,7 @@ nni_listener_start(nni_listener *l, int flags) return (NNG_ESTATE); } - if ((rv = l->l_ops.l_bind(l->l_data)) != 0) { + if ((rv = l->l_ops.l_bind(l->l_data, &l->l_url)) != 0) { nng_log_warn("NNG-BIND-FAIL", "Failed binding socket<%u>: %s", nni_sock_id(l->l_sock), nng_strerror(rv)); nni_listener_bump_error(l, rv); diff --git a/src/core/sockaddr.c b/src/core/sockaddr.c index 50fd4214..d55db156 100644 --- a/src/core/sockaddr.c +++ b/src/core/sockaddr.c @@ -163,3 +163,21 @@ nng_str_sockaddr(const nng_sockaddr *sa, char *buf, size_t bufsz) return ("unknown"); } } + +uint32_t +nng_sockaddr_port(const nng_sockaddr *sa) +{ + uint16_t port16; + switch (sa->s_family) { + case NNG_AF_INET: + NNI_GET16(&sa->s_in.sa_port, port16); + return (port16); + case NNG_AF_INET6: + NNI_GET16(&sa->s_in6.sa_port, port16); + return (port16); + case NNG_AF_ZT: + return (sa->s_zt.sa_port); + default: + return (0); + } +} diff --git a/src/sp/transport.h b/src/sp/transport.h index 34584328..7311638f 100644 --- a/src/sp/transport.h +++ b/src/sp/transport.h @@ -76,8 +76,10 @@ struct nni_sp_listener_ops { // reserving the address but not creating any connections. // It should return NNG_EADDRINUSE if the address is already // taken. It can also return NNG_EBADADDR for an unsuitable - // address, or NNG_EACCESS for permission problems. - int (*l_bind)(void *); + // address, or NNG_EACCESS for permission problems. The transport + // should update the url if it has changed (e.g. due to converting + // from port 0 to a real port.) + int (*l_bind)(void *, nng_url *); // l_accept accepts an inbound connection. void (*l_accept)(void *, nni_aio *); diff --git a/src/sp/transport/inproc/inproc.c b/src/sp/transport/inproc/inproc.c index b759ccc0..5216b5e6 100644 --- a/src/sp/transport/inproc/inproc.c +++ b/src/sp/transport/inproc/inproc.c @@ -510,11 +510,12 @@ inproc_ep_connect(void *arg, nni_aio *aio) } static int -inproc_ep_bind(void *arg) +inproc_ep_bind(void *arg, nng_url *url) { inproc_ep *ep = arg; inproc_ep *srch; nni_list *list = &nni_inproc.servers; + NNI_ARG_UNUSED(url); nni_mtx_lock(&nni_inproc.mx); NNI_LIST_FOREACH (list, srch) { diff --git a/src/sp/transport/ipc/ipc.c b/src/sp/transport/ipc/ipc.c index aefd82ce..69efa741 100644 --- a/src/sp/transport/ipc/ipc.c +++ b/src/sp/transport/ipc/ipc.c @@ -11,6 +11,7 @@ #include <stdio.h> +#include "core/defs.h" #include "core/nng_impl.h" // IPC transport. Platform specific IPC operations must be @@ -971,10 +972,11 @@ ipc_ep_set_recv_max_sz(void *arg, const void *v, size_t sz, nni_type t) } static int -ipc_ep_bind(void *arg) +ipc_ep_bind(void *arg, nng_url *url) { ipc_ep *ep = arg; int rv; + NNI_ARG_UNUSED(url); nni_mtx_lock(&ep->mtx); rv = nng_stream_listener_listen(ep->listener); diff --git a/src/sp/transport/socket/sockfd.c b/src/sp/transport/socket/sockfd.c index 2313d12d..03706be8 100644 --- a/src/sp/transport/socket/sockfd.c +++ b/src/sp/transport/socket/sockfd.c @@ -12,6 +12,7 @@ #include <stdlib.h> #include <string.h> +#include "core/defs.h" #include "core/nng_impl.h" // Socket transport. This takes sockets that may have been @@ -884,9 +885,10 @@ sfd_tran_ep_set_recvmaxsz(void *arg, const void *v, size_t sz, nni_opt_type t) } static int -sfd_tran_ep_bind(void *arg) +sfd_tran_ep_bind(void *arg, nng_url *url) { sfd_tran_ep *ep = arg; + NNI_ARG_UNUSED(url); return (nng_stream_listener_listen(ep->listener)); } diff --git a/src/sp/transport/tcp/tcp.c b/src/sp/transport/tcp/tcp.c index 86d0ac07..f619d4d9 100644 --- a/src/sp/transport/tcp/tcp.c +++ b/src/sp/transport/tcp/tcp.c @@ -1023,13 +1023,19 @@ tcptran_ep_set_recvmaxsz(void *arg, const void *v, size_t sz, nni_opt_type t) } static int -tcptran_ep_bind(void *arg) +tcptran_ep_bind(void *arg, nng_url *url) { tcptran_ep *ep = arg; int rv; nni_mtx_lock(&ep->mtx); rv = nng_stream_listener_listen(ep->listener); + if (rv == 0) { + int port; + nng_stream_listener_get_int( + ep->listener, NNG_OPT_TCP_BOUND_PORT, &port); + url->u_port = (uint32_t) port; + } nni_mtx_unlock(&ep->mtx); return (rv); diff --git a/src/sp/transport/tls/tls.c b/src/sp/transport/tls/tls.c index 394eb561..929e3f8e 100644 --- a/src/sp/transport/tls/tls.c +++ b/src/sp/transport/tls/tls.c @@ -14,6 +14,7 @@ #include "core/nng_impl.h" +#include "nng/nng.h" #include "nng/supplemental/tls/tls.h" // TLS over TCP transport. Platform specific TCP operations must be @@ -970,13 +971,19 @@ tlstran_ep_connect(void *arg, nni_aio *aio) } static int -tlstran_ep_bind(void *arg) +tlstran_ep_bind(void *arg, nng_url *url) { tlstran_ep *ep = arg; int rv; nni_mtx_lock(&ep->mtx); rv = nng_stream_listener_listen(ep->listener); + if (rv == 0) { + int port; + nng_stream_listener_get_int( + ep->listener, NNG_OPT_TCP_BOUND_PORT, &port); + url->u_port = (uint32_t) port; + } nni_mtx_unlock(&ep->mtx); return (rv); diff --git a/src/sp/transport/udp/udp.c b/src/sp/transport/udp/udp.c index 29a516d8..ad168642 100644 --- a/src/sp/transport/udp/udp.c +++ b/src/sp/transport/udp/udp.c @@ -1801,7 +1801,7 @@ udp_ep_start(udp_ep *ep) } static int -udp_ep_bind(void *arg) +udp_ep_bind(void *arg, nng_url *url) { udp_ep *ep = arg; int rv; @@ -1817,6 +1817,9 @@ udp_ep_bind(void *arg) nni_mtx_unlock(&ep->mtx); return (rv); } + nng_sockaddr sa; + nni_plat_udp_sockname(ep->udp, &sa); + url->u_port = nng_sockaddr_port(&sa); udp_ep_start(ep); nni_mtx_unlock(&ep->mtx); diff --git a/src/sp/transport/ws/websocket.c b/src/sp/transport/ws/websocket.c index 3bfd9f31..dec646ce 100644 --- a/src/sp/transport/ws/websocket.c +++ b/src/sp/transport/ws/websocket.c @@ -252,13 +252,17 @@ wstran_pipe_peer(void *arg) } static int -ws_listener_bind(void *arg) +ws_listener_bind(void *arg, nng_url *url) { ws_listener *l = arg; int rv; if ((rv = nng_stream_listener_listen(l->listener)) == 0) { + int port; l->started = true; + nng_stream_listener_get_int( + l->listener, NNG_OPT_TCP_BOUND_PORT, &port); + url->u_port = (uint32_t) port; } return (rv); } diff --git a/src/sp/transport/zerotier/zerotier.c b/src/sp/transport/zerotier/zerotier.c index 7b2142b1..6e475c1a 100644 --- a/src/sp/transport/zerotier/zerotier.c +++ b/src/sp/transport/zerotier/zerotier.c @@ -2336,10 +2336,11 @@ zt_ep_bind_locked(zt_ep *ep) } static int -zt_ep_bind(void *arg) +zt_ep_bind(void *arg, nng_url *url) { int rv; zt_ep *ep = arg; + NNI_ARG_UNUSED(url); nni_mtx_lock(&zt_lk); rv = zt_ep_bind_locked(ep); |
