From d43114f366d18eb0e448dd4dcf4b11b91608e44f Mon Sep 17 00:00:00 2001 From: David Schweizer Date: Tue, 20 Oct 2020 16:51:14 +0200 Subject: [PATCH] bgpd: vtysh commands for DelayOpenTimer Adds vty shell commands to configure the RFC 4271 DelayOpenTimer. Signed-off-by: David Schweizer --- bgpd/bgp_vty.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index 1a7a3543f9..8cbc92e014 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -461,7 +461,7 @@ int bgp_get_vty(struct bgp **bgp, as_t *as, const char *name, if (ret == BGP_CREATED) { bgp_timers_set(*bgp, DFLT_BGP_KEEPALIVE, DFLT_BGP_HOLDTIME, - DFLT_BGP_CONNECT_RETRY); + DFLT_BGP_CONNECT_RETRY, BGP_DEFAULT_DELAYOPEN); if (DFLT_BGP_IMPORT_CHECK) SET_FLAG((*bgp)->flags, BGP_FLAG_IMPORT_CHECK); @@ -7373,6 +7373,54 @@ DEFUN_YANG (no_neighbor_timers_connect, return nb_cli_apply_changes(vty, base_xpath); } +DEFPY (neighbor_timers_delayopen, + neighbor_timers_delayopen_cmd, + "neighbor $neighbor timers delayopen (1-240)$interval", + NEIGHBOR_STR + NEIGHBOR_ADDR_STR2 + "BGP per neighbor timers\n" + "RFC 4271 DelayOpenTimer\n" + "DelayOpenTime timer interval\n") +{ + struct peer *peer; + + peer = peer_and_group_lookup_vty(vty, neighbor); + if (!peer) + return CMD_WARNING_CONFIG_FAILED; + + if (!interval) { + if (peer_timers_delayopen_unset(peer)) + return CMD_WARNING_CONFIG_FAILED; + } else { + if (peer_timers_delayopen_set(peer, interval)) + return CMD_WARNING_CONFIG_FAILED; + } + + return CMD_SUCCESS; +} + +DEFPY (no_neighbor_timers_delayopen, + no_neighbor_timers_delayopen_cmd, + "no neighbor $neighbor timers delayopen [(0-65535)]", + NO_STR + NEIGHBOR_STR + NEIGHBOR_ADDR_STR2 + "BGP per neighbor timers\n" + "RFC 4271 DelayOpenTimer\n" + "DelayOpenTime timer interval\n") +{ + struct peer *peer; + + peer = peer_and_group_lookup_vty(vty, neighbor); + if (!peer) + return CMD_WARNING_CONFIG_FAILED; + + if (peer_timers_delayopen_unset(peer)) + return CMD_WARNING_CONFIG_FAILED; + + return CMD_SUCCESS; +} + DEFUN_YANG (neighbor_advertise_interval, neighbor_advertise_interval_cmd, "neighbor advertisement-interval (0-600)", @@ -12600,6 +12648,12 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, bool use_json, json_object_int_add(json_neigh, "bgpTimerKeepAliveIntervalMsecs", p->v_keepalive * 1000); + if (CHECK_FLAG(p->flags, PEER_FLAG_TIMER_DELAYOPEN)) { + json_object_int_add(json_neigh, + "bgpTimerDelayOpenTimeMsecs", + p->v_delayopen * 1000); + } + if (CHECK_FLAG(p->flags, PEER_FLAG_TIMER)) { json_object_int_add(json_neigh, "bgpTimerConfiguredHoldTimeMsecs", @@ -12679,6 +12733,10 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, bool use_json, vty_out(vty, ", keepalive interval is %d seconds\n", bgp->default_keepalive); } + if (CHECK_FLAG(p->flags, PEER_FLAG_TIMER_DELAYOPEN)) + vty_out(vty, + " Configured DelayOpenTime is %d seconds\n", + p->delayopen); } /* Capability. */ if (p->status == Established) { @@ -16395,6 +16453,18 @@ static void bgp_config_write_peer_global(struct vty *vty, struct bgp *bgp, vty_out(vty, " neighbor %s timers connect %u\n", addr, peer->bgp->default_connect_retry); + /* timers delayopen */ + if (peergroup_flag_check(peer, PEER_FLAG_TIMER_DELAYOPEN)) + vty_out(vty, " neighbor %s timers delayopen %u\n", addr, + peer->delayopen); + /* Save config even though flag is not set if default values have been + * changed + */ + else if (!peer_group_active(peer) && !peer->delayopen + && peer->bgp->default_delayopen != BGP_DEFAULT_DELAYOPEN) + vty_out(vty, " neighbor %s timers delayopen %u\n", addr, + peer->bgp->default_delayopen); + /* capability dynamic */ if (peergroup_flag_check(peer, PEER_FLAG_DYNAMIC_CAPABILITY)) vty_out(vty, " neighbor %s capability dynamic\n", addr); @@ -18254,6 +18324,10 @@ void bgp_vty_init(void) install_element(BGP_NODE, &neighbor_timers_connect_cmd); install_element(BGP_NODE, &no_neighbor_timers_connect_cmd); + /* "neighbor timers delayopen" commands. */ + install_element(BGP_NODE, &neighbor_timers_delayopen_cmd); + install_element(BGP_NODE, &no_neighbor_timers_delayopen_cmd); + /* "neighbor advertisement-interval" commands. */ install_element(BGP_NODE, &neighbor_advertise_interval_cmd); install_element(BGP_NODE, &no_neighbor_advertise_interval_cmd); -- 2.39.5