aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2024-11-21 22:48:32 -0800
committerGarrett D'Amore <garrett@damore.org>2024-11-21 22:48:32 -0800
commit925ac884f8bce34ad27fe18e851ebcecfe311356 (patch)
treef5ef6ed18876688a695af49a89df12114505f65f /src
parent7ea8abadec355eb7ea9f71fc2e2bdd73c1c77c62 (diff)
downloadnng-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.
Diffstat (limited to 'src')
-rw-r--r--src/core/listener.c2
-rw-r--r--src/core/sockaddr.c18
-rw-r--r--src/sp/transport.h6
-rw-r--r--src/sp/transport/inproc/inproc.c3
-rw-r--r--src/sp/transport/ipc/ipc.c4
-rw-r--r--src/sp/transport/socket/sockfd.c4
-rw-r--r--src/sp/transport/tcp/tcp.c8
-rw-r--r--src/sp/transport/tls/tls.c9
-rw-r--r--src/sp/transport/udp/udp.c5
-rw-r--r--src/sp/transport/ws/websocket.c6
-rw-r--r--src/sp/transport/zerotier/zerotier.c3
11 files changed, 57 insertions, 11 deletions
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);