*: fix interface config write in NB-converted daemons

When writing the config from the NB-converted daemon, we must not rely
on the operational data. This commit changes the output of the interface
configuration to use only config data. As the code is the same for all
daemons, move it to the lib and remove all the duplicated code.

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
This commit is contained in:
Igor Ryzhov 2021-10-13 18:30:06 +03:00
parent 6f354338f9
commit 104fd76738
7 changed files with 28 additions and 135 deletions

View File

@ -869,30 +869,6 @@ static int eigrp_config_write(struct vty *vty)
return written;
}
static int eigrp_write_interface(struct vty *vty)
{
const struct lyd_node *dnode;
struct interface *ifp;
struct vrf *vrf;
int written = 0;
RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) {
FOR_ALL_INTERFACES(vrf, ifp) {
dnode = yang_dnode_getf(
running_config->dnode,
"/frr-interface:lib/interface[name='%s'][vrf='%s']",
ifp->name, vrf->name);
if (dnode == NULL)
continue;
written = 1;
nb_cli_show_dnode_cmds(vty, dnode, false);
}
}
return written;
}
void
eigrp_cli_init(void)
{
@ -919,7 +895,7 @@ eigrp_cli_init(void)
vrf_cmd_init(NULL);
if_cmd_init(eigrp_write_interface);
if_cmd_init_default();
install_element(INTERFACE_NODE, &eigrp_if_delay_cmd);
install_element(INTERFACE_NODE, &no_eigrp_if_delay_cmd);

View File

@ -1295,30 +1295,6 @@ static int isis_interface_config_write(struct vty *vty)
return write;
}
#else
static int isis_interface_config_write(struct vty *vty)
{
struct vrf *vrf = NULL;
int write = 0;
RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
struct interface *ifp;
FOR_ALL_INTERFACES (vrf, ifp) {
struct lyd_node *dnode;
dnode = yang_dnode_getf(
running_config->dnode,
"/frr-interface:lib/interface[name='%s'][vrf='%s']",
ifp->name, vrf->name);
if (dnode == NULL)
continue;
write++;
nb_cli_show_dnode_cmds(vty, dnode, false);
}
}
return write;
}
#endif /* ifdef FABRICD */
void isis_circuit_af_set(struct isis_circuit *circuit, bool ip_router,
@ -1529,7 +1505,11 @@ void isis_circuit_init(void)
hook_register_prio(if_del, 0, isis_if_delete_hook);
/* Install interface node */
#ifdef FABRICD
if_cmd_init(isis_interface_config_write);
#else
if_cmd_init_default();
#endif
if_zapi_callbacks(isis_ifp_create, isis_ifp_up,
isis_ifp_down, isis_ifp_destroy);
}

View File

@ -1341,6 +1341,20 @@ static struct cmd_node interface_node = {
.prompt = "%s(config-if)# ",
};
static int if_config_write_single(const struct lyd_node *dnode, void *arg)
{
nb_cli_show_dnode_cmds(arg, dnode, false);
return YANG_ITER_CONTINUE;
}
static int if_nb_config_write(struct vty *vty)
{
yang_dnode_iterate(if_config_write_single, vty, running_config->dnode,
"/frr-interface:lib/interface");
return 1;
}
void if_cmd_init(int (*config_write)(struct vty *))
{
cmd_variable_handler_register(if_var_handlers);
@ -1356,6 +1370,11 @@ void if_cmd_init(int (*config_write)(struct vty *))
install_element(INTERFACE_NODE, &no_interface_desc_cmd);
}
void if_cmd_init_default(void)
{
if_cmd_init(if_nb_config_write);
}
void if_zapi_callbacks(int (*create)(struct interface *ifp),
int (*up)(struct interface *ifp),
int (*down)(struct interface *ifp),

View File

@ -594,6 +594,7 @@ void if_link_params_free(struct interface *);
/* Northbound. */
struct vty;
extern void if_cmd_init(int (*config_write)(struct vty *));
extern void if_cmd_init_default(void);
extern void if_zapi_callbacks(int (*create)(struct interface *ifp),
int (*up)(struct interface *ifp),
int (*down)(struct interface *ifp),

View File

@ -1103,33 +1103,6 @@ void rip_passive_nondefault_clean(struct rip *rip)
rip_passive_interface_apply_all(rip);
}
/* Write rip configuration of each interface. */
static int rip_interface_config_write(struct vty *vty)
{
struct vrf *vrf;
int write = 0;
RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
struct interface *ifp;
FOR_ALL_INTERFACES (vrf, ifp) {
struct lyd_node *dnode;
dnode = yang_dnode_getf(
running_config->dnode,
"/frr-interface:lib/interface[name='%s'][vrf='%s']",
ifp->name, vrf->name);
if (dnode == NULL)
continue;
write = 1;
nb_cli_show_dnode_cmds(vty, dnode, false);
}
}
return write;
}
int rip_show_network_config(struct vty *vty, struct rip *rip)
{
unsigned int i;
@ -1194,7 +1167,7 @@ void rip_if_init(void)
hook_register_prio(if_del, 0, rip_interface_delete_hook);
/* Install interface node. */
if_cmd_init(rip_interface_config_write);
if_cmd_init_default();
if_zapi_callbacks(rip_ifp_create, rip_ifp_up,
rip_ifp_down, rip_ifp_destroy);
}

View File

@ -923,33 +923,6 @@ static int ripng_if_delete_hook(struct interface *ifp)
return 0;
}
/* Configuration write function for ripngd. */
static int interface_config_write(struct vty *vty)
{
struct vrf *vrf;
int write = 0;
RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
struct interface *ifp;
FOR_ALL_INTERFACES (vrf, ifp) {
struct lyd_node *dnode;
dnode = yang_dnode_getf(
running_config->dnode,
"/frr-interface:lib/interface[name='%s'][vrf='%s']",
ifp->name, vrf->name);
if (dnode == NULL)
continue;
write = 1;
nb_cli_show_dnode_cmds(vty, dnode, false);
}
}
return write;
}
/* Initialization of interface. */
void ripng_if_init(void)
{
@ -958,7 +931,7 @@ void ripng_if_init(void)
hook_register_prio(if_del, 0, ripng_if_delete_hook);
/* Install interface node. */
if_cmd_init(interface_config_write);
if_cmd_init_default();
if_zapi_callbacks(ripng_ifp_create, ripng_ifp_up,
ripng_ifp_down, ripng_ifp_destroy);
}

View File

@ -715,35 +715,6 @@ DEFUN_NOSH (show_debugging_vrrp,
/* clang-format on */
/*
* Write per interface VRRP config.
*/
static int vrrp_config_write_interface(struct vty *vty)
{
struct vrf *vrf;
int write = 0;
RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
struct interface *ifp;
FOR_ALL_INTERFACES (vrf, ifp) {
const struct lyd_node *dnode;
dnode = yang_dnode_getf(
running_config->dnode,
"/frr-interface:lib/interface[name='%s'][vrf='%s']",
ifp->name, vrf->name);
if (dnode == NULL)
continue;
write = 1;
nb_cli_show_dnode_cmds(vty, dnode, false);
}
}
return write;
}
static struct cmd_node debug_node = {
.name = "debug",
.node = DEBUG_NODE,
@ -763,7 +734,7 @@ void vrrp_vty_init(void)
install_node(&debug_node);
install_node(&vrrp_node);
vrf_cmd_init(NULL);
if_cmd_init(vrrp_config_write_interface);
if_cmd_init_default();
install_element(VIEW_NODE, &vrrp_vrid_show_cmd);
install_element(VIEW_NODE, &vrrp_vrid_show_summary_cmd);