summaryrefslogtreecommitdiff
path: root/bgpd/bgp_packet.c
diff options
context:
space:
mode:
authorRuss White <russ@riw.us>2020-09-08 11:28:40 -0400
committerGitHub <noreply@github.com>2020-09-08 11:28:40 -0400
commit5ceb842f455a9b5ec738f7f52aad3a33e1ebf67c (patch)
treeab748ac03177a7b7face84b1c85cf47542544f6e /bgpd/bgp_packet.c
parentd6165cf5437cea776baa5dcbcdc0cb3877acc9e9 (diff)
parent91052810f9df11b6858fbe01efbb1ea4d2590ba6 (diff)
Merge pull request #6969 from ton31337/feature/autoshutdown_if_rtt_higher_than_specified
bgpd: Add `neighbor <neigh> shutdown rtt` command
Diffstat (limited to 'bgpd/bgp_packet.c')
-rw-r--r--bgpd/bgp_packet.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c
index 0d81403803..15dba37667 100644
--- a/bgpd/bgp_packet.c
+++ b/bgpd/bgp_packet.c
@@ -1432,6 +1432,27 @@ static int bgp_keepalive_receive(struct peer *peer, bgp_size_t size)
bgp_update_implicit_eors(peer);
+ peer->rtt = sockopt_tcp_rtt(peer->fd);
+
+ /* If the peer's RTT is higher than expected, shutdown
+ * the peer automatically.
+ */
+ if (CHECK_FLAG(peer->flags, PEER_FLAG_RTT_SHUTDOWN)
+ && peer->rtt > peer->rtt_expected) {
+
+ peer->rtt_keepalive_rcv++;
+
+ if (peer->rtt_keepalive_rcv > peer->rtt_keepalive_conf) {
+ zlog_warn(
+ "%s shutdown due to high round-trip-time (%dms > %dms)",
+ peer->host, peer->rtt, peer->rtt_expected);
+ peer_flag_set(peer, PEER_FLAG_SHUTDOWN);
+ }
+ } else {
+ if (peer->rtt_keepalive_rcv)
+ peer->rtt_keepalive_rcv--;
+ }
+
return Receive_KEEPALIVE_message;
}