kill all nbr2 references prior to removing a nbr2
authorHannes Gredler <hannes@gredler.at>
Wed, 27 May 2009 14:15:20 +0000 (16:15 +0200)
committerHannes Gredler <hannes@gredler.at>
Wed, 27 May 2009 14:15:20 +0000 (16:15 +0200)
src/neighbor_table.c
src/neighbor_table.h
src/two_hop_neighbor_table.c

index c68b4d8..22dc8ab 100644 (file)
@@ -129,7 +129,7 @@ olsr_add_nbr2_list_entry(struct nbr_entry *nbr, struct nbr2_entry *nbr2, float v
 /**
  * Unlink, delete and free a nbr2_list entry.
  */
-static void
+void
 olsr_delete_nbr2_list_entry(struct nbr2_list_entry *nbr2_list)
 {
   struct nbr2_entry *nbr2;
@@ -158,30 +158,6 @@ olsr_delete_nbr2_list_entry(struct nbr2_list_entry *nbr2_list)
   changes_topology = true;
 }
 
-/**
- * Delete a two hop neighbor from a neighbors two hop neighbor list.
- *
- * @param neighbor the neighbor to delete the two hop neighbor from.
- * @param address the IP address of the two hop neighbor to delete.
- *
- * @return positive if entry deleted
- */
-bool
-olsr_delete_nbr2_list_entry_by_addr(struct nbr_entry *nbr, union olsr_ip_addr *addr)
-{
-  struct nbr2_list_entry *nbr2_list;
-
-  nbr2_list = olsr_lookup_nbr2_list_entry(nbr, addr);
-
-  if (nbr2_list) {
-    olsr_delete_nbr2_list_entry(nbr2_list);
-    return true;
-  }
-
-  return false;
-}
-
-
 /**
  * Check if a two hop neighbor is reachable via a given
  * neighbor.
index 112576e..c2ecdce 100644 (file)
@@ -111,9 +111,9 @@ extern struct avl_tree EXPORT(nbr_tree);
 extern struct olsr_cookie_info *nbr2_list_timer_cookie;
 
 void olsr_init_neighbor_table(void);
-bool olsr_delete_nbr2_list_entry_by_addr(struct nbr_entry *, union olsr_ip_addr *);
 struct nbr2_list_entry *olsr_lookup_nbr2_list_entry(struct nbr_entry *, const union olsr_ip_addr *);
 struct nbr2_list_entry *olsr_add_nbr2_list_entry(struct nbr_entry *, struct nbr2_entry *, float);
+void olsr_delete_nbr2_list_entry(struct nbr2_list_entry *);
 bool olsr_delete_nbr_entry(const union olsr_ip_addr *);
 void olsr_link_nbr_nbr2(struct nbr_entry *, struct nbr2_entry *, float);
 struct nbr_entry *olsr_add_nbr_entry(const union olsr_ip_addr *);
index 56bc163..db99994 100644 (file)
@@ -132,26 +132,35 @@ olsr_delete_neighbor_pointer(struct nbr2_entry *two_hop_entry, struct nbr_entry
  *@return nada
  */
 void
-olsr_delete_two_hop_neighbor_table(struct nbr2_entry *two_hop_neighbor)
+olsr_delete_two_hop_neighbor_table(struct nbr2_entry *nbr2)
 {
-  struct nbr_list_entry *one_hop_list;
-
-  one_hop_list = two_hop_neighbor->nbr2_nblist.next;
+  struct nbr_entry *nbr;
+  struct nbr_list_entry *nbr_list;
+  struct nbr2_list_entry *nbr2_list;
 
-  /* Delete one hop links */
-  while (one_hop_list != &two_hop_neighbor->nbr2_nblist) {
-    struct nbr_entry *one_hop_entry = one_hop_list->neighbor;
-    struct nbr_list_entry *entry_to_delete = one_hop_list;
+  /*
+   * Kill all references to this nbr2.
+   */
+  OLSR_FOR_ALL_NBR_ENTRIES(nbr) {
+    OLSR_FOR_ALL_NBR2_LIST_ENTRIES(nbr, nbr2_list) {
+      if (nbr2_list->nbr2 == nbr2) {
+        olsr_delete_nbr2_list_entry(nbr2_list);
+        break;
+      }
+    } OLSR_FOR_ALL_NBR2_LIST_ENTRIES_END(nbr, nbr2_list)
+  } OLSR_FOR_ALL_NBR_ENTRIES_END(nbr);
 
-    olsr_delete_nbr2_list_entry_by_addr(one_hop_entry, &two_hop_neighbor->nbr2_addr);
-    one_hop_list = one_hop_list->next;
-    /* no need to dequeue */
-    free(entry_to_delete);
+  /*
+   * Delete all the one hop backlinks hanging off this nbr2
+   */
+  while (nbr2->nbr2_nblist.next != &nbr2->nbr2_nblist) {
+    nbr_list = nbr2->nbr2_nblist.next; 
+    DEQUEUE_ELEM(nbr_list);
+    free(nbr_list);
   }
 
-  /* dequeue */
-  DEQUEUE_ELEM(two_hop_neighbor);
-  free(two_hop_neighbor);
+  DEQUEUE_ELEM(nbr2);
+  free(nbr2);
 }
 
 /**