Optimized get_best_link_to_neighbor(). Removed olsr_neighbor_best_link()
authorThomas Lopatic <thomas@lopatic.de>
Mon, 14 Feb 2005 15:54:30 +0000 (15:54 +0000)
committerThomas Lopatic <thomas@lopatic.de>
Mon, 14 Feb 2005 15:54:30 +0000 (15:54 +0000)
which implements a subset of get_best_link_to_neighbor(). Fixed Windows
port.

src/link_set.c
src/link_set.h
src/lq_packet.c
src/lq_route.c
src/neighbor_table.c
src/parser.c
src/process_package.c
src/win32/kernel_routes.c
src/win32/net.c

index ac694e2..b9c40ef 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.47 2005/02/12 22:42:34 kattemat Exp $
+ * $Id: link_set.c,v 1.48 2005/02/14 15:54:29 tlopatic Exp $
  */
 
 
@@ -71,9 +71,6 @@ olsr_time_out_link_set(void);
 static int
 get_neighbor_status(union olsr_ip_addr *);
 
-static inline struct link_entry *
-find_best_link(union olsr_ip_addr *);
-
 
 
 void
@@ -214,117 +211,107 @@ get_neighbor_status(union olsr_ip_addr *address)
   return 0;
 }
 
-
 /**
- *Find the best link to a neighbor interface 
- *
+ * Find best link to a neighbor
  */
 
-static inline struct link_entry *
-find_best_link(union olsr_ip_addr *remote)
+struct link_entry *
+get_best_link_to_neighbor(union olsr_ip_addr *remote)
 {
-  struct link_entry *tmp_link_set, *entry;
+  union olsr_ip_addr *main_addr;
+  struct link_entry *walker, *good_link, *backup_link;
   int curr_metric = MAX_IF_METRIC;
   float curr_lq = -1.0;
+  
+  // main address lookup
 
-  tmp_link_set = link_set;
-  entry = NULL;
+  main_addr = mid_lookup_main_addr(remote);
 
-  while(tmp_link_set)
+  // "remote" *already is* the main address
+
+  if (main_addr == NULL)
+    main_addr = remote;
+
+  // we haven't selected any links, yet
+
+  good_link = NULL;
+  backup_link = NULL;
+
+  // loop through all links that we have
+
+  for (walker = link_set; walker != NULL; walker = walker->next)
+  {
+    // if this is not a link to the neighour in question, skip
+
+    if (!COMP_IP(&walker->neighbor->neighbor_main_addr, main_addr))
+      continue;
+
+    // handle the non-LQ case
+
+    if (olsr_cnf->lq_level == 0)
     {
-      if(COMP_IP(remote, &tmp_link_set->neighbor_iface_addr))
-       {
-         struct interface *tmp_if = if_ifwithaddr(&tmp_link_set->local_iface_addr);
+      struct interface *tmp_if;
 
-         if (olsr_cnf->lq_level == 0)
-           {
-             if(tmp_if->int_metric < curr_metric)
-               {
-                 entry = tmp_link_set;
-                 curr_metric = tmp_if->int_metric;
-               }
-           }
-         else
-           {
-             float tmp_lq = tmp_link_set->loss_link_quality *
-               tmp_link_set->neigh_link_quality;
-
-             if (tmp_lq > curr_lq)
-               {
-                 entry = tmp_link_set;
-                 curr_lq = tmp_lq;
-               }
-           }
-       }
-         tmp_link_set = tmp_link_set->next;
-    }
-  
-  return entry;
-}
+      // find the interface for the link - we select the link with the
+      // best local interface metric
 
+      tmp_if = if_ifwithaddr(&walker->local_iface_addr);
 
-/**
- * Find best link to a neighbor
- */
+      // is this interface better than anything we had before?
 
-struct link_entry *
-get_best_link_to_neighbor(union olsr_ip_addr *remote)
-{
-  struct link_entry *good_link = NULL, *backup_link = NULL;
-  int curr_metric = MAX_IF_METRIC;
-  float curr_lq = -1.0;
-  union olsr_ip_addr *main_addr;
-  struct mid_address *aliases, main_alias;
-  
-  /* Find main address */
-  if(!(main_addr = mid_lookup_main_addr(remote)))
-    main_addr = remote;
+      if ((tmp_if->int_metric < curr_metric) ||
+          // use the requested remote interface address as a tie-breaker
+          ((tmp_if->int_metric == curr_metric) && 
+           COMP_IP(&walker->local_iface_addr, remote)))
+      {
+        // memorize the interface's metric
+
+        curr_metric = tmp_if->int_metric;
 
-  COPY_IP(&main_alias.alias, main_addr);
-  main_alias.next_alias = mid_lookup_aliases(main_addr);
+        // prefer symmetric links over asymmetric links
 
-  for(aliases = &main_alias;
-      aliases != NULL;
-      aliases = aliases->next_alias)
+        if (lookup_link_status(walker) == SYM_LINK)
+          good_link = walker;
+
+        else
+          backup_link = walker;
+      }
+    }
+
+    // handle the LQ case
+
+    else
     {
-      struct link_entry *link;
+      float tmp_lq;
 
-      if((link = find_best_link(&aliases->alias)) != NULL)
-       {
-         if (olsr_cnf->lq_level == 0)
-           {
-             struct interface *tmp_if = if_ifwithaddr(&link->local_iface_addr);
-             if((tmp_if->int_metric < curr_metric) ||
-                /* Prefer the requested link */
-                ((tmp_if->int_metric == curr_metric) && 
-                 COMP_IP(&link->local_iface_addr, remote)))
-               {
-                 curr_metric = tmp_if->int_metric;
-                 if(lookup_link_status(link) == SYM_LINK)
-                   good_link = link;
-                 else
-                   backup_link = link;
-               }
-           }
-         else
-           {
-             float tmp_lq = link->loss_link_quality *
-               link->neigh_link_quality;
+      // calculate the bi-directional link quality - we select the link
+      // with the best link quality
+
+      tmp_lq = walker->loss_link_quality * walker->neigh_link_quality;
+
+      // is this link better than anything we had before?
              
-             if((tmp_lq > curr_lq) ||
-                /* Prefer the requested link */
-                ((tmp_lq == curr_lq) && 
-                 COMP_IP(&link->local_iface_addr, remote)))              
-               {
-                 curr_lq = tmp_lq;
-                 if(lookup_link_status(link) == SYM_LINK)
-                   good_link = link;
-                 else
-                   backup_link = link;
-               }
-           } 
-       }
+      if((tmp_lq > curr_lq) ||
+         // use the requested remote interface address as a tie-breaker
+         ((tmp_lq == curr_lq) && COMP_IP(&walker->local_iface_addr, remote)))
+      {
+        // memorize the link quality
+
+        curr_lq = tmp_lq;
+
+        // prefer symmetric links over asymmetric links
+
+        if(lookup_link_status(walker) == SYM_LINK)
+          good_link = walker;
+
+        else
+          backup_link = walker;
+      }
     }
+  }
+
+  // if we haven't found any symmetric links, try to return an
+  // asymmetric link
 
   return good_link ? good_link : backup_link;
 }
@@ -1046,32 +1033,3 @@ static void olsr_time_out_packet_loss()
       walker->loss_timeout = GET_TIMESTAMP(walker->loss_hello_int * 1000.0);
     }
 }
-
-struct link_entry *olsr_neighbor_best_link(union olsr_ip_addr *main)
-{
-  struct link_entry *walker;
-  double best = 0.0;
-  double curr;
-  struct link_entry *res = NULL;
-
-  // loop through all links
-
-  for (walker = link_set; walker != NULL; walker = walker->next)
-  {
-    // check whether it's a link to the requested neighbor and
-    // whether the link's quality is better than what we have
-
-    if(COMP_IP(main, &walker->neighbor->neighbor_main_addr))
-    {
-      curr = walker->loss_link_quality * walker->neigh_link_quality;
-
-      if (curr >= best)
-      {
-        best = curr;
-        res = walker;
-      }
-    }
-  }
-
-  return res;
-}
index ad88841..95d0260 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.20 2005/02/12 22:32:42 kattemat Exp $
+ * $Id: link_set.h,v 1.21 2005/02/14 15:54:30 tlopatic Exp $
  */
 
 
@@ -145,7 +145,4 @@ olsr_update_packet_loss(union olsr_ip_addr *, union olsr_ip_addr *, olsr_u16_t);
 void 
 olsr_print_link_set(void);
 
-struct link_entry *
-olsr_neighbor_best_link(union olsr_ip_addr *);
-
 #endif
index 581dcc4..f504530 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.9 2005/01/16 19:49:28 kattemat Exp $
+ * $Id: lq_packet.c,v 1.10 2005/02/14 15:54:30 tlopatic Exp $
  */
 
 #include "olsr_protocol.h"
@@ -198,7 +198,7 @@ create_lq_tc(struct lq_tc_message *lq_tc, struct interface *outif)
 
           // set the entry's link quality
 
-          link = olsr_neighbor_best_link(&neigh->main);
+          link = get_best_link_to_neighbor(&neigh->main);
 
           neigh->link_quality = link->loss_link_quality;
           neigh->neigh_link_quality = link->neigh_link_quality;
index 36b5d36..2ce46f7 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.24 2005/02/12 22:32:42 kattemat Exp $
+ * $Id: lq_route.c,v 1.25 2005/02/14 15:54:30 tlopatic Exp $
  */
 
 #include "defs.h"
@@ -375,7 +375,7 @@ void olsr_calculate_lq_routing_table(void)
          neigh = neigh->next)
       if (neigh->status == SYM)
       {
-        link = olsr_neighbor_best_link(&neigh->neighbor_main_addr);
+        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)
index 38b5a07..540589b 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: neighbor_table.c,v 1.24 2005/01/22 00:09:18 kattemat Exp $
+ * $Id: neighbor_table.c,v 1.25 2005/02/14 15:54:30 tlopatic Exp $
  */
 
 
@@ -493,7 +493,8 @@ olsr_print_neighbor_table()
       for(neigh = neighbortable[i].next; neigh != &neighbortable[i];
          neigh = neigh->next)
        {
-         struct link_entry *link = olsr_neighbor_best_link(&neigh->neighbor_main_addr);
+         struct link_entry *link =
+            get_best_link_to_neighbor(&neigh->neighbor_main_addr);
          double best_lq = link->neigh_link_quality;
          double inv_best_lq = link->loss_link_quality;
 
index 28405e8..567833d 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: parser.c,v 1.17 2005/02/12 23:07:02 spoggle Exp $
+ * $Id: parser.c,v 1.18 2005/02/14 15:54:30 tlopatic Exp $
  */
 
 #include "parser.h"
 #include "rebuild_packet.h"
 
 //union olsr_ip_addr tmp_addr;
-#ifdef WIN32
-#undef EWOULDBLOCK
-#define EWOULDBLOCK WSAEWOULDBLOCK
-#undef errno
-#define errno WSAGetLastError()
-#undef strerror
-#define strerror(x) StrError(x)
-#endif
-
 
 /**
  *Initialize the parser. 
index a1f3fff..6804d5a 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: process_package.c,v 1.29 2005/02/04 06:30:46 kattemat Exp $
+ * $Id: process_package.c,v 1.30 2005/02/14 15:54:30 tlopatic Exp $
  */
 
 
@@ -561,7 +561,8 @@ olsr_process_message_neighbors(struct neighbor_entry *neighbor,
              struct neighbor_list_entry *walker;
              struct link_entry *link;
 
-              link = olsr_neighbor_best_link(&neighbor->neighbor_main_addr);
+              link = get_best_link_to_neighbor(&neighbor->neighbor_main_addr);
+
               // loop through the one-hop neighbors that see this
               // two hop neighbour
 
index d2183f8..305945b 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: kernel_routes.c,v 1.12 2004/12/03 18:01:59 tlopatic Exp $
+ * $Id: kernel_routes.c,v 1.13 2005/02/14 15:54:30 tlopatic Exp $
  */
 
 #include <stdio.h>
@@ -62,7 +62,8 @@ int olsr_ioctl_add_route(struct rt_entry *Dest)
   inet_ntop(AF_INET, &Dest->rt_mask.v4, Str2, 16);
   inet_ntop(AF_INET, &Dest->rt_router.v4, Str3, 16);
 
-  olsr_printf(1, "Adding IPv4 route to %s/%s via %s.\n", Str1, Str2, Str3);
+  olsr_printf(1, "Adding IPv4 route to %s/%s via %s and I/F 0x%x.\n",
+              Str1, Str2, Str3, Dest->rt_if->if_index);
 
   memset(&Row, 0, sizeof (MIB_IPFORWARDROW));
 
@@ -117,7 +118,8 @@ int olsr_ioctl_del_route(struct rt_entry *Dest)
   inet_ntop(AF_INET, &Dest->rt_mask.v4, Str2, 16);
   inet_ntop(AF_INET, &Dest->rt_router.v4, Str3, 16);
 
-  olsr_printf(1, "Deleting IPv4 route to %s/%s via %s.\n", Str1, Str2, Str3);
+  olsr_printf(1, "Deleting IPv4 route to %s/%s via %s and I/F 0x%x.\n",
+              Str1, Str2, Str3, Dest->rt_if->if_index);
 
   memset(&Row, 0, sizeof (MIB_IPFORWARDROW));
 
index 4c1ddfa..ee9a414 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net.c,v 1.12 2005/02/12 23:07:02 spoggle Exp $
+ * $Id: net.c,v 1.13 2005/02/14 15:54:30 tlopatic Exp $
  */
 
 #define WIN32_LEAN_AND_MEAN
 #include "../defs.h"
 #include "../net_os.h"
 
+// XXX - really port I/O functions to Windows
+
+#undef EWOULDBLOCK
+#define EWOULDBLOCK WSAEWOULDBLOCK
+#undef errno
+#define errno WSAGetLastError()
+#undef strerror
+#define strerror(x) StrError(x)
+
 void WinSockPError(char *Str);
 void PError(char *);