Switched from using timevals and gettimeofday to use ticks and times.
authorAndreas Tonnesen <andreto@olsr.org>
Sun, 16 Jan 2005 19:49:28 +0000 (19:49 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Sun, 16 Jan 2005 19:49:28 +0000 (19:49 +0000)
25 files changed:
src/build_msg.c
src/defs.h
src/duplicate_set.c
src/duplicate_set.h
src/generate_msg.c
src/hna_set.c
src/hna_set.h
src/hysteresis.c
src/link_set.c
src/link_set.h
src/lq_packet.c
src/main.c
src/mid_set.c
src/mid_set.h
src/mpr_selector_set.c
src/mpr_selector_set.h
src/neighbor_table.c
src/neighbor_table.h
src/olsr.c
src/olsr.h
src/packet.c
src/process_package.c
src/scheduler.c
src/tc_set.c
src/tc_set.h

index 8268a32..b5618b5 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: build_msg.c,v 1.23 2004/12/12 18:57:50 kattemat Exp $
+ * $Id: build_msg.c,v 1.24 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
@@ -764,7 +764,7 @@ tc_build4(struct tc_message *message, struct interface *ifp)
     }
   else
     {
-      if((!partial_sent) && (!TIMED_OUT(&send_empty_tc)))
+      if((!partial_sent) && (!TIMED_OUT(send_empty_tc)))
        {
          olsr_printf(1, "TC: Sending empty package\n");
 
@@ -896,7 +896,7 @@ tc_build6(struct tc_message *message, struct interface *ifp)
     }
   else
     {
-      if((!partial_sent) && (!TIMED_OUT(&send_empty_tc)))
+      if((!partial_sent) && (!TIMED_OUT(send_empty_tc)))
        {
          olsr_printf(1, "TC: Sending empty package\n");
            
index cd36385..99121d7 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: defs.h,v 1.31 2004/12/14 20:15:52 kattemat Exp $
+ * $Id: defs.h,v 1.32 2005/01/16 19:49:28 kattemat Exp $
  */
 
 #ifndef _OLSR_DEFS
@@ -44,6 +44,7 @@
 
 /* Common includes */
 #include <sys/time.h>
+#include <sys/times.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <stdio.h>
@@ -92,6 +93,9 @@
 
 struct olsrd_config *olsr_cnf;
 
+/* Global tick resolution */
+olsr_u16_t system_tick_divider;
+
 /*
  * Generic address list elem
  */
@@ -106,6 +110,7 @@ int exit_value; /* Global return value for process termination */
 
 
 /* Timer data */
+clock_t now_times;              /* current idea of times(2) reported uptime */
 struct timeval now;            /* current idea of time */
 struct tm *nowtm;              /* current idea of time (in tm) */
 
@@ -151,7 +156,7 @@ int rts;
 
 float max_tc_vtime;
 
-struct timeval fwdtimer[MAX_IFS];      /* forwarding timer */
+clock_t fwdtimer[MAX_IFS];     /* forwarding timer */
 
 extern struct timeval hold_time_fwd;
 
@@ -162,7 +167,7 @@ int minsize;
 olsr_bool changes;                /* is set if changes occur in MPRS set */ 
 
 /* TC empty message sending */
-extern struct timeval send_empty_tc;
+extern clock_t send_empty_tc;
 
 
 /* Used by everyone */
index b368d6c..54e0b3c 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: duplicate_set.c,v 1.7 2004/11/21 11:28:56 kattemat Exp $
+ * $Id: duplicate_set.c,v 1.8 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
@@ -58,9 +58,6 @@ olsr_init_duplicate_table()
 
   olsr_printf(3, "Initializing duplicatetable - hashsize %d\n", HASHSIZE);
 
-  /* Initialize duplicate set holding time */
-  olsr_init_timer((olsr_u32_t) (dup_hold_time*1000), &hold_time_duplicate);
-
   /* Since the holdingtime is rather large for duplicate
    * entries the timeoutfunction is only ran every 2 seconds
    */
@@ -100,7 +97,7 @@ olsr_add_dup_entry(union olsr_ip_addr *originator, olsr_u16_t seqno)
   /* Seqno */
   new_dup_entry->seqno = seqno;
   /* Set timer */
-  timeradd(&now, &hold_time_duplicate, &new_dup_entry->timer);
+  new_dup_entry->timer = GET_TIMESTAMP(dup_hold_time*1000);
   /* Interfaces */
   new_dup_entry->ifaces = NULL;
   /* Forwarded */
@@ -239,7 +236,7 @@ olsr_time_out_duplicate_table(void *foo)
 
       while(tmp_dup_table != &dup_set[i])
        {
-         if(TIMED_OUT(&tmp_dup_table->timer))
+         if(TIMED_OUT(tmp_dup_table->timer))
            {
 
 #ifdef DEBUG
@@ -303,7 +300,7 @@ olsr_update_dup_entry(union olsr_ip_addr *originator,
   tmp_dup_table->ifaces = new_iface;
   
   /* Set timer */
-  timeradd(&now, &hold_time_duplicate, &tmp_dup_table->timer);
+  tmp_dup_table->timer = GET_TIMESTAMP(dup_hold_time*1000);
   
   return 1;
 }
@@ -345,7 +342,7 @@ olsr_set_dup_forward(union olsr_ip_addr *originator,
   tmp_dup_table->forwarded = 1;
   
   /* Set timer */
-  timeradd(&now, &hold_time_duplicate, &tmp_dup_table->timer);
+  tmp_dup_table->timer = GET_TIMESTAMP(dup_hold_time*1000);
   
   return 1;
 }
index 42a9c3f..27d91b4 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: duplicate_set.h,v 1.8 2004/11/21 11:28:56 kattemat Exp $
+ * $Id: duplicate_set.h,v 1.9 2005/01/16 19:49:28 kattemat Exp $
  */
 
 #ifndef _OLSR_DUP_TABLE
@@ -50,7 +50,7 @@ struct dup_entry
 {
   union olsr_ip_addr     addr;      /* IP address of originator */
   olsr_u16_t             seqno;     /* Seqno of message */
-  struct timeval         timer;            /* Holding time */
+  clock_t                timer;            /* Holding time */
   struct dup_iface       *ifaces;   /* Interfaces this message was recieved on */
   olsr_u8_t              forwarded; /* If this message was forwarded or not */
   struct dup_entry       *next;     /* Next entry */
@@ -66,8 +66,6 @@ struct dup_iface
 /* The duplicate table */
 struct dup_entry dup_set[HASHSIZE];
 
-struct timeval  hold_time_duplicate;
-
 float dup_hold_time;
 
 
index 3f1a795..f809584 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: generate_msg.c,v 1.20 2004/12/12 18:57:51 kattemat Exp $
+ * $Id: generate_msg.c,v 1.21 2005/01/16 19:49:28 kattemat Exp $
  */
 
 #include "generate_msg.h"
@@ -82,7 +82,7 @@ generate_tc(void *p)
 
   olsr_build_tc_packet(&tcpacket);
 
-  if(tc_build(&tcpacket, ifn) && TIMED_OUT(&fwdtimer[ifn->if_nr]))
+  if(tc_build(&tcpacket, ifn) && TIMED_OUT(fwdtimer[ifn->if_nr]))
     {
       set_buffer_timer(ifn);
     }
@@ -93,7 +93,7 @@ generate_mid(void *p)
 {
   struct interface *ifn = (struct interface *)p;
   
-  if(mid_build(ifn) && TIMED_OUT(&fwdtimer[ifn->if_nr]))
+  if(mid_build(ifn) && TIMED_OUT(fwdtimer[ifn->if_nr]))
     {
       set_buffer_timer(ifn);
     }
@@ -107,7 +107,7 @@ generate_hna(void *p)
 {
   struct interface *ifn = (struct interface *)p;
   
-  if(hna_build(ifn) && TIMED_OUT(&fwdtimer[ifn->if_nr]))
+  if(hna_build(ifn) && TIMED_OUT(fwdtimer[ifn->if_nr]))
     {
       set_buffer_timer(ifn);
     }
index 7b9146b..8907ee5 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: hna_set.c,v 1.13 2004/12/15 17:20:54 kattemat Exp $
+ * $Id: hna_set.c,v 1.14 2005/01/16 19:49:28 kattemat Exp $
  */
 
 #include "defs.h"
@@ -245,7 +245,7 @@ olsr_update_hna_entry(union olsr_ip_addr *gw, union olsr_ip_addr *net, union hna
     }
 
   /* Update holdingtime */
-  olsr_get_timestamp((olsr_u32_t) vtime*1000, &net_entry->A_time);
+  net_entry->A_time = GET_TIMESTAMP(vtime*1000);
 
 }
 
@@ -278,7 +278,7 @@ olsr_time_out_hna_set(void *foo)
 
          while(tmp_net != &tmp_hna->networks)
            {
-             if(TIMED_OUT(&tmp_net->A_time))
+             if(TIMED_OUT(tmp_net->A_time))
                {
                  net_to_delete = tmp_net;
                  tmp_net = tmp_net->next;
index 77a5c4e..2911449 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: hna_set.h,v 1.9 2004/11/21 11:28:56 kattemat Exp $
+ * $Id: hna_set.h,v 1.10 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
@@ -53,7 +53,7 @@ struct hna_net
 {
   union olsr_ip_addr A_network_addr;
   union hna_netmask  A_netmask;
-  struct timeval     A_time;
+  clock_t            A_time;
   struct hna_net     *next;
   struct hna_net     *prev;
 };
index 85d0a51..b05ba73 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: hysteresis.c,v 1.13 2004/12/03 16:12:32 tlopatic Exp $
+ * $Id: hysteresis.c,v 1.14 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
@@ -70,7 +70,7 @@ olsr_hyst_calc_instability(float old_quality)
 int
 olsr_process_hysteresis(struct link_entry *entry)
 {
-  struct timeval tmp_timer;
+  clock_t tmp_timer;
 
   //printf("PROCESSING QUALITY: %f\n", entry->L_link_quality);
   if(entry->L_link_quality > hhigh)
@@ -85,12 +85,11 @@ olsr_process_hysteresis(struct link_entry *entry)
       /* Pending = false */
       entry->L_link_pending = 0;
 
-      if(!TIMED_OUT(&entry->L_LOST_LINK_time))
+      if(!TIMED_OUT(entry->L_LOST_LINK_time))
        changes_neighborhood = OLSR_TRUE;
 
       /* time = now -1 */
-      entry->L_LOST_LINK_time = now;
-      entry->L_LOST_LINK_time.tv_sec -= 1;
+      entry->L_LOST_LINK_time = now_times - 1;
 
       return 1;
     }
@@ -107,16 +106,16 @@ olsr_process_hysteresis(struct link_entry *entry)
       /* Pending = true */
       entry->L_link_pending = 1;
 
-      if(TIMED_OUT(&entry->L_LOST_LINK_time))
+      if(TIMED_OUT(entry->L_LOST_LINK_time))
        changes_neighborhood = OLSR_TRUE;
 
       /* Timer = min (L_time, current time + NEIGHB_HOLD_TIME) */
       //tmp_timer = now;
       //tmp_timer.tv_sec += NEIGHB_HOLD_TIME; /* Takafumi fix */
-       timeradd(&now, &hold_time_neighbor, &tmp_timer);
+      tmp_timer = now_times + hold_time_neighbor;
 
        entry->L_LOST_LINK_time = 
-       (timercmp(&entry->time, &tmp_timer, >) > 0) ? tmp_timer : entry->time;
+         entry->time > tmp_timer ? tmp_timer : entry->time;
 
       /* (the link is then considered as lost according to section
         8.5 and this may produce a neighbor loss).
@@ -155,7 +154,7 @@ olsr_update_hysteresis_hello(struct link_entry *entry, double htime)
   /* SET TIMER TO 1.5 TIMES THE INTERVAL */
   /* Update timer */
 
-  olsr_get_timestamp((olsr_u32_t) htime*1500, &entry->hello_timeout);
+  entry->hello_timeout = GET_TIMESTAMP(htime*1500);
 
   return;
 }
index 92ea144..2df56ed 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.38 2004/12/19 13:53:18 kattemat Exp $
+ * $Id: link_set.c,v 1.39 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
@@ -79,7 +79,7 @@ olsr_init_link_set()
 {
 
   /* Timers */
-  olsr_init_timer((olsr_u32_t) (NEIGHB_HOLD_TIME*1000), &hold_time_neighbor);
+  hold_time_neighbor = (NEIGHB_HOLD_TIME*1000) / system_tick_divider;
 
   olsr_register_timeout_function(&olsr_time_out_link_set);
   if(olsr_cnf->use_hysteresis)
@@ -108,9 +108,7 @@ lookup_link_status(struct link_entry *entry)
 {
 
   if(entry == NULL || link_set == NULL)
-    {
-      return UNSPEC_LINK;
-    }
+    return UNSPEC_LINK;
 
   /*
    * Hysteresis
@@ -121,7 +119,8 @@ lookup_link_status(struct link_entry *entry)
        if L_LOST_LINK_time is not expired, the link is advertised
        with a link type of LOST_LINK.
       */
-      if(!TIMED_OUT(&entry->L_LOST_LINK_time))
+
+      if(!TIMED_OUT(entry->L_LOST_LINK_time))
        return LOST_LINK;
       /*
        otherwise, if L_LOST_LINK_time is expired and L_link_pending
@@ -141,10 +140,10 @@ lookup_link_status(struct link_entry *entry)
       */
     }
 
-  if(!TIMED_OUT(&entry->SYM_time))
+  if(!TIMED_OUT(entry->SYM_time))
     return SYM_LINK;
 
-  if(!TIMED_OUT(&entry->ASYM_time))
+  if(!TIMED_OUT(entry->ASYM_time))
     return ASYM_LINK;
 
   return LOST_LINK;
@@ -332,7 +331,7 @@ get_interface_link_set(union olsr_ip_addr *remote)
          tmp_if = if_ifwithaddr(&tmp_link_set->local_iface_addr);
 
          /* Must be symmetric link! */
-         if(!TIMED_OUT(&tmp_link_set->SYM_time))
+         if(!TIMED_OUT(tmp_link_set->SYM_time))
            {
               if (olsr_cnf->lq_level == 0)
                 {
@@ -443,20 +442,18 @@ add_new_entry(union olsr_ip_addr *local, union olsr_ip_addr *remote, union olsr_
   COPY_IP(&new_link->neighbor_iface_addr, remote);
 
   /* L_SYM_time            = current time - 1 (expired) */
-  new_link->SYM_time = now;
-  /* Subtract 1 */
-  new_link->SYM_time.tv_sec -= 1;
+  new_link->SYM_time = now_times - 1;
 
   /* L_time = current time + validity time */
-  olsr_get_timestamp((olsr_u32_t) vtime*1000, &new_link->time);
+  new_link->time = GET_TIMESTAMP(vtime*1000);
 
 
   /* HYSTERESIS */
   if(olsr_cnf->use_hysteresis)
     {
       new_link->L_link_pending = 1;
-      olsr_get_timestamp((olsr_u32_t) vtime*1000, &new_link->L_LOST_LINK_time);
-      olsr_get_timestamp((olsr_u32_t) htime*1500, &new_link->hello_timeout);
+      new_link->L_LOST_LINK_time = GET_TIMESTAMP(vtime*1000);
+      new_link->hello_timeout = GET_TIMESTAMP(htime*1500);
       new_link->last_htime = htime;
       new_link->olsr_seqno = 0;
       new_link->olsr_seqno_valid = OLSR_FALSE;
@@ -468,8 +465,7 @@ add_new_entry(union olsr_ip_addr *local, union olsr_ip_addr *remote, union olsr_
     {
       new_link->loss_hello_int = htime;
 
-      olsr_get_timestamp((olsr_u32_t)(htime * 1500.0),
-                         &new_link->loss_timeout);
+      new_link->loss_timeout = GET_TIMESTAMP(htime * 1500.0);
 
       new_link->loss_seqno = 0;
       new_link->loss_seqno_valid = 0;
@@ -644,36 +640,34 @@ update_link_entry(union olsr_ip_addr *local, union olsr_ip_addr *remote, struct
   /* Update ASYM_time */
   //printf("Vtime is %f\n", message->vtime);
   /* L_ASYM_time = current time + validity time */
-  olsr_get_timestamp((olsr_u32_t) (message->vtime*1000), &entry->ASYM_time);
-
-
+  entry->ASYM_time = GET_TIMESTAMP(message->vtime*1000);
+  
   status = check_link_status(message);
-
+  
   //printf("Status %d\n", status);
-
+  
   switch(status)
     {
     case(LOST_LINK):
       /* L_SYM_time = current time - 1 (i.e., expired) */
-      entry->SYM_time = now;
-      entry->SYM_time.tv_sec -= 1;
+      entry->SYM_time = now_times - 1;
 
       break;
     case(SYM_LINK):
     case(ASYM_LINK):
       /* L_SYM_time = current time + validity time */
       //printf("updating SYM time for %s\n", olsr_ip_to_string(remote));
-      olsr_get_timestamp((olsr_u32_t) (message->vtime*1000), &entry->SYM_time);
+      entry->SYM_time = GET_TIMESTAMP(message->vtime*1000);
 
       /* L_time = L_SYM_time + NEIGHB_HOLD_TIME */
-      timeradd(&entry->SYM_time, &hold_time_neighbor, &entry->time);
+      entry->time = entry->SYM_time + hold_time_neighbor;
 
       break;
     default:;
     }
 
   /* L_time = max(L_time, L_ASYM_time) */
-  if(timercmp(&entry->time, &entry->ASYM_time, <))
+  if(entry->time < entry->ASYM_time)
     entry->time = entry->ASYM_time;
 
 
@@ -800,7 +794,7 @@ olsr_time_out_link_set()
   while(tmp_link_set)
     {
 
-      if(TIMED_OUT(&tmp_link_set->time))
+      if(TIMED_OUT(tmp_link_set->time))
        {
          if(last_link_entry != NULL)
            {
@@ -867,13 +861,12 @@ olsr_time_out_hysteresis()
 
   while(tmp_link_set)
     {
-      if(TIMED_OUT(&tmp_link_set->hello_timeout))
+      if(TIMED_OUT(tmp_link_set->hello_timeout))
        {
          tmp_link_set->L_link_quality = olsr_hyst_calc_instability(tmp_link_set->L_link_quality);
          olsr_printf(1, "HYST[%s] HELLO timeout %0.3f\n", olsr_ip_to_string(&tmp_link_set->neighbor_iface_addr), tmp_link_set->L_link_quality);
          /* Update hello_timeout - NO SLACK THIS TIME */
-         olsr_get_timestamp((olsr_u32_t) tmp_link_set->last_htime*1000, &tmp_link_set->hello_timeout);
-
+         tmp_link_set->hello_timeout = GET_TIMESTAMP(tmp_link_set->last_htime*1000);
          /* Recalculate status */
          /* Update hysteresis values */
          olsr_process_hysteresis(tmp_link_set);
@@ -1084,8 +1077,7 @@ void olsr_update_packet_loss(union olsr_ip_addr *rem, union olsr_ip_addr *loc,
 
   // timeout for the first lost packet is 1.5 x htime
 
-  olsr_get_timestamp((olsr_u32_t)(entry->loss_hello_int * 1500.0),
-                     &entry->loss_timeout);
+  entry->loss_timeout = GET_TIMESTAMP(entry->loss_hello_int * 1500.0);
 }
 
 static void olsr_time_out_packet_loss()
@@ -1099,7 +1091,7 @@ static void olsr_time_out_packet_loss()
       // find a link that has not seen any packets for a very long
       // time (first time: 1.5 x htime, subsequently: 1.0 x htime)
 
-      if (!TIMED_OUT(&walker->loss_timeout))
+      if (!TIMED_OUT(walker->loss_timeout))
         continue;
       
       // count the lost packet
@@ -1113,8 +1105,7 @@ static void olsr_time_out_packet_loss()
 
       // next timeout in 1.0 x htime
 
-      olsr_get_timestamp((olsr_u32_t)(walker->loss_hello_int * 1000.0),
-                         &walker->loss_timeout);
+      walker->loss_timeout = GET_TIMESTAMP(walker->loss_hello_int * 1000.0);
     }
 }
 
index 7decea5..3d6fc12 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.18 2004/12/04 17:06:57 tlopatic Exp $
+ * $Id: link_set.h,v 1.19 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
@@ -54,9 +54,9 @@ 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;
+  clock_t SYM_time;
+  clock_t ASYM_time;
+  clock_t time;
   struct neighbor_entry *neighbor;
 
   /*
@@ -64,8 +64,8 @@ struct link_entry
    */
   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 */
+  clock_t L_LOST_LINK_time;
+  clock_t hello_timeout; /* When we should receive a new HELLO */
   double last_htime;
   olsr_u16_t olsr_seqno;
   olsr_bool olsr_seqno_valid;
@@ -75,7 +75,7 @@ struct link_entry
    */
 
   double loss_hello_int;
-  struct timeval loss_timeout;
+  clock_t loss_timeout;
 
   olsr_u16_t loss_seqno;
   int loss_seqno_valid;
@@ -109,9 +109,8 @@ struct link_entry
 
 struct link_entry *link_set;
 
-/* Timers */
-struct timeval  hold_time_neighbor;
-struct timeval  hold_time_neighbor_nw;
+/* Timer */
+clock_t hold_time_neighbor;
 
 /* Function prototypes */
 
index 5e1945f..581dcc4 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.8 2004/12/04 17:06:57 tlopatic Exp $
+ * $Id: lq_packet.c,v 1.9 2005/01/16 19:49:28 kattemat Exp $
  */
 
 #include "olsr_protocol.h"
@@ -711,7 +711,6 @@ olsr_output_lq_tc(void *para)
   static int prev_empty = 1;
   struct lq_tc_message lq_tc;
   struct interface *outif = (struct interface *)para;
-  struct timeval timer;
 
   // create LQ_TC in internal format
 
@@ -734,8 +733,7 @@ olsr_output_lq_tc(void *para)
     {
       // initialize timer
 
-      olsr_init_timer((olsr_u32_t)(max_tc_vtime * 3) * 1000, &timer);
-      timeradd(&now, &timer, &send_empty_tc);
+      send_empty_tc = GET_TIMESTAMP((max_tc_vtime * 3) * 1000);
 
       prev_empty = 1;
 
@@ -746,14 +744,14 @@ olsr_output_lq_tc(void *para)
 
   // c) this is not the first empty message, send if timer hasn't fired
 
-  else if (!TIMED_OUT(&send_empty_tc))
+  else if (!TIMED_OUT(send_empty_tc))
     serialize_lq_tc(&lq_tc, outif);
 
   // destroy internal format
 
   destroy_lq_tc(&lq_tc);
 
-  if(net_output_pending(outif) && TIMED_OUT(&fwdtimer[outif->if_nr]))
+  if(net_output_pending(outif) && TIMED_OUT(fwdtimer[outif->if_nr]))
     set_buffer_timer(outif);
 }
 
index 52e7894..9f6a976 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: main.c,v 1.52 2004/12/19 09:34:36 kattemat Exp $
+ * $Id: main.c,v 1.53 2005/01/16 19:49:28 kattemat Exp $
  */
 
 #include <unistd.h>
@@ -111,8 +111,8 @@ main(int argc, char *argv[])
   setbuf(stdout, NULL);
   setbuf(stderr, NULL);
 
-  /* Initialize socket list */
-  olsr_socket_entries = NULL;
+  /* Initialize tick resolution */
+  system_tick_divider = 1000/sysconf(_SC_CLK_TCK);
 
 #ifndef WIN32
   /* Check if user is root */
index ee6d3e9..f6a66b8 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: mid_set.c,v 1.9 2004/11/21 11:28:56 kattemat Exp $
+ * $Id: mid_set.c,v 1.10 2005/01/16 19:49:28 kattemat Exp $
  */
 
 #include "defs.h"
@@ -115,7 +115,7 @@ insert_mid_tuple(union olsr_ip_addr *m_addr, struct addresses *alias, float vtim
       tmp_adr = tmp->aliases;
       tmp->aliases = alias;
       alias->next = tmp_adr;
-      olsr_get_timestamp((olsr_u32_t) vtime*1000, &tmp->ass_timer);
+      tmp->ass_timer = GET_TIMESTAMP(vtime*1000);
     }
       /*Create new node*/
   else
@@ -124,7 +124,7 @@ insert_mid_tuple(union olsr_ip_addr *m_addr, struct addresses *alias, float vtim
 
       tmp->aliases = alias;
       COPY_IP(&tmp->main_addr, m_addr);
-      olsr_get_timestamp((olsr_u32_t) vtime*1000, &tmp->ass_timer);
+      tmp->ass_timer = GET_TIMESTAMP(vtime*1000);
       /* Queue */
       QUEUE_ELEM(mid_set[hash], tmp);
       /*
@@ -328,7 +328,7 @@ olsr_update_mid_table(union olsr_ip_addr *adr, float vtime)
       if(COMP_IP(&tmp_list->main_addr, adr))
        {
          //printf("Updating timer for node %s\n",ip_to_string(&tmp_list->main_addr));
-         olsr_get_timestamp((olsr_u32_t) vtime*1000, &tmp_list->ass_timer);
+         tmp_list->ass_timer = GET_TIMESTAMP(vtime*1000);
 
          return 1;
        }
@@ -358,7 +358,7 @@ olsr_time_out_mid_set(void *foo)
       while(tmp_list != &mid_set[index])
        {
          /*Check if the entry is timed out*/
-         if(TIMED_OUT(&tmp_list->ass_timer))
+         if(TIMED_OUT(tmp_list->ass_timer))
            {
              entry_to_delete = tmp_list;
              tmp_list = tmp_list->next;
index 94c2280..8ad61f1 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: mid_set.h,v 1.8 2004/11/21 11:28:56 kattemat Exp $
+ * $Id: mid_set.h,v 1.9 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
 struct mid_entry
 {
   union olsr_ip_addr main_addr;
-  struct addresses *aliases;
-  struct mid_entry *prev;
-  struct mid_entry *next;
-  struct timeval ass_timer;  
+  struct addresses  *aliases;
+  struct mid_entry  *prev;
+  struct mid_entry  *next;
+  clock_t            ass_timer;  
 };
 
 
index 8fa3aa4..6dc4511 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: mpr_selector_set.c,v 1.8 2004/11/21 11:28:56 kattemat Exp $
+ * $Id: mpr_selector_set.c,v 1.9 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
@@ -88,7 +88,7 @@ olsr_add_mpr_selector(union olsr_ip_addr *addr, float vtime)
 
   /* Fill struct */
   COPY_IP(&new_entry->MS_main_addr, addr);
-  olsr_get_timestamp((olsr_u32_t) vtime*1000, &new_entry->MS_time);
+  new_entry->MS_time = GET_TIMESTAMP(vtime*1000);
 
   /* Queue */
   QUEUE_ELEM(mprs_list, new_entry);
@@ -166,7 +166,7 @@ olsr_update_mprs_set(union olsr_ip_addr *addr, float vtime)
     }
   else
     {
-      olsr_get_timestamp((olsr_u32_t) vtime*1000, &mprs->MS_time);
+      mprs->MS_time = GET_TIMESTAMP(vtime*1000);
     }
   return retval;
 }
@@ -190,7 +190,7 @@ olsr_time_out_mprs_set()
   while(mprs != &mprs_list)
     {
 
-      if(TIMED_OUT(&mprs->MS_time))
+      if(TIMED_OUT(mprs->MS_time))
        {
          /* Dequeue */
          mprs_to_delete = mprs;
index 5872d2a..27b9409 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: mpr_selector_set.h,v 1.7 2004/11/21 11:28:56 kattemat Exp $
+ * $Id: mpr_selector_set.h,v 1.8 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
@@ -48,8 +48,8 @@
 
 struct mpr_selector
 {
-  union olsr_ip_addr MS_main_addr;
-  struct timeval MS_time;
+  union olsr_ip_addr  MS_main_addr;
+  clock_t             MS_time;
   struct mpr_selector *next;
   struct mpr_selector *prev;
 };
@@ -65,7 +65,7 @@ olsr_u16_t ansn;
 int mprs_count;
 
 /* Timer to send empty TCs */
-struct timeval send_empty_tc;
+clock_t send_empty_tc;
 
 int
 olsr_init_mprs_set(void);
index a8507d5..47e2346 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.21 2004/12/04 17:06:57 tlopatic Exp $
+ * $Id: neighbor_table.c,v 1.22 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
@@ -405,7 +405,7 @@ olsr_time_out_two_hop_neighbors(struct neighbor_entry  *neighbor)
 
   while(two_hop_list != &neighbor->neighbor_2_list)
     {
-      if(TIMED_OUT(&two_hop_list->neighbor_2_timer))
+      if(TIMED_OUT(two_hop_list->neighbor_2_timer))
        {
          two_hop_entry = two_hop_list->neighbor_2;
          two_hop_entry->neighbor_2_pointer--;
@@ -413,9 +413,7 @@ olsr_time_out_two_hop_neighbors(struct neighbor_entry  *neighbor)
 
          if(two_hop_entry->neighbor_2_pointer < 1)
            {
-             /* FIX THIS (fix what?)*/
              DEQUEUE_ELEM(two_hop_entry);
-
              free((void *)two_hop_entry);
            }
 
index d45c8fa..7f3bd03 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: neighbor_table.h,v 1.10 2004/12/04 17:06:57 tlopatic Exp $
+ * $Id: neighbor_table.h,v 1.11 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
@@ -50,7 +50,7 @@
 struct neighbor_2_list_entry 
 {
   struct neighbor_2_entry      *neighbor_2;
-  struct timeval              neighbor_2_timer;
+  clock_t                     neighbor_2_timer;
   struct neighbor_2_list_entry *next;
   struct neighbor_2_list_entry *prev;
 };
index ebe28dc..d2166fe 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.35 2004/12/15 17:21:01 kattemat Exp $
+ * $Id: olsr.c,v 1.36 2005/01/16 19:49:28 kattemat Exp $
  */
 
 /**
@@ -449,15 +449,12 @@ void
 set_buffer_timer(struct interface *ifn)
 {
   float jitter;
-  struct timeval jittertimer;
       
   /* Set timer */
   jitter = (float) random()/RAND_MAX;
   jitter *= max_jitter;
 
-  olsr_init_timer((olsr_u32_t) (jitter*1000), &jittertimer);
-
-  timeradd(&now, &jittertimer, &fwdtimer[ifn->if_nr]);
+  fwdtimer[ifn->if_nr] = GET_TIMESTAMP(jitter*1000);
 
 }
 
index 0c5bcf7..0fc9414 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsr.h,v 1.14 2004/12/14 20:15:52 kattemat Exp $
+ * $Id: olsr.h,v 1.15 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
@@ -67,8 +67,14 @@ olsr_bool changes_hna;
 
 olsr_u16_t message_seqno;
 
+/* Provides a timestamp s1 milliseconds in the future
+   according to system ticks returned by times(2) */
+#define GET_TIMESTAMP(s1) \
+        now_times + ((s1) / system_tick_divider)
+
 #define TIMED_OUT(s1) \
-        timercmp(s1, &now, <)
+        (s1 < now_times)
+
 
 /*
  * Queueing macros
index 572babb..14feff2 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: packet.c,v 1.13 2004/11/21 11:28:56 kattemat Exp $
+ * $Id: packet.c,v 1.14 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
@@ -307,7 +307,6 @@ olsr_build_tc_packet(struct tc_message *message)
   //struct mpr_selector_hash  *mprs_hash;
   //olsr_u16_t          index;
   olsr_bool entry_added = OLSR_FALSE;
-  struct timeval tmp_timer;
 
   message->multipoint_relay_selector_address=NULL;
   message->packet_seq_number=0;
@@ -390,9 +389,8 @@ olsr_build_tc_packet(struct tc_message *message)
       if(sending_tc)
        {
          /* Send empty TC */
-         olsr_init_timer((olsr_u32_t) (max_tc_vtime*3)*1000, &tmp_timer);
          olsr_printf(3, "No more MPR selectors - will send empty TCs\n");
-         timeradd(&now, &tmp_timer, &send_empty_tc);
+         send_empty_tc = GET_TIMESTAMP((max_tc_vtime*3)*1000);
 
          sending_tc = OLSR_FALSE;
        }
index 7472122..6e4c566 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.24 2004/12/04 17:06:57 tlopatic Exp $
+ * $Id: process_package.c,v 1.25 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
@@ -542,9 +542,7 @@ olsr_process_message_neighbors(struct neighbor_entry *neighbor,
           if (two_hop_neighbor_yet != NULL)
             {
               /* Updating the holding time for this neighbor */
-              olsr_get_timestamp((olsr_u32_t)message->vtime * 1000,
-                                 &two_hop_neighbor_yet->neighbor_2_timer);
-
+              two_hop_neighbor_yet->neighbor_2_timer = GET_TIMESTAMP(message->vtime*1000);
               two_hop_neighbor = two_hop_neighbor_yet->neighbor_2;
             }
           else
@@ -691,7 +689,7 @@ olsr_linking_this_2_entries(struct neighbor_entry *neighbor,struct neighbor_2_en
 
   list_of_2_neighbors->neighbor_2 = two_hop_neighbor;
   
-  olsr_get_timestamp((olsr_u32_t) vtime*1000, &list_of_2_neighbors->neighbor_2_timer);
+  list_of_2_neighbors->neighbor_2_timer = GET_TIMESTAMP(vtime*1000);
 
   /* Queue */
   neighbor->neighbor_2_list.next->prev = list_of_2_neighbors;
index a12981f..a73b8a1 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: scheduler.c,v 1.22 2004/11/21 13:45:50 kattemat Exp $
+ * $Id: scheduler.c,v 1.23 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
@@ -75,8 +75,7 @@ scheduler()
   /*
    *Used to calculate sleep time
    */
-  struct timeval start_of_loop;
-  struct timeval end_of_loop;
+  clock_t end_of_loop;
   struct timeval time_used;
   struct timeval interval;
   struct timeval sleeptime_val;
@@ -87,6 +86,9 @@ scheduler()
   struct timeout_entry *time_out_entry;
 
   struct interface *ifn;
+
+  /* Global buffer for times(2) calls */
+  struct tms tms_buf;
  
   pollrate = olsr_cnf->pollrate;
 
@@ -106,9 +108,18 @@ scheduler()
   for(;;)
     {
 
-      gettimeofday(&start_of_loop, NULL);
+      /* Update now_times */
+      if((now_times = times(&tms_buf)) < 0)
+       {
+         if((now_times = times(&tms_buf)) < 0)
+           {
+             fprintf(stderr, "Fatal!scheduler could not get new_times.\n%s\n", strerror(errno));
+             olsr_syslog(OLSR_LOG_ERR, "Fatal!scheduler could not get new_times.\n%m\n");
+             olsr_exit(__func__, EXIT_FAILURE);
+           }
+       }
 
-      /* Update the global timestamp */
+      /* Update the global timestamp - kept for plugin compat */
       gettimeofday(&now, NULL);
       nowtm = gmtime((time_t *)&now.tv_sec);
 
@@ -181,18 +192,26 @@ scheduler()
       /* looping trough interfaces and emmittin pending data */
       for (ifn = ifnet; ifn ; ifn = ifn->int_next) 
        { 
-         if(net_output_pending(ifn) && TIMED_OUT(&fwdtimer[ifn->if_nr])) 
+         if(net_output_pending(ifn) && TIMED_OUT(fwdtimer[ifn->if_nr])) 
            net_output(ifn);
        }
 
 
-      gettimeofday(&end_of_loop, NULL);
-
-      timersub(&end_of_loop, &start_of_loop, &time_used);
+      if((end_of_loop = times(&tms_buf)) < 0)
+       {
+         if((end_of_loop = times(&tms_buf)) < 0)
+           {
+             fprintf(stderr, "Fatal!scheduler could not get new_times.\n%s\n", strerror(errno));
+             olsr_syslog(OLSR_LOG_ERR, "Fatal!scheduler could not get new_times.\n%m\n");
+             olsr_exit(__func__, EXIT_FAILURE);
+           }
+       }
 
+      //printf("Tick diff: %d\n", end_of_loop - now_times);
+      time_used.tv_sec = ((end_of_loop - now_times) * system_tick_divider) / 1000;
+      time_used.tv_usec = ((end_of_loop - now_times) * system_tick_divider) % 1000;
 
-      //printf("Time to sleep: %ld\n", sleeptime.tv_nsec);
-      //printf("Time used: %ld\n", time_used.tv_usec/1000);
+      //printf("Time used: %d.%04d\n", time_used.tv_sec, time_used.tv_usec);
 
       if(timercmp(&time_used, &interval, <))
        {
index b6f8e92..98d5d97 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: tc_set.c,v 1.19 2004/12/19 12:20:00 kattemat Exp $
+ * $Id: tc_set.c,v 1.20 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
@@ -54,11 +54,7 @@ int
 olsr_init_tc()
 {
   int index;
-  
-  /* Set timer to zero */
-  send_empty_tc.tv_sec = 0;
-  send_empty_tc.tv_usec = 0;
-
   changes = OLSR_FALSE;
 
   olsr_printf(5, "TC: init topo\n");
@@ -258,7 +254,7 @@ olsr_tc_update_mprs(struct tc_entry *entry, struct tc_message *msg)
          memset(new_topo_dst, 0, sizeof(struct topo_dst));
 
          COPY_IP(&new_topo_dst->T_dest_addr, &mprs->address);
-         olsr_get_timestamp((olsr_u32_t) msg->vtime*1000, &new_topo_dst->T_time);
+         new_topo_dst->T_time = GET_TIMESTAMP(msg->vtime*1000);
          new_topo_dst->T_seq = msg->ansn;
 
           if (olsr_cnf->lq_level > 0)
@@ -282,7 +278,7 @@ olsr_tc_update_mprs(struct tc_entry *entry, struct tc_message *msg)
       else
        {
          /* Update entry */
-         olsr_get_timestamp((olsr_u32_t) msg->vtime*1000, &existing_dst->T_time);
+         existing_dst->T_time = GET_TIMESTAMP(msg->vtime*1000);
          existing_dst->T_seq = msg->ansn;
 
           if (olsr_cnf->lq_level > 0)
@@ -390,16 +386,12 @@ olsr_time_out_tc_set()
          while(dst_entry != &entry->destinations)
            {
              /* If timed out - delete */
-             if(TIMED_OUT(&dst_entry->T_time))
+             if(TIMED_OUT(dst_entry->T_time))
                {
                  deleted = 1;
                  /* Dequeue */
                  DEQUEUE_ELEM(dst_entry);
-                 //dst_entry->prev->next = dst_entry->next;
-                 //dst_entry->next->prev = dst_entry->prev;
-
                  dst_to_delete = dst_entry;
-
                  dst_entry = dst_entry->next;
 
                  /* Delete */
index 11aa2c5..f4aef69 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: tc_set.h,v 1.10 2004/12/04 17:06:57 tlopatic Exp $
+ * $Id: tc_set.h,v 1.11 2005/01/16 19:49:28 kattemat Exp $
  */
 
 #include "defs.h"
 struct topo_dst
 {
   union olsr_ip_addr T_dest_addr;
-  struct timeval T_time;
-  olsr_u16_t T_seq;
-  struct topo_dst *next;
-  struct topo_dst *prev;
-  double link_quality;
-  double inverse_link_quality;
-  double saved_link_quality;
-  double saved_inverse_link_quality;
+  clock_t            T_time;
+  olsr_u16_t         T_seq;
+  struct topo_dst   *next;
+  struct topo_dst   *prev;
+  double             link_quality;
+  double             inverse_link_quality;
+  double             saved_link_quality;
+  double             saved_inverse_link_quality;
 };
 
 
 struct tc_entry
 {
   union olsr_ip_addr T_last_addr;
-  struct topo_dst destinations;
-  struct tc_entry *next;
-  struct tc_entry *prev;
+  struct topo_dst    destinations;
+  struct tc_entry   *next;
+  struct tc_entry   *prev;
 };