Bugfix for possible overflow in fpm plugin
authorHenning Rogge <rogge@fgan.de>
Mon, 16 Jun 2008 14:00:46 +0000 (16:00 +0200)
committerHenning Rogge <rogge@fgan.de>
Mon, 16 Jun 2008 14:00:46 +0000 (16:00 +0200)
src/fpm.h
src/lq_plugin_default_fpm.c

index 36ee30b..2858608 100644 (file)
--- a/src/fpm.h
+++ b/src/fpm.h
@@ -72,7 +72,7 @@ typedef unsigned long long ufpm;
 typedef long fpm;
 typedef signed long sfpm;
 typedef unsigned long ufpm;
-#define FPM_BIT 12
+#define FPM_BIT 10
  
 #endif
 
index 1937cf3..082d887 100644 (file)
@@ -154,6 +154,7 @@ olsr_linkcost default_lq_packet_loss_worker_fpm(struct link_entry *link, void *p
   fpm alpha_old = aging_factor_old;
   fpm alpha_new = aging_factor_new;
   
+  fpm value;
   fpm link_loss_factor = fpmidiv(itofpm(link->loss_link_multiplier), 65536);
   
   if (tlq->quickstart < LQ_QUICKSTART_STEPS) {
@@ -161,12 +162,20 @@ olsr_linkcost default_lq_packet_loss_worker_fpm(struct link_entry *link, void *p
     alpha_old = aging_quickstart_old;
     tlq->quickstart++;
   }
-  
+
   // exponential moving average
-  tlq->valueLq = fpmmul(tlq->valueLq, alpha_old);
-  if (lost == 0) {
-    tlq->valueLq += fpmtoi(fpmmuli(fpmmul(alpha_new, link_loss_factor), 255));
+  value = itofpm(tlq->valueLq);
+
+  value = fpmmul(value, alpha_old);
+  
+  if (!lost) {
+    fpm ratio;
+    ratio = fpmmuli(alpha_new, 255);
+    ratio = fpmmul(ratio, link_loss_factor);
+    value = fpmadd(value, ratio);
   }
+  tlq->valueLq = fpmtoi(value);
+  
   return default_lq_calc_cost_fpm(ptr);
 }