summaryrefslogtreecommitdiff
path: root/bgpd/bgp_advertise.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_advertise.c')
-rw-r--r--bgpd/bgp_advertise.c61
1 files changed, 26 insertions, 35 deletions
diff --git a/bgpd/bgp_advertise.c b/bgpd/bgp_advertise.c
index 9686b08a98..17d6592c0f 100644
--- a/bgpd/bgp_advertise.c
+++ b/bgpd/bgp_advertise.c
@@ -83,10 +83,25 @@ void bgp_advertise_free(struct bgp_advertise *adv)
void bgp_advertise_add(struct bgp_advertise_attr *baa,
struct bgp_advertise *adv)
{
- adv->next = baa->adv;
- if (baa->adv)
- baa->adv->prev = adv;
- baa->adv = adv;
+ struct bgp_advertise *spot, *prev = NULL;
+
+ spot = baa->adv;
+
+ while (spot) {
+ prev = spot;
+ spot = spot->next;
+ }
+
+ if (prev) {
+ prev->next = adv;
+ adv->prev = prev;
+ } else
+ adv->prev = NULL;
+
+ adv->next = NULL;
+
+ if (!baa->adv)
+ baa->adv = adv;
}
void bgp_advertise_delete(struct bgp_advertise_attr *baa,
@@ -188,22 +203,22 @@ void bgp_adj_in_set(struct bgp_dest *dest, struct peer *peer, struct attr *attr,
bgp_dest_lock_node(dest);
}
-void bgp_adj_in_remove(struct bgp_dest *dest, struct bgp_adj_in *bai)
+void bgp_adj_in_remove(struct bgp_dest **dest, struct bgp_adj_in *bai)
{
bgp_attr_unintern(&bai->attr);
- BGP_ADJ_IN_DEL(dest, bai);
- bgp_dest_unlock_node(dest);
+ BGP_ADJ_IN_DEL(*dest, bai);
+ *dest = bgp_dest_unlock_node(*dest);
peer_unlock(bai->peer); /* adj_in peer reference */
XFREE(MTYPE_BGP_ADJ_IN, bai);
}
-bool bgp_adj_in_unset(struct bgp_dest *dest, struct peer *peer,
+bool bgp_adj_in_unset(struct bgp_dest **dest, struct peer *peer,
uint32_t addpath_id)
{
struct bgp_adj_in *adj;
struct bgp_adj_in *adj_next;
- adj = dest->adj_in;
+ adj = (*dest)->adj_in;
if (!adj)
return false;
@@ -215,33 +230,9 @@ bool bgp_adj_in_unset(struct bgp_dest *dest, struct peer *peer,
bgp_adj_in_remove(dest, adj);
adj = adj_next;
- }
-
- return true;
-}
-void bgp_sync_init(struct peer *peer)
-{
- afi_t afi;
- safi_t safi;
- struct bgp_synchronize *sync;
-
- FOREACH_AFI_SAFI (afi, safi) {
- sync = XCALLOC(MTYPE_BGP_SYNCHRONISE,
- sizeof(struct bgp_synchronize));
- bgp_adv_fifo_init(&sync->update);
- bgp_adv_fifo_init(&sync->withdraw);
- bgp_adv_fifo_init(&sync->withdraw_low);
- peer->sync[afi][safi] = sync;
+ assert(*dest);
}
-}
-
-void bgp_sync_delete(struct peer *peer)
-{
- afi_t afi;
- safi_t safi;
- FOREACH_AFI_SAFI (afi, safi) {
- XFREE(MTYPE_BGP_SYNCHRONISE, peer->sync[afi][safi]);
- }
+ return true;
}