bgpd: BGP GR advertise capabilities in the open message.

* Changes to the capability sending function to advertise
graceful restart capability in the bgp OPEN message.

Signed-off-by: Biswajit Sadhu <sadhub@vmware.com>
This commit is contained in:
bisdhdh 2019-10-23 13:43:42 +05:30
parent 794b37d521
commit 034e185dc6
2 changed files with 81 additions and 45 deletions

View 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);

View 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;