summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--isisd/isis_nb_config.c8
-rw-r--r--lib/grammar_sandbox_main.c2
-rw-r--r--lib/libfrr.c3
-rw-r--r--lib/libfrr.h5
-rw-r--r--lib/northbound.c4
-rw-r--r--lib/northbound.h8
-rw-r--r--lib/yang.c10
-rw-r--r--lib/yang.h10
-rw-r--r--lib/yang_translator.c4
-rw-r--r--mgmtd/mgmt.c3
-rw-r--r--mgmtd/mgmt_main.c2
-rw-r--r--pimd/pim_autorp.c4
-rw-r--r--tests/bgpd/test_peer_attr.c2
-rw-r--r--tests/helpers/c/main.c2
-rw-r--r--tests/isisd/test_isis_spf.c2
-rw-r--r--tests/lib/cli/common_cli.c2
-rw-r--r--tests/lib/cli/test_commands.c2
-rw-r--r--tests/lib/northbound/test_oper_data.c2
-rw-r--r--tests/lib/test_grpc.cpp3
-rw-r--r--tests/topotests/lib/topogen.py11
-rw-r--r--tools/gen_northbound_callbacks.c2
-rw-r--r--tools/gen_yang_deviations.c2
22 files changed, 52 insertions, 41 deletions
diff --git a/isisd/isis_nb_config.c b/isisd/isis_nb_config.c
index 7286a692f..0f0c900ec 100644
--- a/isisd/isis_nb_config.c
+++ b/isisd/isis_nb_config.c
@@ -4297,14 +4297,6 @@ static int lib_interface_isis_multi_topology_common(
switch (event) {
case NB_EV_VALIDATE:
- circuit = nb_running_get_entry(dnode, NULL, false);
- if (circuit && circuit->area && circuit->area->oldmetric) {
- snprintf(
- errmsg, errmsg_len,
- "Multi topology IS-IS can only be used with wide metrics");
- return NB_ERR_VALIDATION;
- }
- break;
case NB_EV_PREPARE:
case NB_EV_ABORT:
break;
diff --git a/lib/grammar_sandbox_main.c b/lib/grammar_sandbox_main.c
index abd42f359..05088d52d 100644
--- a/lib/grammar_sandbox_main.c
+++ b/lib/grammar_sandbox_main.c
@@ -40,7 +40,7 @@ int main(int argc, char **argv)
vty_init(master, true);
lib_cmd_init();
- nb_init(master, NULL, 0, false);
+ nb_init(master, NULL, 0, false, false);
vty_stdio(vty_do_exit);
diff --git a/lib/libfrr.c b/lib/libfrr.c
index a1982841d..f2247a48e 100644
--- a/lib/libfrr.c
+++ b/lib/libfrr.c
@@ -820,7 +820,8 @@ struct event_loop *frr_init(void)
log_ref_vty_init();
lib_error_init();
- nb_init(master, di->yang_modules, di->n_yang_modules, true);
+ nb_init(master, di->yang_modules, di->n_yang_modules, true,
+ (di->flags & FRR_LOAD_YANG_LIBRARY) != 0);
if (nb_db_init() != NB_OK)
flog_warn(EC_LIB_NB_DATABASE,
"%s: failed to initialize northbound database",
diff --git a/lib/libfrr.h b/lib/libfrr.h
index 7ed7be4d9..df537e2e3 100644
--- a/lib/libfrr.h
+++ b/lib/libfrr.h
@@ -46,6 +46,11 @@ extern "C" {
* is responsible for calling frr_vty_serv() itself.
*/
#define FRR_MANUAL_VTY_START (1 << 7)
+/* If FRR_LOAD_YANG_LIBRARY is set then libyang will be told to load and
+ * implement it's internal ietf-yang-library implementation. This should
+ * normally only be done from mgmtd.
+ */
+#define FRR_LOAD_YANG_LIBRARY (1 << 8)
PREDECL_DLIST(log_args);
struct log_arg {
diff --git a/lib/northbound.c b/lib/northbound.c
index 2dae21341..a385cc9ec 100644
--- a/lib/northbound.c
+++ b/lib/northbound.c
@@ -2701,7 +2701,7 @@ void nb_validate_callbacks(void)
void nb_init(struct event_loop *tm,
const struct frr_yang_module_info *const modules[],
- size_t nmodules, bool db_enabled)
+ size_t nmodules, bool db_enabled, bool load_library)
{
struct yang_module *loaded[nmodules], **loadedp = loaded;
@@ -2717,7 +2717,7 @@ void nb_init(struct event_loop *tm,
nb_db_enabled = db_enabled;
- yang_init(true, explicit_compile);
+ yang_init(true, explicit_compile, load_library);
/* Load YANG modules and their corresponding northbound callbacks. */
for (size_t i = 0; i < nmodules; i++) {
diff --git a/lib/northbound.h b/lib/northbound.h
index dd3fbf8f7..97a1d31e5 100644
--- a/lib/northbound.h
+++ b/lib/northbound.h
@@ -1703,10 +1703,12 @@ void nb_validate_callbacks(void);
*
* db_enabled
* Set this to record the transactions in the transaction log.
+ *
+ * load_library
+ * Set this to have libyang to load/implement the ietf-yang-library.
*/
-extern void nb_init(struct event_loop *tm,
- const struct frr_yang_module_info *const modules[],
- size_t nmodules, bool db_enabled);
+extern void nb_init(struct event_loop *tm, const struct frr_yang_module_info *const modules[],
+ size_t nmodules, bool db_enabled, bool load_library);
/*
* Finish the northbound layer gracefully. Should be called only when the daemon
diff --git a/lib/yang.c b/lib/yang.c
index 14d5b118c..b847b8b77 100644
--- a/lib/yang.c
+++ b/lib/yang.c
@@ -976,7 +976,7 @@ void yang_debugging_set(bool enable)
}
}
-struct ly_ctx *yang_ctx_new_setup(bool embedded_modules, bool explicit_compile)
+struct ly_ctx *yang_ctx_new_setup(bool embedded_modules, bool explicit_compile, bool load_library)
{
struct ly_ctx *ctx = NULL;
const char *yang_models_path = YANG_MODELS_PATH;
@@ -994,7 +994,9 @@ struct ly_ctx *yang_ctx_new_setup(bool embedded_modules, bool explicit_compile)
YANG_MODELS_PATH);
}
- options = LY_CTX_NO_YANGLIBRARY | LY_CTX_DISABLE_SEARCHDIR_CWD;
+ options = LY_CTX_DISABLE_SEARCHDIR_CWD;
+ if (!load_library)
+ options |= LY_CTX_NO_YANGLIBRARY;
if (explicit_compile)
options |= LY_CTX_EXPLICIT_COMPILE;
err = ly_ctx_new(yang_models_path, options, &ctx);
@@ -1007,7 +1009,7 @@ struct ly_ctx *yang_ctx_new_setup(bool embedded_modules, bool explicit_compile)
return ctx;
}
-void yang_init(bool embedded_modules, bool defer_compile)
+void yang_init(bool embedded_modules, bool defer_compile, bool load_library)
{
/* Initialize libyang global parameters that affect all containers. */
ly_set_log_clb(ly_zlog_cb
@@ -1019,7 +1021,7 @@ void yang_init(bool embedded_modules, bool defer_compile)
ly_log_options(LY_LOLOG | LY_LOSTORE);
/* Initialize libyang container for native models. */
- ly_native_ctx = yang_ctx_new_setup(embedded_modules, defer_compile);
+ ly_native_ctx = yang_ctx_new_setup(embedded_modules, defer_compile, load_library);
if (!ly_native_ctx) {
flog_err(EC_LIB_LIBYANG, "%s: ly_ctx_new() failed", __func__);
exit(1);
diff --git a/lib/yang.h b/lib/yang.h
index c4fc78b8a..52857ecf0 100644
--- a/lib/yang.h
+++ b/lib/yang.h
@@ -607,9 +607,11 @@ extern struct yang_data *yang_data_list_find(const struct list *list,
* explicit_compile
* True if the caller will later call ly_ctx_compile to compile all loaded
* modules at once.
+ * load_library
+ * Set this to have libyang to load/implement the ietf-yang-library.
*/
-extern struct ly_ctx *yang_ctx_new_setup(bool embedded_modules,
- bool explicit_compile);
+extern struct ly_ctx *yang_ctx_new_setup(bool embedded_modules, bool explicit_compile,
+ bool load_library);
/*
* Enable or disable libyang verbose debugging.
@@ -727,8 +729,10 @@ extern const char *yang_print_errors(struct ly_ctx *ly_ctx, char *buf,
* Specify whether libyang should attempt to look for embedded YANG modules.
* defer_compile
* Hold off on compiling modules until yang_init_loading_complete is called.
+ * load_library
+ * Set this to have libyang to load/implement the ietf-yang-library.
*/
-extern void yang_init(bool embedded_modules, bool defer_compile);
+extern void yang_init(bool embedded_modules, bool defer_compile, bool load_library);
/*
* Should be called after yang_init and all yang_module_load()s have been done,
diff --git a/lib/yang_translator.c b/lib/yang_translator.c
index 005f6422f..b7599e0a7 100644
--- a/lib/yang_translator.c
+++ b/lib/yang_translator.c
@@ -166,7 +166,7 @@ struct yang_translator *yang_translator_load(const char *path)
RB_INSERT(yang_translators, &yang_translators, translator);
/* Initialize the translator libyang context. */
- translator->ly_ctx = yang_ctx_new_setup(false, false);
+ translator->ly_ctx = yang_ctx_new_setup(false, false, false);
if (!translator->ly_ctx) {
flog_warn(EC_LIB_LIBYANG, "%s: ly_ctx_new() failed", __func__);
goto error;
@@ -512,7 +512,7 @@ static unsigned int yang_module_nodes_count(const struct lys_module *module)
void yang_translator_init(void)
{
- ly_translator_ctx = yang_ctx_new_setup(true, false);
+ ly_translator_ctx = yang_ctx_new_setup(true, false, false);
if (!ly_translator_ctx) {
flog_err(EC_LIB_LIBYANG, "%s: ly_ctx_new() failed", __func__);
exit(1);
diff --git a/mgmtd/mgmt.c b/mgmtd/mgmt.c
index 02c54b921..cfadad482 100644
--- a/mgmtd/mgmt.c
+++ b/mgmtd/mgmt.c
@@ -57,9 +57,6 @@ void mgmt_init(void)
/* Initialize MGMTD Transaction module */
mgmt_txn_init(mm, mm->master);
- /* Add yang-library module */
- yang_module_load("ietf-yang-library", NULL);
-
/* Initialize the MGMTD Frontend Adapter Module */
mgmt_fe_adapter_init(mm->master);
diff --git a/mgmtd/mgmt_main.c b/mgmtd/mgmt_main.c
index e181d0da5..1880d9441 100644
--- a/mgmtd/mgmt_main.c
+++ b/mgmtd/mgmt_main.c
@@ -214,7 +214,7 @@ FRR_DAEMON_INFO(mgmtd, MGMTD,
.n_yang_modules = array_size(mgmt_yang_modules),
/* avoid libfrr trying to read our config file for us */
- .flags = FRR_MANUAL_VTY_START | FRR_NO_SPLIT_CONFIG,
+ .flags = FRR_MANUAL_VTY_START | FRR_NO_SPLIT_CONFIG | FRR_LOAD_YANG_LIBRARY,
);
/* clang-format on */
diff --git a/pimd/pim_autorp.c b/pimd/pim_autorp.c
index 1f4d0c65a..35347a279 100644
--- a/pimd/pim_autorp.c
+++ b/pimd/pim_autorp.c
@@ -290,8 +290,8 @@ static bool pim_autorp_add_rp(struct pim_autorp *autorp, pim_addr rpaddr,
event_add_timer(router->master, autorp_rp_holdtime, trp,
holdtime, &(trp->hold_timer));
if (PIM_DEBUG_AUTORP)
- zlog_debug("%s: Started %u second hold timer for RP %pI4",
- __func__, holdtime, &rp->addr);
+ zlog_debug("%s: Started %u second hold timer for RP %pI4", __func__,
+ holdtime, &trp->addr);
} else {
/* If hold time is zero, make sure there doesn't exist a hold timer for it already */
event_cancel(&trp->hold_timer);
diff --git a/tests/bgpd/test_peer_attr.c b/tests/bgpd/test_peer_attr.c
index d5faa33ca..17002464e 100644
--- a/tests/bgpd/test_peer_attr.c
+++ b/tests/bgpd/test_peer_attr.c
@@ -1355,7 +1355,7 @@ static void bgp_startup(void)
zprivs_init(&bgpd_privs);
master = event_master_create(NULL);
- nb_init(master, NULL, 0, false);
+ nb_init(master, NULL, 0, false, false);
bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE, list_new());
bgp_option_set(BGP_OPT_NO_LISTEN);
vrf_init(NULL, NULL, NULL, NULL);
diff --git a/tests/helpers/c/main.c b/tests/helpers/c/main.c
index 9cb395bb1..344af82fc 100644
--- a/tests/helpers/c/main.c
+++ b/tests/helpers/c/main.c
@@ -143,7 +143,7 @@ int main(int argc, char **argv)
vty_init(master, false);
lib_cmd_init();
debug_init();
- nb_init(master, NULL, 0, false);
+ nb_init(master, NULL, 0, false, false);
/* OSPF vty inits. */
test_vty_init();
diff --git a/tests/isisd/test_isis_spf.c b/tests/isisd/test_isis_spf.c
index 93009a1b8..e5a8f7a51 100644
--- a/tests/isisd/test_isis_spf.c
+++ b/tests/isisd/test_isis_spf.c
@@ -546,7 +546,7 @@ int main(int argc, char **argv)
cmd_init(1);
cmd_hostname_set("test");
vty_init(master, false);
- yang_init(true, false);
+ yang_init(true, false, false);
if (debug)
zlog_aux_init("NONE: ", LOG_DEBUG);
else
diff --git a/tests/lib/cli/common_cli.c b/tests/lib/cli/common_cli.c
index 640197143..342a91cc7 100644
--- a/tests/lib/cli/common_cli.c
+++ b/tests/lib/cli/common_cli.c
@@ -77,7 +77,7 @@ int main(int argc, char **argv)
for (yangcount = 0; test_yang_modules && test_yang_modules[yangcount];
yangcount++)
;
- nb_init(master, test_yang_modules, yangcount, false);
+ nb_init(master, test_yang_modules, yangcount, false, false);
test_init(argc, argv);
diff --git a/tests/lib/cli/test_commands.c b/tests/lib/cli/test_commands.c
index 0034c2af8..9873383fd 100644
--- a/tests/lib/cli/test_commands.c
+++ b/tests/lib/cli/test_commands.c
@@ -197,7 +197,7 @@ static void test_init(void)
cmd_init(1);
debug_init();
- nb_init(master, NULL, 0, false);
+ nb_init(master, NULL, 0, false, false);
install_node(&bgp_node);
install_node(&rip_node);
diff --git a/tests/lib/northbound/test_oper_data.c b/tests/lib/northbound/test_oper_data.c
index 74a0dfe6c..fdc9e53ca 100644
--- a/tests/lib/northbound/test_oper_data.c
+++ b/tests/lib/northbound/test_oper_data.c
@@ -461,7 +461,7 @@ int main(int argc, char **argv)
vty_init(master, false);
lib_cmd_init();
debug_init();
- nb_init(master, modules, array_size(modules), false);
+ nb_init(master, modules, array_size(modules), false, false);
install_element(ENABLE_NODE, &test_rpc_cmd);
diff --git a/tests/lib/test_grpc.cpp b/tests/lib/test_grpc.cpp
index 2f0282704..379a8688a 100644
--- a/tests/lib/test_grpc.cpp
+++ b/tests/lib/test_grpc.cpp
@@ -111,8 +111,7 @@ static void static_startup(void)
static_debug_init();
master = event_master_create(NULL);
- nb_init(master, staticd_yang_modules, array_size(staticd_yang_modules),
- false);
+ nb_init(master, staticd_yang_modules, array_size(staticd_yang_modules), false, false);
static_zebra_init();
vty_init(master, true);
diff --git a/tests/topotests/lib/topogen.py b/tests/topotests/lib/topogen.py
index 7941e5c1d..14dd61b07 100644
--- a/tests/topotests/lib/topogen.py
+++ b/tests/topotests/lib/topogen.py
@@ -492,7 +492,16 @@ class Topogen(object):
"Errors found post shutdown - details follow: {}".format(errors)
)
- self.net.stop()
+ try:
+ self.net.stop()
+
+ except OSError as error:
+ # OSError exception is raised when mininet tries to stop switch
+ # though switch is stopped once but mininet tries to stop same
+ # switch again, where it ended up with exception
+
+ logger.info(error)
+ logger.info("Exception ignored: switch is already stopped")
def get_exabgp_cmd(self):
if not self.exabgp_cmd:
diff --git a/tools/gen_northbound_callbacks.c b/tools/gen_northbound_callbacks.c
index a87981136..046dc9e99 100644
--- a/tools/gen_northbound_callbacks.c
+++ b/tools/gen_northbound_callbacks.c
@@ -448,7 +448,7 @@ int main(int argc, char *argv[])
if (argc != 1)
usage(EXIT_FAILURE);
- yang_init(false, true);
+ yang_init(false, true, false);
if (search_path)
ly_ctx_set_searchdir(ly_native_ctx, search_path);
diff --git a/tools/gen_yang_deviations.c b/tools/gen_yang_deviations.c
index 251643c69..c2e7fd91c 100644
--- a/tools/gen_yang_deviations.c
+++ b/tools/gen_yang_deviations.c
@@ -52,7 +52,7 @@ int main(int argc, char *argv[])
if (argc != 1)
usage(EXIT_FAILURE);
- yang_init(false, false);
+ yang_init(false, false, false);
/* Load YANG module. */
module = yang_module_load(argv[0], NULL);