delete all routes if the last IP address is gone.
authorHannes Gredler <hannes@gredler.at>
Wed, 2 Jul 2008 12:40:22 +0000 (14:40 +0200)
committerHannes Gredler <hannes@gredler.at>
Wed, 2 Jul 2008 12:40:22 +0000 (14:40 +0200)
tested by Joerg Pommnitz <pommnitz@yahoo.com>

src/main.c
src/olsr.c
src/olsr.h
src/olsr_spf.c
src/tc_set.c

index 9c3776b..263c1bb 100644 (file)
@@ -163,6 +163,8 @@ main(int argc, char *argv[])
   /* Using PID as random seed */
   srandom(getpid());
 
+  /* Init widely used statics */
+  memset(&all_zero, 0, sizeof(union olsr_ip_addr));
 
   /*
    * Set configfile name and
index aae15f7..dcacc63 100644 (file)
@@ -85,6 +85,7 @@ struct pcf
 static struct pcf *pcf_list;
 
 static olsr_u16_t message_seqno;
+union olsr_ip_addr all_zero;
 
 /**
  *Initialize the message sequence number as a random value
index 6f9b168..bd479ee 100644 (file)
@@ -50,6 +50,8 @@ extern olsr_bool changes_neighborhood;
 extern olsr_bool changes_hna;
 extern olsr_bool changes_force;
 
+extern union olsr_ip_addr all_zero;
+
 void
 register_pcf(int (*)(int, int, int));
 
index 1418ea4..715bc17 100644 (file)
@@ -360,10 +360,25 @@ olsr_calculate_routing_table (void)
     tc->hops = 0;
   } OLSR_FOR_ALL_TC_ENTRIES_END(tc);
 
+
   /*
-   * zero ourselves and add us to the candidate tree.
+   * Check if there was a change in the main IP address.
+   * Bail if there is no main IP address.
    */
   olsr_change_myself_tc();
+  if (!tc_myself) {
+
+    /*
+     * All gone now. Flush all routes.
+     */
+    olsr_update_rib_routes();
+    olsr_update_kernel_routes();
+    return;
+  }
+
+  /*
+   * zero ourselves and add us to the candidate tree.
+   */
   tc_myself->path_cost = ZERO_ROUTE_COST;
   olsr_spf_add_cand_tree(&cand_tree, tc_myself);
 
index 7a2c287..6408dd4 100644 (file)
@@ -137,6 +137,13 @@ olsr_add_tc_entry(union olsr_ip_addr *adr)
 #endif
   struct tc_entry *tc;
 
+  /*
+   * Safety net against loss of the last main IP address.
+   */
+  if (ipequal(&olsr_cnf->main_addr, &all_zero)) {
+    return NULL;
+  }
+
 #ifdef DEBUG
   OLSR_PRINTF(1, "TC: add entry %s\n", olsr_ip_to_string(&buf, adr));
 #endif