eliminate the data field from a list_node
authorHannes Gredler <hannes@gredler.at>
Sat, 19 Apr 2008 19:21:57 +0000 (21:21 +0200)
committerHannes Gredler <hannes@gredler.at>
Sat, 19 Apr 2008 19:21:57 +0000 (21:21 +0200)
the data field can be substituted by using the LISTNODE2STRUCT macro

src/common/list.h
src/lq_route.c
src/process_routes.c
src/routing_table.h
src/tc_set.h

index 35a9a8d..429a49b 100644 (file)
@@ -48,7 +48,6 @@ struct list_node
 {
   struct list_node *next;
   struct list_node *prev;
-  void *data;
 };
 
 void list_head_init(struct list_node *);
@@ -63,7 +62,7 @@ void list_remove(struct list_node *);
 
 /*
  * Macro to define an inline function to map from a list_node offset back to the
- * base of the datastructure. This saves you from populating the data field.
+ * 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)\
index 45c1648..cb04f0d 100644 (file)
@@ -152,7 +152,6 @@ olsr_spf_add_path_list (struct list_node *head, int *path_count,
   struct ipaddr_str pathbuf, nbuf;
   struct lqtextbuffer lqbuffer;
 #endif
-  tc->path_list_node.data = tc;
 
 #ifdef DEBUG
   OLSR_PRINTF(2, "SPF: append path %s, cost %s, via %s\n",
@@ -444,7 +443,7 @@ olsr_calculate_routing_table (void *context __attribute__((unused)))
    */
   for (; !list_is_empty(&path_list); list_remove(path_list.next)) {
 
-    tc = path_list.next->data;
+    tc = pathlist2tc(path_list.next);
     link = tc->next_hop;
 
     if (!link) {
index 5f5a68e..a331deb 100644 (file)
@@ -139,8 +139,6 @@ olsr_enqueue_rt(struct list_node *head_node, struct rt_entry *rt)
     return;
   }
 
-  rt->rt_change_node.data = rt;
-
   /*
    * For easier route dependency tracking we enqueue nexthop routes
    * at the head of the queue and non-nexthop routes at the tail of the queue.
@@ -216,8 +214,10 @@ olsr_add_kernel_route(struct rt_entry *rt)
 static void
 olsr_add_kernel_routes(struct list_node *head_node)
 {
+  struct rt_entry *rt;
+
   while (!list_is_empty(head_node)) {
-    struct rt_entry *rt = head_node->next->data;
+    rt = changelist2rt(head_node->next);
     olsr_add_kernel_route(rt);
 
     list_remove(&rt->rt_change_node);
@@ -234,6 +234,7 @@ olsr_add_kernel_routes(struct list_node *head_node)
 static void
 olsr_chg_kernel_routes(struct list_node *head_node)
 {
+  struct rt_entry *rt;
   struct list_node *node;
 
   if (list_is_empty(head_node)) {
@@ -246,7 +247,7 @@ olsr_chg_kernel_routes(struct list_node *head_node)
    * such that nexthop routes are deleted last.
    */
   for (node = head_node->prev; head_node != node; node = node->prev) {
-    struct rt_entry *rt = node->data;
+    rt = changelist2rt(node);
     olsr_delete_kernel_route(rt);
   }
 
@@ -256,7 +257,7 @@ olsr_chg_kernel_routes(struct list_node *head_node)
    * such that nexthop routes are added first.
    */
   while (!list_is_empty(head_node)) {
-    struct rt_entry *rt = head_node->next->data;
+    rt = changelist2rt(head_node->next);
     olsr_add_kernel_route(rt);
 
     list_remove(&rt->rt_change_node);
@@ -273,8 +274,10 @@ olsr_chg_kernel_routes(struct list_node *head_node)
 static void
 olsr_del_kernel_routes(struct list_node *head_node)
 {
+  struct rt_entry *rt;
+
   while (!list_is_empty(head_node)) {
-    struct rt_entry *rt = head_node->prev->data;
+    rt = changelist2rt(head_node->prev);
     olsr_delete_kernel_route(rt);
 
     list_remove(&rt->rt_change_node);
index f22d757..ca11383 100644 (file)
@@ -93,6 +93,8 @@ struct rt_entry
   struct list_node      rt_change_node; /* queue for kernel FIB add/chg/del */
 };
 
+LISTNODE2STRUCT(changelist2rt, struct rt_entry, rt_change_node);
+
 /*
  * For every received route a rt_path is added to the RIB.
  * Depending on the results of the SPF calculation we perform a
index 6b73911..8059dce 100644 (file)
@@ -95,6 +95,8 @@ struct tc_entry
   olsr_bool          err_seq_valid; /* do we have an error (unplauible seq/ansn) */
 };
 
+LISTNODE2STRUCT(pathlist2tc, struct tc_entry, path_list_node);
+
 /*
  * macros for traversing vertices, edges and prefixes in the link state database.
  * it is recommended to use this because it hides all the internal