Only use updated link qualities for links between us and our neighbours
authorThomas Lopatic <thomas@lopatic.de>
Sun, 23 Oct 2005 20:58:14 +0000 (20:58 +0000)
committerThomas Lopatic <thomas@lopatic.de>
Sun, 23 Oct 2005 20:58:14 +0000 (20:58 +0000)
after we have announced them to the world via an LQ TC message. The idea
is that we use the updated link qualities only when everybody else does
so, too.

src/link_set.c
src/link_set.h
src/lq_packet.c
src/lq_route.c
src/net_olsr.c

index 9a0d270..8f49704 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: link_set.c,v 1.60 2005/05/30 13:13:38 kattemat Exp $
+ * $Id: link_set.c,v 1.61 2005/10/23 20:58:14 tlopatic Exp $
  */
 
 
@@ -475,6 +475,9 @@ add_new_entry(union olsr_ip_addr *local, union olsr_ip_addr *remote, union olsr_
   new_link->loss_link_quality = 0.0;
   new_link->neigh_link_quality = 0.0;
 
+  new_link->loss_link_quality2 = 0.0;
+  new_link->neigh_link_quality2 = 0.0;
+
   new_link->saved_loss_link_quality = 0.0;
   new_link->saved_neigh_link_quality = 0.0;
 
@@ -1072,3 +1075,15 @@ static void olsr_time_out_packet_loss()
       walker->loss_timeout = GET_TIMESTAMP(walker->loss_hello_int * 1000.0);
     }
 }
+
+void olsr_update_dijkstra_link_qualities()
+{
+  struct link_entry *walker;
+
+  for (walker = link_set; walker != NULL; walker = walker->next)
+  {
+    walker->loss_link_quality2 = walker->loss_link_quality;
+    walker->neigh_link_quality2 = walker->neigh_link_quality;
+  }
+}
+
index b1313bd..6fced50 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: link_set.h,v 1.27 2005/05/29 12:47:45 br1 Exp $
+ * $Id: link_set.h,v 1.28 2005/10/23 20:58:14 tlopatic Exp $
  */
 
 
@@ -85,7 +85,7 @@ struct link_entry
   int lost_packets;
   int total_packets;
 
-  double loss_link_quality;
+  double loss_link_quality, loss_link_quality2;
   double loss_link_multiplier;
 
   int loss_window_size;
@@ -93,7 +93,7 @@ struct link_entry
 
   unsigned char loss_bitmap[16];
 
-  double neigh_link_quality;
+  double neigh_link_quality, neigh_link_quality2;
 
   double saved_loss_link_quality;
   double saved_neigh_link_quality;
@@ -144,4 +144,7 @@ olsr_update_packet_loss(union olsr_ip_addr *, union olsr_ip_addr *, olsr_u16_t);
 void 
 olsr_print_link_set(void);
 
+void
+olsr_update_dijkstra_link_qualities(void);
+
 #endif
index dd068c6..7bcc931 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: lq_packet.c,v 1.17 2005/10/08 15:43:56 kattemat Exp $
+ * $Id: lq_packet.c,v 1.18 2005/10/23 20:58:14 tlopatic Exp $
  */
 
 #include "olsr_protocol.h"
@@ -54,6 +54,8 @@
 #include "hysteresis.h"
 #include "olsr.h"
 
+olsr_bool lq_tc_pending = OLSR_FALSE;
+
 static unsigned char msg_buffer[MAXMESSAGESIZE - OLSR_HEADERSIZE];
 
 static void
@@ -148,6 +150,11 @@ create_lq_tc(struct lq_tc_message *lq_tc, struct interface *outif)
   struct neighbor_entry *walker;
   struct link_entry *link;
 
+  // remember that we have generated an LQ TC message; this is
+  // checked in net_output()
+
+  lq_tc_pending = OLSR_TRUE;
+
   // initialize the static fields
 
   lq_tc->comm.type = LQ_TC_MESSAGE;
index 3b9fb0d..c249101 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.36 2005/10/23 20:11:50 tlopatic Exp $
+ * $Id: lq_route.c,v 1.37 2005/10/23 20:58:14 tlopatic Exp $
  */
 
 #include "defs.h"
@@ -365,7 +365,9 @@ void olsr_calculate_lq_routing_table(void)
   struct hna_net *hna;
   struct rt_entry *gw_rt, *hna_rt, *head_rt;
   struct neighbor_2_entry *neigh2;
+#if 0
   struct neighbor_list_entry *neigh_walker;
+#endif
   struct interface *inter;
 
   if (ipsize == 4)
@@ -424,15 +426,19 @@ void olsr_calculate_lq_routing_table(void)
       {
         link = get_best_link_to_neighbor(&neigh->neighbor_main_addr);
 
-        if (link->loss_link_quality >= MIN_LINK_QUALITY &&
-            link->neigh_link_quality >= MIN_LINK_QUALITY)
+        if (link->loss_link_quality2 >= MIN_LINK_QUALITY &&
+            link->neigh_link_quality2 >= MIN_LINK_QUALITY)
           {
-            etx = 1.0 / (link->loss_link_quality * link->neigh_link_quality);
+            etx = 1.0 / (link->loss_link_quality2 * link->neigh_link_quality2);
 
             add_edge(&vertex_tree, &neigh->neighbor_main_addr, &main_addr, etx);
           }
       }
 
+// we now rely solely on TC messages for routes to our two-hop neighbours
+
+#if 0
+
   // add edges between our neighbours and our two-hop neighbours
 
   for (i = 0; i < HASHSIZE; i++)
@@ -455,6 +461,8 @@ void olsr_calculate_lq_routing_table(void)
         }
       }
 
+#endif
+
   // add remaining edges
 
   for (i = 0; i < HASHSIZE; i++)
index b8e1b23..7bc5a3c 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net_olsr.c,v 1.4 2005/10/08 15:43:56 kattemat Exp $
+ * $Id: net_olsr.c,v 1.5 2005/10/23 20:58:14 tlopatic Exp $
  */
 
 #include "net_olsr.h"
 #include "olsr.h"
 #include "net_os.h"
 #include "print_packet.h"
+#include "link_set.h"
 #include <stdlib.h>
 
+extern olsr_bool lq_tc_pending;
+
 #ifdef WIN32
 #define perror(x) WinSockPError(x)
 void
@@ -488,6 +491,12 @@ net_output(struct interface *ifp)
   
   netbufs[ifp->if_nr]->pending = 0;
 
+  // if we've just transmitted a TC message, let Dijkstra use the current
+  // link qualities for the links to our neighbours
+
+  olsr_update_dijkstra_link_qualities();
+  lq_tc_pending = OLSR_FALSE;
+
   return 1;
 }