From e60eb8c4edd718bf7361f8ec500d755d0f664dac Mon Sep 17 00:00:00 2001 From: Julien Courtat Date: Fri, 20 May 2016 12:08:28 +0200 Subject: [PATCH 1/5] bgpd: set Graceful Restart R bit for vpnv4 address family Signed-off-by: Julien Courtat --- bgpd/bgp_open.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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. } } From 268fef65f965242757975908379c93002200fbaa Mon Sep 17 00:00:00 2001 From: Philippe Guibert Date: Wed, 21 Dec 2016 08:16:06 +0100 Subject: [PATCH 2/5] lib: add SAFI_RESERVED_4 value This value is used to limit certain feature to the safi values until that reserved value. Signed-off-by: Philippe Guibert --- lib/zebra.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/zebra.h b/lib/zebra.h index 5bb3590abd..345d3e2d8a 100644 --- a/lib/zebra.h +++ b/lib/zebra.h @@ -473,6 +473,7 @@ typedef enum { #define SAFI_MULTICAST 2 #define SAFI_RESERVED_3 3 #define SAFI_MPLS_VPN 4 +#define SAFI_RESERVED_4 4 #define SAFI_ENCAP 7 /* per IANA */ #define SAFI_MAX 8 From db19215a73cd429f04543f75f80ffb989b54d8c3 Mon Sep 17 00:00:00 2001 From: Philippe Guibert Date: Wed, 21 Dec 2016 08:21:02 +0100 Subject: [PATCH 3/5] lib: remove SAFI_RESERVED_3 and move SAFI_MPLS to that value Because SAFI_RESERVED_3 value is no more used, the SAFI_MPLS value is lowered to that value. Signed-off-by: Philippe Guibert --- lib/zebra.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/zebra.h b/lib/zebra.h index 345d3e2d8a..f9cf21984f 100644 --- a/lib/zebra.h +++ b/lib/zebra.h @@ -471,8 +471,7 @@ 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_MAX 8 From 4d5b4f7bd9d12f4755caf31ce8df3570d55d8575 Mon Sep 17 00:00:00 2001 From: Julien Courtat Date: Wed, 25 May 2016 17:28:31 +0200 Subject: [PATCH 4/5] 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. The clearing stale algorithm takes into account the specificity where the 2 node level for MPLS has to be reached. Signed-off-by: Julien Courtat Signed-off-by: Philippe Guibert --- bgpd/bgp_fsm.c | 8 ++++---- bgpd/bgp_route.c | 40 ++++++++++++++++++++++++++++++---------- bgpd/bgpd.c | 2 +- lib/zebra.h | 1 + 4 files changed, 36 insertions(+), 15 deletions(-) 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_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 f9cf21984f..fd1aa3cf7d 100644 --- a/lib/zebra.h +++ b/lib/zebra.h @@ -474,6 +474,7 @@ typedef enum { #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. */ From 440129913d3205eb4a081d6c1249f448521aa876 Mon Sep 17 00:00:00 2001 From: Julien Courtat Date: Fri, 17 Jun 2016 15:31:09 +0200 Subject: [PATCH 5/5] bgpd: support End-Of-Rib of VPNv4 address family After graceful restart procedure, when BGP speaker has finished to send its VPNv4 routes to the restarting peer, it also sends End-Of-Rib message for afi=AFI_IPv4 safi=SAFI_MPLS_VPN. Signed-off-by: Julien Courtat --- bgpd/bgp_packet.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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);