bgpd: Enable BGP dynamic capability by default for datacenter profile

Dynamic capability provides more value without resetting the sessions for some
important other capabilities to exchange, like: graceful-restart, addpath, orf,
fqdn, etc.

Since we support it already, enable it by default.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
This commit is contained in:
Donatas Abraitis 2024-03-09 10:44:38 +02:00
parent 617d82e4ce
commit e2ac728c82
5 changed files with 68 additions and 7 deletions

View File

@ -1975,7 +1975,7 @@ uint16_t bgp_open_capability(struct stream *s, struct peer *peer,
} }
/* Dynamic capability. */ /* Dynamic capability. */
if (CHECK_FLAG(peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY)) { if (peergroup_flag_check(peer, PEER_FLAG_DYNAMIC_CAPABILITY)) {
SET_FLAG(peer->cap, PEER_CAP_DYNAMIC_ADV); SET_FLAG(peer->cap, PEER_CAP_DYNAMIC_ADV);
stream_putc(s, BGP_OPEN_OPT_CAP); stream_putc(s, BGP_OPEN_OPT_CAP);
ext_opt_params ext_opt_params

View File

@ -126,6 +126,10 @@ FRR_CFG_DEFAULT_BOOL(BGP_SOFT_VERSION_CAPABILITY,
{ .val_bool = true, .match_profile = "datacenter", }, { .val_bool = true, .match_profile = "datacenter", },
{ .val_bool = false }, { .val_bool = false },
); );
FRR_CFG_DEFAULT_BOOL(BGP_DYNAMIC_CAPABILITY,
{ .val_bool = true, .match_profile = "datacenter", },
{ .val_bool = false },
);
FRR_CFG_DEFAULT_BOOL(BGP_ENFORCE_FIRST_AS, FRR_CFG_DEFAULT_BOOL(BGP_ENFORCE_FIRST_AS,
{ .val_bool = false, .match_version = "< 9.1", }, { .val_bool = false, .match_version = "< 9.1", },
{ .val_bool = true }, { .val_bool = true },
@ -623,6 +627,9 @@ int bgp_get_vty(struct bgp **bgp, as_t *as, const char *name,
if (DFLT_BGP_SOFT_VERSION_CAPABILITY) if (DFLT_BGP_SOFT_VERSION_CAPABILITY)
SET_FLAG((*bgp)->flags, SET_FLAG((*bgp)->flags,
BGP_FLAG_SOFT_VERSION_CAPABILITY); BGP_FLAG_SOFT_VERSION_CAPABILITY);
if (DFLT_BGP_DYNAMIC_CAPABILITY)
SET_FLAG((*bgp)->flags,
BGP_FLAG_DYNAMIC_CAPABILITY);
if (DFLT_BGP_ENFORCE_FIRST_AS) if (DFLT_BGP_ENFORCE_FIRST_AS)
SET_FLAG((*bgp)->flags, BGP_FLAG_ENFORCE_FIRST_AS); SET_FLAG((*bgp)->flags, BGP_FLAG_ENFORCE_FIRST_AS);
@ -4298,6 +4305,24 @@ DEFPY (bgp_default_software_version_capability,
return CMD_SUCCESS; return CMD_SUCCESS;
} }
DEFPY (bgp_default_dynamic_capability,
bgp_default_dynamic_capability_cmd,
"[no] bgp default dynamic-capability",
NO_STR
BGP_STR
"Configure BGP defaults\n"
"Advertise dynamic capability for all neighbors\n")
{
VTY_DECLVAR_CONTEXT(bgp, bgp);
if (no)
UNSET_FLAG(bgp->flags, BGP_FLAG_DYNAMIC_CAPABILITY);
else
SET_FLAG(bgp->flags, BGP_FLAG_DYNAMIC_CAPABILITY);
return CMD_SUCCESS;
}
/* "bgp network import-check" configuration. */ /* "bgp network import-check" configuration. */
DEFUN (bgp_network_import_check, DEFUN (bgp_network_import_check,
bgp_network_import_check_cmd, bgp_network_import_check_cmd,
@ -18383,9 +18408,15 @@ static void bgp_config_write_peer_global(struct vty *vty, struct bgp *bgp,
vty_out(vty, " neighbor %s timers delayopen %u\n", addr, vty_out(vty, " neighbor %s timers delayopen %u\n", addr,
peer->bgp->default_delayopen); peer->bgp->default_delayopen);
/* capability dynamic */ /* capability software-version */
if (CHECK_FLAG(bgp->flags, BGP_FLAG_DYNAMIC_CAPABILITY)) {
if (!peergroup_flag_check(peer, PEER_FLAG_DYNAMIC_CAPABILITY))
vty_out(vty, " no neighbor %s capability dynamic\n",
addr);
} else {
if (peergroup_flag_check(peer, PEER_FLAG_DYNAMIC_CAPABILITY)) if (peergroup_flag_check(peer, PEER_FLAG_DYNAMIC_CAPABILITY))
vty_out(vty, " neighbor %s capability dynamic\n", addr); vty_out(vty, " neighbor %s capability dynamic\n", addr);
}
/* capability extended-nexthop */ /* capability extended-nexthop */
if (peergroup_flag_check(peer, PEER_FLAG_CAPABILITY_ENHE)) { if (peergroup_flag_check(peer, PEER_FLAG_CAPABILITY_ENHE)) {
@ -19076,6 +19107,15 @@ int bgp_config_write(struct vty *vty)
? "" ? ""
: "no "); : "no ");
if (!!CHECK_FLAG(bgp->flags, BGP_FLAG_DYNAMIC_CAPABILITY) !=
SAVE_BGP_DYNAMIC_CAPABILITY)
vty_out(vty,
" %sbgp default dynamic-capability\n",
CHECK_FLAG(bgp->flags,
BGP_FLAG_DYNAMIC_CAPABILITY)
? ""
: "no ");
/* BGP default subgroup-pkt-queue-max. */ /* BGP default subgroup-pkt-queue-max. */
if (bgp->default_subgroup_pkt_queue_max if (bgp->default_subgroup_pkt_queue_max
!= BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX) != BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX)
@ -20124,6 +20164,9 @@ void bgp_vty_init(void)
/* bgp default software-version-capability */ /* bgp default software-version-capability */
install_element(BGP_NODE, &bgp_default_software_version_capability_cmd); install_element(BGP_NODE, &bgp_default_software_version_capability_cmd);
/* bgp default dynamic-capability */
install_element(BGP_NODE, &bgp_default_dynamic_capability_cmd);
/* "bgp default subgroup-pkt-queue-max" commands. */ /* "bgp default subgroup-pkt-queue-max" commands. */
install_element(BGP_NODE, &bgp_default_subgroup_pkt_queue_max_cmd); install_element(BGP_NODE, &bgp_default_subgroup_pkt_queue_max_cmd);
install_element(BGP_NODE, &no_bgp_default_subgroup_pkt_queue_max_cmd); install_element(BGP_NODE, &no_bgp_default_subgroup_pkt_queue_max_cmd);

View File

@ -1544,6 +1544,9 @@ struct peer *peer_new(struct bgp *bgp)
if (CHECK_FLAG(bgp->flags, BGP_FLAG_SOFT_VERSION_CAPABILITY)) if (CHECK_FLAG(bgp->flags, BGP_FLAG_SOFT_VERSION_CAPABILITY))
SET_FLAG(peer->flags, PEER_FLAG_CAPABILITY_SOFT_VERSION); SET_FLAG(peer->flags, PEER_FLAG_CAPABILITY_SOFT_VERSION);
if (CHECK_FLAG(bgp->flags, BGP_FLAG_DYNAMIC_CAPABILITY))
SET_FLAG(peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY);
SET_FLAG(peer->flags_invert, PEER_FLAG_CAPABILITY_FQDN); SET_FLAG(peer->flags_invert, PEER_FLAG_CAPABILITY_FQDN);
SET_FLAG(peer->flags, PEER_FLAG_CAPABILITY_FQDN); SET_FLAG(peer->flags, PEER_FLAG_CAPABILITY_FQDN);
@ -2919,6 +2922,13 @@ static void peer_group2peer_config_copy(struct peer_group *group,
SET_FLAG(peer->flags, SET_FLAG(peer->flags,
PEER_FLAG_CAPABILITY_SOFT_VERSION); PEER_FLAG_CAPABILITY_SOFT_VERSION);
/* capability dynamic apply */
if (!CHECK_FLAG(peer->flags_override,
PEER_FLAG_DYNAMIC_CAPABILITY))
if (CHECK_FLAG(conf->flags, PEER_FLAG_DYNAMIC_CAPABILITY))
SET_FLAG(peer->flags,
PEER_FLAG_DYNAMIC_CAPABILITY);
/* password apply */ /* password apply */
if (!CHECK_FLAG(peer->flags_override, PEER_FLAG_PASSWORD)) if (!CHECK_FLAG(peer->flags_override, PEER_FLAG_PASSWORD))
PEER_STR_ATTR_INHERIT(peer, group, password, PEER_STR_ATTR_INHERIT(peer, group, password,

View File

@ -522,6 +522,7 @@ struct bgp {
#define BGP_FLAG_LU_IPV6_EXPLICIT_NULL (1ULL << 34) #define BGP_FLAG_LU_IPV6_EXPLICIT_NULL (1ULL << 34)
#define BGP_FLAG_SOFT_VERSION_CAPABILITY (1ULL << 35) #define BGP_FLAG_SOFT_VERSION_CAPABILITY (1ULL << 35)
#define BGP_FLAG_ENFORCE_FIRST_AS (1ULL << 36) #define BGP_FLAG_ENFORCE_FIRST_AS (1ULL << 36)
#define BGP_FLAG_DYNAMIC_CAPABILITY (1ULL << 37)
/* BGP default address-families. /* BGP default address-families.
* New peers inherit enabled afi/safis from bgp instance. * New peers inherit enabled afi/safis from bgp instance.

View File

@ -1949,6 +1949,13 @@ Configuring Peers
outputs. It's easier to troubleshoot if you have a number of BGP peers outputs. It's easier to troubleshoot if you have a number of BGP peers
and a number of routes to check. and a number of routes to check.
.. clicmd:: bgp default dynamic-capability
This command enables dynamic capability advertisement by default
for all the neighbors.
For ``datacenter`` profile, this is enabled by default.
.. clicmd:: bgp default software-version-capability .. clicmd:: bgp default software-version-capability
This command enables software version capability advertisement by default This command enables software version capability advertisement by default