From a0e9639a1f38f26a5dc586d386ae044ba82e0137 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Fri, 17 Jan 2014 07:05:17 +0000 Subject: [PATCH] Handle Linux TCP keepalives better in Sofia Sofia accepts a value for the TCP keepalive timeout interval via TPTAG_KEEPALIVE, however it fails to use this value for the Linux keepalive socket options TCP_KEEPIDLE and TCP_KEEPINTVL. In fact, on Linux it enables the sending of TCP keepalives even if tpp_keepalive is set to zero which would disable Sofia's internal keepalive mechanisms. Sofia then uses a hard coded value of 30 seconds for these keepalive intervals which affects battery life on mobile devices. With this commit we harmonize the sending of TCP keepalives on Linux with other platforms by using the value from TPTAG_KEEPALIVE and not enabling the sending of TCP keepalives at all if the value of the parameter is zero. FS-6104 --resolve --- libs/sofia-sip/.update | 2 +- libs/sofia-sip/libsofia-sip-ua/tport/tport_type_tcp.c | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index f36394da87..69ff5167a3 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Wed Nov 27 10:20:13 CST 2013 +Fri Jan 17 06:55:06 UTC 2014 diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/tport_type_tcp.c b/libs/sofia-sip/libsofia-sip-ua/tport/tport_type_tcp.c index 7196955e27..70cf64385b 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/tport_type_tcp.c +++ b/libs/sofia-sip/libsofia-sip-ua/tport/tport_type_tcp.c @@ -196,12 +196,14 @@ int tport_tcp_init_secondary(tport_t *self, int socket, int accepted, #if defined(SO_KEEPALIVE) setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, (void *)&val, sizeof val); #endif - val = 30; + val = (int)(self->tp_params->tpp_keepalive); #if defined(TCP_KEEPIDLE) - setsockopt(socket, SOL_TCP, TCP_KEEPIDLE, (void *)&val, sizeof val); + if (val != 0 && val != UINT_MAX) + setsockopt(socket, SOL_TCP, TCP_KEEPIDLE, (void *)&val, sizeof val); #endif #if defined(TCP_KEEPINTVL) - setsockopt(socket, SOL_TCP, TCP_KEEPINTVL, (void *)&val, sizeof val); + if (val != 0 && val != UINT_MAX) + setsockopt(socket, SOL_TCP, TCP_KEEPINTVL, (void *)&val, sizeof val); #endif if (!accepted)