Enhance struct bgp to add a new flag BGP_FLAG_GR_PRESERVE_FWD, which
allow to set the Preserve State F bit of Graceful Restart capability in
OPEN messages.

Signed-off-by: Julien Courtat <julien.cour...@6wind.com>
---
 bgpd/bgp_open.c | 15 +++++++++------
 bgpd/bgpd.h     |  1 +
 2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/bgpd/bgp_open.c b/bgpd/bgp_open.c
index 39c038c..bc17990 100644
--- a/bgpd/bgp_open.c
+++ b/bgpd/bgp_open.c
@@ -385,17 +385,16 @@ bgp_capability_restart (struct peer *peer, struct 
capability_header *caphdr)
         }
       else
         {
+          SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_RCV);
+          if (CHECK_FLAG (flag, RESTART_F_BIT))
+            SET_FLAG (peer->af_cap[afi][safi], 
PEER_CAP_RESTART_AF_PRESERVE_RCV);
+
           if (BGP_DEBUG (normal, NORMAL))
             zlog_debug ("%s Address family %s is%spreserved", peer->host,
                         afi_safi_print (afi, safi),
                         CHECK_FLAG (peer->af_cap[afi][safi],
                                     PEER_CAP_RESTART_AF_PRESERVE_RCV)
                         ? " " : " not ");
-
-          SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_RCV);
-          if (CHECK_FLAG (flag, RESTART_F_BIT))
-            SET_FLAG (peer->af_cap[afi][safi], 
PEER_CAP_RESTART_AF_PRESERVE_RCV);
-          
         }
     }
   return 0;
@@ -1120,11 +1119,15 @@ bgp_open_capability (struct stream *s, struct peer 
*peer)
     {
       for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
         for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
+
           if (peer->afc[afi][safi])
             {
               stream_putw (s, afi);
               stream_putc (s, (safi == SAFI_MPLS_VPN) ? SAFI_MPLS_LABELED_VPN 
: safi);
-              stream_putc (s, 0); //Forwarding is not retained as of now.
+              if (bgp_flag_check(peer->bgp, BGP_FLAG_GR_PRESERVE_FWD))
+                stream_putc (s, RESTART_F_BIT);
+              else
+                stream_putc (s, 0);
             }
     }
 
diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h
index 98f5451..7e92cb6 100644
--- a/bgpd/bgpd.h
+++ b/bgpd/bgpd.h
@@ -140,6 +140,7 @@ struct bgp
 #define BGP_FLAG_ASPATH_MULTIPATH_RELAX   (1 << 14)
 #define BGP_FLAG_DELETING                 (1 << 15)
 #define BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY (1 << 16)
+#define BGP_FLAG_GR_PRESERVE_FWD          (1 << 17)
 
   /* BGP Per AF flags */
   u_int16_t af_flags[AFI_MAX][SAFI_MAX];
-- 
2.1.4


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

Reply via email to