Support for LinkQualityMult
authorHenning Rogge <rogge@fgan.de>
Mon, 21 Apr 2008 08:32:28 +0000 (10:32 +0200)
committerHenning Rogge <rogge@fgan.de>
Mon, 21 Apr 2008 08:32:28 +0000 (10:32 +0200)
New parameter LinkQualityMult
Deprecated parameter LinkQualityWinSize

23 files changed:
files/olsrd.conf.default.lq
files/olsrd.conf.default.lq-fisheye
files/olsrd.conf.default.rfc
files/olsrd.conf.win32.lq
files/olsrd.conf.win32.rfc
lib/httpinfo/src/admin_interface.c
lib/httpinfo/src/olsrd_httpinfo.c
lib/lq_etx_fpm/README_LQ_ETX_FPM
lib/lq_etx_fpm/src/lq_etx_fpm.c
lib/lq_etx_fpm/src/lq_etx_fpm.h
lib/lq_etx_fpm/src/lq_etx_fpm_plugin.c
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/link_set.c
src/link_set.h
src/lq_plugin.c
src/lq_plugin.h
src/lq_plugin_default.c
src/lq_plugin_default.h
src/main.c
src/olsr_cfg.h

index 1b8cd05..85c7bdb 100644 (file)
@@ -127,10 +127,9 @@ UseHysteresis      no
 
 LinkQualityLevel       2
 
-# Link quality window size
-# Defaults to 10
-
-LinkQualityWinSize     12
+# Link quality aging factor
+# Defaults to 0.05, smaller values mean larger LQ window size
+LinkQualityAging 0.1 
 
 # Polling rate in seconds(float). 
 # Default value 0.05 sec
index c7e695a..9e170c4 100644 (file)
@@ -239,10 +239,10 @@ UseHysteresis     no
 
 LinkQualityLevel       2
 
-# Link quality window size
-# Defaults to 10
+# Link quality aging factor
+# Defaults to 0.05, smaller values mean larger LQ window size
+LinkQualityAging 0.1 
 
-LinkQualityWinSize     100
 
 # Polling rate in seconds(float). 
 # Default value 0.05 sec
index 11bb224..58f6c74 100644 (file)
@@ -122,10 +122,9 @@ HystThrLow 0.30
 
 #LinkQualityLevel      0
 
-# Link quality window size
-# Defaults to 10
-
-#LinkQualityWinSize    12
+# Link quality aging factor
+# Defaults to 0.05, smaller values mean larger LQ window size
+# LinkQualityAging 0.1 
 
 # Polling rate in seconds(float). 
 # Default value 0.05 sec
index f71f26a..caa572d 100644 (file)
@@ -31,11 +31,9 @@ ClearScreen          no
 \r
 LinkQualityLevel       2\r
 \r
-#\r
-# Windows size for packet loss calculation\r
-#\r
-\r
-LinkQualityWinSize     12\r
+# Link quality aging factor\r
+# Defaults to 0.05, smaller values mean larger LQ window size\r
+LinkQualityAging 0.1 \r
 \r
 #\r
 # Do not use hysteresis\r
index fe76d27..b388807 100644 (file)
@@ -31,11 +31,9 @@ ClearScreen          no
 \r
 LinkQualityLevel       0\r
 \r
-#\r
-# Windows size for packet loss calculation\r
-#\r
-\r
-LinkQualityWinSize     12\r
+# Link quality aging factor\r
+# Defaults to 0.05, smaller values mean larger LQ window size\r
+LinkQualityAging 0.1 \r
 \r
 #\r
 # Do not use hysteresis\r
index 781f8a8..335156c 100644 (file)
@@ -138,8 +138,8 @@ build_admin_body(char *buf, olsr_u32_t bufsize __attribute__((unused)))
   if(olsr_cnf->lq_level) {
     size += snprintf(&buf[size], bufsize-size, admin_basic_setting_int,
                      "LQ level:", "lq_level", 1, olsr_cnf->lq_level);
-    size += snprintf(&buf[size], bufsize-size, admin_basic_setting_int,
-                     "LQ winsize:", "lq_wsize", 2, olsr_cnf->lq_wsize);
+    size += snprintf(&buf[size], bufsize-size, admin_basic_setting_float,
+                     "LQ aging:", "lq_aging", 2, olsr_cnf->lq_aging);
   } else {
     size += snprintf(&buf[size], bufsize-size, "<td>LQ disabled</td>\n");
   }
index 3235478..a765ce9 100644 (file)
@@ -872,9 +872,9 @@ static int build_config_body(char *buf, olsr_u32_t bufsize)
     if (olsr_cnf->lq_level) {
       size += snprintf(&buf[size], bufsize-size,
                        "<td>LQ level: %d</td>\n"
-                       "<td>LQ winsize: %d</td>\n",
+                       "<td>LQ aging: %f</td>\n",
                        olsr_cnf->lq_level,
-                       olsr_cnf->lq_wsize);
+                       olsr_cnf->lq_aging);
     }
     size += snprintf(&buf[size], bufsize-size, "</tr></table>\n");
 
index 8796b10..52ef2c7 100644 (file)
@@ -13,7 +13,6 @@ add in /etc/olsrd.conf:
 
 LoadPlugin "lq_etx_fpm.so.0.1"
 {
-    PlParam "alpha" "0.05"
 }
 
 
index 48248a7..81a13b9 100644 (file)
@@ -75,18 +75,13 @@ struct lq_handler lq_etx_fpm_handler = {
 };
 
 fpm MINIMAL_LQ;
-fpm aging_factor1, aging_factor2;
-
-void set_lq_etx_fpm_alpha(fpm alpha) {
-  OLSR_PRINTF(3, "lq_etx_fpm: Set alpha to %s\n", fpmtoa(alpha));
-  aging_factor1 = alpha;
-  aging_factor2 = fpmsub(itofpm(1), alpha);
-}
+fpm aging_factor_new, aging_factor_old;
 
 int init_lq_etx_fpm(void) {
-  if (aging_factor1 == 0 && aging_factor2 == 0) {
-    OLSR_PRINTF(1, "Alpha factor for lq_etx_fgm not set !\n");
-    return 0; // error
+  aging_factor_new = ftofpm(olsr_cnf->lq_aging);
+  aging_factor_old = fpmsub(itofpm(1), aging_factor_new);
+  if (aging_factor_new == 0 && aging_factor_old == 0) {
+    aging_factor_new = 0;
   }
   
   MINIMAL_LQ = ftofpm(0.1);
@@ -166,13 +161,15 @@ void lq_etx_fpm_olsr_deserialize_tc_lq_pair(const olsr_u8_t **curr, void *ptr) {
   lq->nlq = fpmidiv(itofpm(valueNlq), 255);
 }
 
-olsr_linkcost lq_etx_fpm_packet_loss_worker(void *ptr, olsr_bool lost) {
+olsr_linkcost lq_etx_fpm_packet_loss_worker(struct link_entry *link, void *ptr, olsr_bool lost) {
   struct lq_etx_fpm *tlq = ptr;
   
+  fpm link_loss_factor = fpmdiv(itofpm(link->loss_link_multiplier), 65536);
+  
   // exponential moving average
-  tlq->lq = fpmmul(tlq->lq, aging_factor2);
+  tlq->lq = fpmmul(tlq->lq, aging_factor_old);
   if (lost == 0) {
-    tlq->lq = fpmadd(tlq->lq, aging_factor1);
+    tlq->lq = fpmadd(tlq->lq, fpmmul(aging_factor_new, link_loss_factor));
   }
   return lq_etx_fpm_calc_cost(ptr);
 }
index 97b049c..1078e6f 100644 (file)
@@ -53,14 +53,13 @@ struct lq_etx_fpm {
        fpm lq, nlq;
 };
 
-void set_lq_etx_fpm_alpha(fpm alpha);
 int init_lq_etx_fpm(void);
 
 olsr_linkcost lq_etx_fpm_calc_cost(const void *lq);
 
 olsr_bool lq_etx_fpm_olsr_is_relevant_costchange(olsr_linkcost c1, olsr_linkcost c2);
 
-olsr_linkcost lq_etx_fpm_packet_loss_worker(void *lq, olsr_bool lost);
+olsr_linkcost lq_etx_fpm_packet_loss_worker(struct link_entry *link, void *lq, olsr_bool lost);
 void lq_etx_fpm_olsr_memorize_foreign_hello_lq(void *local, void *foreign);
 
 int lq_etx_fpm_olsr_serialize_hello_lq_pair(unsigned char *buff, void *lq);
index 19158f2..acebf24 100644 (file)
@@ -64,26 +64,13 @@ int olsrd_plugin_interface_version(void)
     return PLUGIN_INTERFACE_VERSION;
 }
 
-
-static int set_alpha(const char *value, void *data __attribute__((unused)), set_plugin_parameter_addon addon __attribute__((unused)))
-{
-    set_lq_etx_fpm_alpha(atofpm(value));
-    return 0;
-}
-
 /**
  * Register parameters from config file
  * Called for all plugin parameters
  */
 static const struct olsrd_plugin_parameters plugin_parameters[] = {
-    { .name = "alpha",   .set_plugin_parameter = &set_alpha,      .data = NULL },
 };
 
-void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size)
-{
-    *params = plugin_parameters;
-    *size = sizeof(plugin_parameters)/sizeof(*plugin_parameters);
-}
 /**
  * Initialize plugin
  * Called after all parameters are passed
index a592fe0..9c0e22e 100644 (file)
@@ -182,8 +182,8 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
   fprintf(fd, "# Fish Eye algorithm\n# 0 = do not use fish eye\n# 1 = use fish eye\n\n");
   fprintf(fd, "LinkQualityFishEye\t%d\n\n", cnf->lq_fish);
 
-  fprintf(fd, "# Link quality window size\n\n");
-  fprintf(fd, "LinkQualityWinSize\t%d\n\n", cnf->lq_wsize);
+  fprintf(fd, "# Link quality aging factor\n\n");
+  fprintf(fd, "LinkQualityAging\t%f\n\n", cnf->lq_aging);
 
   fprintf(fd, "# NAT threshold\n\n");
   fprintf(fd, "NatThreshold\t%f\n\n", cnf->lq_nat_thresh);
@@ -466,8 +466,8 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
   WRITE_TO_BUF("# Link quality level\n# 0 = do not use link quality\n# 1 = use link quality for MPR selection\n# 2 = use link quality for MPR selection and routing\n\n");
   WRITE_TO_BUF("LinkQualityLevel\t%d\n\n", cnf->lq_level);
 
-  WRITE_TO_BUF("# Link quality window size\n\n");
-  WRITE_TO_BUF("LinkQualityWinSize\t%d\n\n", cnf->lq_wsize);
+  WRITE_TO_BUF("# Link quality aging factor\n\n");
+  WRITE_TO_BUF("LinkQualityAging\t%f\n\n", cnf->lq_aging);
 
   WRITE_TO_BUF("# NAT threshold\n\n");
   WRITE_TO_BUF("NatThreshold\t%f\n\n", cnf->lq_nat_thresh);
index 4e205da..8614a93 100644 (file)
@@ -285,9 +285,9 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
     }
 
   /* Link quality window size */
-  if(cnf->lq_level && (cnf->lq_wsize < MIN_LQ_WSIZE || cnf->lq_wsize > MAX_LQ_WSIZE))
+  if(cnf->lq_level && (cnf->lq_aging < MIN_LQ_AGING || cnf->lq_aging > MAX_LQ_AGING))
     {
-      fprintf(stderr, "LQ window size %d is not allowed\n", cnf->lq_wsize);
+      fprintf(stderr, "LQ aging factor %f is not allowed\n", cnf->lq_aging);
       return -1;
     }
 
@@ -329,7 +329,7 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
           io->hello_params.validity_time = NEIGHB_HOLD_TIME;
 
         else
-          io->hello_params.validity_time = cnf->lq_wsize * io->hello_params.emission_interval;
+          io->hello_params.validity_time = (int)(REFRESH_INTERVAL / cnf->lq_aging);
       }
 
       if(io->hello_params.emission_interval < cnf->pollrate ||
@@ -463,7 +463,7 @@ set_default_cnf(struct olsrd_config *cnf)
     cnf->lq_fish = DEF_LQ_FISH;
     cnf->lq_dlimit = DEF_LQ_DIJK_LIMIT;
     cnf->lq_dinter = DEF_LQ_DIJK_INTER;
-    cnf->lq_wsize = DEF_LQ_WSIZE;
+    cnf->lq_aging = DEF_LQ_AGING;
     cnf->lq_nat_thresh = DEF_LQ_NAT_THRESH;
     cnf->clear_screen = DEF_CLEAR_SCREEN;
 
@@ -585,7 +585,7 @@ olsrd_print_cnf(struct olsrd_config *cnf)
 
   printf("LQ Dijkstra limit: %d, %0.2f\n", cnf->lq_dlimit, cnf->lq_dinter);
 
-  printf("LQ window size   : %d\n", cnf->lq_wsize);
+  printf("LQ aging factor  : %f\n", cnf->lq_aging);
 
   printf("NAT threshold    : %f\n", cnf->lq_nat_thresh);
 
index a107e74..355e87c 100644 (file)
@@ -2,7 +2,7 @@
 
 /*
  * The olsr.org Optimized Link-State Routing daemon(olsrd)
- * Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
+ * Copyright (c) 2004, Andreas Tnnesen(andreto@olsr.org)
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without 
@@ -189,6 +189,7 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_LQ_FISH
 %token TOK_LQ_DLIMIT
 %token TOK_LQ_WSIZE
+%token TOK_LQ_AGING
 %token TOK_LQ_NAT_THRESH
 %token TOK_LQ_MULT
 %token TOK_CLEAR_SCREEN
@@ -247,6 +248,7 @@ stmt:       idebug
           | alq_dlimit
           | anat_thresh
           | alq_wsize
+          | alq_aging
           | bclear_screen
           | vcomment
 ;
@@ -984,8 +986,14 @@ alq_dlimit: TOK_LQ_DLIMIT TOK_INTEGER TOK_FLOAT
 
 alq_wsize: TOK_LQ_WSIZE TOK_INTEGER
 {
-  PARSER_DEBUG_PRINTF("Link quality window size %d\n", $2->integer);
-  olsr_cnf->lq_wsize = $2->integer;
+  free($2);
+}
+;
+
+alq_aging: TOK_LQ_AGING TOK_FLOAT
+{
+  PARSER_DEBUG_PRINTF("Link quality aging factor %f\n", $2->floating);
+  olsr_cnf->lq_aging = $2->floating;
   free($2);
 }
 ;
index 7519098..96574c5 100644 (file)
@@ -2,7 +2,7 @@
 
 /*
  * The olsr.org Optimized Link-State Routing daemon(olsrd)
- * Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
+ * Copyright (c) 2004, Andreas Tnnesen(andreto@olsr.org)
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without 
@@ -383,6 +383,11 @@ IPV6ADDR {IP6PAT1}|{IP6PAT2}|{IP6PAT3}|{IP6PAT4}|{IP6PAT5}|{IP6PAT6}|{IP6PAT7}|{
     return TOK_LQ_DLIMIT;
 }
 
+"LinkQualityAging" {
+    yylval = NULL;
+    return TOK_LQ_AGING;
+}
+
 "LinkQualityWinSize" {
     yylval = NULL;
     return TOK_LQ_WSIZE;
index 71abe61..c5ddcab 100644 (file)
@@ -350,7 +350,7 @@ static void set_loss_link_multiplier(struct link_entry *entry)
 
   // store the multiplier
 
-  entry->loss_link_multiplier = val;
+  entry->loss_link_multiplier = (olsr_u32_t)(val * 65536);
 }
 
 /*
index 26a58b1..bfd1bd6 100644 (file)
@@ -82,7 +82,8 @@ struct link_entry
   double loss_hello_int;
   struct timer_entry *link_loss_timer;
 
-  float loss_link_multiplier; // user defined multiplies for link quality
+  // user defined multiplies for link quality, multiplied with 65536
+  olsr_u32_t loss_link_multiplier;
   
   // cost of this link
   olsr_linkcost linkcost;
index 8c0da05..49a15ef 100644 (file)
@@ -191,7 +191,7 @@ void olsr_deserialize_tc_lq_pair(const olsr_u8_t **curr, struct tc_edge_entry *e
 void olsr_update_packet_loss_worker(struct link_entry *entry, olsr_bool lost)
 {
        olsr_linkcost lq;
-       lq = active_lq_handler->packet_loss_handler(entry->linkquality, lost);
+       lq = active_lq_handler->packet_loss_handler(entry, entry->linkquality, lost);
   
        if (olsr_is_relevant_costchange(lq, entry->linkcost)) {
     entry->linkcost = lq;
index bf987b9..5b4ed92 100644 (file)
@@ -61,7 +61,7 @@ struct lq_handler {
   
   olsr_bool (*is_relevant_costchange)(olsr_linkcost c1, olsr_linkcost c2);
   
-  olsr_linkcost (*packet_loss_handler)(void *lq, olsr_bool lost);
+  olsr_linkcost (*packet_loss_handler)(struct link_entry *entry, void *lq, olsr_bool lost);
   
   void (*memorize_foreign_hello)(void *local, void *foreign);
   void (*copy_link_lq_into_tc)(void *target, void *source);
index 00e74f5..5ee36f3 100644 (file)
@@ -135,17 +135,13 @@ void default_olsr_deserialize_tc_lq_pair(const olsr_u8_t **curr, void *ptr) {
   lq->nlq = (float)nlq_value / 65535.0;
 }
 
-olsr_linkcost default_packet_loss_worker(void *ptr, olsr_bool lost) {
+olsr_linkcost default_packet_loss_worker(struct link_entry *link, void *ptr, olsr_bool lost) {
   struct default_lq *tlq = ptr;
-  float alpha;
-  
-  // calculate exponental factor for the new link quality, could be directly done in configuration !
-  alpha = 1 / (float)(olsr_cnf->lq_wsize);
   
   // exponential moving average
-  tlq->lq *= (1 - alpha);
+  tlq->lq *= (1 - olsr_cnf->lq_aging);
   if (lost == 0) {
-    tlq->lq += alpha;
+    tlq->lq += (olsr_cnf->lq_aging * link->loss_link_multiplier / 65536);
   }
   return default_calc_cost(ptr);
 }
index aec7def..29f409d 100644 (file)
@@ -55,7 +55,7 @@ olsr_linkcost default_calc_cost(const void *lq);
 
 olsr_bool default_olsr_is_relevant_costchange(olsr_linkcost c1, olsr_linkcost c2);
 
-olsr_linkcost default_packet_loss_worker(void *lq, olsr_bool lost);
+olsr_linkcost default_packet_loss_worker(struct link_entry *link, void *lq, olsr_bool lost);
 void default_olsr_memorize_foreign_hello_lq(void *local, void *foreign);
 
 int default_olsr_serialize_hello_lq_pair(unsigned char *buff, void *lq);
index 22377d0..fa8f0af 100644 (file)
@@ -525,7 +525,7 @@ print_usage(void)
           "  [-hint <hello interval (secs)>] [-tcint <tc interval (secs)>]\n"
           "  [-midint <mid interval (secs)>] [-hnaint <hna interval (secs)>]\n"
           "  [-T <Polling Rate (secs)>] [-nofork] [-hemu <ip_address>]\n"
-          "  [-lql <LQ level>] [-lqw <LQ winsize>]\n");
+          "  [-lql <LQ level>] [-lqa <LQ aging factor>]\n");
 }
 
 
@@ -643,21 +643,21 @@ olsr_process_arguments(int argc, char *argv[],
       /*
        * Set LQ winsize
        */
-      if (strcmp(*argv, "-lqw") == 0) 
+      if (strcmp(*argv, "-lqa") == 0) 
        {
-         int tmp_lq_wsize;
+         float tmp_lq_aging;
          NEXT_ARG;
           CHECK_ARGC;
          
-         sscanf(*argv, "%d", &tmp_lq_wsize);
+         sscanf(*argv, "%f", &tmp_lq_aging);
 
-         if(tmp_lq_wsize < MIN_LQ_WSIZE || tmp_lq_wsize > MAX_LQ_WSIZE)
+         if(tmp_lq_aging < MIN_LQ_AGING || tmp_lq_aging > MAX_LQ_AGING)
            {
-             printf("LQ winsize %d not allowed. Range [%d-%d]\n", 
-                    tmp_lq_wsize, MIN_LQ_WSIZE, MAX_LQ_WSIZE);
+             printf("LQ aging factor %f not allowed. Range [%f-%f]\n", 
+                    tmp_lq_aging, MIN_LQ_AGING, MAX_LQ_AGING);
              olsr_exit(__func__, EXIT_FAILURE);
            }
-         olsr_cnf->lq_wsize = tmp_lq_wsize;
+         olsr_cnf->lq_aging = tmp_lq_aging;
          continue;
        }
       
index 54036b8..39f80a8 100644 (file)
@@ -67,7 +67,7 @@
 #define DEF_LQ_DIJK_LIMIT   255
 #define DEF_LQ_DIJK_INTER   0.0
 #define DEF_LQ_NAT_THRESH   1.0
-#define DEF_LQ_WSIZE        12
+#define DEF_LQ_AGING        0.05
 #define DEF_CLEAR_SCREEN    OLSR_FALSE
 
 /* Bounds */
@@ -92,8 +92,8 @@
 #define MIN_HYST_PARAM      0.0
 #define MAX_LQ_LEVEL        2
 #define MIN_LQ_LEVEL        0
-#define MAX_LQ_WSIZE        128
-#define MIN_LQ_WSIZE        3
+#define MAX_LQ_AGING        1.0
+#define MIN_LQ_AGING        0.01
 
 /* Option values */
 #define CFG_FIBM_FLAT          "flat"
@@ -220,7 +220,7 @@ struct olsrd_config
   olsr_u8_t                lq_level;
   olsr_u8_t                lq_fish;
   float                    lq_dinter;
-  olsr_u32_t               lq_wsize;
+  float                    lq_aging;
   olsr_u8_t                lq_dlimit;
 
   /* Stuff set by olsrd */