summaryrefslogtreecommitdiff
path: root/bgpd/bgp_vty.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_vty.c')
-rw-r--r--bgpd/bgp_vty.c322
1 files changed, 234 insertions, 88 deletions
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index aea6dbbf4e..a356564813 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -68,25 +68,25 @@
#include "bgpd/bgp_addpath.h"
#include "bgpd/bgp_mac.h"
#include "bgpd/bgp_flowspec.h"
-#if ENABLE_BGP_VNC
+#ifdef ENABLE_BGP_VNC
#include "bgpd/rfapi/bgp_rfapi_cfg.h"
#endif
FRR_CFG_DEFAULT_BOOL(BGP_IMPORT_CHECK,
- { .val_long = true, .match_profile = "datacenter", },
- { .val_long = false },
+ { .val_bool = true, .match_profile = "datacenter", },
+ { .val_bool = false },
)
FRR_CFG_DEFAULT_BOOL(BGP_SHOW_HOSTNAME,
- { .val_long = true, .match_profile = "datacenter", },
- { .val_long = false },
+ { .val_bool = true, .match_profile = "datacenter", },
+ { .val_bool = false },
)
FRR_CFG_DEFAULT_BOOL(BGP_LOG_NEIGHBOR_CHANGES,
- { .val_long = true, .match_profile = "datacenter", },
- { .val_long = false },
+ { .val_bool = true, .match_profile = "datacenter", },
+ { .val_bool = false },
)
FRR_CFG_DEFAULT_BOOL(BGP_DETERMINISTIC_MED,
- { .val_long = true, .match_profile = "datacenter", },
- { .val_long = false },
+ { .val_bool = true, .match_profile = "datacenter", },
+ { .val_bool = false },
)
FRR_CFG_DEFAULT_ULONG(BGP_CONNECT_RETRY,
{ .val_ulong = 10, .match_profile = "datacenter", },
@@ -100,6 +100,11 @@ FRR_CFG_DEFAULT_ULONG(BGP_KEEPALIVE,
{ .val_ulong = 3, .match_profile = "datacenter", },
{ .val_ulong = 60 },
)
+FRR_CFG_DEFAULT_BOOL(BGP_EBGP_REQUIRES_POLICY,
+ { .val_bool = false, .match_profile = "datacenter", },
+ { .val_bool = false, .match_version = "< 7.4", },
+ { .val_bool = true },
+)
DEFINE_HOOK(bgp_inst_config_write,
(struct bgp *bgp, struct vty *vty),
@@ -417,6 +422,8 @@ int bgp_get_vty(struct bgp **bgp, as_t *as, const char *name,
SET_FLAG((*bgp)->flags, BGP_FLAG_LOG_NEIGHBOR_CHANGES);
if (DFLT_BGP_DETERMINISTIC_MED)
SET_FLAG((*bgp)->flags, BGP_FLAG_DETERMINISTIC_MED);
+ if (DFLT_BGP_EBGP_REQUIRES_POLICY)
+ SET_FLAG((*bgp)->flags, BGP_FLAG_EBGP_REQUIRES_POLICY);
ret = BGP_SUCCESS;
}
@@ -2036,7 +2043,7 @@ DEFUN(bgp_ebgp_requires_policy, bgp_ebgp_requires_policy_cmd,
"Require in and out policy for eBGP peers (RFC8212)\n")
{
VTY_DECLVAR_CONTEXT(bgp, bgp);
- bgp->ebgp_requires_policy = DEFAULT_EBGP_POLICY_ENABLED;
+ SET_FLAG(bgp->flags, BGP_FLAG_EBGP_REQUIRES_POLICY);
return CMD_SUCCESS;
}
@@ -2047,7 +2054,7 @@ DEFUN(no_bgp_ebgp_requires_policy, no_bgp_ebgp_requires_policy_cmd,
"Require in and out policy for eBGP peers (RFC8212)\n")
{
VTY_DECLVAR_CONTEXT(bgp, bgp);
- bgp->ebgp_requires_policy = DEFAULT_EBGP_POLICY_DISABLED;
+ UNSET_FLAG(bgp->flags, BGP_FLAG_EBGP_REQUIRES_POLICY);
return CMD_SUCCESS;
}
@@ -2060,7 +2067,7 @@ DEFUN(bgp_reject_as_sets, bgp_reject_as_sets_cmd,
struct listnode *node, *nnode;
struct peer *peer;
- bgp->reject_as_sets = BGP_REJECT_AS_SETS_ENABLED;
+ bgp->reject_as_sets = true;
/* Reset existing BGP sessions to reject routes
* with aspath containing AS_SET or AS_CONFED_SET.
@@ -2086,7 +2093,7 @@ DEFUN(no_bgp_reject_as_sets, no_bgp_reject_as_sets_cmd,
struct listnode *node, *nnode;
struct peer *peer;
- bgp->reject_as_sets = BGP_REJECT_AS_SETS_DISABLED;
+ bgp->reject_as_sets = false;
/* Reset existing BGP sessions to reject routes
* with aspath containing AS_SET or AS_CONFED_SET.
@@ -2973,6 +2980,49 @@ DEFUN (no_bgp_bestpath_med,
return CMD_SUCCESS;
}
+/* "bgp bestpath bandwidth" configuration. */
+DEFPY (bgp_bestpath_bw,
+ bgp_bestpath_bw_cmd,
+ "[no$no] bgp bestpath bandwidth [<ignore|skip-missing|default-weight-for-missing>$bw_cfg]",
+ NO_STR
+ "BGP specific commands\n"
+ "Change the default bestpath selection\n"
+ "Link Bandwidth attribute\n"
+ "Ignore link bandwidth (i.e., do regular ECMP, not weighted)\n"
+ "Ignore paths without link bandwidth for ECMP (if other paths have it)\n"
+ "Assign a low default weight (value 1) to paths not having link bandwidth\n")
+{
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
+ afi_t afi;
+ safi_t safi;
+
+ if (no) {
+ bgp->lb_handling = BGP_LINK_BW_ECMP;
+ } else {
+ if (!bw_cfg) {
+ vty_out(vty, "%% Bandwidth configuration must be specified\n");
+ return CMD_ERR_INCOMPLETE;
+ }
+ if (!strcmp(bw_cfg, "ignore"))
+ bgp->lb_handling = BGP_LINK_BW_IGNORE_BW;
+ else if (!strcmp(bw_cfg, "skip-missing"))
+ bgp->lb_handling = BGP_LINK_BW_SKIP_MISSING;
+ else if (!strcmp(bw_cfg, "default-weight-for-missing"))
+ bgp->lb_handling = BGP_LINK_BW_DEFWT_4_MISSING;
+ else
+ return CMD_ERR_NO_MATCH;
+ }
+
+ /* This config is used in route install, so redo that. */
+ FOREACH_AFI_SAFI (afi, safi) {
+ if (!bgp_fibupd_safi(safi))
+ continue;
+ bgp_zebra_announce_table(bgp, afi, safi);
+ }
+
+ return CMD_SUCCESS;
+}
+
/* "no bgp default ipv4-unicast". */
DEFUN (no_bgp_default_ipv4_unicast,
no_bgp_default_ipv4_unicast_cmd,
@@ -9036,21 +9086,23 @@ static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
json_object_int_add(json_peer, "msgSent",
PEER_TOTAL_TX(peer));
+ atomic_size_t outq_count, inq_count;
+ outq_count = atomic_load_explicit(
+ &peer->obuf->count,
+ memory_order_relaxed);
+ inq_count = atomic_load_explicit(
+ &peer->ibuf->count,
+ memory_order_relaxed);
+
json_object_int_add(json_peer, "tableVersion",
peer->version[afi][safi]);
json_object_int_add(json_peer, "outq",
- peer->obuf->count);
- json_object_int_add(json_peer, "inq", 0);
+ outq_count);
+ json_object_int_add(json_peer, "inq",
+ inq_count);
peer_uptime(peer->uptime, timebuf, BGP_UPTIME_LEN,
use_json, json_peer);
- /*
- * Adding "pfxRcd" field to match with the corresponding
- * CLI. "prefixReceivedCount" will be deprecated in
- * future.
- */
- json_object_int_add(json_peer, "prefixReceivedCount",
- peer->pcount[afi][pfx_rcd_safi]);
json_object_int_add(json_peer, "pfxRcd",
peer->pcount[afi][pfx_rcd_safi]);
@@ -9122,12 +9174,21 @@ static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
vty_out(vty, "%*s", max_neighbor_width - len,
" ");
+ atomic_size_t outq_count, inq_count;
+ outq_count = atomic_load_explicit(
+ &peer->obuf->count,
+ memory_order_relaxed);
+ inq_count = atomic_load_explicit(
+ &peer->ibuf->count,
+ memory_order_relaxed);
+
vty_out(vty,
- "4 %10u %9u %9u %8" PRIu64 " %4d %4zu %8s",
+ "4 %10u %9u %9u %8" PRIu64
+ " %4zu %4zu %8s",
peer->as, PEER_TOTAL_RX(peer),
PEER_TOTAL_TX(peer),
- peer->version[afi][safi], 0,
- peer->obuf->count,
+ peer->version[afi][safi], inq_count,
+ outq_count,
peer_uptime(peer->uptime, timebuf,
BGP_UPTIME_LEN, 0, NULL));
@@ -10095,14 +10156,14 @@ static void bgp_show_peer_afi(struct vty *vty, struct peer *p, afi_t afi,
filter->map[RMAP_OUT].name);
/* ebgp-requires-policy (inbound) */
- if (p->bgp->ebgp_requires_policy == DEFAULT_EBGP_POLICY_ENABLED
+ if (CHECK_FLAG(p->bgp->flags, BGP_FLAG_EBGP_REQUIRES_POLICY)
&& !bgp_inbound_policy_exists(p, filter))
json_object_string_add(
json_addr, "inboundEbgpRequiresPolicy",
"Inbound updates discarded due to missing policy");
/* ebgp-requires-policy (outbound) */
- if (p->bgp->ebgp_requires_policy == DEFAULT_EBGP_POLICY_ENABLED
+ if (CHECK_FLAG(p->bgp->flags, BGP_FLAG_EBGP_REQUIRES_POLICY)
&& (!bgp_outbound_policy_exists(p, filter)))
json_object_string_add(
json_addr, "outboundEbgpRequiresPolicy",
@@ -10391,13 +10452,13 @@ static void bgp_show_peer_afi(struct vty *vty, struct peer *p, afi_t afi,
filter->map[RMAP_OUT].name);
/* ebgp-requires-policy (inbound) */
- if (p->bgp->ebgp_requires_policy == DEFAULT_EBGP_POLICY_ENABLED
+ if (CHECK_FLAG(p->bgp->flags, BGP_FLAG_EBGP_REQUIRES_POLICY)
&& !bgp_inbound_policy_exists(p, filter))
vty_out(vty,
" Inbound updates discarded due to missing policy\n");
/* ebgp-requires-policy (outbound) */
- if (p->bgp->ebgp_requires_policy == DEFAULT_EBGP_POLICY_ENABLED
+ if (CHECK_FLAG(p->bgp->flags, BGP_FLAG_EBGP_REQUIRES_POLICY)
&& !bgp_outbound_policy_exists(p, filter))
vty_out(vty,
" Outbound updates discarded due to missing policy\n");
@@ -11711,9 +11772,17 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, bool use_json,
json_object *json_stat = NULL;
json_stat = json_object_new_object();
/* Packet counts. */
- json_object_int_add(json_stat, "depthInq", 0);
+
+ atomic_size_t outq_count, inq_count;
+ outq_count = atomic_load_explicit(&p->obuf->count,
+ memory_order_relaxed);
+ inq_count = atomic_load_explicit(&p->ibuf->count,
+ memory_order_relaxed);
+
+ json_object_int_add(json_stat, "depthInq",
+ (unsigned long)inq_count);
json_object_int_add(json_stat, "depthOutq",
- (unsigned long)p->obuf->count);
+ (unsigned long)outq_count);
json_object_int_add(json_stat, "opensSent",
atomic_load_explicit(&p->open_out,
memory_order_relaxed));
@@ -11754,11 +11823,16 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, bool use_json,
json_object_int_add(json_stat, "totalRecv", PEER_TOTAL_RX(p));
json_object_object_add(json_neigh, "messageStats", json_stat);
} else {
+ atomic_size_t outq_count, inq_count;
+ outq_count = atomic_load_explicit(&p->obuf->count,
+ memory_order_relaxed);
+ inq_count = atomic_load_explicit(&p->ibuf->count,
+ memory_order_relaxed);
+
/* Packet counts. */
vty_out(vty, " Message statistics:\n");
- vty_out(vty, " Inq depth is 0\n");
- vty_out(vty, " Outq depth is %lu\n",
- (unsigned long)p->obuf->count);
+ vty_out(vty, " Inq depth is %zu\n", inq_count);
+ vty_out(vty, " Outq depth is %zu\n", outq_count);
vty_out(vty, " Sent Rcvd\n");
vty_out(vty, " Opens: %10d %10d\n",
atomic_load_explicit(&p->open_out,
@@ -12125,14 +12199,20 @@ static int bgp_show_neighbor_graceful_restart(struct vty *vty, struct bgp *bgp,
enum show_type type,
union sockunion *su,
const char *conf_if, afi_t afi,
- bool use_json, json_object *json)
+ bool use_json)
{
struct listnode *node, *nnode;
struct peer *peer;
int find = 0;
safi_t safi = SAFI_UNICAST;
+ json_object *json = NULL;
json_object *json_neighbor = NULL;
+ if (use_json) {
+ json = json_object_new_object();
+ json_neighbor = json_object_new_object();
+ }
+
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
@@ -12141,16 +12221,15 @@ static int bgp_show_neighbor_graceful_restart(struct vty *vty, struct bgp *bgp,
if ((peer->afc[afi][safi]) == 0)
continue;
- if (use_json)
- json_neighbor = json_object_new_object();
-
if (type == show_all) {
bgp_show_peer_gr_status(vty, peer, use_json,
json_neighbor);
- if (use_json)
+ if (use_json) {
json_object_object_add(json, peer->host,
json_neighbor);
+ json_neighbor = NULL;
+ }
} else if (type == show_peer) {
if (conf_if) {
@@ -12176,8 +12255,10 @@ static int bgp_show_neighbor_graceful_restart(struct vty *vty, struct bgp *bgp,
json_neighbor);
}
- if (find)
+ if (find) {
+ json_neighbor = NULL;
break;
+ }
}
if (type == show_peer && !find) {
@@ -12190,6 +12271,10 @@ static int bgp_show_neighbor_graceful_restart(struct vty *vty, struct bgp *bgp,
vty_out(vty, "%s\n",
json_object_to_json_string_ext(
json, JSON_C_TO_STRING_PRETTY));
+
+ if (json_neighbor)
+ json_object_free(json_neighbor);
+ json_object_free(json);
} else {
vty_out(vty, "\n");
}
@@ -12311,7 +12396,6 @@ static void bgp_show_neighbor_graceful_restart_vty(struct vty *vty,
int ret;
struct bgp *bgp;
union sockunion su;
- json_object *json = NULL;
bgp = bgp_get_default();
@@ -12322,20 +12406,17 @@ static void bgp_show_neighbor_graceful_restart_vty(struct vty *vty,
bgp_show_global_graceful_restart_mode_vty(vty, bgp, use_json,
NULL);
- json = json_object_new_object();
if (ip_str) {
ret = str2sockunion(ip_str, &su);
if (ret < 0)
- bgp_show_neighbor_graceful_restart(vty, bgp, type, NULL,
- ip_str, afi,
- use_json, json);
- else
bgp_show_neighbor_graceful_restart(
- vty, bgp, type, &su, NULL, afi, use_json, json);
+ vty, bgp, type, NULL, ip_str, afi, use_json);
+ else
+ bgp_show_neighbor_graceful_restart(vty, bgp, type, &su,
+ NULL, afi, use_json);
} else
bgp_show_neighbor_graceful_restart(vty, bgp, type, NULL, NULL,
- afi, use_json, json);
- json_object_free(json);
+ afi, use_json);
}
static void bgp_show_all_instances_neighbors_vty(struct vty *vty,
@@ -14992,12 +15073,16 @@ int bgp_config_write(struct vty *vty)
vty_out(vty, " bgp always-compare-med\n");
/* RFC8212 default eBGP policy. */
- if (bgp->ebgp_requires_policy
- == DEFAULT_EBGP_POLICY_ENABLED)
- vty_out(vty, " bgp ebgp-requires-policy\n");
+ if (!!CHECK_FLAG(bgp->flags, BGP_FLAG_EBGP_REQUIRES_POLICY)
+ != SAVE_BGP_EBGP_REQUIRES_POLICY)
+ vty_out(vty, " %sbgp ebgp-requires-policy\n",
+ CHECK_FLAG(bgp->flags,
+ BGP_FLAG_EBGP_REQUIRES_POLICY)
+ ? ""
+ : "no ");
/* draft-ietf-idr-deprecate-as-set-confed-set */
- if (bgp->reject_as_sets == BGP_REJECT_AS_SETS_ENABLED)
+ if (bgp->reject_as_sets)
vty_out(vty, " bgp reject-as-sets\n");
/* BGP default ipv4-unicast. */
@@ -15161,6 +15246,14 @@ int bgp_config_write(struct vty *vty)
vty_out(vty, "\n");
}
+ /* Link bandwidth handling. */
+ if (bgp->lb_handling == BGP_LINK_BW_IGNORE_BW)
+ vty_out(vty, " bgp bestpath bandwidth ignore\n");
+ else if (bgp->lb_handling == BGP_LINK_BW_SKIP_MISSING)
+ vty_out(vty, " bgp bestpath bandwidth skip-missing\n");
+ else if (bgp->lb_handling == BGP_LINK_BW_DEFWT_4_MISSING)
+ vty_out(vty, " bgp bestpath bandwidth default-weight-for-missing\n");
+
/* BGP network import check. */
if (!!CHECK_FLAG(bgp->flags, BGP_FLAG_IMPORT_CHECK)
!= SAVE_BGP_IMPORT_CHECK)
@@ -15241,7 +15334,7 @@ int bgp_config_write(struct vty *vty)
hook_call(bgp_inst_config_write, bgp, vty);
-#if ENABLE_BGP_VNC
+#ifdef ENABLE_BGP_VNC
bgp_rfapi_cfg_write(vty, bgp);
#endif
@@ -15253,50 +15346,96 @@ int bgp_config_write(struct vty *vty)
/* BGP node structure. */
static struct cmd_node bgp_node = {
- BGP_NODE, "%s(config-router)# ", 1,
+ .name = "bgp",
+ .node = BGP_NODE,
+ .parent_node = CONFIG_NODE,
+ .prompt = "%s(config-router)# ",
+ .config_write = bgp_config_write,
};
static struct cmd_node bgp_ipv4_unicast_node = {
- BGP_IPV4_NODE, "%s(config-router-af)# ", 1,
+ .name = "bgp ipv4 unicast",
+ .node = BGP_IPV4_NODE,
+ .parent_node = BGP_NODE,
+ .prompt = "%s(config-router-af)# ",
};
static struct cmd_node bgp_ipv4_multicast_node = {
- BGP_IPV4M_NODE, "%s(config-router-af)# ", 1,
+ .name = "bgp ipv4 multicast",
+ .node = BGP_IPV4M_NODE,
+ .parent_node = BGP_NODE,
+ .prompt = "%s(config-router-af)# ",
};
static struct cmd_node bgp_ipv4_labeled_unicast_node = {
- BGP_IPV4L_NODE, "%s(config-router-af)# ", 1,
+ .name = "bgp ipv4 labeled unicast",
+ .node = BGP_IPV4L_NODE,
+ .parent_node = BGP_NODE,
+ .prompt = "%s(config-router-af)# ",
};
static struct cmd_node bgp_ipv6_unicast_node = {
- BGP_IPV6_NODE, "%s(config-router-af)# ", 1,
+ .name = "bgp ipv6",
+ .node = BGP_IPV6_NODE,
+ .parent_node = BGP_NODE,
+ .prompt = "%s(config-router-af)# ",
};
static struct cmd_node bgp_ipv6_multicast_node = {
- BGP_IPV6M_NODE, "%s(config-router-af)# ", 1,
+ .name = "bgp ipv6 multicast",
+ .node = BGP_IPV6M_NODE,
+ .parent_node = BGP_NODE,
+ .prompt = "%s(config-router-af)# ",
};
static struct cmd_node bgp_ipv6_labeled_unicast_node = {
- BGP_IPV6L_NODE, "%s(config-router-af)# ", 1,
+ .name = "bgp ipv6 labeled unicast",
+ .node = BGP_IPV6L_NODE,
+ .parent_node = BGP_NODE,
+ .prompt = "%s(config-router-af)# ",
};
-static struct cmd_node bgp_vpnv4_node = {BGP_VPNV4_NODE,
- "%s(config-router-af)# ", 1};
+static struct cmd_node bgp_vpnv4_node = {
+ .name = "bgp vpnv4",
+ .node = BGP_VPNV4_NODE,
+ .parent_node = BGP_NODE,
+ .prompt = "%s(config-router-af)# ",
+};
-static struct cmd_node bgp_vpnv6_node = {BGP_VPNV6_NODE,
- "%s(config-router-af-vpnv6)# ", 1};
+static struct cmd_node bgp_vpnv6_node = {
+ .name = "bgp vpnv6",
+ .node = BGP_VPNV6_NODE,
+ .parent_node = BGP_NODE,
+ .prompt = "%s(config-router-af-vpnv6)# ",
+};
-static struct cmd_node bgp_evpn_node = {BGP_EVPN_NODE,
- "%s(config-router-evpn)# ", 1};
+static struct cmd_node bgp_evpn_node = {
+ .name = "bgp evpn",
+ .node = BGP_EVPN_NODE,
+ .parent_node = BGP_NODE,
+ .prompt = "%s(config-router-evpn)# ",
+};
-static struct cmd_node bgp_evpn_vni_node = {BGP_EVPN_VNI_NODE,
- "%s(config-router-af-vni)# ", 1};
+static struct cmd_node bgp_evpn_vni_node = {
+ .name = "bgp evpn vni",
+ .node = BGP_EVPN_VNI_NODE,
+ .parent_node = BGP_EVPN_NODE,
+ .prompt = "%s(config-router-af-vni)# ",
+};
-static struct cmd_node bgp_flowspecv4_node = {BGP_FLOWSPECV4_NODE,
- "%s(config-router-af)# ", 1};
+static struct cmd_node bgp_flowspecv4_node = {
+ .name = "bgp ipv4 flowspec",
+ .node = BGP_FLOWSPECV4_NODE,
+ .parent_node = BGP_NODE,
+ .prompt = "%s(config-router-af)# ",
+};
-static struct cmd_node bgp_flowspecv6_node = {BGP_FLOWSPECV6_NODE,
- "%s(config-router-af-vpnv6)# ", 1};
+static struct cmd_node bgp_flowspecv6_node = {
+ .name = "bgp ipv6 flowspec",
+ .node = BGP_FLOWSPECV6_NODE,
+ .parent_node = BGP_NODE,
+ .prompt = "%s(config-router-af-vpnv6)# ",
+};
static void community_list_vty(void);
@@ -15359,19 +15498,19 @@ void bgp_vty_init(void)
cmd_variable_handler_register(bgp_var_peergroup);
/* Install bgp top node. */
- install_node(&bgp_node, bgp_config_write);
- install_node(&bgp_ipv4_unicast_node, NULL);
- install_node(&bgp_ipv4_multicast_node, NULL);
- install_node(&bgp_ipv4_labeled_unicast_node, NULL);
- install_node(&bgp_ipv6_unicast_node, NULL);
- install_node(&bgp_ipv6_multicast_node, NULL);
- install_node(&bgp_ipv6_labeled_unicast_node, NULL);
- install_node(&bgp_vpnv4_node, NULL);
- install_node(&bgp_vpnv6_node, NULL);
- install_node(&bgp_evpn_node, NULL);
- install_node(&bgp_evpn_vni_node, NULL);
- install_node(&bgp_flowspecv4_node, NULL);
- install_node(&bgp_flowspecv6_node, NULL);
+ install_node(&bgp_node);
+ install_node(&bgp_ipv4_unicast_node);
+ install_node(&bgp_ipv4_multicast_node);
+ install_node(&bgp_ipv4_labeled_unicast_node);
+ install_node(&bgp_ipv6_unicast_node);
+ install_node(&bgp_ipv6_multicast_node);
+ install_node(&bgp_ipv6_labeled_unicast_node);
+ install_node(&bgp_vpnv4_node);
+ install_node(&bgp_vpnv6_node);
+ install_node(&bgp_evpn_node);
+ install_node(&bgp_evpn_vni_node);
+ install_node(&bgp_flowspecv4_node);
+ install_node(&bgp_flowspecv6_node);
/* Install default VTY commands to new nodes. */
install_default(BGP_NODE);
@@ -15567,6 +15706,9 @@ void bgp_vty_init(void)
install_element(BGP_NODE, &bgp_bestpath_med_cmd);
install_element(BGP_NODE, &no_bgp_bestpath_med_cmd);
+ /* "bgp bestpath bandwidth" commands */
+ install_element(BGP_NODE, &bgp_bestpath_bw_cmd);
+
/* "no bgp default ipv4-unicast" commands. */
install_element(BGP_NODE, &no_bgp_default_ipv4_unicast_cmd);
install_element(BGP_NODE, &bgp_default_ipv4_unicast_cmd);
@@ -17773,13 +17915,17 @@ static int community_list_config_write(struct vty *vty)
return write;
}
+static int community_list_config_write(struct vty *vty);
static struct cmd_node community_list_node = {
- COMMUNITY_LIST_NODE, "", 1 /* Export to vtysh. */
+ .name = "community list",
+ .node = COMMUNITY_LIST_NODE,
+ .prompt = "",
+ .config_write = community_list_config_write,
};
static void community_list_vty(void)
{
- install_node(&community_list_node, community_list_config_write);
+ install_node(&community_list_node);
/* Community-list. */
install_element(CONFIG_NODE, &bgp_community_list_standard_cmd);