Squashed commit of the following:
authorHenning Rogge <hrogge@googlemail.com>
Sun, 11 Jul 2010 10:45:35 +0000 (12:45 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Sun, 11 Jul 2010 10:45:35 +0000 (12:45 +0200)
commit cd79c151eb821c3b6a6375a55d4799805cd16fc7
Author: Henning Rogge <hrogge@googlemail.com>
Date:   Sun Jul 11 11:32:53 2010 +0200

    Convert the rest of OLSRd to the new list api and remove the old one

commit 639a5657873c2ad6036c3b6506f5dc04f733e7eb
Author: Henning Rogge <hrogge@googlemail.com>
Date:   Sun Jul 11 10:06:50 2010 +0200

    Move rt_entry list to new api

commit b736d10a584a87179fa621a82b98c7a81130c1c0
Author: Henning Rogge <hrogge@googlemail.com>
Date:   Sun Jul 11 09:58:44 2010 +0200

    Convert scheduler to new list api

commit 39c5169e605d84f360d72c6c043fa9a46b580a28
Author: Henning Rogge <hrogge@googlemail.com>
Date:   Sun Jul 11 09:42:13 2010 +0200

    Convert path_list in tc to new list

commit 49dd4b9fd08ad15b3a85b8bb4c78e1b88bb3a70d
Author: Henning Rogge <hrogge@googlemail.com>
Date:   Sun Jul 11 09:17:41 2010 +0200

    Move old list into listold_ namespace
    Convert link_set and ipprefix_list to new list library

52 files changed:
lib/bmf/src/NetworkInterfaces.c
lib/cl_roam/src/cl_roam.c
lib/debuginfo/src/olsrd_debuginfo.c
lib/dot_draw/src/olsrd_dot_draw.c
lib/dyn_gw/src/olsrd_dyn_gw.c
lib/httpinfo/src/olsrd_httpinfo.c
lib/lq_etx_ff/src/lq_plugin_etx_ff.c
lib/mdns/src/mdns.c
lib/nameservice/src/mapwrite.c
lib/nameservice/src/nameservice.c
lib/nameservice/src/nameservice.h
lib/obamp/src/list.h [deleted file]
lib/obamp/src/obamp.c
lib/obamp/src/obamp.h
lib/obamp/src/olsrd_plugin.c
lib/quagga/patches/quagga-0.98.6.diff
lib/txtinfo/src/olsrd_txtinfo.c
src/common/avl.h
src/common/container_of.h [new file with mode: 0644]
src/common/list.h
src/defs.h
src/hna_set.c
src/interfaces.c
src/interfaces.h
src/link_set.c
src/link_set.h
src/linux/net.c
src/lq_mpr.c
src/mid_set.c
src/neighbor_table.h
src/olsr.c
src/olsr_cfg.c
src/olsr_cfg.h
src/olsr_cfg_gen.c
src/olsr_comport.c
src/olsr_comport.h
src/olsr_comport_txt.c
src/olsr_cookie.c
src/olsr_cookie.h
src/olsr_ip_acl.c
src/olsr_ip_acl.h
src/olsr_ip_prefix_list.c
src/olsr_ip_prefix_list.h
src/olsr_spf.c
src/process_routes.c
src/routing_table.h
src/scheduler.c
src/scheduler.h
src/tc_set.c
src/tc_set.h
src/unix/ifnet.c
src/win32/ifnet.c

index 469916a..e352129 100644 (file)
@@ -388,6 +388,7 @@ FindNeighbors(struct TBestNeighbors *neighbors,
               union olsr_ip_addr *source, union olsr_ip_addr *forwardedBy, union olsr_ip_addr *forwardedTo, int *nPossibleNeighbors)
 {
   struct link_entry *walker;
+  struct list_iterator iterator;
   olsr_linkcost previousLinkEtx = LINK_COST_BROKEN;
   olsr_linkcost bestEtx = LINK_COST_BROKEN;
 
@@ -408,7 +409,7 @@ FindNeighbors(struct TBestNeighbors *neighbors,
     }
   }
 
-  OLSR_FOR_ALL_LINK_ENTRIES(walker) {
+  OLSR_FOR_ALL_LINK_ENTRIES(walker, iterator) {
 #if !defined REMOVE_LOG_DEBUG
     struct ipaddr_str buf;
 #endif
@@ -555,7 +556,6 @@ FindNeighbors(struct TBestNeighbors *neighbors,
 
     *nPossibleNeighbors += 1;
   }
-  OLSR_FOR_ALL_LINK_ENTRIES_END(walker);
 
   /* Display the result of the neighbor search */
   if (*nPossibleNeighbors == 0) {
index 7b9eb88..63cc648 100644 (file)
@@ -693,6 +693,7 @@ static void* check_neighbour_host(void* neighbour) {
 
 static void spread_host(struct guest_client * host) {
   struct interface *ifp;
+  struct list_iterator iterator;
   uint8_t msg_buffer[MAXMESSAGESIZE - OLSR_HEADERSIZE] __attribute__ ((aligned));
   uint8_t *curr = msg_buffer;
   uint8_t *length_field, *last;
@@ -725,23 +726,22 @@ static void spread_host(struct guest_client * host) {
   //Put in Message size
   pkt_put_u16(&length_field, curr - msg_buffer);
 
-  OLSR_FOR_ALL_INTERFACES(ifp)
-        {
-          if (net_outbuffer_bytes_left(ifp) < curr - msg_buffer) {
-            net_output(ifp);
-            set_buffer_timer(ifp);
-          }
-          // buffer gets pushed out in single_hna, or at flush-time
-          net_outbuffer_push(ifp, msg_buffer, curr - msg_buffer);
-        }OLSR_FOR_ALL_INTERFACES_END(ifp)
+  OLSR_FOR_ALL_INTERFACES(ifp, iterator) {
+    if (net_outbuffer_bytes_left(ifp) < curr - msg_buffer) {
+      net_output(ifp);
+      set_buffer_timer(ifp);
+    }
+    // buffer gets pushed out in single_hna, or at flush-time
+    net_outbuffer_push(ifp, msg_buffer, curr - msg_buffer);
+  }
 
 }
 
 // sends packet immedeately!
 void single_hna(union olsr_ip_addr * ip, uint32_t vtime) {
-
   union olsr_ip_addr subnet;
   struct interface *ifp;
+  struct list_iterator iterator;
   uint8_t msg_buffer[MAXMESSAGESIZE - OLSR_HEADERSIZE] __attribute__ ((aligned));
   uint8_t *curr = msg_buffer;
   uint8_t *length_field, *last;
@@ -772,13 +772,12 @@ void single_hna(union olsr_ip_addr * ip, uint32_t vtime) {
 
   pkt_put_u16(&length_field, curr - msg_buffer);
 
-  OLSR_FOR_ALL_INTERFACES(ifp)
-        {
-          net_output(ifp);
-          net_outbuffer_push(ifp, msg_buffer, curr - msg_buffer);
-          net_output(ifp);
-          set_buffer_timer(ifp);
-        }OLSR_FOR_ALL_INTERFACES_END(ifp)
+  OLSR_FOR_ALL_INTERFACES(ifp, iterator) {
+    net_output(ifp);
+    net_outbuffer_push(ifp, msg_buffer, curr - msg_buffer);
+    net_output(ifp);
+    set_buffer_timer(ifp);
+  }
 }
 
 static void olsr_event1(void *foo __attribute__ ((unused)) ) {
index 0c0eaef..e151b60 100644 (file)
@@ -42,6 +42,9 @@
 /*
  * Dynamic linked library for the olsr.org olsr daemon
  */
+
+#include <stdlib.h>
+
 #include "olsr.h"
 #include "ipcalc.h"
 #include "neighbor_table.h"
index 3d28bc1..8b905eb 100644 (file)
@@ -264,6 +264,7 @@ pcf_event(int ipc_connection, int chgs_neighborhood, int chgs_topology, int chgs
     struct nbr_entry *neighbor_table_tmp;
     struct tc_entry *tc;
     struct ip_prefix_entry *hna;
+    struct list_iterator iterator;
 
     /* Print tables to IPC socket */
     ipc_send_str(ipc_connection, "digraph topology\n{\n");
@@ -296,9 +297,9 @@ pcf_event(int ipc_connection, int chgs_neighborhood, int chgs_topology, int chgs
     OLSR_FOR_ALL_TC_ENTRIES_END(tc);
 
     /* Local HNA entries */
-    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna) {
+    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna, iterator) {
       ipc_print_net(ipc_connection, &olsr_cnf->router_id, &hna->net);
-    } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
+    }
       ipc_send_str(ipc_connection, "}\n\n");
 
     res = 1;
index a496463..caf7297 100644 (file)
@@ -53,6 +53,7 @@
 #include "olsr_ip_prefix_list.h"
 #include "olsr_logging.h"
 
+#include <stdlib.h>
 #include <net/route.h>
 #include <arpa/inet.h>
 #ifdef linux
@@ -391,7 +392,7 @@ add_to_ping_list(const char *ping_address, struct ping_list *the_ping_list)
 
 
 static struct hna_list *
-add_to_hna_list(struct hna_list *list_root, union olsr_ip_addr *hna_net, uint8_t hna_prefixlen)
+add_to_hna_list(struct hna_list *listold_root, union olsr_ip_addr *hna_net, uint8_t hna_prefixlen)
 {
   struct hna_list *new = olsr_malloc(sizeof(struct hna_list), "hna list");
   //memcpy(&new->hna_net,hna_net,sizeof(union hna_net));
@@ -401,7 +402,7 @@ add_to_hna_list(struct hna_list *list_root, union olsr_ip_addr *hna_net, uint8_t
   new->hna_added = 0;
   new->probe_ok = 0;
   new->ping_hosts = NULL;
-  new->next = list_root;
+  new->next = listold_root;
   return new;
 }
 
index 205b129..a3bd321 100644 (file)
@@ -911,11 +911,13 @@ build_config_body(struct autobuf *abuf)
   section_title(abuf, "Announced HNA entries");
   if (list_is_empty(&olsr_cnf->hna_entries)) {
     struct ip_prefix_entry *hna;
+    struct list_iterator iterator;
+
     abuf_puts(abuf, "<tr><th>Network</th></tr>\n");
-    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna) {
+    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna, iterator) {
       struct ipprefix_str netbuf;
       abuf_appendf(abuf, "<tr><td>%s</td></tr>\n", olsr_ip_prefix_to_string(&netbuf, &hna->net));
-    } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
+    }
   } else {
     abuf_puts(abuf, "<tr><td></td></tr>\n");
   }
@@ -927,6 +929,7 @@ build_neigh_body(struct autobuf *abuf)
 {
   struct nbr_entry *neigh;
   struct link_entry *lnk;
+  struct list_iterator iterator;
   size_t i;
   const char *colspan = resolve_ip_addresses ? " colspan=\"2\"" : "";
 
@@ -940,7 +943,7 @@ build_neigh_body(struct autobuf *abuf)
   abuf_puts(abuf, "</tr>\n");
 
   /* Link set */
-  OLSR_FOR_ALL_LINK_ENTRIES(lnk) {
+  OLSR_FOR_ALL_LINK_ENTRIES(lnk, iterator) {
     char lqbuffer[LQTEXT_MAXLENGTH];
     abuf_puts(abuf, "<tr>");
     build_ipaddr_with_link(abuf, &lnk->local_iface_addr, -1);
@@ -951,7 +954,7 @@ build_neigh_body(struct autobuf *abuf)
     }
     abuf_appendf(abuf, "<td>%s</td>", olsr_get_linkcost_text(lnk->linkcost, false, lqbuffer, sizeof(lqbuffer)));
     abuf_puts(abuf, "</tr>\n");
-  } OLSR_FOR_ALL_LINK_ENTRIES_END(lnk);
+  }
 
   abuf_puts(abuf, "</table>\n");
 
index 1eaa43c..0b803aa 100644 (file)
@@ -196,9 +196,10 @@ static void
 lq_etxff_timer(void __attribute__ ((unused)) * context)
 {
   struct link_entry *link;
+  struct list_iterator iterator;
   struct nbr_entry *nbr;
 
-  OLSR_FOR_ALL_LINK_ENTRIES(link) {
+  OLSR_FOR_ALL_LINK_ENTRIES(link, iterator) {
     struct lq_etxff_link_entry *lq_link;
     uint32_t ratio;
     uint16_t i, received, lost;
@@ -256,7 +257,6 @@ lq_etxff_timer(void __attribute__ ((unused)) * context)
     /* update linkcost */
     link->linkcost = lq_etxff_calc_link_entry_cost(link);
   }
-  OLSR_FOR_ALL_LINK_ENTRIES_END(link);
 
   OLSR_FOR_ALL_NBR_ENTRIES(nbr) {
     olsr_neighbor_cost_may_changed(nbr);
index 02b31cb..50a93ca 100644 (file)
@@ -183,6 +183,7 @@ olsr_mdns_gen(unsigned char *packet, int len)
   int aligned_size;
   struct olsr_message msg;
   struct interface *ifn;
+  struct list_iterator iterator;
   uint8_t *sizeptr, *curr;
   
   aligned_size=len;
@@ -217,7 +218,7 @@ olsr_mdns_gen(unsigned char *packet, int len)
   }
 
   /* looping trough interfaces */
-  OLSR_FOR_ALL_INTERFACES(ifn) {
+  OLSR_FOR_ALL_INTERFACES(ifn, iterator) {
     //OLSR_PRINTF(1, "MDNS PLUGIN: Generating packet - [%s]\n", ifn->int_name);
 
     if (net_outbuffer_push(ifn, buffer, aligned_size) != aligned_size) {
@@ -228,7 +229,6 @@ olsr_mdns_gen(unsigned char *packet, int len)
       }
     }
   }
-  OLSR_FOR_ALL_INTERFACES_END(ifn);
 }
 
 /* -------------------------------------------------------------------------
index 67f74b5..15737f4 100644 (file)
@@ -69,7 +69,7 @@ lookup_position_latlon(union olsr_ip_addr *ip)
 {
   int hash;
   struct db_entry *entry;
-  struct list_node *list_head, *list_node;
+  struct list_entity *list_head, *loop;
 
   if (olsr_ipcmp(ip, &olsr_cnf->router_id) == 0) {
     return my_latlon_str;
@@ -77,10 +77,8 @@ lookup_position_latlon(union olsr_ip_addr *ip)
 
   for (hash = 0; hash < HASHSIZE; hash++) {
     list_head = &latlon_list[hash];
-    for (list_node = list_head->next; list_node != list_head; list_node = list_node->next) {
-
-      entry = list2db(list_node);
 
+    list_for_each_element(list_head, entry, db_list, loop) {
       if (entry->names && olsr_ipcmp(&entry->originator, ip) == 0) {
         return entry->names->name;
       }
@@ -146,13 +144,10 @@ mapwrite_work(FILE * fmap)
   }
   for (hash = 0; hash < HASHSIZE; hash++) {
     struct db_entry *entry;
-    struct list_node *list_head, *list_node;
+    struct list_entity *list_head, *loop;
 
     list_head = &latlon_list[hash];
-    for (list_node = list_head->next; list_node != list_head; list_node = list_node->next) {
-
-      entry = list2db(list_node);
-
+    list_for_each_element(list_head, entry, db_list, loop) {
       if (NULL != entry->names) {
         if (0 > fprintf(fmap, "Node('%s',%s,'%s','%s');\n",
                         olsr_ip_to_string(&strbuf1, &entry->originator),
index be90a87..7bb4d80 100644 (file)
@@ -105,23 +105,23 @@ struct olsr_cookie_info *map_poll_timer_cookie;
  * my own hostnames, service_lines and dns-servers
  * are store in a linked list (without hashing)
  * */
-static struct list_node name_list[HASHSIZE];
+static struct list_entity name_list[HASHSIZE];
 struct name_entry *my_names = NULL;
 static bool name_table_changed = true;
 
-static struct list_node service_list[HASHSIZE];
+static struct list_entity service_list[HASHSIZE];
 static struct name_entry *my_services = NULL;
 static bool service_table_changed = true;
 
-static struct list_node mac_list[HASHSIZE];
+static struct list_entity mac_list[HASHSIZE];
 static struct name_entry *my_macs = NULL;
 static bool mac_table_changed = true;
 
-static struct list_node forwarder_list[HASHSIZE];
+static struct list_entity forwarder_list[HASHSIZE];
 static struct name_entry *my_forwarders = NULL;
 static bool forwarder_table_changed = true;
 
-struct list_node latlon_list[HASHSIZE];
+struct list_entity latlon_list[HASHSIZE];
 static bool latlon_table_changed = true;
 
 /* backoff timer for writing changes into a file */
@@ -192,11 +192,11 @@ name_constructor(void)
 
   /* init the lists heads */
   for (i = 0; i < HASHSIZE; i++) {
-    list_head_init(&name_list[i]);
-    list_head_init(&forwarder_list[i]);
-    list_head_init(&service_list[i]);
-    list_head_init(&mac_list[i]);
-    list_head_init(&latlon_list[i]);
+    list_init_head(&name_list[i]);
+    list_init_head(&forwarder_list[i]);
+    list_init_head(&service_list[i]);
+    list_init_head(&mac_list[i]);
+    list_init_head(&latlon_list[i]);
   }
 
   msg_gen_timer_cookie = olsr_alloc_cookie("Nameservice: message gen", OLSR_COOKIE_TYPE_TIMER);
@@ -502,11 +502,11 @@ name_destructor(void)
   free_name_entry_list(&my_macs);
   free_name_entry_list(&my_forwarders);
 
-  free_all_list_entries(name_list);
-  free_all_list_entries(service_list);
-  free_all_list_entries(mac_list);
-  free_all_list_entries(forwarder_list);
-  free_all_list_entries(latlon_list);
+  free_all_listold_entries(name_list);
+  free_all_listold_entries(service_list);
+  free_all_listold_entries(mac_list);
+  free_all_listold_entries(forwarder_list);
+  free_all_listold_entries(latlon_list);
 
   olsr_stop_timer(write_file_timer);
   write_file_timer = NULL;
@@ -520,23 +520,17 @@ name_destructor(void)
 
 /* free all list entries */
 void
-free_all_list_entries(struct list_node *this_db_list)
+free_all_listold_entries(struct list_entity *this_db_list)
 {
   struct db_entry *db;
-  struct list_node *list_head, *list_node, *list_node_next;
+  struct list_entity *list_head, *loop, *safe;
 
   int i;
 
   for (i = 0; i < HASHSIZE; i++) {
-
     list_head = &this_db_list[i];
 
-    for (list_node = list_head->next; list_node != list_head; list_node = list_node_next) {
-
-      /* prefetch next node before loosing context */
-      list_node_next = list_node->next;
-
-      db = list2db(list_node);
+    list_for_each_element_safe(list_head, db, db_list, loop, safe) {
       olsr_namesvc_delete_db_entry(db);
     }
   }
@@ -619,6 +613,7 @@ olsr_namesvc_gen(void *foo __attribute__ ((unused)))
   uint8_t buffer[10240];
   struct olsr_message msg;
   struct interface *ifn;
+  struct list_iterator iterator;
   int namesize;
   uint8_t *curr, *sizeptr;
 
@@ -639,7 +634,7 @@ olsr_namesvc_gen(void *foo __attribute__ ((unused)))
   pkt_put_u16(&sizeptr, namesize);
 
   /* looping trough interfaces */
-  OLSR_FOR_ALL_INTERFACES(ifn) {
+  OLSR_FOR_ALL_INTERFACES(ifn, iterator) {
     OLSR_DEBUG(LOG_PLUGINS, "NAME PLUGIN: Generating packet - [%s]\n", ifn->int_name);
 
     if (net_outbuffer_push(ifn, buffer, namesize) != namesize) {
@@ -650,7 +645,6 @@ olsr_namesvc_gen(void *foo __attribute__ ((unused)))
       }
     }
   }
-  OLSR_FOR_ALL_INTERFACES_END(ifn);
 }
 
 
@@ -934,11 +928,11 @@ update_name_entry(union olsr_ip_addr *originator, const struct namemsg *msg, con
  */
 void
 insert_new_name_in_list(union olsr_ip_addr *originator,
-                        struct list_node *this_list, const struct name *from_packet, bool * this_table_changed, uint32_t vtime)
+                        struct list_entity *this_list, const struct name *from_packet, bool * this_table_changed, uint32_t vtime)
 {
   int hash;
   struct db_entry *entry;
-  struct list_node *list_head, *list_node;
+  struct list_entity *list_head, *loop;
 
   bool entry_found = false;
 
@@ -946,10 +940,8 @@ insert_new_name_in_list(union olsr_ip_addr *originator,
 
   /* find the entry for originator, if there is already one */
   list_head = &this_list[hash];
-  for (list_node = list_head->next; list_node != list_head; list_node = list_node->next) {
-
-    entry = list2db(list_node);
 
+  list_for_each_element(list_head, entry, db_list, loop) {
     if (olsr_ipcmp(originator, &entry->originator) == 0) {
 #if !defined REMOVE_LOG_DEBUG
       struct ipaddr_str strbuf;
@@ -985,7 +977,7 @@ insert_new_name_in_list(union olsr_ip_addr *originator,
     entry->names = NULL;
 
     /* insert to the list */
-    list_add_before(&this_list[hash], &entry->db_list);
+    list_add_tail(&this_list[hash], &entry->db_list);
 
     //delegate to function for parsing the packet and linking it to entry->names
     decap_namemsg(from_packet, &entry->names, this_table_changed);
@@ -1047,7 +1039,7 @@ write_hosts_file(void)
   int hash;
   struct name_entry *name;
   struct db_entry *entry;
-  struct list_node *list_head, *list_node;
+  struct list_entity *list_head, *loop;
   FILE *hosts;
   FILE *add_hosts;
   int c = 0;
@@ -1097,10 +1089,8 @@ write_hosts_file(void)
   // write received names
   for (hash = 0; hash < HASHSIZE; hash++) {
     list_head = &name_list[hash];
-    for (list_node = list_head->next; list_node != list_head; list_node = list_node->next) {
-
-      entry = list2db(list_node);
 
+    list_for_each_element(list_head, entry, db_list, loop) {
       for (name = entry->names; name != NULL; name = name->next) {
         struct ipaddr_str strbuf;
         OLSR_DEBUG(LOG_PLUGINS, "%s\t%s%s\t#%s\n",
@@ -1178,7 +1168,7 @@ write_services_file(bool writemacs)
   int hash;
   struct name_entry *name;
   struct db_entry *entry;
-  struct list_node *list_head, *list_node;
+  struct list_entity *list_head, *loop;
   FILE *file;
   time_t currtime;
 
@@ -1206,10 +1196,8 @@ write_services_file(bool writemacs)
   // write received services or macs
   for (hash = 0; hash < HASHSIZE; hash++) {
     list_head = writemacs ? &mac_list[hash] : &service_list[hash];
-    for (list_node = list_head->next; list_node != list_head; list_node = list_node->next) {
-
-      entry = list2db(list_node);
 
+    list_for_each_element(list_head, entry, db_list, loop) {
       for (name = entry->names; name != NULL; name = name->next) {
         struct ipaddr_str strbuf;
         OLSR_DEBUG(LOG_PLUGINS, "%s\t\t#%s\n", name->name, olsr_ip_to_string(&strbuf, &entry->originator));
@@ -1299,7 +1287,7 @@ write_resolv_file(void)
   int hash;
   struct name_entry *name;
   struct db_entry *entry;
-  struct list_node *list_head, *list_node;
+  struct list_entity *list_head, *loop;
   struct rt_entry *route;
   static struct rt_entry *nameserver_routes[NAMESERVER_COUNT + 1];
   FILE *resolv;
@@ -1314,10 +1302,8 @@ write_resolv_file(void)
 
   for (hash = 0; hash < HASHSIZE; hash++) {
     list_head = &forwarder_list[hash];
-    for (list_node = list_head->next; list_node != list_head; list_node = list_node->next) {
-
-      entry = list2db(list_node);
 
+    list_for_each_element(list_head, entry, db_list, loop) {
       for (name = entry->names; name != NULL; name = name->next) {
 #if !defined REMOVE_LOG_DEBUG
         struct ipaddr_str strbuf;
@@ -1430,6 +1416,7 @@ bool
 allowed_ip(const union olsr_ip_addr *addr)
 {
   struct ip_prefix_entry *hna;
+  struct list_iterator iterator;
   struct interface *iface;
   union olsr_ip_addr tmp_ip, tmp_msk;
 #if !defined REMOVE_LOG_DEBUG
@@ -1438,17 +1425,16 @@ allowed_ip(const union olsr_ip_addr *addr)
 #endif
   OLSR_DEBUG(LOG_PLUGINS, "checking %s\n", olsr_ip_to_string(&strbuf, addr));
 
-  OLSR_FOR_ALL_INTERFACES(iface) {
+  OLSR_FOR_ALL_INTERFACES(iface, iterator) {
     OLSR_DEBUG(LOG_PLUGINS, "interface %s\n", olsr_ip_to_string(&strbuf, &iface->ip_addr));
     if (olsr_ipcmp(&iface->ip_addr, addr) == 0) {
       OLSR_DEBUG(LOG_PLUGINS, "MATCHED\n");
       return true;
     }
   }
-  OLSR_FOR_ALL_INTERFACES_END(iface);
 
   if (olsr_cnf->ip_version == AF_INET) {
-    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna) {
+    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna, iterator) {
       union olsr_ip_addr netmask;
       OLSR_DEBUG(LOG_PLUGINS, "HNA %s\n", olsr_ip_prefix_to_string(&prefixstr, &hna->net));
       if (hna->net.prefix_len == 0) {
@@ -1460,9 +1446,8 @@ allowed_ip(const union olsr_ip_addr *addr)
         return true;
       }
     }
-    OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
   } else {
-    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna) {
+    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna, iterator) {
       unsigned int i;
       OLSR_DEBUG(LOG_PLUGINS, "HNA %s\n", olsr_ip_prefix_to_string(&prefixstr, &hna->net));
       if (hna->net.prefix_len == 0)
@@ -1476,7 +1461,6 @@ allowed_ip(const union olsr_ip_addr *addr)
         return true;
       }
     }
-    OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
   }
   return false;
 }
@@ -1602,13 +1586,14 @@ bool
 get_isdefhna_latlon(void)
 {
   struct ip_prefix_entry *hna;
-  OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna) {
+  struct list_iterator iterator;
+
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna, iterator) {
     if (hna->net.prefix_len == 0) {
       return true;
     }
   }
-  OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
-    return false;
+  return false;
 }
 
 /**
@@ -1638,15 +1623,13 @@ lookup_name_latlon(union olsr_ip_addr *ip)
 {
   int hash;
   struct db_entry *entry;
-  struct list_node *list_head, *list_node;
+  struct list_entity *list_head, *loop;
   struct name_entry *name;
 
   for (hash = 0; hash < HASHSIZE; hash++) {
     list_head = &name_list[hash];
-    for (list_node = list_head->next; list_node != list_head; list_node = list_node->next) {
-
-      entry = list2db(list_node);
 
+    list_for_each_element(list_head, entry, db_list, loop) {
       for (name = entry->names; name != NULL; name = name->next) {
         if (olsr_ipcmp(&name->ip, ip) == 0)
           return name->name;
index db46414..f7b51a2 100644 (file)
@@ -112,16 +112,14 @@ struct db_entry {
   union olsr_ip_addr originator;       /* IP address of the node this entry describes */
   struct timer_entry *db_timer;        /* Validity time */
   struct name_entry *names;            /* list of names this originator declares */
-  struct list_node db_list;            /* linked list of db entries per hash container */
+  struct list_entity db_list;            /* linked list of db entries per hash container */
 };
 
-/* inline to recast from db_list back to db_entry */
-LISTNODE2STRUCT(list2db, struct db_entry, db_list);
 
 #define OLSR_NAMESVC_DB_JITTER 5        /* percent */
 
 extern struct name_entry *my_names;
-extern struct list_node latlon_list[HASHSIZE];
+extern struct list_entity latlon_list[HASHSIZE];
 extern float my_lat, my_lon;
 extern struct olsr_cookie_info *map_poll_timer_cookie;
 
@@ -142,13 +140,13 @@ struct name_entry *add_name_to_list(struct name_entry *my_list, const char *valu
 struct name_entry *remove_nonvalid_names_from_list(struct name_entry *my_list, int type);
 
 void
-  free_all_list_entries(struct list_node *);
+  free_all_listold_entries(struct list_entity *);
 
 void
   decap_namemsg(const struct name *from_packet, struct name_entry **to, bool * this_table_changed);
 
 void
-  insert_new_name_in_list(union olsr_ip_addr *, struct list_node *, const struct name *, bool *, uint32_t);
+  insert_new_name_in_list(union olsr_ip_addr *, struct list_entity *, const struct name *, bool *, uint32_t);
 
 bool allowed_hostname_or_ip_in_service(const char *service_line, const regmatch_t * hostname_or_ip);
 
diff --git a/lib/obamp/src/list.h b/lib/obamp/src/list.h
deleted file mode 100644 (file)
index 1a91cac..0000000
+++ /dev/null
@@ -1,307 +0,0 @@
-
-/*
- * The olsr.org Optimized Link-State Routing daemon(olsrd)
- * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in
- *   the documentation and/or other materials provided with the
- *   distribution.
- * * Neither the name of olsr.org, olsrd nor the names of its
- *   contributors may be used to endorse or promote products derived
- *   from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * Visit http://www.olsr.org for more information.
- *
- * If you find this software useful feel free to make a donation
- * to the project. For more information see the website or contact
- * the copyright holders.
- *
- */
-
-//This stuff was from the Kernel, with minor modifications was added here
-
-#ifndef _LINUX_LIST_H
-#define _LINUX_LIST_H
-
-/*
- * XXX: Resolve conflict between this file and <sys/queue.h> on BSD systems.
- */
-#ifdef LIST_HEAD
-#undef LIST_HEAD
-#endif
-
-/*
- * Simple doubly linked list implementation.
- *
- * Some of the internal functions ("__xxx") are useful when
- * manipulating whole lists rather than single entries, as
- * sometimes we already know the next/prev entries and we can
- * generate better code by using them directly rather than
- * using the generic single-entry routines.
- */
-
-struct list_head {
-  struct list_head *next, *prev;
-};
-
-#define LIST_HEAD_INIT(name) { &(name), &(name) }
-
-#define LIST_HEAD(name) \
-       struct list_head name = LIST_HEAD_INIT(name)
-
-#define INIT_LIST_HEAD(ptr) do { \
-       (ptr)->next = (ptr); (ptr)->prev = (ptr); \
-} while (0)
-
-/*
- * Insert a new entry between two known consecutive entries.
- *
- * This is only for internal list manipulation where we know
- * the prev/next entries already!
- */
-static inline void
-__list_add(struct list_head *new, struct list_head *prev, struct list_head *next)
-{
-  next->prev = new;
-  new->next = next;
-  new->prev = prev;
-  prev->next = new;
-}
-
-/**
- * list_add - add a new entry
- * @new: new entry to be added
- * @head: list head to add it after
- *
- * Insert a new entry after the specified head.
- * This is good for implementing stacks.
- */
-static inline void
-list_add(struct list_head *new, struct list_head *head)
-{
-  __list_add(new, head, head->next);
-}
-
-/**
- * list_add_tail - add a new entry
- * @new: new entry to be added
- * @head: list head to add it before
- *
- * Insert a new entry before the specified head.
- * This is useful for implementing queues.
- */
-static inline void
-list_add_tail(struct list_head *new, struct list_head *head)
-{
-  __list_add(new, head->prev, head);
-}
-
-/*
- * Delete a list entry by making the prev/next entries
- * point to each other.
- *
- * This is only for internal list manipulation where we know
- * the prev/next entries already!
- */
-static inline void
-__list_del(struct list_head *prev, struct list_head *next)
-{
-  next->prev = prev;
-  prev->next = next;
-}
-
-/**
- * list_del - deletes entry from list.
- * @entry: the element to delete from the list.
- * Note: list_empty on entry does not return true after this, the entry is in an undefined state.
- */
-static inline void
-list_del(struct list_head *entry)
-{
-  __list_del(entry->prev, entry->next);
-  //entry->next = (void *) 0;
-  //entry->prev = (void *) 0;
-}
-
-/**
- * list_del_init - deletes entry from list and reinitialize it.
- * @entry: the element to delete from the list.
- */
-static inline void
-list_del_init(struct list_head *entry)
-{
-  __list_del(entry->prev, entry->next);
-  INIT_LIST_HEAD(entry);
-}
-
-/**
- * list_move - delete from one list and add as another's head
- * @list: the entry to move
- * @head: the head that will precede our entry
- */
-static inline void
-list_move(struct list_head *list, struct list_head *head)
-{
-  __list_del(list->prev, list->next);
-  list_add(list, head);
-}
-
-/**
- * list_move_tail - delete from one list and add as another's tail
- * @list: the entry to move
- * @head: the head that will follow our entry
- */
-static inline void
-list_move_tail(struct list_head *list, struct list_head *head)
-{
-  __list_del(list->prev, list->next);
-  list_add_tail(list, head);
-}
-
-/**
- * list_empty - tests whether a list is empty
- * @head: the list to test.
- */
-static inline int
-list_empty(struct list_head *head)
-{
-  return head->next == head;
-}
-
-static inline void
-__list_splice(struct list_head *list, struct list_head *head)
-{
-  struct list_head *first = list->next;
-  struct list_head *last = list->prev;
-  struct list_head *at = head->next;
-
-  first->prev = head;
-  head->next = first;
-
-  last->next = at;
-  at->prev = last;
-}
-
-/**
- * list_splice - join two lists
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- */
-static inline void
-list_splice(struct list_head *list, struct list_head *head)
-{
-  if (!list_empty(list))
-    __list_splice(list, head);
-}
-
-/**
- * list_splice_init - join two lists and reinitialise the emptied list.
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- *
- * The list at @list is reinitialised
- */
-static inline void
-list_splice_init(struct list_head *list, struct list_head *head)
-{
-  if (!list_empty(list)) {
-    __list_splice(list, head);
-    INIT_LIST_HEAD(list);
-  }
-}
-
-/**
- * list_entry - get the struct for this entry
- * @ptr:       the &struct list_head pointer.
- * @type:      the type of the struct this is embedded in.
- * @member:    the name of the list_struct within the struct.
- */
-#define list_entry(ptr, type, member) \
-       ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
-
-/**
- * list_for_each       -       iterate over a list
- * @pos:       the &struct list_head to use as a loop counter.
- * @head:      the head for your list.
- */
-#define list_for_each(pos, head) \
-       for (pos = (head)->next; pos != (head); \
-               pos = pos->next)
-
-/**
- * list_for_each_prev  -       iterate over a list backwards
- * @pos:       the &struct list_head to use as a loop counter.
- * @head:      the head for your list.
- */
-#define list_for_each_prev(pos, head) \
-       for (pos = (head)->prev; pos != (head); \
-               pos = pos->prev)
-
-/**
- * list_for_each_safe  -       iterate over a list safe against removal of list entry
- * @pos:       the &struct list_head to use as a loop counter.
- * @n:         another &struct list_head to use as temporary storage
- * @head:      the head for your list.
- */
-#define list_for_each_safe(pos, n, head) \
-       for (pos = (head)->next, n = pos->next; pos != (head); \
-               pos = n, n = pos->next)
-
-/**
- * list_for_each_entry -       iterate over list of given type
- * @pos:       the type * to use as a loop counter.
- * @head:      the head for your list.
- * @member:    the name of the list_struct within the struct.
- */
-#define list_for_each_entry(pos, head, member)                         \
-       for (pos = list_entry((head)->next, typeof(*pos), member);      \
-            &pos->member != (head);                                    \
-            pos = list_entry(pos->member.next, typeof(*pos), member))
-
-/**
- * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry
- * @pos:       the type * to use as a loop counter.
- * @n:         another type * to use as temporary storage
- * @head:      the head for your list.
- * @member:    the name of the list_struct within the struct.
- */
-#define list_for_each_entry_safe(pos, n, head, member)                 \
-       for (pos = list_entry((head)->next, typeof(*pos), member),      \
-               n = list_entry(pos->member.next, typeof(*pos), member); \
-            &pos->member != (head);                                    \
-            pos = n, n = list_entry(n->member.next, typeof(*n), member))
-
-/**
- * list_for_each_entry_continue -       iterate over list of given type
- *                      continuing after existing point
- * @pos:        the type * to use as a loop counter.
- * @head:       the head for your list.
- * @member:     the name of the list_struct within the struct.
- */
-#define list_for_each_entry_continue(pos, head, member)                        \
-       for (pos = list_entry(pos->member.next, typeof(*pos), member);  \
-            &pos->member != (head);                                    \
-            pos = list_entry(pos->member.next, typeof(*pos), member))
-
-#endif
index 286df98..6d0141c 100644 (file)
@@ -53,6 +53,7 @@
 #include <netinet/ip.h>         /* struct ip */
 #include <netinet/udp.h>        /* struct udphdr */
 #include <unistd.h>             /* close() */
+#include <stdlib.h>             /* free() */
 
 #include <netinet/in.h>
 #include <netinet/ip6.h>
 
 /* plugin includes */
 #include "obamp.h"
-#include "list.h"
+#include "common/list.h"
 
 
+#define OLSR_FOR_ALL_OBAMPNODE_ENTRIES(n, iterator) list_for_each_element_safe(&ListOfObampNodes, n, list, iterator.loop, iterator.safe)
+#define OLSR_FOR_ALL_OBAMPSNIFF_ENTRIES(s, iterator) list_for_each_element_safe(&ListOfObampSniffingIf, s, list, iterator.loop, iterator.safe)
+
 struct ObampNodeState *myState;        //Internal state of the OBAMP node
 
 /*
@@ -81,10 +85,10 @@ List of all other OBAMP nodes
 if there is a mesh link the isMesh flag is set to 1
 if the link is used in the distribution tree the isTree flag is set to 1
 */
-struct list_head ListOfObampNodes;
+struct list_entity ListOfObampNodes;
 
 //List of Non OLSR Interfaces to capture and send multicast traffic to
-struct list_head ListOfObampSniffingIf;
+struct list_entity ListOfObampSniffingIf;
 
 //udp socket used for OBAMP signalling
 int sdudp = -1;
@@ -99,20 +103,17 @@ select_tree_anchor(void)
 
   struct ObampNode *tmp;               //temp pointers used when parsing the list
   struct ObampNode *best;
-  struct list_head *pos;
-
+  struct list_iterator iterator;
   struct rt_entry *rt;                 //"rt->rt_best->rtp_metric.cost" is the value you are looking for, a 32 bit
 
   unsigned int mincost = 15;
 
   best = NULL;
 
-  if (list_empty(&ListOfObampNodes) == 0) {     //if the list is NOT empty
+  if (list_is_empty(&ListOfObampNodes) == 0) {     //if the list is NOT empty
 
     //Scroll the list
-    list_for_each(pos, &ListOfObampNodes) {     //loop to update min cost
-
-      tmp = list_entry(pos, struct ObampNode, list);
+    OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
       if (tmp->status == 1) {
         rt = olsr_lookup_routing_table(&tmp->neighbor_ip_addr);
 
@@ -248,17 +249,13 @@ CreateObampSniffingInterfaces(void)
 {
 
   struct ObampSniffingIf *tmp;
-  struct list_head *pos;
-
+  struct list_iterator iterator;
   OLSR_DEBUG(LOG_PLUGINS, "CreateObampSniffingInterfaces");
 
-
-  if (list_empty(&ListOfObampSniffingIf) == 0) {        //if the list is NOT empty
+  if (list_is_empty(&ListOfObampSniffingIf) == 0) {        //if the list is NOT empty
     OLSR_DEBUG(LOG_PLUGINS, "adding interfaces");
 
-    list_for_each(pos, &ListOfObampSniffingIf) {
-
-      tmp = list_entry(pos, struct ObampSniffingIf, list);
+    OLSR_FOR_ALL_OBAMPSNIFF_ENTRIES(tmp, iterator) {
       tmp->skd = CreateCaptureSocket(tmp->ifName);
     }
   } else
@@ -286,7 +283,7 @@ activate_tree_link(struct OBAMP_tree_link_ack *ack)
   struct ipaddr_str buf;
 #endif
   struct ObampNode *tmp;
-  struct list_head *pos;
+  struct list_iterator iterator;
 
   if (memcmp(&myState->CoreAddress.v4, &ack->CoreAddress.v4, sizeof(struct in_addr)) != 0) {
     OLSR_DEBUG(LOG_PLUGINS, "Discarding message with no coherent core address");
@@ -299,9 +296,7 @@ activate_tree_link(struct OBAMP_tree_link_ack *ack)
     return;
   } else {
 
-    list_for_each(pos, &ListOfObampNodes) {
-
-      tmp = list_entry(pos, struct ObampNode, list);
+    OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
       if (tmp->neighbor_ip_addr.v4.s_addr == ack->router_id.v4.s_addr) {
 
         tmp->isTree = 1;
@@ -414,7 +409,8 @@ tree_link_ack(struct OBAMP_tree_link_req *req)
   struct in_addr addr;
 
   struct ObampNode *tmp;
-  struct list_head *pos;
+  struct list_iterator iterator;
+
 #if !defined(REMOVE_LOG_DEBUG)
   struct ipaddr_str buf;
 #endif
@@ -439,9 +435,7 @@ tree_link_ack(struct OBAMP_tree_link_req *req)
 
   addr = req->router_id.v4;
 
-  list_for_each(pos, &ListOfObampNodes) {
-
-    tmp = list_entry(pos, struct ObampNode, list);
+  OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
     if (tmp->neighbor_ip_addr.v4.s_addr == req->router_id.v4.s_addr) {
 
       tmp->isTree = 1;
@@ -529,9 +523,9 @@ printObampNodesList(void)
   struct ipaddr_str buf;
 #endif
   struct ObampNode *tmp;
-  struct list_head *pos;
+  struct list_iterator iterator;
 
-  if (list_empty(&ListOfObampNodes) == 0) {     //if the list is NOT empty
+  if (!list_is_empty(&ListOfObampNodes)) {     //if the list is NOT empty
 
 
     OLSR_DEBUG(LOG_PLUGINS, "--------------------NODE STATUS---------");
@@ -541,10 +535,7 @@ printObampNodesList(void)
 
     OLSR_DEBUG(LOG_PLUGINS, "Number \t IP \t\t IsMesh \t IsTree \t MeshLock \t outerTreeLink");
 
-    list_for_each(pos, &ListOfObampNodes) {
-
-      tmp = list_entry(pos, struct ObampNode, list);
-
+    OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
       OLSR_DEBUG(LOG_PLUGINS, "%d \t\t %s \t %d \t\t %d \t\t %d \t\t %d", i, ip4_to_string(&buf, tmp->neighbor_ip_addr.v4),
                  tmp->isMesh, tmp->isTree, tmp->MeshLock, tmp->outerTreeLink);
 
@@ -561,13 +552,11 @@ DoIHaveATreeLink(void)
 
   //struct ipaddr_str buf;
   struct ObampNode *tmp;
-  struct list_head *pos;
-
-  if (list_empty(&ListOfObampNodes) == 0) {     //if the list is NOT empty
+  struct list_iterator iterator;
 
-    list_for_each(pos, &ListOfObampNodes) {
+  if (!list_is_empty(&ListOfObampNodes)) {     //if the list is NOT empty
 
-      tmp = list_entry(pos, struct ObampNode, list);
+    OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
       if (tmp->isTree == 1)
         return 1;
 
@@ -583,16 +572,11 @@ unsolicited_tree_destroy(void *x)
 
   //struct ipaddr_str buf;
   struct ObampNode *tmp;
-  struct list_head *pos;
-
-  if (list_empty(&ListOfObampNodes) == 0) {     //if the list is NOT empty
-
-    list_for_each(pos, &ListOfObampNodes) {
-
-      tmp = list_entry(pos, struct ObampNode, list);
-      if (tmp->isTree == 0)
-        send_destroy_tree_link(&tmp->neighbor_ip_addr.v4);
+  struct list_iterator iterator;
 
+  OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+    if (tmp->isTree == 0) {
+      send_destroy_tree_link(&tmp->neighbor_ip_addr.v4);
     }
   }
   x = NULL;
@@ -604,16 +588,11 @@ DoIHaveAMeshLink(void)
 
   //struct ipaddr_str buf;
   struct ObampNode *tmp;
-  struct list_head *pos;
-
-  if (list_empty(&ListOfObampNodes) == 0) {     //if the list is NOT empty
-
-    list_for_each(pos, &ListOfObampNodes) {
-
-      tmp = list_entry(pos, struct ObampNode, list);
-      if (tmp->isMesh == 1)
-        return 1;
+  struct list_iterator iterator;
 
+  OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+    if (tmp->isMesh == 1) {
+      return 1;
     }
   }
   return 0;
@@ -622,27 +601,19 @@ DoIHaveAMeshLink(void)
 static void
 reset_tree_links(void)
 {
-
-  //struct ipaddr_str buf;
   struct ObampNode *tmp;
-  struct list_head *pos;
+  struct list_iterator iterator;
 
   OLSR_DEBUG(LOG_PLUGINS,"Reset Tree Links Now");
-  if (list_empty(&ListOfObampNodes) == 0) {     //if the list is NOT empty
-
-    list_for_each(pos, &ListOfObampNodes) {
 
-      tmp = list_entry(pos, struct ObampNode, list);
-      tmp->isTree = 0;
-      tmp->outerTreeLink = 0;
-    }
+  OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+    tmp->isTree = 0;
+    tmp->outerTreeLink = 0;
   }
 
   memset(&myState->ParentId.v4, 0, sizeof(myState->ParentId.v4));
   memset(&myState->OldParentId.v4, 1, sizeof(myState->OldParentId.v4));
   myState->TreeCreateSequenceNumber=0;
-
-
 };
 
 
@@ -654,31 +625,25 @@ deactivate_tree_link(struct OBAMP_tree_destroy *destroy_msg)
   struct ipaddr_str buf;
 #endif
   struct ObampNode *tmp;
-  struct list_head *pos;
+  struct list_iterator iterator;
 
   if (memcmp(&myState->CoreAddress.v4, &destroy_msg->CoreAddress.v4, sizeof(struct in_addr)) != 0) {
     OLSR_DEBUG(LOG_PLUGINS, "Discarding message with no coherent core address");
     return;
   }
 
-    list_for_each(pos, &ListOfObampNodes) {
-
-      tmp = list_entry(pos, struct ObampNode, list);
-      if (tmp->neighbor_ip_addr.v4.s_addr == destroy_msg->router_id.v4.s_addr) {
-
-        tmp->isTree = 0;
-        OLSR_DEBUG(LOG_PLUGINS, "Tree link to %s deactivated", ip4_to_string(&buf, tmp->neighbor_ip_addr.v4));
+  OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+    if (tmp->neighbor_ip_addr.v4.s_addr == destroy_msg->router_id.v4.s_addr) {
+      tmp->isTree = 0;
+      OLSR_DEBUG(LOG_PLUGINS, "Tree link to %s deactivated", ip4_to_string(&buf, tmp->neighbor_ip_addr.v4));
         
-       if (memcmp(&tmp->neighbor_ip_addr.v4, &myState->ParentId.v4, sizeof(struct in_addr)) == 0) {
-               OLSR_DEBUG(LOG_PLUGINS,"RESET TREE LINKS: I lost tree link with my PARENT");
-               reset_tree_links();
-       }
-
-        return;
-
+      if (memcmp(&tmp->neighbor_ip_addr.v4, &myState->ParentId.v4, sizeof(struct in_addr)) == 0) {
+        OLSR_DEBUG(LOG_PLUGINS,"RESET TREE LINKS: I lost tree link with my PARENT");
+        reset_tree_links();
       }
+      return;
     }
-
+  }
 }
 
 //Core Election. The Core is the one with the smallest IP Address
@@ -689,7 +654,7 @@ CoreElection(void)
   struct ipaddr_str buf;
 #endif
   struct ObampNode *tmp;
-  struct list_head *pos;
+  struct list_iterator iterator;
   u_int32_t smallestIP = 0xFFFFFFFF;
 
   //Update my current IP address
@@ -698,69 +663,56 @@ CoreElection(void)
   OLSR_DEBUG(LOG_PLUGINS, "SETUP: my IP - %s", ip4_to_string(&buf, myState->myipaddr.v4));
 
 
-  if (list_empty(&ListOfObampNodes) == 0) {     //if the list is NOT empty
-
-    list_for_each(pos, &ListOfObampNodes) {
-
-      tmp = list_entry(pos, struct ObampNode, list);
-      if (tmp->neighbor_ip_addr.v4.s_addr < smallestIP) {
-
-        smallestIP = tmp->neighbor_ip_addr.v4.s_addr;
-        OLSR_DEBUG(LOG_PLUGINS, "CoreElection: current smallest IP is - %s", ip4_to_string(&buf, tmp->neighbor_ip_addr.v4));
-
-      };
-    }
-    //Check if I'm the core.
+  if (list_is_empty(&ListOfObampNodes)) {     //if the list is empty
+    OLSR_DEBUG(LOG_PLUGINS, "CoreElection: I'm alone I'm the core");
+    myState->CoreAddress = myState->myipaddr;
+    myState->iamcore = 1;
+    myState->TreeCreateSequenceNumber = 0;
+    OLSR_DEBUG(LOG_PLUGINS,"Calling Reset Tree Links");
+    reset_tree_links();
+    return;
+  }
 
-    if (myState->myipaddr.v4.s_addr < smallestIP) {     //I'm the core
+  OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+    if (tmp->neighbor_ip_addr.v4.s_addr < smallestIP) {
+      smallestIP = tmp->neighbor_ip_addr.v4.s_addr;
+      OLSR_DEBUG(LOG_PLUGINS, "CoreElection: current smallest IP is - %s", ip4_to_string(&buf, tmp->neighbor_ip_addr.v4));
+    };
+  }
 
-      if (myState->myipaddr.v4.s_addr == myState->CoreAddress.v4.s_addr) {      //I'm was already the core
-        return;
-      } else {                  //I'm becoming core
-
-        myState->CoreAddress = myState->myipaddr;
-        myState->iamcore = 1;
-        myState->TreeCreateSequenceNumber = 0;
-        OLSR_DEBUG(LOG_PLUGINS,"Calling Reset Tree Links"); 
-       reset_tree_links();
-        OLSR_DEBUG(LOG_PLUGINS, "I'm the core");
-      }
-    } else {
-      if (myState->CoreAddress.v4.s_addr == smallestIP) {       //the core did not change
-        return;
-      } else {                  //core changed
-        myState->iamcore = 0;
-        myState->CoreAddress.v4.s_addr = smallestIP;
-        OLSR_DEBUG(LOG_PLUGINS,"Calling Reset Tree Links"); 
-       reset_tree_links();
-        OLSR_DEBUG(LOG_PLUGINS, "CoreElection: current Core is - %s", ip4_to_string(&buf, tmp->neighbor_ip_addr.v4));
-      }
+  //Check if I'm the core.
+  if (myState->myipaddr.v4.s_addr < smallestIP) {     //I'm the core
+    if (myState->myipaddr.v4.s_addr == myState->CoreAddress.v4.s_addr) {      //I'm was already the core
+      return;
     }
 
-  }
-
-  else {                        //List is empty I'm the core
-    OLSR_DEBUG(LOG_PLUGINS, "CoreElection: I'm alone I'm the core");
+    //I'm becoming core
     myState->CoreAddress = myState->myipaddr;
     myState->iamcore = 1;
     myState->TreeCreateSequenceNumber = 0;
     OLSR_DEBUG(LOG_PLUGINS,"Calling Reset Tree Links"); 
     reset_tree_links();
+    OLSR_DEBUG(LOG_PLUGINS, "I'm the core");
+  } else {
+    if (myState->CoreAddress.v4.s_addr == smallestIP) {       //the core did not change
+      return;
+    }
 
-
-
+    //core changed
+    myState->iamcore = 0;
+    myState->CoreAddress.v4.s_addr = smallestIP;
+    OLSR_DEBUG(LOG_PLUGINS,"Calling Reset Tree Links");
+    reset_tree_links();
+    OLSR_DEBUG(LOG_PLUGINS, "CoreElection: current Core is - %s", ip4_to_string(&buf, tmp->neighbor_ip_addr.v4));
   }
-
 }
 
 //Starts a UDP listening port for OBAMP signalling
 static int
 UdpServer(void)
 {
-
   struct sockaddr_in addr;
 
-
   if ((sdudp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
     OLSR_DEBUG(LOG_PLUGINS, "Socket UDP error");
     return -1;
@@ -785,10 +737,8 @@ UdpServer(void)
 static void
 decap_data(char *buffer)
 {
-
-  //struct ipaddr_str buf; //buf to print debug infos
   struct ObampSniffingIf *tmp;         //temp pointers used when parsing the list
-  struct list_head *pos;
+  struct list_iterator iterator;
   unsigned char *ipPacket;
   int stripped_len;
   struct ip *ipHeader;
@@ -803,53 +753,37 @@ decap_data(char *buffer)
   ipHeader = (struct ip *)ipPacket;
   ip6Header = (struct ip6_hdr *)ipPacket;
 
-
-  if (list_empty(&ListOfObampSniffingIf) == 0) {        //if the list is NOT empty
-//OLSR_DEBUG(LOG_PLUGINS,"DECAP DATA");
-
-    list_for_each(pos, &ListOfObampSniffingIf) {
-
-      tmp = list_entry(pos, struct ObampSniffingIf, list);
-      //tmp->skd = CreateCaptureSocket(tmp->ifName);
-
-
-
-      memset(&dest, 0, sizeof(dest));
-      dest.sll_family = AF_PACKET;
-      if ((ipPacket[0] & 0xf0) == 0x40) {
-        dest.sll_protocol = htons(ETH_P_IP);
-        stripped_len = ntohs(ipHeader->ip_len);
-      }
-      if ((ipPacket[0] & 0xf0) == 0x60) {
-        dest.sll_protocol = htons(ETH_P_IPV6);
-        stripped_len = 40 + ntohs(ip6Header->ip6_plen); //IPv6 Header size (40) + payload_len
-      }
-      //TODO: if packet is not IP die here
-
-
-      dest.sll_ifindex = if_nametoindex(tmp->ifName);
-      dest.sll_halen = IFHWADDRLEN;
-
-      /* Use all-ones as destination MAC address. When the IP destination is
-       * a multicast address, the destination MAC address should normally also
-       * be a multicast address. E.g., when the destination IP is 224.0.0.1,
-       * the destination MAC should be 01:00:5e:00:00:01. However, it does not
-       * seem to matter when the destination MAC address is set to all-ones
-       * in that case. */
-      memset(dest.sll_addr, 0xFF, IFHWADDRLEN);
-
-      nBytesWritten = sendto(tmp->skd, ipPacket, stripped_len, 0, (struct sockaddr *)&dest, sizeof(dest));
-      if (nBytesWritten != stripped_len) {
-        OLSR_DEBUG(LOG_PLUGINS, "sendto() error forwarding unpacked encapsulated pkt on \"%s\"", tmp->ifName);
-      } else {
-
-        OLSR_DEBUG(LOG_PLUGINS, "OBAMP: --> unpacked and forwarded on \"%s\"\n", tmp->ifName);
-      }
-
-
+  OLSR_FOR_ALL_OBAMPSNIFF_ENTRIES(tmp, iterator) {
+    memset(&dest, 0, sizeof(dest));
+    dest.sll_family = AF_PACKET;
+    if ((ipPacket[0] & 0xf0) == 0x40) {
+      dest.sll_protocol = htons(ETH_P_IP);
+      stripped_len = ntohs(ipHeader->ip_len);
+    }
+    if ((ipPacket[0] & 0xf0) == 0x60) {
+      dest.sll_protocol = htons(ETH_P_IPV6);
+      stripped_len = 40 + ntohs(ip6Header->ip6_plen); //IPv6 Header size (40) + payload_len
+    }
+    //TODO: if packet is not IP die here
+
+    dest.sll_ifindex = if_nametoindex(tmp->ifName);
+    dest.sll_halen = IFHWADDRLEN;
+
+    /* Use all-ones as destination MAC address. When the IP destination is
+     * a multicast address, the destination MAC address should normally also
+     * be a multicast address. E.g., when the destination IP is 224.0.0.1,
+     * the destination MAC should be 01:00:5e:00:00:01. However, it does not
+     * seem to matter when the destination MAC address is set to all-ones
+     * in that case. */
+    memset(dest.sll_addr, 0xFF, IFHWADDRLEN);
+
+    nBytesWritten = sendto(tmp->skd, ipPacket, stripped_len, 0, (struct sockaddr *)&dest, sizeof(dest));
+    if (nBytesWritten != stripped_len) {
+      OLSR_DEBUG(LOG_PLUGINS, "sendto() error forwarding unpacked encapsulated pkt on \"%s\"", tmp->ifName);
+    } else {
+      OLSR_DEBUG(LOG_PLUGINS, "OBAMP: --> unpacked and forwarded on \"%s\"\n", tmp->ifName);
     }
   }
-
 }
 
 
@@ -859,34 +793,24 @@ CheckDataFromTreeLink(char *buffer)
 {
 
   struct ObampNode *tmp;               //temp pointers used when parsing the list
-  struct list_head *pos;
+  struct list_iterator iterator;
   struct OBAMP_data_message4 *data_msg;
 
   data_msg = (struct OBAMP_data_message4 *)buffer;
 
-  if (list_empty(&ListOfObampNodes) == 0) {     //if the list is NOT empty
-
-    //Scroll the list
-    list_for_each(pos, &ListOfObampNodes) {
-      tmp = list_entry(pos, struct ObampNode, list);
-      //Scroll the list until we find the entry relative to the last hop of the packet we are processing
-      if (memcmp(&tmp->neighbor_ip_addr.v4, &data_msg->last_hop, sizeof(struct in_addr)) == 0) {
-
-        if (tmp->isTree == 1) {  //OK we receive data from a neighbor that we have a tree link with
-          return 1;
-        }
-
-       else{
-          OLSR_DEBUG(LOG_PLUGINS, "DISCARDING DATA PACKET SENT BY NOT TREE NEIGHBOR");
-         send_destroy_tree_link(&tmp->neighbor_ip_addr.v4);
-          return 0;
-       }
+  //Scroll the list
+  OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+    //Scroll the list until we find the entry relative to the last hop of the packet we are processing
+    if (memcmp(&tmp->neighbor_ip_addr.v4, &data_msg->last_hop, sizeof(struct in_addr)) == 0) {
+      if (tmp->isTree == 1) {  //OK we receive data from a neighbor that we have a tree link with
+        return 1;
       }
+      OLSR_DEBUG(LOG_PLUGINS, "DISCARDING DATA PACKET SENT BY NOT TREE NEIGHBOR");
+      send_destroy_tree_link(&tmp->neighbor_ip_addr.v4);
+      return 0;
     }
   }
-
   return 0;
-
 }
 
 
@@ -895,43 +819,31 @@ CheckDupData(char *buffer)
 {
 
   struct ObampNode *tmp;               //temp pointers used when parsing the list
-  struct list_head *pos;
+  struct list_iterator iterator;
   struct OBAMP_data_message4 *data_msg;
 
   data_msg = (struct OBAMP_data_message4 *)buffer;
 
+  //Scroll the list
+  OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+    if (memcmp(&tmp->neighbor_ip_addr.v4, &data_msg->router_id, sizeof(struct in_addr)) == 0) {
+      OLSR_DEBUG(LOG_PLUGINS, "Processing Data Packet %d - Last seen was %d",data_msg->SequenceNumber, tmp->DataSeqNumber);
 
-  //Check duplicate data packet
-  if (list_empty(&ListOfObampNodes) == 0) {     //if the list is NOT empty
-
-    //Scroll the list
-    list_for_each(pos, &ListOfObampNodes) {
-      tmp = list_entry(pos, struct ObampNode, list);
-
-      if (memcmp(&tmp->neighbor_ip_addr.v4, &data_msg->router_id, sizeof(struct in_addr)) == 0) {
-
-       OLSR_DEBUG(LOG_PLUGINS, "Processing Data Packet %d - Last seen was %d",data_msg->SequenceNumber, tmp->DataSeqNumber);
-       
-        if (tmp->DataSeqNumber == 0) {  //First packet received from this host
-          tmp->DataSeqNumber = data_msg->SequenceNumber;
-          return 1;
-        }
+      if (tmp->DataSeqNumber == 0) {  //First packet received from this host
+        tmp->DataSeqNumber = data_msg->SequenceNumber;
+        return 1;
+      }
 
-       if ( ((data_msg->SequenceNumber > tmp->DataSeqNumber) && ((data_msg->SequenceNumber - tmp->DataSeqNumber ) <= 127)) || ((tmp->DataSeqNumber > data_msg->SequenceNumber) && ((tmp->DataSeqNumber - data_msg->SequenceNumber) > 127 ))) //data_msg->SequenceNumber > tmp->DataSeqNumber
-       {
-       tmp->DataSeqNumber = data_msg->SequenceNumber;
-       return 1;
-       }
-       else{
-          OLSR_DEBUG(LOG_PLUGINS, "DISCARDING DUP PACKET");
-          return 0;
-       }
+      if ( ((data_msg->SequenceNumber > tmp->DataSeqNumber) && ((data_msg->SequenceNumber - tmp->DataSeqNumber ) <= 127)) || ((tmp->DataSeqNumber > data_msg->SequenceNumber) && ((tmp->DataSeqNumber - data_msg->SequenceNumber) > 127 ))) //data_msg->SequenceNumber > tmp->DataSeqNumber
+      {
+        tmp->DataSeqNumber = data_msg->SequenceNumber;
+        return 1;
       }
+      OLSR_DEBUG(LOG_PLUGINS, "DISCARDING DUP PACKET");
+      return 0;
     }
   }
-
   return 1;
-
 }
 
 static void
@@ -943,7 +855,7 @@ forward_obamp_data(char *buffer)
   struct ipaddr_str buf2;
 #endif
   struct ObampNode *tmp;               //temp pointers used when parsing the list
-  struct list_head *pos;
+  struct list_iterator iterator;
   struct OBAMP_data_message4 *data_msg;
   struct sockaddr_in si_other;
   struct in_addr temporary;
@@ -953,29 +865,21 @@ forward_obamp_data(char *buffer)
   temporary.s_addr  = data_msg->last_hop;
   data_msg->last_hop = myState->myipaddr.v4.s_addr;
 
-  if (list_empty(&ListOfObampNodes) == 0) {     //if the list is NOT empty
-
-    //Scroll the list
-    list_for_each(pos, &ListOfObampNodes) {
-      tmp = list_entry(pos, struct ObampNode, list);
-
-      if (tmp->isTree == 1 && memcmp(&tmp->neighbor_ip_addr.v4, &temporary.s_addr, 4) != 0) {
-        OLSR_DEBUG(LOG_PLUGINS, "FORWARDING OBAMP DATA TO node %s because come from %s", ip4_to_string(&buf, tmp->neighbor_ip_addr.v4), ip4_to_string(&buf2,temporary));
-        //FORWARD DATA
-
+  //Scroll the list
+  OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+    if (tmp->isTree == 1 && memcmp(&tmp->neighbor_ip_addr.v4, &temporary.s_addr, 4) != 0) {
+      OLSR_DEBUG(LOG_PLUGINS, "FORWARDING OBAMP DATA TO node %s because come from %s", ip4_to_string(&buf, tmp->neighbor_ip_addr.v4), ip4_to_string(&buf2,temporary));
 
-        memset((char *)&si_other, 0, sizeof(si_other));
-        si_other.sin_family = AF_INET;
-        si_other.sin_port = htons(OBAMP_SIGNALLING_PORT);
-        si_other.sin_addr = tmp->neighbor_ip_addr.v4;
-        //sendto(sdudp, data_msg, sizeof(struct OBAMP_data_message), 0, (struct sockaddr *)&si_other, sizeof(si_other));
-       sendto(sdudp, data_msg, 17+data_msg->datalen, 0, (struct sockaddr *)&si_other, sizeof(si_other));
+      //FORWARD DATA
+      memset((char *)&si_other, 0, sizeof(si_other));
+      si_other.sin_family = AF_INET;
+      si_other.sin_port = htons(OBAMP_SIGNALLING_PORT);
+      si_other.sin_addr = tmp->neighbor_ip_addr.v4;
 
-
-      }
+      //sendto(sdudp, data_msg, sizeof(struct OBAMP_data_message), 0, (struct sockaddr *)&si_other, sizeof(si_other));
+      sendto(sdudp, data_msg, 17+data_msg->datalen, 0, (struct sockaddr *)&si_other, sizeof(si_other));
     }
   }
-
 }
 
 
@@ -986,7 +890,7 @@ manage_hello(char *packet)
   struct OBAMP_hello *hello;
 
   struct ObampNode *tmp;               //temp pointers used when parsing the list
-  struct list_head *pos;
+  struct list_iterator iterator;
 
   hello = (struct OBAMP_hello *)packet;
 
@@ -996,23 +900,18 @@ manage_hello(char *packet)
     return;
   }
 
-  if (list_empty(&ListOfObampNodes) == 0) {     //if the list is NOT empty
-
-    //Scroll the list
-    list_for_each(pos, &ListOfObampNodes) {
-      tmp = list_entry(pos, struct ObampNode, list);
-
-      if (memcmp(&tmp->neighbor_ip_addr.v4, &hello->router_id.v4, sizeof(struct in_addr)) == 0) {       //I search in the list the neighbor I received the hello from
-
-        tmp->isMesh = 1;
-        tmp->MeshLock = _MESH_LOCK_;
-
-      }
-    }
-  } else {
+  if (!list_is_empty(&ListOfObampNodes)) {     //if the list is empty
     OLSR_DEBUG(LOG_PLUGINS, "Very strange, list cannot be empty here !");
+    return;
   }
 
+  //Scroll the list
+  OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+     if (memcmp(&tmp->neighbor_ip_addr.v4, &hello->router_id.v4, sizeof(struct in_addr)) == 0) {       //I search in the list the neighbor I received the hello from
+      tmp->isMesh = 1;
+      tmp->MeshLock = _MESH_LOCK_;
+    }
+  }
 }
 
 static void
@@ -1027,81 +926,77 @@ manage_tree_create(char *packet)
 #endif
 
   struct ObampNode *tmp;               //temp pointers used when parsing the list
-  struct list_head *pos;
+  struct list_iterator iterator;
+
   OLSR_DEBUG(LOG_PLUGINS,"manage_tree_create");
   msg = (struct OBAMP_tree_create *)packet;
 
   if (msg->MessageID != OBAMP_TREECREATE) {
     OLSR_DEBUG(LOG_PLUGINS, "BIG PROBLEM, I'M IN THIS FUNCTION BUT MESSAGE IS NOT TREE CREATE");
+    return;
   }
 
-  else {
-    //FIRST OF ALL CHECK CORE
-    if (memcmp(&myState->CoreAddress.v4, &msg->CoreAddress.v4, sizeof(struct in_addr)) != 0) {
-      OLSR_DEBUG(LOG_PLUGINS, "Discarding message with no coherent core address");
-      return;
-    }
-    if (myState->iamcore == 1) {        //I'm core and receiving tree create over a loop
-      return;
-    } else {
-
+  //FIRST OF ALL CHECK CORE
+  if (memcmp(&myState->CoreAddress.v4, &msg->CoreAddress.v4, sizeof(struct in_addr)) != 0) {
+    OLSR_DEBUG(LOG_PLUGINS, "Discarding message with no coherent core address");
+    return;
+  }
+  if (myState->iamcore == 1) {        //I'm core and receiving tree create over a loop
+    return;
+  }
 
-      if ( (((msg->SequenceNumber > myState->TreeCreateSequenceNumber) && ((msg->SequenceNumber - myState->TreeCreateSequenceNumber ) <= 127)) || ((myState->TreeCreateSequenceNumber > msg->SequenceNumber) && ((myState->TreeCreateSequenceNumber - msg->SequenceNumber) > 127 ))    /*myState->TreeCreateSequenceNumber < msg->SequenceNumber*/) || myState->TreeCreateSequenceNumber == 0 ) {    //If tree create is not a duplicate
-        OLSR_DEBUG(LOG_PLUGINS, "myState->TreeCreateSequenceNumber < msg->SequenceNumber --- %d < %d",myState->TreeCreateSequenceNumber,msg->SequenceNumber);
-       myState->TreeCreateSequenceNumber = msg->SequenceNumber;
-
-       //A bug was fixed here a battlemeshv3
-        //myState->OldParentId.v4 = myState->ParentId.v4;
-        //myState->ParentId.v4 = msg->router_id.v4;
-
-        //if (memcmp(&myState->OldParentId.v4, &myState->ParentId.v4, sizeof(struct in_addr)) != 0)       //If it changed
-        if (memcmp(&msg->router_id.v4, &myState->ParentId.v4, sizeof(struct in_addr)) != 0)       //If it changed
-        {
-          OLSR_DEBUG(LOG_PLUGINS, "Receiving a tree message from a link that is not parent");
-         if (DoIHaveATreeLink() == 0 ) {
-          OLSR_DEBUG(LOG_PLUGINS,"Calling Reset Tree Links"); 
-         reset_tree_links();
-          myState->ParentId.v4 = msg->router_id.v4;
-          myState->OldParentId.v4 = myState->ParentId.v4;
-          tree_link_req(&msg->router_id.v4);
-         }
-         else {
-         //I have a tree link already, evaluate new parent ??
-         
-         }
-        }
-       else { //Receiving a TreeCreate from my parent so I can refresh hearthbeat
-        myState->TreeHeartBeat = TREE_HEARTBEAT;
-        
-       //FORWARD the tree message on the mesh
-       if (list_empty(&ListOfObampNodes) == 0) {       //if the list is NOT empty
+  // TODO: cleanup this statement
+  if ( (((msg->SequenceNumber > myState->TreeCreateSequenceNumber) && ((msg->SequenceNumber - myState->TreeCreateSequenceNumber ) <= 127))
+      || ((myState->TreeCreateSequenceNumber > msg->SequenceNumber) && ((myState->TreeCreateSequenceNumber - msg->SequenceNumber) > 127 ))
+       /*myState->TreeCreateSequenceNumber < msg->SequenceNumber*/) || myState->TreeCreateSequenceNumber == 0 ) {
+    //If tree create is not a duplicate
+    OLSR_DEBUG(LOG_PLUGINS, "myState->TreeCreateSequenceNumber < msg->SequenceNumber --- %d < %d",myState->TreeCreateSequenceNumber,msg->SequenceNumber);
+    myState->TreeCreateSequenceNumber = msg->SequenceNumber;
 
-          //Scroll the list
-          list_for_each(pos, &ListOfObampNodes) {
-            tmp = list_entry(pos, struct ObampNode, list);
+    // A bug was fixed here a battlemeshv3
+    // myState->OldParentId.v4 = myState->ParentId.v4;
+    // myState->ParentId.v4 = msg->router_id.v4;
 
-            if (tmp->isMesh == 1 && memcmp(&tmp->neighbor_ip_addr.v4, &msg->router_id.v4, sizeof(struct in_addr)) != 0) {       //Is neighbor and not the originator of this tree create
-               if (DoIHaveATreeLink() == 1 ) { //I forward only if I have a link tree to the core ready
-              tree_create_forward_to(&tmp->neighbor_ip_addr.v4, msg);
-              OLSR_DEBUG(LOG_PLUGINS, "FORWARDING TREE CREATE ORIGINATOR %s TO node %s ", ip4_to_string(&buf2, msg->router_id.v4),
-                         ip4_to_string(&buf, tmp->neighbor_ip_addr.v4));
-               }
+    // if (memcmp(&myState->OldParentId.v4, &myState->ParentId.v4, sizeof(struct in_addr)) != 0)       //If it changed
+    if (memcmp(&msg->router_id.v4, &myState->ParentId.v4, sizeof(struct in_addr)) != 0)       //If it changed
+    {
+      OLSR_DEBUG(LOG_PLUGINS, "Receiving a tree message from a link that is not parent");
+      if (DoIHaveATreeLink() == 0 ) {
+        OLSR_DEBUG(LOG_PLUGINS,"Calling Reset Tree Links");
+        reset_tree_links();
+        myState->ParentId.v4 = msg->router_id.v4;
+        myState->OldParentId.v4 = myState->ParentId.v4;
+        tree_link_req(&msg->router_id.v4);
+      }
+      else {
+        // I have a tree link already, evaluate new parent ??
+      }
+    }
+    else { //Receiving a TreeCreate from my parent so I can refresh hearthbeat
+      myState->TreeHeartBeat = TREE_HEARTBEAT;
+        
+      // FORWARD the tree message on the mesh
+      if (list_is_empty(&ListOfObampNodes)) {       //if the list is empty
+        OLSR_DEBUG(LOG_PLUGINS, "Very strange, list cannot be empty here !");
+      }
 
-            }
+      //Scroll the list
+      OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+        if (tmp->isMesh == 1 && memcmp(&tmp->neighbor_ip_addr.v4, &msg->router_id.v4, sizeof(struct in_addr)) != 0) {
+          //Is neighbor and not the originator of this tree create
+          if (DoIHaveATreeLink() == 1 ) { //I forward only if I have a link tree to the core ready
+            tree_create_forward_to(&tmp->neighbor_ip_addr.v4, msg);
+            OLSR_DEBUG(LOG_PLUGINS, "FORWARDING TREE CREATE ORIGINATOR %s TO node %s ", ip4_to_string(&buf2, msg->router_id.v4),
+                       ip4_to_string(&buf, tmp->neighbor_ip_addr.v4));
           }
-        } else {
-          OLSR_DEBUG(LOG_PLUGINS, "Very strange, list cannot be empty here !");
         }
-       }
-      } //END IF TREE CREATE IS NOT A DUPLICATE 
-      else {
-       
-        OLSR_DEBUG(LOG_PLUGINS, "myState->TreeCreateSequenceNumber < msg->SequenceNumber --- %d < %d",myState->TreeCreateSequenceNumber,msg->SequenceNumber);
-        OLSR_DEBUG(LOG_PLUGINS, "DISCARDING DUP TREE CREATE");
       }
-    }
+    } //END IF TREE CREATE IS NOT A DUPLICATE
+  }
+  else {
+   OLSR_DEBUG(LOG_PLUGINS, "myState->TreeCreateSequenceNumber < msg->SequenceNumber --- %d < %d",myState->TreeCreateSequenceNumber,msg->SequenceNumber);
+   OLSR_DEBUG(LOG_PLUGINS, "DISCARDING DUP TREE CREATE");
   }
-
 }
 
 void
@@ -1194,18 +1089,17 @@ addObampNode4(struct in_addr *ipv4, u_int8_t status)
 #endif
   struct ObampNode *neighbor_to_add;
   struct ObampNode *tmp;
-  struct list_head *pos;
-
+  struct list_iterator iterator;
   neighbor_to_add = olsr_malloc(sizeof(struct ObampNode), "OBAMPNode");
 
 //OLSR_DEBUG(LOG_PLUGINS,"Adding to list node - %s\n",ip4_to_string(&buf,*ipv4));
 
 
-  if (list_empty(&ListOfObampNodes) != 0) {     //Empty list
-//OLSR_DEBUG(LOG_PLUGINS,"List is empty %d adding first node\n",list_empty(&ListOfObampNodes));
+  if (list_is_empty(&ListOfObampNodes)) {     //Empty list
+    //OLSR_DEBUG(LOG_PLUGINS,"List is empty %d adding first node\n",listold_empty(&ListOfObampNodes));
 
     memcpy(&neighbor_to_add->neighbor_ip_addr.v4, ipv4, sizeof(neighbor_to_add->neighbor_ip_addr.v4));
-    list_add(&(neighbor_to_add->list), &ListOfObampNodes);
+    list_add_head(&ListOfObampNodes, &(neighbor_to_add->list));
 
     init_overlay_neighbor(neighbor_to_add);
     neighbor_to_add->status = status;
@@ -1213,30 +1107,30 @@ addObampNode4(struct in_addr *ipv4, u_int8_t status)
     OLSR_DEBUG(LOG_PLUGINS, "Added to list node as first node- %s\n", ip4_to_string(&buf, *ipv4));
 
     CoreElection();
+    return 0;
+  }
 
-  } else {                      //Some node already in list
-
-//Scroll the list to check if the element already exists
-    list_for_each(pos, &ListOfObampNodes) {
+  //Some node already in list
 
-      tmp = list_entry(pos, struct ObampNode, list);
-      if (memcmp(&tmp->neighbor_ip_addr.v4, ipv4, sizeof(tmp->neighbor_ip_addr.v4)) == 0) {
-        //OLSR_DEBUG(LOG_PLUGINS,"Node already present in list %s\n",ip4_to_string(&buf,*ipv4));
-        tmp->Texpire = _Texpire_;       //Refresh Texpire
-        neighbor_to_add->status = status;
-        free(neighbor_to_add);
-        return 1;
-      }
+  //Scroll the list to check if the element already exists
+  OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+    if (memcmp(&tmp->neighbor_ip_addr.v4, ipv4, sizeof(tmp->neighbor_ip_addr.v4)) == 0) {
+      //OLSR_DEBUG(LOG_PLUGINS,"Node already present in list %s\n",ip4_to_string(&buf,*ipv4));
+      tmp->Texpire = _Texpire_;       //Refresh Texpire
+      neighbor_to_add->status = status;
+      free(neighbor_to_add);
+      return 1;
     }
-//Add element to list
-// neighbor_to_add->Texpire=_Texpire_; //Refresh Texpire
-    OLSR_DEBUG(LOG_PLUGINS, "Adding to list node (NOT FIRST)- %s\n", ip4_to_string(&buf, *ipv4));
-    memcpy(&neighbor_to_add->neighbor_ip_addr.v4, ipv4, sizeof(neighbor_to_add->neighbor_ip_addr.v4));
-    list_add(&(neighbor_to_add->list), &ListOfObampNodes);
-    init_overlay_neighbor(neighbor_to_add);
-    neighbor_to_add->status = status;
-    CoreElection();
-  }                             //end else
+  }
+
+  //Add element to list
+  // neighbor_to_add->Texpire=_Texpire_; //Refresh Texpire
+  OLSR_DEBUG(LOG_PLUGINS, "Adding to list node (NOT FIRST)- %s\n", ip4_to_string(&buf, *ipv4));
+  memcpy(&neighbor_to_add->neighbor_ip_addr.v4, ipv4, sizeof(neighbor_to_add->neighbor_ip_addr.v4));
+  list_add_tail(&ListOfObampNodes, &(neighbor_to_add->list));
+  init_overlay_neighbor(neighbor_to_add);
+  neighbor_to_add->status = status;
+  CoreElection();
   return 0;
 }                               //End AddObampNode
 
@@ -1313,6 +1207,7 @@ olsr_obamp_gen(void *packet, int len)
   uint8_t buffer[10240];
   struct olsr_message msg;
   struct interface *ifn;
+  struct list_iterator iterator;
   uint8_t *curr, *sizeptr;
 
   /* fill message */
@@ -1332,7 +1227,7 @@ olsr_obamp_gen(void *packet, int len)
   pkt_put_u16(&sizeptr, len);
 
   /* looping trough interfaces */
-  OLSR_FOR_ALL_INTERFACES(ifn) {
+  OLSR_FOR_ALL_INTERFACES(ifn, iterator) {
     if (net_outbuffer_push(ifn, buffer, len) != len) {
       /* send data and try again */
       net_output(ifn);
@@ -1341,109 +1236,95 @@ olsr_obamp_gen(void *packet, int len)
       }
     }
   }
-  OLSR_FOR_ALL_INTERFACES_END(ifn);
 }
 
 void
-outer_tree_create(void *x)
+outer_tree_create(void *x __attribute__ ((unused)))
 {
-
   struct ObampNode *tmp;               //temp pointers used when parsing the list
-  struct list_head *pos;
-
-
-  if ((DoIHaveATreeLink() == 0) && (myState->iamcore == 0)) {   //If there are not tree links
-
-    if (list_empty(&ListOfObampNodes) == 0) {   //if the list is NOT empty
-
+  struct list_iterator iterator;
 
-      if (DoIHaveAMeshLink() == 0) {
-        OLSR_DEBUG(LOG_PLUGINS, "Weird, no mesh links. Maybe other OBAMP nodes are very far (HUGE ETX)");
-
-      } else {
+  if (!((DoIHaveATreeLink() == 0) && (myState->iamcore == 0))) {   //If there are tree links
+    return;
+  }
 
-        //Update my current IP address
-        memcpy(&myState->myipaddr.v4, &olsr_cnf->router_id, olsr_cnf->ipsize);
-        //OLSR_DEBUG(LOG_PLUGINS,"SETUP: my IP - %s",ip4_to_string(&buf,myState->myipaddr.v4));
-        list_for_each(pos, &ListOfObampNodes) {
-          tmp = list_entry(pos, struct ObampNode, list);
-          if ((tmp->neighbor_ip_addr.v4.s_addr < myState->myipaddr.v4.s_addr) && (tmp->isMesh == 1)) {
-            return;             //I have a neighbor that will send a outer tree create for me
-          }
-        }
-        //tree create
-        OLSR_DEBUG(LOG_PLUGINS, "OUTER TREE CREATE");
-        tmp = select_tree_anchor();
-        if (tmp == NULL) {
-          OLSR_DEBUG(LOG_PLUGINS, "CANT FIND ANCHOR");
-          return;
-        }
-        tmp->isMesh = 1;
-        tmp->outerTreeLink = 1;
-        myState->OldParentId.v4 = tmp->neighbor_ip_addr.v4;
-        myState->ParentId.v4 = tmp->neighbor_ip_addr.v4;
-        myState->TreeHeartBeat = TREE_HEARTBEAT;
-        tree_link_req(&tmp->neighbor_ip_addr.v4);
+  if (list_is_empty(&ListOfObampNodes) == 0) {   //if the list is empty
+    OLSR_DEBUG(LOG_PLUGINS, "List empty can't send OUTER_TREE_CREATE");
+  }
 
-      }
+  if (DoIHaveAMeshLink() == 0) {
+    OLSR_DEBUG(LOG_PLUGINS, "Weird, no mesh links. Maybe other OBAMP nodes are very far (HUGE ETX)");
+    return;
+  }
 
+  // Update my current IP address
+  memcpy(&myState->myipaddr.v4, &olsr_cnf->router_id, olsr_cnf->ipsize);
+  //OLSR_DEBUG(LOG_PLUGINS,"SETUP: my IP - %s",ip4_to_string(&buf,myState->myipaddr.v4));
 
-    } else {
-      OLSR_DEBUG(LOG_PLUGINS, "List empty can't send OUTER_TREE_CREATE");
+  OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+    if ((tmp->neighbor_ip_addr.v4.s_addr < myState->myipaddr.v4.s_addr) && (tmp->isMesh == 1)) {
+      return;             //I have a neighbor that will send a outer tree create for me
     }
   }
-  x = NULL;
+
+  //tree create
+  OLSR_DEBUG(LOG_PLUGINS, "OUTER TREE CREATE");
+  tmp = select_tree_anchor();
+  if (tmp == NULL) {
+    OLSR_DEBUG(LOG_PLUGINS, "CANT FIND ANCHOR");
+    return;
+  }
+
+  tmp->isMesh = 1;
+  tmp->outerTreeLink = 1;
+  myState->OldParentId.v4 = tmp->neighbor_ip_addr.v4;
+  myState->ParentId.v4 = tmp->neighbor_ip_addr.v4;
+  myState->TreeHeartBeat = TREE_HEARTBEAT;
+  tree_link_req(&tmp->neighbor_ip_addr.v4);
 }
 
 
 void
-tree_create(void *x)
+tree_create(void *x __attribute__ ((unused)))
 {
 #if !defined(REMOVE_LOG_DEBUG)
   struct ipaddr_str buf;
 #endif
   struct ObampNode *tmp;               //temp pointers used when parsing the list
-  struct list_head *pos;
+  struct list_iterator iterator;
 
-//Check if I'm core
-  if (myState->iamcore == 1) {
-
-    if (list_empty(&ListOfObampNodes) == 0) {   //if the list is NOT empty
-
-      //Scroll the list
-      list_for_each(pos, &ListOfObampNodes) {
-
-        tmp = list_entry(pos, struct ObampNode, list);
-        if (tmp->isMesh == 1) { //Is neighbor
-          //send tree create
-
-          tree_create_gen(&tmp->neighbor_ip_addr.v4);
+  // Check if I'm core
+  if (myState->iamcore != 1) {
+    return;
+  }
 
+  if (list_is_empty(&ListOfObampNodes)) {   //if the list is empty
+    OLSR_DEBUG(LOG_PLUGINS, "List empty can't send TREE_CREATE");
+    return;
+  }
 
-          OLSR_DEBUG(LOG_PLUGINS, "CORE SENDS TREE CREATE TO node %s ", ip4_to_string(&buf, tmp->neighbor_ip_addr.v4));
+  //Scroll the list
+  OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+    if (tmp->isMesh == 1) { //Is neighbor
+      //send tree create
+      tree_create_gen(&tmp->neighbor_ip_addr.v4);
 
-        }
-      }
-    } else {
-      OLSR_DEBUG(LOG_PLUGINS, "List empty can't send TREE_CREATE");
+      OLSR_DEBUG(LOG_PLUGINS, "CORE SENDS TREE CREATE TO node %s ", ip4_to_string(&buf, tmp->neighbor_ip_addr.v4));
     }
-
   }
-
-  x = NULL;
 }
 
 
 
 
 void
-mesh_create(void *x)
+mesh_create(void *x __attribute__ ((unused)))
 {
 #if !defined(REMOVE_LOG_DEBUG)
   struct ipaddr_str buf;
 #endif
   struct ObampNode *tmp;               //temp pointers used when parsing the list
-  struct list_head *pos;
+  struct list_iterator iterator;
 
   struct rt_entry *rt;                 //"rt->rt_best->rtp_metric.cost" is the value you are looking for, a 32 bit
 
@@ -1451,155 +1332,135 @@ mesh_create(void *x)
 
   int meshchanged = 0;
 
-  if (list_empty(&ListOfObampNodes) == 0) {     //if the list is NOT empty
-
-    //Scroll the list
-    list_for_each(pos, &ListOfObampNodes) {
-
-      tmp = list_entry(pos, struct ObampNode, list);
-
-      //set every OBAMP node to be NOT neighbor
-      tmp->wasMesh = tmp->isMesh;
-
-      //MeshLock in case mesh link is requested from neighbor
-      if (tmp->MeshLock == 0 && tmp->outerTreeLink == 0)
-        tmp->isMesh = 0;
-
-      rt = olsr_lookup_routing_table(&tmp->neighbor_ip_addr);
-
-      if (rt == NULL) {         //route is not present yet
-        continue;
-      }
-      //OLSR_DEBUG(LOG_PLUGINS,"ROUTING TO node %s costs %u",ip4_to_string(&buf,tmp->neighbor_ip_addr.v4),rt->rt_best->rtp_metric.cost/65536);
-
-      if (rt->rt_best->rtp_metric.cost / 65536 > 5) {
-        continue;               //we not not consider links that are poorer than ETX=5
-      }
-      //update min cost
-      if ((rt->rt_best->rtp_metric.cost / 65536) < mincost)
-        mincost = (rt->rt_best->rtp_metric.cost / 65536);
-
-    }                           //end for each
+  if (list_is_empty(&ListOfObampNodes)) {     //if the list is empty
+    OLSR_DEBUG(LOG_PLUGINS, "List empty can't create Overlay Mesh");
+    return;
+  }
 
-    //now that I know the mincost to the closer OBAMP node I choose my neighbor set
-    list_for_each(pos, &ListOfObampNodes) {
+  //Scroll the list
+  OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+    //set every OBAMP node to be NOT neighbor
+    tmp->wasMesh = tmp->isMesh;
 
-      tmp = list_entry(pos, struct ObampNode, list);
-      rt = olsr_lookup_routing_table(&tmp->neighbor_ip_addr);
+    //MeshLock in case mesh link is requested from neighbor
+    if (tmp->MeshLock == 0 && tmp->outerTreeLink == 0) {
+      tmp->isMesh = 0;
+    }
 
-      if (rt == NULL) {         //route is not present yet
-        continue;
-      }
+    rt = olsr_lookup_routing_table(&tmp->neighbor_ip_addr);
+    if (rt == NULL) {         //route is not present yet
+      continue;
+    }
 
-      if (rt->rt_best->rtp_metric.cost / 65536 > 5) {
-        continue;               //we not not consider links that are poorer than ETX=5
-      }
+    //OLSR_DEBUG(LOG_PLUGINS,"ROUTING TO node %s costs %u",ip4_to_string(&buf,tmp->neighbor_ip_addr.v4),rt->rt_best->rtp_metric.cost/65536);
 
-      if ((rt->rt_best->rtp_metric.cost / 65536) - 1 < mincost) {       //Choose for mesh
+    if (rt->rt_best->rtp_metric.cost / 65536 > 5) {
+      continue;               //we not not consider links that are poorer than ETX=5
+    }
 
-        tmp->isMesh = 1;
-        OLSR_DEBUG(LOG_PLUGINS, "Choosed Overlay Neighbor node %s costs %u", ip4_to_string(&buf, tmp->neighbor_ip_addr.v4),
-                   rt->rt_best->rtp_metric.cost / 65536);
+    //update min cost
+    if ((rt->rt_best->rtp_metric.cost / 65536) < mincost) {
+      mincost = (rt->rt_best->rtp_metric.cost / 65536);
+    }
+  } //end for each
 
-        obamp_hello(&tmp->neighbor_ip_addr.v4);
+  //now that I know the mincost to the closer OBAMP node I choose my neighbor set
+  OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+    rt = olsr_lookup_routing_table(&tmp->neighbor_ip_addr);
+    if (rt == NULL) {         //route is not present yet
+      continue;
+    }
 
+    if (rt->rt_best->rtp_metric.cost / 65536 > 5) {
+      continue;               //we not not consider links that are poorer than ETX=5
+    }
 
-      }
+    if ((rt->rt_best->rtp_metric.cost / 65536) - 1 < mincost) {       //Choose for mesh
+      tmp->isMesh = 1;
+      OLSR_DEBUG(LOG_PLUGINS, "Choosed Overlay Neighbor node %s costs %u", ip4_to_string(&buf, tmp->neighbor_ip_addr.v4),
+                 rt->rt_best->rtp_metric.cost / 65536);
 
-      if (tmp->outerTreeLink == 1)
-        obamp_hello(&tmp->neighbor_ip_addr.v4);
+      obamp_hello(&tmp->neighbor_ip_addr.v4);
+    }
 
+    if (tmp->outerTreeLink == 1) {
+      obamp_hello(&tmp->neighbor_ip_addr.v4);
+    }
 
-      if (tmp->isMesh != tmp->wasMesh) {
-        meshchanged++;
-        if (tmp->isMesh == 0 && tmp->isTree == 1) {
+    if (tmp->isMesh != tmp->wasMesh) {
+      meshchanged++;
+      if (tmp->isMesh == 0 && tmp->isTree == 1) {
+        tmp->isTree = 0;
+        send_destroy_tree_link(&tmp->neighbor_ip_addr.v4);
 
-          tmp->isTree = 0;
-         send_destroy_tree_link(&tmp->neighbor_ip_addr.v4);
-       
         if (memcmp(&tmp->neighbor_ip_addr.v4, &myState->ParentId.v4, sizeof(struct in_addr)) == 0) {
-               OLSR_DEBUG(LOG_PLUGINS,"RESET TREE LINKS: I lost tree link with my PARENT");
-               reset_tree_links();
-       }       
-
+          OLSR_DEBUG(LOG_PLUGINS,"RESET TREE LINKS: I lost tree link with my PARENT");
+          reset_tree_links();
         }
       }
-
-    }                           //end for each
-
-    if (meshchanged) {
-      //trigger signalling
     }
+  }                           //end for each
 
-
-  } else {
-    OLSR_DEBUG(LOG_PLUGINS, "List empty can't create Overlay Mesh");
+  if (meshchanged) {
+    //trigger signalling
   }
-
-  x = NULL;
 }
 
 
 void
-purge_nodes(void *x)
+purge_nodes(void *x __attribute__ ((unused)))
 {
 #if !defined(REMOVE_LOG_DEBUG)
   struct ipaddr_str buf;
 #endif
   struct ObampNode *tmp;
-  struct list_head *pos;
-
+  struct list_iterator iterator;
   int nodesdeleted = 0;
 
-  if (myState->TreeHeartBeat > 0)
+  if (myState->TreeHeartBeat > 0) {
     myState->TreeHeartBeat--;
+  }
 
-  if (myState->TreeRequestDelay > 0)
+  if (myState->TreeRequestDelay > 0) {
     myState->TreeRequestDelay--;
+  }
 
   if (myState->TreeHeartBeat == 0 && myState->iamcore == 0){ 
     OLSR_DEBUG(LOG_PLUGINS,"Calling Reset Tree Links"); 
     reset_tree_links();
-    }
-
-//OLSR_DEBUG(LOG_PLUGINS,"OBAMP: Timer Expired Purging Nodes");
-
-
-  if (list_empty(&ListOfObampNodes) == 0) {     //if the list is NOT empty
-
-    list_for_each(pos, &ListOfObampNodes) {
-
-      tmp = list_entry(pos, struct ObampNode, list);
-      tmp->Texpire--;
-      if (tmp->MeshLock != 0)
-        tmp->MeshLock--;
-
-      //OLSR_DEBUG(LOG_PLUGINS,"Updating node %s with Texpire %d",ip4_to_string(&buf,tmp->neighbor_ip_addr.v4),tmp->Texpire);
-      if (tmp->Texpire == 0) {  //purge
-        OLSR_DEBUG(LOG_PLUGINS, "Purging node %s", ip4_to_string(&buf, tmp->neighbor_ip_addr.v4));
-        list_del(pos);
-        //OLSR_DEBUG(LOG_PLUGINS,"OBAMP CHECK EMPTY %d",list_empty(&ListOfObampNodes));
+  }
 
-        free(tmp);
-        nodesdeleted++;
-      }
+  //OLSR_DEBUG(LOG_PLUGINS,"OBAMP: Timer Expired Purging Nodes");
+  if (list_is_empty(&ListOfObampNodes)) {     //if the list is empty
+    //OLSR_DEBUG(LOG_PLUGINS,"OBAMP: List empty");
+    return;
+  }
 
+  OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+    tmp->Texpire--;
+    if (tmp->MeshLock != 0) {
+      tmp->MeshLock--;
     }
 
-    if (nodesdeleted != 0)
-      CoreElection();
-
-  } else {
-//OLSR_DEBUG(LOG_PLUGINS,"OBAMP: List empty");
+    //OLSR_DEBUG(LOG_PLUGINS,"Updating node %s with Texpire %d",ip4_to_string(&buf,tmp->neighbor_ip_addr.v4),tmp->Texpire);
+    if (tmp->Texpire == 0) {  //purge
+      OLSR_DEBUG(LOG_PLUGINS, "Purging node %s", ip4_to_string(&buf, tmp->neighbor_ip_addr.v4));
+      list_remove(&tmp->list);
+      //OLSR_DEBUG(LOG_PLUGINS,"OBAMP CHECK EMPTY %d",listold_empty(&ListOfObampNodes));
 
+      free(tmp);
+      nodesdeleted++;
+    }
   }
 
-  x = NULL;
+  if (nodesdeleted != 0) {
+    CoreElection();
+  }
 }
 
 
 void
-obamp_alive_gen(void *x  __attribute__ ((unused)))
+obamp_alive_gen(void *x __attribute__ ((unused)))
 {
   struct OBAMP_alive myAlive;
   OLSR_DEBUG(LOG_PLUGINS, "Calling obamp_alive_gen\n");
@@ -1626,102 +1487,86 @@ EncapFlowInObamp(int skfd, void *data __attribute__ ((unused)), unsigned int fla
   struct ipaddr_str buf;
 #endif
   struct ObampNode *tmp;
-  struct list_head *pos;
+  struct list_iterator iterator;
 
   union olsr_ip_addr dst;              /* Destination IP address in captured packet */
   struct ip *ipHeader;                 /* The IP header inside the captured IP packet */
   struct ip6_hdr *ipHeader6;           /* The IP header inside the captured IP packet */
 
-  if (skfd >= 0) {
-    struct sockaddr_ll pktAddr;
-    socklen_t addrLen = sizeof(pktAddr);
-    int nBytes;
-
-    nBytes = recvfrom(skfd, ipPacket, 1500,     //TODO: optimize me
-                      0, (struct sockaddr *)&pktAddr, &addrLen);
-    if (nBytes < 0) {
-
-      return;                   /* for */
-    }
-
-    /* if (nBytes < 0) */
-    /* Check if the number of received bytes is large enough for an IP
-     * packet which contains at least a minimum-size IP header.
-     * Note: There is an apparent bug in the packet socket implementation in
-     * combination with VLAN interfaces. On a VLAN interface, the value returned
-     * by 'recvfrom' may (but need not) be 4 (bytes) larger than the value
-     * returned on a non-VLAN interface, for the same ethernet frame. */
-    if (nBytes < (int)sizeof(struct ip)) {
-
-      OLSR_DEBUG(LOG_PLUGINS, "Captured frame too short");
-      return;                   /* for */
-    }
-
-    if (pktAddr.sll_pkttype == PACKET_OUTGOING || pktAddr.sll_pkttype == PACKET_MULTICAST)      // ||
-      //pktAddr.sll_pkttype == PACKET_BROADCAST)
-    {
+  struct sockaddr_ll pktAddr;
+  socklen_t addrLen;
+  int nBytes;
 
-      //do here
-      if ((ipPacket[0] & 0xf0) == 0x40) {       //IPV4
-
-        ipHeader = (struct ip *)ipPacket;
-
-        dst.v4 = ipHeader->ip_dst;
+  if (skfd < 0) {
+    return;
+  }
 
-        /* Only forward multicast packets. If configured, also forward local broadcast packets */
-        if (IsMulticast(&dst)) {
-          /* continue */
-        } else {
-          return;
-        }
-        if (ipHeader->ip_p != SOL_UDP) {
-          /* Not UDP */
-          OLSR_DEBUG(LOG_PLUGINS, "NON UDP PACKET\n");
-          return;               /* for */
-        } else {
-          //Forward the packet to tree links
-          if (list_empty(&ListOfObampNodes) == 0) {     //if the list is NOT empty
+  addrLen = sizeof(pktAddr);
 
-            list_for_each(pos, &ListOfObampNodes) {
+  nBytes = recvfrom(skfd, ipPacket, 1500,     //TODO: optimize me
+                    0, (struct sockaddr *)&pktAddr, &addrLen);
+  if (nBytes < 0) {
+    return;
+  }
 
-              tmp = list_entry(pos, struct ObampNode, list);
-              if (tmp->isTree == 1) {
+  /* Check if the number of received bytes is large enough for an IP
+   * packet which contains at least a minimum-size IP header.
+   * Note: There is an apparent bug in the packet socket implementation in
+   * combination with VLAN interfaces. On a VLAN interface, the value returned
+   * by 'recvfrom' may (but need not) be 4 (bytes) larger than the value
+   * returned on a non-VLAN interface, for the same ethernet frame. */
+  if (nBytes < (int)sizeof(struct ip)) {
+    OLSR_DEBUG(LOG_PLUGINS, "Captured frame too short");
+    return;                   /* for */
+  }
 
-                OLSR_DEBUG(LOG_PLUGINS, "Pushing data to Tree link to %s", ip4_to_string(&buf, tmp->neighbor_ip_addr.v4));
-                SendOBAMPData(&tmp->neighbor_ip_addr.v4, ipPacket, nBytes);
+  if (pktAddr.sll_pkttype == PACKET_OUTGOING || pktAddr.sll_pkttype == PACKET_MULTICAST)      // ||
+    //pktAddr.sll_pkttype == PACKET_BROADCAST)
+  {
+    //do here
+    if ((ipPacket[0] & 0xf0) == 0x40) {       //IPV4
+      ipHeader = (struct ip *)ipPacket;
 
-              }
-            }
-          }
-        }
+      dst.v4 = ipHeader->ip_dst;
 
-      }                         //END IPV4
+      /* Only forward multicast packets. If configured, also forward local broadcast packets */
+      if (!IsMulticast(&dst)) {
+        return;
+      }
 
-      else if ((ipPacket[0] & 0xf0) == 0x60) {  //IPv6
+      if (ipHeader->ip_p != SOL_UDP) {
+        /* Not UDP */
+        OLSR_DEBUG(LOG_PLUGINS, "NON UDP PACKET\n");
+        return;               /* for */
+      }
 
-        ipHeader6 = (struct ip6_hdr *)ipPacket;
-        if (ipHeader6->ip6_dst.s6_addr[0] == 0xff)      //Multicast
-        {
-          //Continua
-        } else {
-          return;               //not multicast
-        }
-        if (ipHeader6->ip6_nxt != SOL_UDP) {
-          /* Not UDP */
-          OLSR_DEBUG(LOG_PLUGINS, "NON UDP PACKET\n");
-          return;               /* for */
+      //Forward the packet to tree links
+      OLSR_FOR_ALL_OBAMPNODE_ENTRIES(tmp, iterator) {
+        if (tmp->isTree == 1) {
+          OLSR_DEBUG(LOG_PLUGINS, "Pushing data to Tree link to %s", ip4_to_string(&buf, tmp->neighbor_ip_addr.v4));
+          SendOBAMPData(&tmp->neighbor_ip_addr.v4, ipPacket, nBytes);
         }
+      }
+    }                         //END IPV4
+    else if ((ipPacket[0] & 0xf0) == 0x60) {  //IPv6
+      ipHeader6 = (struct ip6_hdr *)ipPacket;
+      if (ipHeader6->ip6_dst.s6_addr[0] != 0xff) {     //Multicast
+        return;               //not multicast
+      }
 
-      }                         //END IPV6
-      else
-        return;                 //Is not IP packet
-
-      // send the packet to OLSR forward mechanism
-      // SendOBAMPData(&tmp->neighbor_ip_addr.v6,ipPacket,nBytes);
-
+      if (ipHeader6->ip6_nxt != SOL_UDP) {
+        /* Not UDP */
+        OLSR_DEBUG(LOG_PLUGINS, "NON UDP PACKET\n");
+        return;               /* for */
+      }
+    }                         //END IPV6
+    else {
+      return;                 //Is not IP packet
+    }
 
-    }                           /* if (pktAddr.sll_pkttype == ...) */
-  }                             /* if (skfd >= 0 && (FD_ISSET...)) */
+    // send the packet to OLSR forward mechanism
+    // SendOBAMPData(&tmp->neighbor_ip_addr.v6,ipPacket,nBytes);
+  }                           /* if (pktAddr.sll_pkttype == ...) */
 }                               /* EncapFlowInObamp */
 
 //This function is called from olsrd_plugin.c and adds to the list the interfaces specified in the configuration file to sniff multicast traffic
@@ -1744,7 +1589,7 @@ AddObampSniffingIf(const char *ifName,
 
   OLSR_DEBUG(LOG_PLUGINS, "Adding interface to list");
 
-  list_add(&(ifToAdd->list), &ListOfObampSniffingIf);
+  list_add_tail(&ListOfObampSniffingIf, &(ifToAdd->list));
 
   OLSR_DEBUG(LOG_PLUGINS, "Adding if %s to list of ObampSniffingIfaces", ifToAdd->ifName);
 
@@ -1755,7 +1600,7 @@ AddObampSniffingIf(const char *ifName,
 int
 PreInitOBAMP(void)
 {
-  INIT_LIST_HEAD(&ListOfObampSniffingIf);
+  list_init_head(&ListOfObampSniffingIf);
   return 0;
 
 }
@@ -1809,7 +1654,7 @@ InitOBAMP(void)
 
   OLSR_DEBUG(LOG_PLUGINS, "SETUP: my IP - %s", ip4_to_string(&buf, myState->myipaddr.v4));
 
-  INIT_LIST_HEAD(&ListOfObampNodes);
+  list_init_head(&ListOfObampNodes);
 
 //OLSR cookies stuff for timers
   OBAMP_alive_gen_timer_cookie = olsr_alloc_cookie("OBAMP Alive Generation", OLSR_COOKIE_TYPE_TIMER);
index 6ba3603..b615b74 100644 (file)
@@ -43,7 +43,7 @@
 #ifndef _OBAMP_OBAMP_H
 #define _OBAMP_OBAMP_H
 
-#include "list.h"
+#include "common/list.h"
 
 #include "plugin.h"             /* union set_plugin_parameter_addon */
 
@@ -146,7 +146,7 @@ struct ObampNode {
 
   u_int8_t DataSeqNumber;
 
-  struct list_head list;
+  struct list_entity list;
 };
 
 //Interfaces of the router not talking OLSR, where we capture the multicast traffic
@@ -154,7 +154,7 @@ struct ObampSniffingIf {
 
   int skd;                             //Socket descriptor
   char ifName[16];                     //Interface name
-  struct list_head list;
+  struct list_entity list;
 
 };
 
index 332c992..7da593d 100644 (file)
@@ -56,7 +56,7 @@
 
 /* OBAMP includes */
 #include "obamp.h"
-#include "list.h"
+#include "common/list.h"
 
 static void __attribute__ ((constructor)) my_init(void);
 static void __attribute__ ((destructor)) my_fini(void);
index 5140193..e5de86f 100644 (file)
@@ -647,8 +647,8 @@ diff -Nur quagga-0.98.6/ospfd/ospf_vty.c quagga-0.98.6.patched/ospfd/ospf_vty.c
    int source;
 @@ -5574,7 +5605,7 @@
  
- DEFUN (ospf_distribute_list_out,
-        ospf_distribute_list_out_cmd,
+ DEFUN (ospf_distribute_listold_out,
+        ospf_distribute_listold_out_cmd,
 -       "distribute-list WORD out (kernel|connected|static|rip|bgp)",
 +       "distribute-list WORD out (kernel|connected|static|rip|bgp|olsr|batman)",
         "Filter networks in routing updates\n"
@@ -668,8 +668,8 @@ diff -Nur quagga-0.98.6/ospfd/ospf_vty.c quagga-0.98.6.patched/ospfd/ospf_vty.c
    int source;
 @@ -5596,7 +5630,7 @@
  
- DEFUN (no_ospf_distribute_list_out,
-        no_ospf_distribute_list_out_cmd,
+ DEFUN (no_ospf_distribute_listold_out,
+        no_ospf_distribute_listold_out_cmd,
 -       "no distribute-list WORD out (kernel|connected|static|rip|bgp)",
 +       "no distribute-list WORD out (kernel|connected|static|rip|bgp|olsr|batman)",
         NO_STR
index eaa1f5d..d7ca43a 100644 (file)
@@ -391,6 +391,7 @@ txtinfo_link(struct comport_connection *con,
     const char *cmd __attribute__ ((unused)), const char *param)
 {
   struct link_entry *lnk;
+  struct list_iterator iterator;
   size_t i;
   const char *template;
   int indexLength;
@@ -408,7 +409,7 @@ txtinfo_link(struct comport_connection *con,
   }
 
   /* Link set */
-  OLSR_FOR_ALL_LINK_ENTRIES(lnk) {
+  OLSR_FOR_ALL_LINK_ENTRIES(lnk, iterator) {
     olsr_ip_to_string(&buf_localip, &lnk->local_iface_addr);
     olsr_ip_to_string(&buf_neighip, &lnk->neighbor_iface_addr);
     strscpy(buf_sym, lnk->status == SYM_LINK ? OLSR_YES : OLSR_NO, sizeof(buf_sym));
@@ -424,7 +425,7 @@ txtinfo_link(struct comport_connection *con,
     if (abuf_templatef(&con->out, template, values_link, tmpl_indices, indexLength) < 0) {
         return ABUF_ERROR;
     }
-  } OLSR_FOR_ALL_LINK_ENTRIES_END(lnk);
+  }
 
   return CONTINUE;
 }
@@ -540,6 +541,7 @@ txtinfo_hna(struct comport_connection *con,
     const char *cmd __attribute__ ((unused)), const char *param __attribute__ ((unused)))
 {
   const struct ip_prefix_entry *hna;
+  struct list_iterator iterator;
   struct tc_entry *tc;
   const char *template;
   int indexLength;
@@ -557,7 +559,7 @@ txtinfo_hna(struct comport_connection *con,
   }
 
   /* Announced HNA entries */
-  OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna) {
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna, iterator) {
     olsr_ip_to_string(&buf_localip, &olsr_cnf->router_id);
     olsr_ip_prefix_to_string(&buf_destprefix, &hna->net);
     strscpy(buf_vtime.buf, "0.0", sizeof(buf_vtime));
@@ -566,7 +568,7 @@ txtinfo_hna(struct comport_connection *con,
         return ABUF_ERROR;
     }
   }
-  OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
+
   /* HNA entries */
   OLSR_FOR_ALL_TC_ENTRIES(tc) {
     struct hna_net *tmp_net;
@@ -601,6 +603,7 @@ txtinfo_mid(struct comport_connection *con,
 {
   struct tc_entry *tc;
   struct interface *interface;
+  struct list_iterator iterator;
 
   const char *template;
   int indexLength;
@@ -617,7 +620,7 @@ txtinfo_mid(struct comport_connection *con,
     return ABUF_ERROR;
   }
 
-  OLSR_FOR_ALL_INTERFACES(interface) {
+  OLSR_FOR_ALL_INTERFACES(interface, iterator) {
     if (olsr_ipcmp(&olsr_cnf->router_id, &interface->ip_addr) != 0) {
       olsr_ip_to_string(&buf_localip, &olsr_cnf->router_id);
       olsr_ip_to_string(&buf_aliasip, &interface->ip_addr);
@@ -627,7 +630,7 @@ txtinfo_mid(struct comport_connection *con,
           return ABUF_ERROR;
       }
     }
-  } OLSR_FOR_ALL_INTERFACES_END(interface)
+  }
 
   /* MID root is the TC entry */
   OLSR_FOR_ALL_TC_ENTRIES(tc) {
index ec19494..d1772d1 100644 (file)
@@ -115,7 +115,7 @@ avl_walk_prev_c(const struct avl_node *node)
 }
 
 /*
- * Macro to define an inline function to map from a list_node offset back to the
+ * Macro to define an inline function to map from a listold_node offset back to the
  * base of the datastructure. That way you save an extra data pointer.
  */
 #define AVLNODE2STRUCT(funcname, structname, avlnodename) \
diff --git a/src/common/container_of.h b/src/common/container_of.h
new file mode 100644 (file)
index 0000000..7ad3a29
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * PacketBB handler library (see RFC 5444)
+ * Copyright (c) 2010 Henning Rogge <henning.rogge@fkie.fraunhofer.de>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org/git for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ */
+
+#ifndef CONTAINER_OF_H_
+#define CONTAINER_OF_H_
+
+#include "stddef.h"
+
+#ifndef container_of
+
+/**
+ * casts an embedded node of a list/tree into the surrounding struct
+ * @param ptr pointer to node
+ * @param type data type of surrounding struct
+ * @param member name of node inside struct
+ * @return pointer to surrounding struct
+ */
+#define container_of(ptr, type, member) ((type *)( (char *)(ptr) - offsetof(type,member) ))
+#endif
+
+#endif /* CONTAINER_OF_H_ */
index 25e2e30..1fcb813 100644 (file)
@@ -1,7 +1,6 @@
-
 /*
- * The olsr.org Optimized Link-State Routing daemon(olsrd)
- * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
+ * PacketBB handler library (see RFC 5444)
+ * Copyright (c) 2010 Henning Rogge <henning.rogge@fkie.fraunhofer.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * Visit http://www.olsr.org for more information.
+ * Visit http://www.olsr.org/git for more information.
  *
  * If you find this software useful feel free to make a donation
  * to the project. For more information see the website or contact
  * the copyright holders.
- *
  */
 
-#ifndef _LIST_H
-#define _LIST_H
-
-#include "defs.h"
+#ifndef LIST_H_
+#define LIST_H_
 
 #include <stddef.h>
-#include <stdlib.h>
+#include <stdbool.h>
+
+#include "container_of.h"
+
+/**
+ * this struct is used as list head and list elements.
+ * the list-nodes and the list-head contain two rings of
+ * pointers (one forward, one backward), the first/last node
+ * have a link to the head, no NULL element.
+ */
+struct list_entity {
+  /**
+   * Pointer to next element in list or to list head if last element
+   */
+  struct list_entity *next;
 
-struct list_node {
-  struct list_node *next;
-  struct list_node *prev;
+  /**
+   * Pointer to previous element in list or list head if first element
+   */
+  struct list_entity *prev;
 };
 
-/* init a circular list  */
-static INLINE void
-list_head_init(struct list_node *node)
-{
-  node->prev = node->next = node;
+/**
+ * initialize a list-head
+ * @param pointer to list-head
+ */
+static inline void list_init_head(struct list_entity *head) {
+  head->next = head->prev = head;
 }
 
-/* clear a node  */
-static INLINE void
-list_node_init(struct list_node *node)
-{
-  node->prev = node->next = NULL;
+/**
+ * initialize a list-node
+ * @param pointer to list-node
+ */
+static inline void list_init_node(struct list_entity *entity) {
+  entity->next = entity->prev = NULL;
 }
 
-/* test if a node is on a list */
-static INLINE int
-list_node_on_list(const struct list_node *node)
-{
-  return node->prev != NULL || node->next != NULL;
+/**
+ * internal function to add a new node between two other nodes.
+ * @param prev node before the insertion point
+ * @param next node after the insertion point
+ * @param new node which will be added to the list between 'prev' and 'next'
+ */
+static inline void __list_add(struct list_entity *prev, struct list_entity *next, struct list_entity *new) {
+  new->next = next;
+  new->prev = prev;
+  next->prev = new;
+  prev->next = new;
 }
 
-/* test if a list is empty */
-static INLINE int
-list_is_empty(const struct list_node *node)
-{
-  return node->prev == node && node->next == node;
+/**
+ * adds a node at the beginning of a list
+ * @param head pointer to list head
+ * @param new node which will be added to the list
+ */
+static inline void list_add_head(struct list_entity *head, struct list_entity *new) {
+  __list_add(head, head->next, new);
 }
 
-/* Insert at the top of the list */
-static INLINE void
-list_add_after(struct list_node *pos_node, struct list_node *new_node)
-{
-  new_node->next = pos_node->next;
-  new_node->prev = pos_node;
+/**
+ * adds a node at the end of a list
+ * @param head pointer to list head
+ * @param new node which will be added to the list
+ */
+static inline void list_add_tail(struct list_entity *head, struct list_entity *new) {
+  __list_add(head->prev, head, new);
+}
 
-  pos_node->next->prev = new_node;
-  pos_node->next = new_node;
+/**
+ * adds a node before another node
+ * @param before reference node in the list
+ * @param new node which will be added to the list
+ */
+static inline void list_add_before(struct list_entity *before, struct list_entity *new) {
+  __list_add(before->prev, before, new);
 }
 
-/* Insert at the tail of the list */
-static INLINE void
-list_add_before(struct list_node *pos_node, struct list_node *new_node)
-{
-  new_node->prev = pos_node->prev;
-  new_node->next = pos_node;
+/**
+ * adds a node after another node
+ * @param before reference node in the list
+ * @param new node which will be added to the list
+ */
+static inline void list_add_after(struct list_entity *after, struct list_entity *new) {
+  __list_add(after, after->next, new);
+}
 
-  pos_node->prev->next = new_node;
-  pos_node->prev = new_node;
+/**
+ * internal function that removes the nodes between two other nodes.
+ * @param prev node before the removed part of the list
+ * @param next node after the removed part of the list
+ */
+static inline void __list_remove(struct list_entity *prev, struct list_entity *next) {
+  prev->next = next;
+  next->prev = prev;
 }
 
-static INLINE void
-list_remove(struct list_node *del_node)
-{
-  del_node->next->prev = del_node->prev;
-  del_node->prev->next = del_node->next;
+/**
+ * removes a node from a list and clears node pointers
+ * @param entity node to remove from the list
+ */
+static inline void list_remove(struct list_entity *entity) {
+  __list_remove(entity->prev, entity->next);
+  entity->prev = entity->next = NULL;
+}
 
-  list_node_init(del_node);
+/**
+ * checks if list is empty
+ * @param head pointer to list head
+ * @return true if list is empty, false otherwise
+ */
+static inline bool list_is_empty(struct list_entity *head) {
+  return head->next == head && head->prev == head;
 }
 
-/*
- * Merge elements of list_head2 at the end of list_head1.
- * list_head2 will be left empty.
- */
-static INLINE void
-list_merge(struct list_node *list_head1, struct list_node *list_head2)
-{
-  if (!list_is_empty(list_head2)) {
-    list_head1->next->prev = list_head2->prev;
-    list_head2->prev->next = list_head1->next;
-    list_head1->next = list_head2->next;
-    list_head2->next->prev = list_head1;
-    list_head2->next = list_head2->prev = list_head2;
-  }
+/**
+ * checks if node has been added to a list
+ * @param node pointer to node
+ * @return true if both pointers of the node are initialized,
+ *   false otherwise
+ */
+static inline bool list_node_added(struct list_entity *node) {
+  return node->next != NULL && node->prev != NULL;
 }
 
-/*
- * Macro to define an inline function to map from a list_node offset back to the
- * base of the datastructure. That way you save an extra data pointer.
- */
-#define LISTNODE2STRUCT(funcname, structname, listnodename) \
-static INLINE structname * funcname (struct list_node *ptr)\
-{\
-  return( \
-    ptr ? \
-      (structname *) (((size_t) ptr) - offsetof(structname, listnodename)) : \
-      NULL); \
+/**
+ * checks if a node is the first element of a list
+ * @param head pointer to list head
+ * @param entity pointer to node
+ * @return true if node is first element of list, false otherwise
+ */
+static inline bool list_is_first(struct list_entity *head, struct list_entity *entity) {
+  return head->next == entity;
 }
 
-#endif /* _LIST_H */
+/**
+ * checks if node is the last element of a list
+ * @param head pointer to list head
+ * @param entity pointer to node
+ * @return true if node is last element of list, false otherwise
+ */
+static inline bool list_is_last(struct list_entity *head, struct list_entity *entity) {
+  return head->prev == entity;
+}
 
-/*
- * Local Variables:
- * c-basic-offset: 2
- * indent-tabs-mode: nil
- * End:
+/**
+ * Merge two lists and clear the second head
+ * @param add_to head of the list which will contain all elements
+ * @param remove_from head of the list which elements will be added after the elements
+ *   of the first one
  */
+static inline void list_merge(struct list_entity *add_to, struct list_entity *remove_from) {
+  if (list_is_empty(remove_from)) {
+    return;
+  }
+
+  add_to->next->prev = remove_from->prev;
+  remove_from->prev->next = add_to->next;
+  add_to->next = remove_from->next;
+  remove_from->next->prev = add_to;
+
+  list_init_head(remove_from);
+}
+
+/**
+ * @param head pointer to list-head
+ * @param element pointer to a node element
+ *    (don't need to be initialized)
+ * @param list_member name of the list_entity element inside the
+ *    larger struct
+ * @return pointer to the first element of the list
+ *    (automatically converted to type 'element')
+ */
+#define list_first_element(head, element, list_member) \
+    container_of((head)->next, typeof(*(element)), list_member)
+
+/**
+ * @param head pointer to list-head
+ * @param element pointer to a node element
+ *    (don't need to be initialized)
+ * @param list_member name of the list_entity element inside the
+ *    larger struct
+ * @return pointer to the last element of the list
+ *    (automatically converted to type 'element')
+ */
+#define list_last_element(head, element, list_member) \
+    container_of((head)->prev, typeof(*(element)), list_member)
+
+/**
+ * This function must not be called for the last element of
+ * a list
+ *
+ * @param element pointer to a node of the list
+ * @param list_member name of the list_entity element inside the
+ *    larger struct
+ * @return pointer to the node after 'element'
+ *    (automatically converted to type 'element')
+ */
+#define list_next_element(element, list_member) \
+  container_of((&(element)->list_member)->next, typeof(*(element)), list_member)
+
+/**
+ * This function must not be called for the first element of
+ * a list
+ *
+ * @param element pointer to a node of the list
+ * @param list_member name of the list_entity element inside the
+ *    larger struct
+ * @return pointer to the node before 'element'
+ *    (automatically converted to type 'element')
+ */
+#define list_prev_element(element, list_member) \
+  container_of((&(element)->list_member)->prev, typeof(*(element)), list_member)
+
+/**
+ * internal macro that loops over a limited range of nodes
+ * @param first_entity first element of loop
+ * @param last_entity last element of loop
+ * @param element pointer to list element struct
+ * @param list_member name of list_entity within list element struct
+ * @param loop_ptr iteration list_entity pointer
+ */
+#define __list_for_element_range(first_entity, last_entity, element, list_member, loop_ptr) \
+  for (loop_ptr = (first_entity), element = container_of(loop_ptr, typeof(*(element)), list_member); \
+       loop_ptr->prev != (last_entity); \
+       loop_ptr = loop_ptr->next, \
+         element = container_of(loop_ptr, typeof(*(element)), list_member))
+
+
+/**
+ * internal macro that loops backward over a limited range of nodes
+ * @param first_entity first element of range (will be last returned by the loop)
+ * @param last_entity last element of range (will be first returned by the loop)
+ * @param element pointer to list element struct
+ * @param list_member name of list_entity within list element struct
+ * @param loop_ptr iteration list_entity pointer
+ */
+#define __list_for_element_range_reverse(first_entity, last_entity, element, list_member, loop_ptr) \
+  for (loop_ptr = (last_entity), element = container_of(loop_ptr, typeof(*(element)), list_member); \
+       loop_ptr->next != (first_entity); \
+       loop_ptr = loop_ptr->prev, \
+         element = container_of(loop_ptr, typeof(*(element)), list_member))
+
+/**
+ * Loop over all elements of a list, used similar to a for() command.
+ * This loop should not be used if elements are removed from the list during
+ * the loop.
+ *
+ * @param head pointer to list-head
+ * @param element pointer to a node of the list, this element will
+ *    contain the current node of the list during the loop
+ * @param list_member name of the list_entity element inside the
+ *    larger struct
+ * @param loop_ptr pointer to an list_entity which is used as the
+ *    internal iterator
+ */
+#define list_for_each_element(head, element, list_member, loop_ptr) \
+  __list_for_element_range((head)->next, (head)->prev, element, list_member, loop_ptr)
+
+/**
+ * Loop over all elements of a list backwards, used similar to a for() command.
+ * This loop should not be used if elements are removed from the list during
+ * the loop.
+ *
+ * @param head pointer to list-head
+ * @param element pointer to a node of the list, this element will
+ *    contain the current node of the list during the loop
+ * @param list_member name of the list_entity element inside the
+ *    larger struct
+ * @param loop_ptr pointer to an list_entity which is used as the
+ *    internal iterator
+ */
+#define list_for_each_element_reverse(head, element, list_member, loop_ptr) \
+  __list_for_element_range_reverse((head)->next, (head)->prev, element, list_member, loop_ptr)
+
+/**
+ * Loop over a block of elements of a list, used similar to a for() command.
+ * This loop should not be used if elements are removed from the list during
+ * the loop.
+ *
+ * @param first pointer to first element of loop
+ * @param last pointer to last element of loop
+ * @param element pointer to a node of the list, this element will
+ *    contain the current node of the list during the loop
+ * @param list_member name of the list_entity element inside the
+ *    larger struct
+ * @param loop_ptr pointer to an list_entity which is used as the
+ *    internal iterator
+ */
+#define list_for_element_range(first, last, element, list_member, loop_ptr) \
+  __list_for_element_range(&(first)->list_member, &(last)->list_member, element, list_member, loop_ptr)
+
+/**
+ * Loop over a block of elements of a list backwards, used similar to a for() command.
+ * This loop should not be used if elements are removed from the list during
+ * the loop.
+ *
+ * @param first pointer to first element of range
+ * @param last pointer to last element of range
+ * @param element pointer to a node of the list, this element will
+ *    contain the current node of the list during the loop
+ * @param list_member name of the list_entity element inside the
+ *    larger struct
+ * @param loop_ptr pointer to an list_entity which is used as the
+ *    internal iterator
+ */
+#define list_for_element_range_reverse(first, last, element, list_member, loop_ptr) \
+  __list_for_element_range_reverse(&(first)->list_member, &(last)->list_member, element, list_member, loop_ptr)
+
+/**
+ * Loop over a block of elements of a list, used similar to a for() command.
+ * This loop should not be used if elements are removed from the list during
+ * the loop.
+ * The loop runs from the element 'first' to the end of the list.
+ *
+ * @param head pointer to head of list
+ * @param first pointer to first element of loop
+ * @param element pointer to a node of the list, this element will
+ *    contain the current node of the list during the loop
+ * @param list_member name of the list_entity element inside the
+ *    larger struct
+ * @param loop_ptr pointer to an list_entity which is used as the
+ *    internal iterator
+ */
+#define list_for_element_to_last(head, first, element, list_member, loop_ptr) \
+  __list_for_element_range(&(first)->list_member, (head)->prev, element, list_member, loop_ptr)
+
+/**
+ * Loop over a block of elements of a list backwards, used similar to a for() command.
+ * This loop should not be used if elements are removed from the list during
+ * the loop.
+ * The loop runs from the end of the list to the element 'first'.
+ *
+ * @param head pointer to head of list
+ * @param first pointer to first element of loop
+ * @param element pointer to a node of the list, this element will
+ *    contain the current node of the list during the loop
+ * @param list_member name of the list_entity element inside the
+ *    larger struct
+ * @param loop_ptr pointer to an list_entity which is used as the
+ *    internal iterator
+ */
+#define list_for_element_to_last_reverse(head, first, element, list_member, loop_ptr) \
+  __list_for_element_range_reverse(&(first)->list_member, (head)->prev, element, list_member, loop_ptr)
+
+/**
+ * Loop over a block of elements of a list, used similar to a for() command.
+ * This loop should not be used if elements are removed from the list during
+ * the loop.
+ * The loop runs from the start of the list to the element 'last'.
+ *
+ * @param head pointer to head of list
+ * @param last pointer to last element of loop
+ * @param element pointer to a node of the list, this element will
+ *    contain the current node of the list during the loop
+ * @param list_member name of the list_entity element inside the
+ *    larger struct
+ * @param loop_ptr pointer to an list_entity which is used as the
+ *    internal iterator
+ */
+#define list_for_first_to_element(head, last, element, list_member, loop_ptr) \
+  __list_for_element_range((head)->next, &(last)->list_member, element, list_member, loop_ptr)
+
+/**
+ * Loop over a block of elements of a list backwards, used similar to a for() command.
+ * This loop should not be used if elements are removed from the list during
+ * the loop.
+ * The loop runs from the element 'last' to the start of the list.
+ *
+ * @param head pointer to head of list
+ * @param last pointer to last element of loop
+ * @param element pointer to a node of the list, this element will
+ *    contain the current node of the list during the loop
+ * @param list_member name of the list_entity element inside the
+ *    larger struct
+ * @param loop_ptr pointer to an list_entity which is used as the
+ *    internal iterator
+ */
+#define list_for_first_to_element_reverse(head, last, element, list_member, loop_ptr) \
+  __list_for_element_range_reverse((head)->next, &(last)->list_member, element, list_member, loop_ptr)
+
+/**
+ * Loop over all elements of a list, used similar to a for() command.
+ * This loop can be used if the current element might be removed from
+ * the list during the loop. Other elements should not be removed during
+ * the loop.
+ *
+ * @param head pointer to list-head
+ * @param element pointer to a node of the list, this element will
+ *    contain the current node of the list during the loop
+ * @param list_member name of the list_entity element inside the
+ *    larger struct
+ * @param loop_ptr pointer to an list_entity which is used as the
+ *    internal iterator for the loop
+ * @param safe_ptr pointer to an list_entity which is used to store
+ *    the next node during the loop
+ */
+#define list_for_each_element_safe(head, element, list_member, loop_ptr, safe_ptr) \
+  for (loop_ptr = (head)->next, safe_ptr = loop_ptr->next, \
+         element = container_of(loop_ptr, typeof(*(element)), list_member); \
+       loop_ptr != head; \
+       loop_ptr = safe_ptr, safe_ptr = safe_ptr->next, \
+         element = container_of(loop_ptr, typeof(*(element)), list_member))
+
+/**
+ * Loop over all elements of a list backwards, used similar to a for() command.
+ * This loop can be used if the current element might be removed from
+ * the list during the loop. Other elements should not be removed during
+ * the loop.
+ *
+ * @param head pointer to list-head
+ * @param element pointer to a node of the list, this element will
+ *    contain the current node of the list during the loop
+ * @param list_member name of the list_entity element inside the
+ *    larger struct
+ * @param loop_ptr pointer to an list_entity which is used as the
+ *    internal iterator for the loop
+ * @param safe_ptr pointer to an list_entity which is used to store
+ *    the next node during the loop
+ */
+#define list_for_each_element_reverse_safe(head, element, list_member, loop_ptr, safe_ptr) \
+  for (loop_ptr = (head)->prev, safe_ptr = loop_ptr->prev, \
+         element = container_of(loop_ptr, typeof(*(element)), list_member); \
+       loop_ptr != head; \
+       loop_ptr = safe_ptr, safe_ptr = safe_ptr->prev, \
+         element = container_of(loop_ptr, typeof(*(element)), list_member))
+
+#endif /* LIST_H_ */
index 4c404b1..67a20f7 100644 (file)
@@ -47,6 +47,8 @@
 #include <stdio.h>
 #include <errno.h>
 
+#include "common/list.h"
+
 #ifdef WIN32
 #define IF_NAMESIZE 32
 #endif
@@ -112,6 +114,13 @@ enum app_state {
 #endif
 };
 
+/**
+ * Double list pointer for save iteration
+ */
+struct list_iterator {
+  struct list_entity *loop;
+  struct list_entity *safe;
+};
 extern volatile enum app_state app_state;
 
 #endif
index 1362a27..62298e2 100644 (file)
@@ -326,6 +326,7 @@ olsr_input_hna(struct olsr_message *msg,
 void
 generate_hna(void *p __attribute__ ((unused))) {
   struct interface *ifp;
+  struct list_iterator iterator;
   struct ip_prefix_entry *h;
   uint8_t msg_buffer[MAXMESSAGESIZE - OLSR_HEADERSIZE] __attribute__ ((aligned));
   uint8_t *curr = msg_buffer;
@@ -347,14 +348,14 @@ generate_hna(void *p __attribute__ ((unused))) {
   pkt_put_u16(&curr, get_msg_seqno());
 
   last = msg_buffer + sizeof(msg_buffer) - olsr_cnf->ipsize;
-  OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, h) {
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, h, iterator) {
     union olsr_ip_addr subnet;
 
     olsr_prefix_to_netmask(&subnet, h->net.prefix_len);
     sendHNA = true;
     pkt_put_ipaddress(&curr, &h->net.prefix);
     pkt_put_ipaddress(&curr, &subnet);
-  } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
+  }
 
   if (!sendHNA) {
     return;
@@ -362,13 +363,13 @@ generate_hna(void *p __attribute__ ((unused))) {
 
   pkt_put_u16(&length_field, curr - msg_buffer);
 
-  OLSR_FOR_ALL_INTERFACES(ifp) {
+  OLSR_FOR_ALL_INTERFACES(ifp, iterator) {
     if (net_outbuffer_bytes_left(ifp) < curr - msg_buffer) {
       net_output(ifp);
       set_buffer_timer(ifp);
     }
     net_outbuffer_push(ifp, msg_buffer, curr - msg_buffer);
-  } OLSR_FOR_ALL_INTERFACES_END(ifp)
+  }
 }
 
 /*
index 2626e42..838c44b 100644 (file)
@@ -58,7 +58,7 @@
 #include <assert.h>
 
 /* The interface list head */
-struct list_node interface_head;
+struct list_entity interface_head;
 
 /* tree of lost interface IPs */
 struct avl_tree interface_lost_tree;
@@ -97,7 +97,7 @@ init_interfaces(void)
   struct olsr_if_config *tmp_if;
 
   /* Initial values */
-  list_head_init(&interface_head);
+  list_init_head(&interface_head);
   avl_init(&interface_lost_tree, avl_comp_default);
 
   /*
@@ -177,11 +177,12 @@ is_lost_interface_ip(union olsr_ip_addr *ip) {
 void destroy_interfaces(void) {
   struct interface *iface;
   struct interface_lost *lost;
+  struct list_iterator iterator;
 
-  OLSR_FOR_ALL_INTERFACES(iface) {
+  OLSR_FOR_ALL_INTERFACES(iface, iterator) {
     struct interface **ptr = &iface;
     remove_interface(ptr);
-  } OLSR_FOR_ALL_INTERFACES_END()
+  }
 
   OLSR_FOR_ALL_LOSTIF_ENTRIES(lost) {
     remove_lost_interface_ip(lost);
@@ -312,6 +313,7 @@ struct interface *
 if_ifwithaddr(const union olsr_ip_addr *addr)
 {
   struct interface *ifp;
+  struct list_iterator iterator;
   if (!addr) {
     return NULL;
   }
@@ -319,22 +321,18 @@ if_ifwithaddr(const union olsr_ip_addr *addr)
   if (olsr_cnf->ip_version == AF_INET) {
 
     /* IPv4 */
-    OLSR_FOR_ALL_INTERFACES(ifp) {
+    OLSR_FOR_ALL_INTERFACES(ifp, iterator) {
       if (ip4cmp(&ifp->int_addr.sin_addr, &addr->v4) == 0) {
         return ifp;
       }
     }
-    OLSR_FOR_ALL_INTERFACES_END(ifp);
-
   } else {
-
     /* IPv6 */
-    OLSR_FOR_ALL_INTERFACES(ifp) {
+    OLSR_FOR_ALL_INTERFACES(ifp, iterator) {
       if (ip6cmp(&ifp->int6_addr.sin6_addr, &addr->v6) == 0) {
         return ifp;
       }
     }
-    OLSR_FOR_ALL_INTERFACES_END(ifp);
   }
   return NULL;
 }
@@ -350,13 +348,13 @@ struct interface *
 if_ifwithsock(int fd)
 {
   struct interface *ifp;
+  struct list_iterator iterator;
 
-  OLSR_FOR_ALL_INTERFACES(ifp) {
+  OLSR_FOR_ALL_INTERFACES(ifp, iterator) {
     if (ifp->olsr_socket == fd) {
       return ifp;
     }
   }
-  OLSR_FOR_ALL_INTERFACES_END(ifp);
 
   return NULL;
 }
@@ -373,14 +371,14 @@ struct interface *
 if_ifwithname(const char *if_name)
 {
   struct interface *ifp;
-  OLSR_FOR_ALL_INTERFACES(ifp) {
+  struct list_iterator iterator;
 
+  OLSR_FOR_ALL_INTERFACES(ifp, iterator) {
     /* good ol' strcmp should be sufficient here */
     if (strcmp(ifp->int_name, if_name) == 0) {
       return ifp;
     }
   }
-  OLSR_FOR_ALL_INTERFACES_END(ifp);
 
   return NULL;
 }
@@ -398,12 +396,12 @@ struct interface *
 if_ifwithindex(const int if_index)
 {
   struct interface *ifp;
-  OLSR_FOR_ALL_INTERFACES(ifp) {
+  struct list_iterator iterator;
+  OLSR_FOR_ALL_INTERFACES(ifp, iterator) {
     if (ifp->if_index == if_index) {
       return ifp;
     }
   }
-  OLSR_FOR_ALL_INTERFACES_END(ifp);
 
   return NULL;
 }
@@ -450,7 +448,7 @@ unlock_interface(struct interface *ifp)
   }
 
   /* Node must be dequeued at this point */
-  assert(!list_node_on_list(&ifp->int_node));
+  assert(!list_node_added(&ifp->int_node));
 
   /* Free memory */
   free(ifp->int_name);
index a3d8512..a226ba9 100644 (file)
@@ -122,7 +122,7 @@ struct olsr_netbuf {
  * interface participating in the OLSRD routing
  */
 struct interface {
-  struct list_node int_node;           /* List of all interfaces */
+  struct list_entity int_node;         /* List of all interfaces */
 
   enum interface_mode mode;            /* mode of the interface, default is mesh */
 
@@ -170,19 +170,8 @@ struct interface {
   uint32_t refcount;                   /* Refcount */
 };
 
-LISTNODE2STRUCT(list2interface, struct interface, int_node);
-
 /* deletion safe macro for interface list traversal */
-#define OLSR_FOR_ALL_INTERFACES(interface) \
-{ \
-  struct list_node *_interface_node, *_next_interface_node; \
-  for (_interface_node = interface_head.next; \
-    _interface_node != &interface_head; \
-    _interface_node = _next_interface_node) { \
-    _next_interface_node = _interface_node->next; \
-    interface = list2interface(_interface_node);
-#define OLSR_FOR_ALL_INTERFACES_END(interface) }}
-
+#define OLSR_FOR_ALL_INTERFACES(interface, iterator) list_for_each_element_safe(&interface_head, interface, int_node, iterator.loop, iterator.safe)
 
 struct interface_lost {
   struct avl_node node;
@@ -207,7 +196,7 @@ AVLNODE2STRUCT(node_tree2lostif, interface_lost, node);
 #define IFCHG_IF_UPDATE        3
 
 /* The interface list head */
-extern struct list_node EXPORT(interface_head);
+extern struct list_entity EXPORT(interface_head);
 
 typedef int (*ifchg_cb_func) (struct interface *, int);
 
index dc30908..3414fa7 100644 (file)
@@ -59,7 +59,7 @@
 #include <assert.h>
 
 /* head node for all link sets */
-struct list_node link_entry_head;
+struct list_entity link_entry_head;
 
 static struct olsr_cookie_info *link_dead_timer_cookie = NULL;
 static struct olsr_cookie_info *link_loss_timer_cookie = NULL;
@@ -85,7 +85,7 @@ olsr_init_link_set(void)
   OLSR_INFO(LOG_LINKS, "Initialize linkset...\n");
 
   /* Init list head */
-  list_head_init(&link_entry_head);
+  list_init_head(&link_entry_head);
 
   link_dead_timer_cookie = olsr_alloc_cookie("Link dead", OLSR_COOKIE_TYPE_TIMER);
   link_loss_timer_cookie = olsr_alloc_cookie("Link loss", OLSR_COOKIE_TYPE_TIMER);
@@ -138,14 +138,14 @@ struct link_entry *
 get_best_link_to_neighbor(struct nbr_entry *nbr)
 {
   struct link_entry *walker, *good_link;
+  struct list_iterator iterator;
   olsr_linkcost curr_lcost = LINK_COST_BROKEN;
 
   /* we haven't selected any links, yet */
   good_link = NULL;
 
   /* loop through all links that we have */
-  OLSR_FOR_ALL_LINK_ENTRIES(walker) {
-
+  OLSR_FOR_ALL_LINK_ENTRIES(walker, iterator) {
     /* if this is not a link to the neighour in question, skip */
     if (walker->neighbor != nbr || lookup_link_status(walker) != SYM_LINK)
       continue;
@@ -159,7 +159,6 @@ get_best_link_to_neighbor(struct nbr_entry *nbr)
       good_link = walker;
     }
   }
-  OLSR_FOR_ALL_LINK_ENTRIES_END(walker);
 
   /*
    * if we haven't found any symmetric links, try to return an asymmetric link.
@@ -257,18 +256,18 @@ void
 olsr_delete_link_entry_by_if(const struct interface *ifp)
 {
   struct link_entry *link;
+  struct list_iterator iterator;
 #if !defined REMOVE_LOG_DEBUG
   struct ipaddr_str buf;
 #endif
 
-  OLSR_FOR_ALL_LINK_ENTRIES(link) {
+  OLSR_FOR_ALL_LINK_ENTRIES(link, iterator) {
     if (ifp == link->inter) {
       OLSR_DEBUG(LOG_LINKS, "Removing link %s of interface %s\n",
           olsr_ip_to_string(&buf, &link->neighbor_iface_addr), ifp->int_name);
       olsr_delete_link_entry(link);
     }
   }
-  OLSR_FOR_ALL_LINK_ENTRIES_END(link);
 }
 
 /**
@@ -463,13 +462,13 @@ int
 check_neighbor_link(const union olsr_ip_addr *int_addr)
 {
   struct link_entry *link;
+  struct list_iterator iterator;
 
-  OLSR_FOR_ALL_LINK_ENTRIES(link) {
+  OLSR_FOR_ALL_LINK_ENTRIES(link, iterator) {
     if (olsr_ipcmp(int_addr, &link->neighbor_iface_addr) == 0) {
       return lookup_link_status(link);
     }
   }
-  OLSR_FOR_ALL_LINK_ENTRIES_END(link);
 
   return UNSPEC_LINK;
 }
@@ -486,8 +485,9 @@ struct link_entry *
 lookup_link_entry(const union olsr_ip_addr *remote, const union olsr_ip_addr *remote_main, const struct interface *local)
 {
   struct link_entry *link;
+  struct list_iterator iterator;
 
-  OLSR_FOR_ALL_LINK_ENTRIES(link) {
+  OLSR_FOR_ALL_LINK_ENTRIES(link, iterator) {
     if (olsr_ipcmp(remote, &link->neighbor_iface_addr) == 0 && (link->if_name ? !strcmp(link->if_name, local->int_name)
                                                                 : olsr_ipcmp(&local->ip_addr, &link->local_iface_addr) == 0)) {
       /* check the remote-main address only if there is one given */
@@ -503,7 +503,6 @@ lookup_link_entry(const union olsr_ip_addr *remote, const union olsr_ip_addr *re
       return link;
     }
   }
-  OLSR_FOR_ALL_LINK_ENTRIES_END(link);
 
   return NULL;
 }
@@ -577,20 +576,19 @@ int
 replace_neighbor_link_set(const struct nbr_entry *old, struct nbr_entry *new)
 {
   struct link_entry *link;
+  struct list_iterator iterator;
   int retval = 0;
 
   if (list_is_empty(&link_entry_head)) {
     return retval;
   }
 
-  OLSR_FOR_ALL_LINK_ENTRIES(link) {
-
+  OLSR_FOR_ALL_LINK_ENTRIES(link, iterator) {
     if (link->neighbor == old) {
       link->neighbor = new;
       retval++;
     }
   }
-  OLSR_FOR_ALL_LINK_ENTRIES_END(link);
 
   return retval;
 }
@@ -636,6 +634,7 @@ olsr_print_link_set(void)
 #if !defined REMOVE_LOG_INFO
   /* The whole function makes no sense without it. */
   struct link_entry *walker;
+  struct list_iterator iterator;
   char totaltxt[256];
   const char *txt;
   int addrsize;
@@ -672,7 +671,7 @@ olsr_print_link_set(void)
   OLSR_INFO(LOG_LINKS, "\n--- %s ---------------------------------------------------- LINKS\n\n", olsr_wallclock_string());
   OLSR_INFO_NH(LOG_LINKS, "%-*s  %-6s %s %s\n", addrsize, "IP address", "hyst", totaltxt , olsr_get_linklabel(0));
 
-  OLSR_FOR_ALL_LINK_ENTRIES(walker) {
+  OLSR_FOR_ALL_LINK_ENTRIES(walker, iterator) {
     struct ipaddr_str buf;
     char lqbuffer[LQTEXT_MAXLENGTH];
 
@@ -705,7 +704,7 @@ olsr_print_link_set(void)
     OLSR_INFO_NH(LOG_LINKS, "%-*s %s %s\n",
                  addrsize, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr),
                  totaltxt, olsr_get_linkcost_text(walker->linkcost, false, lqbuffer, sizeof(lqbuffer)));
-  } OLSR_FOR_ALL_LINK_ENTRIES_END(walker);
+  }
 #endif
 }
 
@@ -737,6 +736,7 @@ generate_hello(void *p) {
   uint8_t *curr = msg_buffer;
   uint8_t *length_field, *last;
   struct link_entry *link;
+  struct list_iterator iterator;
   uint8_t writeLinkType, writeNeighType;
   OLSR_INFO(LOG_PACKET_CREATION, "Building Hello for %s\n-------------------\n", ifp->int_name);
 
@@ -757,7 +757,7 @@ generate_hello(void *p) {
   last = msg_buffer + sizeof(msg_buffer) - olsr_cnf->ipsize;
 
   /* first calculate local link status */
-  OLSR_FOR_ALL_LINK_ENTRIES(link) {
+  OLSR_FOR_ALL_LINK_ENTRIES(link, iterator) {
     if (olsr_ipcmp(&link->local_iface_addr, &ifp->ip_addr) != 0) {
       link->iflocal_link_status = UNSPEC_LINK;
     }
@@ -774,14 +774,14 @@ generate_hello(void *p) {
     else {
       link->iflocal_neigh_status = NOT_NEIGH;
     }
-  } OLSR_FOR_ALL_LINK_ENTRIES_END(link)
+  }
 
   for (writeNeighType = 0; writeNeighType < COUNT_NEIGH_TYPES; writeNeighType++) {
     for (writeLinkType = 0; writeLinkType < COUNT_LINK_TYPES; writeLinkType++) {
       bool first = true;
       uint8_t *linkstart = NULL;
 
-      OLSR_FOR_ALL_LINK_ENTRIES(link) {
+      OLSR_FOR_ALL_LINK_ENTRIES(link, iterator) {
         if (link->iflocal_link_status != writeLinkType
             || link->iflocal_neigh_status != writeNeighType) {
           continue;
@@ -799,7 +799,7 @@ generate_hello(void *p) {
 
         pkt_put_ipaddress(&curr, &link->neighbor_iface_addr);
         olsr_serialize_hello_lq_pair(&curr, link);
-      } OLSR_FOR_ALL_LINK_ENTRIES_END(link)
+      }
 
       /* fix length field of hello block */
       if (linkstart != NULL) {
index 433b4e7..81b938c 100644 (file)
@@ -84,30 +84,19 @@ struct link_entry {
   /* cost of this link */
   olsr_linkcost linkcost;
 
-  struct list_node link_list;          /* double linked list of all link entries */
+  struct list_entity link_list;          /* double linked list of all link entries */
 };
 
-/* inline to recast from link_list back to link_entry */
-LISTNODE2STRUCT(list2link, struct link_entry, link_list);
-
 #define OLSR_LINK_JITTER       5        /* percent */
 #define OLSR_LINK_HELLO_JITTER 0        /* percent jitter */
 #define OLSR_LINK_SYM_JITTER   0        /* percent jitter */
 #define OLSR_LINK_LOSS_JITTER  0        /* percent jitter */
 
 /* deletion safe macro for link entry traversal */
-#define OLSR_FOR_ALL_LINK_ENTRIES(link) \
-{ \
-  struct list_node *link_head_node, *link_node, *next_link_node; \
-  link_head_node = &link_entry_head; \
-  for (link_node = link_head_node->next; \
-    link_node != link_head_node; link_node = next_link_node) { \
-    next_link_node = link_node->next; \
-    link = list2link(link_node);
-#define OLSR_FOR_ALL_LINK_ENTRIES_END(link) }}
+#define OLSR_FOR_ALL_LINK_ENTRIES(link, iterator) list_for_each_element_safe(&link_entry_head, link, link_list, iterator.loop, iterator.safe)
 
 /* Externals */
-extern struct list_node EXPORT(link_entry_head);
+extern struct list_entity EXPORT(link_entry_head);
 extern bool link_changes;
 
 /* Function prototypes */
index 10a0aa4..7ee2741 100644 (file)
@@ -275,6 +275,7 @@ int
 restore_settings(int version)
 {
   struct interface *ifs;
+  struct list_iterator iterator;
 
   OLSR_INFO(LOG_NETWORKING, "Restoring network state\n");
 
@@ -310,7 +311,7 @@ restore_settings(int version)
     return 0;
   }
 
-  OLSR_FOR_ALL_INTERFACES(ifs) {
+  OLSR_FOR_ALL_INTERFACES(ifs, iterator) {
     char procfile[FILENAME_MAX];
     FILE *proc_fd;
     /* ICMP redirects */
@@ -337,7 +338,6 @@ restore_settings(int version)
       fclose(proc_fd);
     }
   }
-  OLSR_FOR_ALL_INTERFACES_END(ifs);
 
   return 1;
 }
index a909333..285b061 100644 (file)
@@ -52,6 +52,7 @@ olsr_calculate_lq_mpr(void)
   struct nbr2_entry *nbr2;
   struct nbr_con *walker;
   struct link_entry *lnk;
+  struct list_iterator iterator;
   int k;
   struct nbr_entry *neigh;
   olsr_linkcost best, best_1hop;
@@ -165,9 +166,10 @@ olsr_calculate_lq_mpr(void)
   } OLSR_FOR_ALL_NBR2_ENTRIES_END();
 
   /* ugly hack */
-  OLSR_FOR_ALL_LINK_ENTRIES(lnk) {
+  OLSR_FOR_ALL_LINK_ENTRIES(lnk, iterator) {
     lnk->is_mpr = lnk->neighbor->is_mpr;
-  } OLSR_FOR_ALL_LINK_ENTRIES_END(lnk)
+  }
+
   if (mpr_changes && olsr_cnf->tc_redundancy > 0)
     signal_link_changes(true);
 }
index a99b752..f97cf17 100644 (file)
@@ -494,6 +494,7 @@ olsr_input_mid(struct olsr_message *msg,
 void
 generate_mid(void *p  __attribute__ ((unused))) {
   struct interface *ifp, *allif;
+  struct list_iterator iterator;
   struct olsr_message msg;
   uint8_t msg_buffer[MAXMESSAGESIZE - OLSR_HEADERSIZE] __attribute__ ((aligned));
   uint8_t *curr = msg_buffer;
@@ -515,7 +516,7 @@ generate_mid(void *p  __attribute__ ((unused))) {
   length_field = olsr_put_msg_hdr(&curr, &msg);
 
   last = msg_buffer + sizeof(msg_buffer) - olsr_cnf->ipsize;
-  OLSR_FOR_ALL_INTERFACES(allif) {
+  OLSR_FOR_ALL_INTERFACES(allif, iterator) {
     if (olsr_ipcmp(&olsr_cnf->router_id, &allif->ip_addr) != 0) {
       if (curr > last) {
         OLSR_WARN(LOG_MID, "Warning, too many interfaces for MID packet\n");
@@ -524,7 +525,7 @@ generate_mid(void *p  __attribute__ ((unused))) {
       pkt_put_ipaddress(&curr, &allif->ip_addr);
       sendMID = true;
     }
-  } OLSR_FOR_ALL_INTERFACES_END(allif)
+  }
 
   if (!sendMID) {
     return;
@@ -532,13 +533,13 @@ generate_mid(void *p  __attribute__ ((unused))) {
 
   pkt_put_u16(&length_field, curr - msg_buffer);
 
-  OLSR_FOR_ALL_INTERFACES(ifp) {
+  OLSR_FOR_ALL_INTERFACES(ifp, iterator) {
     if (net_outbuffer_bytes_left(ifp) < curr - msg_buffer) {
       net_output(ifp);
       set_buffer_timer(ifp);
     }
     net_outbuffer_push(ifp, msg_buffer, curr - msg_buffer);
-  } OLSR_FOR_ALL_INTERFACES_END(ifp)
+  }
 }
 /*
  * Local Variables:
index 60b4398..e9a23fe 100644 (file)
@@ -131,7 +131,7 @@ AVLNODE2STRUCT(nbr2_con_node_to_connector, nbr_con, nbr2_tree_node);
  */
 extern struct avl_tree EXPORT(nbr_tree);
 extern struct avl_tree EXPORT(nbr2_tree);
-extern struct olsr_cookie_info *nbr2_list_timer_cookie;
+extern struct olsr_cookie_info *nbr2_listold_timer_cookie;
 
 void olsr_init_neighbor_table(void);
 
index 09f62e7..92487db 100644 (file)
@@ -277,6 +277,7 @@ olsr_forward_message(struct olsr_message *msg, uint8_t *binary, struct interface
   union olsr_ip_addr *src;
   struct nbr_entry *neighbor;
   struct interface *ifn;
+  struct list_iterator iterator;
   uint8_t *tmp;
 #if !defined REMOVE_LOG_DEBUG
   struct ipaddr_str buf;
@@ -329,7 +330,7 @@ olsr_forward_message(struct olsr_message *msg, uint8_t *binary, struct interface
       msg->type, olsr_ip_to_string(&buf, src));
 
   /* looping trough interfaces */
-  OLSR_FOR_ALL_INTERFACES(ifn) {
+  OLSR_FOR_ALL_INTERFACES(ifn, iterator) {
     if (net_output_pending(ifn)) {
       /* dont forward to incoming interface if interface is mode ether */
       if (in_if->mode == IF_MODE_ETHER && ifn == in_if)
@@ -357,7 +358,6 @@ olsr_forward_message(struct olsr_message *msg, uint8_t *binary, struct interface
       }
     }
   }
-  OLSR_FOR_ALL_INTERFACES_END(ifn);
 
   return 1;
 }
index e062c49..f98c860 100644 (file)
@@ -1568,7 +1568,7 @@ olsr_get_default_cfg(void)
   assert(cfg->log_target_syslog == false);
 
   assert(cfg->plugins == NULL);
-  list_head_init(&cfg->hna_entries);
+  list_init_head(&cfg->hna_entries);
   assert(cfg->if_configs == NULL);
 
   cfg->pollrate = DEF_POLLRATE;
index e10cdfe..0d90f21 100644 (file)
@@ -192,7 +192,7 @@ struct olsr_config {
   bool log_target_syslog;              /* Log output also to syslog? */
 
   struct plugin_entry *plugins;        /* List of plugins to load with plparams */
-  struct list_node hna_entries;        /* List of manually configured HNA entries */
+  struct list_entity hna_entries;      /* List of manually configured HNA entries */
   struct olsr_if_config *if_configs;   /* List of devices to be used by olsrd */
 
   uint32_t pollrate;               /* Main loop poll rate, in milliseconds */
index c63bb65..a1ce1e1 100644 (file)
@@ -82,11 +82,12 @@ olsr_write_cnf_buf(struct autobuf *abuf, struct olsr_config *cnf, bool write_mor
                "# syntax: netaddr/prefix\n" "Hna%d {\n", cnf->ip_version == AF_INET ? 4 : 6, cnf->ip_version == AF_INET ? 4 : 6);
   if (!list_is_empty(&cnf->hna_entries)) {
     struct ip_prefix_entry *h;
+    struct list_iterator iterator;
 
-    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&cnf->hna_entries, h) {
+    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&cnf->hna_entries, h, iterator) {
       struct ipprefix_str strbuf;
       abuf_appendf(abuf, "    %s\n", ip_prefix_to_string(cnf->ip_version, &strbuf, &h->net));
-    } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
+    }
   }
   abuf_appendf(abuf, "}\n\n");
 
index acc0b00..4d93c1e 100644 (file)
@@ -68,7 +68,9 @@
 
 #define COMPORT_MAX_INPUTBUFFER 65536
 
-struct list_node olsr_comport_head;
+#define OLSR_FOR_ALL_COMPORT_ENTRIES(comport, iterator) list_for_each_element_safe(&olsr_comport_head, comport, node, iterator.loop, iterator.safe)
+
+struct list_entity olsr_comport_head;
 
 /* server socket */
 static int comsocket_http = 0;
@@ -101,7 +103,7 @@ void olsr_com_init(bool failfast) {
   connection_http_count = 0;
   connection_txt_count = 0;
 
-  list_head_init(&olsr_comport_head);
+  list_init_head(&olsr_comport_head);
 
   olsr_com_init_http();
   olsr_com_init_txt();
@@ -131,12 +133,10 @@ void olsr_com_init(bool failfast) {
 }
 
 void olsr_com_destroy(void) {
-  while (!list_is_empty(&olsr_comport_head)) {
-    struct comport_connection *con;
-
-    if (NULL != (con = comport_node2con(olsr_comport_head.next))) {
-      olsr_com_cleanup_session(con);
-    }
+  struct comport_connection *con;
+  struct list_iterator iterator;
+  OLSR_FOR_ALL_COMPORT_ENTRIES(con, iterator) {
+    olsr_com_cleanup_session(con);
   }
 
   olsr_com_destroy_http();
index b0a04f0..b4be484 100644 (file)
@@ -90,7 +90,7 @@ struct comport_connection {
   /*
    * internal part of the server
    */
-  struct list_node node;
+  struct list_entity node;
   int fd;
   enum connection_state state;
   enum http_header_type send_as;
@@ -100,8 +100,6 @@ struct comport_connection {
   struct autobuf in;
 };
 
-LISTNODE2STRUCT(comport_node2con, struct comport_connection, node);
-
 void olsr_com_init(bool);
 void olsr_com_destroy(void);
 
index 7e425c8..86c5243 100644 (file)
@@ -39,6 +39,7 @@
  *
  */
 #include <string.h>
+#include <stdlib.h>
 
 #include "olsr_cfg.h"
 #include "olsr_logging.h"
index 40c0bc7..fcf6c48 100644 (file)
@@ -43,6 +43,7 @@
 #include "defs.h"
 #include "olsr_cookie.h"
 #include "log.h"
+#include "common/list.h"
 #include "valgrind/valgrind.h"
 #include "valgrind/memcheck.h"
 
@@ -78,7 +79,7 @@ olsr_alloc_cookie(const char *cookie_name, olsr_cookie_type cookie_type)
 
   /* Init the free list */
   if (cookie_type == OLSR_COOKIE_TYPE_MEMORY) {
-    list_head_init(&ci->ci_free_list);
+    list_init_head(&ci->ci_free_list);
     VALGRIND_CREATE_MEMPOOL(ci, 0, 1);
 
     ci->ci_membrand = next_brand_id++;
@@ -97,7 +98,7 @@ olsr_alloc_cookie(const char *cookie_name, olsr_cookie_type cookie_type)
 static void
 olsr_free_cookie(struct olsr_cookie_info *ci)
 {
-  struct list_node *memory_list;
+  struct list_entity *memory_list;
 
   /* remove from tree */
   avl_delete(&olsr_cookie_tree, &ci->node);
@@ -229,7 +230,7 @@ olsr_cookie_malloc(struct olsr_cookie_info *ci)
 {
   void *ptr;
   struct olsr_cookie_mem_brand *branding;
-  struct list_node *free_list_node;
+  struct list_entity *free_list_node;
 #if !defined REMOVE_LOG_DEBUG
   bool reuse = false;
 #endif
@@ -330,7 +331,7 @@ olsr_cookie_malloc(struct olsr_cookie_info *ci)
 void
 olsr_cookie_free(struct olsr_cookie_info *ci, void *ptr)
 {
-  struct list_node *free_list_node;
+  struct list_entity *free_list_node;
 #if !defined REMOVE_LOG_DEBUG
   bool reuse = false;
 #endif
@@ -357,8 +358,8 @@ olsr_cookie_free(struct olsr_cookie_info *ci, void *ptr)
    */
   if ((ci->ci_free_list_usage < COOKIE_FREE_LIST_THRESHOLD) || (ci->ci_free_list_usage < ci->ci_usage / COOKIE_FREE_LIST_THRESHOLD)) {
 
-    free_list_node = (struct list_node *)ptr;
-    list_node_init(free_list_node);
+    free_list_node = (struct list_entity *)ptr;
+    list_init_node(free_list_node);
 
     /*
      * Before enqueuing the node to the free list,
@@ -367,14 +368,14 @@ olsr_cookie_free(struct olsr_cookie_info *ci, void *ptr)
      * log a false positive.
      */
     if (list_is_empty(&ci->ci_free_list)) {
-      list_add_before(&ci->ci_free_list, free_list_node);
+      list_add_tail(&ci->ci_free_list, free_list_node);
     } else {
 
       /*
        * Make next item accessible, add it and make next item inaccessible.
        */
       VALGRIND_MAKE_MEM_DEFINED(ci->ci_free_list.prev, ci->ci_size);
-      list_add_before(&ci->ci_free_list, free_list_node);
+      list_add_tail(&ci->ci_free_list, free_list_node);
       VALGRIND_MAKE_MEM_NOACCESS(ci->ci_free_list.prev, ci->ci_size);
     }
 
index 1573bc7..24d238f 100644 (file)
@@ -70,7 +70,7 @@ struct olsr_cookie_info {
 
   /* only for memory cookies */
   size_t ci_size;                      /* Fixed size for block allocations */
-  struct list_node ci_free_list;       /* List head for recyclable blocks */
+  struct list_entity ci_free_list;       /* List head for recyclable blocks */
   unsigned int ci_free_list_usage;     /* Length of free list */
   uint16_t ci_membrand;
 };
index 4d3788e..6c4feb6 100644 (file)
@@ -46,8 +46,8 @@
 void
 ip_acl_init(struct ip_acl *acl)
 {
-  list_head_init(&acl->accept);
-  list_head_init(&acl->reject);
+  list_init_head(&acl->accept);
+  list_init_head(&acl->reject);
   acl->default_accept = false;
   acl->first_accept = false;
 }
@@ -74,27 +74,26 @@ ip_acl_remove(struct ip_acl *acl, const union olsr_ip_addr *net, uint8_t prefix_
 bool
 ip_acl_acceptable(struct ip_acl *acl, const union olsr_ip_addr *ip, int ip_version)
 {
-  struct list_node *first, *second;
+  struct list_entity *first, *second;
   struct ip_prefix_entry *entry;
+  struct list_iterator iterator;
 
   first = acl->first_accept ? &acl->accept : &acl->reject;
   second = acl->first_accept ? &acl->reject : &acl->accept;
 
   /* first run */
-  OLSR_FOR_ALL_IPPREFIX_ENTRIES(first, entry) {
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES(first, entry, iterator) {
     if (ip_in_net(ip, &entry->net, ip_version)) {
       return acl->first_accept;
     }
   }
-  OLSR_FOR_ALL_IPPREFIX_ENTRIES_END();
 
   /* second run */
-  OLSR_FOR_ALL_IPPREFIX_ENTRIES(second, entry) {
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES(second, entry, iterator) {
     if (ip_in_net(ip, &entry->net, ip_version)) {
       return !acl->first_accept;
     }
   }
-  OLSR_FOR_ALL_IPPREFIX_ENTRIES_END();
 
   /* just use default */
   return acl->default_accept;
index 43d1e82..5cc5077 100644 (file)
@@ -47,8 +47,8 @@
 #include "common/list.h"
 
 struct ip_acl {
-  struct list_node accept;
-  struct list_node reject;
+  struct list_entity accept;
+  struct list_entity reject;
   bool first_accept;
   bool default_accept;
 };
index e88c17d..0cbe726 100644 (file)
  *
  */
 
+#include <stdlib.h>
+
 #include "olsr_types.h"
 #include "olsr.h"
 #include "ipcalc.h"
 #include "olsr_ip_prefix_list.h"
 
 void
-ip_prefix_list_flush(struct list_node *ip_prefix_head)
+ip_prefix_list_flush(struct list_entity *ip_prefix_head)
 {
   struct ip_prefix_entry *entry;
+  struct list_iterator iterator;
 
-  OLSR_FOR_ALL_IPPREFIX_ENTRIES(ip_prefix_head, entry) {
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES(ip_prefix_head, entry, iterator) {
     list_remove(&entry->node);
     free(entry);
-  } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END();
+  }
 }
 
 void
-ip_prefix_list_add(struct list_node *ip_prefix_head, const union olsr_ip_addr *net, uint8_t prefix_len)
+ip_prefix_list_add(struct list_entity *ip_prefix_head, const union olsr_ip_addr *net, uint8_t prefix_len)
 {
   struct ip_prefix_entry *new_entry = olsr_malloc(sizeof(*new_entry), "new ip_prefix");
 
@@ -68,31 +71,31 @@ ip_prefix_list_add(struct list_node *ip_prefix_head, const union olsr_ip_addr *n
 }
 
 int
-ip_prefix_list_remove(struct list_node *ip_prefix_head, const union olsr_ip_addr *net, uint8_t prefix_len, int ip_version)
+ip_prefix_list_remove(struct list_entity *ip_prefix_head, const union olsr_ip_addr *net, uint8_t prefix_len, int ip_version)
 {
   struct ip_prefix_entry *h;
+  struct list_iterator iterator;
 
-  OLSR_FOR_ALL_IPPREFIX_ENTRIES(ip_prefix_head, h) {
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES(ip_prefix_head, h, iterator) {
     if (ipcmp(ip_version, net, &h->net.prefix) == 0 && h->net.prefix_len == prefix_len) {
       list_remove(&h->node);
       free(h);
       return 1;
     }
   }
-  OLSR_FOR_ALL_IPPREFIX_ENTRIES_END();
   return 0;
 }
 
 struct ip_prefix_entry *
-ip_prefix_list_find(struct list_node *ip_prefix_head, const union olsr_ip_addr *net, uint8_t prefix_len, int ip_version)
+ip_prefix_list_find(struct list_entity *ip_prefix_head, const union olsr_ip_addr *net, uint8_t prefix_len, int ip_version)
 {
   struct ip_prefix_entry *h;
+  struct list_iterator iterator;
 
-  OLSR_FOR_ALL_IPPREFIX_ENTRIES(ip_prefix_head, h) {
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES(ip_prefix_head, h, iterator) {
     if (prefix_len == h->net.prefix_len && ipcmp(ip_version, net, &h->net.prefix) == 0) {
       return h;
     }
   }
-  OLSR_FOR_ALL_IPPREFIX_ENTRIES_END();
   return NULL;
 }
index c920034..f98bb96 100644 (file)
 #include "common/list.h"
 
 struct ip_prefix_entry {
-  struct list_node node;
+  struct list_entity node;
   struct olsr_ip_prefix net;
 };
 
-/* inline to recast from node back to ip_prefix_entry */
-LISTNODE2STRUCT(list2ipprefix, struct ip_prefix_entry, node);
-
 /* deletion safe macro for ip_prefix traversal */
-#define OLSR_FOR_ALL_IPPREFIX_ENTRIES(ipprefix_head, ipprefix_node) \
-{ \
-  struct list_node *link_head_node, *link_node, *next_link_node; \
-  link_head_node = ipprefix_head; \
-  for (link_node = link_head_node->next; \
-    link_node != link_head_node; link_node = next_link_node) { \
-    next_link_node = link_node->next; \
-    ipprefix_node = list2ipprefix(link_node);
-#define OLSR_FOR_ALL_IPPREFIX_ENTRIES_END() }}
-
-//struct ip_prefix_list {
-//  struct olsr_ip_prefix net;
-//  struct ip_prefix_list *next;
-//};
+#define OLSR_FOR_ALL_IPPREFIX_ENTRIES(head, prefix_node, iterator) list_for_each_element_safe(head, prefix_node, node, iterator.loop, iterator.safe)
 
 /*
  * List functions
  */
-void EXPORT(ip_prefix_list_add) (struct list_node *, const union olsr_ip_addr *, uint8_t);
-int EXPORT(ip_prefix_list_remove) (struct list_node *, const union olsr_ip_addr *, uint8_t, int);
-void ip_prefix_list_flush(struct list_node *);
-struct ip_prefix_entry *ip_prefix_list_find(struct list_node *, const union olsr_ip_addr *, uint8_t, int);
+void EXPORT(ip_prefix_list_add) (struct list_entity *, const union olsr_ip_addr *, uint8_t);
+int EXPORT(ip_prefix_list_remove) (struct list_entity *, const union olsr_ip_addr *, uint8_t, int);
+void ip_prefix_list_flush(struct list_entity *);
+struct ip_prefix_entry *ip_prefix_list_find(struct list_entity *, const union olsr_ip_addr *, uint8_t, int);
 
 
 #endif /* OLSR_IP_PREFIX_LIST_H_ */
index d220283..c99ecab 100644 (file)
@@ -121,7 +121,7 @@ olsr_spf_del_cand_tree(struct avl_tree *tree, struct tc_entry *tc)
  * Insert an SPF result at the end of the path list.
  */
 static void
-olsr_spf_add_path_list(struct list_node *head, int *path_count, struct tc_entry *tc)
+olsr_spf_add_path_list(struct list_entity *head, int *path_count, struct tc_entry *tc)
 {
 #if !defined REMOVE_LOG_DEBUG
   struct ipaddr_str pathbuf, nbuf;
@@ -207,7 +207,7 @@ olsr_spf_relax(struct avl_tree *cand_tree, struct tc_entry *tc)
       }
 
       /* remove from result list if necessary */
-      if (new_tc->path_list_node.next != NULL && new_tc->path_list_node.prev != NULL) {
+      if (list_node_added(&new_tc->path_list_node)) {
         list_remove(&new_tc->path_list_node);
       }
 
@@ -242,7 +242,7 @@ olsr_spf_relax(struct avl_tree *cand_tree, struct tc_entry *tc)
  * on the candidate tree.
  */
 static void
-olsr_spf_run_full(struct avl_tree *cand_tree, struct list_node *path_list, int *path_count)
+olsr_spf_run_full(struct avl_tree *cand_tree, struct list_entity *path_list, int *path_count)
 {
   struct tc_entry *tc;
 
@@ -277,7 +277,7 @@ olsr_calculate_routing_table(void)
 #endif
   struct avl_tree cand_tree;
   struct avl_node *rtp_tree_node;
-  struct list_node path_list;          /* head of the path_list */
+  struct list_entity path_list;          /* head of the path_list */
   struct tc_entry *tc;
   struct rt_path *rtp;
   struct tc_edge_entry *tc_edge;
@@ -301,7 +301,7 @@ olsr_calculate_routing_table(void)
    * Prepare the candidate tree and result list.
    */
   avl_init(&cand_tree, avl_comp_etx);
-  list_head_init(&path_list);
+  list_init_head(&path_list);
   olsr_bump_routingtree_version();
 
   /*
@@ -312,7 +312,7 @@ olsr_calculate_routing_table(void)
     tc->path_cost = ROUTE_COST_BROKEN;
     tc->hops = 0;
     tc->cand_tree_node.key = NULL;
-    list_node_init(&tc->path_list_node);
+    list_init_head(&tc->path_list_node);
   }
   OLSR_FOR_ALL_TC_ENTRIES_END(tc);
 
@@ -371,9 +371,10 @@ olsr_calculate_routing_table(void)
   /*
    * In the path list we have all the reachable nodes in our topology.
    */
-  for (; !list_is_empty(&path_list); list_remove(path_list.next)) {
+  while (!list_is_empty(&path_list)) {
+    tc = list_first_element(&path_list, tc, path_list_node);
+    list_remove(&tc->path_list_node);
 
-    tc = pathlist2tc(path_list.next);
     link = tc->next_hop;
 
     if (!link) {
index b14d32b..7f06196 100644 (file)
@@ -46,9 +46,9 @@
 
 #include <errno.h>
 
-static struct list_node add_kernel_list;
-static struct list_node chg_kernel_list;
-static struct list_node del_kernel_list;
+static struct list_entity add_kernel_list;
+static struct list_entity chg_kernel_list;
+static struct list_entity del_kernel_list;
 
 /*
  * Function hooks for plugins to intercept
@@ -64,9 +64,9 @@ olsr_init_export_route(void)
   OLSR_INFO(LOG_ROUTING, "Initialize route processing...\n");
 
   /* the add/chg/del kernel queues */
-  list_head_init(&add_kernel_list);
-  list_head_init(&chg_kernel_list);
-  list_head_init(&del_kernel_list);
+  list_init_head(&add_kernel_list);
+  list_init_head(&chg_kernel_list);
+  list_init_head(&del_kernel_list);
 
   olsr_add_route_function = olsr_kernel_add_route;
   olsr_del_route_function = olsr_kernel_del_route;
@@ -94,12 +94,12 @@ olsr_delete_all_kernel_routes(void)
  * Enqueue a route on a kernel add/chg/del queue.
  */
 static void
-olsr_enqueue_rt(struct list_node *head_node, struct rt_entry *rt)
+olsr_enqueue_rt(struct list_entity *head_node, struct rt_entry *rt)
 {
   const struct rt_nexthop *nh;
 
   /* if this node is already on some changelist we are done */
-  if (list_node_on_list(&rt->rt_change_node)) {
+  if (list_node_added(&rt->rt_change_node)) {
     return;
   }
 
@@ -152,7 +152,7 @@ olsr_add_route(struct rt_entry *rt)
     while (0 <= olsr_del_route_function(&defrt, olsr_cnf->ip_version)) {
     }
     olsr_cnf->del_gws = false;
-    exit(9);
+    olsr_exit(9);
   }
 
   if (0 > olsr_add_route_function(rt, olsr_cnf->ip_version)) {
@@ -177,12 +177,12 @@ olsr_add_route(struct rt_entry *rt)
  * the queue needs to be traversed from head to tail.
  */
 static void
-olsr_add_routes(struct list_node *head_node)
+olsr_add_routes(struct list_entity *head_node)
 {
   struct rt_entry *rt;
 
   while (!list_is_empty(head_node)) {
-    rt = changelist2rt(head_node->next);
+    rt = list_first_element(head_node, rt, rt_change_node);
     olsr_add_route(rt);
 
     list_remove(&rt->rt_change_node);
@@ -197,10 +197,10 @@ olsr_add_routes(struct list_node *head_node)
  * the queue needs to be traversed from tail to head.
  */
 static void
-olsr_chg_kernel_routes(struct list_node *head_node)
+olsr_chg_kernel_routes(struct list_entity *head_node)
 {
   struct rt_entry *rt;
-  struct list_node *node;
+  struct list_iterator iterator;
 
   if (list_is_empty(head_node)) {
     return;
@@ -211,8 +211,7 @@ olsr_chg_kernel_routes(struct list_node *head_node)
    * traverse from the end to the beginning of the list,
    * such that nexthop routes are deleted last.
    */
-  for (node = head_node->prev; head_node != node; node = node->prev) {
-    rt = changelist2rt(node);
+  OLSR_FOR_ALL_RTLIST_ENTRIES(head_node, rt, iterator) {
     olsr_del_route(rt);
   }
 
@@ -221,8 +220,7 @@ olsr_chg_kernel_routes(struct list_node *head_node)
    * Traverse from the beginning to the end of the list,
    * such that nexthop routes are added first.
    */
-  while (!list_is_empty(head_node)) {
-    rt = changelist2rt(head_node->next);
+  OLSR_FOR_ALL_RTLIST_ENTRIES(head_node, rt, iterator) {
     olsr_add_route(rt);
 
     list_remove(&rt->rt_change_node);
@@ -237,13 +235,12 @@ olsr_chg_kernel_routes(struct list_node *head_node)
  * the queue needs to be traversed from tail to head.
  */
 static void
-olsr_del_kernel_routes(struct list_node *head_node)
+olsr_del_kernel_routes(struct list_entity *head_node)
 {
   struct rt_entry *rt;
+  struct list_iterator iterator;
 
-  while (!list_is_empty(head_node)) {
-    rt = changelist2rt(head_node->prev);
-
+  OLSR_FOR_ALL_RTLIST_ENTRIES(head_node, rt, iterator) {
     /*
      * Only attempt to delete the route from kernel if it was
      * installed previously. A reference to the interface gets
index a1c6655..11a8ba1 100644 (file)
@@ -88,10 +88,10 @@ struct rt_entry {
   struct rt_nexthop rt_nexthop;        /* nexthop of FIB route */
   struct rt_metric rt_metric;          /* metric of FIB route */
   struct avl_tree rt_path_tree;
-  struct list_node rt_change_node;     /* queue for kernel FIB add/chg/del */
+  struct list_entity rt_change_node;     /* queue for kernel FIB add/chg/del */
 };
 
-LISTNODE2STRUCT(changelist2rt, struct rt_entry, rt_change_node);
+#define OLSR_FOR_ALL_RTLIST_ENTRIES(head, rt_entry, iterator) list_for_each_element_safe(head, rt_entry, rt_change_node, iterator.loop, iterator.safe)
 
 /*
  * For every received route a rt_path is added to the RIB.
index 997cb1c..211dbef 100644 (file)
@@ -51,6 +51,7 @@
 
 #include <unistd.h>
 #include <assert.h>
+#include <stdlib.h>
 
 /* Timer data, global. Externed in scheduler.h */
 uint32_t now_times;                    /* relative time compared to startup (in milliseconds */
@@ -58,14 +59,14 @@ struct timeval first_tv;               /* timevalue during startup */
 struct timeval last_tv;                /* timevalue used for last olsr_times() calculation */
 
 /* Hashed root of all timers */
-static struct list_node timer_wheel[TIMER_WHEEL_SLOTS];
+static struct list_entity timer_wheel[TIMER_WHEEL_SLOTS];
 static uint32_t timer_last_run;        /* remember the last timeslot walk */
 
 /* Memory cookie for the block based memory manager */
 static struct olsr_cookie_info *timer_mem_cookie = NULL;
 
 /* Head of all OLSR used sockets */
-static struct list_node socket_head = { &socket_head, &socket_head };
+static struct list_entity socket_head;
 
 /* Prototypes */
 static void walk_timers(uint32_t *);
@@ -187,7 +188,6 @@ add_olsr_socket(int fd, socket_handler_func pf_pr, socket_handler_func pf_imm, v
   new_entry->flags = flags;
 
   /* Queue */
-  list_node_init(&new_entry->socket_node);
   list_add_before(&socket_head, &new_entry->socket_node);
 }
 
@@ -203,6 +203,7 @@ int
 remove_olsr_socket(int fd, socket_handler_func pf_pr, socket_handler_func pf_imm)
 {
   struct olsr_socket_entry *entry;
+  struct list_iterator iterator;
 
   if (fd < 0 || (pf_pr == NULL && pf_imm == NULL)) {
     OLSR_WARN(LOG_SCHEDULER, "Bogus socket entry - not processing...");
@@ -210,14 +211,13 @@ remove_olsr_socket(int fd, socket_handler_func pf_pr, socket_handler_func pf_imm
   }
   OLSR_DEBUG(LOG_SCHEDULER, "Removing OLSR socket entry %d\n", fd);
 
-  OLSR_FOR_ALL_SOCKETS(entry) {
+  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
     if (entry->fd == fd && entry->process_immediate == pf_imm && entry->process_pollrate == pf_pr) {
       list_remove(&entry->socket_node);
       free(entry);
       return 1;
     }
   }
-  OLSR_FOR_ALL_SOCKETS_END(entry);
   return 0;
 }
 
@@ -225,26 +225,26 @@ void
 enable_olsr_socket(int fd, socket_handler_func pf_pr, socket_handler_func pf_imm, unsigned int flags)
 {
   struct olsr_socket_entry *entry;
+  struct list_iterator iterator;
 
-  OLSR_FOR_ALL_SOCKETS(entry) {
+  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
     if (entry->fd == fd && entry->process_immediate == pf_imm && entry->process_pollrate == pf_pr) {
       entry->flags |= flags;
     }
   }
-  OLSR_FOR_ALL_SOCKETS_END(entry);
 }
 
 void
 disable_olsr_socket(int fd, socket_handler_func pf_pr, socket_handler_func pf_imm, unsigned int flags)
 {
   struct olsr_socket_entry *entry;
+  struct list_iterator iterator;
 
-  OLSR_FOR_ALL_SOCKETS(entry) {
+  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
     if (entry->fd == fd && entry->process_immediate == pf_imm && entry->process_pollrate == pf_pr) {
       entry->flags &= ~flags;
     }
   }
-  OLSR_FOR_ALL_SOCKETS_END(entry);
 }
 
 /**
@@ -254,12 +254,13 @@ void
 olsr_flush_sockets(void)
 {
   struct olsr_socket_entry *entry;
+  struct list_iterator iterator;
 
-  OLSR_FOR_ALL_SOCKETS(entry) {
+  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
     CLOSESOCKET(entry->fd);
     list_remove(&entry->socket_node);
     free(entry);
-  } OLSR_FOR_ALL_SOCKETS_END(entry);
+  }
 }
 
 static void
@@ -267,6 +268,7 @@ poll_sockets(void)
 {
   int n;
   struct olsr_socket_entry *entry;
+  struct list_iterator iterator;
   fd_set ibits, obits;
   struct timeval tvp = { 0, 0 };
   int hfd = 0, fdsets = 0;
@@ -282,7 +284,7 @@ poll_sockets(void)
   FD_ZERO(&obits);
 
   /* Adding file-descriptors to FD set */
-  OLSR_FOR_ALL_SOCKETS(entry) {
+  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
     if (entry->process_pollrate == NULL) {
       continue;
     }
@@ -298,7 +300,6 @@ poll_sockets(void)
       hfd = entry->fd + 1;
     }
   }
-  OLSR_FOR_ALL_SOCKETS_END(entry);
 
   /* Running select on the FD set */
   do {
@@ -315,7 +316,7 @@ poll_sockets(void)
 
   /* Update time since this is much used by the parsing functions */
   now_times = olsr_times();
-  OLSR_FOR_ALL_SOCKETS(entry) {
+  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
     int flags;
     if (entry->process_pollrate == NULL) {
       continue;
@@ -331,7 +332,6 @@ poll_sockets(void)
       entry->process_pollrate(entry->fd, entry->data, flags);
     }
   }
-  OLSR_FOR_ALL_SOCKETS_END(entry);
 }
 
 static void
@@ -361,13 +361,14 @@ handle_fds(uint32_t next_interval)
   /* do at least one select */
   for (;;) {
     struct olsr_socket_entry *entry;
+    struct list_iterator iterator;
     fd_set ibits, obits;
     int n, hfd = 0, fdsets = 0;
     FD_ZERO(&ibits);
     FD_ZERO(&obits);
 
     /* Adding file-descriptors to FD set */
-    OLSR_FOR_ALL_SOCKETS(entry) {
+    OLSR_FOR_ALL_SOCKETS(entry, iterator) {
       if (entry->process_immediate == NULL) {
         continue;
       }
@@ -383,7 +384,6 @@ handle_fds(uint32_t next_interval)
         hfd = entry->fd + 1;
       }
     }
-    OLSR_FOR_ALL_SOCKETS_END(entry);
 
     if (hfd == 0 && (long)remaining <= 0) {
       /* we are over the interval and we have no fd's. Skip the select() etc. */
@@ -404,7 +404,7 @@ handle_fds(uint32_t next_interval)
 
     /* Update time since this is much used by the parsing functions */
     now_times = olsr_times();
-    OLSR_FOR_ALL_SOCKETS(entry) {
+    OLSR_FOR_ALL_SOCKETS(entry, iterator) {
       int flags;
       if (entry->process_immediate == NULL) {
         continue;
@@ -420,7 +420,6 @@ handle_fds(uint32_t next_interval)
         entry->process_immediate(entry->fd, entry->data, flags);
       }
     }
-    OLSR_FOR_ALL_SOCKETS_END(entry);
 
     /* calculate the next timeout */
     remaining = TIME_DUE(next_interval);
@@ -530,8 +529,10 @@ olsr_init_timers(void)
   last_tv = first_tv;
   now_times = olsr_times();
 
+  /* init lists */
+  list_init_head(&socket_head);
   for (idx = 0; idx < TIMER_WHEEL_SLOTS; idx++) {
-    list_head_init(&timer_wheel[idx]);
+    list_init_head(&timer_wheel[idx]);
   }
 
   /*
@@ -561,29 +562,32 @@ walk_timers(uint32_t * last_run)
    * The latter is meant as a safety belt if the scheduler falls behind.
    */
   while ((*last_run <= now_times) && (wheel_slot_walks < TIMER_WHEEL_SLOTS)) {
-    struct list_node tmp_head_node;
+    struct list_entity tmp_head_node;
     /* keep some statistics */
     unsigned int timers_walked = 0, timers_fired = 0;
 
     /* Get the hash slot for this clocktick */
-    struct list_node *const timer_head_node = &timer_wheel[*last_run & TIMER_WHEEL_MASK];
+    struct list_entity *timer_head_node;
+
+    timer_head_node = &timer_wheel[*last_run & TIMER_WHEEL_MASK];
 
     /* Walk all entries hanging off this hash bucket. We treat this basically as a stack
      * so that we always know if and where the next element is.
      */
-    list_head_init(&tmp_head_node);
+    list_init_head(&tmp_head_node);
     while (!list_is_empty(timer_head_node)) {
       /* the top element */
-      struct list_node *const timer_node = timer_head_node->next;
-      struct timer_entry *const timer = list2timer(timer_node);
+      struct timer_entry *timer;
+
+      timer = list_first_element(timer_head_node, timer, timer_list);
 
       /*
        * Dequeue and insert to a temporary list.
        * We do this to avoid loosing our walking context when
        * multiple timers fire.
        */
-      list_remove(timer_node);
-      list_add_after(&tmp_head_node, timer_node);
+      list_remove(&timer->timer_list);
+      list_add_after(&tmp_head_node, &timer->timer_list);
       timers_walked++;
 
       /* Ready to fire ? */
@@ -654,7 +658,7 @@ walk_timers(uint32_t * last_run)
 void
 olsr_flush_timers(void)
 {
-  struct list_node *timer_head_node;
+  struct list_entity *timer_head_node;
   unsigned int wheel_slot = 0;
 
   for (wheel_slot = 0; wheel_slot < TIMER_WHEEL_SLOTS; wheel_slot++) {
@@ -662,7 +666,10 @@ olsr_flush_timers(void)
 
     /* Kill all entries hanging off this hash bucket. */
     while (!list_is_empty(timer_head_node)) {
-      olsr_stop_timer(list2timer(timer_head_node->next));
+      struct timer_entry *timer;
+
+      timer = list_first_element(timer_head_node, timer, timer_list);
+      olsr_stop_timer(timer);
     }
   }
 }
index bd34656..d7dc138 100644 (file)
@@ -66,7 +66,7 @@ typedef void (*timer_cb_func) (void *); /* callback function */
  * which causes the timer to run forever until manually stopped.
  */
 struct timer_entry {
-  struct list_node timer_list;         /* Wheel membership */
+  struct list_entity timer_list;         /* Wheel membership */
   uint32_t timer_clock;                /* when timer shall fire (absolute time) */
   unsigned int timer_period;           /* set for periodical timers (relative time) */
   struct olsr_cookie_info *timer_cookie;       /* used for diag stuff */
@@ -78,9 +78,6 @@ struct timer_entry {
   void *timer_cb_context;              /* context pointer */
 };
 
-/* inline to recast from timer_list back to timer_entry */
-LISTNODE2STRUCT(list2timer, struct timer_entry, timer_list);
-
 #define OLSR_TIMER_ONESHOT    0 /* One shot timer */
 #define OLSR_TIMER_PERIODIC   1 /* Periodic timer */
 
@@ -130,21 +127,12 @@ struct olsr_socket_entry {
   socket_handler_func process_pollrate;
   void *data;
   unsigned int flags;
-  struct list_node socket_node;
+  struct list_entity socket_node;
 };
 
-LISTNODE2STRUCT(list2socket, struct olsr_socket_entry, socket_node);
-
 /* deletion safe macro for socket list traversal */
-#define OLSR_FOR_ALL_SOCKETS(socket) \
-{ \
-  struct list_node *_socket_node, *_next_socket_node; \
-  for (_socket_node = socket_head.next; \
-    _socket_node != &socket_head; \
-    _socket_node = _next_socket_node) { \
-    _next_socket_node = _socket_node->next; \
-    socket = list2socket(_socket_node);
-#define OLSR_FOR_ALL_SOCKETS_END(socket) }}
+
+#define OLSR_FOR_ALL_SOCKETS(socket, iterator) list_for_each_element_safe(&socket_head, socket, socket_node, iterator.loop, iterator.safe)
 
 uint32_t EXPORT(olsr_getTimestamp) (uint32_t s);
 int32_t EXPORT(olsr_getTimeDue) (uint32_t s);
index 0de8f13..2b21927 100644 (file)
@@ -202,7 +202,7 @@ olsr_change_myself_tc(void)
         entry->tc_edge = olsr_add_tc_edge_entry(tc_myself, &entry->nbr_addr, 0);
         entry->tc_edge->neighbor = entry;
       }
-    } OLSR_FOR_ALL_LINK_ENTRIES_END(link);
+    } OLSR_FOR_ALL_NBR_ENTRIES_END()
   }
   changes_topology = true;
 }
@@ -933,6 +933,7 @@ olsr_output_lq_tc_internal(void *ctx  __attribute__ ((unused)), union olsr_ip_ad
 {
   static int ttl_list[] = { 2, 8, 2, 16, 2, 8, 2, MAX_TTL };
   struct interface *ifp;
+  struct list_iterator iterator;
   struct nbr_entry *nbr;
   struct link_entry *link;
   uint8_t msg_buffer[MAXMESSAGESIZE - OLSR_HEADERSIZE] __attribute__ ((aligned));
@@ -1057,13 +1058,13 @@ olsr_output_lq_tc_internal(void *ctx  __attribute__ ((unused)), union olsr_ip_ad
   pkt_put_u16(&length_field, curr - msg_buffer);
 
   /* send to all interfaces */
-  OLSR_FOR_ALL_INTERFACES(ifp) {
+  OLSR_FOR_ALL_INTERFACES(ifp, iterator) {
     if (net_outbuffer_bytes_left(ifp) < curr - msg_buffer) {
       net_output(ifp);
       set_buffer_timer(ifp);
     }
     net_outbuffer_push(ifp, msg_buffer, curr - msg_buffer);
-  } OLSR_FOR_ALL_INTERFACES_END(ifp)
+  }
   return nextFragment;
 }
 
index a4c2ad5..0be60c6 100644 (file)
@@ -73,7 +73,7 @@ struct tc_entry {
   union olsr_ip_addr addr;             /* vertex_node key */
   struct avl_node cand_tree_node;      /* SPF candidate heap, node keyed by path_etx */
   olsr_linkcost path_cost;             /* SPF calculated distance, cand_tree_node key */
-  struct list_node path_list_node;     /* SPF result list */
+  struct list_entity path_list_node;   /* SPF result list */
   struct avl_tree edge_tree;           /* subtree for edges */
   struct avl_tree prefix_tree;         /* subtree for prefixes */
   struct avl_tree mid_tree;            /* subtree for MID entries */
@@ -101,7 +101,6 @@ struct tc_entry {
 
 
 AVLNODE2STRUCT(cand_tree2tc, tc_entry, cand_tree_node);
-LISTNODE2STRUCT(pathlist2tc, struct tc_entry, path_list_node);
 
 /*
  * macros for traversing vertices, edges and prefixes in the link state database.
index 69f4a83..7587044 100644 (file)
@@ -608,7 +608,6 @@ chk_if_up(struct olsr_if_config *iface)
   lock_interface(iface->interf);
 
   /* Queue */
-  list_node_init(&ifp->int_node);
   list_add_before(&interface_head, &ifp->int_node);
 
   return 1;
index ca1a457..6e7c4b5 100644 (file)
@@ -710,8 +710,8 @@ chk_if_up(struct olsr_if_config *IntConf)
   add_olsr_socket(New->olsr_socket, &olsr_input, NULL, NULL, SP_PR_READ);
 
   /* Queue */
-  list_node_init(&New->int_node);
-  list_add_before(&interface_head, &New->int_node);
+  listold_node_init(&New->int_node);
+  listold_add_before(&interface_head, &New->int_node);
 
   IntConf->interf = New;
   lock_interface(IntConf->interf);