From ad9cd56b2d36075e8ba8b6c54c8993a6eee77157 Mon Sep 17 00:00:00 2001 From: Peter Lieven Date: Fri, 19 Oct 2012 23:40:12 +0200 Subject: [PATCH] Add setters for TCP keepalive values This patch adds 3 functions to set the 3 keepalive values TCP_KEEPIDLE, TCP_KEEPCNT and TCP_KEEPINTVL. The values have to be set after iscsi context creation and are then configured on the socket on each new connection. --- include/iscsi-private.h | 3 +++ include/iscsi.h | 22 ++++++++++++++++++++++ lib/connect.c | 3 +++ lib/init.c | 4 ++++ lib/libiscsi.def | 3 +++ lib/libiscsi.syms | 3 +++ lib/socket.c | 20 +++++++++++++++++++- 7 files changed, 57 insertions(+), 1 deletion(-) diff --git a/include/iscsi-private.h b/include/iscsi-private.h index 010eeb8..d0a73f6 100644 --- a/include/iscsi-private.h +++ b/include/iscsi-private.h @@ -86,6 +86,9 @@ struct iscsi_context { int is_connected; int tcp_user_timeout; + int tcp_keepcnt; + int tcp_keepintvl; + int tcp_keepidle; int current_phase; int next_phase; diff --git a/include/iscsi.h b/include/iscsi.h index 70881f6..30aa5ea 100644 --- a/include/iscsi.h +++ b/include/iscsi.h @@ -974,6 +974,28 @@ iscsi_set_debug(struct iscsi_context *iscsi, int level); EXTERN void iscsi_set_tcp_user_timeout(struct iscsi_context *iscsi, int timeout_ms); +/* + * This function is to set the TCP_KEEPIDLE option. It has to be called after iscsi + * context creation. + */ +EXTERN void +iscsi_set_tcp_keepidle(struct iscsi_context *iscsi, int value); + +/* + * This function is to set the TCP_KEEPCNT option. It has to be called after iscsi + * context creation. + */ +EXTERN void +iscsi_set_tcp_keepcnt(struct iscsi_context *iscsi, int value); + +/* + * This function is to set the TCP_KEEPINTVL option. It has to be called after iscsi + * context creation. + */ +EXTERN void +iscsi_set_tcp_keepintvl(struct iscsi_context *iscsi, int value); + + #ifdef __cplusplus } #endif diff --git a/lib/connect.c b/lib/connect.c index 492f65a..2f5b003 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -234,6 +234,9 @@ try_again: iscsi->debug = old_iscsi->debug; iscsi->tcp_user_timeout = old_iscsi->tcp_user_timeout; + iscsi->tcp_keepidle = old_iscsi->tcp_keepidle; + iscsi->tcp_keepcnt = old_iscsi->tcp_keepcnt; + iscsi->tcp_keepintvl = old_iscsi->tcp_keepintvl; if (iscsi_full_connect_sync(iscsi, iscsi->portal, iscsi->lun) != 0) { iscsi_destroy_context(iscsi); diff --git a/lib/init.c b/lib/init.c index 9c6bcac..61852f2 100644 --- a/lib/init.c +++ b/lib/init.c @@ -71,6 +71,10 @@ iscsi_create_context(const char *initiator_name) iscsi->use_immediate_data = ISCSI_IMMEDIATE_DATA_YES; iscsi->want_header_digest = ISCSI_HEADER_DIGEST_NONE_CRC32C; + iscsi->tcp_keepcnt=3; + iscsi->tcp_keepintvl=30; + iscsi->tcp_keepidle=30; + return iscsi; } diff --git a/lib/libiscsi.def b/lib/libiscsi.def index 56ca61a..00cef83 100644 --- a/lib/libiscsi.def +++ b/lib/libiscsi.def @@ -73,6 +73,9 @@ iscsi_set_session_type iscsi_set_targetname iscsi_set_tcp_keepalive iscsi_set_tcp_user_timeout +iscsi_set_tcp_keepidle +iscsi_set_tcp_keepcnt +iscsi_set_tcp_keepintvl iscsi_startstopunit_sync iscsi_startstopunit_task iscsi_synchronizecache10_sync diff --git a/lib/libiscsi.syms b/lib/libiscsi.syms index dba697a..47fb0dc 100644 --- a/lib/libiscsi.syms +++ b/lib/libiscsi.syms @@ -71,6 +71,9 @@ iscsi_set_session_type iscsi_set_targetname iscsi_set_tcp_keepalive iscsi_set_tcp_user_timeout +iscsi_set_tcp_keepidle +iscsi_set_tcp_keepcnt +iscsi_set_tcp_keepintvl iscsi_startstopunit_sync iscsi_startstopunit_task iscsi_synchronizecache10_sync diff --git a/lib/socket.c b/lib/socket.c index 9912976..930a1eb 100644 --- a/lib/socket.c +++ b/lib/socket.c @@ -160,7 +160,7 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal, set_nonblocking(iscsi->fd); - iscsi_set_tcp_keepalive(iscsi, 30, 3, 30); + iscsi_set_tcp_keepalive(iscsi, iscsi->tcp_keepidle, iscsi->tcp_keepcnt, iscsi->tcp_keepintvl); if (iscsi->tcp_user_timeout > 0) { set_tcp_user_timeout(iscsi); @@ -563,6 +563,24 @@ void iscsi_set_tcp_user_timeout(struct iscsi_context *iscsi, int timeout_ms) DPRINTF(iscsi,2,"TCP_USER_TIMEOUT will be set to %dms on next socket creation",timeout_ms); } +void iscsi_set_tcp_keepidle(struct iscsi_context *iscsi, int value) +{ + iscsi->tcp_keepidle=value; + DPRINTF(iscsi,2,"TCP_KEEPIDLE will be set to %d on next socket creation",value); +} + +void iscsi_set_tcp_keepcnt(struct iscsi_context *iscsi, int value) +{ + iscsi->tcp_keepcnt=value; + DPRINTF(iscsi,2,"TCP_KEEPCNT will be set to %d on next socket creation",value); +} + +void iscsi_set_tcp_keepintvl(struct iscsi_context *iscsi, int value) +{ + iscsi->tcp_keepintvl=value; + DPRINTF(iscsi,2,"TCP_KEEPINTVL will be set to %d on next socket creation",value); +} + int iscsi_set_tcp_keepalive(struct iscsi_context *iscsi, int idle, int count, int interval) { int level, value;