Core: implement TCP_KEEPALIVE on Darwin

In earlier versions, macOS only supported setting TCP_KEEPALIVE in place of TCP_KEEPIDLE,
but macOS has supported TCP_KEEPINTVL and TCP_KEEPCNT since 10.8 in 2012.

Ref:
https://lists.apple.com/archives/macnetworkprog/2012/Jul/msg00005.html
2ff845c2e0/bsd/netinet/tcp.h (L215-L230)
8d741a5de7/bsd/netinet/tcp.h (L226-L241)
This commit is contained in:
Andy Pan 2024-11-19 22:34:17 +08:00
parent 7cd60cd475
commit aedc0b15d1
3 changed files with 42 additions and 12 deletions

View File

@ -118,3 +118,19 @@ ngx_feature_libs=
ngx_feature_test="int32_t lock = 0;
if (!OSAtomicCompareAndSwap32Barrier(0, 1, &lock)) return 1"
. auto/feature
# TCP keepalive
ngx_feature="TCP_KEEPALIVE"
ngx_feature_name="NGX_HAVE_KEEPALIVE_TUNABLE"
ngx_feature_run=no
ngx_feature_incs="#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>"
ngx_feature_path=
ngx_feature_libs=
ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_KEEPALIVE, NULL, 0);
setsockopt(0, IPPROTO_TCP, TCP_KEEPINTVL, NULL, 0);
setsockopt(0, IPPROTO_TCP, TCP_KEEPCNT, NULL, 0)"
. auto/feature

View File

@ -508,18 +508,20 @@ ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_DEFER_ACCEPT, NULL, 0)"
. auto/feature
ngx_feature="TCP_KEEPIDLE"
ngx_feature_name="NGX_HAVE_KEEPALIVE_TUNABLE"
ngx_feature_run=no
ngx_feature_incs="#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>"
ngx_feature_path=
ngx_feature_libs=
ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_KEEPIDLE, NULL, 0);
setsockopt(0, IPPROTO_TCP, TCP_KEEPINTVL, NULL, 0);
setsockopt(0, IPPROTO_TCP, TCP_KEEPCNT, NULL, 0)"
. auto/feature
if [ -z "$NGX_HAVE_KEEPALIVE_TUNABLE" ]; then
ngx_feature="TCP_KEEPIDLE"
ngx_feature_name="NGX_HAVE_KEEPALIVE_TUNABLE"
ngx_feature_run=no
ngx_feature_incs="#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>"
ngx_feature_path=
ngx_feature_libs=
ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_KEEPIDLE, NULL, 0);
setsockopt(0, IPPROTO_TCP, TCP_KEEPINTVL, NULL, 0);
setsockopt(0, IPPROTO_TCP, TCP_KEEPCNT, NULL, 0)"
. auto/feature
fi
ngx_feature="TCP_FASTOPEN"

View File

@ -772,6 +772,7 @@ ngx_configure_listening_sockets(ngx_cycle_t *cycle)
value *= NGX_KEEPALIVE_FACTOR;
#endif
#ifdef TCP_KEEPIDLE
if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPIDLE,
(const void *) &value, sizeof(int))
== -1)
@ -780,6 +781,17 @@ ngx_configure_listening_sockets(ngx_cycle_t *cycle)
"setsockopt(TCP_KEEPIDLE, %d) %V failed, ignored",
value, &ls[i].addr_text);
}
#elif defined(TCP_KEEPALIVE)
/* The equivalent of TCP_KEEPIDLE on Darwin is TCP_KEEPALIVE. */
if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPALIVE,
(const void *) &value, sizeof(int))
== -1)
{
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,
"setsockopt(TCP_KEEPALIVE, %d) %V failed, ignored",
value, &ls[i].addr_text);
}
#endif
}
if (ls[i].keepintvl) {