The TC entry is the hookup point for all sort of leaf information of the link-state...
authorHannes Gredler <hannes@gredler.at>
Thu, 7 May 2009 11:19:20 +0000 (13:19 +0200)
committerHannes Gredler <hannes@gredler.at>
Thu, 7 May 2009 11:19:20 +0000 (13:19 +0200)
Clean up the house - flush all MID aliases and HNA nets when a TC entry is expiring.

src/hna_set.c
src/hna_set.h
src/mid_set.c
src/mid_set.h
src/tc_set.c

index edf5f54..17b92e1 100644 (file)
@@ -140,6 +140,21 @@ olsr_delete_hna_net(struct hna_net *hna_net)
   olsr_cookie_free(hna_net_mem_cookie, hna_net);
 }
 
+/**
+ * Delete all the HNA nets hanging off a tc entry.
+ *
+ * @param entry the tc entry holding the HNA networks.
+ */
+void
+olsr_flush_hna_nets(struct tc_entry *tc)
+{
+  struct hna_net *hna_net;
+
+  OLSR_FOR_ALL_TC_HNA_ENTRIES(tc, hna_net) {
+    olsr_delete_hna_net(hna_net);
+  } OLSR_FOR_ALL_TC_HNA_ENTRIES_END(tc, hna_net);
+}
+
 /**
  * Callback for the hna_net timer.
  */
index abf9524..a336a2e 100644 (file)
@@ -71,6 +71,7 @@ AVLNODE2STRUCT(hna_tc_tree2hna, struct hna_net, hna_tc_node);
 bool olsr_input_hna(union olsr_message *, struct interface *, union olsr_ip_addr *);
 
 void olsr_init_hna_set(void);
+void olsr_flush_hna_nets(struct tc_entry *tc);
 void olsr_print_hna_set(void);
 
 #endif
index b02436b..d3189b5 100644 (file)
@@ -56,7 +56,6 @@
 
 static struct mid_entry *olsr_lookup_mid_entry(const union olsr_ip_addr *);
 static void olsr_prune_mid_entries(const union olsr_ip_addr *main_addr, uint16_t mid_seqno);
-static void olsr_flush_mid_entries(struct tc_entry *);
 
 /* Root of the MID tree */
 struct avl_tree mid_tree;
@@ -253,6 +252,7 @@ olsr_insert_mid_entry(const union olsr_ip_addr *main_addr,
    * Add a rt_path for the alias.
    */
   olsr_insert_routing_table(&alias->mid_alias_addr, 8 * olsr_cnf->ipsize, main_addr, OLSR_RT_ORIGIN_MID);
+
   /*
    * Start the timer. Because we provide the TC reference
    * as callback data for the timer we need to lock
@@ -282,6 +282,7 @@ olsr_update_mid_entry(const union olsr_ip_addr *main_addr,
                       const union olsr_ip_addr *alias_addr, olsr_reltime vtime, uint16_t mid_seqno)
 {
   struct mid_entry *alias;
+
   if (!olsr_validate_address(alias_addr)) {
     return;
   }
@@ -397,7 +398,7 @@ olsr_delete_mid_entry(struct mid_entry *alias)
  *
  * @param entry the tc entry holding the aliases.
  */
-static void
+void
 olsr_flush_mid_entries(struct tc_entry *tc)
 {
   struct mid_entry *alias;
index ce0dfef..1a9bf54 100644 (file)
@@ -83,6 +83,7 @@ bool olsr_input_mid(union olsr_message *, struct interface *, union olsr_ip_addr
 
 void olsr_init_mid_set(void);
 void olsr_delete_mid_entry(struct mid_entry *);
+void olsr_flush_mid_entries(struct tc_entry *);
 union olsr_ip_addr *EXPORT(olsr_lookup_main_addr_by_alias) (const union olsr_ip_addr *);
 struct mid_entry *olsr_lookup_tc_mid_entry(struct tc_entry *, const union olsr_ip_addr *);
 void olsr_print_mid_set(void);
index 1383dc0..3950851 100644 (file)
@@ -44,6 +44,7 @@
 #include "lq_packet.h"
 #include "net_olsr.h"
 #include "link_set.h"
+#include "mid_set.h"
 #include "neighbor_table.h"
 #include "olsr_logging.h"
 
@@ -275,13 +276,17 @@ olsr_delete_tc_entry(struct tc_entry *tc)
     olsr_delete_rt_path(rtp);
   } OLSR_FOR_ALL_PREFIX_ENTRIES_END(tc, rtp);
 
+  /* Flush all MID aliases and kill the MID timer */
+  olsr_flush_mid_entries(tc);
+
+  /* Flush all HNA Networks and kill its timers */
+  olsr_flush_hna_nets(tc);
+
   /* Stop running timers */
   olsr_stop_timer(tc->edge_gc_timer);
   tc->edge_gc_timer = NULL;
   olsr_stop_timer(tc->validity_timer);
   tc->validity_timer = NULL;
-  olsr_stop_timer(tc->mid_timer);
-  tc->mid_timer = NULL;
 
   avl_delete(&tc_tree, &tc->vertex_node);
   olsr_unlock_tc_entry(tc);