summaryrefslogtreecommitdiff
path: root/ospfd/ospf_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospfd/ospf_main.c')
-rw-r--r--ospfd/ospf_main.c81
1 files changed, 76 insertions, 5 deletions
diff --git a/ospfd/ospf_main.c b/ospfd/ospf_main.c
index 1f476a7e3d..abad6c5b90 100644
--- a/ospfd/ospf_main.c
+++ b/ospfd/ospf_main.c
@@ -27,6 +27,7 @@
#include "vrf.h"
#include "libfrr.h"
#include "routemap.h"
+#include "keychain.h"
#include "ospfd/ospfd.h"
#include "ospfd/ospf_interface.h"
@@ -44,6 +45,16 @@
#include "ospfd/ospf_ldp_sync.h"
#include "ospfd/ospf_routemap_nb.h"
+#define OSPFD_STATE_NAME "%s/ospfd.json", frr_libstatedir
+#define OSPFD_INST_STATE_NAME(i) "%s/ospfd-%d.json", frr_runstatedir, i
+
+/* this one includes the path... because the instance number was in the path
+ * before :( ... which totally didn't have a mkdir anywhere.
+ */
+#define OSPFD_COMPAT_STATE_NAME "%s/ospfd-gr.json", frr_libstatedir
+#define OSPFD_COMPAT_INST_STATE_NAME(i) \
+ "%s-%d/ospfd-gr.json", frr_runstatedir, i
+
/* ospfd privileges */
zebra_capabilities_t _caps_p[] = {ZCAP_NET_RAW, ZCAP_BIND, ZCAP_NET_ADMIN,
ZCAP_SYS_ADMIN};
@@ -88,6 +99,7 @@ static void sigint(void)
zlog_notice("Terminating on signal");
bfd_protocol_integration_set_shutdown(true);
ospf_terminate();
+
exit(0);
}
@@ -122,17 +134,61 @@ static const struct frr_yang_module_info *const ospfd_yang_modules[] = {
&frr_route_map_info,
&frr_vrf_info,
&frr_ospf_route_map_info,
+ &ietf_key_chain_info,
+ &ietf_key_chain_deviation_info,
+};
+
+/* actual paths filled in main() */
+static char state_path[512];
+static char state_compat_path[512];
+static char *state_paths[] = {
+ state_path,
+ state_compat_path,
+ NULL,
};
-FRR_DAEMON_INFO(ospfd, OSPF, .vty_port = OSPF_VTY_PORT,
+/* clang-format off */
+FRR_DAEMON_INFO(ospfd, OSPF,
+ .vty_port = OSPF_VTY_PORT,
+ .proghelp = "Implementation of the OSPFv2 routing protocol.",
- .proghelp = "Implementation of the OSPFv2 routing protocol.",
+ .signals = ospf_signals,
+ .n_signals = array_size(ospf_signals),
- .signals = ospf_signals, .n_signals = array_size(ospf_signals),
+ .privs = &ospfd_privs,
- .privs = &ospfd_privs, .yang_modules = ospfd_yang_modules,
- .n_yang_modules = array_size(ospfd_yang_modules),
+ .yang_modules = ospfd_yang_modules,
+ .n_yang_modules = array_size(ospfd_yang_modules),
+
+ .state_paths = state_paths,
);
+/* clang-format on */
+
+/** Max wait time for config to load before accepting hellos */
+#define OSPF_PRE_CONFIG_MAX_WAIT_SECONDS 600
+
+static void ospf_config_finish(struct event *t)
+{
+ zlog_err("OSPF configuration end timer expired after %d seconds.",
+ OSPF_PRE_CONFIG_MAX_WAIT_SECONDS);
+}
+
+static void ospf_config_start(void)
+{
+ EVENT_OFF(t_ospf_cfg);
+ if (IS_DEBUG_OSPF_EVENT)
+ zlog_debug("ospfd config start callback received.");
+ event_add_timer(master, ospf_config_finish, NULL,
+ OSPF_PRE_CONFIG_MAX_WAIT_SECONDS, &t_ospf_cfg);
+}
+
+static void ospf_config_end(void)
+{
+ if (IS_DEBUG_OSPF_EVENT)
+ zlog_debug("ospfd config end callback received.");
+
+ EVENT_OFF(t_ospf_cfg);
+}
/* OSPFd main routine. */
int main(int argc, char **argv)
@@ -180,6 +236,17 @@ int main(int argc, char **argv)
exit(1);
}
+ if (ospf_instance) {
+ snprintf(state_path, sizeof(state_path),
+ OSPFD_INST_STATE_NAME(ospf_instance));
+ snprintf(state_compat_path, sizeof(state_compat_path),
+ OSPFD_COMPAT_INST_STATE_NAME(ospf_instance));
+ } else {
+ snprintf(state_path, sizeof(state_path), OSPFD_STATE_NAME);
+ snprintf(state_compat_path, sizeof(state_compat_path),
+ OSPFD_COMPAT_STATE_NAME);
+ }
+
/* OSPF master init. */
ospf_master_init(frr_init());
@@ -192,6 +259,10 @@ int main(int argc, char **argv)
access_list_init();
prefix_list_init();
+ keychain_init();
+
+ /* Configuration processing callback initialization. */
+ cmd_init_config_callbacks(ospf_config_start, ospf_config_end);
/* OSPFd inits. */
ospf_if_init();