From d3e3677096e5cf30116ca63879caf44e25b080ad Mon Sep 17 00:00:00 2001 From: Igor Ryzhov Date: Mon, 26 Apr 2021 15:46:58 +0300 Subject: [PATCH] bgpd: forbid modification of bgp instance type If a user issues the following commands: ``` router bgp 65000 vrf red router bgp 65000 view red ``` bgpd ends up having NB config inconsistent with actual data. Signed-off-by: Igor Ryzhov --- bgpd/bgp_nb_config.c | 17 ++++++++++++++++- bgpd/bgp_vty.c | 4 ++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/bgpd/bgp_nb_config.c b/bgpd/bgp_nb_config.c index 18a4ec9053..e753d87a38 100644 --- a/bgpd/bgp_nb_config.c +++ b/bgpd/bgp_nb_config.c @@ -1483,12 +1483,27 @@ int bgp_global_global_config_timers_keepalive_modify( */ int bgp_global_instance_type_view_modify(struct nb_cb_modify_args *args) { + struct bgp *bgp; + switch (args->event) { case NB_EV_VALIDATE: + /* + * Changing instance type is not allowed, but we must allow it + * once, when the BGP instance is created the first time. + * If the instance already exists - return the validation + * error. + */ + bgp = nb_running_get_entry_non_rec(args->dnode->parent->parent, + NULL, false); + if (bgp) { + snprintf(args->errmsg, args->errmsg_len, + "Changing instance type is not allowed"); + return NB_ERR_VALIDATION; + } + break; case NB_EV_PREPARE: case NB_EV_ABORT: case NB_EV_APPLY: - /* TODO: implement me. */ break; } diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index 1e465d2620..d82c929154 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -1388,6 +1388,10 @@ DEFUN_YANG_NOSH(router_bgp, nb_cli_enqueue_change(vty, "./global/instance-type-view", NB_OP_MODIFY, "true"); + } else { + nb_cli_enqueue_change(vty, + "./global/instance-type-view", + NB_OP_MODIFY, "false"); } ret = nb_cli_apply_changes(vty, base_xpath); -- 2.39.5