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.c34
1 files changed, 8 insertions, 26 deletions
diff --git a/bgpd/bgp_advertise.c b/bgpd/bgp_advertise.c
index 17d6592..a81f288 100644
--- a/bgpd/bgp_advertise.c
+++ b/bgpd/bgp_advertise.c
@@ -36,6 +36,8 @@ struct bgp_advertise_attr *bgp_advertise_attr_new(void)
void bgp_advertise_attr_free(struct bgp_advertise_attr *baa)
{
+ bgp_advertise_attr_fifo_fini(&baa->fifo);
+
XFREE(MTYPE_BGP_ADVERTISE_ATTR, baa);
}
@@ -46,6 +48,9 @@ static void *bgp_advertise_attr_hash_alloc(void *p)
baa = bgp_advertise_attr_new();
baa->attr = ref->attr;
+
+ bgp_advertise_attr_fifo_init(&baa->fifo);
+
return baa;
}
@@ -83,36 +88,13 @@ void bgp_advertise_free(struct bgp_advertise *adv)
void bgp_advertise_add(struct bgp_advertise_attr *baa,
struct bgp_advertise *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;
+ bgp_advertise_attr_fifo_add_tail(&baa->fifo, adv);
}
void bgp_advertise_delete(struct bgp_advertise_attr *baa,
struct bgp_advertise *adv)
{
- if (adv->next)
- adv->next->prev = adv->prev;
- if (adv->prev)
- adv->prev->next = adv->next;
- else
- baa->adv = adv->next;
+ bgp_advertise_attr_fifo_del(&baa->fifo, adv);
}
struct bgp_advertise_attr *bgp_advertise_attr_intern(struct hash *hash,
@@ -187,7 +169,7 @@ void bgp_adj_in_set(struct bgp_dest *dest, struct peer *peer, struct attr *attr,
for (adj = dest->adj_in; adj; adj = adj->next) {
if (adj->peer == peer && adj->addpath_rx_id == addpath_id) {
- if (adj->attr != attr) {
+ if (!attrhash_cmp(adj->attr, attr)) {
bgp_attr_unintern(&adj->attr);
adj->attr = bgp_attr_intern(attr);
}