diff --git a/src/core/tcp_main.c b/src/core/tcp_main.c index e96d68c40b2..7f07d724108 100644 --- a/src/core/tcp_main.c +++ b/src/core/tcp_main.c @@ -3172,6 +3172,18 @@ int tcp_init(struct socket_info *sock_info) } #endif init_sock_keepalive(sock_info->socket); +#ifdef HAVE_TCP_USER_TIMEOUT + if((optval = TICKS_TO_S(cfg_get(tcp, tcp_cfg, send_timeout)))) { + optval *= 1000; + if(setsockopt(sock_info->socket, IPPROTO_TCP, TCP_USER_TIMEOUT, &optval, + sizeof(optval)) + < 0) { + LM_WARN("failed to set TCP_USER_TIMEOUT: %s\n", strerror(errno)); + } else { + LM_INFO("Set TCP_USER_TIMEOUT=%d ms\n", optval); + } + } +#endif if(bind(sock_info->socket, &addr->s, sockaddru_len(*addr)) == -1) { LM_ERR("bind(%x, %p, %d) on %s:%d : %s\n", sock_info->socket, &addr->s, (unsigned)sockaddru_len(*addr), sock_info->address_str.s, diff --git a/src/core/tcp_options.h b/src/core/tcp_options.h index d5a628a1128..84c551e2a3b 100644 --- a/src/core/tcp_options.h +++ b/src/core/tcp_options.h @@ -68,6 +68,13 @@ #endif /* __OS_ */ #endif /* NO_TCP_LINGER2 */ +/* tcp user_timeout */ +#ifndef NO_TCP_USER_TIMEOUT +#ifdef __OS_linux +#define HAVE_TCP_USER_TIMEOUT +#endif /* __OS_ */ +#endif /* NO_TCP_LINGER2 */ + /* keepalive */ #ifndef NO_TCP_KEEPALIVE #define HAVE_SO_KEEPALIVE