diff options
| author | Garrett D'Amore <garrett@damore.org> | 2025-10-25 11:43:59 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2025-10-25 20:11:51 -0700 |
| commit | cc419cf01d9c060a3bd3fc318f9b9bc9e736dae9 (patch) | |
| tree | 2f26cd782a54bed35e03b451003deee5df701983 /src/core | |
| parent | ebc479a61b8f2d2f3a6d846d18debfb9022e6010 (diff) | |
| download | nng-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.c | 13 | ||||
| -rw-r--r-- | src/core/pipe.h | 3 | ||||
| -rw-r--r-- | src/core/socket.c | 21 | ||||
| -rw-r--r-- | src/core/stream.c | 42 | ||||
| -rw-r--r-- | src/core/stream.h | 2 |
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 **); }; |
