+ fixed bug #402: now the second zebra process doesn't destroy routes
of the first one before dying
+ we are not going to receive routing messages originated by old_pid,
because rib_sweep_route() is called after damon() now. This will allow
to drop old_pid completely soon.
diff --git a/zebra/main.c b/zebra/main.c
index 7d89579..2f96652 100644
--- a/zebra/main.c
+++ b/zebra/main.c
@@ -346,11 +346,13 @@
zebra_snmp_init ();
#endif /* HAVE_SNMP */
- /* Clean up self inserted route. */
- if (! keep_kernel_mode)
- rib_sweep_route ();
-
- /* Configuration file read*/
+ /* Process the configuration file. Among other configuration
+ * directives we can meet those installing static routes. Such
+ * requests will not be executed immediately, but queued in
+ * zebra->ribq structure until we enter the main execution loop.
+ * The notifications from kernel will show originating PID equal
+ * to that after daemon() completes (if ever called).
+ */
vty_read_config (config_file, config_default);
/* Don't start execution if we are in dry-run mode */
@@ -374,6 +376,17 @@
/* Output pid of zebra. */
pid_output (pid_file);
+ /* After we have successfully acquired the pidfile, we can be sure
+ * about being the only copy of zebra process, which is submitting
+ * changes to the FIB.
+ * Clean up zebra-originated routes. The requests will be sent to OS
+ * immediately, so originating PID in notifications from kernel
+ * will be equal to the current getpid(). To know about such routes,
+ * we have to have route_read() called before.
+ */
+ if (! keep_kernel_mode)
+ rib_sweep_route ();
+
/* Needed for BSD routing socket. */
pid = getpid ();