combine startup sleep(x) after error messages, to a single sleep (feature can be...
authorMarkus Kittenberger <Markus.Kittenberger@gmx.at>
Tue, 15 Dec 2009 21:47:54 +0000 (22:47 +0100)
committerMarkus Kittenberger <Markus.Kittenberger@gmx.at>
Tue, 15 Dec 2009 21:47:54 +0000 (22:47 +0100)
src/bsd/net.c
src/linux/net.c
src/main.c
src/olsr.c
src/olsr.h
src/olsr_cfg.h

index b512e29..e847bf1 100644 (file)
@@ -49,6 +49,7 @@
 #include "../parser.h"          /* dnc: needed for call to packet_parser() */
 #include "../olsr_protocol.h"
 #include "../olsr_cfg.h"
+#include "../olsr.h"
 
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -185,7 +186,7 @@ enable_ip_forwarding(int version)
   gateway = set_sysctl_int(name, 1);
   if (gateway < 0) {
     fprintf(stderr, "Cannot enable IP forwarding. Please enable IP forwarding manually." " Continuing in 3 seconds...\n");
-    sleep(3);
+    olsr_startup_sleep(3);
   }
 
   return 1;
@@ -225,7 +226,7 @@ disable_redirects_global(int version)
   if (ignore_redir < 0) {
     fprintf(stderr,
             "Cannot disable incoming ICMP redirect messages. " "Please disable them manually. Continuing in 3 seconds...\n");
-    sleep(3);
+    olsr_startup_sleep(3);
   }
 
   /* do not send ICMP redirects */
@@ -239,7 +240,7 @@ disable_redirects_global(int version)
   if (send_redir < 0) {
     fprintf(stderr,
             "Cannot disable outgoing ICMP redirect messages. " "Please disable them manually. Continuing in 3 seconds...\n");
-    sleep(3);
+    olsr_startup_sleep(3);
   }
 
   return 1;
index 0a39241..1770d8f 100644 (file)
@@ -45,6 +45,7 @@
 
 #include "../net_os.h"
 #include "../ipcalc.h"
+#include "../olsr.h"
 
 #include <net/if.h>
 
@@ -122,7 +123,7 @@ enable_ip_forwarding(int version)
               "WARNING! Could not open the %s file to check/enable IP forwarding!\nAre you using the procfile filesystem?\nDoes your system support IPv6?\nI will continue(in 3 sec) - but you should mannually ensure that IP forwarding is enabeled!\n\n",
               procfile);
 
-    sleep(3);
+    olsr_startup_sleep(3);
     return 0;
   }
 
@@ -134,7 +135,7 @@ enable_ip_forwarding(int version)
     if ((proc_fwd = fopen(procfile, "w")) == NULL) {
       fprintf(stderr, "Could not open %s for writing!\n", procfile);
       fprintf(stderr, "I will continue(in 3 sec) - but you should mannually ensure that IP forwarding is enabeled!\n\n");
-      sleep(3);
+      olsr_startup_sleep(3);
       return 0;
     } else {
       syslog(LOG_INFO, "Writing \"1\" to %s\n", procfile);
@@ -159,7 +160,7 @@ disable_redirects_global(int version)
             "WARNING! Could not open the %s file to check/disable ICMP redirects!\nAre you using the procfile filesystem?\nDoes your system support IPv4?\nI will continue(in 3 sec) - but you should mannually ensure that ICMP redirects are disabled!\n\n",
             procfile);
 
-    sleep(3);
+    olsr_startup_sleep(3);
     return -1;
   }
   orig_global_redirect_state = fgetc(proc_redirect);
@@ -171,7 +172,7 @@ disable_redirects_global(int version)
   if ((proc_redirect = fopen(procfile, "w")) == NULL) {
     fprintf(stderr, "Could not open %s for writing!\n", procfile);
     fprintf(stderr, "I will continue(in 3 sec) - but you should mannually ensure that ICMP redirect is disabeled!\n\n");
-    sleep(3);
+    olsr_startup_sleep(3);
     return 0;
   }
   syslog(LOG_INFO, "Writing \"0\" to %s", procfile);
@@ -200,7 +201,7 @@ disable_redirects(const char *if_name, struct interface *iface, int version)
     fprintf(stderr,
             "WARNING! Could not open the %s file to check/disable ICMP redirects!\nAre you using the procfile filesystem?\nDoes your system support IPv4?\nI will continue(in 3 sec) - but you should mannually ensure that ICMP redirects are disabled!\n\n",
             procfile);
-    sleep(3);
+    olsr_startup_sleep(3);
     return 0;
   }
   iface->nic_state.redirect = fgetc(proc_redirect);
@@ -209,7 +210,7 @@ disable_redirects(const char *if_name, struct interface *iface, int version)
   if ((proc_redirect = fopen(procfile, "w")) == NULL) {
     fprintf(stderr, "Could not open %s for writing!\n", procfile);
     fprintf(stderr, "I will continue(in 3 sec) - but you should mannually ensure that ICMP redirect is disabeled!\n\n");
-    sleep(3);
+    olsr_startup_sleep(3);
     return 0;
   }
   syslog(LOG_INFO, "Writing \"0\" to %s", procfile);
@@ -239,7 +240,7 @@ deactivate_spoof(const char *if_name, struct interface *iface, int version)
             "WARNING! Could not open the %s file to check/disable the IP spoof filter!\nAre you using the procfile filesystem?\nDoes your system support IPv4?\nI will continue(in 3 sec) - but you should mannually ensure that IP spoof filtering is disabled!\n\n",
             procfile);
 
-    sleep(3);
+    olsr_startup_sleep(3);
     return 0;
   }
   iface->nic_state.spoof = fgetc(proc_spoof);
@@ -248,7 +249,7 @@ deactivate_spoof(const char *if_name, struct interface *iface, int version)
   if ((proc_spoof = fopen(procfile, "w")) == NULL) {
     fprintf(stderr, "Could not open %s for writing!\n", procfile);
     fprintf(stderr, "I will continue(in 3 sec) - but you should mannually ensure that IP spoof filtering is disabeled!\n\n");
-    sleep(3);
+    olsr_startup_sleep(3);
     return 0;
   }
   syslog(LOG_INFO, "Writing \"0\" to %s", procfile);
index d77461e..8682533 100644 (file)
@@ -394,13 +394,15 @@ int main(int argc, char *argv[]) {
       fprintf(
           stderr,
           "No interfaces detected! This might be intentional, but it also might mean that your configuration is fubar.\nI will continue after 5 seconds...\n");
-      sleep(5);
+      olsr_startup_sleep(5);
     } else {
       fprintf(stderr, "No interfaces detected!\nBailing out!\n");
       olsr_exit(__func__, EXIT_FAILURE);
     }
   }
 
+  olsr_do_startup_sleep();
+
   /* Print heartbeat to stdout */
 
 #if !defined WINCE
index b29b136..43fcd07 100644 (file)
@@ -73,6 +73,37 @@ bool changes_neighborhood;
 bool changes_hna;
 bool changes_force;
 
+/*COLLECT startup sleeps caused by warnings*/
+
+#ifdef OLSR_COLLECT_STARTUP_SLEEP
+static int max_startup_sleep = 0;
+#endif
+static int sum_startup_sleep = 0;
+
+void olsr_startup_sleep(int s)
+{
+  sum_startup_sleep += s;
+#ifdef OLSR_COLLECT_STARTUP_SLEEP
+  if (s > max_startup_sleep) max_startup_sleep=s;
+#else
+  sleep(s);
+#endif
+}
+
+void olsr_do_startup_sleep(void)
+{
+#ifdef OLSR_COLLECT_STARTUP_SLEEP
+  if (sum_startup_sleep > max_startup_sleep)
+    printf("OLSR encountered multiple problems on startup, which should delay startup by %i seconds.\nAs this is quite much time, OLSR will sleep only %i seconds.\nBUT YOU SHOULD FIX ABOVE PROBLEMS!\n",
+           sum_startup_sleep,max_startup_sleep);
+  sleep(max_startup_sleep);
+#else
+  if (sum_startup_sleep > 0) 
+    printf("olsrd startup was delayed %i seconds due to various nasty error messages.\nYOU SHOULD REALLY FIX ABOVE PROBLEMS!\n",
+           sum_startup_sleep);
+#endif
+}
+
 /**
  * Process changes functions
  */
index 02fb288..02c8c6a 100644 (file)
@@ -52,6 +52,9 @@ extern bool changes_force;
 
 extern union olsr_ip_addr all_zero;
 
+void olsr_startup_sleep(int);
+void olsr_do_startup_sleep(void);
+
 void register_pcf(int (*)(int, int, int));
 
 void olsr_process_changes(void);
index 8e7c762..18195dd 100644 (file)
@@ -44,6 +44,9 @@
 
 #include "olsr_types.h"
 
+/*set to 1 to collect all startup sleep into one sleep (just as long as the longest sleep) useful if many errors on many interfaces*/
+#define OLSR_COLLECT_STARTUP_SLEEP 1
+
 /* set to 1 to enable a second rtnetlink socket 
  * used for listening and reating on interface change events
  * (requires LINUX_POLICY_ROUTING to be enabled aswell) */