diff options
Diffstat (limited to 'bgpd/bgp_advertise.c')
| -rw-r--r-- | bgpd/bgp_advertise.c | 332 |
1 files changed, 155 insertions, 177 deletions
diff --git a/bgpd/bgp_advertise.c b/bgpd/bgp_advertise.c index da5ab94e97..91a60b72a0 100644 --- a/bgpd/bgp_advertise.c +++ b/bgpd/bgp_advertise.c @@ -43,249 +43,227 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA /* BGP advertise attribute is used for pack same attribute update into one packet. To do that we maintain attribute hash in struct peer. */ -struct bgp_advertise_attr * -baa_new (void) +struct bgp_advertise_attr *baa_new(void) { - return (struct bgp_advertise_attr *) - XCALLOC (MTYPE_BGP_ADVERTISE_ATTR, sizeof (struct bgp_advertise_attr)); + return (struct bgp_advertise_attr *)XCALLOC( + MTYPE_BGP_ADVERTISE_ATTR, sizeof(struct bgp_advertise_attr)); } -static void -baa_free (struct bgp_advertise_attr *baa) +static void baa_free(struct bgp_advertise_attr *baa) { - XFREE (MTYPE_BGP_ADVERTISE_ATTR, baa); + XFREE(MTYPE_BGP_ADVERTISE_ATTR, baa); } -static void * -baa_hash_alloc (void *p) +static void *baa_hash_alloc(void *p) { - struct bgp_advertise_attr * ref = (struct bgp_advertise_attr *) p; - struct bgp_advertise_attr *baa; + struct bgp_advertise_attr *ref = (struct bgp_advertise_attr *)p; + struct bgp_advertise_attr *baa; - baa = baa_new (); - baa->attr = ref->attr; - return baa; + baa = baa_new(); + baa->attr = ref->attr; + return baa; } -unsigned int -baa_hash_key (void *p) +unsigned int baa_hash_key(void *p) { - struct bgp_advertise_attr * baa = (struct bgp_advertise_attr *) p; + struct bgp_advertise_attr *baa = (struct bgp_advertise_attr *)p; - return attrhash_key_make (baa->attr); + return attrhash_key_make(baa->attr); } -int -baa_hash_cmp (const void *p1, const void *p2) +int baa_hash_cmp(const void *p1, const void *p2) { - const struct bgp_advertise_attr * baa1 = p1; - const struct bgp_advertise_attr * baa2 = p2; + const struct bgp_advertise_attr *baa1 = p1; + const struct bgp_advertise_attr *baa2 = p2; - return attrhash_cmp (baa1->attr, baa2->attr); + return attrhash_cmp(baa1->attr, baa2->attr); } /* BGP update and withdraw information is stored in BGP advertise structure. This structure is referred from BGP adjacency information. */ -struct bgp_advertise * -bgp_advertise_new (void) +struct bgp_advertise *bgp_advertise_new(void) { - return (struct bgp_advertise *) - XCALLOC (MTYPE_BGP_ADVERTISE, sizeof (struct bgp_advertise)); + return (struct bgp_advertise *)XCALLOC(MTYPE_BGP_ADVERTISE, + sizeof(struct bgp_advertise)); } -void -bgp_advertise_free (struct bgp_advertise *adv) +void bgp_advertise_free(struct bgp_advertise *adv) { - if (adv->binfo) - bgp_info_unlock (adv->binfo); /* bgp_advertise bgp_info reference */ - XFREE (MTYPE_BGP_ADVERTISE, adv); + if (adv->binfo) + bgp_info_unlock( + adv->binfo); /* bgp_advertise bgp_info reference */ + XFREE(MTYPE_BGP_ADVERTISE, adv); } -void -bgp_advertise_add (struct bgp_advertise_attr *baa, - 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; + adv->next = baa->adv; + if (baa->adv) + baa->adv->prev = adv; + baa->adv = adv; } -void -bgp_advertise_delete (struct bgp_advertise_attr *baa, - struct bgp_advertise *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; + if (adv->next) + adv->next->prev = adv->prev; + if (adv->prev) + adv->prev->next = adv->next; + else + baa->adv = adv->next; } -struct bgp_advertise_attr * -bgp_advertise_intern (struct hash *hash, struct attr *attr) +struct bgp_advertise_attr *bgp_advertise_intern(struct hash *hash, + struct attr *attr) { - struct bgp_advertise_attr ref; - struct bgp_advertise_attr *baa; + struct bgp_advertise_attr ref; + struct bgp_advertise_attr *baa; - ref.attr = bgp_attr_intern (attr); - baa = (struct bgp_advertise_attr *) hash_get (hash, &ref, baa_hash_alloc); - baa->refcnt++; + ref.attr = bgp_attr_intern(attr); + baa = (struct bgp_advertise_attr *)hash_get(hash, &ref, baa_hash_alloc); + baa->refcnt++; - return baa; + return baa; } -void -bgp_advertise_unintern (struct hash *hash, struct bgp_advertise_attr *baa) +void bgp_advertise_unintern(struct hash *hash, struct bgp_advertise_attr *baa) { - if (baa->refcnt) - baa->refcnt--; - - if (baa->refcnt && baa->attr) - bgp_attr_unintern (&baa->attr); - else - { - if (baa->attr) - { - hash_release (hash, baa); - bgp_attr_unintern (&baa->attr); + if (baa->refcnt) + baa->refcnt--; + + if (baa->refcnt && baa->attr) + bgp_attr_unintern(&baa->attr); + else { + if (baa->attr) { + hash_release(hash, baa); + bgp_attr_unintern(&baa->attr); + } + baa_free(baa); } - baa_free (baa); - } } -int -bgp_adj_out_lookup (struct peer *peer, struct bgp_node *rn, - u_int32_t addpath_tx_id) +int bgp_adj_out_lookup(struct peer *peer, struct bgp_node *rn, + u_int32_t addpath_tx_id) { - struct bgp_adj_out *adj; - struct peer_af *paf; - afi_t afi; - safi_t safi; - int addpath_capable; - - for (adj = rn->adj_out; adj; adj = adj->next) - SUBGRP_FOREACH_PEER(adj->subgroup, paf) - if (paf->peer == peer) - { - afi = SUBGRP_AFI (adj->subgroup); - safi = SUBGRP_SAFI (adj->subgroup); - addpath_capable = bgp_addpath_encode_tx (peer, afi, safi); - - /* Match on a specific addpath_tx_id if we are using addpath for this - * peer and if an addpath_tx_id was specified */ - if (addpath_capable && addpath_tx_id && adj->addpath_tx_id != addpath_tx_id) - continue; - - return (adj->adv - ? (adj->adv->baa ? 1 : 0) - : (adj->attr ? 1 : 0)); + struct bgp_adj_out *adj; + struct peer_af *paf; + afi_t afi; + safi_t safi; + int addpath_capable; + + for (adj = rn->adj_out; adj; adj = adj->next) + SUBGRP_FOREACH_PEER(adj->subgroup, paf) + if (paf->peer == peer) { + afi = SUBGRP_AFI(adj->subgroup); + safi = SUBGRP_SAFI(adj->subgroup); + addpath_capable = bgp_addpath_encode_tx(peer, afi, safi); + + /* Match on a specific addpath_tx_id if we are using addpath for + * this + * peer and if an addpath_tx_id was specified */ + if (addpath_capable && addpath_tx_id + && adj->addpath_tx_id != addpath_tx_id) + continue; + + return (adj->adv ? (adj->adv->baa ? 1 : 0) + : (adj->attr ? 1 : 0)); } - return 0; + return 0; } -void -bgp_adj_in_set (struct bgp_node *rn, struct peer *peer, struct attr *attr, - u_int32_t addpath_id) +void bgp_adj_in_set(struct bgp_node *rn, struct peer *peer, struct attr *attr, + u_int32_t addpath_id) { - struct bgp_adj_in *adj; - - for (adj = rn->adj_in; adj; adj = adj->next) - { - if (adj->peer == peer && adj->addpath_rx_id == addpath_id) - { - if (adj->attr != attr) - { - bgp_attr_unintern (&adj->attr); - adj->attr = bgp_attr_intern (attr); - } - return; + struct bgp_adj_in *adj; + + for (adj = rn->adj_in; adj; adj = adj->next) { + if (adj->peer == peer && adj->addpath_rx_id == addpath_id) { + if (adj->attr != attr) { + bgp_attr_unintern(&adj->attr); + adj->attr = bgp_attr_intern(attr); + } + return; + } } - } - adj = XCALLOC (MTYPE_BGP_ADJ_IN, sizeof (struct bgp_adj_in)); - adj->peer = peer_lock (peer); /* adj_in peer reference */ - adj->attr = bgp_attr_intern (attr); - adj->addpath_rx_id = addpath_id; - BGP_ADJ_IN_ADD (rn, adj); - bgp_lock_node (rn); + adj = XCALLOC(MTYPE_BGP_ADJ_IN, sizeof(struct bgp_adj_in)); + adj->peer = peer_lock(peer); /* adj_in peer reference */ + adj->attr = bgp_attr_intern(attr); + adj->addpath_rx_id = addpath_id; + BGP_ADJ_IN_ADD(rn, adj); + bgp_lock_node(rn); } -void -bgp_adj_in_remove (struct bgp_node *rn, struct bgp_adj_in *bai) +void bgp_adj_in_remove(struct bgp_node *rn, struct bgp_adj_in *bai) { - bgp_attr_unintern (&bai->attr); - BGP_ADJ_IN_DEL (rn, bai); - peer_unlock (bai->peer); /* adj_in peer reference */ - XFREE (MTYPE_BGP_ADJ_IN, bai); + bgp_attr_unintern(&bai->attr); + BGP_ADJ_IN_DEL(rn, bai); + peer_unlock(bai->peer); /* adj_in peer reference */ + XFREE(MTYPE_BGP_ADJ_IN, bai); } -int -bgp_adj_in_unset (struct bgp_node *rn, struct peer *peer, - u_int32_t addpath_id) +int bgp_adj_in_unset(struct bgp_node *rn, struct peer *peer, + u_int32_t addpath_id) { - struct bgp_adj_in *adj; - struct bgp_adj_in *adj_next; + struct bgp_adj_in *adj; + struct bgp_adj_in *adj_next; - adj = rn->adj_in; + adj = rn->adj_in; - if (!adj) - return 0; + if (!adj) + return 0; - while (adj) - { - adj_next = adj->next; + while (adj) { + adj_next = adj->next; - if (adj->peer == peer && adj->addpath_rx_id == addpath_id) - { - bgp_adj_in_remove (rn, adj); - bgp_unlock_node (rn); - } + if (adj->peer == peer && adj->addpath_rx_id == addpath_id) { + bgp_adj_in_remove(rn, adj); + bgp_unlock_node(rn); + } - adj = adj_next; - } + adj = adj_next; + } - return 1; + return 1; } -void -bgp_sync_init (struct peer *peer) +void bgp_sync_init(struct peer *peer) { - afi_t afi; - safi_t safi; - struct bgp_synchronize *sync; - - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; 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; - peer->hash[afi][safi] = hash_create (baa_hash_key, baa_hash_cmp); - } + afi_t afi; + safi_t safi; + struct bgp_synchronize *sync; + + for (afi = AFI_IP; afi < AFI_MAX; afi++) + for (safi = SAFI_UNICAST; safi < SAFI_MAX; 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; + peer->hash[afi][safi] = + hash_create(baa_hash_key, baa_hash_cmp); + } } -void -bgp_sync_delete (struct peer *peer) +void bgp_sync_delete(struct peer *peer) { - afi_t afi; - safi_t safi; - - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) - { - if (peer->sync[afi][safi]) - XFREE (MTYPE_BGP_SYNCHRONISE, peer->sync[afi][safi]); - peer->sync[afi][safi] = NULL; - - if (peer->hash[afi][safi]) - hash_free (peer->hash[afi][safi]); - peer->hash[afi][safi] = NULL; - } + afi_t afi; + safi_t safi; + + for (afi = AFI_IP; afi < AFI_MAX; afi++) + for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { + if (peer->sync[afi][safi]) + XFREE(MTYPE_BGP_SYNCHRONISE, + peer->sync[afi][safi]); + peer->sync[afi][safi] = NULL; + + if (peer->hash[afi][safi]) + hash_free(peer->hash[afi][safi]); + peer->hash[afi][safi] = NULL; + } } |
