diff options
Diffstat (limited to 'bgpd/bgp_advertise.c')
| -rw-r--r-- | bgpd/bgp_advertise.c | 61 |
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; } |
