diff options
| author | Garrett D'Amore <garrett@damore.org> | 2018-04-26 13:53:40 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2018-04-26 13:53:40 -0700 |
| commit | 3de2b56557c80b310341c423492bd8ba895c1abe (patch) | |
| tree | 897815f4d9aa30d8c40cbed4c5fec4088d555fda /src/platform | |
| parent | 492bfcc90d4b80842b024201cc1e4526404128b4 (diff) | |
| download | nng-3de2b56557c80b310341c423492bd8ba895c1abe.tar.gz nng-3de2b56557c80b310341c423492bd8ba895c1abe.tar.bz2 nng-3de2b56557c80b310341c423492bd8ba895c1abe.zip | |
fixes #105 Want NNG_OPT_TCP_NODELAY option
fixes #106 TCP keepalive tuning
Diffstat (limited to 'src/platform')
| -rw-r--r-- | src/platform/posix/posix_aio.h | 2 | ||||
| -rw-r--r-- | src/platform/posix/posix_pipedesc.c | 26 | ||||
| -rw-r--r-- | src/platform/posix/posix_tcp.c | 12 | ||||
| -rw-r--r-- | src/platform/windows/win_tcp.c | 24 |
4 files changed, 64 insertions, 0 deletions
diff --git a/src/platform/posix/posix_aio.h b/src/platform/posix/posix_aio.h index 2073f6d6..15dae06c 100644 --- a/src/platform/posix/posix_aio.h +++ b/src/platform/posix/posix_aio.h @@ -31,6 +31,8 @@ extern void nni_posix_pipedesc_send(nni_posix_pipedesc *, nni_aio *); extern void nni_posix_pipedesc_close(nni_posix_pipedesc *); extern int nni_posix_pipedesc_peername(nni_posix_pipedesc *, nni_sockaddr *); extern int nni_posix_pipedesc_sockname(nni_posix_pipedesc *, nni_sockaddr *); +extern int nni_posix_pipedesc_set_nodelay(nni_posix_pipedesc *, bool); +extern int nni_posix_pipedesc_set_keepalive(nni_posix_pipedesc *, bool); extern int nni_posix_epdesc_init(nni_posix_epdesc **); extern void nni_posix_epdesc_set_local(nni_posix_epdesc *, void *, size_t); diff --git a/src/platform/posix/posix_pipedesc.c b/src/platform/posix/posix_pipedesc.c index 72251372..f9cbb94b 100644 --- a/src/platform/posix/posix_pipedesc.c +++ b/src/platform/posix/posix_pipedesc.c @@ -16,6 +16,8 @@ #include <errno.h> #include <fcntl.h> +#include <netinet/in.h> +#include <netinet/tcp.h> #include <poll.h> #include <stdbool.h> #include <stdlib.h> @@ -335,6 +337,30 @@ nni_posix_pipedesc_sockname(nni_posix_pipedesc *pd, nni_sockaddr *sa) } int +nni_posix_pipedesc_set_nodelay(nni_posix_pipedesc *pd, bool nodelay) +{ + int val = nodelay ? 1 : 0; + + if (setsockopt(pd->node.fd, IPPROTO_TCP, TCP_NODELAY, &val, + sizeof(val)) != 0) { + return (nni_plat_errno(errno)); + } + return (0); +} + +int +nni_posix_pipedesc_set_keepalive(nni_posix_pipedesc *pd, bool keep) +{ + int val = keep ? 1 : 0; + + if (setsockopt(pd->node.fd, SOL_SOCKET, SO_KEEPALIVE, &val, + sizeof(val)) != 0) { + return (nni_plat_errno(errno)); + } + return (0); +} + +int nni_posix_pipedesc_init(nni_posix_pipedesc **pdp, int fd) { nni_posix_pipedesc *pd; diff --git a/src/platform/posix/posix_tcp.c b/src/platform/posix/posix_tcp.c index 9caa157f..81ec330b 100644 --- a/src/platform/posix/posix_tcp.c +++ b/src/platform/posix/posix_tcp.c @@ -125,6 +125,18 @@ nni_plat_tcp_pipe_sockname(nni_plat_tcp_pipe *p, nni_sockaddr *sa) } int +nni_plat_tcp_pipe_set_keepalive(nni_plat_tcp_pipe *p, bool v) +{ + return (nni_posix_pipedesc_set_keepalive((void *) p, v)); +} + +int +nni_plat_tcp_pipe_set_nodelay(nni_plat_tcp_pipe *p, bool v) +{ + return (nni_posix_pipedesc_set_nodelay((void *) p, v)); +} + +int nni_plat_tcp_ntop(const nni_sockaddr *sa, char *ipstr, char *portstr) { const void *ap; diff --git a/src/platform/windows/win_tcp.c b/src/platform/windows/win_tcp.c index 17f7845d..4d7d6027 100644 --- a/src/platform/windows/win_tcp.c +++ b/src/platform/windows/win_tcp.c @@ -243,6 +243,30 @@ nni_plat_tcp_pipe_sockname(nni_plat_tcp_pipe *pipe, nni_sockaddr *sa) return (0); } +int +nni_plat_tcp_pipe_set_nodelay(nni_plat_tcp_pipe *pipe, bool val) +{ + BOOL b; + b = val ? TRUE : FALSE; + if (setsockopt(pipe->s, IPPROTO_TCP, TCP_NODELAY, (void *) &b, + sizeof(b)) != 0) { + return (nni_win_error(WSAGetLastError())); + } + return (0); +} + +int +nni_plat_tcp_pipe_set_keepalive(nni_plat_tcp_pipe *pipe, bool val) +{ + BOOL b; + b = val ? TRUE : FALSE; + if (setsockopt(pipe->s, SOL_SOCKET, SO_KEEPALIVE, (void *) &b, + sizeof(b)) != 0) { + return (nni_win_error(WSAGetLastError())); + } + return (0); +} + void nni_plat_tcp_pipe_fini(nni_plat_tcp_pipe *pipe) { |
