From d1adb448435de26af9cea6b16256a8db39a293dd Mon Sep 17 00:00:00 2001 From: Philippe Guibert Date: Mon, 8 Nov 2021 09:48:24 +0100 Subject: bgpd: support TCP keepalive for BGP connection TCP keepalive is enabled once BGP connection is established. New vty commands: bgp tcp-keepalive <1-65535> <1-65535> <1-30> no bgp tcp-keepalive Signed-off-by: Xiaofeng Liu Signed-off-by: Philippe Guibert --- bgpd/bgp_network.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'bgpd/bgp_network.c') diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c index 9ecc2ae4e4..9582ec01ed 100644 --- a/bgpd/bgp_network.c +++ b/bgpd/bgp_network.c @@ -207,6 +207,25 @@ int bgp_md5_set(struct peer *peer) return bgp_md5_set_password(peer, peer->password); } +static void bgp_update_setsockopt_tcp_keepalive(struct bgp *bgp, int fd) +{ + if (!bgp) + return; + if (bgp->tcp_keepalive_idle != 0) { + int ret; + + ret = setsockopt_tcp_keepalive(fd, bgp->tcp_keepalive_idle, + bgp->tcp_keepalive_intvl, + bgp->tcp_keepalive_probes); + if (ret < 0) + zlog_err( + "Can't set TCP keepalive on socket %d, idle %u intvl %u probes %u", + fd, bgp->tcp_keepalive_idle, + bgp->tcp_keepalive_intvl, + bgp->tcp_keepalive_probes); + } +} + int bgp_md5_unset(struct peer *peer) { /* Unset the password from listen socket. */ @@ -415,6 +434,9 @@ static void bgp_accept(struct thread *thread) bgp_socket_set_buffer_size(bgp_sock); + /* Set TCP keepalive when TCP keepalive is enabled */ + bgp_update_setsockopt_tcp_keepalive(bgp, bgp_sock); + /* Check remote IP address */ peer1 = peer_lookup(bgp, &su); @@ -718,12 +740,16 @@ int bgp_connect(struct peer *peer) bgp_socket_set_buffer_size(peer->fd); + /* Set TCP keepalive when TCP keepalive is enabled */ + bgp_update_setsockopt_tcp_keepalive(peer->bgp, peer->fd); + if (bgp_set_socket_ttl(peer, peer->fd) < 0) { peer->last_reset = PEER_DOWN_SOCKET_ERROR; if (bgp_debug_neighbor_events(peer)) zlog_debug("%s: Failure to set socket ttl for connection to %s, error received: %s(%d)", __func__, peer->host, safe_strerror(errno), errno); + return -1; } -- cgit v1.2.3