summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDonald Sharp <donaldsharp72@gmail.com>2023-06-26 20:59:13 +0200
committerGitHub <noreply@github.com>2023-06-26 20:59:13 +0200
commitdee79c33a425d264e53e0e5d0ad51b1bc13945d0 (patch)
tree2c6155ee0f74325340fb7b06acc53d2670852d7e
parentMerge pull request #13802 from LabNConsulting/aceelindem/ospfd-config-callbacks (diff)
parentospf6d: Add config callbacks to suppress hellos during config load. Add bgpd/... (diff)
downloadfrr-dee79c33a425d264e53e0e5d0ad51b1bc13945d0.tar.xz
frr-dee79c33a425d264e53e0e5d0ad51b1bc13945d0.zip
Merge pull request #13804 from LabNConsulting/aceelindem/ospf6d-config-callbacks
ospf6d: Add config callbacks to suppress hellos during config load.
-rw-r--r--ospf6d/ospf6_main.c29
-rw-r--r--ospf6d/ospf6_message.c11
-rw-r--r--ospf6d/ospf6d.c33
-rw-r--r--ospf6d/ospf6d.h9
-rw-r--r--ospf6d/subdir.am1
5 files changed, 83 insertions, 0 deletions
diff --git a/ospf6d/ospf6_main.c b/ospf6d/ospf6_main.c
index fdb93475d..932304578 100644
--- a/ospf6d/ospf6_main.c
+++ b/ospf6d/ospf6_main.c
@@ -173,6 +173,32 @@ FRR_DAEMON_INFO(ospf6d, OSPF6, .vty_port = OSPF6_VTY_PORT,
.n_yang_modules = array_size(ospf6d_yang_modules),
);
+/* Max wait time for config to load before accepting hellos */
+#define OSPF6_PRE_CONFIG_MAX_WAIT_SECONDS 600
+
+static void ospf6_config_finish(struct event *t)
+{
+ zlog_err("OSPF6 configuration end timer expired after %d seconds.",
+ OSPF6_PRE_CONFIG_MAX_WAIT_SECONDS);
+}
+
+static void ospf6_config_start(void)
+{
+ if (IS_OSPF6_DEBUG_EVENT)
+ zlog_debug("ospf6d config start received");
+ EVENT_OFF(t_ospf6_cfg);
+ event_add_timer(master, ospf6_config_finish, NULL,
+ OSPF6_PRE_CONFIG_MAX_WAIT_SECONDS, &t_ospf6_cfg);
+}
+
+static void ospf6_config_end(void)
+{
+ if (IS_OSPF6_DEBUG_EVENT)
+ zlog_debug("ospf6d config end received");
+
+ EVENT_OFF(t_ospf6_cfg);
+}
+
/* Main routine of ospf6d. Treatment of argument and starting ospf finite
state machine is handled here. */
int main(int argc, char *argv[], char *envp[])
@@ -217,6 +243,9 @@ int main(int argc, char *argv[], char *envp[])
/* initialize ospf6 */
ospf6_init(master);
+ /* Configuration processing callback initialization. */
+ cmd_init_config_callbacks(ospf6_config_start, ospf6_config_end);
+
frr_config_fork();
frr_run(master);
diff --git a/ospf6d/ospf6_message.c b/ospf6d/ospf6_message.c
index 032988a91..29a68c5c3 100644
--- a/ospf6d/ospf6_message.c
+++ b/ospf6d/ospf6_message.c
@@ -2248,6 +2248,17 @@ void ospf6_hello_send(struct event *thread)
if (oi->gr.hello_delay.t_grace_send)
return;
+ /* Check if config is still being processed */
+ if (event_is_scheduled(t_ospf6_cfg)) {
+ if (IS_OSPF6_DEBUG_MESSAGE(OSPF6_MESSAGE_TYPE_HELLO, SEND))
+ zlog_debug(
+ "Suppressing Hello on interface %s during config load",
+ oi->interface->name);
+ event_add_timer(master, ospf6_hello_send, oi,
+ oi->hello_interval, &oi->thread_send_hello);
+ return;
+ }
+
if (oi->state <= OSPF6_INTERFACE_DOWN) {
if (IS_OSPF6_DEBUG_MESSAGE(OSPF6_MESSAGE_TYPE_HELLO, SEND_HDR))
zlog_debug("Unable to send Hello on down interface %s",
diff --git a/ospf6d/ospf6d.c b/ospf6d/ospf6d.c
index 214007d04..d90a950d7 100644
--- a/ospf6d/ospf6d.c
+++ b/ospf6d/ospf6d.c
@@ -34,9 +34,16 @@
#include "lib/json.h"
#include "ospf6_nssa.h"
#include "ospf6_auth_trailer.h"
+#include "ospf6d/ospf6d_clippy.c"
DEFINE_MGROUP(OSPF6D, "ospf6d");
+/* OSPF6 config processing timer thread */
+struct event *t_ospf6_cfg;
+
+/* OSPF6 debug event state */
+unsigned char conf_debug_ospf6_event;
+
struct route_node *route_prev(struct route_node *node)
{
struct route_node *end;
@@ -62,6 +69,7 @@ struct route_node *route_prev(struct route_node *node)
}
static int config_write_ospf6_debug(struct vty *vty);
+static int config_write_ospf6_debug_event(struct vty *vty);
static struct cmd_node debug_node = {
.name = "debug",
.node = DEBUG_NODE,
@@ -85,6 +93,7 @@ static int config_write_ospf6_debug(struct vty *vty)
config_write_ospf6_debug_nssa(vty);
config_write_ospf6_debug_gr_helper(vty);
config_write_ospf6_debug_auth(vty);
+ config_write_ospf6_debug_event(vty);
return 0;
}
@@ -1374,6 +1383,29 @@ DEFUN(show_ipv6_ospf6_linkstate_detail, show_ipv6_ospf6_linkstate_detail_cmd,
return CMD_SUCCESS;
}
+DEFPY(debug_ospf6_event, debug_ospf6_event_cmd, "[no] debug ospf6 event",
+ NO_STR DEBUG_STR OSPF6_STR "Debug OSPFv3 event function\n")
+{
+ if (!no)
+ OSPF6_DEBUG_EVENT_ON();
+ else
+ OSPF6_DEBUG_EVENT_OFF();
+ return CMD_SUCCESS;
+}
+
+static int config_write_ospf6_debug_event(struct vty *vty)
+{
+ if (IS_OSPF6_DEBUG_EVENT)
+ vty_out(vty, "debug ospf6 event\n");
+ return 0;
+}
+
+static void install_element_ospf6_debug_event(void)
+{
+ install_element(ENABLE_NODE, &debug_ospf6_event_cmd);
+ install_element(CONFIG_NODE, &debug_ospf6_event_cmd);
+}
+
/* Install ospf related commands. */
void ospf6_init(struct event_loop *master)
{
@@ -1447,6 +1479,7 @@ void ospf6_init(struct event_loop *master)
VIEW_NODE,
&show_ipv6_ospf6_database_type_self_originated_linkstate_id_cmd);
install_element(VIEW_NODE, &show_ipv6_ospf6_database_aggr_router_cmd);
+ install_element_ospf6_debug_event();
install_element_ospf6_debug_auth();
ospf6_interface_auth_trailer_cmd_init();
install_element_ospf6_clear_intf_auth();
diff --git a/ospf6d/ospf6d.h b/ospf6d/ospf6d.h
index 980a36526..c927ee756 100644
--- a/ospf6d/ospf6d.h
+++ b/ospf6d/ospf6d.h
@@ -15,6 +15,9 @@ DECLARE_MGROUP(OSPF6D);
/* global variables */
extern struct event_loop *master;
+/* OSPF config processing timer thread */
+extern struct event *t_ospf6_cfg;
+
/* Historical for KAME. */
#ifndef IPV6_JOIN_GROUP
#ifdef IPV6_ADD_MEMBERSHIP
@@ -105,6 +108,12 @@ extern struct event_loop *master;
extern struct zebra_privs_t ospf6d_privs;
+/* Event Debug option */
+extern unsigned char conf_debug_ospf6_event;
+#define OSPF6_DEBUG_EVENT_ON() (conf_debug_ospf6_event = 1)
+#define OSPF6_DEBUG_EVENT_OFF() (conf_debug_ospf6_event = 0)
+#define IS_OSPF6_DEBUG_EVENT (conf_debug_ospf6_event)
+
/* Function Prototypes */
extern struct route_node *route_prev(struct route_node *node);
diff --git a/ospf6d/subdir.am b/ospf6d/subdir.am
index c34db3012..f6d27c84c 100644
--- a/ospf6d/subdir.am
+++ b/ospf6d/subdir.am
@@ -75,6 +75,7 @@ ospf6d_ospf6d_snmp_la_LDFLAGS = $(MODULE_LDFLAGS)
ospf6d_ospf6d_snmp_la_LIBADD = lib/libfrrsnmp.la
clippy_scan += \
+ ospf6d/ospf6d.c \
ospf6d/ospf6_top.c \
ospf6d/ospf6_area.c \
ospf6d/ospf6_asbr.c \