aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2025-10-25 11:43:59 -0700
committerGarrett D'Amore <garrett@damore.org>2025-10-25 20:11:51 -0700
commitcc419cf01d9c060a3bd3fc318f9b9bc9e736dae9 (patch)
tree2f26cd782a54bed35e03b451003deee5df701983 /src/core
parentebc479a61b8f2d2f3a6d846d18debfb9022e6010 (diff)
downloadnng-cc419cf01d9c060a3bd3fc318f9b9bc9e736dae9.tar.gz
nng-cc419cf01d9c060a3bd3fc318f9b9bc9e736dae9.tar.bz2
nng-cc419cf01d9c060a3bd3fc318f9b9bc9e736dae9.zip
Add stream direct address functions for socket addresses.
This is going to be used to facilitate debugging, and eliminate some inconveniences around these things. We plan to move the pipe functions to use these directly, hopefully moving away from the pipe_getopt hack. (The transport API will need to grow these. For now this is just the streams.)
Diffstat (limited to 'src/core')
-rw-r--r--src/core/pipe.c13
-rw-r--r--src/core/pipe.h3
-rw-r--r--src/core/socket.c21
-rw-r--r--src/core/stream.c42
-rw-r--r--src/core/stream.h2
5 files changed, 71 insertions, 10 deletions
diff --git a/src/core/pipe.c b/src/core/pipe.c
index db2c4d41..baa2d6f9 100644
--- a/src/core/pipe.c
+++ b/src/core/pipe.c
@@ -421,7 +421,7 @@ nni_pipe_bump_error(nni_pipe *p, int err)
}
char *
-nni_pipe_peer_addr(nni_pipe *p, char buf[NNG_MAXADDRSTRLEN])
+nni_pipe_peer_str_addr(nni_pipe *p, char buf[NNG_MAXADDRSTRLEN])
{
nng_sockaddr sa;
size_t sz = sizeof(sa);
@@ -431,6 +431,17 @@ nni_pipe_peer_addr(nni_pipe *p, char buf[NNG_MAXADDRSTRLEN])
return (buf);
}
+char *
+nni_pipe_self_str_addr(nni_pipe *p, char buf[NNG_MAXADDRSTRLEN])
+{
+ nng_sockaddr sa;
+ size_t sz = sizeof(sa);
+ sa.s_family = AF_UNSPEC;
+ nni_pipe_getopt(p, NNG_OPT_LOCADDR, &sa, &sz, NNI_TYPE_SOCKADDR);
+ nng_str_sockaddr(&sa, buf, NNG_MAXADDRSTRLEN);
+ return (buf);
+}
+
nng_err
nni_pipe_peer_cert(nni_pipe *p, nng_tls_cert **certp)
{
diff --git a/src/core/pipe.h b/src/core/pipe.h
index 4ed61660..6ef3c206 100644
--- a/src/core/pipe.h
+++ b/src/core/pipe.h
@@ -69,7 +69,8 @@ extern void nni_pipe_bump_rx(nni_pipe *, size_t);
extern void nni_pipe_bump_tx(nni_pipe *, size_t);
extern void nni_pipe_bump_error(nni_pipe *, int);
-extern char *nni_pipe_peer_addr(nni_pipe *p, char buf[NNG_MAXADDRSTRLEN]);
+extern char *nni_pipe_peer_str_addr(nni_pipe *p, char buf[NNG_MAXADDRSTRLEN]);
+extern char *nni_pipe_self_str_addr(nni_pipe *p, char buf[NNG_MAXADDRSTRLEN]);
extern int nni_pipe_alloc_dialer(void **, nni_dialer *);
extern int nni_pipe_alloc_listener(void **, nni_listener *);
diff --git a/src/core/socket.c b/src/core/socket.c
index 7112014e..a7633c9e 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -1301,7 +1301,8 @@ dialer_start_pipe(nni_dialer *d, nni_pipe *p)
char addr[NNG_MAXADDRSTRLEN];
nng_log_debug("NNG-PIPEREJECT",
"Pipe on socket<%u> from %s rejected by callback",
- nni_pipe_sock_id(p), nni_pipe_peer_addr(p, addr));
+ nni_pipe_sock_id(p),
+ nni_pipe_peer_str_addr(p, addr));
}
nni_pipe_rele(p);
return;
@@ -1323,10 +1324,13 @@ dialer_start_pipe(nni_dialer *d, nni_pipe *p)
#endif
nni_pipe_run_cb(p, NNG_PIPE_EV_ADD_POST);
if (nng_log_get_level() >= NNG_LOG_DEBUG) {
- char addr[NNG_MAXADDRSTRLEN];
+ char peer_addr[NNG_MAXADDRSTRLEN];
+ char self_addr[NNG_MAXADDRSTRLEN];
nng_log_debug("NNG-CONNECT",
- "Connected pipe<%u> on socket<%u> to %s", nni_pipe_id(p),
- nni_sock_id(s), nni_pipe_peer_addr(p, addr));
+ "Connected pipe<%u> on socket<%u> at %s to %s",
+ nni_pipe_id(p), nni_sock_id(s),
+ nni_pipe_self_str_addr(p, self_addr),
+ nni_pipe_peer_str_addr(p, peer_addr));
}
nni_pipe_rele(p);
}
@@ -1429,10 +1433,13 @@ listener_start_pipe(nni_listener *l, nni_pipe *p)
#endif
nni_pipe_run_cb(p, NNG_PIPE_EV_ADD_POST);
if (nng_log_get_level() >= NNG_LOG_DEBUG) {
- char addr[NNG_MAXADDRSTRLEN];
+ char peer_addr[NNG_MAXADDRSTRLEN];
+ char self_addr[NNG_MAXADDRSTRLEN];
nng_log_debug("NNG-ACCEPT",
- "Accepted pipe<%u> on socket<%u> from %s", nni_pipe_id(p),
- nni_sock_id(s), nni_pipe_peer_addr(p, addr));
+ "Accepted pipe<%u> on socket<%u> at %s from %s",
+ nni_pipe_id(p), nni_sock_id(s),
+ nni_pipe_self_str_addr(p, self_addr),
+ nni_pipe_peer_str_addr(p, peer_addr));
}
// the socket now "owns" the pipe, and a pipe close should immediately
diff --git a/src/core/stream.c b/src/core/stream.c
index 5a5159df..6c7ad5f0 100644
--- a/src/core/stream.c
+++ b/src/core/stream.c
@@ -133,6 +133,15 @@ void
nng_stream_free(nng_stream *s)
{
if (s != NULL) {
+ // These are mandatory - we have checks here for completeness.
+ NNI_ASSERT(s->s_close != NULL);
+ NNI_ASSERT(s->s_stop != NULL);
+ NNI_ASSERT(s->s_send != NULL);
+ NNI_ASSERT(s->s_recv != NULL);
+ NNI_ASSERT(s->s_free != NULL);
+ NNI_ASSERT(s->s_peer_addr != NULL);
+ NNI_ASSERT(s->s_self_addr != NULL);
+
s->s_free(s);
}
}
@@ -155,6 +164,15 @@ nng_err
nni_stream_get(
nng_stream *s, const char *nm, void *data, size_t *szp, nni_type t)
{
+ // TODO: eventually this needs die
+ if ((strcmp(nm, NNG_OPT_REMADDR) == 0) ||
+ (strcmp(nm, NNG_OPT_LOCADDR) == 0)) {
+ if (t != NNI_TYPE_SOCKADDR) {
+ return (NNG_EBADTYPE);
+ }
+ return (nng_stream_get_addr(s, nm, (nng_sockaddr *) data));
+ }
+
return (s->s_get(s, nm, data, szp, t));
}
@@ -382,7 +400,29 @@ nng_stream_get_ms(nng_stream *s, const char *n, nng_duration *v)
nng_err
nng_stream_get_addr(nng_stream *s, const char *n, nng_sockaddr *v)
{
- return (nni_stream_get(s, n, v, NULL, NNI_TYPE_SOCKADDR));
+ const nng_sockaddr *sap;
+ int rv = NNG_ENOTSUP;
+ if (strcmp(n, NNG_OPT_LOCADDR) == 0) {
+ rv = nng_stream_self_addr(s, &sap);
+ } else if (strcmp(n, NNG_OPT_REMADDR) == 0) {
+ rv = nng_stream_peer_addr(s, &sap);
+ }
+ if (rv == NNG_OK) {
+ *v = *sap;
+ }
+ return (rv);
+}
+
+nng_err
+nng_stream_self_addr(nng_stream *s, const nng_sockaddr **sa)
+{
+ return (s->s_self_addr(s, &*sa));
+}
+
+nng_err
+nng_stream_peer_addr(nng_stream *s, const nng_sockaddr **sa)
+{
+ return (s->s_peer_addr(s, &*sa));
}
nng_err
diff --git a/src/core/stream.h b/src/core/stream.h
index a9a17ec1..3c87e9c5 100644
--- a/src/core/stream.h
+++ b/src/core/stream.h
@@ -50,6 +50,8 @@ struct nng_stream {
void (*s_send)(void *, nng_aio *);
nng_err (*s_get)(void *, const char *, void *, size_t *, nni_type);
nng_err (*s_set)(void *, const char *, const void *, size_t, nni_type);
+ nng_err (*s_peer_addr)(void *, const nng_sockaddr **);
+ nng_err (*s_self_addr)(void *, const nng_sockaddr **);
nng_err (*s_peer_cert)(void *, nng_tls_cert **);
};