mirror of
https://github.com/FRRouting/frr.git
synced 2025-05-01 05:57:15 +02:00
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:
parent
794b37d521
commit
034e185dc6
|
@ -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);
|
||||
|
||||
|
|
125
bgpd/bgp_open.c
125
bgpd/bgp_open.c
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue