From 409f98ab443682ec360e3e76954f1c8985b3371d Mon Sep 17 00:00:00 2001
|
|
From: Igor Ryzhov <iryzhov@nfware.com>
|
|
Date: Thu, 28 Jan 2021 02:41:07 +0300
|
|
Subject: [PATCH 1/2] ospfd: don't rely on instance existence in vty
|
|
|
|
Store instance index at startup and use it when processing vty commands.
|
|
The instance itself may be created and deleted by the user in runtime
|
|
using `[no] router ospf X` command.
|
|
|
|
Fixes #7908
|
|
|
|
Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
|
|
---
|
|
ospfd/ospf_dump.c | 70 ++++++---------
|
|
ospfd/ospf_main.c | 20 +----
|
|
ospfd/ospf_vty.c | 220 +++++++++++++++++++++++-----------------------
|
|
ospfd/ospfd.c | 26 +++---
|
|
ospfd/ospfd.h | 3 +-
|
|
5 files changed, 154 insertions(+), 185 deletions(-)
|
|
|
|
--- a/ospfd/ospf_dump.c
|
|
+++ b/ospfd/ospf_dump.c
|
|
@@ -607,7 +607,7 @@ DEFUN (debug_ospf_packet,
|
|
|
|
if (inst) // user passed instance ID
|
|
{
|
|
- if (!ospf_lookup_instance(strtoul(argv[2]->arg, NULL, 10)))
|
|
+ if (inst != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
}
|
|
|
|
@@ -683,7 +683,7 @@ DEFUN (no_debug_ospf_packet,
|
|
|
|
if (inst) // user passed instance ID
|
|
{
|
|
- if (!ospf_lookup_instance(strtoul(argv[3]->arg, NULL, 10)))
|
|
+ if (inst != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
}
|
|
|
|
@@ -754,7 +754,7 @@ DEFUN (debug_ospf_ism,
|
|
|
|
if (inst) // user passed instance ID
|
|
{
|
|
- if (!ospf_lookup_instance(strtoul(argv[2]->arg, NULL, 10)))
|
|
+ if (inst != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
}
|
|
|
|
@@ -805,7 +805,7 @@ DEFUN (no_debug_ospf_ism,
|
|
|
|
if (inst) // user passed instance ID
|
|
{
|
|
- if (!ospf_lookup_instance(strtoul(argv[3]->arg, NULL, 10)))
|
|
+ if (inst != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
}
|
|
|
|
@@ -900,8 +900,8 @@ DEFUN (debug_ospf_instance_nsm,
|
|
unsigned short instance = 0;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- if (!ospf_lookup_instance(instance))
|
|
- return CMD_SUCCESS;
|
|
+ if (instance != ospf_instance)
|
|
+ return CMD_NOT_MY_INSTANCE;
|
|
|
|
return debug_ospf_nsm_common(vty, 4, argc, argv);
|
|
}
|
|
@@ -972,7 +972,7 @@ DEFUN (no_debug_ospf_instance_nsm,
|
|
unsigned short instance = 0;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- if (!ospf_lookup_instance(instance))
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
return no_debug_ospf_nsm_common(vty, 5, argc, argv);
|
|
@@ -1046,7 +1046,7 @@ DEFUN (debug_ospf_instance_lsa,
|
|
unsigned short instance = 0;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- if (!ospf_lookup_instance(instance))
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
return debug_ospf_lsa_common(vty, 4, argc, argv);
|
|
@@ -1122,7 +1122,7 @@ DEFUN (no_debug_ospf_instance_lsa,
|
|
unsigned short instance = 0;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- if (!ospf_lookup_instance(instance))
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
return no_debug_ospf_lsa_common(vty, 5, argc, argv);
|
|
@@ -1184,7 +1184,7 @@ DEFUN (debug_ospf_instance_zebra,
|
|
unsigned short instance = 0;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- if (!ospf_lookup_instance(instance))
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
return debug_ospf_zebra_common(vty, 4, argc, argv);
|
|
@@ -1248,8 +1248,8 @@ DEFUN (no_debug_ospf_instance_zebra,
|
|
unsigned short instance = 0;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- if (!ospf_lookup_instance(instance))
|
|
- return CMD_SUCCESS;
|
|
+ if (instance != ospf_instance)
|
|
+ return CMD_NOT_MY_INSTANCE;
|
|
|
|
return no_debug_ospf_zebra_common(vty, 5, argc, argv);
|
|
}
|
|
@@ -1294,8 +1294,8 @@ DEFUN (debug_ospf_instance_event,
|
|
unsigned short instance = 0;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- if (!ospf_lookup_instance(instance))
|
|
- return CMD_SUCCESS;
|
|
+ if (instance != ospf_instance)
|
|
+ return CMD_NOT_MY_INSTANCE;
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
CONF_DEBUG_ON(event, EVENT);
|
|
@@ -1316,8 +1316,8 @@ DEFUN (no_debug_ospf_instance_event,
|
|
unsigned short instance = 0;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- if (!ospf_lookup_instance(instance))
|
|
- return CMD_SUCCESS;
|
|
+ if (instance != ospf_instance)
|
|
+ return CMD_NOT_MY_INSTANCE;
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
CONF_DEBUG_OFF(event, EVENT);
|
|
@@ -1364,8 +1364,8 @@ DEFUN (debug_ospf_instance_nssa,
|
|
unsigned short instance = 0;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- if (!ospf_lookup_instance(instance))
|
|
- return CMD_SUCCESS;
|
|
+ if (instance != ospf_instance)
|
|
+ return CMD_NOT_MY_INSTANCE;
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
CONF_DEBUG_ON(nssa, NSSA);
|
|
@@ -1386,8 +1386,8 @@ DEFUN (no_debug_ospf_instance_nssa,
|
|
unsigned short instance = 0;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- if (!ospf_lookup_instance(instance))
|
|
- return CMD_SUCCESS;
|
|
+ if (instance != ospf_instance)
|
|
+ return CMD_NOT_MY_INSTANCE;
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
CONF_DEBUG_OFF(nssa, NSSA);
|
|
@@ -1536,12 +1536,12 @@ DEFUN (no_debug_ospf,
|
|
return CMD_SUCCESS;
|
|
}
|
|
|
|
-static int show_debugging_ospf_common(struct vty *vty, struct ospf *ospf)
|
|
+static int show_debugging_ospf_common(struct vty *vty)
|
|
{
|
|
int i;
|
|
|
|
- if (ospf->instance)
|
|
- vty_out(vty, "\nOSPF Instance: %d\n\n", ospf->instance);
|
|
+ if (ospf_instance)
|
|
+ vty_out(vty, "\nOSPF Instance: %d\n\n", ospf_instance);
|
|
|
|
vty_out(vty, "OSPF debugging status:\n");
|
|
|
|
@@ -1645,13 +1645,7 @@ DEFUN_NOSH (show_debugging_ospf,
|
|
DEBUG_STR
|
|
OSPF_STR)
|
|
{
|
|
- struct ospf *ospf = NULL;
|
|
-
|
|
- ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
|
|
- if (ospf == NULL)
|
|
- return CMD_SUCCESS;
|
|
-
|
|
- return show_debugging_ospf_common(vty, ospf);
|
|
+ return show_debugging_ospf_common(vty);
|
|
}
|
|
|
|
DEFUN_NOSH (show_debugging_ospf_instance,
|
|
@@ -1663,14 +1657,13 @@ DEFUN_NOSH (show_debugging_ospf_instance
|
|
"Instance ID\n")
|
|
{
|
|
int idx_number = 3;
|
|
- struct ospf *ospf;
|
|
unsigned short instance = 0;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- if ((ospf = ospf_lookup_instance(instance)) == NULL)
|
|
- return CMD_SUCCESS;
|
|
+ if (instance != ospf_instance)
|
|
+ return CMD_NOT_MY_INSTANCE;
|
|
|
|
- return show_debugging_ospf_common(vty, ospf);
|
|
+ return show_debugging_ospf_common(vty);
|
|
}
|
|
|
|
static int config_write_debug(struct vty *vty);
|
|
@@ -1693,16 +1686,11 @@ static int config_write_debug(struct vty
|
|
"", " send", " recv", "",
|
|
" detail", " send detail", " recv detail", " detail"};
|
|
|
|
- struct ospf *ospf;
|
|
char str[16];
|
|
memset(str, 0, 16);
|
|
|
|
- ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
|
|
- if (ospf == NULL)
|
|
- return CMD_SUCCESS;
|
|
-
|
|
- if (ospf->instance)
|
|
- snprintf(str, sizeof(str), " %u", ospf->instance);
|
|
+ if (ospf_instance)
|
|
+ snprintf(str, sizeof(str), " %u", ospf_instance);
|
|
|
|
/* debug ospf ism (status|events|timers). */
|
|
if (IS_CONF_DEBUG_OSPF(ism, ISM) == OSPF_DEBUG_ISM)
|
|
--- a/ospfd/ospf_main.c
|
|
+++ b/ospfd/ospf_main.c
|
|
@@ -145,9 +145,6 @@ FRR_DAEMON_INFO(ospfd, OSPF, .vty_port =
|
|
/* OSPFd main routine. */
|
|
int main(int argc, char **argv)
|
|
{
|
|
- unsigned short instance = 0;
|
|
- bool created = false;
|
|
-
|
|
#ifdef SUPPORT_OSPF_API
|
|
/* OSPF apiserver is disabled by default. */
|
|
ospf_apiserver_enable = 0;
|
|
@@ -168,8 +165,8 @@ int main(int argc, char **argv)
|
|
|
|
switch (opt) {
|
|
case 'n':
|
|
- ospfd_di.instance = instance = atoi(optarg);
|
|
- if (instance < 1)
|
|
+ ospfd_di.instance = ospf_instance = atoi(optarg);
|
|
+ if (ospf_instance < 1)
|
|
exit(0);
|
|
break;
|
|
case 0:
|
|
@@ -207,7 +204,7 @@ int main(int argc, char **argv)
|
|
|
|
/* OSPFd inits. */
|
|
ospf_if_init();
|
|
- ospf_zebra_init(master, instance);
|
|
+ ospf_zebra_init(master, ospf_instance);
|
|
|
|
/* OSPF vty inits. */
|
|
ospf_vty_init();
|
|
@@ -223,17 +220,6 @@ int main(int argc, char **argv)
|
|
/* OSPF errors init */
|
|
ospf_error_init();
|
|
|
|
- /*
|
|
- * Need to initialize the default ospf structure, so the interface mode
|
|
- * commands can be duly processed if they are received before 'router
|
|
- * ospf', when ospfd is restarted
|
|
- */
|
|
- if (instance && !ospf_get_instance(instance, &created)) {
|
|
- flog_err(EC_OSPF_INIT_FAIL, "OSPF instance init failed: %s",
|
|
- strerror(errno));
|
|
- exit(1);
|
|
- }
|
|
-
|
|
frr_config_fork();
|
|
frr_run(master);
|
|
|
|
--- a/ospfd/ospf_vty.c
|
|
+++ b/ospfd/ospf_vty.c
|
|
@@ -136,44 +136,37 @@ int ospf_oi_count(struct interface *ifp)
|
|
all_vrf = strmatch(vrf_name, "all"); \
|
|
}
|
|
|
|
-static struct ospf *ospf_cmd_lookup_ospf(struct vty *vty,
|
|
- struct cmd_token *argv[],
|
|
- const int argc, uint32_t enable,
|
|
- unsigned short *instance)
|
|
+static int ospf_router_cmd_parse(struct vty *vty, struct cmd_token *argv[],
|
|
+ const int argc, unsigned short *instance,
|
|
+ const char **vrf_name)
|
|
{
|
|
- struct ospf *ospf = NULL;
|
|
int idx_vrf = 0, idx_inst = 0;
|
|
- const char *vrf_name = NULL;
|
|
- bool created = false;
|
|
|
|
*instance = 0;
|
|
- if (argv_find(argv, argc, "(1-65535)", &idx_inst))
|
|
+ if (argv_find(argv, argc, "(1-65535)", &idx_inst)) {
|
|
+ if (ospf_instance == 0) {
|
|
+ vty_out(vty,
|
|
+ "%% OSPF is not running in instance mode\n");
|
|
+ return CMD_WARNING_CONFIG_FAILED;
|
|
+ }
|
|
+
|
|
*instance = strtoul(argv[idx_inst]->arg, NULL, 10);
|
|
+ }
|
|
|
|
+ *vrf_name = NULL;
|
|
if (argv_find(argv, argc, "vrf", &idx_vrf)) {
|
|
- vrf_name = argv[idx_vrf + 1]->arg;
|
|
- if (vrf_name == NULL || strmatch(vrf_name, VRF_DEFAULT_NAME))
|
|
- vrf_name = NULL;
|
|
- if (enable) {
|
|
- /* Allocate VRF aware instance */
|
|
- ospf = ospf_get(*instance, vrf_name, &created);
|
|
- } else {
|
|
- ospf = ospf_lookup_by_inst_name(*instance, vrf_name);
|
|
- }
|
|
- } else {
|
|
- if (enable) {
|
|
- ospf = ospf_get(*instance, NULL, &created);
|
|
- } else {
|
|
- ospf = ospf_lookup_instance(*instance);
|
|
+ if (ospf_instance != 0) {
|
|
+ vty_out(vty,
|
|
+ "%% VRF is not supported in instance mode\n");
|
|
+ return CMD_WARNING_CONFIG_FAILED;
|
|
}
|
|
- }
|
|
|
|
- if (created) {
|
|
- if (DFLT_OSPF_LOG_ADJACENCY_CHANGES)
|
|
- SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
|
|
+ *vrf_name = argv[idx_vrf + 1]->arg;
|
|
+ if (*vrf_name && strmatch(*vrf_name, VRF_DEFAULT_NAME))
|
|
+ *vrf_name = NULL;
|
|
}
|
|
|
|
- return ospf;
|
|
+ return CMD_SUCCESS;
|
|
}
|
|
|
|
static void ospf_show_vrf_name(struct ospf *ospf, struct vty *vty,
|
|
@@ -209,28 +202,35 @@ DEFUN_NOSH (router_ospf,
|
|
"Instance ID\n"
|
|
VRF_CMD_HELP_STR)
|
|
{
|
|
- struct ospf *ospf = NULL;
|
|
- int ret = CMD_SUCCESS;
|
|
- unsigned short instance = 0;
|
|
+ unsigned short instance;
|
|
+ const char *vrf_name;
|
|
+ bool created = false;
|
|
+ struct ospf *ospf;
|
|
+ int ret;
|
|
|
|
- ospf = ospf_cmd_lookup_ospf(vty, argv, argc, 1, &instance);
|
|
- if (!ospf)
|
|
- return CMD_WARNING_CONFIG_FAILED;
|
|
+ ret = ospf_router_cmd_parse(vty, argv, argc, &instance, &vrf_name);
|
|
+ if (ret != CMD_SUCCESS)
|
|
+ return ret;
|
|
|
|
- /* The following logic to set the vty qobj index is in place to be able
|
|
- to ignore the commands which dont belong to this instance. */
|
|
- if (ospf->instance != instance) {
|
|
+ if (instance != ospf_instance) {
|
|
VTY_PUSH_CONTEXT_NULL(OSPF_NODE);
|
|
- ret = CMD_NOT_MY_INSTANCE;
|
|
- } else {
|
|
- if (IS_DEBUG_OSPF_EVENT)
|
|
- zlog_debug(
|
|
- "Config command 'router ospf %d' received, vrf %s id %u oi_running %u",
|
|
- instance, ospf->name ? ospf->name : "NIL",
|
|
- ospf->vrf_id, ospf->oi_running);
|
|
- VTY_PUSH_CONTEXT(OSPF_NODE, ospf);
|
|
+ return CMD_NOT_MY_INSTANCE;
|
|
}
|
|
|
|
+ ospf = ospf_get(instance, vrf_name, &created);
|
|
+
|
|
+ if (created)
|
|
+ if (DFLT_OSPF_LOG_ADJACENCY_CHANGES)
|
|
+ SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
|
|
+
|
|
+ if (IS_DEBUG_OSPF_EVENT)
|
|
+ zlog_debug(
|
|
+ "Config command 'router ospf %d' received, vrf %s id %u oi_running %u",
|
|
+ ospf->instance, ospf->name ? ospf->name : "NIL",
|
|
+ ospf->vrf_id, ospf->oi_running);
|
|
+
|
|
+ VTY_PUSH_CONTEXT(OSPF_NODE, ospf);
|
|
+
|
|
return ret;
|
|
}
|
|
|
|
@@ -243,19 +243,25 @@ DEFUN (no_router_ospf,
|
|
"Instance ID\n"
|
|
VRF_CMD_HELP_STR)
|
|
{
|
|
+ unsigned short instance;
|
|
+ const char *vrf_name;
|
|
struct ospf *ospf;
|
|
- unsigned short instance = 0;
|
|
+ int ret;
|
|
|
|
- ospf = ospf_cmd_lookup_ospf(vty, argv, argc, 0, &instance);
|
|
- if (ospf == NULL) {
|
|
- if (instance)
|
|
- return CMD_NOT_MY_INSTANCE;
|
|
- else
|
|
- return CMD_WARNING;
|
|
- }
|
|
- ospf_finish(ospf);
|
|
+ ret = ospf_router_cmd_parse(vty, argv, argc, &instance, &vrf_name);
|
|
+ if (ret != CMD_SUCCESS)
|
|
+ return ret;
|
|
|
|
- return CMD_SUCCESS;
|
|
+ if (instance != ospf_instance)
|
|
+ return CMD_NOT_MY_INSTANCE;
|
|
+
|
|
+ ospf = ospf_lookup(instance, vrf_name);
|
|
+ if (ospf)
|
|
+ ospf_finish(ospf);
|
|
+ else
|
|
+ ret = CMD_WARNING_CONFIG_FAILED;
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
|
|
@@ -3326,11 +3332,11 @@ DEFUN (show_ip_ospf_instance,
|
|
json_object *json = NULL;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- ospf = ospf_lookup_instance(instance);
|
|
- if (ospf == NULL)
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
- if (!ospf->oi_running)
|
|
+ ospf = ospf_lookup_instance(instance);
|
|
+ if (!ospf || !ospf->oi_running)
|
|
return CMD_SUCCESS;
|
|
|
|
if (uj)
|
|
@@ -4016,11 +4022,11 @@ DEFUN (show_ip_ospf_instance_interface,
|
|
json_object *json = NULL;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- ospf = ospf_lookup_instance(instance);
|
|
- if (ospf == NULL)
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
- if (!ospf->oi_running)
|
|
+ ospf = ospf_lookup_instance(instance);
|
|
+ if (!ospf || !ospf->oi_running)
|
|
return CMD_SUCCESS;
|
|
|
|
if (uj)
|
|
@@ -4409,11 +4415,11 @@ DEFUN (show_ip_ospf_instance_neighbor,
|
|
int ret = CMD_SUCCESS;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- ospf = ospf_lookup_instance(instance);
|
|
- if (ospf == NULL)
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
- if (!ospf->oi_running)
|
|
+ ospf = ospf_lookup_instance(instance);
|
|
+ if (!ospf || !ospf->oi_running)
|
|
return CMD_SUCCESS;
|
|
|
|
if (uj)
|
|
@@ -4621,11 +4627,11 @@ DEFUN (show_ip_ospf_instance_neighbor_al
|
|
int ret = CMD_SUCCESS;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- ospf = ospf_lookup_instance(instance);
|
|
- if (ospf == NULL)
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
- if (!ospf->oi_running)
|
|
+ ospf = ospf_lookup_instance(instance);
|
|
+ if (!ospf || !ospf->oi_running)
|
|
return CMD_SUCCESS;
|
|
if (uj)
|
|
json = json_object_new_object();
|
|
@@ -4761,11 +4767,11 @@ DEFUN (show_ip_ospf_instance_neighbor_in
|
|
show_ip_ospf_neighbour_header(vty);
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- ospf = ospf_lookup_instance(instance);
|
|
- if (ospf == NULL)
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
- if (!ospf->oi_running)
|
|
+ ospf = ospf_lookup_instance(instance);
|
|
+ if (!ospf || !ospf->oi_running)
|
|
return CMD_SUCCESS;
|
|
|
|
if (!uj)
|
|
@@ -5170,11 +5176,11 @@ DEFPY (show_ip_ospf_instance_neighbor_id
|
|
{
|
|
struct ospf *ospf;
|
|
|
|
- ospf = ospf_lookup_instance(instance);
|
|
- if (ospf == NULL)
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
- if (!ospf->oi_running)
|
|
+ ospf = ospf_lookup_instance(instance);
|
|
+ if (!ospf || !ospf->oi_running)
|
|
return CMD_SUCCESS;
|
|
|
|
return show_ip_ospf_neighbor_id_common(vty, ospf, &router_id, !!json,
|
|
@@ -5343,11 +5349,11 @@ DEFUN (show_ip_ospf_instance_neighbor_de
|
|
int ret = CMD_SUCCESS;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- ospf = ospf_lookup_instance(instance);
|
|
- if (ospf == NULL)
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
- if (!ospf->oi_running)
|
|
+ ospf = ospf_lookup_instance(instance);
|
|
+ if (!ospf || !ospf->oi_running)
|
|
return CMD_SUCCESS;
|
|
|
|
if (uj)
|
|
@@ -5538,11 +5544,11 @@ DEFUN (show_ip_ospf_instance_neighbor_de
|
|
int ret = CMD_SUCCESS;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- ospf = ospf_lookup_instance(instance);
|
|
- if (ospf == NULL)
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
- if (!ospf->oi_running)
|
|
+ ospf = ospf_lookup_instance(instance);
|
|
+ if (!ospf || !ospf->oi_running)
|
|
return CMD_SUCCESS;
|
|
|
|
if (uj)
|
|
@@ -5670,11 +5676,11 @@ DEFUN (show_ip_ospf_instance_neighbor_in
|
|
bool uj = use_json(argc, argv);
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- ospf = ospf_lookup_instance(instance);
|
|
- if (ospf == NULL)
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
- if (!ospf->oi_running)
|
|
+ ospf = ospf_lookup_instance(instance);
|
|
+ if (!ospf || !ospf->oi_running)
|
|
return CMD_SUCCESS;
|
|
|
|
return show_ip_ospf_neighbor_int_detail_common(vty, ospf, idx_ifname,
|
|
@@ -6420,10 +6426,11 @@ DEFUN (show_ip_ospf_instance_database,
|
|
|
|
if (argv_find(argv, argc, "(1-65535)", &idx)) {
|
|
instance = strtoul(argv[idx]->arg, NULL, 10);
|
|
- ospf = ospf_lookup_instance(instance);
|
|
- if (ospf == NULL)
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
- if (!ospf->oi_running)
|
|
+
|
|
+ ospf = ospf_lookup_instance(instance);
|
|
+ if (!ospf || !ospf->oi_running)
|
|
return CMD_SUCCESS;
|
|
|
|
return (show_ip_ospf_database_common(vty, ospf, idx ? 1 : 0,
|
|
@@ -6484,15 +6491,12 @@ DEFUN (show_ip_ospf_instance_database_ma
|
|
unsigned short instance = 0;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
-
|
|
- ospf = ospf_lookup_instance(instance);
|
|
- if (ospf == NULL)
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
- if (!ospf->oi_running) {
|
|
- vty_out(vty, "%% OSPF instance not found\n");
|
|
+ ospf = ospf_lookup_instance(instance);
|
|
+ if (!ospf || !ospf->oi_running)
|
|
return CMD_SUCCESS;
|
|
- }
|
|
|
|
return show_ip_ospf_database_common(vty, ospf, 1, argc, argv, 0);
|
|
}
|
|
@@ -6578,13 +6582,12 @@ DEFUN (show_ip_ospf_instance_database_ty
|
|
|
|
if (argv_find(argv, argc, "(1-65535)", &idx)) {
|
|
instance = strtoul(argv[idx]->arg, NULL, 10);
|
|
- ospf = ospf_lookup_instance(instance);
|
|
- if (ospf == NULL)
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
- if (!ospf->oi_running) {
|
|
- vty_out(vty, "%% OSPF instance not found\n");
|
|
+
|
|
+ ospf = ospf_lookup_instance(instance);
|
|
+ if (!ospf || !ospf->oi_running)
|
|
return CMD_SUCCESS;
|
|
- }
|
|
|
|
return (show_ip_ospf_database_type_adv_router_common(
|
|
vty, ospf, idx ? 1 : 0, argc, argv, use_vrf));
|
|
@@ -8035,7 +8038,7 @@ DEFUN (ip_ospf_area,
|
|
else
|
|
ospf = ospf_lookup_instance(instance);
|
|
|
|
- if (instance && ospf == NULL) {
|
|
+ if (instance && instance != ospf_instance) {
|
|
/*
|
|
* At this point we know we have received
|
|
* an instance and there is no ospf instance
|
|
@@ -8159,7 +8162,7 @@ DEFUN (no_ip_ospf_area,
|
|
else
|
|
ospf = ospf_lookup_instance(instance);
|
|
|
|
- if (instance && ospf == NULL)
|
|
+ if (instance && instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
argv_find(argv, argc, "area", &idx);
|
|
@@ -9519,11 +9522,11 @@ DEFUN (show_ip_ospf_instance_border_rout
|
|
unsigned short instance = 0;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- ospf = ospf_lookup_instance(instance);
|
|
- if (ospf == NULL)
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
- if (!ospf->oi_running)
|
|
+ ospf = ospf_lookup_instance(instance);
|
|
+ if (!ospf || !ospf->oi_running)
|
|
return CMD_SUCCESS;
|
|
|
|
return show_ip_ospf_border_routers_common(vty, ospf, 0);
|
|
@@ -9687,11 +9690,11 @@ DEFUN (show_ip_ospf_instance_route,
|
|
unsigned short instance = 0;
|
|
|
|
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
|
- ospf = ospf_lookup_instance(instance);
|
|
- if (ospf == NULL)
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
|
|
- if (!ospf->oi_running)
|
|
+ ospf = ospf_lookup_instance(instance);
|
|
+ if (!ospf || !ospf->oi_running)
|
|
return CMD_SUCCESS;
|
|
|
|
return show_ip_ospf_route_common(vty, ospf, NULL, 0);
|
|
@@ -9787,8 +9790,7 @@ DEFPY (clear_ip_ospf_neighbor,
|
|
*/
|
|
if (instance != 0) {
|
|
/* This means clear only the particular ospf process */
|
|
- ospf = ospf_lookup_instance(instance);
|
|
- if (ospf == NULL)
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
}
|
|
|
|
@@ -9818,8 +9820,7 @@ DEFPY (clear_ip_ospf_process,
|
|
/* Check if instance is not passed as an argument */
|
|
if (instance != 0) {
|
|
/* This means clear only the particular ospf process */
|
|
- ospf = ospf_lookup_instance(instance);
|
|
- if (ospf == NULL)
|
|
+ if (instance != ospf_instance)
|
|
return CMD_NOT_MY_INSTANCE;
|
|
}
|
|
|
|
@@ -9860,7 +9861,6 @@ static int config_write_interface_one(st
|
|
struct route_node *rn = NULL;
|
|
struct ospf_if_params *params;
|
|
int write = 0;
|
|
- struct ospf *ospf = vrf->info;
|
|
|
|
FOR_ALL_INTERFACES (vrf, ifp) {
|
|
|
|
@@ -10039,9 +10039,9 @@ static int config_write_interface_one(st
|
|
|
|
/* Area print. */
|
|
if (OSPF_IF_PARAM_CONFIGURED(params, if_area)) {
|
|
- if (ospf && ospf->instance)
|
|
+ if (ospf_instance)
|
|
vty_out(vty, " ip ospf %d",
|
|
- ospf->instance);
|
|
+ ospf_instance);
|
|
else
|
|
vty_out(vty, " ip ospf");
|
|
|
|
--- a/ospfd/ospfd.c
|
|
+++ b/ospfd/ospfd.c
|
|
@@ -67,6 +67,8 @@ static struct ospf_master ospf_master;
|
|
/* OSPF process wide configuration pointer to export. */
|
|
struct ospf_master *om;
|
|
|
|
+unsigned short ospf_instance;
|
|
+
|
|
extern struct zclient *zclient;
|
|
|
|
|
|
@@ -438,36 +440,28 @@ static void ospf_init(struct ospf *ospf)
|
|
ospf_router_id_update(ospf);
|
|
}
|
|
|
|
-struct ospf *ospf_get(unsigned short instance, const char *name, bool *created)
|
|
+struct ospf *ospf_lookup(unsigned short instance, const char *name)
|
|
{
|
|
struct ospf *ospf;
|
|
|
|
- /* vrf name provided call inst and name based api
|
|
- * in case of no name pass default ospf instance */
|
|
- if (name)
|
|
+ if (ospf_instance) {
|
|
+ ospf = ospf_lookup_instance(instance);
|
|
+ } else {
|
|
ospf = ospf_lookup_by_inst_name(instance, name);
|
|
- else
|
|
- ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
|
|
-
|
|
- *created = (ospf == NULL);
|
|
- if (ospf == NULL) {
|
|
- ospf = ospf_new(instance, name);
|
|
- ospf_add(ospf);
|
|
-
|
|
- ospf_init(ospf);
|
|
}
|
|
|
|
return ospf;
|
|
}
|
|
|
|
-struct ospf *ospf_get_instance(unsigned short instance, bool *created)
|
|
+struct ospf *ospf_get(unsigned short instance, const char *name, bool *created)
|
|
{
|
|
struct ospf *ospf;
|
|
|
|
- ospf = ospf_lookup_instance(instance);
|
|
+ ospf = ospf_lookup(instance, name);
|
|
+
|
|
*created = (ospf == NULL);
|
|
if (ospf == NULL) {
|
|
- ospf = ospf_new(instance, NULL /* VRF_DEFAULT*/);
|
|
+ ospf = ospf_new(instance, name);
|
|
ospf_add(ospf);
|
|
|
|
ospf_init(ospf);
|
|
--- a/ospfd/ospfd.h
|
|
+++ b/ospfd/ospfd.h
|
|
@@ -502,6 +502,7 @@ struct ospf_nbr_nbma {
|
|
|
|
/* Extern variables. */
|
|
extern struct ospf_master *om;
|
|
+extern unsigned short ospf_instance;
|
|
extern const int ospf_redistributed_proto_max;
|
|
extern struct zclient *zclient;
|
|
extern struct thread_master *master;
|
|
@@ -511,9 +512,9 @@ extern struct zebra_privs_t ospfd_privs;
|
|
/* Prototypes. */
|
|
extern const char *ospf_redist_string(unsigned int route_type);
|
|
extern struct ospf *ospf_lookup_instance(unsigned short);
|
|
+extern struct ospf *ospf_lookup(unsigned short instance, const char *name);
|
|
extern struct ospf *ospf_get(unsigned short instance, const char *name,
|
|
bool *created);
|
|
-extern struct ospf *ospf_get_instance(unsigned short, bool *created);
|
|
extern struct ospf *ospf_lookup_by_inst_name(unsigned short instance,
|
|
const char *name);
|
|
extern struct ospf *ospf_lookup_by_vrf_id(vrf_id_t vrf_id);
|
|
--- a/vtysh/vtysh.c
|
|
+++ b/vtysh/vtysh.c
|
|
@@ -2487,7 +2487,7 @@ static int show_per_daemon(const char *l
|
|
int ret = CMD_SUCCESS;
|
|
|
|
for (i = 0; i < array_size(vtysh_client); i++)
|
|
- if (vtysh_client[i].fd >= 0) {
|
|
+ if (vtysh_client[i].fd >= 0 || vtysh_client[i].next) {
|
|
vty_out(vty, headline, vtysh_client[i].name);
|
|
ret = vtysh_client_execute(&vtysh_client[i], line);
|
|
vty_out(vty, "\n");
|