summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_keepalives.c10
-rw-r--r--bgpd/bgp_packet.c9
2 files changed, 19 insertions, 0 deletions
diff --git a/bgpd/bgp_keepalives.c b/bgpd/bgp_keepalives.c
index abe9739c98..afa280a799 100644
--- a/bgpd/bgp_keepalives.c
+++ b/bgpd/bgp_keepalives.c
@@ -232,6 +232,11 @@ void bgp_keepalives_on(struct peer *peer)
/* placeholder bucket data to use for fast key lookups */
static struct pkat holder = {0};
+ if (!peerhash_mtx) {
+ zlog_warn("%s: call bgp_keepalives_init() first", __func__);
+ return;
+ }
+
pthread_mutex_lock(peerhash_mtx);
{
holder.peer = peer;
@@ -251,6 +256,11 @@ void bgp_keepalives_off(struct peer *peer)
/* placeholder bucket data to use for fast key lookups */
static struct pkat holder = {0};
+ if (!peerhash_mtx) {
+ zlog_warn("%s: call bgp_keepalives_init() first", __func__);
+ return;
+ }
+
pthread_mutex_lock(peerhash_mtx);
{
holder.peer = peer;
diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c
index fe633413c2..09df0e35b6 100644
--- a/bgpd/bgp_packet.c
+++ b/bgpd/bgp_packet.c
@@ -58,6 +58,7 @@
#include "bgpd/bgp_updgrp.h"
#include "bgpd/bgp_label.h"
#include "bgpd/bgp_io.h"
+#include "bgpd/bgp_keepalives.h"
/**
* Sets marker and type fields for a BGP message.
@@ -655,6 +656,14 @@ void bgp_notify_send_with_data(struct peer *peer, u_char code, u_char sub_code,
/* Set BGP packet length. */
length = bgp_packet_set_size(s);
+ /*
+ * Turn off keepalive generation for peer. This is necessary because
+ * otherwise between the time we wipe the output buffer and the time we
+ * push the NOTIFY onto it, the KA generation thread could have pushed
+ * a KEEPALIVE in the middle.
+ */
+ bgp_keepalives_off(peer);
+
/* wipe output buffer */
pthread_mutex_lock(&peer->io_mtx);
{