Skip to content

Commit

Permalink
bgpd : BGP GR advertise capabilities in the open message.
Browse files Browse the repository at this point in the history
* Changes to function to advertise graceful restart capability in the
  bgp OPEN message

Signed-off-by: Biswajit Sadhu <sadhub@vmware.com>
  • Loading branch information
bisdhdh committed Oct 22, 2019
1 parent 7889c4d commit f5bab55
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 45 deletions.
1 change: 1 addition & 0 deletions bgpd/bgp_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
130 changes: 85 additions & 45 deletions bgpd/bgp_open.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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;

Expand Down Expand Up @@ -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);

}

0 comments on commit f5bab55

Please sign in to comment.