summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Rose <jrose@digium.com>2015-12-10 11:44:03 -0600
committerJonathan Rose <jrose@digium.com>2015-12-10 14:13:42 -0600
commit14b41115e363766633aec67f67e9764521b74f5c (patch)
treed1591acabaf6fad8a5d970743924b2e6385c384e
parentc344fb02f4ab82c735159da1d6029ea1e76b5bf7 (diff)
chan_sip: Add TCP/TLS keepalive to TCP/TLS server
Adds the TCP Keep Alive option to TCP and TLS server sockets. Previously this option was only being set on session sockets. http://www.tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/ According to the link above, the SO_KEEPALIVE option is useful for knowing when a TCP connected endpoint has severed communication without indicating it or has become unreachable for some reason. Without this patch, keep alive is not set on the socket listening for incoming TCP sessions and in Komatsu's report this resulted in the thread listening for TCP becoming stuck in a waiting state. ASTERISK-25364 #close Reported by: Hiroaki Komatsu Change-Id: I7ed7bcfa982b367dc64b4b73fbd962da49b9af36
-rw-r--r--channels/chan_sip.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 9bc15bbbc..5c808cc22 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -32235,6 +32235,12 @@ static int reload_config(enum channelreloadreason reason)
ast_log(LOG_ERROR, "SIP TCP Server start failed. Not listening on TCP socket.\n");
} else {
ast_debug(2, "SIP TCP server started\n");
+ if (sip_tcp_desc.accept_fd >= 0) {
+ int flags = 1;
+ if (setsockopt(sip_tcp_desc.accept_fd, SOL_SOCKET, SO_KEEPALIVE, &flags, sizeof(flags))) {
+ ast_log(LOG_ERROR, "Error enabling TCP keep-alive on sip socket: %s\n", strerror(errno));
+ }
+ }
}
/* Start TLS server if needed */
@@ -32255,6 +32261,13 @@ static int reload_config(enum channelreloadreason reason)
ast_log(LOG_ERROR, "TLS Server start failed. Not listening on TLS socket.\n");
sip_tls_desc.tls_cfg = NULL;
}
+ if (sip_tls_desc.accept_fd >= 0) {
+ int flags = 1;
+ if (setsockopt(sip_tls_desc.accept_fd, SOL_SOCKET, SO_KEEPALIVE, &flags, sizeof(flags))) {
+ ast_log(LOG_ERROR, "Error enabling TCP keep-alive on sip socket: %s\n", strerror(errno));
+ sip_tls_desc.tls_cfg = NULL;
+ }
+ }
} else if (sip_tls_desc.tls_cfg->enabled) {
sip_tls_desc.tls_cfg = NULL;
ast_log(LOG_WARNING, "SIP TLS server did not load because of errors.\n");