]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: do not send keepalives when KA timer is 0
authorQuentin Young <qlyoung@cumulusnetworks.com>
Mon, 16 Sep 2019 15:33:49 +0000 (15:33 +0000)
committerQuentin Young <qlyoung@cumulusnetworks.com>
Mon, 16 Sep 2019 16:15:07 +0000 (16:15 +0000)
RFC4271 specifies behavior when the hold timer is sent to zero - we
should not send keepalives or run a hold timer. But FRR, and other
vendors, allow the keepalive timer to be set to zero with a nonzero hold
timer. In this case we were sending keepalives constantly and maxing out
a pthread to do so. Instead behave similarly to other vendors and do not
send keepalives.

Unsure what the utility of this is, but blasting keepalives is
definitely the wrong thing to do.

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
bgpd/bgp_keepalives.c

index 6de1c216a65b4bc155061ab3978bd4544dfafcdd..3a49e8bc00afe5ba01104394cea2bb34b0f7dd60 100644 (file)
@@ -97,11 +97,18 @@ static void peer_process(struct hash_bucket *hb, void *arg)
 
        static struct timeval tolerance = {0, 100000};
 
+       uint32_t v_ka = atomic_load_explicit(&pkat->peer->v_keepalive,
+                                            memory_order_relaxed);
+
+       /* 0 keepalive timer means no keepalives */
+       if (v_ka == 0)
+               return;
+
        /* calculate elapsed time since last keepalive */
        monotime_since(&pkat->last, &elapsed);
 
        /* calculate difference between elapsed time and configured time */
-       ka.tv_sec = pkat->peer->v_keepalive;
+       ka.tv_sec = v_ka;
        timersub(&ka, &elapsed, &diff);
 
        int send_keepalive =