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/platform/posix | |
| 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/platform/posix')
| -rw-r--r-- | src/platform/posix/posix_ipc.h | 2 | ||||
| -rw-r--r-- | src/platform/posix/posix_ipcconn.c | 47 | ||||
| -rw-r--r-- | src/platform/posix/posix_sockfd.c | 42 | ||||
| -rw-r--r-- | src/platform/posix/posix_tcp.h | 4 | ||||
| -rw-r--r-- | src/platform/posix/posix_tcpconn.c | 80 |
5 files changed, 74 insertions, 101 deletions
diff --git a/src/platform/posix/posix_ipc.h b/src/platform/posix/posix_ipc.h index f1aa412d..7a48beaf 100644 --- a/src/platform/posix/posix_ipc.h +++ b/src/platform/posix/posix_ipc.h @@ -45,7 +45,7 @@ struct nni_ipc_dialer { #endif }; -extern int nni_posix_ipc_alloc( +extern nng_err nni_posix_ipc_alloc( nni_ipc_conn **, nni_sockaddr *, nni_ipc_dialer *, int); extern void nni_posix_ipc_dialer_rele(nni_ipc_dialer *); extern void nni_posix_ipc_dialer_cb(void *arg, unsigned events); diff --git a/src/platform/posix/posix_ipcconn.c b/src/platform/posix/posix_ipcconn.c index fd3cdbd8..11bd03d8 100644 --- a/src/platform/posix/posix_ipcconn.c +++ b/src/platform/posix/posix_ipcconn.c @@ -300,6 +300,14 @@ ipc_recv(void *arg, nni_aio *aio) } static nng_err +ipc_sock_addr(void *arg, const nng_sockaddr **sap) +{ + ipc_conn *c = arg; + *sap = &c->sa; + return (NNG_OK); +} + +static nng_err ipc_get_peer_uid(void *arg, void *buf, size_t *szp, nni_type t) { ipc_conn *c = arg; @@ -367,13 +375,6 @@ ipc_get_peer_pid(void *arg, void *buf, size_t *szp, nni_type t) return (nni_copyout_int(id, buf, szp, t)); } -static nng_err -ipc_get_addr(void *arg, void *buf, size_t *szp, nni_type t) -{ - ipc_conn *c = arg; - return (nni_copyout_sockaddr(&c->sa, buf, szp, t)); -} - static void ipc_stop(void *arg) { @@ -413,14 +414,6 @@ ipc_free(void *arg) static const nni_option ipc_options[] = { { - .o_name = NNG_OPT_LOCADDR, - .o_get = ipc_get_addr, - }, - { - .o_name = NNG_OPT_REMADDR, - .o_get = ipc_get_addr, - }, - { .o_name = NNG_OPT_IPC_PEER_PID, .o_get = ipc_get_peer_pid, }, @@ -455,7 +448,7 @@ ipc_set(void *arg, const char *name, const void *val, size_t sz, nni_type t) return (nni_setopt(ipc_options, name, c, val, sz, t)); } -int +nng_err nni_posix_ipc_alloc( nni_ipc_conn **cp, nni_sockaddr *sa, nni_ipc_dialer *d, int fd) { @@ -465,16 +458,18 @@ nni_posix_ipc_alloc( return (NNG_ENOMEM); } - c->closed = false; - c->dialer = d; - c->stream.s_free = ipc_free; - c->stream.s_close = ipc_close; - c->stream.s_stop = ipc_stop; - c->stream.s_send = ipc_send; - c->stream.s_recv = ipc_recv; - c->stream.s_get = ipc_get; - c->stream.s_set = ipc_set; - c->sa = *sa; + c->closed = false; + c->dialer = d; + c->stream.s_free = ipc_free; + c->stream.s_close = ipc_close; + c->stream.s_stop = ipc_stop; + c->stream.s_send = ipc_send; + c->stream.s_recv = ipc_recv; + c->stream.s_get = ipc_get; + c->stream.s_set = ipc_set; + c->stream.s_self_addr = ipc_sock_addr, + c->stream.s_peer_addr = ipc_sock_addr; + c->sa = *sa; nni_mtx_init(&c->mtx); nni_aio_list_init(&c->readq); diff --git a/src/platform/posix/posix_sockfd.c b/src/platform/posix/posix_sockfd.c index 6762987b..43225e7e 100644 --- a/src/platform/posix/posix_sockfd.c +++ b/src/platform/posix/posix_sockfd.c @@ -328,15 +328,6 @@ sfd_recv(void *arg, nni_aio *aio) } static nng_err -sfd_get_addr(void *arg, void *buf, size_t *szp, nni_type t) -{ - NNI_ARG_UNUSED(arg); - nng_sockaddr sa; - sa.s_family = NNG_AF_UNSPEC; - return (nni_copyout_sockaddr(&sa, buf, szp, t)); -} - -static nng_err sfd_get_peer_uid(void *arg, void *buf, size_t *szp, nni_type t) { nni_sfd_conn *c = arg; @@ -406,14 +397,6 @@ sfd_get_peer_pid(void *arg, void *buf, size_t *szp, nni_type t) static const nni_option sfd_options[] = { { - .o_name = NNG_OPT_LOCADDR, - .o_get = sfd_get_addr, - }, - { - .o_name = NNG_OPT_REMADDR, - .o_get = sfd_get_addr, - }, - { .o_name = NNG_OPT_PEER_PID, .o_get = sfd_get_peer_pid, }, @@ -448,6 +431,15 @@ sfd_set(void *arg, const char *name, const void *buf, size_t sz, nni_type t) return (nni_setopt(sfd_options, name, c, buf, sz, t)); } +static nng_err +sfd_addr(void *arg, const nng_sockaddr **sap) +{ + static nng_sockaddr sa = { .s_family = NNG_AF_UNSPEC }; + NNI_ARG_UNUSED(arg); + *sap = &sa; + return (NNG_OK); +} + nng_err nni_sfd_conn_alloc(nni_sfd_conn **cp, int fd) { @@ -464,13 +456,15 @@ nni_sfd_conn_alloc(nni_sfd_conn **cp, int fd) nni_aio_list_init(&c->readq); nni_aio_list_init(&c->writeq); - c->stream.s_free = sfd_free; - c->stream.s_close = sfd_close; - c->stream.s_stop = sfd_stop; - c->stream.s_recv = sfd_recv; - c->stream.s_send = sfd_send; - c->stream.s_get = sfd_get; - c->stream.s_set = sfd_set; + c->stream.s_free = sfd_free; + c->stream.s_close = sfd_close; + c->stream.s_stop = sfd_stop; + c->stream.s_recv = sfd_recv; + c->stream.s_send = sfd_send; + c->stream.s_get = sfd_get; + c->stream.s_set = sfd_set; + c->stream.s_peer_addr = sfd_addr; + c->stream.s_self_addr = sfd_addr; *cp = c; return (NNG_OK); diff --git a/src/platform/posix/posix_tcp.h b/src/platform/posix/posix_tcp.h index 3b61d7da..20325841 100644 --- a/src/platform/posix/posix_tcp.h +++ b/src/platform/posix/posix_tcp.h @@ -1,5 +1,5 @@ // -// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2025 Staysail Systems, Inc. <info@staysail.tech> // Copyright 2018 Capitar IT Group BV <info@capitar.com> // Copyright 2018 Devolutions <info@devolutions.net> // @@ -26,6 +26,8 @@ struct nni_tcp_conn { nni_aio *dial_aio; nni_tcp_dialer *dialer; nni_reap_node reap; + nng_sockaddr peer; + nng_sockaddr self; }; extern int nni_posix_tcp_alloc(nni_tcp_conn **, nni_tcp_dialer *, int); diff --git a/src/platform/posix/posix_tcpconn.c b/src/platform/posix/posix_tcpconn.c index 674e3f46..43dfb4e4 100644 --- a/src/platform/posix/posix_tcpconn.c +++ b/src/platform/posix/posix_tcpconn.c @@ -333,41 +333,19 @@ tcp_recv(void *arg, nni_aio *aio) } static nng_err -tcp_get_peername(void *arg, void *buf, size_t *szp, nni_type t) +tcp_get_peer_addr(void *arg, const nng_sockaddr **addr) { - nni_tcp_conn *c = arg; - struct sockaddr_storage ss; - socklen_t len = sizeof(ss); - int fd = nni_posix_pfd_fd(&c->pfd); - nng_err rv; - nng_sockaddr sa; - - if (getpeername(fd, (void *) &ss, &len) != 0) { - return (nni_plat_errno(errno)); - } - if ((rv = nni_posix_sockaddr2nn(&sa, &ss, len)) == NNG_OK) { - rv = nni_copyout_sockaddr(&sa, buf, szp, t); - } - return (rv); + nni_tcp_conn *c = arg; + *addr = &c->peer; + return (NNG_OK); } static nng_err -tcp_get_sockname(void *arg, void *buf, size_t *szp, nni_type t) +tcp_get_self_addr(void *arg, const nng_sockaddr **addr) { - nni_tcp_conn *c = arg; - struct sockaddr_storage ss; - socklen_t len = sizeof(ss); - int fd = nni_posix_pfd_fd(&c->pfd); - int rv; - nng_sockaddr sa; - - if (getsockname(fd, (void *) &ss, &len) != 0) { - return (nni_plat_errno(errno)); - } - if ((rv = nni_posix_sockaddr2nn(&sa, &ss, len)) == NNG_OK) { - rv = nni_copyout_sockaddr(&sa, buf, szp, t); - } - return (rv); + nni_tcp_conn *c = arg; + *addr = &c->self; + return (NNG_OK); } static nng_err @@ -402,14 +380,6 @@ tcp_get_keepalive(void *arg, void *buf, size_t *szp, nni_type t) static const nni_option tcp_options[] = { { - .o_name = NNG_OPT_REMADDR, - .o_get = tcp_get_peername, - }, - { - .o_name = NNG_OPT_LOCADDR, - .o_get = tcp_get_sockname, - }, - { .o_name = NNG_OPT_TCP_NODELAY, .o_get = tcp_get_nodelay, }, @@ -452,13 +422,15 @@ nni_posix_tcp_alloc(nni_tcp_conn **cp, nni_tcp_dialer *d, int fd) nni_aio_list_init(&c->writeq); nni_posix_pfd_init(&c->pfd, fd, tcp_cb, c); - c->stream.s_free = tcp_free; - c->stream.s_stop = tcp_stop; - c->stream.s_close = tcp_close; - c->stream.s_recv = tcp_recv; - c->stream.s_send = tcp_send; - c->stream.s_get = tcp_get; - c->stream.s_set = tcp_set; + c->stream.s_free = tcp_free; + c->stream.s_stop = tcp_stop; + c->stream.s_close = tcp_close; + c->stream.s_recv = tcp_recv; + c->stream.s_send = tcp_send; + c->stream.s_get = tcp_get; + c->stream.s_set = tcp_set; + c->stream.s_peer_addr = tcp_get_peer_addr; + c->stream.s_self_addr = tcp_get_self_addr; *cp = c; return (0); @@ -467,9 +439,19 @@ nni_posix_tcp_alloc(nni_tcp_conn **cp, nni_tcp_dialer *d, int fd) void nni_posix_tcp_start(nni_tcp_conn *c, int nodelay, int keepalive) { + int fd = nni_posix_pfd_fd(&c->pfd); // Configure the initial socket options. - (void) setsockopt(nni_posix_pfd_fd(&c->pfd), IPPROTO_TCP, TCP_NODELAY, - &nodelay, sizeof(int)); - (void) setsockopt(nni_posix_pfd_fd(&c->pfd), SOL_SOCKET, SO_KEEPALIVE, - &keepalive, sizeof(int)); + (void) setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &nodelay, sizeof(int)); + (void) setsockopt( + fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(int)); + + struct sockaddr_storage ss; + socklen_t len = sizeof(ss); + + // Get this info now so we can avoid system calls later. + (void) getpeername(fd, (void *) &ss, &len); + nni_posix_sockaddr2nn(&c->peer, &ss, len); + + (void) getsockname(fd, (void *) &ss, &len); + nni_posix_sockaddr2nn(&c->self, &ss, len); } |
