]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: BGP GR advertise capabilities in the open message.
authorbisdhdh <biswajit.sadhu@gmail.com>
Wed, 23 Oct 2019 08:13:42 +0000 (13:43 +0530)
committerbisdhdh <biswajit.sadhu@gmail.com>
Thu, 23 Jan 2020 04:04:25 +0000 (09:34 +0530)
* Changes to the capability sending function to advertise
graceful restart capability in the bgp OPEN message.

Signed-off-by: Biswajit Sadhu <sadhub@vmware.com>
bgpd/bgp_main.c
bgpd/bgp_open.c

index 9cb3957a86c2ff24195554f02121941509afef7d..fab2a584c0a314463c30977d8edf9c1a120d2e15 100644 (file)
@@ -487,6 +487,7 @@ int main(int argc, char **argv)
 
        frr_config_fork();
        /* must be called after fork() */
+       bgp_gr_apply_running_config();
        bgp_pthreads_run();
        frr_run(bm->master);
 
index 23b893c1c87e1e8c2bbc240e5c31895f26159d4e..f7bb2cc1773fd82e2dffd00271a2af22af4900f1 100644 (file)
@@ -1299,6 +1299,85 @@ static void bgp_open_capability_orf(struct stream *s, struct peer *peer,
        stream_putc_at(s, capp, cap_len);
 }
 
+static void bgp_peer_send_gr_capability(struct stream *s, struct peer *peer,
+                                unsigned long cp)
+{
+       int len;
+       iana_afi_t pkt_afi;
+       afi_t afi;
+       safi_t safi;
+       iana_safi_t pkt_safi;
+       uint32_t restart_time;
+       unsigned long capp = 0;
+       unsigned long rcapp = 0;
+
+       if ((bgp_peer_flag_check(peer,
+                       PEER_FLAG_GRACEFUL_RESTART)) ||
+               (bgp_peer_flag_check(peer,
+                       PEER_FLAG_GRACEFUL_RESTART_HELPER))) {
+
+               if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
+                       zlog_debug(
+                               "BGP_GR:: Sending helper Capability for Peer :%s :",
+                               peer->host);
+
+               SET_FLAG(peer->cap, PEER_CAP_RESTART_ADV);
+               stream_putc(s, BGP_OPEN_OPT_CAP);
+               capp = stream_get_endp(s); /* Set Capability Len Pointer */
+               stream_putc(s, 0);       /* Capability Length */
+               stream_putc(s, CAPABILITY_CODE_RESTART);
+               /* Set Restart Capability Len Pointer */
+               rcapp = stream_get_endp(s);
+               stream_putc(s, 0);
+               restart_time = peer->bgp->restart_time;
+               if ((peer->bgp->t_startup) &&
+                       (bgp_peer_flag_check(peer,
+                               PEER_FLAG_GRACEFUL_RESTART))) {
+                       SET_FLAG(restart_time, RESTART_R_BIT);
+                       SET_FLAG(peer->cap, PEER_CAP_RESTART_BIT_ADV);
+               }
+               stream_putw(s, restart_time);
+
+               /* Send address-family specific graceful-restart capability
+                * only when GR config is present
+                */
+               if (bgp_peer_flag_check(peer, PEER_FLAG_GRACEFUL_RESTART)) {
+                       FOREACH_AFI_SAFI (afi, safi) {
+                               if (peer->afc[afi][safi]) {
+                                       if (BGP_DEBUG(graceful_restart,
+                                                       GRACEFUL_RESTART))
+                                               zlog_debug(
+                                               "BGP_GR:: Sending GR Capability for AFI :%d :, SAFI :%d:",
+                                               afi, safi);
+
+                                       /* Convert AFI, SAFI to values for
+                                        * packet.
+                                        */
+                                       bgp_map_afi_safi_int2iana(afi,
+                                                       safi, &pkt_afi,
+                                                         &pkt_safi);
+                                       stream_putw(s, pkt_afi);
+                                       stream_putc(s, pkt_safi);
+                                       if (bgp_flag_check(peer->bgp,
+                                          BGP_FLAG_GR_PRESERVE_FWD)) {
+                                               stream_putc(s, RESTART_F_BIT);
+
+                                       } else {
+                                               stream_putc(s, 0);
+                                       }
+                               }
+                       }
+               }
+               /* Total Graceful restart capability Len. */
+               len = stream_get_endp(s) - rcapp - 1;
+               stream_putc_at(s, rcapp, len);
+
+               /* Total Capability Len. */
+               len = stream_get_endp(s) - capp - 1;
+               stream_putc_at(s, capp, len);
+       }
+}
+
 /* Fill in capability open option to the packet. */
 void bgp_open_capability(struct stream *s, struct peer *peer)
 {
@@ -1309,7 +1388,6 @@ void bgp_open_capability(struct stream *s, struct peer *peer)
        safi_t safi;
        iana_safi_t pkt_safi;
        as_t local_as;
-       uint32_t restart_time;
        uint8_t afi_safi_count = 0;
        int adv_addpath_tx = 0;
 
@@ -1502,50 +1580,7 @@ void bgp_open_capability(struct stream *s, struct peer *peer)
                                cmd_domainname_get());
        }
 
-       /* Sending base graceful-restart capability irrespective of the config
-        */
-       SET_FLAG(peer->cap, PEER_CAP_RESTART_ADV);
-       stream_putc(s, BGP_OPEN_OPT_CAP);
-       capp = stream_get_endp(s); /* Set Capability Len Pointer */
-       stream_putc(s, 0);       /* Capability Length */
-       stream_putc(s, CAPABILITY_CODE_RESTART);
-       rcapp = stream_get_endp(s); /* Set Restart Capability Len Pointer */
-       stream_putc(s, 0);
-       restart_time = peer->bgp->restart_time;
-       if (peer->bgp->t_startup) {
-               SET_FLAG(restart_time, RESTART_R_BIT);
-               SET_FLAG(peer->cap, PEER_CAP_RESTART_BIT_ADV);
-       }
-       stream_putw(s, restart_time);
-
-       /* Send address-family specific graceful-restart capability only when GR
-          config
-          is present */
-       if (bgp_flag_check(peer->bgp, BGP_FLAG_GRACEFUL_RESTART)) {
-               FOREACH_AFI_SAFI (afi, safi) {
-                       if (peer->afc[afi][safi]) {
-                               /* Convert AFI, SAFI to values for
-                                * packet. */
-                               bgp_map_afi_safi_int2iana(afi, safi, &pkt_afi,
-                                                         &pkt_safi);
-                               stream_putw(s, pkt_afi);
-                               stream_putc(s, pkt_safi);
-                               if (bgp_flag_check(peer->bgp,
-                                                  BGP_FLAG_GR_PRESERVE_FWD))
-                                       stream_putc(s, RESTART_F_BIT);
-                               else
-                                       stream_putc(s, 0);
-                       }
-               }
-       }
-
-       /* Total Graceful restart capability Len. */
-       len = stream_get_endp(s) - rcapp - 1;
-       stream_putc_at(s, rcapp, len);
-
-       /* Total Capability Len. */
-       len = stream_get_endp(s) - capp - 1;
-       stream_putc_at(s, capp, len);
+       bgp_peer_send_gr_capability(s, peer, cp);
 
        /* Total Opt Parm Len. */
        len = stream_get_endp(s) - cp - 1;