aboutsummaryrefslogtreecommitdiff
path: root/src/platform/posix/posix_tcpconn.c
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/platform/posix/posix_tcpconn.c
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/platform/posix/posix_tcpconn.c')
-rw-r--r--src/platform/posix/posix_tcpconn.c80
1 files changed, 31 insertions, 49 deletions
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);
}