diff options
| author | Garrett D'Amore <garrett@damore.org> | 2024-12-28 13:53:18 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2024-12-28 13:53:24 -0800 |
| commit | 7b5515ca641f475dce8184a5d9fd67ceb860e843 (patch) | |
| tree | dd6e458ea87df33b3d9b359572abdd63154c6999 /src/core | |
| parent | 146e10d365e3c451ba92b226e0d7cbfcc3574383 (diff) | |
| download | nng-7b5515ca641f475dce8184a5d9fd67ceb860e843.tar.gz nng-7b5515ca641f475dce8184a5d9fd67ceb860e843.tar.bz2 nng-7b5515ca641f475dce8184a5d9fd67ceb860e843.zip | |
tcp: flatten the listener implementation
The endpoints both use a nesting level for some common code and some
platform dependent code. But the common code isn't that much and we
have similar patterns for e.g. IPC.
This avoids a layer of indirection in the structs, and extra allocations.
The payoff will be even larger for the dialers, but that is next.
(Dialers are more complicated because of DNS.)
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/tcp.c | 140 |
1 files changed, 0 insertions, 140 deletions
diff --git a/src/core/tcp.c b/src/core/tcp.c index 159ffe41..fd1c7e96 100644 --- a/src/core/tcp.c +++ b/src/core/tcp.c @@ -273,143 +273,3 @@ nni_tcp_dialer_alloc(nng_stream_dialer **dp, const nng_url *url) *dp = (void *) d; return (0); } - -typedef struct { - nng_stream_listener ops; - nni_tcp_listener *l; - nng_sockaddr sa; -} tcp_listener; - -static void -tcp_listener_close(void *arg) -{ - tcp_listener *l = arg; - nni_tcp_listener_close(l->l); -} - -static void -tcp_listener_stop(void *arg) -{ - tcp_listener *l = arg; - nni_tcp_listener_stop(l->l); -} - -static void -tcp_listener_free(void *arg) -{ - tcp_listener *l = arg; - nni_tcp_listener_fini(l->l); - NNI_FREE_STRUCT(l); -} - -static int -tcp_listener_listen(void *arg) -{ - tcp_listener *l = arg; - return (nni_tcp_listener_listen(l->l, &l->sa)); -} - -static void -tcp_listener_accept(void *arg, nng_aio *aio) -{ - tcp_listener *l = arg; - nni_tcp_listener_accept(l->l, aio); -} - -static int -tcp_listener_get_port(void *arg, void *buf, size_t *szp, nni_type t) -{ - tcp_listener *l = arg; - int rv; - nng_sockaddr sa; - size_t sz; - int port; - uint8_t *paddr; - - sz = sizeof(sa); - rv = nni_tcp_listener_get( - l->l, NNG_OPT_LOCADDR, &sa, &sz, NNI_TYPE_SOCKADDR); - if (rv != 0) { - return (rv); - } - - switch (sa.s_family) { - case NNG_AF_INET: - paddr = (void *) &sa.s_in.sa_port; - break; - - case NNG_AF_INET6: - paddr = (void *) &sa.s_in6.sa_port; - break; - - default: - paddr = NULL; - break; - } - - if (paddr == NULL) { - return (NNG_ESTATE); - } - - NNI_GET16(paddr, port); - return (nni_copyout_int(port, buf, szp, t)); -} - -static int -tcp_listener_get( - void *arg, const char *name, void *buf, size_t *szp, nni_type t) -{ - tcp_listener *l = arg; - if (strcmp(name, NNG_OPT_TCP_BOUND_PORT) == 0) { - return (tcp_listener_get_port(l, buf, szp, t)); - } - return (nni_tcp_listener_get(l->l, name, buf, szp, t)); -} - -static int -tcp_listener_set( - void *arg, const char *name, const void *buf, size_t sz, nni_type t) -{ - tcp_listener *l = arg; - return (nni_tcp_listener_set(l->l, name, buf, sz, t)); -} - -static int -tcp_listener_alloc_addr(nng_stream_listener **lp, const nng_sockaddr *sa) -{ - tcp_listener *l; - int rv; - - if ((l = NNI_ALLOC_STRUCT(l)) == NULL) { - return (NNG_ENOMEM); - } - if ((rv = nni_tcp_listener_init(&l->l)) != 0) { - NNI_FREE_STRUCT(l); - return (rv); - } - l->sa = *sa; - - l->ops.sl_free = tcp_listener_free; - l->ops.sl_close = tcp_listener_close; - l->ops.sl_stop = tcp_listener_stop; - l->ops.sl_listen = tcp_listener_listen; - l->ops.sl_accept = tcp_listener_accept; - l->ops.sl_get = tcp_listener_get; - l->ops.sl_set = tcp_listener_set; - - *lp = (void *) l; - return (0); -} - -int -nni_tcp_listener_alloc(nng_stream_listener **lp, const nng_url *url) -{ - int rv; - nng_sockaddr sa; - - if ((rv = nni_url_to_address(&sa, url)) != 0) { - return (rv); - } - - return (tcp_listener_alloc_addr(lp, &sa)); -} |
