Switched from using timevals and gettimeofday to use ticks and times.
[olsrd.git] / src / hysteresis.c
index 8ec20c1..b05ba73 100644 (file)
@@ -1,26 +1,42 @@
 /*
- * OLSR ad-hoc routing table management protocol
- * Copyright (C) 2003 Andreas T√łnnesen (andreto@ifi.uio.no)
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Andreas T√łnnesen(andreto@olsr.org)
+ * All rights reserved.
  *
- * This file is part of the olsr.org OLSR daemon.
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
+ * are met:
  *
- * olsr.org is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * * Redistributions of source code must retain the above copyright 
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright 
+ *   notice, this list of conditions and the following disclaimer in 
+ *   the documentation and/or other materials provided with the 
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its 
+ *   contributors may be used to endorse or promote products derived 
+ *   from this software without specific prior written permission.
  *
- * olsr.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+ * POSSIBILITY OF SUCH DAMAGE.
  *
- * You should have received a copy of the GNU General Public License
- * along with olsr.org; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
- * 
- * $ Id $
+ * Visit http://www.olsr.org for more information.
  *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ * $Id: hysteresis.c,v 1.14 2005/01/16 19:49:28 kattemat Exp $
  */
 
 
 #include "defs.h"
 #include "olsr.h"
 
+#define hscaling olsr_cnf->hysteresis_param.scaling
+#define hhigh    olsr_cnf->hysteresis_param.thr_high
+#define hlow     olsr_cnf->hysteresis_param.thr_low
 
 inline float
 olsr_hyst_calc_stability(float old_quality)
 {
-  return (((1 - hyst_scaling) * old_quality) + hyst_scaling);
+  return (((1 - hscaling) * old_quality) + hscaling);
 }
 
 
@@ -43,7 +62,7 @@ olsr_hyst_calc_stability(float old_quality)
 inline float
 olsr_hyst_calc_instability(float old_quality)
 {
-  return ((1 - hyst_scaling) * old_quality);
+  return ((1 - hscaling) * old_quality);
 }
 
 
@@ -51,53 +70,52 @@ 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 > hyst_threshold_high)
+  if(entry->L_link_quality > hhigh)
     {
       if(entry->L_link_pending == 1)
        {
          olsr_printf(1, "HYST[%s] link set to NOT pending!\n", 
                      olsr_ip_to_string(&entry->neighbor_iface_addr));
-         changes_neighborhood = UP;
+         changes_neighborhood = OLSR_TRUE;
        }
 
       /* Pending = false */
       entry->L_link_pending = 0;
 
-      if(!TIMED_OUT(&entry->L_LOST_LINK_time))
-       changes_neighborhood = UP;
+      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;
     }
 
-  if(entry->L_link_quality < hyst_threshold_low)
+  if(entry->L_link_quality < hlow)
     {
       if(entry->L_link_pending == 0)
        {
          olsr_printf(1, "HYST[%s] link set to pending!\n", 
                      olsr_ip_to_string(&entry->neighbor_iface_addr));
-         changes_neighborhood = UP;
+         changes_neighborhood = OLSR_TRUE;
        }
       
       /* Pending = true */
       entry->L_link_pending = 1;
 
-      if(TIMED_OUT(&entry->L_LOST_LINK_time))
-       changes_neighborhood = UP;
+      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).
@@ -136,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;
 }
@@ -157,21 +175,33 @@ update_hysteresis_incoming(union olsr_ip_addr *remote, union olsr_ip_addr *local
 #ifdef DEBUG
       olsr_printf(3, "HYST[%s]: %0.3f\n", olsr_ip_to_string(remote), link->L_link_quality);
 #endif
-      /* Check for missing packets - AVOID WRAP AROUND and FIRST TIME
-       * checking for 0 is kind of a ugly hack...
+
+      /* 
+       * see how many packets we have missed and update the link quality
+       * for each missed packet; HELLOs have already been accounted for by
+       * the timeout function and the number of missed HELLOs has already
+       * been added to olsr_seqno there
        */
-      if((link->olsr_seqno + 1 < seqno) &&
-        (link->olsr_seqno != 0) &&
-        (seqno != 0))
-       {
-         //printf("HYS: packet lost.. last seqno %d received seqno %d!\n", link->olsr_seqno, seqno);
-         link->L_link_quality = olsr_hyst_calc_instability(link->L_link_quality);
+
+      if (link->olsr_seqno_valid && 
+          (unsigned short)(seqno - link->olsr_seqno) < 100)
+         while (link->olsr_seqno != seqno)
+           {
+             link->L_link_quality = olsr_hyst_calc_instability(link->L_link_quality);
 #ifdef DEBUG
-         olsr_printf(5, "HYST[%s] PACKET LOSS! %0.3f\n", olsr_ip_to_string(remote), link->L_link_quality);
+             olsr_printf(5, "HYST[%s] PACKET LOSS! %0.3f\n",
+                         olsr_ip_to_string(remote), link->L_link_quality);
 #endif
-       }
-      /* Set seqno */
-      link->olsr_seqno = seqno;
+             if(link->L_link_quality < olsr_cnf->hysteresis_param.thr_low)
+               break;
+
+             link->olsr_seqno++;
+           }
+
+
+      link->olsr_seqno = seqno + 1;
+      link->olsr_seqno_valid = OLSR_TRUE;
+
       //printf("Updating seqno to: %d\n", link->olsr_seqno);
     }
   return;