Mailing List Archive

[PATCH 4/6] bgpd: graceful restart for vpnv4 address family
This patch enable the support of graceful restart for routes sets with
vpnv4 address family format. In this specific case, data model is
slightly different and some additional processing must be done when
accessing bgp tables and nodes.

Signed-off-by: Julien Courtat <julien.courtat@6wind.com>
---
bgpd/bgp_fsm.c | 8 ++++----
bgpd/bgp_route.c | 9 ++++++++-
bgpd/bgpd.c | 2 +-
lib/zebra.h | 1 +
4 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c
index e9ca0f7..98d7e2e 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -351,7 +351,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_5 ; safi++)
if (peer->nsf[afi][safi])
bgp_clear_stale_route (peer, afi, safi);

@@ -384,7 +384,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_5 ; safi++)
if (peer->nsf[afi][safi])
bgp_clear_stale_route (peer, afi, safi);

@@ -493,7 +493,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_5 ; safi++)
peer->nsf[afi][safi] = 0;
}

@@ -846,7 +846,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_5 ; safi++)
{
if (peer->afc_nego[afi][safi]
&& CHECK_FLAG (peer->cap, PEER_CAP_RESTART_ADV)
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 37b6552..5ab9e53 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -3458,7 +3458,14 @@ bgp_clear_stale_route (struct peer *peer, afi_t afi, safi_t safi)

table = peer->bgp->rib[afi][safi];

- for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
+ if (table && safi == SAFI_MPLS_VPN)
+ {
+ rn = bgp_table_top (table);
+ table = rn ? rn->info : NULL;
+ }
+
+ if (table)
+ for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
{
for (ri = rn->info; ri; ri = ri->next)
if (ri->peer == peer)
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index 5696c98..ca2f081 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -1236,7 +1236,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_5 ; safi++)
peer->nsf[afi][safi] = 0;

if (peer->t_gr_restart)
diff --git a/lib/zebra.h b/lib/zebra.h
index a405d46..bcbbbc5 100644
--- a/lib/zebra.h
+++ b/lib/zebra.h
@@ -506,6 +506,7 @@ typedef enum {
#define SAFI_RESERVED_3 3
#define SAFI_MPLS_VPN 4
#define SAFI_ENCAP 7 /* per IANA */
+#define SAFI_RESERVED_5 5
#define SAFI_MAX 8

/* Default Administrative Distance of each protocol. */
--
2.1.4


_______________________________________________
Quagga-dev mailing list
Quagga-dev@lists.quagga.net
https://lists.quagga.net/mailman/listinfo/quagga-dev