From 05c7a1cc93f81ad12424fc9744c60dc722ff459b Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Tue, 21 Nov 2017 13:02:06 -0500 Subject: [PATCH] bgpd: use FOREACH_AFI_SAFI where possible Improves consistency and readability. Signed-off-by: Quentin Young --- bgpd/bgp_advertise.c | 41 ++- bgpd/bgp_fsm.c | 120 ++++---- bgpd/bgp_open.c | 216 +++++++------- bgpd/bgp_packet.c | 187 ++++++------ bgpd/bgp_route.c | 173 +++++------ bgpd/bgp_routemap.c | 145 +++++----- bgpd/bgp_vty.c | 670 +++++++++++++++++++------------------------ bgpd/bgpd.c | 427 +++++++++++++-------------- 8 files changed, 903 insertions(+), 1076 deletions(-) diff --git a/bgpd/bgp_advertise.c b/bgpd/bgp_advertise.c index 2c83de89e0..840cc35751 100644 --- a/bgpd/bgp_advertise.c +++ b/bgpd/bgp_advertise.c @@ -239,19 +239,16 @@ void bgp_sync_init(struct peer *peer) 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, - "BGP Sync Hash"); - } + FOREACH_AFI_SAFI (afi, 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, + "BGP Sync Hash"); + } } void bgp_sync_delete(struct peer *peer) @@ -259,15 +256,13 @@ 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; + FOREACH_AFI_SAFI (afi, 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; - } + if (peer->hash[afi][safi]) + hash_free(peer->hash[afi][safi]); + peer->hash[afi][safi] = NULL; + } } diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index aa350d3dd4..8de7e970de 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -181,22 +181,15 @@ static struct peer *peer_xfer_conn(struct peer *from_peer) from_peer->domainname = NULL; } - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - peer->af_flags[afi][safi] = - from_peer->af_flags[afi][safi]; - peer->af_sflags[afi][safi] = - from_peer->af_sflags[afi][safi]; - peer->af_cap[afi][safi] = from_peer->af_cap[afi][safi]; - peer->afc_nego[afi][safi] = - from_peer->afc_nego[afi][safi]; - peer->afc_adv[afi][safi] = - from_peer->afc_adv[afi][safi]; - peer->afc_recv[afi][safi] = - from_peer->afc_recv[afi][safi]; - peer->orf_plist[afi][safi] = - from_peer->orf_plist[afi][safi]; - } + FOREACH_AFI_SAFI (afi, safi) { + peer->af_flags[afi][safi] = from_peer->af_flags[afi][safi]; + peer->af_sflags[afi][safi] = from_peer->af_sflags[afi][safi]; + peer->af_cap[afi][safi] = from_peer->af_cap[afi][safi]; + peer->afc_nego[afi][safi] = from_peer->afc_nego[afi][safi]; + peer->afc_adv[afi][safi] = from_peer->afc_adv[afi][safi]; + peer->afc_recv[afi][safi] = from_peer->afc_recv[afi][safi]; + peer->orf_plist[afi][safi] = from_peer->orf_plist[afi][safi]; + } if (bgp_getsockname(peer) < 0) { zlog_err( @@ -1070,30 +1063,28 @@ int bgp_stop(struct peer *peer) peer->fd = -1; } - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - /* Reset all negotiated variables */ - peer->afc_nego[afi][safi] = 0; - peer->afc_adv[afi][safi] = 0; - peer->afc_recv[afi][safi] = 0; - - /* peer address family capability flags*/ - peer->af_cap[afi][safi] = 0; - - /* peer address family status flags*/ - peer->af_sflags[afi][safi] = 0; - - /* Received ORF prefix-filter */ - peer->orf_plist[afi][safi] = NULL; - - if ((peer->status == OpenConfirm) - || (peer->status == Established)) { - /* ORF received prefix-filter pnt */ - sprintf(orf_name, "%s.%d.%d", peer->host, afi, - safi); - prefix_bgp_orf_remove_all(afi, orf_name); - } + FOREACH_AFI_SAFI (afi, safi) { + /* Reset all negotiated variables */ + peer->afc_nego[afi][safi] = 0; + peer->afc_adv[afi][safi] = 0; + peer->afc_recv[afi][safi] = 0; + + /* peer address family capability flags*/ + peer->af_cap[afi][safi] = 0; + + /* peer address family status flags*/ + peer->af_sflags[afi][safi] = 0; + + /* Received ORF prefix-filter */ + peer->orf_plist[afi][safi] = NULL; + + if ((peer->status == OpenConfirm) + || (peer->status == Established)) { + /* ORF received prefix-filter pnt */ + sprintf(orf_name, "%s.%d.%d", peer->host, afi, safi); + prefix_bgp_orf_remove_all(afi, orf_name); } + } /* Reset keepalive and holdtime */ if (PEER_OR_GROUP_TIMER_SET(peer)) { @@ -1471,38 +1462,33 @@ static int bgp_establish(struct peer *peer) peer->uptime = bgp_clock(); /* Send route-refresh when ORF is enabled */ - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) + FOREACH_AFI_SAFI (afi, safi) { + if (CHECK_FLAG(peer->af_cap[afi][safi], + PEER_CAP_ORF_PREFIX_SM_ADV)) { if (CHECK_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_ADV)) { - if (CHECK_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_RCV)) - bgp_route_refresh_send( - peer, afi, safi, - ORF_TYPE_PREFIX, - REFRESH_IMMEDIATE, 0); - else if ( - CHECK_FLAG( - peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_OLD_RCV)) - bgp_route_refresh_send( - peer, afi, safi, - ORF_TYPE_PREFIX_OLD, - REFRESH_IMMEDIATE, 0); - } + PEER_CAP_ORF_PREFIX_RM_RCV)) + bgp_route_refresh_send(peer, afi, safi, + ORF_TYPE_PREFIX, + REFRESH_IMMEDIATE, 0); + else if (CHECK_FLAG(peer->af_cap[afi][safi], + PEER_CAP_ORF_PREFIX_RM_OLD_RCV)) + bgp_route_refresh_send(peer, afi, safi, + ORF_TYPE_PREFIX_OLD, + REFRESH_IMMEDIATE, 0); + } + } /* First update is deferred until ORF or ROUTE-REFRESH is received */ - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) + FOREACH_AFI_SAFI (afi, safi) { + if (CHECK_FLAG(peer->af_cap[afi][safi], + PEER_CAP_ORF_PREFIX_RM_ADV)) if (CHECK_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_ADV)) - if (CHECK_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_RCV) - || CHECK_FLAG( - peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_OLD_RCV)) - SET_FLAG(peer->af_sflags[afi][safi], - PEER_STATUS_ORF_WAIT_REFRESH); + PEER_CAP_ORF_PREFIX_SM_RCV) + || CHECK_FLAG(peer->af_cap[afi][safi], + PEER_CAP_ORF_PREFIX_SM_OLD_RCV)) + SET_FLAG(peer->af_sflags[afi][safi], + PEER_STATUS_ORF_WAIT_REFRESH); + } bgp_announce_peer(peer); diff --git a/bgpd/bgp_open.c b/bgpd/bgp_open.c index 5c9ba89a57..77fb61fbb8 100644 --- a/bgpd/bgp_open.c +++ b/bgpd/bgp_open.c @@ -1285,59 +1285,52 @@ void bgp_open_capability(struct stream *s, struct peer *peer) return; /* MP capability for configured AFI, SAFI */ - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - if (peer->afc[afi][safi]) { - /* Convert AFI, SAFI to values for packet. */ - bgp_map_afi_safi_int2iana(afi, safi, &pkt_afi, - &pkt_safi); - - peer->afc_adv[afi][safi] = 1; + FOREACH_AFI_SAFI (afi, safi) { + if (peer->afc[afi][safi]) { + /* Convert AFI, SAFI to values for packet. */ + bgp_map_afi_safi_int2iana(afi, safi, &pkt_afi, + &pkt_safi); + + peer->afc_adv[afi][safi] = 1; + stream_putc(s, BGP_OPEN_OPT_CAP); + stream_putc(s, CAPABILITY_CODE_MP_LEN + 2); + stream_putc(s, CAPABILITY_CODE_MP); + stream_putc(s, CAPABILITY_CODE_MP_LEN); + stream_putw(s, pkt_afi); + stream_putc(s, 0); + stream_putc(s, pkt_safi); + + /* Extended nexthop capability - currently + * supporting RFC-5549 for + * Link-Local peering only + */ + if (CHECK_FLAG(peer->flags, PEER_FLAG_CAPABILITY_ENHE) + && peer->su.sa.sa_family == AF_INET6 + && IN6_IS_ADDR_LINKLOCAL(&peer->su.sin6.sin6_addr) + && afi == AFI_IP + && (safi == SAFI_UNICAST + || safi == SAFI_LABELED_UNICAST)) { + /* RFC 5549 Extended Next Hop Encoding + */ + SET_FLAG(peer->cap, PEER_CAP_ENHE_ADV); stream_putc(s, BGP_OPEN_OPT_CAP); - stream_putc(s, CAPABILITY_CODE_MP_LEN + 2); - stream_putc(s, CAPABILITY_CODE_MP); - stream_putc(s, CAPABILITY_CODE_MP_LEN); + stream_putc(s, CAPABILITY_CODE_ENHE_LEN + 2); + stream_putc(s, CAPABILITY_CODE_ENHE); + stream_putc(s, CAPABILITY_CODE_ENHE_LEN); + + SET_FLAG(peer->af_cap[AFI_IP][safi], + PEER_CAP_ENHE_AF_ADV); stream_putw(s, pkt_afi); - stream_putc(s, 0); - stream_putc(s, pkt_safi); + stream_putw(s, pkt_safi); + stream_putw(s, afi_int2iana(AFI_IP6)); - /* Extended nexthop capability - currently - * supporting RFC-5549 for - * Link-Local peering only - */ - if (CHECK_FLAG(peer->flags, - PEER_FLAG_CAPABILITY_ENHE) - && peer->su.sa.sa_family == AF_INET6 - && IN6_IS_ADDR_LINKLOCAL( - &peer->su.sin6.sin6_addr) - && afi == AFI_IP - && (safi == SAFI_UNICAST - || safi == SAFI_LABELED_UNICAST)) { - /* RFC 5549 Extended Next Hop Encoding - */ - SET_FLAG(peer->cap, PEER_CAP_ENHE_ADV); - stream_putc(s, BGP_OPEN_OPT_CAP); - stream_putc(s, - CAPABILITY_CODE_ENHE_LEN - + 2); - stream_putc(s, CAPABILITY_CODE_ENHE); - stream_putc(s, - CAPABILITY_CODE_ENHE_LEN); - - SET_FLAG(peer->af_cap[AFI_IP][safi], - PEER_CAP_ENHE_AF_ADV); - stream_putw(s, pkt_afi); - stream_putw(s, pkt_safi); - stream_putw(s, afi_int2iana(AFI_IP6)); - - if (CHECK_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ENHE_AF_RCV)) - SET_FLAG( - peer->af_cap[afi][safi], - PEER_CAP_ENHE_AF_NEGO); - } + if (CHECK_FLAG(peer->af_cap[afi][safi], + PEER_CAP_ENHE_AF_RCV)) + SET_FLAG(peer->af_cap[afi][safi], + PEER_CAP_ENHE_AF_NEGO); } } + } /* Route refresh. */ SET_FLAG(peer->cap, PEER_CAP_REFRESH_ADV); @@ -1363,21 +1356,20 @@ void bgp_open_capability(struct stream *s, struct peer *peer) stream_putl(s, local_as); /* AddPath */ - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) - if (peer->afc[afi][safi]) { - afi_safi_count++; - - /* Only advertise addpath TX if a feature that - * will use it is - * configured */ - if (CHECK_FLAG(peer->af_flags[afi][safi], - PEER_FLAG_ADDPATH_TX_ALL_PATHS) - || CHECK_FLAG( - peer->af_flags[afi][safi], - PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS)) - adv_addpath_tx = 1; - } + FOREACH_AFI_SAFI (afi, safi) { + if (peer->afc[afi][safi]) { + afi_safi_count++; + + /* Only advertise addpath TX if a feature that + * will use it is + * configured */ + if (CHECK_FLAG(peer->af_flags[afi][safi], + PEER_FLAG_ADDPATH_TX_ALL_PATHS) + || CHECK_FLAG(peer->af_flags[afi][safi], + PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS)) + adv_addpath_tx = 1; + } + } SET_FLAG(peer->cap, PEER_CAP_ADDPATH_ADV); stream_putc(s, BGP_OPEN_OPT_CAP); @@ -1385,46 +1377,43 @@ void bgp_open_capability(struct stream *s, struct peer *peer) stream_putc(s, CAPABILITY_CODE_ADDPATH); stream_putc(s, CAPABILITY_CODE_ADDPATH_LEN * afi_safi_count); - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) - if (peer->afc[afi][safi]) { - /* Convert AFI, SAFI to values for packet. */ - bgp_map_afi_safi_int2iana(afi, safi, &pkt_afi, - &pkt_safi); + FOREACH_AFI_SAFI (afi, safi) { + if (peer->afc[afi][safi]) { + /* Convert AFI, SAFI to values for packet. */ + bgp_map_afi_safi_int2iana(afi, safi, &pkt_afi, + &pkt_safi); - stream_putw(s, pkt_afi); - stream_putc(s, pkt_safi); + stream_putw(s, pkt_afi); + stream_putc(s, pkt_safi); - if (adv_addpath_tx) { - stream_putc(s, - BGP_ADDPATH_RX - | BGP_ADDPATH_TX); - SET_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ADDPATH_AF_RX_ADV); - SET_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ADDPATH_AF_TX_ADV); - } else { - stream_putc(s, BGP_ADDPATH_RX); - SET_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ADDPATH_AF_RX_ADV); - UNSET_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ADDPATH_AF_TX_ADV); - } + if (adv_addpath_tx) { + stream_putc(s, BGP_ADDPATH_RX | BGP_ADDPATH_TX); + SET_FLAG(peer->af_cap[afi][safi], + PEER_CAP_ADDPATH_AF_RX_ADV); + SET_FLAG(peer->af_cap[afi][safi], + PEER_CAP_ADDPATH_AF_TX_ADV); + } else { + stream_putc(s, BGP_ADDPATH_RX); + SET_FLAG(peer->af_cap[afi][safi], + PEER_CAP_ADDPATH_AF_RX_ADV); + UNSET_FLAG(peer->af_cap[afi][safi], + PEER_CAP_ADDPATH_AF_TX_ADV); } + } + } /* ORF capability. */ - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) - if (CHECK_FLAG(peer->af_flags[afi][safi], - PEER_FLAG_ORF_PREFIX_SM) - || CHECK_FLAG(peer->af_flags[afi][safi], - PEER_FLAG_ORF_PREFIX_RM)) { - bgp_open_capability_orf( - s, peer, afi, safi, - CAPABILITY_CODE_ORF_OLD); - bgp_open_capability_orf(s, peer, afi, safi, - CAPABILITY_CODE_ORF); - } + FOREACH_AFI_SAFI (afi, safi) { + if (CHECK_FLAG(peer->af_flags[afi][safi], + PEER_FLAG_ORF_PREFIX_SM) + || CHECK_FLAG(peer->af_flags[afi][safi], + PEER_FLAG_ORF_PREFIX_RM)) { + bgp_open_capability_orf(s, peer, afi, safi, + CAPABILITY_CODE_ORF_OLD); + bgp_open_capability_orf(s, peer, afi, safi, + CAPABILITY_CODE_ORF); + } + } /* Dynamic capability. */ if (CHECK_FLAG(peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY)) { @@ -1497,22 +1486,21 @@ void bgp_open_capability(struct stream *s, struct peer *peer) config is present */ if (bgp_flag_check(peer->bgp, BGP_FLAG_GRACEFUL_RESTART)) { - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) - if (peer->afc[afi][safi]) { - /* Convert AFI, SAFI to values for - * packet. */ - bgp_map_afi_safi_int2iana( - afi, safi, &pkt_afi, &pkt_safi); - stream_putw(s, pkt_afi); - stream_putc(s, pkt_safi); - if (bgp_flag_check( - peer->bgp, - BGP_FLAG_GR_PRESERVE_FWD)) - stream_putc(s, RESTART_F_BIT); - else - stream_putc(s, 0); - } + FOREACH_AFI_SAFI (afi, safi) { + if (peer->afc[afi][safi]) { + /* Convert AFI, SAFI to values for + * packet. */ + bgp_map_afi_safi_int2iana(afi, safi, &pkt_afi, + &pkt_safi); + stream_putw(s, pkt_afi); + stream_putc(s, pkt_safi); + if (bgp_flag_check(peer->bgp, + BGP_FLAG_GR_PRESERVE_FWD)) + stream_putc(s, RESTART_F_BIT); + else + stream_putc(s, 0); + } + } } /* Total Graceful restart capability Len. */ diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index b7f0114045..a955b3512c 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -204,65 +204,59 @@ static struct stream *bgp_write_packet(struct peer *peer) if (peer->bgp && peer->bgp->main_peers_update_hold) return NULL; - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - paf = peer_af_find(peer, afi, safi); - if (!paf || !PAF_SUBGRP(paf)) - continue; + FOREACH_AFI_SAFI (afi, safi) { + paf = peer_af_find(peer, afi, safi); + if (!paf || !PAF_SUBGRP(paf)) + continue; + next_pkt = paf->next_pkt_to_send; + + /* Try to generate a packet for the peer if we are at + * the end of + * the list. Always try to push out WITHDRAWs first. */ + if (!next_pkt || !next_pkt->buffer) { + next_pkt = subgroup_withdraw_packet(PAF_SUBGRP(paf)); + if (!next_pkt || !next_pkt->buffer) + subgroup_update_packet(PAF_SUBGRP(paf)); next_pkt = paf->next_pkt_to_send; + } - /* Try to generate a packet for the peer if we are at - * the end of - * the list. Always try to push out WITHDRAWs first. */ - if (!next_pkt || !next_pkt->buffer) { - next_pkt = subgroup_withdraw_packet( - PAF_SUBGRP(paf)); - if (!next_pkt || !next_pkt->buffer) - subgroup_update_packet(PAF_SUBGRP(paf)); - next_pkt = paf->next_pkt_to_send; - } - - /* If we still don't have a packet to send to the peer, - * then - * try to find out out if we have to send eor or if not, - * skip to - * the next AFI, SAFI. - * Don't send the EOR prematurely... if the subgroup's - * coalesce - * timer is running, the adjacency-out structure is not - * created - * yet. - */ - if (!next_pkt || !next_pkt->buffer) { - if (CHECK_FLAG(peer->cap, - PEER_CAP_RESTART_RCV)) { - if (!(PAF_SUBGRP(paf))->t_coalesce - && peer->afc_nego[afi][safi] - && peer->synctime - && !CHECK_FLAG( - peer->af_sflags[afi] - [safi], - PEER_STATUS_EOR_SEND)) { - SET_FLAG(peer->af_sflags[afi] - [safi], - PEER_STATUS_EOR_SEND); - return bgp_update_packet_eor( - peer, afi, safi); - } + /* If we still don't have a packet to send to the peer, + * then + * try to find out out if we have to send eor or if not, + * skip to + * the next AFI, SAFI. + * Don't send the EOR prematurely... if the subgroup's + * coalesce + * timer is running, the adjacency-out structure is not + * created + * yet. + */ + if (!next_pkt || !next_pkt->buffer) { + if (CHECK_FLAG(peer->cap, PEER_CAP_RESTART_RCV)) { + if (!(PAF_SUBGRP(paf))->t_coalesce + && peer->afc_nego[afi][safi] + && peer->synctime + && !CHECK_FLAG(peer->af_sflags[afi][safi], + PEER_STATUS_EOR_SEND)) { + SET_FLAG(peer->af_sflags[afi][safi], + PEER_STATUS_EOR_SEND); + return bgp_update_packet_eor(peer, afi, + safi); } - continue; } + continue; + } - /* - * Found a packet template to send, overwrite packet - * with appropriate - * attributes from peer and advance peer - */ - s = bpacket_reformat_for_peer(next_pkt, paf); - bpacket_queue_advance_peer(paf); - return s; - } + /* + * Found a packet template to send, overwrite packet + * with appropriate + * attributes from peer and advance peer + */ + s = bpacket_reformat_for_peer(next_pkt, paf); + bpacket_queue_advance_peer(paf); + return s; + } return NULL; } @@ -282,48 +276,44 @@ static void bgp_write_proceed_actions(struct peer *peer) return; } - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - paf = peer_af_find(peer, afi, safi); - if (!paf) - continue; - subgrp = paf->subgroup; - if (!subgrp) - continue; + FOREACH_AFI_SAFI (afi, safi) { + paf = peer_af_find(peer, afi, safi); + if (!paf) + continue; + subgrp = paf->subgroup; + if (!subgrp) + continue; - next_pkt = paf->next_pkt_to_send; - if (next_pkt && next_pkt->buffer) { - BGP_WRITE_ON(peer->t_write, bgp_write, - peer->fd); - return; - } + next_pkt = paf->next_pkt_to_send; + if (next_pkt && next_pkt->buffer) { + BGP_WRITE_ON(peer->t_write, bgp_write, peer->fd); + return; + } - /* No packets readily available for AFI/SAFI, are there - * subgroup packets - * that need to be generated? */ - if (bpacket_queue_is_full(SUBGRP_INST(subgrp), - SUBGRP_PKTQ(subgrp))) - fullq_found = 1; - else if (subgroup_packets_to_build(subgrp)) { + /* No packets readily available for AFI/SAFI, are there + * subgroup packets + * that need to be generated? */ + if (bpacket_queue_is_full(SUBGRP_INST(subgrp), + SUBGRP_PKTQ(subgrp))) + fullq_found = 1; + else if (subgroup_packets_to_build(subgrp)) { + BGP_WRITE_ON(peer->t_write, bgp_write, peer->fd); + return; + } + + /* No packets to send, see if EOR is pending */ + if (CHECK_FLAG(peer->cap, PEER_CAP_RESTART_RCV)) { + if (!subgrp->t_coalesce && peer->afc_nego[afi][safi] + && peer->synctime + && !CHECK_FLAG(peer->af_sflags[afi][safi], + PEER_STATUS_EOR_SEND) + && safi != SAFI_MPLS_VPN) { BGP_WRITE_ON(peer->t_write, bgp_write, peer->fd); return; } - - /* No packets to send, see if EOR is pending */ - if (CHECK_FLAG(peer->cap, PEER_CAP_RESTART_RCV)) { - if (!subgrp->t_coalesce - && peer->afc_nego[afi][safi] - && peer->synctime - && !CHECK_FLAG(peer->af_sflags[afi][safi], - PEER_STATUS_EOR_SEND) - && safi != SAFI_MPLS_VPN) { - BGP_WRITE_ON(peer->t_write, bgp_write, - peer->fd); - return; - } - } } + } if (fullq_found) { BGP_WRITE_ON(peer->t_write, bgp_write, peer->fd); return; @@ -1300,18 +1290,17 @@ static void bgp_update_explicit_eors(struct peer *peer) if (bgp_debug_neighbor_events(peer)) zlog_debug("Peer %s: Checking explicit EORs", peer->host); - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - if (peer->afc_nego[afi][safi] - && !CHECK_FLAG(peer->af_sflags[afi][safi], - PEER_STATUS_EOR_RECEIVED)) { - if (bgp_debug_neighbor_events(peer)) - zlog_debug( - " afi %d safi %d didnt receive EOR", - afi, safi); - return; - } + FOREACH_AFI_SAFI (afi, safi) { + if (peer->afc_nego[afi][safi] + && !CHECK_FLAG(peer->af_sflags[afi][safi], + PEER_STATUS_EOR_RECEIVED)) { + if (bgp_debug_neighbor_events(peer)) + zlog_debug( + " afi %d safi %d didnt receive EOR", + afi, safi); + return; } + } peer->update_delay_over = 1; peer->bgp->explicit_eors++; diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 4ee1aafbe9..6c72ba3e0b 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -2056,12 +2056,10 @@ static void bgp_process_main_one(struct bgp *bgp, struct bgp_node *rn, sizeof(bgp->update_delay_zebra_resume_time)); bgp->main_zebra_update_hold = 0; - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - if (bgp_fibupd_safi(safi)) - bgp_zebra_announce_table(bgp, afi, - safi); - } + FOREACH_AFI_SAFI (afi, safi) { + if (bgp_fibupd_safi(safi)) + bgp_zebra_announce_table(bgp, afi, safi); + } bgp->main_peers_update_hold = 0; bgp_start_routeadv(bgp); @@ -3434,9 +3432,8 @@ void bgp_announce_route_all(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++) - bgp_announce_route(peer, afi, safi); + FOREACH_AFI_SAFI (afi, safi) + bgp_announce_route(peer, afi, safi); } static void bgp_soft_reconfig_table(struct peer *peer, afi_t afi, safi_t safi, @@ -3718,9 +3715,8 @@ void bgp_clear_route_all(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++) - bgp_clear_route(peer, afi, safi); + FOREACH_AFI_SAFI (afi, safi) + bgp_clear_route(peer, afi, safi); #if ENABLE_BGP_VNC rfapiProcessPeerDown(peer); @@ -4624,30 +4620,28 @@ void bgp_static_add(struct bgp *bgp) struct bgp_table *table; struct bgp_static *bgp_static; - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) - for (rn = bgp_table_top(bgp->route[afi][safi]); rn; - rn = bgp_route_next(rn)) { - if (rn->info == NULL) - continue; + FOREACH_AFI_SAFI (afi, safi) + for (rn = bgp_table_top(bgp->route[afi][safi]); rn; + rn = bgp_route_next(rn)) { + if (rn->info == NULL) + continue; - if ((safi == SAFI_MPLS_VPN) - || (safi == SAFI_ENCAP) - || (safi == SAFI_EVPN)) { - table = rn->info; - - for (rm = bgp_table_top(table); rm; - rm = bgp_route_next(rm)) { - bgp_static = rm->info; - bgp_static_update_safi( - bgp, &rm->p, bgp_static, - afi, safi); - } - } else { - bgp_static_update(bgp, &rn->p, rn->info, - afi, safi); + if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP) + || (safi == SAFI_EVPN)) { + table = rn->info; + + for (rm = bgp_table_top(table); rm; + rm = bgp_route_next(rm)) { + bgp_static = rm->info; + bgp_static_update_safi(bgp, &rm->p, + bgp_static, afi, + safi); } + } else { + bgp_static_update(bgp, &rn->p, rn->info, afi, + safi); } + } } /* Called from bgp_delete(). Delete all static routes from the BGP @@ -4661,39 +4655,34 @@ void bgp_static_delete(struct bgp *bgp) struct bgp_table *table; struct bgp_static *bgp_static; - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) - for (rn = bgp_table_top(bgp->route[afi][safi]); rn; - rn = bgp_route_next(rn)) { - if (rn->info == NULL) - continue; + FOREACH_AFI_SAFI (afi, safi) + for (rn = bgp_table_top(bgp->route[afi][safi]); rn; + rn = bgp_route_next(rn)) { + if (rn->info == NULL) + continue; - if ((safi == SAFI_MPLS_VPN) - || (safi == SAFI_ENCAP) - || (safi == SAFI_EVPN)) { - table = rn->info; - - for (rm = bgp_table_top(table); rm; - rm = bgp_route_next(rm)) { - bgp_static = rm->info; - bgp_static_withdraw_safi( - bgp, &rm->p, AFI_IP, - safi, - (struct prefix_rd *)&rn - ->p); - bgp_static_free(bgp_static); - rn->info = NULL; - bgp_unlock_node(rn); - } - } else { - bgp_static = rn->info; - bgp_static_withdraw(bgp, &rn->p, afi, - safi); + if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP) + || (safi == SAFI_EVPN)) { + table = rn->info; + + for (rm = bgp_table_top(table); rm; + rm = bgp_route_next(rm)) { + bgp_static = rm->info; + bgp_static_withdraw_safi( + bgp, &rm->p, AFI_IP, safi, + (struct prefix_rd *)&rn->p); bgp_static_free(bgp_static); rn->info = NULL; bgp_unlock_node(rn); } + } else { + bgp_static = rn->info; + bgp_static_withdraw(bgp, &rn->p, afi, safi); + bgp_static_free(bgp_static); + rn->info = NULL; + bgp_unlock_node(rn); } + } } void bgp_static_redo_import_check(struct bgp *bgp) @@ -4707,32 +4696,30 @@ void bgp_static_redo_import_check(struct bgp *bgp) /* Use this flag to force reprocessing of the route */ bgp_flag_set(bgp, BGP_FLAG_FORCE_STATIC_PROCESS); - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) - for (rn = bgp_table_top(bgp->route[afi][safi]); rn; - rn = bgp_route_next(rn)) { - if (rn->info == NULL) - continue; + FOREACH_AFI_SAFI (afi, safi) { + for (rn = bgp_table_top(bgp->route[afi][safi]); rn; + rn = bgp_route_next(rn)) { + if (rn->info == NULL) + continue; - if ((safi == SAFI_MPLS_VPN) - || (safi == SAFI_ENCAP) - || (safi == SAFI_EVPN)) { - table = rn->info; - - for (rm = bgp_table_top(table); rm; - rm = bgp_route_next(rm)) { - bgp_static = rm->info; - bgp_static_update_safi( - bgp, &rm->p, bgp_static, - afi, safi); - } - } else { - bgp_static = rn->info; - bgp_static_update(bgp, &rn->p, - bgp_static, afi, - safi); + if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP) + || (safi == SAFI_EVPN)) { + table = rn->info; + + for (rm = bgp_table_top(table); rm; + rm = bgp_route_next(rm)) { + bgp_static = rm->info; + bgp_static_update_safi(bgp, &rm->p, + bgp_static, afi, + safi); } + } else { + bgp_static = rn->info; + bgp_static_update(bgp, &rn->p, bgp_static, afi, + safi); } + } + } bgp_flag_unset(bgp, BGP_FLAG_FORCE_STATIC_PROCESS); } @@ -4771,9 +4758,8 @@ void bgp_purge_static_redist_routes(struct bgp *bgp) afi_t afi; safi_t safi; - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) - bgp_purge_af_static_redist_routes(bgp, afi, safi); + FOREACH_AFI_SAFI (afi, safi) + bgp_purge_af_static_redist_routes(bgp, afi, safi); } /* @@ -11350,10 +11336,8 @@ void bgp_route_init(void) safi_t safi; /* Init BGP distance table. */ - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) - bgp_distance_table[afi][safi] = - bgp_table_init(afi, safi); + FOREACH_AFI_SAFI (afi, safi) + bgp_distance_table[afi][safi] = bgp_table_init(afi, safi); /* IPv4 BGP commands. */ install_element(BGP_NODE, &bgp_table_map_cmd); @@ -11525,9 +11509,8 @@ void bgp_route_finish(void) afi_t afi; safi_t safi; - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - bgp_table_unlock(bgp_distance_table[afi][safi]); - bgp_distance_table[afi][safi] = NULL; - } + FOREACH_AFI_SAFI (afi, safi) { + bgp_table_unlock(bgp_distance_table[afi][safi]); + bgp_distance_table[afi][safi] = NULL; + } } diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c index f26498fb03..f588acfb79 100644 --- a/bgpd/bgp_routemap.c +++ b/bgpd/bgp_routemap.c @@ -2881,25 +2881,23 @@ static void bgp_route_map_update_peer_group(const char *rmap_name, /* All the peers have been updated correctly already. This is * just updating the placeholder data. No real update required. */ - for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - filter = &group->conf->filter[afi][safi]; - - for (direct = RMAP_IN; direct < RMAP_MAX; - direct++) { - if ((filter->map[direct].name) - && (strcmp(rmap_name, - filter->map[direct].name) - == 0)) - filter->map[direct].map = map; - } - - if (filter->usmap.name - && (strcmp(rmap_name, filter->usmap.name) + for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) { + FOREACH_AFI_SAFI (afi, safi) { + filter = &group->conf->filter[afi][safi]; + + for (direct = RMAP_IN; direct < RMAP_MAX; direct++) { + if ((filter->map[direct].name) + && (strcmp(rmap_name, + filter->map[direct].name) == 0)) - filter->usmap.map = map; + filter->map[direct].map = map; } + + if (filter->usmap.name + && (strcmp(rmap_name, filter->usmap.name) == 0)) + filter->usmap.map = map; + } + } } /* @@ -2930,14 +2928,12 @@ static void bgp_route_map_process_update(struct bgp *bgp, const char *rmap_name, if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) continue; - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - /* process in/out/import/export/default-orig - * route-maps */ - bgp_route_map_process_peer(rmap_name, map, peer, - afi, safi, - route_update); - } + FOREACH_AFI_SAFI (afi, safi) { + /* process in/out/import/export/default-orig + * route-maps */ + bgp_route_map_process_peer(rmap_name, map, peer, afi, + safi, route_update); + } } /* for outbound/default-orig route-maps, process for groups */ @@ -2947,62 +2943,55 @@ static void bgp_route_map_process_update(struct bgp *bgp, const char *rmap_name, /* update peer-group config (template) */ bgp_route_map_update_peer_group(rmap_name, map, bgp); - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - /* For table route-map updates. */ - if (!bgp_fibupd_safi(safi)) - continue; - - if (bgp->table_map[afi][safi].name - && (strcmp(rmap_name, - bgp->table_map[afi][safi].name) - == 0)) { - bgp->table_map[afi][safi].map = map; + FOREACH_AFI_SAFI (afi, safi) { + /* For table route-map updates. */ + if (!bgp_fibupd_safi(safi)) + continue; - if (BGP_DEBUG(zebra, ZEBRA)) - zlog_debug( - "Processing route_map %s update on " - "table map", - rmap_name); - if (route_update) - bgp_zebra_announce_table(bgp, afi, - safi); - } + if (bgp->table_map[afi][safi].name + && (strcmp(rmap_name, bgp->table_map[afi][safi].name) + == 0)) { + bgp->table_map[afi][safi].map = map; + + if (BGP_DEBUG(zebra, ZEBRA)) + zlog_debug( + "Processing route_map %s update on " + "table map", + rmap_name); + if (route_update) + bgp_zebra_announce_table(bgp, afi, safi); + } - /* For network route-map updates. */ - for (bn = bgp_table_top(bgp->route[afi][safi]); bn; - bn = bgp_route_next(bn)) - if ((bgp_static = bn->info) != NULL) { - if (bgp_static->rmap.name - && (strcmp(rmap_name, - bgp_static->rmap.name) - == 0)) { - bgp_static->rmap.map = map; - - if (route_update) - if (!bgp_static - ->backdoor) { - if (bgp_debug_zebra( - &bn->p)) - zlog_debug( - "Processing route_map %s update on " - "static route %s", - rmap_name, - inet_ntop( - bn->p.family, - &bn->p.u.prefix, - buf, - INET6_ADDRSTRLEN)); - bgp_static_update( - bgp, - &bn->p, - bgp_static, - afi, - safi); - } - } + /* For network route-map updates. */ + for (bn = bgp_table_top(bgp->route[afi][safi]); bn; + bn = bgp_route_next(bn)) + if ((bgp_static = bn->info) != NULL) { + if (bgp_static->rmap.name + && (strcmp(rmap_name, bgp_static->rmap.name) + == 0)) { + bgp_static->rmap.map = map; + + if (route_update) + if (!bgp_static->backdoor) { + if (bgp_debug_zebra( + &bn->p)) + zlog_debug( + "Processing route_map %s update on " + "static route %s", + rmap_name, + inet_ntop( + bn->p.family, + &bn->p.u.prefix, + buf, + INET6_ADDRSTRLEN)); + bgp_static_update( + bgp, &bn->p, + bgp_static, afi, + safi); + } } - } + } + } /* For redistribute route-map updates. */ for (afi = AFI_IP; afi < AFI_MAX; afi++) diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index db19835f88..727884393b 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -1654,15 +1654,13 @@ DEFUN (no_bgp_deterministic_med, bestpath_per_as_used = 0; for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) { - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; - safi++) - if (CHECK_FLAG( - peer->af_flags[afi][safi], - PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS)) { - bestpath_per_as_used = 1; - break; - } + FOREACH_AFI_SAFI (afi, safi) + if (CHECK_FLAG( + peer->af_flags[afi][safi], + PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS)) { + bestpath_per_as_used = 1; + break; + } if (bestpath_per_as_used) break; @@ -8403,133 +8401,120 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, u_char use_json, json_add = json_object_new_object(); - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; - safi < SAFI_MAX; safi++) { - json_object *json_sub = - NULL; - json_sub = - json_object_new_object(); - print_store = - afi_safi_print( - afi, - safi); + FOREACH_AFI_SAFI (afi, safi) { + json_object *json_sub = NULL; + json_sub = + json_object_new_object(); + print_store = afi_safi_print( + afi, safi); + if (CHECK_FLAG( + p->af_cap[afi] + [safi], + PEER_CAP_ADDPATH_AF_TX_ADV) + || CHECK_FLAG( + p->af_cap[afi] + [safi], + PEER_CAP_ADDPATH_AF_TX_RCV)) { if (CHECK_FLAG( p->af_cap [afi] [safi], PEER_CAP_ADDPATH_AF_TX_ADV) - || CHECK_FLAG( + && CHECK_FLAG( p->af_cap [afi] [safi], - PEER_CAP_ADDPATH_AF_TX_RCV)) { - if (CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_TX_ADV) - && CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_TX_RCV)) - json_object_boolean_true_add( - json_sub, - "txAdvertisedAndReceived"); - else if ( - CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_TX_ADV)) - json_object_boolean_true_add( - json_sub, - "txAdvertised"); - else if ( - CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_TX_RCV)) - json_object_boolean_true_add( - json_sub, - "txReceived"); - } + PEER_CAP_ADDPATH_AF_TX_RCV)) + json_object_boolean_true_add( + json_sub, + "txAdvertisedAndReceived"); + else if ( + CHECK_FLAG( + p->af_cap + [afi] + [safi], + PEER_CAP_ADDPATH_AF_TX_ADV)) + json_object_boolean_true_add( + json_sub, + "txAdvertised"); + else if ( + CHECK_FLAG( + p->af_cap + [afi] + [safi], + PEER_CAP_ADDPATH_AF_TX_RCV)) + json_object_boolean_true_add( + json_sub, + "txReceived"); + } + if (CHECK_FLAG( + p->af_cap[afi] + [safi], + PEER_CAP_ADDPATH_AF_RX_ADV) + || CHECK_FLAG( + p->af_cap[afi] + [safi], + PEER_CAP_ADDPATH_AF_RX_RCV)) { if (CHECK_FLAG( p->af_cap [afi] [safi], PEER_CAP_ADDPATH_AF_RX_ADV) - || CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_RX_RCV)) { - if (CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_RX_ADV) - && CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_RX_RCV)) - json_object_boolean_true_add( - json_sub, - "rxAdvertisedAndReceived"); - else if ( - CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_RX_ADV)) - json_object_boolean_true_add( - json_sub, - "rxAdvertised"); - else if ( - CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_RX_RCV)) - json_object_boolean_true_add( - json_sub, - "rxReceived"); - } - - if (CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_TX_ADV) - || CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_TX_RCV) - || CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_RX_ADV) - || CHECK_FLAG( + && CHECK_FLAG( p->af_cap [afi] [safi], PEER_CAP_ADDPATH_AF_RX_RCV)) - json_object_object_add( - json_add, - print_store, - json_sub); - else - json_object_free( - json_sub); + json_object_boolean_true_add( + json_sub, + "rxAdvertisedAndReceived"); + else if ( + CHECK_FLAG( + p->af_cap + [afi] + [safi], + PEER_CAP_ADDPATH_AF_RX_ADV)) + json_object_boolean_true_add( + json_sub, + "rxAdvertised"); + else if ( + CHECK_FLAG( + p->af_cap + [afi] + [safi], + PEER_CAP_ADDPATH_AF_RX_RCV)) + json_object_boolean_true_add( + json_sub, + "rxReceived"); } + if (CHECK_FLAG( + p->af_cap[afi] + [safi], + PEER_CAP_ADDPATH_AF_TX_ADV) + || CHECK_FLAG( + p->af_cap[afi] + [safi], + PEER_CAP_ADDPATH_AF_TX_RCV) + || CHECK_FLAG( + p->af_cap[afi] + [safi], + PEER_CAP_ADDPATH_AF_RX_ADV) + || CHECK_FLAG( + p->af_cap[afi] + [safi], + PEER_CAP_ADDPATH_AF_RX_RCV)) + json_object_object_add( + json_add, + print_store, + json_sub); + else + json_object_free( + json_sub); + } + json_object_object_add( json_cap, "addPath", json_add); } @@ -8678,45 +8663,32 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, u_char use_json, json_object *json_multi = NULL; json_multi = json_object_new_object(); - for (afi = AFI_IP; afi < AFI_MAX; afi++) { - for (safi = SAFI_UNICAST; - safi < SAFI_MAX; safi++) { + FOREACH_AFI_SAFI (afi, safi) { + if (p->afc_adv[afi][safi] + || p->afc_recv[afi][safi]) { + json_object *json_exten = NULL; + json_exten = + json_object_new_object(); + if (p->afc_adv[afi][safi] - || p->afc_recv[afi][safi]) { - json_object - *json_exten = - NULL; - json_exten = - json_object_new_object(); - - if (p->afc_adv[afi] - [safi] - && p->afc_recv - [afi] - [safi]) - json_object_boolean_true_add( - json_exten, - "advertisedAndReceived"); - else if (p->afc_adv - [afi] - [safi]) - json_object_boolean_true_add( - json_exten, - "advertised"); - else if (p->afc_recv - [afi] - [safi]) - json_object_boolean_true_add( - json_exten, - "received"); + && p->afc_recv[afi][safi]) + json_object_boolean_true_add( + json_exten, + "advertisedAndReceived"); + else if (p->afc_adv[afi][safi]) + json_object_boolean_true_add( + json_exten, + "advertised"); + else if (p->afc_recv[afi][safi]) + json_object_boolean_true_add( + json_exten, + "received"); - json_object_object_add( - json_multi, - afi_safi_print( - afi, - safi), - json_exten); - } + json_object_object_add( + json_multi, + afi_safi_print(afi, + safi), + json_exten); } } json_object_object_add( @@ -8798,37 +8770,33 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, u_char use_json, "gracefulRestartRemoteTimerMsecs", p->v_gr_restart * 1000); - for (afi = AFI_IP; - afi < AFI_MAX; afi++) { - for (safi = SAFI_UNICAST; - safi < SAFI_MAX; - safi++) { + FOREACH_AFI_SAFI (afi, safi) { + if (CHECK_FLAG( + p->af_cap + [afi] + [safi], + PEER_CAP_RESTART_AF_RCV)) { + json_object * + json_sub = + NULL; + json_sub = + json_object_new_object(); + if (CHECK_FLAG( p->af_cap [afi] [safi], - PEER_CAP_RESTART_AF_RCV)) { - json_object *json_sub = - NULL; - json_sub = - json_object_new_object(); - - if (CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_RESTART_AF_PRESERVE_RCV)) - json_object_boolean_true_add( - json_sub, - "preserved"); - restart_af_count++; - json_object_object_add( - json_restart, - afi_safi_print( - afi, - safi), - json_sub); - } + PEER_CAP_RESTART_AF_PRESERVE_RCV)) + json_object_boolean_true_add( + json_sub, + "preserved"); + restart_af_count++; + json_object_object_add( + json_restart, + afi_safi_print( + afi, + safi), + json_sub); } } if (!restart_af_count) { @@ -8875,101 +8843,93 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, u_char use_json, PEER_CAP_ADDPATH_ADV)) { vty_out(vty, " AddPath:\n"); - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; - safi < SAFI_MAX; safi++) { + FOREACH_AFI_SAFI (afi, safi) { + if (CHECK_FLAG( + p->af_cap[afi] + [safi], + PEER_CAP_ADDPATH_AF_TX_ADV) + || CHECK_FLAG( + p->af_cap[afi] + [safi], + PEER_CAP_ADDPATH_AF_TX_RCV)) { + vty_out(vty, + " %s: TX ", + afi_safi_print( + afi, + safi)); + if (CHECK_FLAG( p->af_cap [afi] [safi], - PEER_CAP_ADDPATH_AF_TX_ADV) - || CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_TX_RCV)) { + PEER_CAP_ADDPATH_AF_TX_ADV)) vty_out(vty, - " %s: TX ", + "advertised %s", afi_safi_print( afi, safi)); - if (CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_TX_ADV)) - vty_out(vty, - "advertised %s", - afi_safi_print( - afi, - safi)); + if (CHECK_FLAG( + p->af_cap + [afi] + [safi], + PEER_CAP_ADDPATH_AF_TX_RCV)) + vty_out(vty, + "%sreceived", + CHECK_FLAG( + p->af_cap + [afi] + [safi], + PEER_CAP_ADDPATH_AF_TX_ADV) + ? " and " + : ""); - if (CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_TX_RCV)) - vty_out(vty, - "%sreceived", - CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_TX_ADV) - ? " and " - : ""); + vty_out(vty, "\n"); + } - vty_out(vty, - "\n"); - } + if (CHECK_FLAG( + p->af_cap[afi] + [safi], + PEER_CAP_ADDPATH_AF_RX_ADV) + || CHECK_FLAG( + p->af_cap[afi] + [safi], + PEER_CAP_ADDPATH_AF_RX_RCV)) { + vty_out(vty, + " %s: RX ", + afi_safi_print( + afi, + safi)); if (CHECK_FLAG( p->af_cap [afi] [safi], - PEER_CAP_ADDPATH_AF_RX_ADV) - || CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_RX_RCV)) { + PEER_CAP_ADDPATH_AF_RX_ADV)) vty_out(vty, - " %s: RX ", + "advertised %s", afi_safi_print( afi, safi)); - if (CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_RX_ADV)) - vty_out(vty, - "advertised %s", - afi_safi_print( - afi, - safi)); - - if (CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_RX_RCV)) - vty_out(vty, - "%sreceived", - CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_ADDPATH_AF_RX_ADV) - ? " and " - : ""); - + if (CHECK_FLAG( + p->af_cap + [afi] + [safi], + PEER_CAP_ADDPATH_AF_RX_RCV)) vty_out(vty, - "\n"); - } + "%sreceived", + CHECK_FLAG( + p->af_cap + [afi] + [safi], + PEER_CAP_ADDPATH_AF_RX_ADV) + ? " and " + : ""); + + vty_out(vty, "\n"); } + } } /* Dynamic */ @@ -9065,30 +9025,25 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, u_char use_json, } /* Multiprotocol Extensions */ - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; - safi < SAFI_MAX; safi++) - if (p->afc_adv[afi][safi] - || p->afc_recv[afi][safi]) { + FOREACH_AFI_SAFI (afi, safi) + if (p->afc_adv[afi][safi] + || p->afc_recv[afi][safi]) { + vty_out(vty, + " Address Family %s:", + afi_safi_print(afi, + safi)); + if (p->afc_adv[afi][safi]) vty_out(vty, - " Address Family %s:", - afi_safi_print( - afi, - safi)); - if (p->afc_adv[afi] - [safi]) - vty_out(vty, - " advertised"); - if (p->afc_recv[afi] - [safi]) - vty_out(vty, - " %sreceived", - p->afc_adv[afi] - [safi] - ? "and " - : ""); - vty_out(vty, "\n"); - } + " advertised"); + if (p->afc_recv[afi][safi]) + vty_out(vty, + " %sreceived", + p->afc_adv[afi] + [safi] + ? "and " + : ""); + vty_out(vty, "\n"); + } /* Hostname capability */ vty_out(vty, " Hostname Capability:"); @@ -9150,33 +9105,29 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, u_char use_json, vty_out(vty, " Address families by peer:\n "); - for (afi = AFI_IP; - afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; - safi < SAFI_MAX; - safi++) - if (CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_RESTART_AF_RCV)) { - vty_out(vty, - "%s%s(%s)", - restart_af_count - ? ", " - : "", - afi_safi_print( - afi, - safi), - CHECK_FLAG( - p->af_cap - [afi] - [safi], - PEER_CAP_RESTART_AF_PRESERVE_RCV) - ? "preserved" - : "not preserved"); - restart_af_count++; - } + FOREACH_AFI_SAFI (afi, safi) + if (CHECK_FLAG( + p->af_cap + [afi] + [safi], + PEER_CAP_RESTART_AF_RCV)) { + vty_out(vty, + "%s%s(%s)", + restart_af_count + ? ", " + : "", + afi_safi_print( + afi, + safi), + CHECK_FLAG( + p->af_cap + [afi] + [safi], + PEER_CAP_RESTART_AF_PRESERVE_RCV) + ? "preserved" + : "not preserved"); + restart_af_count++; + } if (!restart_af_count) vty_out(vty, "none"); vty_out(vty, "\n"); @@ -9201,36 +9152,25 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, u_char use_json, json_grace_recv = json_object_new_object(); if (p->status == Established) { - for (afi = AFI_IP; afi < AFI_MAX; afi++) { - for (safi = SAFI_UNICAST; - safi < SAFI_MAX; safi++) { - if (CHECK_FLAG( - p->af_sflags[afi] - [safi], - PEER_STATUS_EOR_SEND)) { - json_object_boolean_true_add( - json_grace_send, - afi_safi_print( - afi, - safi)); - eor_send_af_count++; - } + FOREACH_AFI_SAFI (afi, safi) { + if (CHECK_FLAG(p->af_sflags[afi][safi], + PEER_STATUS_EOR_SEND)) { + json_object_boolean_true_add( + json_grace_send, + afi_safi_print(afi, + safi)); + eor_send_af_count++; } } - for (afi = AFI_IP; afi < AFI_MAX; afi++) { - for (safi = SAFI_UNICAST; - safi < SAFI_MAX; safi++) { - if (CHECK_FLAG( - p->af_sflags[afi] - [safi], - PEER_STATUS_EOR_RECEIVED)) { - json_object_boolean_true_add( - json_grace_recv, - afi_safi_print( - afi, - safi)); - eor_receive_af_count++; - } + FOREACH_AFI_SAFI (afi, safi) { + if (CHECK_FLAG( + p->af_sflags[afi][safi], + PEER_STATUS_EOR_RECEIVED)) { + json_object_boolean_true_add( + json_grace_recv, + afi_safi_print(afi, + safi)); + eor_receive_af_count++; } } } @@ -9261,42 +9201,30 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, u_char use_json, vty_out(vty, " Graceful restart informations:\n"); if (p->status == Established) { vty_out(vty, " End-of-RIB send: "); - for (afi = AFI_IP; afi < AFI_MAX; afi++) { - for (safi = SAFI_UNICAST; - safi < SAFI_MAX; safi++) { - if (CHECK_FLAG( - p->af_sflags[afi] - [safi], - PEER_STATUS_EOR_SEND)) { - vty_out(vty, "%s%s", - eor_send_af_count - ? ", " - : "", - afi_safi_print( - afi, - safi)); - eor_send_af_count++; - } + FOREACH_AFI_SAFI (afi, safi) { + if (CHECK_FLAG(p->af_sflags[afi][safi], + PEER_STATUS_EOR_SEND)) { + vty_out(vty, "%s%s", + eor_send_af_count ? ", " + : "", + afi_safi_print(afi, + safi)); + eor_send_af_count++; } } vty_out(vty, "\n"); vty_out(vty, " End-of-RIB received: "); - for (afi = AFI_IP; afi < AFI_MAX; afi++) { - for (safi = SAFI_UNICAST; - safi < SAFI_MAX; safi++) { - if (CHECK_FLAG( - p->af_sflags[afi] - [safi], - PEER_STATUS_EOR_RECEIVED)) { - vty_out(vty, "%s%s", - eor_receive_af_count - ? ", " - : "", - afi_safi_print( - afi, - safi)); - eor_receive_af_count++; - } + FOREACH_AFI_SAFI (afi, safi) { + if (CHECK_FLAG( + p->af_sflags[afi][safi], + PEER_STATUS_EOR_RECEIVED)) { + vty_out(vty, "%s%s", + eor_receive_af_count + ? ", " + : "", + afi_safi_print(afi, + safi)); + eor_receive_af_count++; } } vty_out(vty, "\n"); @@ -9424,11 +9352,10 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, u_char use_json, if (use_json) json_hold = json_object_new_object(); - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) - if (p->afc[afi][safi]) - bgp_show_peer_afi(vty, p, afi, safi, use_json, - json_hold); + FOREACH_AFI_SAFI (afi, safi) + if (p->afc[afi][safi]) + bgp_show_peer_afi(vty, p, afi, safi, use_json, + json_hold); if (use_json) { json_object_object_add(json_neigh, "addressFamilyInfo", @@ -10479,13 +10406,12 @@ static int bgp_show_one_peer_group(struct vty *vty, struct peer_group *group) /* Display AFs configured. */ vty_out(vty, " Configured address-families:"); - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - if (conf->afc[afi][safi]) { - af_cfgd = 1; - vty_out(vty, " %s;", afi_safi_print(afi, safi)); - } + FOREACH_AFI_SAFI (afi, safi) { + if (conf->afc[afi][safi]) { + af_cfgd = 1; + vty_out(vty, " %s;", afi_safi_print(afi, safi)); } + } if (!af_cfgd) vty_out(vty, " none\n"); else diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 345ceab9ed..a4952be8a6 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -1121,18 +1121,17 @@ struct peer *peer_new(struct bgp *bgp) peer->password = NULL; /* Set default flags. */ - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - if (!bgp_option_check(BGP_OPT_CONFIG_CISCO)) { - SET_FLAG(peer->af_flags[afi][safi], - PEER_FLAG_SEND_COMMUNITY); - SET_FLAG(peer->af_flags[afi][safi], - PEER_FLAG_SEND_EXT_COMMUNITY); - SET_FLAG(peer->af_flags[afi][safi], - PEER_FLAG_SEND_LARGE_COMMUNITY); - } - peer->orf_plist[afi][safi] = NULL; + FOREACH_AFI_SAFI (afi, safi) { + if (!bgp_option_check(BGP_OPT_CONFIG_CISCO)) { + SET_FLAG(peer->af_flags[afi][safi], + PEER_FLAG_SEND_COMMUNITY); + SET_FLAG(peer->af_flags[afi][safi], + PEER_FLAG_SEND_EXT_COMMUNITY); + SET_FLAG(peer->af_flags[afi][safi], + PEER_FLAG_SEND_LARGE_COMMUNITY); } + peer->orf_plist[afi][safi] = NULL; + } SET_FLAG(peer->sflags, PEER_STATUS_CAPABILITY_OPEN); /* Create buffers. */ @@ -1214,16 +1213,13 @@ void peer_xfer_config(struct peer *peer_dst, struct peer *peer_src) peer_dst->password = XSTRDUP(MTYPE_PEER_PASSWORD, peer_src->password); - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - peer_dst->afc[afi][safi] = peer_src->afc[afi][safi]; - peer_dst->af_flags[afi][safi] = - peer_src->af_flags[afi][safi]; - peer_dst->allowas_in[afi][safi] = - peer_src->allowas_in[afi][safi]; - peer_dst->weight[afi][safi] = - peer_src->weight[afi][safi]; - } + FOREACH_AFI_SAFI (afi, safi) { + peer_dst->afc[afi][safi] = peer_src->afc[afi][safi]; + peer_dst->af_flags[afi][safi] = peer_src->af_flags[afi][safi]; + peer_dst->allowas_in[afi][safi] = + peer_src->allowas_in[afi][safi]; + peer_dst->weight[afi][safi] = peer_src->weight[afi][safi]; + } for (afidx = BGP_AF_START; afidx < BGP_AF_MAX; afidx++) { paf = peer_src->peer_af_array[afidx]; @@ -1425,10 +1421,8 @@ void bgp_recalculate_all_bestpaths(struct bgp *bgp) afi_t afi; safi_t safi; - for (afi = AFI_IP; afi < AFI_MAX; afi++) { - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - bgp_recalculate_afi_safi_bestpaths(bgp, afi, safi); - } + FOREACH_AFI_SAFI (afi, safi) { + bgp_recalculate_afi_safi_bestpaths(bgp, afi, safi); } } @@ -2180,51 +2174,49 @@ int peer_delete(struct peer *peer) } /* Free filter related memory. */ - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - filter = &peer->filter[afi][safi]; - - for (i = FILTER_IN; i < FILTER_MAX; i++) { - if (filter->dlist[i].name) { - XFREE(MTYPE_BGP_FILTER_NAME, - filter->dlist[i].name); - filter->dlist[i].name = NULL; - } - - if (filter->plist[i].name) { - XFREE(MTYPE_BGP_FILTER_NAME, - filter->plist[i].name); - filter->plist[i].name = NULL; - } + FOREACH_AFI_SAFI (afi, safi) { + filter = &peer->filter[afi][safi]; - if (filter->aslist[i].name) { - XFREE(MTYPE_BGP_FILTER_NAME, - filter->aslist[i].name); - filter->aslist[i].name = NULL; - } + for (i = FILTER_IN; i < FILTER_MAX; i++) { + if (filter->dlist[i].name) { + XFREE(MTYPE_BGP_FILTER_NAME, + filter->dlist[i].name); + filter->dlist[i].name = NULL; } - for (i = RMAP_IN; i < RMAP_MAX; i++) { - if (filter->map[i].name) { - XFREE(MTYPE_BGP_FILTER_NAME, - filter->map[i].name); - filter->map[i].name = NULL; - } + if (filter->plist[i].name) { + XFREE(MTYPE_BGP_FILTER_NAME, + filter->plist[i].name); + filter->plist[i].name = NULL; } - if (filter->usmap.name) { + if (filter->aslist[i].name) { XFREE(MTYPE_BGP_FILTER_NAME, - filter->usmap.name); - filter->usmap.name = NULL; + filter->aslist[i].name); + filter->aslist[i].name = NULL; } + } - if (peer->default_rmap[afi][safi].name) { - XFREE(MTYPE_ROUTE_MAP_NAME, - peer->default_rmap[afi][safi].name); - peer->default_rmap[afi][safi].name = NULL; + for (i = RMAP_IN; i < RMAP_MAX; i++) { + if (filter->map[i].name) { + XFREE(MTYPE_BGP_FILTER_NAME, + filter->map[i].name); + filter->map[i].name = NULL; } } + if (filter->usmap.name) { + XFREE(MTYPE_BGP_FILTER_NAME, filter->usmap.name); + filter->usmap.name = NULL; + } + + if (peer->default_rmap[afi][safi].name) { + XFREE(MTYPE_ROUTE_MAP_NAME, + peer->default_rmap[afi][safi].name); + peer->default_rmap[afi][safi].name = NULL; + } + } + FOREACH_AFI_SAFI (afi, safi) peer_af_delete(peer, afi, safi); @@ -2622,19 +2614,17 @@ int peer_group_bind(struct bgp *bgp, union sockunion *su, struct peer *peer, if (peer->conf_if && cap_enhe_preset) peer_flag_set(peer, PEER_FLAG_CAPABILITY_ENHE); - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - if (group->conf->afc[afi][safi]) { - peer->afc[afi][safi] = 1; - - if (peer_af_find(peer, afi, safi) - || peer_af_create(peer, afi, - safi)) { - peer_group2peer_config_copy_af( - group, peer, afi, safi); - } - } else if (peer->afc[afi][safi]) - peer_deactivate(peer, afi, safi); + FOREACH_AFI_SAFI (afi, safi) { + if (group->conf->afc[afi][safi]) { + peer->afc[afi][safi] = 1; + + if (peer_af_find(peer, afi, safi) + || peer_af_create(peer, afi, safi)) { + peer_group2peer_config_copy_af( + group, peer, afi, safi); + } + } else if (peer->afc[afi][safi]) + peer_deactivate(peer, afi, safi); } if (peer->group) { @@ -2704,15 +2694,15 @@ int peer_group_bind(struct bgp *bgp, union sockunion *su, struct peer *peer, /* If the peer-group is active for this afi/safi then activate * for this peer */ - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) - if (group->conf->afc[afi][safi]) { - peer->afc[afi][safi] = 1; - peer_af_create(peer, afi, safi); - peer_group2peer_config_copy_af( - group, peer, afi, safi); - } else if (peer->afc[afi][safi]) - peer_deactivate(peer, afi, safi); + FOREACH_AFI_SAFI (afi, safi) { + if (group->conf->afc[afi][safi]) { + peer->afc[afi][safi] = 1; + peer_af_create(peer, afi, safi); + peer_group2peer_config_copy_af(group, peer, afi, + safi); + } else if (peer->afc[afi][safi]) + peer_deactivate(peer, afi, safi); + } SET_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE); @@ -2734,19 +2724,18 @@ int peer_group_unbind(struct bgp *bgp, struct peer *peer, if (group != peer->group) return BGP_ERR_PEER_GROUP_MISMATCH; - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - if (peer->afc[afi][safi]) { - peer->afc[afi][safi] = 0; - peer_af_flag_reset(peer, afi, safi); - - if (peer_af_delete(peer, afi, safi) != 0) { - zlog_err( - "couldn't delete af structure for peer %s", - peer->host); - } + FOREACH_AFI_SAFI (afi, safi) { + if (peer->afc[afi][safi]) { + peer->afc[afi][safi] = 0; + peer_af_flag_reset(peer, afi, safi); + + if (peer_af_delete(peer, afi, safi) != 0) { + zlog_err( + "couldn't delete af structure for peer %s", + peer->host); } } + } assert(listnode_lookup(group->peer, peer)); peer_unlock(peer); /* peer group list reference */ @@ -2846,18 +2835,17 @@ static struct bgp *bgp_create(as_t *as, const char *name, bgp->group = list_new(); bgp->group->cmp = (int (*)(void *, void *))peer_group_cmp; - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - bgp->route[afi][safi] = bgp_table_init(afi, safi); - bgp->aggregate[afi][safi] = bgp_table_init(afi, safi); - bgp->rib[afi][safi] = bgp_table_init(afi, safi); + FOREACH_AFI_SAFI (afi, safi) { + bgp->route[afi][safi] = bgp_table_init(afi, safi); + bgp->aggregate[afi][safi] = bgp_table_init(afi, safi); + bgp->rib[afi][safi] = bgp_table_init(afi, safi); - /* Enable maximum-paths */ - bgp_maximum_paths_set(bgp, afi, safi, BGP_PEER_EBGP, - multipath_num, 0); - bgp_maximum_paths_set(bgp, afi, safi, BGP_PEER_IBGP, - multipath_num, 0); - } + /* Enable maximum-paths */ + bgp_maximum_paths_set(bgp, afi, safi, BGP_PEER_EBGP, + multipath_num, 0); + bgp_maximum_paths_set(bgp, afi, safi, BGP_PEER_IBGP, + multipath_num, 0); + } bgp->v_update_delay = BGP_UPDATE_DELAY_DEF; bgp->default_local_pref = BGP_DEFAULT_LOCAL_PREF; @@ -3206,27 +3194,26 @@ void bgp_free(struct bgp *bgp) bgp->peerhash = NULL; } - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - /* Special handling for 2-level routing tables. */ - if (safi == SAFI_MPLS_VPN || safi == SAFI_ENCAP - || safi == SAFI_EVPN) { - for (rn = bgp_table_top(bgp->rib[afi][safi]); - rn; rn = bgp_route_next(rn)) { - table = (struct bgp_table *)rn->info; - bgp_table_finish(&table); - } + FOREACH_AFI_SAFI (afi, safi) { + /* Special handling for 2-level routing tables. */ + if (safi == SAFI_MPLS_VPN || safi == SAFI_ENCAP + || safi == SAFI_EVPN) { + for (rn = bgp_table_top(bgp->rib[afi][safi]); rn; + rn = bgp_route_next(rn)) { + table = (struct bgp_table *)rn->info; + bgp_table_finish(&table); } - if (bgp->route[afi][safi]) - bgp_table_finish(&bgp->route[afi][safi]); - if (bgp->aggregate[afi][safi]) - bgp_table_finish(&bgp->aggregate[afi][safi]); - if (bgp->rib[afi][safi]) - bgp_table_finish(&bgp->rib[afi][safi]); - rmap = &bgp->table_map[afi][safi]; - if (rmap->name) - XFREE(MTYPE_ROUTE_MAP_NAME, rmap->name); } + if (bgp->route[afi][safi]) + bgp_table_finish(&bgp->route[afi][safi]); + if (bgp->aggregate[afi][safi]) + bgp_table_finish(&bgp->aggregate[afi][safi]); + if (bgp->rib[afi][safi]) + bgp_table_finish(&bgp->rib[afi][safi]); + rmap = &bgp->table_map[afi][safi]; + if (rmap->name) + XFREE(MTYPE_ROUTE_MAP_NAME, rmap->name); + } bgp_scan_finish(bgp); bgp_address_destroy(bgp); @@ -3360,17 +3347,16 @@ struct peer *peer_create_bind_dynamic_neighbor(struct bgp *bgp, * peer_group_bind as that is sub-optimal and does some stuff we don't * want. */ - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - if (!group->conf->afc[afi][safi]) - continue; - peer->afc[afi][safi] = 1; + FOREACH_AFI_SAFI (afi, safi) { + if (!group->conf->afc[afi][safi]) + continue; + peer->afc[afi][safi] = 1; - if (!peer_af_find(peer, afi, safi)) - peer_af_create(peer, afi, safi); + if (!peer_af_find(peer, afi, safi)) + peer_af_create(peer, afi, safi); - peer_group2peer_config_copy_af(group, peer, afi, safi); - } + peer_group2peer_config_copy_af(group, peer, afi, safi); + } /* Mark as dynamic, but also as a "config node" for other things to * work. */ @@ -5237,45 +5223,40 @@ static void peer_distribute_update(struct access_list *access) update_group_policy_update(bgp, BGP_POLICY_FILTER_LIST, access->name, 0, 0); for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) { - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; - safi++) { - filter = &peer->filter[afi][safi]; - - for (direct = FILTER_IN; - direct < FILTER_MAX; direct++) { - if (filter->dlist[direct].name) - filter->dlist[direct] - .alist = access_list_lookup( - afi, - filter->dlist[direct] - .name); - else + FOREACH_AFI_SAFI (afi, safi) { + filter = &peer->filter[afi][safi]; + + for (direct = FILTER_IN; direct < FILTER_MAX; + direct++) { + if (filter->dlist[direct].name) + filter->dlist[direct] + .alist = access_list_lookup( + afi, filter->dlist[direct] - .alist = NULL; - } + .name); + else + filter->dlist[direct].alist = + NULL; } + } } for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) { - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; - safi++) { - filter = - &group->conf->filter[afi][safi]; - - for (direct = FILTER_IN; - direct < FILTER_MAX; direct++) { - if (filter->dlist[direct].name) - filter->dlist[direct] - .alist = access_list_lookup( - afi, - filter->dlist[direct] - .name); - else + FOREACH_AFI_SAFI (afi, safi) { + filter = &group->conf->filter[afi][safi]; + + for (direct = FILTER_IN; direct < FILTER_MAX; + direct++) { + if (filter->dlist[direct].name) + filter->dlist[direct] + .alist = access_list_lookup( + afi, filter->dlist[direct] - .alist = NULL; - } + .name); + else + filter->dlist[direct].alist = + NULL; } + } } #if ENABLE_BGP_VNC vnc_prefix_list_update(bgp); @@ -5408,45 +5389,40 @@ static void peer_prefix_list_update(struct prefix_list *plist) plist ? prefix_list_name(plist) : NULL, 0, 0); for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) { - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; - safi++) { - filter = &peer->filter[afi][safi]; - - for (direct = FILTER_IN; - direct < FILTER_MAX; direct++) { - if (filter->plist[direct].name) - filter->plist[direct] - .plist = prefix_list_lookup( - afi, - filter->plist[direct] - .name); - else + FOREACH_AFI_SAFI (afi, safi) { + filter = &peer->filter[afi][safi]; + + for (direct = FILTER_IN; direct < FILTER_MAX; + direct++) { + if (filter->plist[direct].name) + filter->plist[direct] + .plist = prefix_list_lookup( + afi, filter->plist[direct] - .plist = NULL; - } + .name); + else + filter->plist[direct].plist = + NULL; } + } } for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) { - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; - safi++) { - filter = - &group->conf->filter[afi][safi]; - - for (direct = FILTER_IN; - direct < FILTER_MAX; direct++) { - if (filter->plist[direct].name) + FOREACH_AFI_SAFI (afi, safi) { + filter = &group->conf->filter[afi][safi]; + + for (direct = FILTER_IN; direct < FILTER_MAX; + direct++) { + if (filter->plist[direct].name) + filter->plist[direct] + .plist = prefix_list_lookup( + afi, filter->plist[direct] - .plist = prefix_list_lookup( - afi, - filter->plist[direct] - .name); - else - filter->plist[direct] - .plist = NULL; - } + .name); + else + filter->plist[direct].plist = + NULL; } + } } } } @@ -5565,43 +5541,38 @@ static void peer_aslist_update(const char *aslist_name) aslist_name, 0, 0); for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) { - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; - safi++) { - filter = &peer->filter[afi][safi]; - - for (direct = FILTER_IN; - direct < FILTER_MAX; direct++) { - if (filter->aslist[direct].name) + FOREACH_AFI_SAFI (afi, safi) { + filter = &peer->filter[afi][safi]; + + for (direct = FILTER_IN; direct < FILTER_MAX; + direct++) { + if (filter->aslist[direct].name) + filter->aslist[direct] + .aslist = as_list_lookup( filter->aslist[direct] - .aslist = as_list_lookup( - filter->aslist[direct] - .name); - else - filter->aslist[direct] - .aslist = NULL; - } + .name); + else + filter->aslist[direct].aslist = + NULL; } + } } for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) { - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; - safi++) { - filter = - &group->conf->filter[afi][safi]; - - for (direct = FILTER_IN; - direct < FILTER_MAX; direct++) { - if (filter->aslist[direct].name) + FOREACH_AFI_SAFI (afi, safi) { + filter = &group->conf->filter[afi][safi]; + + for (direct = FILTER_IN; direct < FILTER_MAX; + direct++) { + if (filter->aslist[direct].name) + filter->aslist[direct] + .aslist = as_list_lookup( filter->aslist[direct] - .aslist = as_list_lookup( - filter->aslist[direct] - .name); - else - filter->aslist[direct] - .aslist = NULL; - } + .name); + else + filter->aslist[direct].aslist = + NULL; } + } } } } -- 2.39.5