summaryrefslogtreecommitdiffstats
path: root/bgpd/bgp_advertise.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_advertise.c')
-rw-r--r--bgpd/bgp_advertise.c43
1 files changed, 30 insertions, 13 deletions
diff --git a/bgpd/bgp_advertise.c b/bgpd/bgp_advertise.c
index 7246bab1..37fad456 100644
--- a/bgpd/bgp_advertise.c
+++ b/bgpd/bgp_advertise.c
@@ -101,24 +101,40 @@ bgp_advertise_free (struct bgp_advertise *adv)
static void
bgp_advertise_add (struct bgp_advertise_attr *baa,
- struct bgp_advertise *adv)
+ bgp_advertise adv)
{
- adv->adv_next = baa->adv;
- if (baa->adv)
- baa->adv->adv_prev = adv;
- baa->adv = adv;
+ bgp_advertise last ;
+
+ if (baa->base.head == NULL)
+ {
+ last = NULL ;
+ baa->base.head = adv ;
+ }
+ else
+ {
+ last = baa->base.tail ;
+ last->adv_next = adv ;
+ } ;
+
+ adv->adv_next = NULL ;
+ adv->adv_prev = last ;
+
+ baa->base.tail = adv ;
}
static void
bgp_advertise_delete (struct bgp_advertise_attr *baa,
struct bgp_advertise *adv)
{
- if (adv->adv_next)
+ if (adv->adv_next != NULL)
adv->adv_next->adv_prev = adv->adv_prev;
- if (adv->adv_prev)
+ else
+ baa->base.tail = adv->adv_prev ;
+
+ if (adv->adv_prev != NULL)
adv->adv_prev->adv_next = adv->adv_next;
else
- baa->adv = adv->adv_next;
+ baa->base.head = adv->adv_next;
}
static struct bgp_advertise_attr *
@@ -191,7 +207,7 @@ bgp_advertise_clean (struct peer *peer, struct bgp_adj_out *adj,
bgp_advertise_delete (baa, adv);
/* Fetch next advertise candidate. */
- next = baa->adv;
+ next = baa->base.head ;
/* Unintern BGP advertise attribute. */
bgp_advertise_unintern (peer->hash[afi][safi], baa);
@@ -296,10 +312,10 @@ bgp_adj_out_unset (struct bgp_node *rn, struct peer *peer, struct prefix *p,
assert(rn == adj->rn) ;
/* Clear up previous advertisement. */
- if (adj->adv)
+ if (adj->adv != NULL)
bgp_advertise_clean (peer, adj, afi, safi);
- if (adj->attr)
+ if (adj->attr != NULL)
{
/* We need advertisement structure. */
adj->adv = bgp_advertise_new ();
@@ -310,8 +326,9 @@ bgp_adj_out_unset (struct bgp_node *rn, struct peer *peer, struct prefix *p,
/* Add to synchronization entry for withdraw announcement */
bgp_advertise_fifo_add(&peer->sync[afi][safi]->withdraw, adv);
- /* Schedule packet write. */
- bgp_write(peer, NULL) ;
+ /* Schedule flush of withdraws
+ */
+ bgp_withdraw_schedule(peer) ;
}
else
bgp_adj_out_remove(rn, adj, peer, afi, safi) ;