From 727e09ebe7be57672d3a3f11b0b7cfebaea2675b Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Tue, 13 Aug 2019 17:37:58 +0200 Subject: [PATCH] support openbsd // implement tcp keep-alive polling --- src/network/tcp_socket.cpp | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/network/tcp_socket.cpp b/src/network/tcp_socket.cpp index 0012ba6..1152496 100644 --- a/src/network/tcp_socket.cpp +++ b/src/network/tcp_socket.cpp @@ -11,6 +11,13 @@ # include #endif +#if defined __OpenBSD__ +# include +# include +# include +# include +#endif + namespace fc { namespace detail @@ -186,16 +193,37 @@ namespace fc { if (setsockopt(my->_sock.native_handle(), IPPROTO_TCP, #if defined( __APPLE__ ) TCP_KEEPALIVE, + #elif defined( __OpenBSD__ ) + SO_KEEPALIVE, #else TCP_KEEPIDLE, #endif (char*)&timeout_sec, sizeof(timeout_sec)) < 0) wlog("Error setting TCP keepalive idle time"); -# if !defined(__APPLE__) || defined(TCP_KEEPINTVL) // TCP_KEEPINTVL not defined before 10.9 +# if defined(__OpenBSD__) + int name[4]; + name[0] = CTL_NET; + name[1] = PF_INET; + name[2] = IPPROTO_TCP; + + int value; + size_t sz; + + // get tics per second + name[3] = TCPCTL_SLOWHZ; + if (sysctl(name, 4, &value, &sz, NULL, 0) == -1) + wlog("Error setting TCP keepalive interval"); + + // set interval + value *= timeout_sec; + name[3] = TCPCTL_KEEPINTVL; + if (sysctl(name, 4, NULL, NULL, &value, sizeof(value)) == -1) + wlog("Error setting TCP keepalive interval"); +# elif !defined(__APPLE__) || defined(TCP_KEEPINTVL) // TCP_KEEPINTVL not defined before 10.9 if (setsockopt(my->_sock.native_handle(), IPPROTO_TCP, TCP_KEEPINTVL, (char*)&timeout_sec, sizeof(timeout_sec)) < 0) wlog("Error setting TCP keepalive interval"); -# endif // !__APPLE__ || TCP_KEEPINTVL +# endif // (__OpenBSD__) or (!__APPLE__ || TCP_KEEPINTVL) #endif // !WIN32 } else