mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-07 07:48:07 +00:00
bgpd: use FOREACH_AFI_SAFI where possible
Improves consistency and readability. Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
This commit is contained in:
parent
d32471578b
commit
05c7a1cc93
@ -239,19 +239,16 @@ void bgp_sync_init(struct peer *peer)
|
|||||||
safi_t safi;
|
safi_t safi;
|
||||||
struct bgp_synchronize *sync;
|
struct bgp_synchronize *sync;
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
sync = XCALLOC(MTYPE_BGP_SYNCHRONISE,
|
||||||
sync = XCALLOC(MTYPE_BGP_SYNCHRONISE,
|
sizeof(struct bgp_synchronize));
|
||||||
sizeof(struct bgp_synchronize));
|
BGP_ADV_FIFO_INIT(&sync->update);
|
||||||
BGP_ADV_FIFO_INIT(&sync->update);
|
BGP_ADV_FIFO_INIT(&sync->withdraw);
|
||||||
BGP_ADV_FIFO_INIT(&sync->withdraw);
|
BGP_ADV_FIFO_INIT(&sync->withdraw_low);
|
||||||
BGP_ADV_FIFO_INIT(&sync->withdraw_low);
|
peer->sync[afi][safi] = sync;
|
||||||
peer->sync[afi][safi] = sync;
|
peer->hash[afi][safi] = hash_create(baa_hash_key, baa_hash_cmp,
|
||||||
peer->hash[afi][safi] =
|
"BGP Sync Hash");
|
||||||
hash_create(baa_hash_key,
|
}
|
||||||
baa_hash_cmp,
|
|
||||||
"BGP Sync Hash");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void bgp_sync_delete(struct peer *peer)
|
void bgp_sync_delete(struct peer *peer)
|
||||||
@ -259,15 +256,13 @@ void bgp_sync_delete(struct peer *peer)
|
|||||||
afi_t afi;
|
afi_t afi;
|
||||||
safi_t safi;
|
safi_t safi;
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
if (peer->sync[afi][safi])
|
||||||
if (peer->sync[afi][safi])
|
XFREE(MTYPE_BGP_SYNCHRONISE, peer->sync[afi][safi]);
|
||||||
XFREE(MTYPE_BGP_SYNCHRONISE,
|
peer->sync[afi][safi] = NULL;
|
||||||
peer->sync[afi][safi]);
|
|
||||||
peer->sync[afi][safi] = NULL;
|
|
||||||
|
|
||||||
if (peer->hash[afi][safi])
|
if (peer->hash[afi][safi])
|
||||||
hash_free(peer->hash[afi][safi]);
|
hash_free(peer->hash[afi][safi]);
|
||||||
peer->hash[afi][safi] = NULL;
|
peer->hash[afi][safi] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
112
bgpd/bgp_fsm.c
112
bgpd/bgp_fsm.c
@ -181,22 +181,15 @@ static struct peer *peer_xfer_conn(struct peer *from_peer)
|
|||||||
from_peer->domainname = NULL;
|
from_peer->domainname = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
peer->af_flags[afi][safi] = from_peer->af_flags[afi][safi];
|
||||||
peer->af_flags[afi][safi] =
|
peer->af_sflags[afi][safi] = from_peer->af_sflags[afi][safi];
|
||||||
from_peer->af_flags[afi][safi];
|
peer->af_cap[afi][safi] = from_peer->af_cap[afi][safi];
|
||||||
peer->af_sflags[afi][safi] =
|
peer->afc_nego[afi][safi] = from_peer->afc_nego[afi][safi];
|
||||||
from_peer->af_sflags[afi][safi];
|
peer->afc_adv[afi][safi] = from_peer->afc_adv[afi][safi];
|
||||||
peer->af_cap[afi][safi] = from_peer->af_cap[afi][safi];
|
peer->afc_recv[afi][safi] = from_peer->afc_recv[afi][safi];
|
||||||
peer->afc_nego[afi][safi] =
|
peer->orf_plist[afi][safi] = from_peer->orf_plist[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) {
|
if (bgp_getsockname(peer) < 0) {
|
||||||
zlog_err(
|
zlog_err(
|
||||||
@ -1070,30 +1063,28 @@ int bgp_stop(struct peer *peer)
|
|||||||
peer->fd = -1;
|
peer->fd = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
/* Reset all negotiated variables */
|
||||||
/* Reset all negotiated variables */
|
peer->afc_nego[afi][safi] = 0;
|
||||||
peer->afc_nego[afi][safi] = 0;
|
peer->afc_adv[afi][safi] = 0;
|
||||||
peer->afc_adv[afi][safi] = 0;
|
peer->afc_recv[afi][safi] = 0;
|
||||||
peer->afc_recv[afi][safi] = 0;
|
|
||||||
|
|
||||||
/* peer address family capability flags*/
|
/* peer address family capability flags*/
|
||||||
peer->af_cap[afi][safi] = 0;
|
peer->af_cap[afi][safi] = 0;
|
||||||
|
|
||||||
/* peer address family status flags*/
|
/* peer address family status flags*/
|
||||||
peer->af_sflags[afi][safi] = 0;
|
peer->af_sflags[afi][safi] = 0;
|
||||||
|
|
||||||
/* Received ORF prefix-filter */
|
/* Received ORF prefix-filter */
|
||||||
peer->orf_plist[afi][safi] = NULL;
|
peer->orf_plist[afi][safi] = NULL;
|
||||||
|
|
||||||
if ((peer->status == OpenConfirm)
|
if ((peer->status == OpenConfirm)
|
||||||
|| (peer->status == Established)) {
|
|| (peer->status == Established)) {
|
||||||
/* ORF received prefix-filter pnt */
|
/* ORF received prefix-filter pnt */
|
||||||
sprintf(orf_name, "%s.%d.%d", peer->host, afi,
|
sprintf(orf_name, "%s.%d.%d", peer->host, afi, safi);
|
||||||
safi);
|
prefix_bgp_orf_remove_all(afi, orf_name);
|
||||||
prefix_bgp_orf_remove_all(afi, orf_name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Reset keepalive and holdtime */
|
/* Reset keepalive and holdtime */
|
||||||
if (PEER_OR_GROUP_TIMER_SET(peer)) {
|
if (PEER_OR_GROUP_TIMER_SET(peer)) {
|
||||||
@ -1471,38 +1462,33 @@ static int bgp_establish(struct peer *peer)
|
|||||||
peer->uptime = bgp_clock();
|
peer->uptime = bgp_clock();
|
||||||
|
|
||||||
/* Send route-refresh when ORF is enabled */
|
/* Send route-refresh when ORF is enabled */
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
if (CHECK_FLAG(peer->af_cap[afi][safi],
|
||||||
|
PEER_CAP_ORF_PREFIX_SM_ADV)) {
|
||||||
if (CHECK_FLAG(peer->af_cap[afi][safi],
|
if (CHECK_FLAG(peer->af_cap[afi][safi],
|
||||||
PEER_CAP_ORF_PREFIX_SM_ADV)) {
|
PEER_CAP_ORF_PREFIX_RM_RCV))
|
||||||
if (CHECK_FLAG(peer->af_cap[afi][safi],
|
bgp_route_refresh_send(peer, afi, safi,
|
||||||
PEER_CAP_ORF_PREFIX_RM_RCV))
|
ORF_TYPE_PREFIX,
|
||||||
bgp_route_refresh_send(
|
REFRESH_IMMEDIATE, 0);
|
||||||
peer, afi, safi,
|
else if (CHECK_FLAG(peer->af_cap[afi][safi],
|
||||||
ORF_TYPE_PREFIX,
|
PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
|
||||||
REFRESH_IMMEDIATE, 0);
|
bgp_route_refresh_send(peer, afi, safi,
|
||||||
else if (
|
ORF_TYPE_PREFIX_OLD,
|
||||||
CHECK_FLAG(
|
REFRESH_IMMEDIATE, 0);
|
||||||
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 */
|
/* First update is deferred until ORF or ROUTE-REFRESH is received */
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
if (CHECK_FLAG(peer->af_cap[afi][safi],
|
||||||
|
PEER_CAP_ORF_PREFIX_RM_ADV))
|
||||||
if (CHECK_FLAG(peer->af_cap[afi][safi],
|
if (CHECK_FLAG(peer->af_cap[afi][safi],
|
||||||
PEER_CAP_ORF_PREFIX_RM_ADV))
|
PEER_CAP_ORF_PREFIX_SM_RCV)
|
||||||
if (CHECK_FLAG(peer->af_cap[afi][safi],
|
|| CHECK_FLAG(peer->af_cap[afi][safi],
|
||||||
PEER_CAP_ORF_PREFIX_SM_RCV)
|
PEER_CAP_ORF_PREFIX_SM_OLD_RCV))
|
||||||
|| CHECK_FLAG(
|
SET_FLAG(peer->af_sflags[afi][safi],
|
||||||
peer->af_cap[afi][safi],
|
PEER_STATUS_ORF_WAIT_REFRESH);
|
||||||
PEER_CAP_ORF_PREFIX_SM_OLD_RCV))
|
}
|
||||||
SET_FLAG(peer->af_sflags[afi][safi],
|
|
||||||
PEER_STATUS_ORF_WAIT_REFRESH);
|
|
||||||
|
|
||||||
bgp_announce_peer(peer);
|
bgp_announce_peer(peer);
|
||||||
|
|
||||||
|
210
bgpd/bgp_open.c
210
bgpd/bgp_open.c
@ -1285,59 +1285,52 @@ void bgp_open_capability(struct stream *s, struct peer *peer)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* MP capability for configured AFI, SAFI */
|
/* MP capability for configured AFI, SAFI */
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
if (peer->afc[afi][safi]) {
|
||||||
if (peer->afc[afi][safi]) {
|
/* Convert AFI, SAFI to values for packet. */
|
||||||
/* Convert AFI, SAFI to values for packet. */
|
bgp_map_afi_safi_int2iana(afi, safi, &pkt_afi,
|
||||||
bgp_map_afi_safi_int2iana(afi, safi, &pkt_afi,
|
&pkt_safi);
|
||||||
&pkt_safi);
|
|
||||||
|
|
||||||
peer->afc_adv[afi][safi] = 1;
|
peer->afc_adv[afi][safi] = 1;
|
||||||
stream_putc(s, BGP_OPEN_OPT_CAP);
|
stream_putc(s, BGP_OPEN_OPT_CAP);
|
||||||
stream_putc(s, CAPABILITY_CODE_MP_LEN + 2);
|
stream_putc(s, CAPABILITY_CODE_MP_LEN + 2);
|
||||||
stream_putc(s, CAPABILITY_CODE_MP);
|
stream_putc(s, CAPABILITY_CODE_MP);
|
||||||
stream_putc(s, CAPABILITY_CODE_MP_LEN);
|
stream_putc(s, CAPABILITY_CODE_MP_LEN);
|
||||||
stream_putw(s, pkt_afi);
|
stream_putw(s, pkt_afi);
|
||||||
stream_putc(s, 0);
|
stream_putc(s, 0);
|
||||||
stream_putc(s, pkt_safi);
|
stream_putc(s, pkt_safi);
|
||||||
|
|
||||||
/* Extended nexthop capability - currently
|
/* Extended nexthop capability - currently
|
||||||
* supporting RFC-5549 for
|
* supporting RFC-5549 for
|
||||||
* Link-Local peering only
|
* 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
|
||||||
*/
|
*/
|
||||||
if (CHECK_FLAG(peer->flags,
|
SET_FLAG(peer->cap, PEER_CAP_ENHE_ADV);
|
||||||
PEER_FLAG_CAPABILITY_ENHE)
|
stream_putc(s, BGP_OPEN_OPT_CAP);
|
||||||
&& peer->su.sa.sa_family == AF_INET6
|
stream_putc(s, CAPABILITY_CODE_ENHE_LEN + 2);
|
||||||
&& IN6_IS_ADDR_LINKLOCAL(
|
stream_putc(s, CAPABILITY_CODE_ENHE);
|
||||||
&peer->su.sin6.sin6_addr)
|
stream_putc(s, CAPABILITY_CODE_ENHE_LEN);
|
||||||
&& 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],
|
SET_FLAG(peer->af_cap[AFI_IP][safi],
|
||||||
PEER_CAP_ENHE_AF_ADV);
|
PEER_CAP_ENHE_AF_ADV);
|
||||||
stream_putw(s, pkt_afi);
|
stream_putw(s, pkt_afi);
|
||||||
stream_putw(s, pkt_safi);
|
stream_putw(s, pkt_safi);
|
||||||
stream_putw(s, afi_int2iana(AFI_IP6));
|
stream_putw(s, afi_int2iana(AFI_IP6));
|
||||||
|
|
||||||
if (CHECK_FLAG(peer->af_cap[afi][safi],
|
if (CHECK_FLAG(peer->af_cap[afi][safi],
|
||||||
PEER_CAP_ENHE_AF_RCV))
|
PEER_CAP_ENHE_AF_RCV))
|
||||||
SET_FLAG(
|
SET_FLAG(peer->af_cap[afi][safi],
|
||||||
peer->af_cap[afi][safi],
|
PEER_CAP_ENHE_AF_NEGO);
|
||||||
PEER_CAP_ENHE_AF_NEGO);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Route refresh. */
|
/* Route refresh. */
|
||||||
SET_FLAG(peer->cap, PEER_CAP_REFRESH_ADV);
|
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);
|
stream_putl(s, local_as);
|
||||||
|
|
||||||
/* AddPath */
|
/* AddPath */
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
if (peer->afc[afi][safi]) {
|
||||||
if (peer->afc[afi][safi]) {
|
afi_safi_count++;
|
||||||
afi_safi_count++;
|
|
||||||
|
|
||||||
/* Only advertise addpath TX if a feature that
|
/* Only advertise addpath TX if a feature that
|
||||||
* will use it is
|
* will use it is
|
||||||
* configured */
|
* configured */
|
||||||
if (CHECK_FLAG(peer->af_flags[afi][safi],
|
if (CHECK_FLAG(peer->af_flags[afi][safi],
|
||||||
PEER_FLAG_ADDPATH_TX_ALL_PATHS)
|
PEER_FLAG_ADDPATH_TX_ALL_PATHS)
|
||||||
|| CHECK_FLAG(
|
|| CHECK_FLAG(peer->af_flags[afi][safi],
|
||||||
peer->af_flags[afi][safi],
|
PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS))
|
||||||
PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS))
|
adv_addpath_tx = 1;
|
||||||
adv_addpath_tx = 1;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SET_FLAG(peer->cap, PEER_CAP_ADDPATH_ADV);
|
SET_FLAG(peer->cap, PEER_CAP_ADDPATH_ADV);
|
||||||
stream_putc(s, BGP_OPEN_OPT_CAP);
|
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);
|
||||||
stream_putc(s, CAPABILITY_CODE_ADDPATH_LEN * afi_safi_count);
|
stream_putc(s, CAPABILITY_CODE_ADDPATH_LEN * afi_safi_count);
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
if (peer->afc[afi][safi]) {
|
||||||
if (peer->afc[afi][safi]) {
|
/* Convert AFI, SAFI to values for packet. */
|
||||||
/* Convert AFI, SAFI to values for packet. */
|
bgp_map_afi_safi_int2iana(afi, safi, &pkt_afi,
|
||||||
bgp_map_afi_safi_int2iana(afi, safi, &pkt_afi,
|
&pkt_safi);
|
||||||
&pkt_safi);
|
|
||||||
|
|
||||||
stream_putw(s, pkt_afi);
|
stream_putw(s, pkt_afi);
|
||||||
stream_putc(s, pkt_safi);
|
stream_putc(s, pkt_safi);
|
||||||
|
|
||||||
if (adv_addpath_tx) {
|
if (adv_addpath_tx) {
|
||||||
stream_putc(s,
|
stream_putc(s, BGP_ADDPATH_RX | BGP_ADDPATH_TX);
|
||||||
BGP_ADDPATH_RX
|
SET_FLAG(peer->af_cap[afi][safi],
|
||||||
| BGP_ADDPATH_TX);
|
PEER_CAP_ADDPATH_AF_RX_ADV);
|
||||||
SET_FLAG(peer->af_cap[afi][safi],
|
SET_FLAG(peer->af_cap[afi][safi],
|
||||||
PEER_CAP_ADDPATH_AF_RX_ADV);
|
PEER_CAP_ADDPATH_AF_TX_ADV);
|
||||||
SET_FLAG(peer->af_cap[afi][safi],
|
} else {
|
||||||
PEER_CAP_ADDPATH_AF_TX_ADV);
|
stream_putc(s, BGP_ADDPATH_RX);
|
||||||
} else {
|
SET_FLAG(peer->af_cap[afi][safi],
|
||||||
stream_putc(s, BGP_ADDPATH_RX);
|
PEER_CAP_ADDPATH_AF_RX_ADV);
|
||||||
SET_FLAG(peer->af_cap[afi][safi],
|
UNSET_FLAG(peer->af_cap[afi][safi],
|
||||||
PEER_CAP_ADDPATH_AF_RX_ADV);
|
PEER_CAP_ADDPATH_AF_TX_ADV);
|
||||||
UNSET_FLAG(peer->af_cap[afi][safi],
|
|
||||||
PEER_CAP_ADDPATH_AF_TX_ADV);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* ORF capability. */
|
/* ORF capability. */
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
if (CHECK_FLAG(peer->af_flags[afi][safi],
|
||||||
if (CHECK_FLAG(peer->af_flags[afi][safi],
|
PEER_FLAG_ORF_PREFIX_SM)
|
||||||
PEER_FLAG_ORF_PREFIX_SM)
|
|| CHECK_FLAG(peer->af_flags[afi][safi],
|
||||||
|| CHECK_FLAG(peer->af_flags[afi][safi],
|
PEER_FLAG_ORF_PREFIX_RM)) {
|
||||||
PEER_FLAG_ORF_PREFIX_RM)) {
|
bgp_open_capability_orf(s, peer, afi, safi,
|
||||||
bgp_open_capability_orf(
|
CAPABILITY_CODE_ORF_OLD);
|
||||||
s, peer, afi, safi,
|
bgp_open_capability_orf(s, peer, afi, safi,
|
||||||
CAPABILITY_CODE_ORF_OLD);
|
CAPABILITY_CODE_ORF);
|
||||||
bgp_open_capability_orf(s, peer, afi, safi,
|
}
|
||||||
CAPABILITY_CODE_ORF);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* Dynamic capability. */
|
/* Dynamic capability. */
|
||||||
if (CHECK_FLAG(peer->flags, PEER_FLAG_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
|
config
|
||||||
is present */
|
is present */
|
||||||
if (bgp_flag_check(peer->bgp, BGP_FLAG_GRACEFUL_RESTART)) {
|
if (bgp_flag_check(peer->bgp, BGP_FLAG_GRACEFUL_RESTART)) {
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
if (peer->afc[afi][safi]) {
|
||||||
if (peer->afc[afi][safi]) {
|
/* Convert AFI, SAFI to values for
|
||||||
/* Convert AFI, SAFI to values for
|
* packet. */
|
||||||
* packet. */
|
bgp_map_afi_safi_int2iana(afi, safi, &pkt_afi,
|
||||||
bgp_map_afi_safi_int2iana(
|
&pkt_safi);
|
||||||
afi, safi, &pkt_afi, &pkt_safi);
|
stream_putw(s, pkt_afi);
|
||||||
stream_putw(s, pkt_afi);
|
stream_putc(s, pkt_safi);
|
||||||
stream_putc(s, pkt_safi);
|
if (bgp_flag_check(peer->bgp,
|
||||||
if (bgp_flag_check(
|
BGP_FLAG_GR_PRESERVE_FWD))
|
||||||
peer->bgp,
|
stream_putc(s, RESTART_F_BIT);
|
||||||
BGP_FLAG_GR_PRESERVE_FWD))
|
else
|
||||||
stream_putc(s, RESTART_F_BIT);
|
stream_putc(s, 0);
|
||||||
else
|
}
|
||||||
stream_putc(s, 0);
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Total Graceful restart capability Len. */
|
/* Total Graceful restart capability Len. */
|
||||||
|
@ -204,66 +204,60 @@ static struct stream *bgp_write_packet(struct peer *peer)
|
|||||||
if (peer->bgp && peer->bgp->main_peers_update_hold)
|
if (peer->bgp && peer->bgp->main_peers_update_hold)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
paf = peer_af_find(peer, afi, safi);
|
||||||
paf = peer_af_find(peer, afi, safi);
|
if (!paf || !PAF_SUBGRP(paf))
|
||||||
if (!paf || !PAF_SUBGRP(paf))
|
continue;
|
||||||
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;
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -282,48 +276,44 @@ static void bgp_write_proceed_actions(struct peer *peer)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
paf = peer_af_find(peer, afi, safi);
|
||||||
paf = peer_af_find(peer, afi, safi);
|
if (!paf)
|
||||||
if (!paf)
|
continue;
|
||||||
continue;
|
subgrp = paf->subgroup;
|
||||||
subgrp = paf->subgroup;
|
if (!subgrp)
|
||||||
if (!subgrp)
|
continue;
|
||||||
continue;
|
|
||||||
|
|
||||||
next_pkt = paf->next_pkt_to_send;
|
next_pkt = paf->next_pkt_to_send;
|
||||||
if (next_pkt && next_pkt->buffer) {
|
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)) {
|
||||||
|
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,
|
BGP_WRITE_ON(peer->t_write, bgp_write,
|
||||||
peer->fd);
|
peer->fd);
|
||||||
return;
|
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)) {
|
|
||||||
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) {
|
if (fullq_found) {
|
||||||
BGP_WRITE_ON(peer->t_write, bgp_write, peer->fd);
|
BGP_WRITE_ON(peer->t_write, bgp_write, peer->fd);
|
||||||
return;
|
return;
|
||||||
@ -1300,18 +1290,17 @@ static void bgp_update_explicit_eors(struct peer *peer)
|
|||||||
if (bgp_debug_neighbor_events(peer))
|
if (bgp_debug_neighbor_events(peer))
|
||||||
zlog_debug("Peer %s: Checking explicit EORs", peer->host);
|
zlog_debug("Peer %s: Checking explicit EORs", peer->host);
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
if (peer->afc_nego[afi][safi]
|
||||||
if (peer->afc_nego[afi][safi]
|
&& !CHECK_FLAG(peer->af_sflags[afi][safi],
|
||||||
&& !CHECK_FLAG(peer->af_sflags[afi][safi],
|
PEER_STATUS_EOR_RECEIVED)) {
|
||||||
PEER_STATUS_EOR_RECEIVED)) {
|
if (bgp_debug_neighbor_events(peer))
|
||||||
if (bgp_debug_neighbor_events(peer))
|
zlog_debug(
|
||||||
zlog_debug(
|
" afi %d safi %d didnt receive EOR",
|
||||||
" afi %d safi %d didnt receive EOR",
|
afi, safi);
|
||||||
afi, safi);
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
peer->update_delay_over = 1;
|
peer->update_delay_over = 1;
|
||||||
peer->bgp->explicit_eors++;
|
peer->bgp->explicit_eors++;
|
||||||
|
167
bgpd/bgp_route.c
167
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));
|
sizeof(bgp->update_delay_zebra_resume_time));
|
||||||
|
|
||||||
bgp->main_zebra_update_hold = 0;
|
bgp->main_zebra_update_hold = 0;
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
if (bgp_fibupd_safi(safi))
|
||||||
if (bgp_fibupd_safi(safi))
|
bgp_zebra_announce_table(bgp, afi, safi);
|
||||||
bgp_zebra_announce_table(bgp, afi,
|
}
|
||||||
safi);
|
|
||||||
}
|
|
||||||
bgp->main_peers_update_hold = 0;
|
bgp->main_peers_update_hold = 0;
|
||||||
|
|
||||||
bgp_start_routeadv(bgp);
|
bgp_start_routeadv(bgp);
|
||||||
@ -3434,9 +3432,8 @@ void bgp_announce_route_all(struct peer *peer)
|
|||||||
afi_t afi;
|
afi_t afi;
|
||||||
safi_t safi;
|
safi_t safi;
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi)
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
bgp_announce_route(peer, afi, safi);
|
||||||
bgp_announce_route(peer, afi, safi);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bgp_soft_reconfig_table(struct peer *peer, afi_t afi, safi_t 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;
|
afi_t afi;
|
||||||
safi_t safi;
|
safi_t safi;
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi)
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
bgp_clear_route(peer, afi, safi);
|
||||||
bgp_clear_route(peer, afi, safi);
|
|
||||||
|
|
||||||
#if ENABLE_BGP_VNC
|
#if ENABLE_BGP_VNC
|
||||||
rfapiProcessPeerDown(peer);
|
rfapiProcessPeerDown(peer);
|
||||||
@ -4624,30 +4620,28 @@ void bgp_static_add(struct bgp *bgp)
|
|||||||
struct bgp_table *table;
|
struct bgp_table *table;
|
||||||
struct bgp_static *bgp_static;
|
struct bgp_static *bgp_static;
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi)
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
for (rn = bgp_table_top(bgp->route[afi][safi]); rn;
|
||||||
for (rn = bgp_table_top(bgp->route[afi][safi]); rn;
|
rn = bgp_route_next(rn)) {
|
||||||
rn = bgp_route_next(rn)) {
|
if (rn->info == NULL)
|
||||||
if (rn->info == NULL)
|
continue;
|
||||||
continue;
|
|
||||||
|
|
||||||
if ((safi == SAFI_MPLS_VPN)
|
if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP)
|
||||||
|| (safi == SAFI_ENCAP)
|
|| (safi == SAFI_EVPN)) {
|
||||||
|| (safi == SAFI_EVPN)) {
|
table = rn->info;
|
||||||
table = rn->info;
|
|
||||||
|
|
||||||
for (rm = bgp_table_top(table); rm;
|
for (rm = bgp_table_top(table); rm;
|
||||||
rm = bgp_route_next(rm)) {
|
rm = bgp_route_next(rm)) {
|
||||||
bgp_static = rm->info;
|
bgp_static = rm->info;
|
||||||
bgp_static_update_safi(
|
bgp_static_update_safi(bgp, &rm->p,
|
||||||
bgp, &rm->p, bgp_static,
|
bgp_static, afi,
|
||||||
afi, safi);
|
safi);
|
||||||
}
|
|
||||||
} else {
|
|
||||||
bgp_static_update(bgp, &rn->p, rn->info,
|
|
||||||
afi, safi);
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
bgp_static_update(bgp, &rn->p, rn->info, afi,
|
||||||
|
safi);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from bgp_delete(). Delete all static routes from the BGP
|
/* 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_table *table;
|
||||||
struct bgp_static *bgp_static;
|
struct bgp_static *bgp_static;
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi)
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
for (rn = bgp_table_top(bgp->route[afi][safi]); rn;
|
||||||
for (rn = bgp_table_top(bgp->route[afi][safi]); rn;
|
rn = bgp_route_next(rn)) {
|
||||||
rn = bgp_route_next(rn)) {
|
if (rn->info == NULL)
|
||||||
if (rn->info == NULL)
|
continue;
|
||||||
continue;
|
|
||||||
|
|
||||||
if ((safi == SAFI_MPLS_VPN)
|
if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP)
|
||||||
|| (safi == SAFI_ENCAP)
|
|| (safi == SAFI_EVPN)) {
|
||||||
|| (safi == SAFI_EVPN)) {
|
table = rn->info;
|
||||||
table = rn->info;
|
|
||||||
|
|
||||||
for (rm = bgp_table_top(table); rm;
|
for (rm = bgp_table_top(table); rm;
|
||||||
rm = bgp_route_next(rm)) {
|
rm = bgp_route_next(rm)) {
|
||||||
bgp_static = rm->info;
|
bgp_static = rm->info;
|
||||||
bgp_static_withdraw_safi(
|
bgp_static_withdraw_safi(
|
||||||
bgp, &rm->p, AFI_IP,
|
bgp, &rm->p, AFI_IP, safi,
|
||||||
safi,
|
(struct prefix_rd *)&rn->p);
|
||||||
(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);
|
bgp_static_free(bgp_static);
|
||||||
rn->info = NULL;
|
rn->info = NULL;
|
||||||
bgp_unlock_node(rn);
|
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)
|
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 */
|
/* Use this flag to force reprocessing of the route */
|
||||||
bgp_flag_set(bgp, BGP_FLAG_FORCE_STATIC_PROCESS);
|
bgp_flag_set(bgp, BGP_FLAG_FORCE_STATIC_PROCESS);
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
for (rn = bgp_table_top(bgp->route[afi][safi]); rn;
|
||||||
for (rn = bgp_table_top(bgp->route[afi][safi]); rn;
|
rn = bgp_route_next(rn)) {
|
||||||
rn = bgp_route_next(rn)) {
|
if (rn->info == NULL)
|
||||||
if (rn->info == NULL)
|
continue;
|
||||||
continue;
|
|
||||||
|
|
||||||
if ((safi == SAFI_MPLS_VPN)
|
if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP)
|
||||||
|| (safi == SAFI_ENCAP)
|
|| (safi == SAFI_EVPN)) {
|
||||||
|| (safi == SAFI_EVPN)) {
|
table = rn->info;
|
||||||
table = rn->info;
|
|
||||||
|
|
||||||
for (rm = bgp_table_top(table); rm;
|
for (rm = bgp_table_top(table); rm;
|
||||||
rm = bgp_route_next(rm)) {
|
rm = bgp_route_next(rm)) {
|
||||||
bgp_static = rm->info;
|
bgp_static = rm->info;
|
||||||
bgp_static_update_safi(
|
bgp_static_update_safi(bgp, &rm->p,
|
||||||
bgp, &rm->p, bgp_static,
|
bgp_static, afi,
|
||||||
afi, safi);
|
safi);
|
||||||
}
|
|
||||||
} else {
|
|
||||||
bgp_static = rn->info;
|
|
||||||
bgp_static_update(bgp, &rn->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);
|
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;
|
afi_t afi;
|
||||||
safi_t safi;
|
safi_t safi;
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi)
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
bgp_purge_af_static_redist_routes(bgp, afi, safi);
|
||||||
bgp_purge_af_static_redist_routes(bgp, afi, safi);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -11350,10 +11336,8 @@ void bgp_route_init(void)
|
|||||||
safi_t safi;
|
safi_t safi;
|
||||||
|
|
||||||
/* Init BGP distance table. */
|
/* Init BGP distance table. */
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi)
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
bgp_distance_table[afi][safi] = bgp_table_init(afi, safi);
|
||||||
bgp_distance_table[afi][safi] =
|
|
||||||
bgp_table_init(afi, safi);
|
|
||||||
|
|
||||||
/* IPv4 BGP commands. */
|
/* IPv4 BGP commands. */
|
||||||
install_element(BGP_NODE, &bgp_table_map_cmd);
|
install_element(BGP_NODE, &bgp_table_map_cmd);
|
||||||
@ -11525,9 +11509,8 @@ void bgp_route_finish(void)
|
|||||||
afi_t afi;
|
afi_t afi;
|
||||||
safi_t safi;
|
safi_t safi;
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
bgp_table_unlock(bgp_distance_table[afi][safi]);
|
||||||
bgp_table_unlock(bgp_distance_table[afi][safi]);
|
bgp_distance_table[afi][safi] = NULL;
|
||||||
bgp_distance_table[afi][safi] = NULL;
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
/* All the peers have been updated correctly already. This is
|
||||||
* just updating the placeholder data. No real update required.
|
* just updating the placeholder data. No real update required.
|
||||||
*/
|
*/
|
||||||
for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group))
|
for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
filter = &group->conf->filter[afi][safi];
|
||||||
filter = &group->conf->filter[afi][safi];
|
|
||||||
|
|
||||||
for (direct = RMAP_IN; direct < RMAP_MAX;
|
for (direct = RMAP_IN; direct < RMAP_MAX; direct++) {
|
||||||
direct++) {
|
if ((filter->map[direct].name)
|
||||||
if ((filter->map[direct].name)
|
&& (strcmp(rmap_name,
|
||||||
&& (strcmp(rmap_name,
|
filter->map[direct].name)
|
||||||
filter->map[direct].name)
|
|
||||||
== 0))
|
|
||||||
filter->map[direct].map = map;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filter->usmap.name
|
|
||||||
&& (strcmp(rmap_name, filter->usmap.name)
|
|
||||||
== 0))
|
== 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))
|
if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
/* process in/out/import/export/default-orig
|
||||||
/* process in/out/import/export/default-orig
|
* route-maps */
|
||||||
* route-maps */
|
bgp_route_map_process_peer(rmap_name, map, peer, afi,
|
||||||
bgp_route_map_process_peer(rmap_name, map, peer,
|
safi, route_update);
|
||||||
afi, safi,
|
}
|
||||||
route_update);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for outbound/default-orig route-maps, process for groups */
|
/* for outbound/default-orig route-maps, process for groups */
|
||||||
@ -2947,63 +2943,56 @@ static void bgp_route_map_process_update(struct bgp *bgp, const char *rmap_name,
|
|||||||
/* update peer-group config (template) */
|
/* update peer-group config (template) */
|
||||||
bgp_route_map_update_peer_group(rmap_name, map, bgp);
|
bgp_route_map_update_peer_group(rmap_name, map, bgp);
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
/* For table route-map updates. */
|
||||||
/* For table route-map updates. */
|
if (!bgp_fibupd_safi(safi))
|
||||||
if (!bgp_fibupd_safi(safi))
|
continue;
|
||||||
continue;
|
|
||||||
|
|
||||||
if (bgp->table_map[afi][safi].name
|
if (bgp->table_map[afi][safi].name
|
||||||
&& (strcmp(rmap_name,
|
&& (strcmp(rmap_name, bgp->table_map[afi][safi].name)
|
||||||
bgp->table_map[afi][safi].name)
|
== 0)) {
|
||||||
== 0)) {
|
bgp->table_map[afi][safi].map = map;
|
||||||
bgp->table_map[afi][safi].map = map;
|
|
||||||
|
|
||||||
if (BGP_DEBUG(zebra, ZEBRA))
|
if (BGP_DEBUG(zebra, ZEBRA))
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Processing route_map %s update on "
|
"Processing route_map %s update on "
|
||||||
"table map",
|
"table map",
|
||||||
rmap_name);
|
rmap_name);
|
||||||
if (route_update)
|
if (route_update)
|
||||||
bgp_zebra_announce_table(bgp, afi,
|
bgp_zebra_announce_table(bgp, afi, safi);
|
||||||
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 redistribute route-map updates. */
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
||||||
for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
|
for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
|
||||||
|
692
bgpd/bgp_vty.c
692
bgpd/bgp_vty.c
@ -1654,15 +1654,13 @@ DEFUN (no_bgp_deterministic_med,
|
|||||||
bestpath_per_as_used = 0;
|
bestpath_per_as_used = 0;
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
|
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi)
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX;
|
if (CHECK_FLAG(
|
||||||
safi++)
|
peer->af_flags[afi][safi],
|
||||||
if (CHECK_FLAG(
|
PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS)) {
|
||||||
peer->af_flags[afi][safi],
|
bestpath_per_as_used = 1;
|
||||||
PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS)) {
|
break;
|
||||||
bestpath_per_as_used = 1;
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bestpath_per_as_used)
|
if (bestpath_per_as_used)
|
||||||
break;
|
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();
|
json_add = json_object_new_object();
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST;
|
json_object *json_sub = NULL;
|
||||||
safi < SAFI_MAX; safi++) {
|
json_sub =
|
||||||
json_object *json_sub =
|
json_object_new_object();
|
||||||
NULL;
|
print_store = afi_safi_print(
|
||||||
json_sub =
|
afi, safi);
|
||||||
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(
|
if (CHECK_FLAG(
|
||||||
p->af_cap
|
p->af_cap
|
||||||
[afi]
|
[afi]
|
||||||
[safi],
|
[safi],
|
||||||
PEER_CAP_ADDPATH_AF_TX_ADV)
|
PEER_CAP_ADDPATH_AF_TX_ADV)
|
||||||
|| CHECK_FLAG(
|
&& CHECK_FLAG(
|
||||||
p->af_cap
|
p->af_cap
|
||||||
[afi]
|
[afi]
|
||||||
[safi],
|
[safi],
|
||||||
PEER_CAP_ADDPATH_AF_TX_RCV)) {
|
PEER_CAP_ADDPATH_AF_TX_RCV))
|
||||||
if (CHECK_FLAG(
|
json_object_boolean_true_add(
|
||||||
p->af_cap
|
json_sub,
|
||||||
[afi]
|
"txAdvertisedAndReceived");
|
||||||
[safi],
|
else if (
|
||||||
PEER_CAP_ADDPATH_AF_TX_ADV)
|
CHECK_FLAG(
|
||||||
&& CHECK_FLAG(
|
p->af_cap
|
||||||
p->af_cap
|
[afi]
|
||||||
[afi]
|
[safi],
|
||||||
[safi],
|
PEER_CAP_ADDPATH_AF_TX_ADV))
|
||||||
PEER_CAP_ADDPATH_AF_TX_RCV))
|
json_object_boolean_true_add(
|
||||||
json_object_boolean_true_add(
|
json_sub,
|
||||||
json_sub,
|
"txAdvertised");
|
||||||
"txAdvertisedAndReceived");
|
else if (
|
||||||
else if (
|
CHECK_FLAG(
|
||||||
CHECK_FLAG(
|
p->af_cap
|
||||||
p->af_cap
|
[afi]
|
||||||
[afi]
|
[safi],
|
||||||
[safi],
|
PEER_CAP_ADDPATH_AF_TX_RCV))
|
||||||
PEER_CAP_ADDPATH_AF_TX_ADV))
|
json_object_boolean_true_add(
|
||||||
json_object_boolean_true_add(
|
json_sub,
|
||||||
json_sub,
|
"txReceived");
|
||||||
"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(
|
if (CHECK_FLAG(
|
||||||
p->af_cap
|
p->af_cap
|
||||||
[afi]
|
[afi]
|
||||||
[safi],
|
[safi],
|
||||||
PEER_CAP_ADDPATH_AF_RX_ADV)
|
PEER_CAP_ADDPATH_AF_RX_ADV)
|
||||||
|| CHECK_FLAG(
|
&& 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(
|
|
||||||
p->af_cap
|
p->af_cap
|
||||||
[afi]
|
[afi]
|
||||||
[safi],
|
[safi],
|
||||||
PEER_CAP_ADDPATH_AF_RX_RCV))
|
PEER_CAP_ADDPATH_AF_RX_RCV))
|
||||||
json_object_object_add(
|
json_object_boolean_true_add(
|
||||||
json_add,
|
json_sub,
|
||||||
print_store,
|
"rxAdvertisedAndReceived");
|
||||||
json_sub);
|
else if (
|
||||||
else
|
CHECK_FLAG(
|
||||||
json_object_free(
|
p->af_cap
|
||||||
json_sub);
|
[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_object_object_add(
|
||||||
json_cap, "addPath", json_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_object *json_multi = NULL;
|
||||||
json_multi = json_object_new_object();
|
json_multi = json_object_new_object();
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST;
|
if (p->afc_adv[afi][safi]
|
||||||
safi < SAFI_MAX; safi++) {
|
|| p->afc_recv[afi][safi]) {
|
||||||
|
json_object *json_exten = NULL;
|
||||||
|
json_exten =
|
||||||
|
json_object_new_object();
|
||||||
|
|
||||||
if (p->afc_adv[afi][safi]
|
if (p->afc_adv[afi][safi]
|
||||||
|| p->afc_recv[afi][safi]) {
|
&& p->afc_recv[afi][safi])
|
||||||
json_object
|
json_object_boolean_true_add(
|
||||||
*json_exten =
|
json_exten,
|
||||||
NULL;
|
"advertisedAndReceived");
|
||||||
json_exten =
|
else if (p->afc_adv[afi][safi])
|
||||||
json_object_new_object();
|
json_object_boolean_true_add(
|
||||||
|
json_exten,
|
||||||
|
"advertised");
|
||||||
|
else if (p->afc_recv[afi][safi])
|
||||||
|
json_object_boolean_true_add(
|
||||||
|
json_exten,
|
||||||
|
"received");
|
||||||
|
|
||||||
if (p->afc_adv[afi]
|
json_object_object_add(
|
||||||
[safi]
|
json_multi,
|
||||||
&& p->afc_recv
|
afi_safi_print(afi,
|
||||||
[afi]
|
safi),
|
||||||
[safi])
|
json_exten);
|
||||||
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_object_object_add(
|
||||||
@ -8798,37 +8770,33 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, u_char use_json,
|
|||||||
"gracefulRestartRemoteTimerMsecs",
|
"gracefulRestartRemoteTimerMsecs",
|
||||||
p->v_gr_restart * 1000);
|
p->v_gr_restart * 1000);
|
||||||
|
|
||||||
for (afi = AFI_IP;
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
afi < AFI_MAX; afi++) {
|
if (CHECK_FLAG(
|
||||||
for (safi = SAFI_UNICAST;
|
p->af_cap
|
||||||
safi < SAFI_MAX;
|
[afi]
|
||||||
safi++) {
|
[safi],
|
||||||
|
PEER_CAP_RESTART_AF_RCV)) {
|
||||||
|
json_object *
|
||||||
|
json_sub =
|
||||||
|
NULL;
|
||||||
|
json_sub =
|
||||||
|
json_object_new_object();
|
||||||
|
|
||||||
if (CHECK_FLAG(
|
if (CHECK_FLAG(
|
||||||
p->af_cap
|
p->af_cap
|
||||||
[afi]
|
[afi]
|
||||||
[safi],
|
[safi],
|
||||||
PEER_CAP_RESTART_AF_RCV)) {
|
PEER_CAP_RESTART_AF_PRESERVE_RCV))
|
||||||
json_object *json_sub =
|
json_object_boolean_true_add(
|
||||||
NULL;
|
json_sub,
|
||||||
json_sub =
|
"preserved");
|
||||||
json_object_new_object();
|
restart_af_count++;
|
||||||
|
json_object_object_add(
|
||||||
if (CHECK_FLAG(
|
json_restart,
|
||||||
p->af_cap
|
afi_safi_print(
|
||||||
[afi]
|
afi,
|
||||||
[safi],
|
safi),
|
||||||
PEER_CAP_RESTART_AF_PRESERVE_RCV))
|
json_sub);
|
||||||
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) {
|
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)) {
|
PEER_CAP_ADDPATH_ADV)) {
|
||||||
vty_out(vty, " AddPath:\n");
|
vty_out(vty, " AddPath:\n");
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST;
|
if (CHECK_FLAG(
|
||||||
safi < SAFI_MAX; safi++) {
|
p->af_cap[afi]
|
||||||
if (CHECK_FLAG(
|
[safi],
|
||||||
p->af_cap
|
PEER_CAP_ADDPATH_AF_TX_ADV)
|
||||||
[afi]
|
|| CHECK_FLAG(
|
||||||
[safi],
|
p->af_cap[afi]
|
||||||
PEER_CAP_ADDPATH_AF_TX_ADV)
|
[safi],
|
||||||
|| CHECK_FLAG(
|
PEER_CAP_ADDPATH_AF_TX_RCV)) {
|
||||||
p->af_cap
|
vty_out(vty,
|
||||||
[afi]
|
" %s: TX ",
|
||||||
[safi],
|
afi_safi_print(
|
||||||
PEER_CAP_ADDPATH_AF_TX_RCV)) {
|
afi,
|
||||||
vty_out(vty,
|
safi));
|
||||||
" %s: TX ",
|
|
||||||
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 "
|
|
||||||
: "");
|
|
||||||
|
|
||||||
vty_out(vty,
|
|
||||||
"\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CHECK_FLAG(
|
if (CHECK_FLAG(
|
||||||
p->af_cap
|
p->af_cap
|
||||||
[afi]
|
[afi]
|
||||||
[safi],
|
[safi],
|
||||||
PEER_CAP_ADDPATH_AF_RX_ADV)
|
PEER_CAP_ADDPATH_AF_TX_ADV))
|
||||||
|| CHECK_FLAG(
|
|
||||||
p->af_cap
|
|
||||||
[afi]
|
|
||||||
[safi],
|
|
||||||
PEER_CAP_ADDPATH_AF_RX_RCV)) {
|
|
||||||
vty_out(vty,
|
vty_out(vty,
|
||||||
" %s: RX ",
|
"advertised %s",
|
||||||
afi_safi_print(
|
afi_safi_print(
|
||||||
afi,
|
afi,
|
||||||
safi));
|
safi));
|
||||||
|
|
||||||
if (CHECK_FLAG(
|
if (CHECK_FLAG(
|
||||||
p->af_cap
|
p->af_cap
|
||||||
[afi]
|
[afi]
|
||||||
[safi],
|
[safi],
|
||||||
PEER_CAP_ADDPATH_AF_RX_ADV))
|
PEER_CAP_ADDPATH_AF_TX_RCV))
|
||||||
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 "
|
|
||||||
: "");
|
|
||||||
|
|
||||||
vty_out(vty,
|
vty_out(vty,
|
||||||
"\n");
|
"%sreceived",
|
||||||
}
|
CHECK_FLAG(
|
||||||
|
p->af_cap
|
||||||
|
[afi]
|
||||||
|
[safi],
|
||||||
|
PEER_CAP_ADDPATH_AF_TX_ADV)
|
||||||
|
? " and "
|
||||||
|
: "");
|
||||||
|
|
||||||
|
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))
|
||||||
|
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 "
|
||||||
|
: "");
|
||||||
|
|
||||||
|
vty_out(vty, "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Dynamic */
|
/* Dynamic */
|
||||||
@ -9065,30 +9025,25 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, u_char use_json,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Multiprotocol Extensions */
|
/* Multiprotocol Extensions */
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi)
|
||||||
for (safi = SAFI_UNICAST;
|
if (p->afc_adv[afi][safi]
|
||||||
safi < SAFI_MAX; safi++)
|
|| p->afc_recv[afi][safi]) {
|
||||||
if (p->afc_adv[afi][safi]
|
vty_out(vty,
|
||||||
|| p->afc_recv[afi][safi]) {
|
" Address Family %s:",
|
||||||
|
afi_safi_print(afi,
|
||||||
|
safi));
|
||||||
|
if (p->afc_adv[afi][safi])
|
||||||
vty_out(vty,
|
vty_out(vty,
|
||||||
" Address Family %s:",
|
" advertised");
|
||||||
afi_safi_print(
|
if (p->afc_recv[afi][safi])
|
||||||
afi,
|
vty_out(vty,
|
||||||
safi));
|
" %sreceived",
|
||||||
if (p->afc_adv[afi]
|
p->afc_adv[afi]
|
||||||
[safi])
|
[safi]
|
||||||
vty_out(vty,
|
? "and "
|
||||||
" advertised");
|
: "");
|
||||||
if (p->afc_recv[afi]
|
vty_out(vty, "\n");
|
||||||
[safi])
|
}
|
||||||
vty_out(vty,
|
|
||||||
" %sreceived",
|
|
||||||
p->afc_adv[afi]
|
|
||||||
[safi]
|
|
||||||
? "and "
|
|
||||||
: "");
|
|
||||||
vty_out(vty, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hostname capability */
|
/* Hostname capability */
|
||||||
vty_out(vty, " 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,
|
vty_out(vty,
|
||||||
" Address families by peer:\n ");
|
" Address families by peer:\n ");
|
||||||
|
|
||||||
for (afi = AFI_IP;
|
FOREACH_AFI_SAFI (afi, safi)
|
||||||
afi < AFI_MAX; afi++)
|
if (CHECK_FLAG(
|
||||||
for (safi = SAFI_UNICAST;
|
p->af_cap
|
||||||
safi < SAFI_MAX;
|
[afi]
|
||||||
safi++)
|
[safi],
|
||||||
if (CHECK_FLAG(
|
PEER_CAP_RESTART_AF_RCV)) {
|
||||||
p->af_cap
|
vty_out(vty,
|
||||||
[afi]
|
"%s%s(%s)",
|
||||||
[safi],
|
restart_af_count
|
||||||
PEER_CAP_RESTART_AF_RCV)) {
|
? ", "
|
||||||
vty_out(vty,
|
: "",
|
||||||
"%s%s(%s)",
|
afi_safi_print(
|
||||||
restart_af_count
|
afi,
|
||||||
? ", "
|
safi),
|
||||||
: "",
|
CHECK_FLAG(
|
||||||
afi_safi_print(
|
p->af_cap
|
||||||
afi,
|
[afi]
|
||||||
safi),
|
[safi],
|
||||||
CHECK_FLAG(
|
PEER_CAP_RESTART_AF_PRESERVE_RCV)
|
||||||
p->af_cap
|
? "preserved"
|
||||||
[afi]
|
: "not preserved");
|
||||||
[safi],
|
restart_af_count++;
|
||||||
PEER_CAP_RESTART_AF_PRESERVE_RCV)
|
}
|
||||||
? "preserved"
|
|
||||||
: "not preserved");
|
|
||||||
restart_af_count++;
|
|
||||||
}
|
|
||||||
if (!restart_af_count)
|
if (!restart_af_count)
|
||||||
vty_out(vty, "none");
|
vty_out(vty, "none");
|
||||||
vty_out(vty, "\n");
|
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();
|
json_grace_recv = json_object_new_object();
|
||||||
|
|
||||||
if (p->status == Established) {
|
if (p->status == Established) {
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST;
|
if (CHECK_FLAG(p->af_sflags[afi][safi],
|
||||||
safi < SAFI_MAX; safi++) {
|
PEER_STATUS_EOR_SEND)) {
|
||||||
if (CHECK_FLAG(
|
json_object_boolean_true_add(
|
||||||
p->af_sflags[afi]
|
json_grace_send,
|
||||||
[safi],
|
afi_safi_print(afi,
|
||||||
PEER_STATUS_EOR_SEND)) {
|
safi));
|
||||||
json_object_boolean_true_add(
|
eor_send_af_count++;
|
||||||
json_grace_send,
|
|
||||||
afi_safi_print(
|
|
||||||
afi,
|
|
||||||
safi));
|
|
||||||
eor_send_af_count++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST;
|
if (CHECK_FLAG(
|
||||||
safi < SAFI_MAX; safi++) {
|
p->af_sflags[afi][safi],
|
||||||
if (CHECK_FLAG(
|
PEER_STATUS_EOR_RECEIVED)) {
|
||||||
p->af_sflags[afi]
|
json_object_boolean_true_add(
|
||||||
[safi],
|
json_grace_recv,
|
||||||
PEER_STATUS_EOR_RECEIVED)) {
|
afi_safi_print(afi,
|
||||||
json_object_boolean_true_add(
|
safi));
|
||||||
json_grace_recv,
|
eor_receive_af_count++;
|
||||||
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");
|
vty_out(vty, " Graceful restart informations:\n");
|
||||||
if (p->status == Established) {
|
if (p->status == Established) {
|
||||||
vty_out(vty, " End-of-RIB send: ");
|
vty_out(vty, " End-of-RIB send: ");
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST;
|
if (CHECK_FLAG(p->af_sflags[afi][safi],
|
||||||
safi < SAFI_MAX; safi++) {
|
PEER_STATUS_EOR_SEND)) {
|
||||||
if (CHECK_FLAG(
|
vty_out(vty, "%s%s",
|
||||||
p->af_sflags[afi]
|
eor_send_af_count ? ", "
|
||||||
[safi],
|
: "",
|
||||||
PEER_STATUS_EOR_SEND)) {
|
afi_safi_print(afi,
|
||||||
vty_out(vty, "%s%s",
|
safi));
|
||||||
eor_send_af_count
|
eor_send_af_count++;
|
||||||
? ", "
|
|
||||||
: "",
|
|
||||||
afi_safi_print(
|
|
||||||
afi,
|
|
||||||
safi));
|
|
||||||
eor_send_af_count++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vty_out(vty, "\n");
|
vty_out(vty, "\n");
|
||||||
vty_out(vty, " End-of-RIB received: ");
|
vty_out(vty, " End-of-RIB received: ");
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST;
|
if (CHECK_FLAG(
|
||||||
safi < SAFI_MAX; safi++) {
|
p->af_sflags[afi][safi],
|
||||||
if (CHECK_FLAG(
|
PEER_STATUS_EOR_RECEIVED)) {
|
||||||
p->af_sflags[afi]
|
vty_out(vty, "%s%s",
|
||||||
[safi],
|
eor_receive_af_count
|
||||||
PEER_STATUS_EOR_RECEIVED)) {
|
? ", "
|
||||||
vty_out(vty, "%s%s",
|
: "",
|
||||||
eor_receive_af_count
|
afi_safi_print(afi,
|
||||||
? ", "
|
safi));
|
||||||
: "",
|
eor_receive_af_count++;
|
||||||
afi_safi_print(
|
|
||||||
afi,
|
|
||||||
safi));
|
|
||||||
eor_receive_af_count++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vty_out(vty, "\n");
|
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)
|
if (use_json)
|
||||||
json_hold = json_object_new_object();
|
json_hold = json_object_new_object();
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi)
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
if (p->afc[afi][safi])
|
||||||
if (p->afc[afi][safi])
|
bgp_show_peer_afi(vty, p, afi, safi, use_json,
|
||||||
bgp_show_peer_afi(vty, p, afi, safi, use_json,
|
json_hold);
|
||||||
json_hold);
|
|
||||||
|
|
||||||
if (use_json) {
|
if (use_json) {
|
||||||
json_object_object_add(json_neigh, "addressFamilyInfo",
|
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. */
|
/* Display AFs configured. */
|
||||||
vty_out(vty, " Configured address-families:");
|
vty_out(vty, " Configured address-families:");
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
if (conf->afc[afi][safi]) {
|
||||||
if (conf->afc[afi][safi]) {
|
af_cfgd = 1;
|
||||||
af_cfgd = 1;
|
vty_out(vty, " %s;", afi_safi_print(afi, safi));
|
||||||
vty_out(vty, " %s;", afi_safi_print(afi, safi));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (!af_cfgd)
|
if (!af_cfgd)
|
||||||
vty_out(vty, " none\n");
|
vty_out(vty, " none\n");
|
||||||
else
|
else
|
||||||
|
419
bgpd/bgpd.c
419
bgpd/bgpd.c
@ -1121,18 +1121,17 @@ struct peer *peer_new(struct bgp *bgp)
|
|||||||
peer->password = NULL;
|
peer->password = NULL;
|
||||||
|
|
||||||
/* Set default flags. */
|
/* Set default flags. */
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
if (!bgp_option_check(BGP_OPT_CONFIG_CISCO)) {
|
||||||
if (!bgp_option_check(BGP_OPT_CONFIG_CISCO)) {
|
SET_FLAG(peer->af_flags[afi][safi],
|
||||||
SET_FLAG(peer->af_flags[afi][safi],
|
PEER_FLAG_SEND_COMMUNITY);
|
||||||
PEER_FLAG_SEND_COMMUNITY);
|
SET_FLAG(peer->af_flags[afi][safi],
|
||||||
SET_FLAG(peer->af_flags[afi][safi],
|
PEER_FLAG_SEND_EXT_COMMUNITY);
|
||||||
PEER_FLAG_SEND_EXT_COMMUNITY);
|
SET_FLAG(peer->af_flags[afi][safi],
|
||||||
SET_FLAG(peer->af_flags[afi][safi],
|
PEER_FLAG_SEND_LARGE_COMMUNITY);
|
||||||
PEER_FLAG_SEND_LARGE_COMMUNITY);
|
|
||||||
}
|
|
||||||
peer->orf_plist[afi][safi] = NULL;
|
|
||||||
}
|
}
|
||||||
|
peer->orf_plist[afi][safi] = NULL;
|
||||||
|
}
|
||||||
SET_FLAG(peer->sflags, PEER_STATUS_CAPABILITY_OPEN);
|
SET_FLAG(peer->sflags, PEER_STATUS_CAPABILITY_OPEN);
|
||||||
|
|
||||||
/* Create buffers. */
|
/* Create buffers. */
|
||||||
@ -1214,16 +1213,13 @@ void peer_xfer_config(struct peer *peer_dst, struct peer *peer_src)
|
|||||||
peer_dst->password =
|
peer_dst->password =
|
||||||
XSTRDUP(MTYPE_PEER_PASSWORD, peer_src->password);
|
XSTRDUP(MTYPE_PEER_PASSWORD, peer_src->password);
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
peer_dst->afc[afi][safi] = peer_src->afc[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->af_flags[afi][safi] =
|
peer_dst->allowas_in[afi][safi] =
|
||||||
peer_src->af_flags[afi][safi];
|
peer_src->allowas_in[afi][safi];
|
||||||
peer_dst->allowas_in[afi][safi] =
|
peer_dst->weight[afi][safi] = peer_src->weight[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++) {
|
for (afidx = BGP_AF_START; afidx < BGP_AF_MAX; afidx++) {
|
||||||
paf = peer_src->peer_af_array[afidx];
|
paf = peer_src->peer_af_array[afidx];
|
||||||
@ -1425,10 +1421,8 @@ void bgp_recalculate_all_bestpaths(struct bgp *bgp)
|
|||||||
afi_t afi;
|
afi_t afi;
|
||||||
safi_t safi;
|
safi_t safi;
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
bgp_recalculate_afi_safi_bestpaths(bgp, afi, safi);
|
||||||
bgp_recalculate_afi_safi_bestpaths(bgp, afi, safi);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2180,51 +2174,49 @@ int peer_delete(struct peer *peer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Free filter related memory. */
|
/* Free filter related memory. */
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
filter = &peer->filter[afi][safi];
|
||||||
filter = &peer->filter[afi][safi];
|
|
||||||
|
|
||||||
for (i = FILTER_IN; i < FILTER_MAX; i++) {
|
for (i = FILTER_IN; i < FILTER_MAX; i++) {
|
||||||
if (filter->dlist[i].name) {
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filter->aslist[i].name) {
|
|
||||||
XFREE(MTYPE_BGP_FILTER_NAME,
|
|
||||||
filter->aslist[i].name);
|
|
||||||
filter->aslist[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->usmap.name) {
|
|
||||||
XFREE(MTYPE_BGP_FILTER_NAME,
|
XFREE(MTYPE_BGP_FILTER_NAME,
|
||||||
filter->usmap.name);
|
filter->dlist[i].name);
|
||||||
filter->usmap.name = NULL;
|
filter->dlist[i].name = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (peer->default_rmap[afi][safi].name) {
|
if (filter->plist[i].name) {
|
||||||
XFREE(MTYPE_ROUTE_MAP_NAME,
|
XFREE(MTYPE_BGP_FILTER_NAME,
|
||||||
peer->default_rmap[afi][safi].name);
|
filter->plist[i].name);
|
||||||
peer->default_rmap[afi][safi].name = NULL;
|
filter->plist[i].name = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filter->aslist[i].name) {
|
||||||
|
XFREE(MTYPE_BGP_FILTER_NAME,
|
||||||
|
filter->aslist[i].name);
|
||||||
|
filter->aslist[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->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)
|
FOREACH_AFI_SAFI (afi, safi)
|
||||||
peer_af_delete(peer, 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)
|
if (peer->conf_if && cap_enhe_preset)
|
||||||
peer_flag_set(peer, PEER_FLAG_CAPABILITY_ENHE);
|
peer_flag_set(peer, PEER_FLAG_CAPABILITY_ENHE);
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
if (group->conf->afc[afi][safi]) {
|
||||||
if (group->conf->afc[afi][safi]) {
|
peer->afc[afi][safi] = 1;
|
||||||
peer->afc[afi][safi] = 1;
|
|
||||||
|
|
||||||
if (peer_af_find(peer, afi, safi)
|
if (peer_af_find(peer, afi, safi)
|
||||||
|| peer_af_create(peer, afi,
|
|| peer_af_create(peer, afi, safi)) {
|
||||||
safi)) {
|
peer_group2peer_config_copy_af(
|
||||||
peer_group2peer_config_copy_af(
|
group, peer, afi, safi);
|
||||||
group, peer, afi, safi);
|
}
|
||||||
}
|
} else if (peer->afc[afi][safi])
|
||||||
} else if (peer->afc[afi][safi])
|
peer_deactivate(peer, afi, safi);
|
||||||
peer_deactivate(peer, afi, safi);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (peer->group) {
|
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
|
/* If the peer-group is active for this afi/safi then activate
|
||||||
* for this peer */
|
* for this peer */
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
if (group->conf->afc[afi][safi]) {
|
||||||
if (group->conf->afc[afi][safi]) {
|
peer->afc[afi][safi] = 1;
|
||||||
peer->afc[afi][safi] = 1;
|
peer_af_create(peer, afi, safi);
|
||||||
peer_af_create(peer, afi, safi);
|
peer_group2peer_config_copy_af(group, peer, afi,
|
||||||
peer_group2peer_config_copy_af(
|
safi);
|
||||||
group, peer, afi, safi);
|
} else if (peer->afc[afi][safi])
|
||||||
} else if (peer->afc[afi][safi])
|
peer_deactivate(peer, afi, safi);
|
||||||
peer_deactivate(peer, afi, safi);
|
}
|
||||||
|
|
||||||
SET_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE);
|
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)
|
if (group != peer->group)
|
||||||
return BGP_ERR_PEER_GROUP_MISMATCH;
|
return BGP_ERR_PEER_GROUP_MISMATCH;
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
if (peer->afc[afi][safi]) {
|
||||||
if (peer->afc[afi][safi]) {
|
peer->afc[afi][safi] = 0;
|
||||||
peer->afc[afi][safi] = 0;
|
peer_af_flag_reset(peer, afi, safi);
|
||||||
peer_af_flag_reset(peer, afi, safi);
|
|
||||||
|
|
||||||
if (peer_af_delete(peer, afi, safi) != 0) {
|
if (peer_af_delete(peer, afi, safi) != 0) {
|
||||||
zlog_err(
|
zlog_err(
|
||||||
"couldn't delete af structure for peer %s",
|
"couldn't delete af structure for peer %s",
|
||||||
peer->host);
|
peer->host);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
assert(listnode_lookup(group->peer, peer));
|
assert(listnode_lookup(group->peer, peer));
|
||||||
peer_unlock(peer); /* peer group list reference */
|
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 = list_new();
|
||||||
bgp->group->cmp = (int (*)(void *, void *))peer_group_cmp;
|
bgp->group->cmp = (int (*)(void *, void *))peer_group_cmp;
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
bgp->route[afi][safi] = bgp_table_init(afi, safi);
|
||||||
bgp->route[afi][safi] = bgp_table_init(afi, safi);
|
bgp->aggregate[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);
|
||||||
bgp->rib[afi][safi] = bgp_table_init(afi, safi);
|
|
||||||
|
|
||||||
/* Enable maximum-paths */
|
/* Enable maximum-paths */
|
||||||
bgp_maximum_paths_set(bgp, afi, safi, BGP_PEER_EBGP,
|
bgp_maximum_paths_set(bgp, afi, safi, BGP_PEER_EBGP,
|
||||||
multipath_num, 0);
|
multipath_num, 0);
|
||||||
bgp_maximum_paths_set(bgp, afi, safi, BGP_PEER_IBGP,
|
bgp_maximum_paths_set(bgp, afi, safi, BGP_PEER_IBGP,
|
||||||
multipath_num, 0);
|
multipath_num, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bgp->v_update_delay = BGP_UPDATE_DELAY_DEF;
|
bgp->v_update_delay = BGP_UPDATE_DELAY_DEF;
|
||||||
bgp->default_local_pref = BGP_DEFAULT_LOCAL_PREF;
|
bgp->default_local_pref = BGP_DEFAULT_LOCAL_PREF;
|
||||||
@ -3206,27 +3194,26 @@ void bgp_free(struct bgp *bgp)
|
|||||||
bgp->peerhash = NULL;
|
bgp->peerhash = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
/* Special handling for 2-level routing tables. */
|
||||||
/* Special handling for 2-level routing tables. */
|
if (safi == SAFI_MPLS_VPN || safi == SAFI_ENCAP
|
||||||
if (safi == SAFI_MPLS_VPN || safi == SAFI_ENCAP
|
|| safi == SAFI_EVPN) {
|
||||||
|| safi == SAFI_EVPN) {
|
for (rn = bgp_table_top(bgp->rib[afi][safi]); rn;
|
||||||
for (rn = bgp_table_top(bgp->rib[afi][safi]);
|
rn = bgp_route_next(rn)) {
|
||||||
rn; rn = bgp_route_next(rn)) {
|
table = (struct bgp_table *)rn->info;
|
||||||
table = (struct bgp_table *)rn->info;
|
bgp_table_finish(&table);
|
||||||
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_scan_finish(bgp);
|
||||||
bgp_address_destroy(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
|
* peer_group_bind as that is sub-optimal and does some stuff we don't
|
||||||
* want.
|
* want.
|
||||||
*/
|
*/
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
if (!group->conf->afc[afi][safi])
|
||||||
if (!group->conf->afc[afi][safi])
|
continue;
|
||||||
continue;
|
peer->afc[afi][safi] = 1;
|
||||||
peer->afc[afi][safi] = 1;
|
|
||||||
|
|
||||||
if (!peer_af_find(peer, afi, safi))
|
if (!peer_af_find(peer, afi, safi))
|
||||||
peer_af_create(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
|
/* Mark as dynamic, but also as a "config node" for other things to
|
||||||
* work. */
|
* work. */
|
||||||
@ -5237,45 +5223,40 @@ static void peer_distribute_update(struct access_list *access)
|
|||||||
update_group_policy_update(bgp, BGP_POLICY_FILTER_LIST,
|
update_group_policy_update(bgp, BGP_POLICY_FILTER_LIST,
|
||||||
access->name, 0, 0);
|
access->name, 0, 0);
|
||||||
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
|
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX;
|
filter = &peer->filter[afi][safi];
|
||||||
safi++) {
|
|
||||||
filter = &peer->filter[afi][safi];
|
|
||||||
|
|
||||||
for (direct = FILTER_IN;
|
for (direct = FILTER_IN; direct < FILTER_MAX;
|
||||||
direct < FILTER_MAX; direct++) {
|
direct++) {
|
||||||
if (filter->dlist[direct].name)
|
if (filter->dlist[direct].name)
|
||||||
|
filter->dlist[direct]
|
||||||
|
.alist = access_list_lookup(
|
||||||
|
afi,
|
||||||
filter->dlist[direct]
|
filter->dlist[direct]
|
||||||
.alist = access_list_lookup(
|
.name);
|
||||||
afi,
|
else
|
||||||
filter->dlist[direct]
|
filter->dlist[direct].alist =
|
||||||
.name);
|
NULL;
|
||||||
else
|
|
||||||
filter->dlist[direct]
|
|
||||||
.alist = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
|
for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX;
|
filter = &group->conf->filter[afi][safi];
|
||||||
safi++) {
|
|
||||||
filter =
|
|
||||||
&group->conf->filter[afi][safi];
|
|
||||||
|
|
||||||
for (direct = FILTER_IN;
|
for (direct = FILTER_IN; direct < FILTER_MAX;
|
||||||
direct < FILTER_MAX; direct++) {
|
direct++) {
|
||||||
if (filter->dlist[direct].name)
|
if (filter->dlist[direct].name)
|
||||||
|
filter->dlist[direct]
|
||||||
|
.alist = access_list_lookup(
|
||||||
|
afi,
|
||||||
filter->dlist[direct]
|
filter->dlist[direct]
|
||||||
.alist = access_list_lookup(
|
.name);
|
||||||
afi,
|
else
|
||||||
filter->dlist[direct]
|
filter->dlist[direct].alist =
|
||||||
.name);
|
NULL;
|
||||||
else
|
|
||||||
filter->dlist[direct]
|
|
||||||
.alist = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#if ENABLE_BGP_VNC
|
#if ENABLE_BGP_VNC
|
||||||
vnc_prefix_list_update(bgp);
|
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);
|
plist ? prefix_list_name(plist) : NULL, 0, 0);
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
|
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX;
|
filter = &peer->filter[afi][safi];
|
||||||
safi++) {
|
|
||||||
filter = &peer->filter[afi][safi];
|
|
||||||
|
|
||||||
for (direct = FILTER_IN;
|
for (direct = FILTER_IN; direct < FILTER_MAX;
|
||||||
direct < FILTER_MAX; direct++) {
|
direct++) {
|
||||||
if (filter->plist[direct].name)
|
if (filter->plist[direct].name)
|
||||||
|
filter->plist[direct]
|
||||||
|
.plist = prefix_list_lookup(
|
||||||
|
afi,
|
||||||
filter->plist[direct]
|
filter->plist[direct]
|
||||||
.plist = prefix_list_lookup(
|
.name);
|
||||||
afi,
|
else
|
||||||
filter->plist[direct]
|
filter->plist[direct].plist =
|
||||||
.name);
|
NULL;
|
||||||
else
|
|
||||||
filter->plist[direct]
|
|
||||||
.plist = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
|
for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX;
|
filter = &group->conf->filter[afi][safi];
|
||||||
safi++) {
|
|
||||||
filter =
|
|
||||||
&group->conf->filter[afi][safi];
|
|
||||||
|
|
||||||
for (direct = FILTER_IN;
|
for (direct = FILTER_IN; direct < FILTER_MAX;
|
||||||
direct < FILTER_MAX; direct++) {
|
direct++) {
|
||||||
if (filter->plist[direct].name)
|
if (filter->plist[direct].name)
|
||||||
|
filter->plist[direct]
|
||||||
|
.plist = prefix_list_lookup(
|
||||||
|
afi,
|
||||||
filter->plist[direct]
|
filter->plist[direct]
|
||||||
.plist = prefix_list_lookup(
|
.name);
|
||||||
afi,
|
else
|
||||||
filter->plist[direct]
|
filter->plist[direct].plist =
|
||||||
.name);
|
NULL;
|
||||||
else
|
|
||||||
filter->plist[direct]
|
|
||||||
.plist = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5565,43 +5541,38 @@ static void peer_aslist_update(const char *aslist_name)
|
|||||||
aslist_name, 0, 0);
|
aslist_name, 0, 0);
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
|
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX;
|
filter = &peer->filter[afi][safi];
|
||||||
safi++) {
|
|
||||||
filter = &peer->filter[afi][safi];
|
|
||||||
|
|
||||||
for (direct = FILTER_IN;
|
for (direct = FILTER_IN; direct < FILTER_MAX;
|
||||||
direct < FILTER_MAX; direct++) {
|
direct++) {
|
||||||
if (filter->aslist[direct].name)
|
if (filter->aslist[direct].name)
|
||||||
|
filter->aslist[direct]
|
||||||
|
.aslist = as_list_lookup(
|
||||||
filter->aslist[direct]
|
filter->aslist[direct]
|
||||||
.aslist = as_list_lookup(
|
.name);
|
||||||
filter->aslist[direct]
|
else
|
||||||
.name);
|
filter->aslist[direct].aslist =
|
||||||
else
|
NULL;
|
||||||
filter->aslist[direct]
|
|
||||||
.aslist = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
|
for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX;
|
filter = &group->conf->filter[afi][safi];
|
||||||
safi++) {
|
|
||||||
filter =
|
|
||||||
&group->conf->filter[afi][safi];
|
|
||||||
|
|
||||||
for (direct = FILTER_IN;
|
for (direct = FILTER_IN; direct < FILTER_MAX;
|
||||||
direct < FILTER_MAX; direct++) {
|
direct++) {
|
||||||
if (filter->aslist[direct].name)
|
if (filter->aslist[direct].name)
|
||||||
|
filter->aslist[direct]
|
||||||
|
.aslist = as_list_lookup(
|
||||||
filter->aslist[direct]
|
filter->aslist[direct]
|
||||||
.aslist = as_list_lookup(
|
.name);
|
||||||
filter->aslist[direct]
|
else
|
||||||
.name);
|
filter->aslist[direct].aslist =
|
||||||
else
|
NULL;
|
||||||
filter->aslist[direct]
|
|
||||||
.aslist = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user