mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-04 00:59:13 +00:00
lib: add a function to configure tcp keepalive parameters
New function setsockopt_tcp_keepalive() is added to enable TCP keepalive mechanism for specified socket. Also TCP keepalive idle time, interval and maximum probes are configured. Signed-off-by: Xiaofeng Liu <xiaofeng.liu@6wind.com> Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
This commit is contained in:
parent
9982282d41
commit
5c480b5db3
@ -699,3 +699,52 @@ int sockopt_tcp_mss_get(int sock)
|
||||
|
||||
return tcp_maxseg;
|
||||
}
|
||||
|
||||
int setsockopt_tcp_keepalive(int sock, uint16_t keepalive_idle,
|
||||
uint16_t keepalive_intvl,
|
||||
uint16_t keepalive_probes)
|
||||
{
|
||||
int val = 1;
|
||||
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val)) < 0) {
|
||||
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
||||
"%s failed: setsockopt SO_KEEPALIVE (%d): %s",
|
||||
__func__, sock, safe_strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if defined __OpenBSD__
|
||||
return 0;
|
||||
#else
|
||||
/* Send first probe after keepalive_idle seconds */
|
||||
val = keepalive_idle;
|
||||
if (setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof(val)) <
|
||||
0) {
|
||||
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
||||
"%s failed: setsockopt TCP_KEEPIDLE (%d): %s",
|
||||
__func__, sock, safe_strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Set interval between two probes */
|
||||
val = keepalive_intvl;
|
||||
if (setsockopt(sock, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof(val)) <
|
||||
0) {
|
||||
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
||||
"%s failed: setsockopt TCP_KEEPINTVL (%d): %s",
|
||||
__func__, sock, safe_strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Set maximum probes */
|
||||
val = keepalive_probes;
|
||||
if (setsockopt(sock, IPPROTO_TCP, TCP_KEEPCNT, &val, sizeof(val)) < 0) {
|
||||
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
||||
"%s failed: setsockopt TCP_KEEPCNT (%d): %s",
|
||||
__func__, sock, safe_strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
@ -153,6 +153,28 @@ extern int sockopt_tcp_mss_set(int sock, int tcp_maxseg);
|
||||
* Socket to get max segement size.
|
||||
*/
|
||||
extern int sockopt_tcp_mss_get(int sock);
|
||||
|
||||
/*
|
||||
* Configure TCP keepalive for a given socket
|
||||
*
|
||||
* sock
|
||||
* Socket to enable keepalive option on.
|
||||
*
|
||||
* keepalive_idle
|
||||
* number of seconds a connection needs to be idle
|
||||
* before sending out keep-alive proves
|
||||
*
|
||||
* keepalive_intvl
|
||||
* number of seconds between TCP keep-alive probes
|
||||
*
|
||||
* keepalive_probes
|
||||
* max number of probers to send before giving up
|
||||
* and killing tcp connection
|
||||
*/
|
||||
extern int setsockopt_tcp_keepalive(int sock, uint16_t keepalive_idle,
|
||||
uint16_t keepalive_intvl,
|
||||
uint16_t keepalive_probes);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user