summaryrefslogtreecommitdiffstats
path: root/bgpd/bgp_vty.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_vty.c')
-rw-r--r--bgpd/bgp_vty.c826
1 files changed, 566 insertions, 260 deletions
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 1a87799a..68ced14d 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -302,18 +302,11 @@ static const char *get_afi_safi_json_str(afi_t afi, safi_t safi)
/* unset srv6 locator */
static int bgp_srv6_locator_unset(struct bgp *bgp)
{
- int ret;
struct listnode *node, *nnode;
struct srv6_locator_chunk *chunk;
struct bgp_srv6_function *func;
struct bgp *bgp_vrf;
- /* release chunk notification via ZAPI */
- ret = bgp_zebra_srv6_manager_release_locator_chunk(
- bgp->srv6_locator_name);
- if (ret < 0)
- return -1;
-
/* refresh chunks */
for (ALL_LIST_ELEMENTS(bgp->srv6_locator_chunks, node, nnode, chunk)) {
listnode_delete(bgp->srv6_locator_chunks, chunk);
@@ -352,20 +345,28 @@ static int bgp_srv6_locator_unset(struct bgp *bgp)
continue;
/* refresh vpnv4 tovpn_sid_locator */
- srv6_locator_chunk_free(
- &bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator);
+ srv6_locator_free(bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator);
+ bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator = NULL;
/* refresh vpnv6 tovpn_sid_locator */
- srv6_locator_chunk_free(
- &bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid_locator);
+ srv6_locator_free(
+ bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid_locator);
+ bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid_locator = NULL;
/* refresh per-vrf tovpn_sid_locator */
- srv6_locator_chunk_free(&bgp_vrf->tovpn_sid_locator);
+ srv6_locator_free(bgp_vrf->tovpn_sid_locator);
+ bgp_vrf->tovpn_sid_locator = NULL;
}
/* clear locator name */
memset(bgp->srv6_locator_name, 0, sizeof(bgp->srv6_locator_name));
+ /* clear SRv6 locator */
+ if (bgp->srv6_locator) {
+ srv6_locator_free(bgp->srv6_locator);
+ bgp->srv6_locator = NULL;
+ }
+
return 0;
}
@@ -878,6 +879,7 @@ int bgp_vty_return(struct vty *vty, enum bgp_create_error_code ret)
switch (ret) {
case BGP_SUCCESS:
case BGP_CREATED:
+ case BGP_INSTANCE_EXISTS:
case BGP_GR_NO_OPERATION:
break;
case BGP_ERR_INVALID_VALUE:
@@ -1417,7 +1419,7 @@ DEFUN_HIDDEN (bgp_local_mac,
seq = strtoul(argv[7]->arg, NULL, 10);
bgp = bgp_get_default();
- if (!bgp) {
+ if (!bgp || IS_BGP_INSTANCE_HIDDEN(bgp)) {
vty_out(vty, "Default BGP instance is not there\n");
return CMD_WARNING;
}
@@ -1457,7 +1459,7 @@ DEFUN_HIDDEN (no_bgp_local_mac,
memset(&ip, 0, sizeof(ip));
bgp = bgp_get_default();
- if (!bgp) {
+ if (!bgp || IS_BGP_INSTANCE_HIDDEN(bgp)) {
vty_out(vty, "Default BGP instance is not there\n");
return CMD_WARNING;
}
@@ -1600,8 +1602,12 @@ DEFUN_NOSH (router_bgp,
if (is_new_bgp && inst_type == BGP_INSTANCE_TYPE_DEFAULT)
vpn_leak_postchange_all();
- if (inst_type == BGP_INSTANCE_TYPE_VRF)
+ if (inst_type == BGP_INSTANCE_TYPE_VRF ||
+ IS_BGP_INSTANCE_HIDDEN(bgp)) {
bgp_vpn_leak_export(bgp);
+ UNSET_FLAG(bgp->flags, BGP_FLAG_INSTANCE_HIDDEN);
+ UNSET_FLAG(bgp->flags, BGP_FLAG_DELETE_IN_PROGRESS);
+ }
/* Pending: handle when user tries to change a view to vrf n vv.
*/
/* for pre-existing bgp instance,
@@ -1673,7 +1679,7 @@ DEFUN (no_router_bgp,
argv[idx_asn]->arg);
return CMD_WARNING_CONFIG_FAILED;
}
- if (argc > 4) {
+ if (argc > 4 && strncmp(argv[4]->arg, "vrf", 3) == 0) {
name = argv[idx_vrf]->arg;
if (strmatch(argv[idx_vrf - 1]->text, "vrf")
&& strmatch(name, VRF_DEFAULT_NAME))
@@ -1695,15 +1701,18 @@ DEFUN (no_router_bgp,
/* Cannot delete default instance if vrf instances exist */
if (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT) {
- struct listnode *node;
+ struct listnode *node, *nnode;
struct bgp *tmp_bgp;
- for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, tmp_bgp)) {
+ for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, tmp_bgp)) {
if (tmp_bgp->inst_type != BGP_INSTANCE_TYPE_VRF)
continue;
- if (CHECK_FLAG(tmp_bgp->vrf_flags, BGP_VRF_AUTO))
+ if (CHECK_FLAG(tmp_bgp->vrf_flags,
+ BGP_VRF_AUTO)) {
bgp_delete(tmp_bgp);
+ continue;
+ }
if (CHECK_FLAG(
tmp_bgp->af_flags[AFI_IP]
@@ -2267,9 +2276,9 @@ static int bgp_global_update_delay_config_vty(struct vty *vty,
* Note that we only need to check this if this is the first time
* setting the global config.
*/
- if (bm->v_update_delay == BGP_UPDATE_DELAY_DEF) {
+ if (bm->v_update_delay == BGP_UPDATE_DELAY_DEFAULT) {
for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
- if (bgp->v_update_delay != BGP_UPDATE_DELAY_DEF) {
+ if (bgp->v_update_delay != BGP_UPDATE_DELAY_DEFAULT) {
vty_out(vty,
"%% update-delay configuration found in vrf %s\n",
bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT
@@ -2314,7 +2323,7 @@ static int bgp_global_update_delay_deconfig_vty(struct vty *vty)
struct listnode *node, *nnode;
struct bgp *bgp;
- bm->v_update_delay = BGP_UPDATE_DELAY_DEF;
+ bm->v_update_delay = BGP_UPDATE_DELAY_DEFAULT;
bm->v_establish_wait = bm->v_update_delay;
for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
@@ -2368,7 +2377,7 @@ static int bgp_update_delay_deconfig_vty(struct vty *vty)
"%%Failed: bgp update-delay configured globally. Delete per-vrf not permitted\n");
return CMD_WARNING_CONFIG_FAILED;
}
- bgp->v_update_delay = BGP_UPDATE_DELAY_DEF;
+ bgp->v_update_delay = BGP_UPDATE_DELAY_DEFAULT;
bgp->v_establish_wait = bgp->v_update_delay;
return CMD_SUCCESS;
@@ -2928,11 +2937,10 @@ DEFUN(bgp_reject_as_sets, bgp_reject_as_sets_cmd,
* with aspath containing AS_SET or AS_CONFED_SET.
*/
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
- peer->last_reset = PEER_DOWN_AS_SETS_REJECT;
+ peer->last_reset = PEER_DOWN_AS_SETS_REJECT;
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
}
return CMD_SUCCESS;
@@ -2954,11 +2962,10 @@ DEFUN(no_bgp_reject_as_sets, no_bgp_reject_as_sets_cmd,
* with aspath containing AS_SET or AS_CONFED_SET.
*/
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
- peer->last_reset = PEER_DOWN_AS_SETS_REJECT;
+ peer->last_reset = PEER_DOWN_AS_SETS_REJECT;
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
}
return CMD_SUCCESS;
@@ -3023,6 +3030,98 @@ DEFUN (no_bgp_deterministic_med,
return CMD_SUCCESS;
}
+static int bgp_inst_gr_config_vty(struct vty *vty, struct bgp *bgp, bool on,
+ bool disable)
+{
+ int ret = BGP_GR_FAILURE;
+
+ /*
+ * Update the instance and all its peers, if appropriate.
+ * Then, inform zebra of BGP's GR capabilities, if needed.
+ */
+ if (disable)
+ ret = bgp_gr_update_all(bgp, on ? GLOBAL_DISABLE_CMD
+ : NO_GLOBAL_DISABLE_CMD);
+ else
+ ret = bgp_gr_update_all(bgp,
+ on ? GLOBAL_GR_CMD : NO_GLOBAL_GR_CMD);
+
+ VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp, bgp->peer,
+ ret);
+ return ret;
+}
+
+static int bgp_global_gr_config_vty(struct vty *vty, bool on, bool disable)
+{
+ struct listnode *node, *nnode;
+ struct bgp *bgp;
+ bool vrf_cfg = false;
+ int ret = BGP_GR_FAILURE;
+
+ if (disable) {
+ if ((on && CHECK_FLAG(bm->flags, BM_FLAG_GR_DISABLED)) ||
+ (!on && !CHECK_FLAG(bm->flags, BM_FLAG_GR_DISABLED)))
+ return CMD_SUCCESS;
+ } else {
+ if ((on && CHECK_FLAG(bm->flags, BM_FLAG_GR_RESTARTER)) ||
+ (!on && !CHECK_FLAG(bm->flags, BM_FLAG_GR_RESTARTER)))
+ return CMD_SUCCESS;
+ }
+
+ /* See if GR is set per-vrf and warn user to delete */
+ if (!CHECK_FLAG(bm->flags, BM_FLAG_GR_CONFIGURED)) {
+ for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
+ enum global_mode gr_mode = bgp_global_gr_mode_get(bgp);
+
+ if (gr_mode != GLOBAL_HELPER) {
+ vty_out(vty,
+ "%% graceful-restart configuration found in %s, mode %d\n",
+ bgp->name_pretty, gr_mode);
+ vrf_cfg = true;
+ }
+ }
+ }
+
+ if (vrf_cfg) {
+ vty_out(vty,
+ "%%Failed: global graceful-restart not permitted with per-vrf configuration\n");
+ return CMD_WARNING;
+ }
+
+ /* Set flag globally */
+ if (on) {
+ if (disable) {
+ UNSET_FLAG(bm->flags, BM_FLAG_GR_RESTARTER);
+ SET_FLAG(bm->flags, BM_FLAG_GR_DISABLED);
+ } else {
+ SET_FLAG(bm->flags, BM_FLAG_GR_RESTARTER);
+ UNSET_FLAG(bm->flags, BM_FLAG_GR_DISABLED);
+ }
+ } else {
+ if (disable)
+ UNSET_FLAG(bm->flags, BM_FLAG_GR_DISABLED);
+ else
+ UNSET_FLAG(bm->flags, BM_FLAG_GR_RESTARTER);
+ }
+
+ /* Initiate processing for all BGP instances. */
+ for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
+ ret = bgp_inst_gr_config_vty(vty, bgp, on, disable);
+ if (ret != BGP_GR_SUCCESS)
+ vty_out(vty,
+ "%% Applying global graceful-restart %s config to vrf %s failed, error %d\n",
+ (disable) ? "disable" : "",
+ bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT
+ ? "Default"
+ : bgp->name,
+ ret);
+ }
+
+ vty_out(vty,
+ "Graceful restart configuration changed, reset all peers to take effect\n");
+ return bgp_vty_return(vty, ret);
+}
+
/* "bgp graceful-restart mode" configuration. */
DEFUN (bgp_graceful_restart,
bgp_graceful_restart_cmd,
@@ -3031,25 +3130,18 @@ DEFUN (bgp_graceful_restart,
GR_CMD
)
{
- int ret = BGP_GR_FAILURE;
-
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug("[BGP_GR] bgp_graceful_restart_cmd : START ");
+ if (vty->node == CONFIG_NODE)
+ return bgp_global_gr_config_vty(vty, true, false);
+ int ret = BGP_GR_FAILURE;
VTY_DECLVAR_CONTEXT(bgp, bgp);
- ret = bgp_gr_update_all(bgp, GLOBAL_GR_CMD);
+ ret = bgp_inst_gr_config_vty(vty, bgp, true, false);
if (ret == BGP_GR_SUCCESS) {
- VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp,
- bgp->peer,
- ret);
vty_out(vty,
"Graceful restart configuration changed, reset all peers to take effect\n");
}
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug("[BGP_GR] bgp_graceful_restart_cmd : END ");
-
return bgp_vty_return(vty, ret);
}
@@ -3061,14 +3153,13 @@ DEFUN (no_bgp_graceful_restart,
NO_GR_CMD
)
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
-
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug("[BGP_GR] no_bgp_graceful_restart_cmd : START ");
+ if (vty->node == CONFIG_NODE)
+ return bgp_global_gr_config_vty(vty, false, false);
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
int ret = BGP_GR_FAILURE;
- ret = bgp_gr_update_all(bgp, NO_GLOBAL_GR_CMD);
+ ret = bgp_inst_gr_config_vty(vty, bgp, false, false);
if (ret == BGP_GR_SUCCESS) {
VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp,
bgp->peer,
@@ -3077,9 +3168,6 @@ DEFUN (no_bgp_graceful_restart,
"Graceful restart configuration changed, reset all peers to take effect\n");
}
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug("[BGP_GR] no_bgp_graceful_restart_cmd : END ");
-
return bgp_vty_return(vty, ret);
}
@@ -3091,12 +3179,21 @@ DEFUN (bgp_graceful_restart_stalepath_time,
"Set the max time to hold onto restarting peer's stale paths\n"
"Delay value (seconds)\n")
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
int idx_number = 3;
uint32_t stalepath;
stalepath = strtoul(argv[idx_number]->arg, NULL, 10);
- bgp->stalepath_time = stalepath;
+ if (vty->node == CONFIG_NODE) {
+ struct listnode *node, *nnode;
+ struct bgp *bgp;
+
+ bm->stalepath_time = stalepath;
+ for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp))
+ bgp->stalepath_time = stalepath;
+ } else {
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
+ bgp->stalepath_time = stalepath;
+ }
return CMD_SUCCESS;
}
@@ -3108,20 +3205,32 @@ DEFUN (bgp_graceful_restart_restart_time,
"Set the time to wait to delete stale routes before a BGP open message is received\n"
"Delay value (seconds)\n")
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
int idx_number = 3;
uint32_t restart;
struct listnode *node, *nnode;
struct peer *peer;
restart = strtoul(argv[idx_number]->arg, NULL, 10);
- bgp->restart_time = restart;
- for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer))
- bgp_capability_send(peer, AFI_IP, SAFI_UNICAST,
- CAPABILITY_CODE_RESTART,
- CAPABILITY_ACTION_SET);
+ if (vty->node == CONFIG_NODE) {
+ struct bgp *bgp;
+ bm->restart_time = restart;
+ for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
+ bgp->restart_time = restart;
+ for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer))
+ bgp_capability_send(peer, AFI_IP, SAFI_UNICAST,
+ CAPABILITY_CODE_RESTART,
+ CAPABILITY_ACTION_SET);
+ }
+ } else {
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
+ bgp->restart_time = restart;
+ for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer))
+ bgp_capability_send(peer, AFI_IP, SAFI_UNICAST,
+ CAPABILITY_CODE_RESTART,
+ CAPABILITY_ACTION_SET);
+ }
return CMD_SUCCESS;
}
@@ -3133,16 +3242,32 @@ DEFUN (bgp_graceful_restart_select_defer_time,
"Set the time to defer the BGP route selection after restart\n"
"Delay value (seconds, 0 - disable)\n")
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
int idx_number = 3;
uint32_t defer_time;
defer_time = strtoul(argv[idx_number]->arg, NULL, 10);
- bgp->select_defer_time = defer_time;
- if (defer_time == 0)
- SET_FLAG(bgp->flags, BGP_FLAG_SELECT_DEFER_DISABLE);
- else
- UNSET_FLAG(bgp->flags, BGP_FLAG_SELECT_DEFER_DISABLE);
+ if (vty->node == CONFIG_NODE) {
+ struct listnode *node, *nnode;
+ struct bgp *bgp;
+
+ bm->select_defer_time = defer_time;
+ for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
+ bgp->select_defer_time = defer_time;
+ if (defer_time == 0)
+ SET_FLAG(bgp->flags,
+ BGP_FLAG_SELECT_DEFER_DISABLE);
+ else
+ UNSET_FLAG(bgp->flags,
+ BGP_FLAG_SELECT_DEFER_DISABLE);
+ }
+ } else {
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
+ bgp->select_defer_time = defer_time;
+ if (defer_time == 0)
+ SET_FLAG(bgp->flags, BGP_FLAG_SELECT_DEFER_DISABLE);
+ else
+ UNSET_FLAG(bgp->flags, BGP_FLAG_SELECT_DEFER_DISABLE);
+ }
return CMD_SUCCESS;
}
@@ -3156,9 +3281,17 @@ DEFUN (no_bgp_graceful_restart_stalepath_time,
"Set the max time to hold onto restarting peer's stale paths\n"
"Delay value (seconds)\n")
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
+ if (vty->node == CONFIG_NODE) {
+ struct listnode *node, *nnode;
+ struct bgp *bgp;
- bgp->stalepath_time = BGP_DEFAULT_STALEPATH_TIME;
+ bm->stalepath_time = BGP_DEFAULT_STALEPATH_TIME;
+ for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp))
+ bgp->stalepath_time = BGP_DEFAULT_STALEPATH_TIME;
+ } else {
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
+ bgp->stalepath_time = BGP_DEFAULT_STALEPATH_TIME;
+ }
return CMD_SUCCESS;
}
@@ -3171,17 +3304,30 @@ DEFUN (no_bgp_graceful_restart_restart_time,
"Set the time to wait to delete stale routes before a BGP open message is received\n"
"Delay value (seconds)\n")
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
struct listnode *node, *nnode;
struct peer *peer;
- bgp->restart_time = BGP_DEFAULT_RESTART_TIME;
+ if (vty->node == CONFIG_NODE) {
+ struct bgp *bgp;
- for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer))
- bgp_capability_send(peer, AFI_IP, SAFI_UNICAST,
- CAPABILITY_CODE_RESTART,
- CAPABILITY_ACTION_UNSET);
+ bm->restart_time = BGP_DEFAULT_RESTART_TIME;
+ for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
+ bgp->restart_time = BGP_DEFAULT_RESTART_TIME;
+
+ for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer))
+ bgp_capability_send(peer, AFI_IP, SAFI_UNICAST,
+ CAPABILITY_CODE_RESTART,
+ CAPABILITY_ACTION_UNSET);
+ }
+ } else {
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
+ bgp->restart_time = BGP_DEFAULT_RESTART_TIME;
+ for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer))
+ bgp_capability_send(peer, AFI_IP, SAFI_UNICAST,
+ CAPABILITY_CODE_RESTART,
+ CAPABILITY_ACTION_UNSET);
+ }
return CMD_SUCCESS;
}
@@ -3194,10 +3340,21 @@ DEFUN (no_bgp_graceful_restart_select_defer_time,
"Set the time to defer the BGP route selection after restart\n"
"Delay value (seconds)\n")
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
+ if (vty->node == CONFIG_NODE) {
+ struct listnode *node, *nnode;
+ struct bgp *bgp;
- bgp->select_defer_time = BGP_DEFAULT_SELECT_DEFERRAL_TIME;
- UNSET_FLAG(bgp->flags, BGP_FLAG_SELECT_DEFER_DISABLE);
+ bm->select_defer_time = BGP_DEFAULT_SELECT_DEFERRAL_TIME;
+ for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
+ bgp->select_defer_time =
+ BGP_DEFAULT_SELECT_DEFERRAL_TIME;
+ UNSET_FLAG(bgp->flags, BGP_FLAG_SELECT_DEFER_DISABLE);
+ }
+ } else {
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
+ bgp->select_defer_time = BGP_DEFAULT_SELECT_DEFERRAL_TIME;
+ UNSET_FLAG(bgp->flags, BGP_FLAG_SELECT_DEFER_DISABLE);
+ }
return CMD_SUCCESS;
}
@@ -3209,8 +3366,17 @@ DEFUN (bgp_graceful_restart_preserve_fw,
"Graceful restart capability parameters\n"
"Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
- SET_FLAG(bgp->flags, BGP_FLAG_GR_PRESERVE_FWD);
+ if (vty->node == CONFIG_NODE) {
+ struct listnode *node, *nnode;
+ struct bgp *bgp;
+
+ SET_FLAG(bm->flags, BM_FLAG_GR_PRESERVE_FWD);
+ for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp))
+ SET_FLAG(bgp->flags, BGP_FLAG_GR_PRESERVE_FWD);
+ } else {
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
+ SET_FLAG(bgp->flags, BGP_FLAG_GR_PRESERVE_FWD);
+ }
return CMD_SUCCESS;
}
@@ -3222,8 +3388,17 @@ DEFUN (no_bgp_graceful_restart_preserve_fw,
"Graceful restart capability parameters\n"
"Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
- UNSET_FLAG(bgp->flags, BGP_FLAG_GR_PRESERVE_FWD);
+ if (vty->node == CONFIG_NODE) {
+ struct listnode *node, *nnode;
+ struct bgp *bgp;
+
+ UNSET_FLAG(bm->flags, BM_FLAG_GR_PRESERVE_FWD);
+ for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp))
+ UNSET_FLAG(bgp->flags, BGP_FLAG_GR_PRESERVE_FWD);
+ } else {
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
+ UNSET_FLAG(bgp->flags, BGP_FLAG_GR_PRESERVE_FWD);
+ }
return CMD_SUCCESS;
}
@@ -3275,21 +3450,17 @@ DEFUN (bgp_graceful_restart_disable,
BGP_STR
GR_DISABLE)
{
+ if (vty->node == CONFIG_NODE)
+ return bgp_global_gr_config_vty(vty, true, true);
+
int ret = BGP_GR_FAILURE;
struct listnode *node, *nnode;
struct peer *peer;
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug(
- "[BGP_GR] bgp_graceful_restart_disable_cmd : START ");
-
VTY_DECLVAR_CONTEXT(bgp, bgp);
- ret = bgp_gr_update_all(bgp, GLOBAL_DISABLE_CMD);
+ ret = bgp_inst_gr_config_vty(vty, bgp, true, true);
if (ret == BGP_GR_SUCCESS) {
- VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp,
- bgp->peer,
- ret);
vty_out(vty,
"Graceful restart configuration changed, reset all peers to take effect\n");
@@ -3303,9 +3474,6 @@ DEFUN (bgp_graceful_restart_disable,
}
}
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug("[BGP_GR] bgp_graceful_restart_disable_cmd : END ");
-
return bgp_vty_return(vty, ret);
}
@@ -3317,27 +3485,18 @@ DEFUN (no_bgp_graceful_restart_disable,
NO_GR_DISABLE
)
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
-
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug(
- "[BGP_GR] no_bgp_graceful_restart_disable_cmd : START ");
+ if (vty->node == CONFIG_NODE)
+ return bgp_global_gr_config_vty(vty, false, true);
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
int ret = BGP_GR_FAILURE;
- ret = bgp_gr_update_all(bgp, NO_GLOBAL_DISABLE_CMD);
+ ret = bgp_inst_gr_config_vty(vty, bgp, false, true);
if (ret == BGP_GR_SUCCESS) {
- VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp,
- bgp->peer,
- ret);
vty_out(vty,
"Graceful restart configuration changed, reset all peers to take effect\n");
}
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug(
- "[BGP_GR] no_bgp_graceful_restart_disable_cmd : END ");
-
return bgp_vty_return(vty, ret);
}
@@ -3355,13 +3514,14 @@ DEFUN (bgp_neighbor_graceful_restart_set,
VTY_BGP_GR_DEFINE_LOOP_VARIABLE;
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug(
- "[BGP_GR] bgp_neighbor_graceful_restart_set_cmd : START ");
-
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
if (!peer)
return CMD_WARNING_CONFIG_FAILED;
+ if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
+ vty_out(vty,
+ "Per peer-group graceful-restart configuration is not yet supported\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
result = bgp_neighbor_graceful_restart(peer, PEER_GR_CMD);
if (result == BGP_GR_SUCCESS) {
@@ -3371,15 +3531,7 @@ DEFUN (bgp_neighbor_graceful_restart_set,
"Graceful restart configuration changed, reset this peer to take effect\n");
}
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug(
- "[BGP_GR] bgp_neighbor_graceful_restart_set_cmd : END ");
-
- if (ret != BGP_GR_SUCCESS)
- vty_out(vty,
- "As part of configuring graceful-restart, capability send to zebra failed\n");
-
- return bgp_vty_return(vty, result);
+ return bgp_vty_return(vty, ret);
}
DEFUN (no_bgp_neighbor_graceful_restart,
@@ -3400,10 +3552,11 @@ DEFUN (no_bgp_neighbor_graceful_restart,
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
if (!peer)
return CMD_WARNING_CONFIG_FAILED;
-
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug(
- "[BGP_GR] no_bgp_neighbor_graceful_restart_set_cmd : START ");
+ if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
+ vty_out(vty,
+ "Per peer-group graceful-restart configuration is not yet supported\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
result = bgp_neighbor_graceful_restart(peer, NO_PEER_GR_CMD);
if (ret == BGP_GR_SUCCESS) {
@@ -3413,14 +3566,6 @@ DEFUN (no_bgp_neighbor_graceful_restart,
"Graceful restart configuration changed, reset this peer to take effect\n");
}
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug(
- "[BGP_GR] no_bgp_neighbor_graceful_restart_set_cmd : END ");
-
- if (ret != BGP_GR_SUCCESS)
- vty_out(vty,
- "As part of configuring graceful-restart, capability send to zebra failed\n");
-
return bgp_vty_return(vty, result);
}
@@ -3438,15 +3583,14 @@ DEFUN (bgp_neighbor_graceful_restart_helper_set,
VTY_BGP_GR_DEFINE_LOOP_VARIABLE;
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug(
- "[BGP_GR] bgp_neighbor_graceful_restart_helper_set_cmd : START ");
-
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
-
if (!peer)
return CMD_WARNING_CONFIG_FAILED;
-
+ if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
+ vty_out(vty,
+ "Per peer-group graceful-restart configuration is not yet supported\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
ret = bgp_neighbor_graceful_restart(peer, PEER_HELPER_CMD);
if (ret == BGP_GR_SUCCESS) {
@@ -3456,10 +3600,6 @@ DEFUN (bgp_neighbor_graceful_restart_helper_set,
"Graceful restart configuration changed, reset this peer to take effect\n");
}
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug(
- "[BGP_GR] bgp_neighbor_graceful_restart_helper_set_cmd : END ");
-
return bgp_vty_return(vty, ret);
}
@@ -3481,10 +3621,11 @@ DEFUN (no_bgp_neighbor_graceful_restart_helper,
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
if (!peer)
return CMD_WARNING_CONFIG_FAILED;
-
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug(
- "[BGP_GR] no_bgp_neighbor_graceful_restart_helper_set_cmd : START ");
+ if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
+ vty_out(vty,
+ "Per peer-group graceful-restart configuration is not yet supported\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
ret = bgp_neighbor_graceful_restart(peer, NO_PEER_HELPER_CMD);
if (ret == BGP_GR_SUCCESS) {
@@ -3494,10 +3635,6 @@ DEFUN (no_bgp_neighbor_graceful_restart_helper,
"Graceful restart configuration changed, reset this peer to take effect\n");
}
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug(
- "[BGP_GR] no_bgp_neighbor_graceful_restart_helper_set_cmd : END ");
-
return bgp_vty_return(vty, ret);
}
@@ -3515,29 +3652,24 @@ DEFUN (bgp_neighbor_graceful_restart_disable_set,
VTY_BGP_GR_DEFINE_LOOP_VARIABLE;
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug(
- "[BGP_GR] bgp_neighbor_graceful_restart_disable_set_cmd : START ");
-
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
if (!peer)
return CMD_WARNING_CONFIG_FAILED;
+ if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
+ vty_out(vty,
+ "Per peer-group graceful-restart configuration is not yet supported\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
ret = bgp_neighbor_graceful_restart(peer, PEER_DISABLE_CMD);
if (ret == BGP_GR_SUCCESS) {
- if (peer->bgp->t_startup)
+ if (peer->bgp->t_startup || bgp_in_graceful_restart())
bgp_peer_gr_flags_update(peer);
VTY_BGP_GR_ROUTER_DETECT(bgp, peer, peer->bgp->peer);
VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer->bgp, ret);
- vty_out(vty,
- "Graceful restart configuration changed, reset this peer to take effect\n");
}
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug(
- "[BGP_GR]bgp_neighbor_graceful_restart_disable_set_cmd : END ");
-
return bgp_vty_return(vty, ret);
}
@@ -3559,23 +3691,18 @@ DEFUN (no_bgp_neighbor_graceful_restart_disable,
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
if (!peer)
return CMD_WARNING_CONFIG_FAILED;
-
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug(
- "[BGP_GR] no_bgp_neighbor_graceful_restart_disable_set_cmd : START ");
+ if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
+ vty_out(vty,
+ "Per peer-group graceful-restart configuration is not yet supported\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
ret = bgp_neighbor_graceful_restart(peer, NO_PEER_DISABLE_CMD);
if (ret == BGP_GR_SUCCESS) {
VTY_BGP_GR_ROUTER_DETECT(bgp, peer, peer->bgp->peer);
VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer->bgp, ret);
- vty_out(vty,
- "Graceful restart configuration changed, reset this peer to take effect\n");
}
- if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
- zlog_debug(
- "[BGP_GR] no_bgp_neighbor_graceful_restart_disable_set_cmd : END ");
-
return bgp_vty_return(vty, ret);
}
@@ -3590,9 +3717,10 @@ DEFPY (neighbor_graceful_shutdown,
afi_t afi;
safi_t safi;
struct peer *peer;
- VTY_DECLVAR_CONTEXT(bgp, bgp);
int ret;
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
+
peer = peer_and_group_lookup_vty(vty, neighbor);
if (!peer)
return CMD_WARNING_CONFIG_FAILED;
@@ -4745,7 +4873,7 @@ static int peer_remote_as_vty(struct vty *vty, const char *peer_str,
VTY_DECLVAR_CONTEXT(bgp, bgp);
int ret;
as_t as;
- int as_type = AS_SPECIFIED;
+ enum peer_asn_type as_type = AS_SPECIFIED;
union sockunion su;
if (as_str[0] == 'i') {
@@ -4754,6 +4882,9 @@ static int peer_remote_as_vty(struct vty *vty, const char *peer_str,
} else if (as_str[0] == 'e') {
as = 0;
as_type = AS_EXTERNAL;
+ } else if (as_str[0] == 'a') {
+ as = 0;
+ as_type = AS_AUTO;
} else if (!asn_str2asn(as_str, &as))
as_type = AS_UNSPECIFIED;
@@ -4859,13 +4990,14 @@ ALIAS(no_bgp_shutdown, no_bgp_shutdown_msg_cmd,
DEFUN (neighbor_remote_as,
neighbor_remote_as_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <ASNUM|internal|external>",
+ "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <ASNUM|internal|external|auto>",
NEIGHBOR_STR
NEIGHBOR_ADDR_STR2
"Specify a BGP neighbor\n"
AS_STR
"Internal BGP peer\n"
- "External BGP peer\n")
+ "External BGP peer\n"
+ "Automatically detect remote ASN\n")
{
int idx_peer = 1;
int idx_remote_as = 3;
@@ -4913,6 +5045,27 @@ DEFUN(no_bgp_fast_convergence, no_bgp_fast_convergence_cmd,
return CMD_SUCCESS;
}
+DEFPY (bgp_ipv6_auto_ra,
+ bgp_ipv6_auto_ra_cmd,
+ "[no] bgp ipv6-auto-ra",
+ NO_STR
+ BGP_STR
+ "Allow enabling IPv6 ND RA sending\n")
+{
+ if (vty->node == CONFIG_NODE) {
+ struct listnode *node, *nnode;
+ struct bgp *bgp;
+
+ COND_FLAG(bm->flags, BM_FLAG_IPV6_NO_AUTO_RA, no);
+ for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp))
+ COND_FLAG(bgp->flags, BGP_FLAG_IPV6_NO_AUTO_RA, no);
+ } else {
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
+ COND_FLAG(bgp->flags, BGP_FLAG_IPV6_NO_AUTO_RA, no);
+ }
+ return CMD_SUCCESS;
+}
+
static int peer_conf_interface_get(struct vty *vty, const char *conf_if,
int v6only,
const char *peer_group_name,
@@ -4920,7 +5073,7 @@ static int peer_conf_interface_get(struct vty *vty, const char *conf_if,
{
VTY_DECLVAR_CONTEXT(bgp, bgp);
as_t as = 0;
- int as_type = AS_UNSPECIFIED;
+ enum peer_asn_type as_type = AS_UNSPECIFIED;
struct peer *peer;
struct peer_group *group;
int ret = 0;
@@ -4937,6 +5090,8 @@ static int peer_conf_interface_get(struct vty *vty, const char *conf_if,
as_type = AS_INTERNAL;
} else if (as_str[0] == 'e') {
as_type = AS_EXTERNAL;
+ } else if (as_str[0] == 'a') {
+ as_type = AS_AUTO;
} else {
/* Get AS number. */
if (asn_str2asn(as_str, &as))
@@ -4980,12 +5135,13 @@ static int peer_conf_interface_get(struct vty *vty, const char *conf_if,
else
peer_flag_unset(peer, PEER_FLAG_IFPEER_V6ONLY);
+ peer->last_reset = PEER_DOWN_V6ONLY_CHANGE;
+
/* v6only flag changed. Reset bgp seesion */
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
- peer->last_reset = PEER_DOWN_V6ONLY_CHANGE;
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- } else
+ else
bgp_session_reset(peer);
}
@@ -5053,14 +5209,15 @@ DEFUN (neighbor_interface_config_v6only,
DEFUN (neighbor_interface_config_remote_as,
neighbor_interface_config_remote_as_cmd,
- "neighbor WORD interface remote-as <ASNUM|internal|external>",
+ "neighbor WORD interface remote-as <ASNUM|internal|external|auto>",
NEIGHBOR_STR
"Interface name or neighbor tag\n"
"Enable BGP on interface\n"
"Specify a BGP neighbor\n"
AS_STR
"Internal BGP peer\n"
- "External BGP peer\n")
+ "External BGP peer\n"
+ "Automatically detect remote ASN\n")
{
int idx_word = 1;
int idx_remote_as = 4;
@@ -5070,7 +5227,7 @@ DEFUN (neighbor_interface_config_remote_as,
DEFUN (neighbor_interface_v6only_config_remote_as,
neighbor_interface_v6only_config_remote_as_cmd,
- "neighbor WORD interface v6only remote-as <ASNUM|internal|external>",
+ "neighbor WORD interface v6only remote-as <ASNUM|internal|external|auto>",
NEIGHBOR_STR
"Interface name or neighbor tag\n"
"Enable BGP with v6 link-local only\n"
@@ -5078,7 +5235,8 @@ DEFUN (neighbor_interface_v6only_config_remote_as,
"Specify a BGP neighbor\n"
AS_STR
"Internal BGP peer\n"
- "External BGP peer\n")
+ "External BGP peer\n"
+ "Automatically detect remote ASN\n")
{
int idx_word = 1;
int idx_remote_as = 5;
@@ -5115,14 +5273,15 @@ DEFUN (neighbor_peer_group,
DEFUN (no_neighbor,
no_neighbor_cmd,
- "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external>]>",
+ "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external|auto>]>",
NO_STR
NEIGHBOR_STR
NEIGHBOR_ADDR_STR2
"Specify a BGP neighbor\n"
AS_STR
"Internal BGP peer\n"
- "External BGP peer\n")
+ "External BGP peer\n"
+ "Automatically detect remote ASN\n")
{
VTY_DECLVAR_CONTEXT(bgp, bgp);
int idx_peer = 2;
@@ -5193,7 +5352,7 @@ DEFUN (no_neighbor,
DEFUN (no_neighbor_interface_config,
no_neighbor_interface_config_cmd,
- "no neighbor WORD interface [v6only] [peer-group PGNAME] [remote-as <(1-4294967295)|internal|external>]",
+ "no neighbor WORD interface [v6only] [peer-group PGNAME] [remote-as <(1-4294967295)|internal|external|auto>]",
NO_STR
NEIGHBOR_STR
"Interface name\n"
@@ -5204,7 +5363,8 @@ DEFUN (no_neighbor_interface_config,
"Specify a BGP neighbor\n"
AS_STR
"Internal BGP peer\n"
- "External BGP peer\n")
+ "External BGP peer\n"
+ "Automatically detect remote ASN\n")
{
VTY_DECLVAR_CONTEXT(bgp, bgp);
int idx_word = 2;
@@ -5261,14 +5421,15 @@ DEFUN (no_neighbor_peer_group,
DEFUN (no_neighbor_interface_peer_group_remote_as,
no_neighbor_interface_peer_group_remote_as_cmd,
- "no neighbor WORD remote-as <ASNUM|internal|external>",
+ "no neighbor WORD remote-as <ASNUM|internal|external|auto>",
NO_STR
NEIGHBOR_STR
"Interface name or neighbor tag\n"
"Specify a BGP neighbor\n"
AS_STR
"Internal BGP peer\n"
- "External BGP peer\n")
+ "External BGP peer\n"
+ "Automatically detect remote ASN\n")
{
VTY_DECLVAR_CONTEXT(bgp, bgp);
int idx_word = 2;
@@ -5316,7 +5477,7 @@ DEFUN (neighbor_local_as,
return CMD_WARNING_CONFIG_FAILED;
}
- ret = peer_local_as_set(peer, as, 0, 0, argv[idx_number]->arg);
+ ret = peer_local_as_set(peer, as, 0, 0, 0, argv[idx_number]->arg);
return bgp_vty_return(vty, ret);
}
@@ -5345,19 +5506,20 @@ DEFUN (neighbor_local_as_no_prepend,
return CMD_WARNING_CONFIG_FAILED;
}
- ret = peer_local_as_set(peer, as, 1, 0, argv[idx_number]->arg);
+ ret = peer_local_as_set(peer, as, 1, 0, 0, argv[idx_number]->arg);
return bgp_vty_return(vty, ret);
}
-DEFUN (neighbor_local_as_no_prepend_replace_as,
+DEFPY (neighbor_local_as_no_prepend_replace_as,
neighbor_local_as_no_prepend_replace_as_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> local-as ASNUM no-prepend replace-as",
+ "neighbor <A.B.C.D|X:X::X:X|WORD> local-as ASNUM no-prepend replace-as [dual-as$dual_as]",
NEIGHBOR_STR
NEIGHBOR_ADDR_STR2
"Specify a local-as number\n"
"AS number expressed in dotted or plain format used as local AS\n"
"Do not prepend local-as to updates from ebgp peers\n"
- "Do not prepend local-as to updates from ibgp peers\n")
+ "Do not prepend local-as to updates from ibgp peers\n"
+ "Allow peering with a global AS number or local-as number\n")
{
int idx_peer = 1;
int idx_number = 3;
@@ -5375,20 +5537,21 @@ DEFUN (neighbor_local_as_no_prepend_replace_as,
return CMD_WARNING_CONFIG_FAILED;
}
- ret = peer_local_as_set(peer, as, 1, 1, argv[idx_number]->arg);
+ ret = peer_local_as_set(peer, as, 1, 1, dual_as, argv[idx_number]->arg);
return bgp_vty_return(vty, ret);
}
DEFUN (no_neighbor_local_as,
no_neighbor_local_as_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [ASNUM [no-prepend [replace-as]]]",
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [ASNUM [no-prepend [replace-as] [dual-as]]]",
NO_STR
NEIGHBOR_STR
NEIGHBOR_ADDR_STR2
"Specify a local-as number\n"
"AS number expressed in dotted or plain format used as local AS\n"
"Do not prepend local-as to updates from ebgp peers\n"
- "Do not prepend local-as to updates from ibgp peers\n")
+ "Do not prepend local-as to updates from ibgp peers\n"
+ "Allow peering with a global AS number or local-as number\n")
{
int idx_peer = 2;
struct peer *peer;
@@ -8282,7 +8445,7 @@ DEFPY (bgp_condadv_period,
DEFPY (bgp_def_originate_eval,
bgp_def_originate_eval_cmd,
- "[no$no] bgp default-originate timer (0-3600)$timer",
+ "[no$no] bgp default-originate timer (0-65535)$timer",
NO_STR
BGP_STR
"Control default-originate\n"
@@ -8291,8 +8454,7 @@ DEFPY (bgp_def_originate_eval,
{
VTY_DECLVAR_CONTEXT(bgp, bgp);
- bgp->rmap_def_originate_eval_timer =
- no ? RMAP_DEFAULT_ORIGINATE_EVAL_TIMER : timer;
+ bgp->rmap_def_originate_eval_timer = no ? 0 : timer;
if (bgp->t_rmap_def_originate_eval)
EVENT_OFF(bgp->t_rmap_def_originate_eval);
@@ -10310,9 +10472,9 @@ DEFPY(af_import_vrf_route_map, af_import_vrf_route_map_cmd,
bgp_default = bgp_get_default();
if (!bgp_default) {
int32_t ret;
- as_t as = bgp->as;
+ as_t as = AS_UNSPECIFIED;
- /* Auto-create assuming the same AS */
+ /* Auto-create with AS_UNSPECIFIED, to be filled in later */
ret = bgp_get_vty(&bgp_default, &as, NULL,
BGP_INSTANCE_TYPE_DEFAULT, NULL,
ASNOTATION_UNDEFINED);
@@ -10322,6 +10484,8 @@ DEFPY(af_import_vrf_route_map, af_import_vrf_route_map_cmd,
"VRF default is not configured as a bgp instance\n");
return CMD_WARNING;
}
+
+ SET_FLAG(bgp_default->flags, BGP_FLAG_INSTANCE_HIDDEN);
}
vpn_leak_prechange(dir, afi, bgp_get_default(), bgp);
@@ -10425,7 +10589,9 @@ DEFPY(bgp_imexport_vrf, bgp_imexport_vrf_cmd,
bgp_default = bgp_get_default();
if (!bgp_default) {
- /* Auto-create assuming the same AS */
+ as = AS_UNSPECIFIED;
+
+ /* Auto-create with AS_UNSPECIFIED, to be filled in later */
ret = bgp_get_vty(&bgp_default, &as, NULL,
BGP_INSTANCE_TYPE_DEFAULT, NULL,
ASNOTATION_UNDEFINED);
@@ -10435,6 +10601,8 @@ DEFPY(bgp_imexport_vrf, bgp_imexport_vrf_cmd,
"VRF default is not configured as a bgp instance\n");
return CMD_WARNING;
}
+
+ SET_FLAG(bgp_default->flags, BGP_FLAG_INSTANCE_HIDDEN);
}
vrf_bgp = bgp_lookup_by_name(import_name);
@@ -10442,9 +10610,19 @@ DEFPY(bgp_imexport_vrf, bgp_imexport_vrf_cmd,
if (strcmp(import_name, VRF_DEFAULT_NAME) == 0) {
vrf_bgp = bgp_default;
} else {
- /* Auto-create assuming the same AS */
+ as = AS_UNSPECIFIED;
+
+ /* Auto-create with AS_UNSPECIFIED, fill in later */
ret = bgp_get_vty(&vrf_bgp, &as, import_name, bgp_type,
NULL, ASNOTATION_UNDEFINED);
+ if (ret) {
+ vty_out(vty,
+ "VRF %s is not configured as a bgp instance\n",
+ import_name);
+ return CMD_WARNING;
+ }
+
+ SET_FLAG(vrf_bgp->flags, BGP_FLAG_INSTANCE_HIDDEN);
/* Auto created VRF instances should be marked
* properly, otherwise we have a state after bgpd
@@ -10452,13 +10630,6 @@ DEFPY(bgp_imexport_vrf, bgp_imexport_vrf_cmd,
*/
SET_FLAG(vrf_bgp->vrf_flags, BGP_VRF_AUTO);
}
-
- if (ret) {
- vty_out(vty,
- "VRF %s is not configured as a bgp instance\n",
- import_name);
- return CMD_WARNING;
- }
}
if (remove) {
@@ -10744,7 +10915,7 @@ DEFPY (bgp_srv6_locator,
snprintf(bgp->srv6_locator_name,
sizeof(bgp->srv6_locator_name), "%s", name);
- ret = bgp_zebra_srv6_manager_get_locator_chunk(name);
+ ret = bgp_zebra_srv6_manager_get_locator(name);
if (ret < 0)
return CMD_WARNING_CONFIG_FAILED;
@@ -10795,6 +10966,17 @@ DEFPY (show_bgp_srv6,
return CMD_SUCCESS;
vty_out(vty, "locator_name: %s\n", bgp->srv6_locator_name);
+ if (bgp->srv6_locator) {
+ vty_out(vty, " prefix: %pFX\n", &bgp->srv6_locator->prefix);
+ vty_out(vty, " block-length: %d\n",
+ bgp->srv6_locator->block_bits_length);
+ vty_out(vty, " node-length: %d\n",
+ bgp->srv6_locator->node_bits_length);
+ vty_out(vty, " func-length: %d\n",
+ bgp->srv6_locator->function_bits_length);
+ vty_out(vty, " arg-length: %d\n",
+ bgp->srv6_locator->argument_bits_length);
+ }
vty_out(vty, "locator_chunks:\n");
for (ALL_LIST_ELEMENTS_RO(bgp->srv6_locator_chunks, node, chunk)) {
vty_out(vty, "- %pFX\n", &chunk->prefix);
@@ -11404,7 +11586,7 @@ DEFUN(show_bgp_martian_nexthop_db, show_bgp_martian_nexthop_db_cmd,
else
bgp = bgp_get_default();
- if (!bgp) {
+ if (!bgp || IS_BGP_INSTANCE_HIDDEN(bgp)) {
vty_out(vty, "%% No BGP process is configured\n");
return CMD_WARNING;
}
@@ -11767,7 +11949,8 @@ static char *bgp_peer_description_stripped(char *desc, uint32_t size)
/* Determine whether var peer should be filtered out of the summary. */
static bool bgp_show_summary_is_peer_filtered(struct peer *peer,
- struct peer *fpeer, int as_type,
+ struct peer *fpeer,
+ enum peer_asn_type as_type,
as_t as)
{
@@ -11778,7 +11961,7 @@ static bool bgp_show_summary_is_peer_filtered(struct peer *peer,
/* filter remote-as (internal|external) */
if (as_type != AS_UNSPECIFIED) {
if (peer->as_type == AS_SPECIFIED) {
- if (as_type == AS_INTERNAL) {
+ if (CHECK_FLAG(as_type, AS_INTERNAL)) {
if (peer->as != peer->local_as)
return true;
} else if (peer->as == peer->local_as)
@@ -11801,8 +11984,8 @@ static bool bgp_show_summary_is_peer_filtered(struct peer *peer,
* whitespaces and the whole output will be tricky.
*/
static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
- struct peer *fpeer, int as_type, as_t as,
- uint16_t show_flags)
+ struct peer *fpeer, enum peer_asn_type as_type,
+ as_t as, uint16_t show_flags)
{
struct peer *peer;
struct listnode *node, *nnode;
@@ -11914,6 +12097,8 @@ static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
if (show_failed && !failed_count) {
if (use_json) {
+ json_object_free(json_peers);
+
json_object_int_add(json, "failedPeersCount", 0);
json_object_int_add(json, "dynamicPeers", dn_count);
json_object_int_add(json, "totalPeers", count);
@@ -12196,6 +12381,12 @@ static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
json_object_string_add(json_peer, "domainname",
peer->domainname);
+ json_object_string_add(json_peer,
+ "softwareVersion",
+ peer->soft_version
+ ? peer->soft_version
+ : "n/a");
+
asn_asn2json(json_peer, "remoteAs", peer->as,
bgp->asnotation);
asn_asn2json(json_peer, "localAs",
@@ -12609,10 +12800,9 @@ static void bgp_show_summary_afi_safi(struct vty *vty, struct bgp *bgp, int afi,
}
static void bgp_show_all_instances_summary_vty(struct vty *vty, afi_t afi,
- safi_t safi,
- const char *neighbor,
- int as_type, as_t as,
- uint16_t show_flags)
+ safi_t safi, const char *neighbor,
+ enum peer_asn_type as_type,
+ as_t as, uint16_t show_flags)
{
struct listnode *node, *nnode;
struct bgp *bgp;
@@ -12628,6 +12818,9 @@ static void bgp_show_all_instances_summary_vty(struct vty *vty, afi_t afi,
if (CHECK_FLAG(bgp->vrf_flags, BGP_VRF_AUTO))
continue;
+ if (IS_BGP_INSTANCE_HIDDEN(bgp))
+ continue;
+
nbr_output = true;
if (use_json) {
if (!is_first)
@@ -12657,8 +12850,9 @@ static void bgp_show_all_instances_summary_vty(struct vty *vty, afi_t afi,
}
int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
- safi_t safi, const char *neighbor, int as_type,
- as_t as, uint16_t show_flags)
+ safi_t safi, const char *neighbor,
+ enum peer_asn_type as_type, as_t as,
+ uint16_t show_flags)
{
struct bgp *bgp;
bool use_json = CHECK_FLAG(show_flags, BGP_SHOW_OPT_JSON);
@@ -12773,6 +12967,8 @@ DEFPY(show_ip_bgp_summary, show_ip_bgp_summary_cmd,
as_type = AS_INTERNAL;
else if (argv[idx + 1]->arg[0] == 'e')
as_type = AS_EXTERNAL;
+ else if (argv[idx + 1]->arg[0] == 'a')
+ as_type = AS_AUTO;
else if (!asn_str2asn(argv[idx + 1]->arg, &as)) {
vty_out(vty,
"%% Invalid neighbor remote-as value: %s\n",
@@ -13895,10 +14091,15 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, bool use_json,
if (CHECK_FLAG(p->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS))
json_object_boolean_true_add(json_neigh,
"localAsReplaceAs");
+
+ json_object_boolean_add(json_neigh, "localAsReplaceAsDualAs",
+ !!CHECK_FLAG(p->flags,
+ PEER_FLAG_DUAL_AS));
} else {
- if ((p->as_type == AS_SPECIFIED) ||
- (p->as_type == AS_EXTERNAL) ||
- (p->as_type == AS_INTERNAL)) {
+ if (p->as_type == AS_SPECIFIED ||
+ CHECK_FLAG(p->as_type, AS_AUTO) ||
+ CHECK_FLAG(p->as_type, AS_EXTERNAL) ||
+ CHECK_FLAG(p->as_type, AS_INTERNAL)) {
vty_out(vty, "remote AS ");
vty_out(vty, ASN_FORMAT(bgp->asnotation), &p->as);
vty_out(vty, ", ");
@@ -13908,16 +14109,18 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, bool use_json,
vty_out(vty, ASN_FORMAT(bgp->asnotation),
p->change_local_as ? &p->change_local_as
: &p->local_as);
- vty_out(vty, "%s%s, ",
+ vty_out(vty, "%s%s%s, ",
CHECK_FLAG(p->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND)
? " no-prepend"
: "",
CHECK_FLAG(p->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS)
? " replace-as"
- : "");
+ : "",
+ CHECK_FLAG(p->flags, PEER_FLAG_DUAL_AS) ? " dual-as"
+ : "");
}
/* peer type internal or confed-internal */
- if ((p->as == p->local_as) || (p->as_type == AS_INTERNAL)) {
+ if ((p->as == p->local_as) || (CHECK_FLAG(p->as_type, AS_INTERNAL))) {
if (use_json) {
if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
json_object_boolean_true_add(
@@ -16012,6 +16215,9 @@ static void bgp_show_all_instances_neighbors_vty(struct vty *vty,
if (CHECK_FLAG(bgp->vrf_flags, BGP_VRF_AUTO))
continue;
+ if (IS_BGP_INSTANCE_HIDDEN(bgp))
+ continue;
+
nbr_output = true;
if (use_json) {
if (!(json = json_object_new_object())) {
@@ -16667,6 +16873,9 @@ static void bgp_show_all_instances_updgrps_vty(struct vty *vty, afi_t afi,
if (CHECK_FLAG(bgp->vrf_flags, BGP_VRF_AUTO))
continue;
+ if (IS_BGP_INSTANCE_HIDDEN(bgp))
+ continue;
+
if (!uj)
vty_out(vty, "\nInstance %s:\n",
(bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
@@ -16789,7 +16998,7 @@ DEFUN (show_bgp_updgrps_stats,
struct bgp *bgp;
bgp = bgp_get_default();
- if (bgp)
+ if (bgp && !IS_BGP_INSTANCE_HIDDEN(bgp))
update_group_show_stats(bgp, vty);
return CMD_SUCCESS;
@@ -16914,7 +17123,7 @@ static int bgp_show_one_peer_group(struct vty *vty, struct peer_group *group,
&conf->as);
vty_out(vty, "\n");
}
- } else if (conf->as_type == AS_INTERNAL) {
+ } else if (CHECK_FLAG(conf->as_type, AS_INTERNAL)) {
if (json)
asn_asn2json(json, "remoteAs", group->bgp->as,
group->bgp->asnotation);
@@ -16926,7 +17135,13 @@ static int bgp_show_one_peer_group(struct vty *vty, struct peer_group *group,
vty_out(vty, "\nBGP peer-group %s\n", group->name);
}
- if ((group->bgp->as == conf->as) || (conf->as_type == AS_INTERNAL)) {
+ if (CHECK_FLAG(conf->as_type, AS_AUTO)) {
+ if (json)
+ json_object_string_add(json_peer_group, "type", "auto");
+ else
+ vty_out(vty, " Peer-group type is auto\n");
+ } else if ((group->bgp->as == conf->as) ||
+ CHECK_FLAG(conf->as_type, AS_INTERNAL)) {
if (json)
json_object_string_add(json_peer_group, "type",
"internal");
@@ -18428,6 +18643,9 @@ static void bgp_config_write_peer_global(struct vty *vty, struct bgp *bgp,
} else if (peer->as_type == AS_EXTERNAL) {
vty_out(vty, " remote-as external");
if_ras_printed = true;
+ } else if (CHECK_FLAG(peer->as_type, AS_AUTO)) {
+ vty_out(vty, " remote-as auto");
+ if_ras_printed = true;
}
vty_out(vty, "\n");
@@ -18450,6 +18668,9 @@ static void bgp_config_write_peer_global(struct vty *vty, struct bgp *bgp,
vty_out(vty,
" neighbor %s remote-as external\n",
addr);
+ } else if (CHECK_FLAG(peer->as_type, AS_AUTO)) {
+ vty_out(vty, " neighbor %s remote-as auto\n",
+ addr);
}
}
@@ -18479,6 +18700,9 @@ static void bgp_config_write_peer_global(struct vty *vty, struct bgp *bgp,
vty_out(vty,
" neighbor %s remote-as external\n",
addr);
+ } else if (CHECK_FLAG(peer->as_type, AS_AUTO)) {
+ vty_out(vty, " neighbor %s remote-as auto\n",
+ addr);
}
}
}
@@ -18491,6 +18715,8 @@ static void bgp_config_write_peer_global(struct vty *vty, struct bgp *bgp,
vty_out(vty, " no-prepend");
if (peergroup_flag_check(peer, PEER_FLAG_LOCAL_AS_REPLACE_AS))
vty_out(vty, " replace-as");
+ if (peergroup_flag_check(peer, PEER_FLAG_DUAL_AS))
+ vty_out(vty, " dual-as");
vty_out(vty, "\n");
}
@@ -18522,11 +18748,8 @@ static void bgp_config_write_peer_global(struct vty *vty, struct bgp *bgp,
peer->password);
/* neighbor solo */
- if (CHECK_FLAG(peer->flags, PEER_FLAG_LONESOUL)) {
- if (!peer_group_active(peer)) {
- vty_out(vty, " neighbor %s solo\n", addr);
- }
- }
+ if (peergroup_flag_check(peer, PEER_FLAG_LONESOUL))
+ vty_out(vty, " neighbor %s solo\n", addr);
/* BGP port */
if (peer->port != BGP_PORT_DEFAULT) {
@@ -18539,7 +18762,7 @@ static void bgp_config_write_peer_global(struct vty *vty, struct bgp *bgp,
}
/* TCP max segment size */
- if (CHECK_FLAG(peer->flags, PEER_FLAG_TCP_MSS))
+ if (peergroup_flag_check(peer, PEER_FLAG_TCP_MSS))
vty_out(vty, " neighbor %s tcp-mss %d\n", addr, peer->tcp_mss);
/* passive */
@@ -18772,6 +18995,10 @@ static void bgp_config_write_peer_af(struct vty *vty, struct bgp *bgp,
char *addr;
bool flag_scomm, flag_secomm, flag_slcomm;
+ /* skip hidden default vrf bgp instance */
+ if (IS_BGP_INSTANCE_HIDDEN(bgp))
+ return;
+
/* Skip dynamic neighbors. */
if (peer_dynamic_neighbor(peer))
return;
@@ -19077,6 +19304,9 @@ static void bgp_config_write_family(struct vty *vty, struct bgp *bgp, afi_t afi,
struct peer_group *group;
struct listnode *node, *nnode;
+ /* skip hidden default vrf bgp instance */
+ if (IS_BGP_INSTANCE_HIDDEN(bgp))
+ return;
vty_frame(vty, " !\n address-family ");
if (afi == AFI_IP) {
@@ -19190,11 +19420,12 @@ int bgp_config_write(struct vty *vty)
hook_call(bgp_snmp_traps_config_write, vty);
+ vty_out(vty, "!\n");
if (bm->rmap_update_timer != RMAP_DEFAULT_UPDATE_TIMER)
vty_out(vty, "bgp route-map delay-timer %u\n",
bm->rmap_update_timer);
- if (bm->v_update_delay != BGP_UPDATE_DELAY_DEF) {
+ if (bm->v_update_delay != BGP_UPDATE_DELAY_DEFAULT) {
vty_out(vty, "bgp update-delay %d", bm->v_update_delay);
if (bm->v_update_delay != bm->v_establish_wait)
vty_out(vty, " %d", bm->v_establish_wait);
@@ -19204,6 +19435,30 @@ int bgp_config_write(struct vty *vty)
if (bm->wait_for_fib)
vty_out(vty, "bgp suppress-fib-pending\n");
+ if (bm->stalepath_time != BGP_DEFAULT_STALEPATH_TIME)
+ vty_out(vty, "bgp graceful-restart stalepath-time %u\n",
+ bm->stalepath_time);
+
+ if (bm->restart_time != BGP_DEFAULT_RESTART_TIME)
+ vty_out(vty, "bgp graceful-restart restart-time %u\n",
+ bm->restart_time);
+
+ if (bm->select_defer_time != BGP_DEFAULT_SELECT_DEFERRAL_TIME)
+ vty_out(vty, "bgp graceful-restart select-defer-time %u\n",
+ bm->select_defer_time);
+
+ if (CHECK_FLAG(bm->flags, BM_FLAG_GR_RESTARTER))
+ vty_out(vty, "bgp graceful-restart\n");
+ else if (CHECK_FLAG(bm->flags, BM_FLAG_GR_DISABLED))
+ vty_out(vty, "bgp graceful-restart-disable\n");
+
+ if (CHECK_FLAG(bm->flags, BM_FLAG_GR_PRESERVE_FWD))
+ vty_out(vty, "bgp graceful-restart preserve-fw-state\n");
+
+ if (bm->rib_stale_time != BGP_DEFAULT_RIB_STALE_TIME)
+ vty_out(vty, "bgp graceful-restart rib-stale-time %u\n",
+ bm->rib_stale_time);
+
if (CHECK_FLAG(bm->flags, BM_FLAG_GRACEFUL_SHUTDOWN))
vty_out(vty, "bgp graceful-shutdown\n");
@@ -19214,6 +19469,9 @@ int bgp_config_write(struct vty *vty)
if (CHECK_FLAG(bm->flags, BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA))
vty_out(vty, "bgp send-extra-data zebra\n");
+ if (CHECK_FLAG(bm->flags, BM_FLAG_IPV6_NO_AUTO_RA))
+ vty_out(vty, "no bgp ipv6-auto-ra\n");
+
/* DSCP value for outgoing packets in BGP connections */
if (bm->ip_tos != IPTOS_PREC_INTERNETCONTROL)
vty_out(vty, "bgp session-dscp %u\n", bm->ip_tos >> 2);
@@ -19225,6 +19483,8 @@ int bgp_config_write(struct vty *vty)
if (bm->outq_limit != BM_DEFAULT_Q_LIMIT)
vty_out(vty, "bgp output-queue-limit %u\n", bm->outq_limit);
+ vty_out(vty, "!\n");
+
/* BGP configuration. */
for (ALL_LIST_ELEMENTS(bm->bgp, mnode, mnnode, bgp)) {
@@ -19232,6 +19492,10 @@ int bgp_config_write(struct vty *vty)
if (CHECK_FLAG(bgp->vrf_flags, BGP_VRF_AUTO))
continue;
+ /* skip hidden default vrf bgp instance */
+ if (IS_BGP_INSTANCE_HIDDEN(bgp))
+ continue;
+
/* Router bgp ASN */
vty_out(vty, "router bgp %s", bgp->as_pretty);
@@ -19466,15 +19730,21 @@ int bgp_config_write(struct vty *vty)
" bgp long-lived-graceful-restart stale-time %u\n",
bgp->llgr_stale_time);
- /* BGP graceful-restart. */
- if (bgp->stalepath_time != BGP_DEFAULT_STALEPATH_TIME)
- vty_out(vty,
- " bgp graceful-restart stalepath-time %u\n",
- bgp->stalepath_time);
+ /* BGP per-instance graceful-restart. */
+ /* BGP-wide settings and per-instance settings are mutually
+ * exclusive.
+ */
+ if (bm->stalepath_time == BGP_DEFAULT_STALEPATH_TIME)
+ if (bgp->stalepath_time != BGP_DEFAULT_STALEPATH_TIME)
+ vty_out(vty,
+ " bgp graceful-restart stalepath-time %u\n",
+ bgp->stalepath_time);
- if (bgp->restart_time != BGP_DEFAULT_RESTART_TIME)
- vty_out(vty, " bgp graceful-restart restart-time %u\n",
- bgp->restart_time);
+ if (bm->restart_time == BGP_DEFAULT_RESTART_TIME)
+ if (bgp->restart_time != BGP_DEFAULT_RESTART_TIME)
+ vty_out(vty,
+ " bgp graceful-restart restart-time %u\n",
+ bgp->restart_time);
if (!!CHECK_FLAG(bgp->flags, BGP_FLAG_GRACEFUL_NOTIFICATION) !=
SAVE_BGP_GRACEFUL_NOTIFICATION)
@@ -19484,30 +19754,34 @@ int bgp_config_write(struct vty *vty)
? ""
: "no ");
- if (bgp->select_defer_time != BGP_DEFAULT_SELECT_DEFERRAL_TIME)
- vty_out(vty,
- " bgp graceful-restart select-defer-time %u\n",
- bgp->select_defer_time);
+ if (bm->select_defer_time == BGP_DEFAULT_SELECT_DEFERRAL_TIME)
+ if (bgp->select_defer_time !=
+ BGP_DEFAULT_SELECT_DEFERRAL_TIME)
+ vty_out(vty,
+ " bgp graceful-restart select-defer-time %u\n",
+ bgp->select_defer_time);
- if (bgp_global_gr_mode_get(bgp) == GLOBAL_GR)
- vty_out(vty, " bgp graceful-restart\n");
+ if (!CHECK_FLAG(bm->flags, BM_FLAG_GR_CONFIGURED)) {
+ if (bgp_global_gr_mode_get(bgp) == GLOBAL_GR)
+ vty_out(vty, " bgp graceful-restart\n");
- if (bgp_global_gr_mode_get(bgp) == GLOBAL_DISABLE)
- vty_out(vty, " bgp graceful-restart-disable\n");
+ if (bgp_global_gr_mode_get(bgp) == GLOBAL_DISABLE)
+ vty_out(vty, " bgp graceful-restart-disable\n");
+ }
- /* BGP graceful-restart Preserve State F bit. */
- if (CHECK_FLAG(bgp->flags, BGP_FLAG_GR_PRESERVE_FWD))
- vty_out(vty,
- " bgp graceful-restart preserve-fw-state\n");
+ if (!CHECK_FLAG(bm->flags, BM_FLAG_GR_PRESERVE_FWD))
+ if (CHECK_FLAG(bgp->flags, BGP_FLAG_GR_PRESERVE_FWD))
+ vty_out(vty,
+ " bgp graceful-restart preserve-fw-state\n");
/* BGP TCP keepalive */
bgp_config_tcp_keepalive(vty, bgp);
- /* Stale timer for RIB */
- if (bgp->rib_stale_time != BGP_DEFAULT_RIB_STALE_TIME)
- vty_out(vty,
- " bgp graceful-restart rib-stale-time %u\n",
- bgp->rib_stale_time);
+ if (bm->rib_stale_time == BGP_DEFAULT_RIB_STALE_TIME)
+ if (bgp->rib_stale_time != BGP_DEFAULT_RIB_STALE_TIME)
+ vty_out(vty,
+ " bgp graceful-restart rib-stale-time %u\n",
+ bgp->rib_stale_time);
/* BGP bestpath method. */
if (CHECK_FLAG(bgp->flags, BGP_FLAG_ASPATH_IGNORE))
@@ -19585,8 +19859,9 @@ int bgp_config_write(struct vty *vty)
bgp->condition_check_period);
/* default-originate timer configuration */
- if (bgp->rmap_def_originate_eval_timer !=
- RMAP_DEFAULT_ORIGINATE_EVAL_TIMER)
+ if (bgp->rmap_def_originate_eval_timer &&
+ bgp->rmap_def_originate_eval_timer !=
+ RMAP_DEFAULT_ORIGINATE_EVAL_TIMER)
vty_out(vty, " bgp default-originate timer %u\n",
bgp->rmap_def_originate_eval_timer);
@@ -19618,6 +19893,11 @@ int bgp_config_write(struct vty *vty)
if (CHECK_FLAG(bgp->flags, BGP_FLAG_SHUTDOWN))
vty_out(vty, " bgp shutdown\n");
+ /* Automatic RA enabling by BGP */
+ if (!CHECK_FLAG(bm->flags, BM_FLAG_IPV6_NO_AUTO_RA))
+ if (CHECK_FLAG(bgp->flags, BGP_FLAG_IPV6_NO_AUTO_RA))
+ vty_out(vty, " no bgp ipv6-auto-ra\n");
+
if (bgp->allow_martian)
vty_out(vty, " bgp allow-martian-nexthop\n");
@@ -20158,6 +20438,12 @@ void bgp_vty_init(void)
install_element(BGP_NODE, &bgp_fast_convergence_cmd);
install_element(BGP_NODE, &no_bgp_fast_convergence_cmd);
+ /* global bgp ipv6-auto-ra command */
+ install_element(CONFIG_NODE, &bgp_ipv6_auto_ra_cmd);
+
+ /* bgp ipv6-auto-ra command */
+ install_element(BGP_NODE, &bgp_ipv6_auto_ra_cmd);
+
/* global bgp update-delay command */
install_element(CONFIG_NODE, &bgp_global_update_delay_cmd);
install_element(CONFIG_NODE, &no_bgp_global_update_delay_cmd);
@@ -20166,6 +20452,26 @@ void bgp_vty_init(void)
install_element(CONFIG_NODE, &bgp_graceful_shutdown_cmd);
install_element(CONFIG_NODE, &no_bgp_graceful_shutdown_cmd);
+ /* BGP-wide graceful-restart commands. */
+ install_element(CONFIG_NODE, &bgp_graceful_restart_cmd);
+ install_element(CONFIG_NODE, &no_bgp_graceful_restart_cmd);
+ install_element(CONFIG_NODE, &bgp_graceful_restart_disable_cmd);
+ install_element(CONFIG_NODE, &no_bgp_graceful_restart_disable_cmd);
+ install_element(CONFIG_NODE, &bgp_graceful_restart_stalepath_time_cmd);
+ install_element(CONFIG_NODE,
+ &no_bgp_graceful_restart_stalepath_time_cmd);
+ install_element(CONFIG_NODE, &bgp_graceful_restart_restart_time_cmd);
+ install_element(CONFIG_NODE, &no_bgp_graceful_restart_restart_time_cmd);
+ install_element(CONFIG_NODE,
+ &bgp_graceful_restart_select_defer_time_cmd);
+ install_element(CONFIG_NODE,
+ &no_bgp_graceful_restart_select_defer_time_cmd);
+ install_element(CONFIG_NODE, &bgp_graceful_restart_preserve_fw_cmd);
+ install_element(CONFIG_NODE, &no_bgp_graceful_restart_preserve_fw_cmd);
+ install_element(CONFIG_NODE, &bgp_graceful_restart_rib_stale_time_cmd);
+ install_element(CONFIG_NODE,
+ &no_bgp_graceful_restart_rib_stale_time_cmd);
+
/* Dummy commands (Currently not supported) */
install_element(BGP_NODE, &no_synchronization_cmd);
install_element(BGP_NODE, &no_auto_summary_cmd);