aboutsummaryrefslogtreecommitdiff
path: root/src/platform
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform')
-rw-r--r--src/platform/posix/posix_aio.h2
-rw-r--r--src/platform/posix/posix_pipedesc.c26
-rw-r--r--src/platform/posix/posix_tcp.c12
-rw-r--r--src/platform/windows/win_tcp.c24
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)
{