Merge pull request #43 from pguibert6WIND/frr_6wind_mpbgpgracefulrestart_1

VPNv4 Enhancement of Graceful Restart
This commit is contained in:
Donald Sharp 2017-01-05 07:58:32 -05:00 committed by GitHub
commit 0b0038b8bc
6 changed files with 41 additions and 21 deletions

View File

@ -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)

View File

@ -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.
}
}

View File

@ -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);

View File

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

View File

@ -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)

View File

@ -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. */