gateway: work around kernel IPIP module initialisation bug
authorFerry Huberts <ferry.huberts@pelagic.nl>
Tue, 26 Feb 2013 12:30:58 +0000 (13:30 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Tue, 26 Feb 2013 12:48:50 +0000 (13:48 +0100)
First reported by Daniel.
I've reworked his approach to retry deeper in the call chain
in order to deal with the problem where it actually occurs.

Reported-by: Daniel <daniel@makrotopia.org>
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/gateway.c

index 6e74881..e2c9b91 100644 (file)
@@ -461,6 +461,8 @@ static void cleanup_gateway_handler(void *ptr) {
  * Initialize gateway system
  */
 int olsr_init_gateways(void) {
+  int retries = 5;
+
   gateway_entry_mem_cookie = olsr_alloc_cookie("gateway_entry_mem_cookie", OLSR_COOKIE_TYPE_MEMORY);
   olsr_cookie_set_memory_size(gateway_entry_mem_cookie, sizeof(struct gateway_entry));
 
@@ -523,7 +525,22 @@ int olsr_init_gateways(void) {
   gw_handler = &gw_def_handler;
   gw_handler->init();
 
-  if (olsr_os_init_iptunnel(server_tunnel_name())) {
+
+  /*
+   * There appears to be a kernel bug in some kernels (at least in the 3.0
+   * Debian Squeeze kernel, but not in the Fedora 17 kernels) around
+   * initialising the IPIP server tunnel (loading the IPIP module), so we retry
+   * a few times before giving up
+   */
+  while (retries-- >= 0) {
+    if (!olsr_os_init_iptunnel(server_tunnel_name())) {
+      retries = 5;
+      break;
+    }
+
+    olsr_printf(0, "Could not initialise the IPIP server tunnel, retrying %d more times\n", retries);
+  }
+  if (retries <= 0) {
     return 1;
   }