]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: graceful restart for vpnv4 address family
authorJulien Courtat <julien.courtat@6wind.com>
Wed, 25 May 2016 15:28:31 +0000 (17:28 +0200)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Wed, 4 Jan 2017 17:02:04 +0000 (18:02 +0100)
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 <julien.courtat@6wind.com>
Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
bgpd/bgp_fsm.c
bgpd/bgp_route.c
bgpd/bgpd.c
lib/zebra.h

index 60a647533090e42e87e0fb7ef7019b6491391dc7..a71364381e776b7280d9ddab7b2b57295385aa0e 100644 (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)
index cfc4ec34077f8a4b3c6de5ef1f5ab7b10b21317d..1e9aa4bb2adc169ad2c944838662e2426025ebfc 100644 (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];
+  if ( safi == SAFI_MPLS_VPN)
+    {
+      for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn; rn = bgp_route_next (rn))
+        {
+          struct bgp_node *rm;
+          struct bgp_info *ri;
 
-  for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
+          /* 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 (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))
+        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;
+            }
     }
 }
 
index 30f6e0d859a51aa4ea18414a8d07d4d534ece340..68ad6bbe112a23c7d57733e67b74b22153f32de8 100644 (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)
index f9cf21984f41c136d06174536eb375caa8206bb7..fd1aa3cf7dc8a8b50ce5f3194caa50d0a5ec3102 100644 (file)
@@ -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. */