summaryrefslogtreecommitdiffstats
path: root/bgpd
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd')
-rw-r--r--bgpd/bgp_engine.h33
-rw-r--r--bgpd/bgp_main.c10
-rw-r--r--bgpd/bgp_nexthop.c22
-rw-r--r--bgpd/bgp_route.c73
-rw-r--r--bgpd/bgp_session.c22
-rw-r--r--bgpd/bgp_session.h3
6 files changed, 88 insertions, 75 deletions
diff --git a/bgpd/bgp_engine.h b/bgpd/bgp_engine.h
index 2d36b260..ceec1b2f 100644
--- a/bgpd/bgp_engine.h
+++ b/bgpd/bgp_engine.h
@@ -116,22 +116,12 @@ bgp_queue_logging(const char* name, mqueue_queue mq, struct queue_stats* stats)
stats->xon = 0 ;
} ;
-/* Send given message to the BGP Engine -- ordinary
+/* Send given message to the BGP Engine -- priority/ordinary
*/
Inline void
-bgp_to_bgp_engine(mqueue_block mqb)
+bgp_to_bgp_engine(mqueue_block mqb, enum mqb_rank priority)
{
- mqueue_enqueue(bgp_nexus->queue, mqb, 0) ;
- if (qdebug)
- bgp_queue_logging("BGP Engine", bgp_nexus->queue, &bgp_engine_queue_stats) ;
-} ;
-
-/* Send given message to the BGP Engine -- priority
- */
-Inline void
-bgp_to_bgp_engine_priority(mqueue_block mqb)
-{
- mqueue_enqueue(bgp_nexus->queue, mqb, 1) ;
+ mqueue_enqueue(bgp_nexus->queue, mqb, priority) ;
if (qdebug)
bgp_queue_logging("BGP Engine", bgp_nexus->queue, &bgp_engine_queue_stats) ;
} ;
@@ -140,26 +130,15 @@ bgp_to_bgp_engine_priority(mqueue_block mqb)
*
*/
-/* Send given message to the Routing Engine -- ordinary
+/* Send given message to the Routing Engine -- priority/ordinary
*/
Inline void
-bgp_to_routing_engine(mqueue_block mqb)
+bgp_to_routing_engine(mqueue_block mqb, enum mqb_rank priority)
{
- mqueue_enqueue(routing_nexus->queue, mqb, 0) ;
+ mqueue_enqueue(routing_nexus->queue, mqb, priority) ;
if (qdebug)
bgp_queue_logging("Routing Engine", routing_nexus->queue,
&routing_engine_queue_stats) ;
} ;
-/* Send given message to the Routing Engine -- priority
- */
-Inline void
-bgp_to_routing_engine_priority(mqueue_block mqb)
-{
- mqueue_enqueue(routing_nexus->queue, mqb, 1) ;
- if (qdebug)
- bgp_queue_logging("Routing Engine", routing_nexus->queue,
- &routing_engine_queue_stats) ;
-} ;
-
#endif /* QUAGGA_BGP_ENGINE_H */
diff --git a/bgpd/bgp_main.c b/bgpd/bgp_main.c
index 434cfcfb..0de28b9b 100644
--- a/bgpd/bgp_main.c
+++ b/bgpd/bgp_main.c
@@ -299,7 +299,15 @@ bgp_exit (int status)
if (retain_mode)
if_add_hook (IF_DELETE_HOOK, NULL);
for (ALL_LIST_ELEMENTS (iflist, node, nnode, ifp))
- if_delete (ifp);
+ {
+ struct listnode *c_node, *c_nnode;
+ struct connected *c;
+
+ for (ALL_LIST_ELEMENTS (ifp->connected, c_node, c_nnode, c))
+ bgp_connected_delete (c);
+
+ if_delete (ifp);
+ }
list_free (iflist);
/* curtains */
diff --git a/bgpd/bgp_nexthop.c b/bgpd/bgp_nexthop.c
index 7e8c82ee..c72ca09f 100644
--- a/bgpd/bgp_nexthop.c
+++ b/bgpd/bgp_nexthop.c
@@ -276,6 +276,8 @@ bgp_nexthop_lookup_ipv6 (struct peer *peer, struct bgp_info *ri, int *changed,
if (bnc->metric != oldbnc->metric)
bnc->metricchanged = 1;
+
+ bgp_unlock_node (oldrn);
}
}
}
@@ -365,6 +367,8 @@ bgp_nexthop_lookup (afi_t afi, struct peer *peer, struct bgp_info *ri,
if (bnc->metric != oldbnc->metric)
bnc->metricchanged = 1;
+
+ bgp_unlock_node (oldrn);
}
}
}
@@ -571,7 +575,7 @@ bgp_connected_add (struct connected *ifc)
}
else
{
- bc = XCALLOC (0, sizeof (struct bgp_connected_ref));
+ bc = XCALLOC (MTYPE_BGP_CONN, sizeof (struct bgp_connected_ref));
bc->refcnt = 1;
rn->info = bc;
}
@@ -596,7 +600,7 @@ bgp_connected_add (struct connected *ifc)
}
else
{
- bc = XCALLOC (0, sizeof (struct bgp_connected_ref));
+ bc = XCALLOC (MTYPE_BGP_CONN, sizeof (struct bgp_connected_ref));
bc->refcnt = 1;
rn->info = bc;
}
@@ -636,7 +640,7 @@ bgp_connected_delete (struct connected *ifc)
bc->refcnt--;
if (bc->refcnt == 0)
{
- XFREE (0, bc);
+ XFREE (MTYPE_BGP_CONN, bc);
rn->info = NULL;
}
bgp_unlock_node (rn);
@@ -662,7 +666,7 @@ bgp_connected_delete (struct connected *ifc)
bc->refcnt--;
if (bc->refcnt == 0)
{
- XFREE (0, bc);
+ XFREE (MTYPE_BGP_CONN, bc);
rn->info = NULL;
}
bgp_unlock_node (rn);
@@ -1113,11 +1117,15 @@ bgp_multiaccess_check_v4 (struct in_addr nexthop, char *peer)
rn1 = bgp_node_match (bgp_connected_table[AFI_IP], &p1);
if (! rn1)
return 0;
+ bgp_unlock_node (rn1);
rn2 = bgp_node_match (bgp_connected_table[AFI_IP], &p2);
if (! rn2)
return 0;
+ bgp_unlock_node (rn2);
+ /* This is safe, even with above unlocks, since we are just
+ comparing pointers to the objects, not the objects themselves. */
if (rn1 == rn2)
return 1;
@@ -1296,6 +1304,9 @@ bgp_scan_init (void)
void
bgp_scan_finish (void)
{
+ /* Only the current one needs to be reset. */
+ bgp_nexthop_cache_reset (bgp_nexthop_cache_table[AFI_IP]);
+
bgp_table_unlock (cache1_table[AFI_IP]);
cache1_table[AFI_IP] = NULL;
@@ -1306,6 +1317,9 @@ bgp_scan_finish (void)
bgp_connected_table[AFI_IP] = NULL;
#ifdef HAVE_IPV6
+ /* Only the current one needs to be reset. */
+ bgp_nexthop_cache_reset (bgp_nexthop_cache_table[AFI_IP6]);
+
bgp_table_unlock (cache1_table[AFI_IP6]);
cache1_table[AFI_IP6] = NULL;
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 6553b3ff..ff7dada3 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -6860,7 +6860,10 @@ bgp_show_route_in_table (struct vty *vty, struct bgp *bgp,
if ((rm = bgp_node_match (table, &match)) != NULL)
{
if (prefix_check && rm->p.prefixlen != match.prefixlen)
- continue;
+ {
+ bgp_unlock_node (rm);
+ continue;
+ }
for (ri = rm->info; ri; ri = ri->info_next)
{
@@ -6874,6 +6877,8 @@ bgp_show_route_in_table (struct vty *vty, struct bgp *bgp,
display++;
route_vty_out_detail (vty, bgp, &rm->p, ri, AFI_IP, SAFI_MPLS_VPN);
}
+
+ bgp_unlock_node (rm);
}
}
}
@@ -11655,41 +11660,47 @@ bgp_clear_damp_route (struct vty *vty, const char *view_name,
if ((table = rn->info) != NULL)
if ((rm = bgp_node_match (table, &match)) != NULL)
- if (! prefix_check || rm->p.prefixlen == match.prefixlen)
- {
- ri = rm->info;
- while (ri)
- {
- if (ri->extra && ri->extra->damp_info)
- {
- ri_temp = ri->info_next;
- bgp_damp_info_free (ri->extra->damp_info, 1);
- ri = ri_temp;
- }
- else
- ri = ri->info_next;
- }
- }
+ {
+ if (! prefix_check || rm->p.prefixlen == match.prefixlen)
+ {
+ ri = rm->info;
+ while (ri)
+ {
+ if (ri->extra && ri->extra->damp_info)
+ {
+ ri_temp = ri->info_next;
+ bgp_damp_info_free (ri->extra->damp_info, 1);
+ ri = ri_temp;
+ }
+ else
+ ri = ri->info_next;
+ }
+ }
+ bgp_unlock_node (rm);
+ }
}
}
else
{
if ((rn = bgp_node_match (bgp->rib[afi][safi], &match)) != NULL)
- if (! prefix_check || rn->p.prefixlen == match.prefixlen)
- {
- ri = rn->info;
- while (ri)
- {
- if (ri->extra && ri->extra->damp_info)
- {
- ri_temp = ri->info_next;
- bgp_damp_info_free (ri->extra->damp_info, 1);
- ri = ri_temp;
- }
- else
- ri = ri->info_next;
- }
- }
+ {
+ if (! prefix_check || rn->p.prefixlen == match.prefixlen)
+ {
+ ri = rn->info;
+ while (ri)
+ {
+ if (ri->extra && ri->extra->damp_info)
+ {
+ ri_temp = ri->info_next;
+ bgp_damp_info_free (ri->extra->damp_info, 1);
+ ri = ri_temp;
+ }
+ else
+ ri = ri->info_next;
+ }
+ }
+ bgp_unlock_node (rn);
+ }
}
return CMD_SUCCESS;
diff --git a/bgpd/bgp_session.c b/bgpd/bgp_session.c
index 1334298e..8d8bfea2 100644
--- a/bgpd/bgp_session.c
+++ b/bgpd/bgp_session.c
@@ -325,7 +325,7 @@ bgp_session_enable(bgp_peer peer)
++bgp_engine_queue_stats.event ;
- bgp_to_bgp_engine(mqb) ;
+ bgp_to_bgp_engine(mqb, mqb_ordinary) ;
} ;
/*------------------------------------------------------------------------------
@@ -426,7 +426,7 @@ bgp_session_disable(bgp_peer peer, bgp_notify notification)
++bgp_engine_queue_stats.event ;
- bgp_to_bgp_engine_priority(mqb) ;
+ bgp_to_bgp_engine(mqb, mqb_priority) ;
} ;
/*------------------------------------------------------------------------------
@@ -464,7 +464,7 @@ bgp_session_event(bgp_session session, bgp_session_event_t event,
bgp_notify notification,
int err,
bgp_connection_ord_t ordinal,
- int stopped)
+ bool stopped)
{
struct bgp_session_event_args* args ;
mqueue_block mqb ;
@@ -484,7 +484,7 @@ bgp_session_event(bgp_session session, bgp_session_event_t event,
++routing_engine_queue_stats.event ;
- bgp_to_routing_engine(mqb) ;
+ bgp_to_routing_engine(mqb, stopped ? mqb_priority : mqb_ordinary) ;
} ;
/*==============================================================================
@@ -509,7 +509,7 @@ bgp_session_update_send(bgp_session session, struct stream_fifo* fifo)
++bgp_engine_queue_stats.update ;
- bgp_to_bgp_engine(mqb) ;
+ bgp_to_bgp_engine(mqb, mqb_ordinary) ;
stream_fifo_reset(fifo) ;
} ;
@@ -637,7 +637,7 @@ bgp_session_route_refresh_send(bgp_session session, bgp_route_refresh rr)
++bgp_engine_queue_stats.event ;
- bgp_to_bgp_engine(mqb) ;
+ bgp_to_bgp_engine(mqb, mqb_ordinary) ;
} ;
/*------------------------------------------------------------------------------
@@ -702,7 +702,7 @@ bgp_session_end_of_rib_send(bgp_session session, qAFI_t afi, qSAFI_t safi)
++bgp_engine_queue_stats.xon ;
- bgp_to_bgp_engine(mqb) ;
+ bgp_to_bgp_engine(mqb, mqb_ordinary) ;
} ;
/*------------------------------------------------------------------------------
@@ -769,7 +769,7 @@ bgp_session_update_recv(bgp_session session, struct stream* buf, bgp_size_t size
++routing_engine_queue_stats.update ;
- bgp_to_routing_engine(mqb) ;
+ bgp_to_routing_engine(mqb, mqb_ordinary) ;
}
/*------------------------------------------------------------------------------
@@ -813,7 +813,7 @@ bgp_session_route_refresh_recv(bgp_session session, bgp_route_refresh rr)
args->rr = rr ;
args->is_pending = NULL ;
- bgp_to_routing_engine(mqb) ;
+ bgp_to_routing_engine(mqb, mqb_ordinary) ;
} ;
/*------------------------------------------------------------------------------
@@ -849,7 +849,7 @@ bgp_session_XON(bgp_session session)
++routing_engine_queue_stats.xon ;
- bgp_to_routing_engine(mqb) ;
+ bgp_to_routing_engine(mqb, mqb_ordinary) ;
}
/*------------------------------------------------------------------------------
@@ -888,7 +888,7 @@ bgp_session_set_ttl(bgp_session session, int ttl)
++bgp_engine_queue_stats.event ;
- bgp_to_bgp_engine(mqb) ;
+ bgp_to_bgp_engine(mqb, mqb_ordinary) ;
}
/*------------------------------------------------------------------------------
diff --git a/bgpd/bgp_session.h b/bgpd/bgp_session.h
index 615c6829..6f449bec 100644
--- a/bgpd/bgp_session.h
+++ b/bgpd/bgp_session.h
@@ -22,6 +22,7 @@
#ifndef _QUAGGA_BGP_SESSION_H
#define _QUAGGA_BGP_SESSION_H
+#include <stdbool.h>
#include <zebra.h>
#include "bgpd/bgp_common.h"
@@ -324,7 +325,7 @@ bgp_session_event(bgp_session session, bgp_session_event_t event,
bgp_notify notification,
int err,
bgp_connection_ord_t ordinal,
- int stopped) ;
+ bool stopped) ;
extern void
bgp_session_update_send(bgp_session session, struct stream_fifo* fifo) ;