I made working patch on the current master branch:
```diff --- a/src/core/tcp_main.c +++ b/src/core/tcp_main.c @@ -4324,10 +4324,25 @@ static inline int handle_new_connect(struct socket_info *si) struct tcp_connection *tcpconn; socklen_t su_len; int new_sock; + int optval;
/* got a connection on r */ su_len = sizeof(su); new_sock = accept(si->socket, &(su.s), &su_len); + + if ((optval = TICKS_TO_S(cfg_get(tcp, tcp_cfg, send_timeout)))) { + optval *= 1000; + if(setsockopt(new_sock, 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 new connection TCP_USER_TIMEOUT=%d ms\n", optval); + } + } + + if(unlikely(new_sock == -1)) { if((errno == EAGAIN) || (errno == EWOULDBLOCK)) return 0; ```
Now the retransmits do what is configured and time out after 3s.
``` Jul 27 18:14:15 p01t-1 kamailio.sbc[1182787]: INFO: <core> [core/tcp_main.c:4373]: handle_new_connect(): Set new connection TCP_USER_TIMEOUT=3000 ms ... Jul 27 18:14:49 p01t-1 kamailio.sbc[1182775]: INFO: sbc:<script>: >>> Sending Request: INVITE sip:22@192.168.41.157:51151;line=q9yhaejq;ob (10.84.65.131:5082 -> 10.84.65.130:51151: sip:193.84.65.130:51151;transport=tcp) Jul 27 18:14:52 p01t-1 kamailio.sbc[1182785]: NOTICE: <core> [core/tcp_read.c:267]: tcp_read_data(): error reading: Connection timed out (110) ```
Readings:
https://stackoverflow.com/questions/5907527/application-control-of-tcp-retra... https://man7.org/linux/man-pages/man7/tcp.7.html
Although said "This option, like many others, will be inherited by the socket returned by [accept(2)](https://man7.org/linux/man-pages/man2/accept.2.html), if it was set on the listening socket." => NO, it is not inherited (I tried it after init_sock_keepalive(sock_info->socket); line in tcp_main.c). So it seems it must be done on the spawned socket in handle_new_connect().
Needs more testing and must be done more pretty.