summaryrefslogtreecommitdiffstats
path: root/bgpd/bgp_engine.h
diff options
context:
space:
mode:
authorChris Hall <GMCH@hestia.halldom.com>2010-02-03 18:12:37 +0000
committerChris Hall <GMCH@hestia.halldom.com>2010-02-03 18:12:37 +0000
commitefb3431b878cd7390fabfc7ddb263cc57b1ae641 (patch)
treef699797355f25f1cc8cffe0ae26a4ce30620780b /bgpd/bgp_engine.h
parent157f56e5b338736343d8a1f7a0a70f13a1219e68 (diff)
downloadquagga-efb3431b878cd7390fabfc7ddb263cc57b1ae641.tar.bz2
quagga-efb3431b878cd7390fabfc7ddb263cc57b1ae641.tar.xz
Added test for sEstablished before processing incoming updates.
Before disabling a session the Peering Engine now revokes its inbound queue for the session. This clears out anything that may have been queued up to that moment for the session. After disabling a session, some updates may still arrive, because it may be a while before the BGP Engine actions the disable, and stops queueing stuff. So, Peering Engine must check that the session is established before processing stuff in the queue. modified: bgpd/bgp_engine.h modified: bgpd/bgp_session.c
Diffstat (limited to 'bgpd/bgp_engine.h')
-rw-r--r--bgpd/bgp_engine.h45
1 files changed, 45 insertions, 0 deletions
diff --git a/bgpd/bgp_engine.h b/bgpd/bgp_engine.h
index 7673328c..8d344b22 100644
--- a/bgpd/bgp_engine.h
+++ b/bgpd/bgp_engine.h
@@ -26,6 +26,7 @@
#include "lib/mqueue.h"
#include "lib/qpnexus.h"
+#include "lib/log.h"
#ifndef Inline
#define Inline static inline
@@ -37,12 +38,50 @@
*
*/
+static unsigned bgp_engine_queue_thresh_up = 0 ;
+static unsigned bgp_engine_queue_thresh_down = 0 ;
+static unsigned peering_engine_queue_thresh_up = 0 ;
+static unsigned peering_engine_queue_thresh_down = 0 ;
+
+Inline void
+bgp_queue_logging(const char* name, unsigned count, unsigned* up,
+ unsigned* down)
+{
+ if (count > *up)
+ {
+ if (*up != 0)
+ {
+ zlog_debug("%s queue up to %u entries", name, count) ;
+
+ *up *= 2 ;
+ *down = *up / 4 ;
+ }
+ else
+ *up = 32 ;
+ } ;
+
+ if (count < *down)
+ {
+ zlog_debug("%s queue down to %u entries", name, count) ;
+
+ if (*up == 32)
+ *down = 0 ;
+ else
+ {
+ *up /= 2 ;
+ *down = *up / 2 ;
+ } ;
+ } ; ;
+} ;
+
/* Send given message to the BGP Engine -- ordinary
*/
Inline void
bgp_to_bgp_engine(mqueue_block mqb)
{
mqueue_enqueue(bgp_nexus->queue, mqb, 0) ;
+ bgp_queue_logging("BGP Engine", bgp_nexus->queue->count,
+ &bgp_engine_queue_thresh_up, &bgp_engine_queue_thresh_down) ;
} ;
/* Send given message to the BGP Engine -- priority
@@ -51,6 +90,8 @@ Inline void
bgp_to_bgp_engine_priority(mqueue_block mqb)
{
mqueue_enqueue(bgp_nexus->queue, mqb, 1) ;
+ bgp_queue_logging("BGP Engine", bgp_nexus->queue->count,
+ &bgp_engine_queue_thresh_up, &bgp_engine_queue_thresh_down) ;
} ;
/*==============================================================================
@@ -63,6 +104,8 @@ Inline void
bgp_to_peering_engine(mqueue_block mqb)
{
mqueue_enqueue(routing_nexus->queue, mqb, 0) ;
+ bgp_queue_logging("Peering Engine", routing_nexus->queue->count,
+ &peering_engine_queue_thresh_up, &peering_engine_queue_thresh_down) ;
} ;
/* Send given message to the Peering Engine -- priority
@@ -71,6 +114,8 @@ Inline void
bgp_to_peering_engine_priority(mqueue_block mqb)
{
mqueue_enqueue(routing_nexus->queue, mqb, 1) ;
+ bgp_queue_logging("Peering Engine", routing_nexus->queue->count,
+ &peering_engine_queue_thresh_up, &peering_engine_queue_thresh_down) ;
} ;
#endif /* QUAGGA_BGP_ENGINE_H */