Merge pull request #14554 from donaldsharp/bgp_fifo

bgpd: Convert the bgp_advertise_attr->adv to a fifo
This commit is contained in:
Donatas Abraitis 2023-10-11 13:31:04 +03:00 committed by GitHub
commit aeede097b4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 40 deletions

View File

@ -36,6 +36,8 @@ struct bgp_advertise_attr *bgp_advertise_attr_new(void)
void bgp_advertise_attr_free(struct bgp_advertise_attr *baa) void bgp_advertise_attr_free(struct bgp_advertise_attr *baa)
{ {
bgp_advertise_attr_fifo_fini(&baa->fifo);
XFREE(MTYPE_BGP_ADVERTISE_ATTR, baa); 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 = bgp_advertise_attr_new();
baa->attr = ref->attr; baa->attr = ref->attr;
bgp_advertise_attr_fifo_init(&baa->fifo);
return baa; return baa;
} }
@ -83,36 +88,13 @@ void bgp_advertise_free(struct bgp_advertise *adv)
void bgp_advertise_add(struct bgp_advertise_attr *baa, void bgp_advertise_add(struct bgp_advertise_attr *baa,
struct bgp_advertise *adv) struct bgp_advertise *adv)
{ {
struct bgp_advertise *spot, *prev = NULL; bgp_advertise_attr_fifo_add_tail(&baa->fifo, adv);
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, void bgp_advertise_delete(struct bgp_advertise_attr *baa,
struct bgp_advertise *adv) struct bgp_advertise *adv)
{ {
if (adv->next) bgp_advertise_attr_fifo_del(&baa->fifo, adv);
adv->next->prev = adv->prev;
if (adv->prev)
adv->prev->next = adv->next;
else
baa->adv = adv->next;
} }
struct bgp_advertise_attr *bgp_advertise_attr_intern(struct hash *hash, struct bgp_advertise_attr *bgp_advertise_attr_intern(struct hash *hash,

View File

@ -11,26 +11,19 @@
PREDECL_DLIST(bgp_adv_fifo); PREDECL_DLIST(bgp_adv_fifo);
struct update_subgroup; struct update_subgroup;
struct bgp_advertise;
PREDECL_DLIST(bgp_advertise_attr_fifo);
struct bgp_advertise_attr;
/* BGP advertise attribute. */ /* BGP advertise attribute. */
struct bgp_advertise_attr {
/* Head of advertisement pointer. */
struct bgp_advertise *adv;
/* Reference counter. */
unsigned long refcnt;
/* Attribute pointer to be announced. */
struct attr *attr;
};
struct bgp_advertise { struct bgp_advertise {
/* FIFO for advertisement. */ /* FIFO for advertisement. */
struct bgp_adv_fifo_item fifo; struct bgp_adv_fifo_item fifo;
/* Link list for same attribute advertise. */ /* FIFO for this item in the bgp_advertise_attr fifo */
struct bgp_advertise *next; struct bgp_advertise_attr_fifo_item item;
struct bgp_advertise *prev;
/* Prefix information. */ /* Prefix information. */
struct bgp_dest *dest; struct bgp_dest *dest;
@ -45,8 +38,21 @@ struct bgp_advertise {
struct bgp_path_info *pathi; struct bgp_path_info *pathi;
}; };
DECLARE_DLIST(bgp_advertise_attr_fifo, struct bgp_advertise, item);
DECLARE_DLIST(bgp_adv_fifo, struct bgp_advertise, fifo); DECLARE_DLIST(bgp_adv_fifo, struct bgp_advertise, fifo);
/* BGP advertise attribute. */
struct bgp_advertise_attr {
/* Head of advertisement pointer. */
struct bgp_advertise_attr_fifo_head fifo;
/* Reference counter. */
unsigned long refcnt;
/* Attribute pointer to be announced. */
struct attr *attr;
};
/* BGP adjacency out. */ /* BGP adjacency out. */
struct bgp_adj_out { struct bgp_adj_out {
/* RB Tree of adjacency entries */ /* RB Tree of adjacency entries */

View File

@ -479,7 +479,7 @@ bgp_advertise_clean_subgroup(struct update_subgroup *subgrp,
bgp_advertise_delete(baa, adv); bgp_advertise_delete(baa, adv);
/* Fetch next advertise candidate. */ /* Fetch next advertise candidate. */
next = baa->adv; next = bgp_advertise_attr_fifo_first(&baa->fifo);
/* Unintern BGP advertise attribute. */ /* Unintern BGP advertise attribute. */
bgp_advertise_attr_unintern(subgrp->hash, baa); bgp_advertise_attr_unintern(subgrp->hash, baa);