mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-15 11:15:47 +00:00
Merge pull request #8589 from idryzhov/bgp-cli-nb-fixes
bgp cli/nb fixes
This commit is contained in:
commit
825f41b486
@ -111,15 +111,24 @@ int bgp_router_create(struct nb_cb_create_args *args)
|
|||||||
is_new_bgp = (bgp_lookup_by_name(name) == NULL);
|
is_new_bgp = (bgp_lookup_by_name(name) == NULL);
|
||||||
|
|
||||||
ret = bgp_get_vty(&bgp, &as, name, inst_type);
|
ret = bgp_get_vty(&bgp, &as, name, inst_type);
|
||||||
switch (ret) {
|
if (ret) {
|
||||||
case BGP_ERR_AS_MISMATCH:
|
switch (ret) {
|
||||||
snprintf(args->errmsg, args->errmsg_len,
|
case BGP_ERR_AS_MISMATCH:
|
||||||
"BGP instance is already running; AS is %u",
|
snprintf(
|
||||||
as);
|
args->errmsg, args->errmsg_len,
|
||||||
return NB_ERR_INCONSISTENCY;
|
"BGP instance is already running; AS is %u",
|
||||||
case BGP_ERR_INSTANCE_MISMATCH:
|
as);
|
||||||
snprintf(args->errmsg, args->errmsg_len,
|
break;
|
||||||
"BGP instance type mismatch");
|
case BGP_ERR_INSTANCE_MISMATCH:
|
||||||
|
snprintf(args->errmsg, args->errmsg_len,
|
||||||
|
"BGP instance type mismatch");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
UNSET_FLAG(bgp->vrf_flags, BGP_VRF_AUTO);
|
||||||
|
|
||||||
|
nb_running_set_entry(args->dnode, bgp);
|
||||||
|
|
||||||
return NB_ERR_INCONSISTENCY;
|
return NB_ERR_INCONSISTENCY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -221,64 +230,26 @@ int bgp_router_destroy(struct nb_cb_destroy_args *args)
|
|||||||
int bgp_global_local_as_modify(struct nb_cb_modify_args *args)
|
int bgp_global_local_as_modify(struct nb_cb_modify_args *args)
|
||||||
{
|
{
|
||||||
struct bgp *bgp;
|
struct bgp *bgp;
|
||||||
as_t as;
|
|
||||||
const struct lyd_node *vrf_dnode;
|
|
||||||
const char *vrf_name;
|
|
||||||
const char *name = NULL;
|
|
||||||
enum bgp_instance_type inst_type;
|
|
||||||
int ret;
|
|
||||||
bool is_view_inst = false;
|
|
||||||
|
|
||||||
switch (args->event) {
|
switch (args->event) {
|
||||||
case NB_EV_VALIDATE:
|
case NB_EV_VALIDATE:
|
||||||
as = yang_dnode_get_uint32(args->dnode, NULL);
|
/*
|
||||||
|
* Changing AS number is not allowed, but we must allow it
|
||||||
inst_type = BGP_INSTANCE_TYPE_DEFAULT;
|
* once, when the BGP instance is created the first time.
|
||||||
|
* If the instance already exists - return the validation
|
||||||
vrf_dnode = yang_dnode_get_parent(args->dnode,
|
* error.
|
||||||
"control-plane-protocol");
|
*/
|
||||||
vrf_name = yang_dnode_get_string(vrf_dnode, "./vrf");
|
bgp = nb_running_get_entry_non_rec(args->dnode->parent->parent,
|
||||||
|
NULL, false);
|
||||||
if (strmatch(vrf_name, VRF_DEFAULT_NAME)) {
|
if (bgp) {
|
||||||
name = NULL;
|
|
||||||
} else {
|
|
||||||
name = vrf_name;
|
|
||||||
inst_type = BGP_INSTANCE_TYPE_VRF;
|
|
||||||
}
|
|
||||||
|
|
||||||
is_view_inst = yang_dnode_get_bool(args->dnode,
|
|
||||||
"../instance-type-view");
|
|
||||||
if (is_view_inst)
|
|
||||||
inst_type = BGP_INSTANCE_TYPE_VIEW;
|
|
||||||
|
|
||||||
ret = bgp_lookup_by_as_name_type(&bgp, &as, name, inst_type);
|
|
||||||
switch (ret) {
|
|
||||||
case BGP_ERR_AS_MISMATCH:
|
|
||||||
snprintf(args->errmsg, args->errmsg_len,
|
snprintf(args->errmsg, args->errmsg_len,
|
||||||
"BGP instance is already running; AS is %u",
|
"Changing AS number is not allowed");
|
||||||
as);
|
|
||||||
return NB_ERR_VALIDATION;
|
|
||||||
case BGP_ERR_INSTANCE_MISMATCH:
|
|
||||||
snprintf(args->errmsg, args->errmsg_len,
|
|
||||||
"BGP instance type mismatch");
|
|
||||||
return NB_ERR_VALIDATION;
|
return NB_ERR_VALIDATION;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NB_EV_PREPARE:
|
case NB_EV_PREPARE:
|
||||||
case NB_EV_ABORT:
|
case NB_EV_ABORT:
|
||||||
return NB_OK;
|
|
||||||
case NB_EV_APPLY:
|
case NB_EV_APPLY:
|
||||||
/* NOTE: handled in bgp_global_create callback, the as change
|
|
||||||
* will be rejected in validate phase.
|
|
||||||
*/
|
|
||||||
as = yang_dnode_get_uint32(args->dnode, NULL);
|
|
||||||
bgp = nb_running_get_entry(args->dnode, NULL, true);
|
|
||||||
if (bgp->as != as) {
|
|
||||||
snprintf(args->errmsg, args->errmsg_len,
|
|
||||||
"BGP instance is already running; AS is %u",
|
|
||||||
bgp->as);
|
|
||||||
return NB_ERR_INCONSISTENCY;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1514,12 +1485,27 @@ int bgp_global_global_config_timers_keepalive_modify(
|
|||||||
*/
|
*/
|
||||||
int bgp_global_instance_type_view_modify(struct nb_cb_modify_args *args)
|
int bgp_global_instance_type_view_modify(struct nb_cb_modify_args *args)
|
||||||
{
|
{
|
||||||
|
struct bgp *bgp;
|
||||||
|
|
||||||
switch (args->event) {
|
switch (args->event) {
|
||||||
case NB_EV_VALIDATE:
|
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_PREPARE:
|
||||||
case NB_EV_ABORT:
|
case NB_EV_ABORT:
|
||||||
case NB_EV_APPLY:
|
case NB_EV_APPLY:
|
||||||
/* TODO: implement me. */
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1380,6 +1380,10 @@ DEFUN_YANG_NOSH(router_bgp,
|
|||||||
nb_cli_enqueue_change(vty,
|
nb_cli_enqueue_change(vty,
|
||||||
"./global/instance-type-view",
|
"./global/instance-type-view",
|
||||||
NB_OP_MODIFY, "true");
|
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);
|
ret = nb_cli_apply_changes(vty, base_xpath);
|
||||||
|
@ -3378,13 +3378,13 @@ int bgp_lookup_by_as_name_type(struct bgp **bgp_val, as_t *as, const char *name,
|
|||||||
bgp = bgp_get_default();
|
bgp = bgp_get_default();
|
||||||
|
|
||||||
if (bgp) {
|
if (bgp) {
|
||||||
|
*bgp_val = bgp;
|
||||||
if (bgp->as != *as) {
|
if (bgp->as != *as) {
|
||||||
*as = bgp->as;
|
*as = bgp->as;
|
||||||
return BGP_ERR_AS_MISMATCH;
|
return BGP_ERR_AS_MISMATCH;
|
||||||
}
|
}
|
||||||
if (bgp->inst_type != inst_type)
|
if (bgp->inst_type != inst_type)
|
||||||
return BGP_ERR_INSTANCE_MISMATCH;
|
return BGP_ERR_INSTANCE_MISMATCH;
|
||||||
*bgp_val = bgp;
|
|
||||||
return BGP_SUCCESS;
|
return BGP_SUCCESS;
|
||||||
}
|
}
|
||||||
*bgp_val = NULL;
|
*bgp_val = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user