From 2906d6a5227df25f14305c373fdde057f388d363 Mon Sep 17 00:00:00 2001
From: Victor Seva <linuxmaniac@torreviejawireless.org>
Date: Fri, 5 Dec 2014 13:17:50 +0100
Subject: Add "tcp-keepidle", "tcp-keepcnt" and "tcp-keepintvl" options

---
 src/options.c | 36 ++++++++++++++++++++++++++++++++++++
 src/options.h | 18 ++++++++++++++++++
 src/tcp.c     | 18 ++++++++++++++++++
 3 files changed, 72 insertions(+)

(limited to 'src')

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}
-- 
cgit v1.2.3-55-g6feb