diff --git a/doc/tcp.html b/doc/tcp.html
index 4226d78..4307234 100644
--- a/doc/tcp.html
+++ b/doc/tcp.html
@@ -433,6 +433,12 @@ used in validating addresses supplied in a call to
'tcp-nodelay': Setting this option to true
disables the Nagle's algorithm for the connection;
+ 'tcp-keepidle': value in seconds for TCP_KEEPIDLE Linux only!!
+
+ 'tcp-keepcnt': value for TCP_KEEPCNT Linux only!!
+
+ 'tcp-keepintvl': value for TCP_KEEPINTVL Linux only!!
+
'ipv6-v6only':
Setting this option to true restricts an inet6 socket to
sending and receiving only IPv6 packets.
diff --git a/src/options.c b/src/options.c
index 8ac2a14..28fc08a 100644
--- a/src/options.c
+++ b/src/options.c
@@ -90,6 +90,42 @@ int opt_get_tcp_nodelay(lua_State *L, p_socket ps)
return opt_getboolean(L, ps, IPPROTO_TCP, TCP_NODELAY);
}
+#ifdef TCP_KEEPIDLE
+int opt_get_tcp_keepidle(lua_State *L, p_socket ps)
+{
+ return opt_getint(L, ps, IPPROTO_TCP, TCP_KEEPIDLE);
+}
+
+int opt_set_tcp_keepidle(lua_State *L, p_socket ps)
+{
+ return opt_setint(L, ps, IPPROTO_TCP, TCP_KEEPIDLE);
+}
+#endif
+
+#ifdef TCP_KEEPCNT
+int opt_get_tcp_keepcnt(lua_State *L, p_socket ps)
+{
+ return opt_getint(L, ps, IPPROTO_TCP, TCP_KEEPCNT);
+}
+
+int opt_set_tcp_keepcnt(lua_State *L, p_socket ps)
+{
+ return opt_setint(L, ps, IPPROTO_TCP, TCP_KEEPCNT);
+}
+#endif
+
+#ifdef TCP_KEEPINTVL
+int opt_get_tcp_keepintvl(lua_State *L, p_socket ps)
+{
+ return opt_getint(L, ps, IPPROTO_TCP, TCP_KEEPINTVL);
+}
+
+int opt_set_tcp_keepintvl(lua_State *L, p_socket ps)
+{
+ return opt_setint(L, ps, IPPROTO_TCP, TCP_KEEPINTVL);
+}
+#endif
+
int opt_set_keepalive(lua_State *L, p_socket ps)
{
return opt_setboolean(L, ps, SOL_SOCKET, SO_KEEPALIVE);
diff --git a/src/options.h b/src/options.h
index 5657a06..2b6697b 100644
--- a/src/options.h
+++ b/src/options.h
@@ -23,6 +23,15 @@ int opt_set_dontroute(lua_State *L, p_socket ps);
int opt_set_broadcast(lua_State *L, p_socket ps);
int opt_set_reuseaddr(lua_State *L, p_socket ps);
int opt_set_tcp_nodelay(lua_State *L, p_socket ps);
+#ifdef TCP_KEEPIDLE
+int opt_set_tcp_keepidle(lua_State *L, p_socket ps);
+#endif
+#ifdef TCP_KEEPCNT
+int opt_set_tcp_keepcnt(lua_State *L, p_socket ps);
+#endif
+#ifdef TCP_KEEPINTVL
+int opt_set_tcp_keepintvl(lua_State *L, p_socket ps);
+#endif
int opt_set_keepalive(lua_State *L, p_socket ps);
int opt_set_linger(lua_State *L, p_socket ps);
int opt_set_reuseaddr(lua_State *L, p_socket ps);
@@ -42,6 +51,15 @@ int opt_set_ip6_v6only(lua_State *L, p_socket ps);
/* supported options for getoption */
int opt_get_reuseaddr(lua_State *L, p_socket ps);
int opt_get_tcp_nodelay(lua_State *L, p_socket ps);
+#ifdef TCP_KEEPIDLE
+int opt_get_tcp_keepidle(lua_State *L, p_socket ps);
+#endif
+#ifdef TCP_KEEPCNT
+int opt_get_tcp_keepcnt(lua_State *L, p_socket ps);
+#endif
+#ifdef TCP_KEEPINTVL
+int opt_get_tcp_keepintvl(lua_State *L, p_socket ps);
+#endif
int opt_get_keepalive(lua_State *L, p_socket ps);
int opt_get_linger(lua_State *L, p_socket ps);
int opt_get_reuseaddr(lua_State *L, p_socket ps);
diff --git a/src/tcp.c b/src/tcp.c
index 6594bda..3af9a39 100644
--- a/src/tcp.c
+++ b/src/tcp.c
@@ -72,6 +72,15 @@ static t_opt optget[] = {
{"keepalive", opt_get_keepalive},
{"reuseaddr", opt_get_reuseaddr},
{"tcp-nodelay", opt_get_tcp_nodelay},
+#ifdef TCP_KEEPIDLE
+ {"tcp-keepidle", opt_get_tcp_keepidle},
+#endif
+#ifdef TCP_KEEPCNT
+ {"tcp-keepcnt", opt_get_tcp_keepcnt},
+#endif
+#ifdef TCP_KEEPINTVL
+ {"tcp-keepintvl", opt_get_tcp_keepintvl},
+#endif
{"linger", opt_get_linger},
{"error", opt_get_error},
{NULL, NULL}
@@ -81,6 +90,15 @@ static t_opt optset[] = {
{"keepalive", opt_set_keepalive},
{"reuseaddr", opt_set_reuseaddr},
{"tcp-nodelay", opt_set_tcp_nodelay},
+#ifdef TCP_KEEPIDLE
+ {"tcp-keepidle", opt_set_tcp_keepidle},
+#endif
+#ifdef TCP_KEEPCNT
+ {"tcp-keepcnt", opt_set_tcp_keepcnt},
+#endif
+#ifdef TCP_KEEPINTVL
+ {"tcp-keepintvl", opt_set_tcp_keepintvl},
+#endif
{"ipv6-v6only", opt_set_ip6_v6only},
{"linger", opt_set_linger},
{NULL, NULL}
diff --git a/test/tcp-getoptions b/test/tcp-getoptions
index f9b3d1b..777ccc3 100755
--- a/test/tcp-getoptions
+++ b/test/tcp-getoptions
@@ -7,7 +7,9 @@ port = 8765
function options(o)
print("options for", o)
- for _, opt in ipairs{"keepalive", "reuseaddr", "tcp-nodelay"} do
+ for _, opt in ipairs{
+ "keepalive", "reuseaddr",
+ "tcp-nodelay", "tcp-keepidle", "tcp-keepcnt", "tcp-keepintvl"} do
print("getoption", opt, o:getoption(opt))
end