mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-07-25 11:28:06 +00:00
Merge pull request #43 from pguibert6WIND/frr_6wind_mpbgpgracefulrestart_1
VPNv4 Enhancement of Graceful Restart
This commit is contained in:
commit
0b0038b8bc
@ -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)
|
||||
|
@ -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.
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user