Patch by Bruno applied. The link metric is now displayed
authorAndreas Tonnesen <andreto@olsr.org>
Sat, 1 Jan 2005 17:58:34 +0000 (17:58 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Sat, 1 Jan 2005 17:58:34 +0000 (17:58 +0000)
lib/dot_draw/src/olsr_plugin_io.h
lib/dot_draw/src/olsrd_dot_draw.c
lib/dot_draw/src/olsrd_dot_draw.h
lib/dot_draw/src/olsrd_plugin.c
lib/dot_draw/src/olsrd_plugin.h

index e4f37c1..547e4bb 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsr_plugin_io.h,v 1.4 2004/12/03 20:52:27 kattemat Exp $
+ * $Id: olsr_plugin_io.h,v 1.5 2005/01/01 17:58:34 kattemat Exp $
  */
 
 
@@ -99,6 +99,7 @@
 #define GETD__ROUTINGTABLE                         113
 #define GETD__HNA_ROUTES                           114
 #define GETD__MID_SET                              115
+#define GETD__LINK_SET                             116
 
 /* Function fetching - starts at 500 */
 #define GETF__OLSR_REGISTER_SCHEDULER_EVENT        500
index f627a8e..c3de8f8 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_dot_draw.c,v 1.8 2004/12/03 20:52:27 kattemat Exp $
+ * $Id: olsrd_dot_draw.c,v 1.9 2005/01/01 17:58:34 kattemat Exp $
  */
 
 /*
@@ -225,25 +225,7 @@ pcf_event(int changes_neighborhood,
              neighbor_table_tmp != &neighbortable[index];
              neighbor_table_tmp = neighbor_table_tmp->next)
            {
-             if(neighbor_table_tmp->is_mpr)
-               {
-                 ipc_print_mpr_link(main_addr, &neighbor_table_tmp->neighbor_main_addr);                 
-                 ipc_print_mpr_link(&neighbor_table_tmp->neighbor_main_addr, main_addr);
-               }
-             else
-               {
-                 ipc_print_neigh_link(main_addr, &neighbor_table_tmp->neighbor_main_addr);               
-                 ipc_print_neigh_link(&neighbor_table_tmp->neighbor_main_addr, main_addr);
-               }
-
-             for(list_2 = neighbor_table_tmp->neighbor_2_list.next;
-                 list_2 != &neighbor_table_tmp->neighbor_2_list;
-                 list_2 = list_2->next)
-               {
-                 ipc_print_2h_link(&neighbor_table_tmp->neighbor_main_addr, 
-                                   &list_2->neighbor_2->neighbor_2_addr);
-               }
-             
+             ipc_print_neigh_link( neighbor_table_tmp );
            }
        }
 
@@ -258,7 +240,7 @@ pcf_event(int changes_neighborhood,
              dst_entry = entry->destinations.next;
              while(dst_entry != &entry->destinations)
                {
-                 ipc_print_tc_link(&entry->T_last_addr, &dst_entry->T_dest_addr);
+                 ipc_print_tc_link(entry, dst_entry);
                  dst_entry = dst_entry->next;
                }
              entry = entry->next;
@@ -300,67 +282,69 @@ pcf_event(int changes_neighborhood,
   return res;
 }
 
-
-
-
-static void inline
-ipc_print_neigh_link(union olsr_ip_addr *from, union olsr_ip_addr *to)
-{
-  char *adr;
-
-  adr = olsr_ip_to_string(from);
-  ipc_send("\"", 1);
-  ipc_send(adr, strlen(adr));
-  ipc_send("\" -> \"", strlen("\" -> \""));
-  adr = olsr_ip_to_string(to);
-  ipc_send(adr, strlen(adr));
-  ipc_send("\"[label=\"neigh\", style=dashed];\n", strlen("\"[label=\"neigh\", style=dashed];\n"));
-
+#define MIN_LINK_QUALITY 0.01
+double calc_etx( double loss, double neigh_loss ) {
+       if (loss < MIN_LINK_QUALITY || neigh_loss < MIN_LINK_QUALITY)
+               return 0.0;
+       else
+               return 1.0 / (loss * neigh_loss);
 }
 
 static void inline
-ipc_print_2h_link(union olsr_ip_addr *from, union olsr_ip_addr *to)
+ipc_print_neigh_link(struct neighbor_entry *neighbor)
 {
-  char *adr;
-
-  adr = olsr_ip_to_string(from);
-  ipc_send("\"", 1);
-  ipc_send(adr, strlen(adr));
-  ipc_send("\" -> \"", strlen("\" -> \""));
-  adr = olsr_ip_to_string(to);
-  ipc_send(adr, strlen(adr));
-  ipc_send("\"[label=\"2 hop\"];\n", strlen("\"[label=\"2 hop\"];\n"));
-
-}
-
-static void inline
-ipc_print_mpr_link(union olsr_ip_addr *from, union olsr_ip_addr *to)
-{
-  char *adr;
-
-  adr = olsr_ip_to_string(from);
-  ipc_send("\"", 1);
-  ipc_send(adr, strlen(adr));
-  ipc_send("\" -> \"", strlen("\" -> \""));
-  adr = olsr_ip_to_string(to);
-  ipc_send(adr, strlen(adr));
-  ipc_send("\"[label=\"MPR\", style=dashed];\n", strlen("\"[label=\"MPR\", style=dashed]];\n"));
-
+  char buf[256];
+  int len;
+  char* adr;
+  double etx=0.0;
+  char* style = "solid";
+  struct link_entry* link;
+  adr = olsr_ip_to_string(main_addr);
+  len = sprintf( buf, "\"%s\" -> ", adr );
+  ipc_send(buf, len);
+  
+  adr = olsr_ip_to_string(&neighbor->neighbor_main_addr);
+  
+  if (neighbor->status == 0) { // non SYM
+       style = "dashed";
+  }
+  else {
+    /* find best link to neighbor for the ETX */
+    //? why cant i just get it one time at fetch_olsrd_data??? (br1)
+    if(olsr_plugin_io(GETD__LINK_SET, &link, sizeof(link)) && link)
+    {
+      link_set = link; // for olsr_neighbor_best_link    
+      link = olsr_neighbor_best_link(&neighbor->neighbor_main_addr);
+      if (link) {
+        etx = calc_etx( link->loss_link_quality, link->neigh_link_quality);
+      }
+    }
+  }
+    
+  len = sprintf( buf, "\"%s\"[label=\"%.2f\", style=%s];\n", adr, etx, style );
+  ipc_send(buf, len);
+  
+   if (neighbor->is_mpr) {
+       len = sprintf( buf, "\"%s\"[shape=box];\n", adr );
+       ipc_send(buf, len);
+  }
 }
 
 static void inline
-ipc_print_tc_link(union olsr_ip_addr *from, union olsr_ip_addr *to)
+ipc_print_tc_link(struct tc_entry *entry, struct topo_dst *dst_entry)
 {
-  char *adr;
-
-  adr = olsr_ip_to_string(from);
-  ipc_send("\"", 1);
-  ipc_send(adr, strlen(adr));
-  ipc_send("\" -> \"", strlen("\" -> \""));
-  adr = olsr_ip_to_string(to);
-  ipc_send(adr, strlen(adr));
-  ipc_send("\"[label=\"TC\"];\n", strlen("\"[label=\"TC\"];\n"));
-
+  char buf[256];
+  int len;
+  char* adr;
+  double etx = calc_etx( dst_entry->link_quality, dst_entry->inverse_link_quality );
+
+  adr = olsr_ip_to_string(&entry->T_last_addr);
+  len = sprintf( buf, "\"%s\" -> ", adr );
+  ipc_send(buf, len);
+  
+  adr = olsr_ip_to_string(&dst_entry->T_dest_addr);
+  len = sprintf( buf, "\"%s\"[label=\"%.2f\"];\n", adr, etx );
+  ipc_send(buf, len);
 }
 
 static void inline
@@ -415,12 +399,6 @@ ipc_send(char *data, int size)
  *Converts a olsr_ip_addr to a string
  *Goes for both IPv4 and IPv6
  *
- *NON REENTRANT! If you need to use this
- *function twice in e.g. the same printf
- *it will not work.
- *You must use it in different calls e.g.
- *two different printfs
- *
  *@param the IP to convert
  *@return a pointer to a static string buffer
  *representing the address in "dots and numbers"
@@ -429,10 +407,11 @@ ipc_send(char *data, int size)
 char *
 olsr_ip_to_string(union olsr_ip_addr *addr)
 {
-
+  static int index = 0;
+  static char buff[4][100];
   char *ret;
   struct in_addr in;
-  
   if(ipversion == AF_INET)
     {
       in.s_addr=addr->v4;
@@ -444,10 +423,14 @@ olsr_ip_to_string(union olsr_ip_addr *addr)
       ret = (char *)inet_ntop(AF_INET6, &addr->v6, ipv6_buf, sizeof(ipv6_buf));
     }
 
-  return ret;
-}
+  strncpy(buff[index], ret, 100);
 
+  ret = buff[index];
 
+  index = (index + 1) & 3;
+
+  return ret;
+}
 
 
 /**
@@ -476,4 +459,32 @@ olsr_netmask_to_string(union hna_netmask *mask)
   return ret;
 }
 
+#define COMP_IP(ip1, ip2) (!memcmp(ip1, ip2, ipsize))
+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 b3d975c..349f6ab 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_dot_draw.h,v 1.4 2004/12/03 20:52:27 kattemat Exp $
+ * $Id: olsrd_dot_draw.h,v 1.5 2005/01/01 17:58:34 kattemat Exp $
  */
 
 /*
@@ -60,7 +60,7 @@ void
 ipc_action(int);
 
 static void inline
-ipc_print_neigh_link(union olsr_ip_addr *, union olsr_ip_addr *);
+ipc_print_neigh_link(struct neighbor_entry *neighbor);
 
 static void inline
 ipc_print_2h_link(union olsr_ip_addr *, union olsr_ip_addr *);
@@ -69,7 +69,7 @@ static void inline
 ipc_print_mpr_link(union olsr_ip_addr *, union olsr_ip_addr *);
 
 static void inline
-ipc_print_tc_link(union olsr_ip_addr *, union olsr_ip_addr *);
+ipc_print_tc_link(struct tc_entry *entry, struct topo_dst *dst_entry);
 
 static void inline
 ipc_print_net(union olsr_ip_addr *, union olsr_ip_addr *, union hna_netmask *);
@@ -83,5 +83,6 @@ olsr_ip_to_string(union olsr_ip_addr *);
 char *
 olsr_netmask_to_string(union hna_netmask *);
 
+struct link_entry *olsr_neighbor_best_link(union olsr_ip_addr *main);
 
 #endif
index 9026f92..8233066 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_plugin.c,v 1.7 2004/12/03 20:52:27 kattemat Exp $
+ * $Id: olsrd_plugin.c,v 1.8 2005/01/01 17:58:34 kattemat Exp $
  */
 
 /*
@@ -221,6 +221,13 @@ fetch_olsrd_data()
     retval = 0;
   }
 
+  /* link set */
+  if(!olsr_plugin_io(GETD__LINK_SET, &link_set, sizeof(link_set))) {
+    link_set = NULL;
+    printf("********* err\n");
+    retval = 0;
+  }
+  
   /* Topoloy table */
   if(!olsr_plugin_io(GETD__TC_TABLE, 
                     &tc_table, 
index 5ea786d..8463387 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_plugin.h,v 1.10 2004/12/03 22:05:24 kattemat Exp $
+ * $Id: olsrd_plugin.h,v 1.11 2005/01/01 17:58:34 kattemat Exp $
  */
 
 /*
@@ -231,13 +231,68 @@ struct hna_entry
   struct hna_entry   *prev;
 };
 
+/* Link entry */
+struct link_entry
+{
+  union olsr_ip_addr local_iface_addr;
+  union olsr_ip_addr neighbor_iface_addr;
+  struct timeval SYM_time;
+  struct timeval ASYM_time;
+  struct timeval time;
+  struct neighbor_entry *neighbor;
+
+  /*
+   *Hysteresis
+   */
+  float L_link_quality;
+  int L_link_pending;
+  struct timeval L_LOST_LINK_time;
+  struct timeval hello_timeout; /* When we should receive a new HELLO */
+  double last_htime;
+  olsr_u16_t olsr_seqno;
+  olsr_bool olsr_seqno_valid;
+
+  /*
+   * packet loss
+   */
+
+  double loss_hello_int;
+  struct timeval loss_timeout;
+
+  olsr_u16_t loss_seqno;
+  int loss_seqno_valid;
+  int loss_missed_hellos;
+
+  int lost_packets;
+  int total_packets;
+
+  double loss_link_quality;
+
+  int loss_window_size;
+  int loss_index;
+
+  unsigned char loss_bitmap[16];
+
+  double neigh_link_quality;
+
+  double saved_loss_link_quality;
+  double saved_neigh_link_quality;
+
+  /*
+   * Spy
+   */
+  olsr_u8_t                    spy_activated;
+
+  struct link_entry *next;
+};
+
 /* The lists */
 
 struct neighbor_entry *neighbortable;
 struct neighbor_2_entry *two_hop_neighbortable;
 struct tc_entry *tc_table;
 struct hna_entry *hna_set;
-
+struct link_entry *link_set;
 
 /* Buffer for olsr_ip_to_string */