diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index 60a6475330..a71364381e 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -509,7 +509,7 @@ bgp_graceful_restart_timer_expire (struct thread *thread) /* NSF delete stale route */ for (afi = AFI_IP ; afi < AFI_MAX ; afi++) - for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++) + for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++) if (peer->nsf[afi][safi]) bgp_clear_stale_route (peer, afi, safi); @@ -542,7 +542,7 @@ bgp_graceful_stale_timer_expire (struct thread *thread) /* NSF delete stale route */ for (afi = AFI_IP ; afi < AFI_MAX ; afi++) - for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++) + for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++) if (peer->nsf[afi][safi]) bgp_clear_stale_route (peer, afi, safi); @@ -1051,7 +1051,7 @@ bgp_stop (struct peer *peer) UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_MODE); for (afi = AFI_IP ; afi < AFI_MAX ; afi++) - for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++) + for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++) peer->nsf[afi][safi] = 0; } @@ -1468,7 +1468,7 @@ bgp_establish (struct peer *peer) /* graceful restart */ UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT); for (afi = AFI_IP ; afi < AFI_MAX ; afi++) - for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++) + for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++) { if (peer->afc_nego[afi][safi] && CHECK_FLAG (peer->cap, PEER_CAP_RESTART_ADV) diff --git a/bgpd/bgp_open.c b/bgpd/bgp_open.c index 02026a004a..4c698562be 100644 --- a/bgpd/bgp_open.c +++ b/bgpd/bgp_open.c @@ -1536,7 +1536,7 @@ bgp_open_capability (struct stream *s, struct peer *peer) if (peer->afc[afi][safi]) { stream_putw (s, afi); - stream_putc (s, safi); + stream_putc (s, (safi == SAFI_MPLS_VPN) ? SAFI_MPLS_LABELED_VPN : safi); stream_putc (s, 0); //Forwarding is not retained as of now. } } diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index 796a57f054..dffca37dd3 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -175,7 +175,7 @@ bgp_update_packet_eor (struct peer *peer, afi_t afi, safi_t safi) stream_putc (s, BGP_ATTR_MP_UNREACH_NLRI); stream_putc (s, 3); stream_putw (s, afi); - stream_putc (s, safi); + stream_putc (s, (safi == SAFI_MPLS_VPN) ? SAFI_MPLS_LABELED_VPN : safi); } bgp_packet_set_size (s); @@ -240,8 +240,7 @@ bgp_write_packet (struct peer *peer) if (!(PAF_SUBGRP(paf))->t_coalesce && peer->afc_nego[afi][safi] && peer->synctime && ! CHECK_FLAG (peer->af_sflags[afi][safi], - PEER_STATUS_EOR_SEND) - && safi != SAFI_MPLS_VPN) + PEER_STATUS_EOR_SEND)) { SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_EOR_SEND); diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index cfc4ec3407..1e9aa4bb2a 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -3307,17 +3307,37 @@ bgp_clear_stale_route (struct peer *peer, afi_t afi, safi_t safi) struct bgp_info *ri; struct bgp_table *table; - table = peer->bgp->rib[afi][safi]; - - for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn)) + if ( safi == SAFI_MPLS_VPN) { - for (ri = rn->info; ri; ri = ri->next) - if (ri->peer == peer) - { - if (CHECK_FLAG (ri->flags, BGP_INFO_STALE)) - bgp_rib_remove (rn, ri, peer, afi, safi); - break; - } + for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn; rn = bgp_route_next (rn)) + { + struct bgp_node *rm; + struct bgp_info *ri; + + /* look for neighbor in tables */ + if ((table = rn->info) != NULL) + { + for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm)) + for (ri = rm->info; ri; ri = ri->next) + if (ri->peer == peer) + { + if (CHECK_FLAG (ri->flags, BGP_INFO_STALE)) + bgp_rib_remove (rm, ri, peer, afi, safi); + break; + } + } + } + } + else + { + for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn; rn = bgp_route_next (rn)) + for (ri = rn->info; ri; ri = ri->next) + if (ri->peer == peer) + { + if (CHECK_FLAG (ri->flags, BGP_INFO_STALE)) + bgp_rib_remove (rn, ri, peer, afi, safi); + break; + } } } diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 30f6e0d859..68ad6bbe11 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -1902,7 +1902,7 @@ peer_nsf_stop (struct peer *peer) UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_MODE); for (afi = AFI_IP ; afi < AFI_MAX ; afi++) - for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++) + for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++) peer->nsf[afi][safi] = 0; if (peer->t_gr_restart) diff --git a/lib/zebra.h b/lib/zebra.h index 5bb3590abd..fd1aa3cf7d 100644 --- a/lib/zebra.h +++ b/lib/zebra.h @@ -471,9 +471,10 @@ typedef enum { /* Subsequent Address Family Identifier. */ #define SAFI_UNICAST 1 #define SAFI_MULTICAST 2 -#define SAFI_RESERVED_3 3 -#define SAFI_MPLS_VPN 4 +#define SAFI_MPLS_VPN 3 +#define SAFI_RESERVED_4 4 #define SAFI_ENCAP 7 /* per IANA */ +#define SAFI_RESERVED_5 5 #define SAFI_MAX 8 /* Default Administrative Distance of each protocol. */