More cleanup for router shutdown detection by empty TCs.
authorHenning Rogge <henning@henning-notebook.fritz.box>
Mon, 28 Dec 2009 22:04:01 +0000 (23:04 +0100)
committerHenning Rogge <henning@henning-notebook.fritz.box>
Mon, 28 Dec 2009 22:04:01 +0000 (23:04 +0100)
src/duplicate_set.c
src/duplicate_set.h
src/tc_set.c

index 7001982..3bc55a9 100644 (file)
@@ -61,6 +61,15 @@ olsr_init_duplicate_set(void)
                  &olsr_cleanup_duplicate_entry, NULL, 0);
 }
 
+void olsr_cleanup_duplicates(union olsr_ip_addr *orig) {
+  struct dup_entry *entry;
+
+  entry = (struct dup_entry *)avl_find(&duplicate_set, orig);
+  if (entry != NULL) {
+    entry->too_low_counter = DUP_MAX_TOO_LOW - 2;
+  }
+}
+
 struct dup_entry *
 olsr_create_duplicate_entry(void *ip, uint16_t seqnr)
 {
@@ -145,7 +154,7 @@ olsr_message_is_duplicate(union olsr_message *m)
     entry->too_low_counter++;
 
     // client did restart with a lower number ?
-    if (entry->too_low_counter > 16) {
+    if (entry->too_low_counter > DUP_MAX_TOO_LOW) {
       entry->too_low_counter = 0;
       entry->seqnr = seqnr;
       entry->array = 1;
index d1883c8..d07a033 100644 (file)
@@ -50,6 +50,7 @@
 #define DUPLICATE_CLEANUP_INTERVAL 15000
 #define DUPLICATE_CLEANUP_JITTER 25
 #define DUPLICATE_VTIME 120000
+#define DUP_MAX_TOO_LOW 16
 
 struct dup_entry {
   struct avl_node avl;
@@ -63,6 +64,7 @@ struct dup_entry {
 AVLNODE2STRUCT(duptree2dupentry, struct dup_entry, avl);
 
 void olsr_init_duplicate_set(void);
+void olsr_cleanup_duplicates(union olsr_ip_addr *orig);
 struct dup_entry *olsr_create_duplicate_entry(void *ip, uint16_t seqnr);
 int olsr_message_is_duplicate(union olsr_message *m);
 void olsr_print_duplicate_table(void);
index 299cd2d..c227955 100644 (file)
@@ -52,6 +52,7 @@
 #include "net_olsr.h"
 #include "lq_plugin.h"
 #include "olsr_cookie.h"
+#include "duplicate_set.h"
 
 #include <assert.h>
 
@@ -944,9 +945,14 @@ olsr_input_tc(union olsr_message * msg, struct interface * input_if __attribute_
   }
 
   if (emptyTC && borderSet) {
-    /* cleanup MIDs and HNAs if all edges have been erased by an empty TC */
+    /* cleanup MIDs and HNAs if all edges have been erased by
+     * an empty TC, then alert the duplicate set and kill the
+     * tc entry */
     olsr_cleanup_mid(&originator);
     olsr_cleanup_hna(&originator);
+    olsr_cleanup_duplicates(&originator);
+
+    olsr_delete_tc_entry(tc);
   }
   /* Forward the message */
   return true;