Skip to content

Commit

Permalink
bgpd: Convert the bgp_advertise_attr->adv to a fifo
Browse files Browse the repository at this point in the history
BGP is storing outgoing updates in a couple of different
fifo's.  This is to ensure proper packet packing of
all bgp_dests that happen to use the same attribute.

How it's all put together currently:  On initial update
BGP walks through all the bgp_dest's in a table.  For each
path being sent a bgp_advertise is created.  This bgp_advertise
is placed in fifo order on the bgp_synchronize->update queue.
The bgp_advertise has a pointer to the bgp_advertise_attr which
is associated iwth the actual attribute that is being sent to
it's peer.  In turn this bgp_advertise is placed in a fifo off
of the bgp_advertise_attr structure.  As such as we have paths
that share an attribute, the path/dest is placed on the
bgp_syncrhonize->update fifo as well as being placed on the fifo
associated with the advertised attribute.

On actual creation of a packet.  The first item in the
bgp_synchronize->update fifo is popped.  The bgp_advertise_attr
pointer is grabbed, we fill out the nlri part of the bgp packet
and then walk the bgp_advertise_attr fifo to place paths/dests in
the packet.  As each path/dest is placed in the packet it is removed
from both the bgp_synchronize->update fifo and the bgp_advertise_attr
fifo.

The whole point of this change is to switch the *next, *prev
pointers in the bgp_advertise structure with a typesafe data
structure.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
(cherry picked from commit b2e0c12)

# Conflicts:
#	bgpd/bgp_advertise.c
  • Loading branch information
donaldsharp authored and Mark Stapp committed Mar 26, 2024
1 parent 9d97725 commit 7cc87f1
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 24 deletions.
17 changes: 7 additions & 10 deletions bgpd/bgp_advertise.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand All @@ -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;
}

Expand Down Expand Up @@ -83,21 +88,13 @@ 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;
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,
Expand Down
32 changes: 19 additions & 13 deletions bgpd/bgp_advertise.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,26 +11,19 @@
PREDECL_DLIST(bgp_adv_fifo);

struct update_subgroup;
struct bgp_advertise;

/* BGP advertise attribute. */
struct bgp_advertise_attr {
/* Head of advertisement pointer. */
struct bgp_advertise *adv;
PREDECL_DLIST(bgp_advertise_attr_fifo);

/* Reference counter. */
unsigned long refcnt;

/* Attribute pointer to be announced. */
struct attr *attr;
};
struct bgp_advertise_attr;

/* BGP advertise attribute. */
struct bgp_advertise {
/* FIFO for advertisement. */
struct bgp_adv_fifo_item fifo;

/* Link list for same attribute advertise. */
struct bgp_advertise *next;
struct bgp_advertise *prev;
/* FIFO for this item in the bgp_advertise_attr fifo */
struct bgp_advertise_attr_fifo_item item;

/* Prefix information. */
struct bgp_dest *dest;
Expand All @@ -45,8 +38,21 @@ struct bgp_advertise {
struct bgp_path_info *pathi;
};

DECLARE_DLIST(bgp_advertise_attr_fifo, struct bgp_advertise, item);
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. */
struct bgp_adj_out {
/* RB Tree of adjacency entries */
Expand Down
2 changes: 1 addition & 1 deletion bgpd/bgp_updgrp_adv.c
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,7 @@ bgp_advertise_clean_subgroup(struct update_subgroup *subgrp,
bgp_advertise_delete(baa, adv);

/* Fetch next advertise candidate. */
next = baa->adv;
next = bgp_advertise_attr_fifo_first(&baa->fifo);

/* Unintern BGP advertise attribute. */
bgp_advertise_attr_unintern(subgrp->hash, baa);
Expand Down

0 comments on commit 7cc87f1

Please sign in to comment.