diff --git a/bgpd/bgp_main.c b/bgpd/bgp_main.c index 6b91a2cf1f16..1dc2d66fa0e7 100644 --- a/bgpd/bgp_main.c +++ b/bgpd/bgp_main.c @@ -488,6 +488,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); diff --git a/bgpd/bgp_open.c b/bgpd/bgp_open.c index f17bc7b8c06e..7efc89b9222e 100644 --- a/bgpd/bgp_open.c +++ b/bgpd/bgp_open.c @@ -1293,6 +1293,89 @@ 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) { @@ -1303,7 +1386,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; @@ -1496,52 +1578,10 @@ 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; stream_putc_at(s, cp, len); + }