Use ETX for HNA routes, too.
authorThomas Lopatic <thomas@lopatic.de>
Sat, 22 Jan 2005 12:25:25 +0000 (12:25 +0000)
committerThomas Lopatic <thomas@lopatic.de>
Sat, 22 Jan 2005 12:25:25 +0000 (12:25 +0000)
src/lq_route.c
src/olsr.c
src/routing_table.c
src/routing_table.h

index 44978c9..351ddff 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: lq_route.c,v 1.20 2005/01/22 00:09:18 kattemat Exp $
+ * $Id: lq_route.c,v 1.21 2005/01/22 12:25:25 tlopatic Exp $
  */
 
 #include "defs.h"
@@ -45,6 +45,7 @@
 #include "link_set.h"
 #include "routing_table.h"
 #include "mid_set.h"
+#include "hna_set.h"
 #include "lq_list.h"
 #include "lq_route.h"
 
@@ -306,6 +307,9 @@ void olsr_calculate_lq_routing_table(void)
   int hops;
   struct mid_address *mid_walker;
   float etx;
+  struct hna_entry *hna_gw;
+  struct hna_net *hna;
+  struct rt_entry *gw_rt, *hna_rt, *head_rt;
 
   // initialize the graph
 
@@ -429,9 +433,16 @@ void olsr_calculate_lq_routing_table(void)
     // if no path to a one-hop neighbour was found, ignore this node
 
     if (walker != NULL)
+    {
       olsr_printf(2, "%s:%s (one-hop)\n", olsr_ip_to_string(&walker->addr),
                   etx_to_string(walker->path_etx));
 
+      // node reachable => add to the set of unprocessed nodes
+      // for HNA processing
+
+      vert->done = OLSR_FALSE;
+    }
+
     else
     {
       olsr_printf(2, "FAILED\n", olsr_ip_to_string(&vert->addr));
@@ -465,6 +476,85 @@ void olsr_calculate_lq_routing_table(void)
                                 get_neighbor_nexthop(&walker->addr), hops);
   }
 
+  // add HNA routes - the set of unprocessed network nodes contains
+  // all reachable network nodes
+
+  for (;;)
+  {
+    // extract the network node with the best ETX and remove it
+    // from the set of unprocessed network nodes
+
+    vert = extract_best(&vertex_list);
+
+    // no more nodes left
+
+    if (vert == NULL)
+      break;
+
+    // find the node's HNAs
+
+    hna_gw = olsr_lookup_hna_gw(&vert->addr);
+
+    // node doesn't announce any HNAs
+
+    if (hna_gw == NULL)
+      continue;
+
+    // loop through the node's HNAs
+
+    for (hna = hna_gw->networks.next; hna != &hna_gw->networks;
+         hna = hna->next)
+    {
+      // we already have a route via a previous (better) node
+
+      if (olsr_lookup_routing_table(&hna->A_network_addr) != NULL)
+        continue;
+
+      // find route to the node
+
+      gw_rt = olsr_lookup_routing_table(&hna_gw->A_gateway_addr);
+
+      // should never happen as we only process reachable nodes
+
+      if (gw_rt == NULL)
+      {
+        fprintf(stderr, "LQ HNA processing: Gateway without a route.");
+        continue;
+      }
+
+      // create route for the HNA
+
+      hna_rt = olsr_malloc(sizeof(struct rt_entry), "LQ HNA route entry");
+
+      // set HNA IP address and netmask
+
+      COPY_IP(&hna_rt->rt_dst, &hna->A_network_addr);
+      hna_rt->rt_mask = hna->A_netmask;
+
+      // copy remaining fields from the node's route
+
+      COPY_IP(&hna_rt->rt_router, &gw_rt->rt_router);
+      hna_rt->rt_metric = gw_rt->rt_metric;
+      hna_rt->rt_if = gw_rt->rt_if;
+
+      // we're not a host route
+
+      hna_rt->rt_flags = RTF_UP | RTF_GATEWAY;
+
+      // find the correct list
+
+      head_rt = &routingtable[olsr_hashing(&hna->A_network_addr)];
+
+      // enqueue
+
+      head_rt->next->prev = hna_rt;
+      hna_rt->next = head_rt->next;
+
+      head_rt->next = hna_rt;
+      hna_rt->prev = head_rt;
+    }
+  }
+
   // free the graph
 
   free_everything(&vertex_list);
index d2166fe..95686ad 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsr.c,v 1.36 2005/01/16 19:49:28 kattemat Exp $
+ * $Id: olsr.c,v 1.37 2005/01/22 12:25:25 tlopatic Exp $
  */
 
 /**
@@ -201,14 +201,13 @@ olsr_process_changes()
       if (olsr_cnf->lq_level < 2)
         {
           olsr_calculate_routing_table();
+          olsr_calculate_hna_routes();
         }
 
       else
         {
           olsr_calculate_lq_routing_table();
         }
-
-      olsr_calculate_hna_routes();
     }
   
   else if (changes_topology)
@@ -218,20 +217,28 @@ olsr_process_changes()
       if (olsr_cnf->lq_level < 2)
         {
           olsr_calculate_routing_table();
+          olsr_calculate_hna_routes();
         }
 
       else
         {
           olsr_calculate_lq_routing_table();
         }
-
-      olsr_calculate_hna_routes();
     }
 
   else if (changes_hna)
     {
-      /* Update HNA routes */
-      olsr_calculate_hna_routes();
+      /* update HNA routes */
+
+      if (olsr_cnf->lq_level < 2)
+        {
+          olsr_calculate_hna_routes();
+        }
+
+      else
+        {
+          olsr_calculate_lq_routing_table();
+        }
     }
   
   if (olsr_cnf->debug_level > 0)
index ed0197b..b25dfef 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: routing_table.c,v 1.13 2005/01/22 00:09:18 kattemat Exp $
+ * $Id: routing_table.c,v 1.14 2005/01/22 12:25:25 tlopatic Exp $
  */
 
 
@@ -63,9 +63,6 @@ olsr_fill_routing_table_with_two_hop_neighbors(void);
 static struct rt_entry *
 olsr_check_for_higher_hopcount(struct rt_entry *, struct hna_net *, olsr_u16_t);
 
-static struct rt_entry *
-olsr_lookup_routing_table(union olsr_ip_addr *);
-
 struct rt_entry *
 olsr_check_for_lower_hopcount(struct rt_entry *, struct hna_net *, olsr_u16_t);
 
@@ -107,7 +104,7 @@ olsr_init_routing_table()
  *@return a pointer to a rt_entry struct 
  *representing the route entry.
  */
-static struct rt_entry *
+struct rt_entry *
 olsr_lookup_routing_table(union olsr_ip_addr *dst)
 {
 
index adba073..2ecb225 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: routing_table.h,v 1.11 2004/11/21 11:28:56 kattemat Exp $
+ * $Id: routing_table.h,v 1.12 2005/01/22 12:25:25 tlopatic Exp $
  */
 
 #ifndef _OLSR_ROUTING_TABLE
@@ -110,6 +110,9 @@ olsr_print_routing_table(struct rt_entry *);
 struct rt_entry *
 olsr_insert_routing_table(union olsr_ip_addr *, union olsr_ip_addr *, int);
 
+struct rt_entry *
+olsr_lookup_routing_table(union olsr_ip_addr *);
+
 void
 olsr_free_routing_table(struct rt_entry *);