lq_fpm plugin pushed to main code
authorHenning Rogge <rogge@fgan.de>
Mon, 19 May 2008 10:55:55 +0000 (12:55 +0200)
committerHenning Rogge <rogge@fgan.de>
Mon, 19 May 2008 10:55:55 +0000 (12:55 +0200)
new parameter "LinkQualityAlgorithm" to choose registered lq algorithm
implemented algorithms are "etx_fpm" and "etx_float"

13 files changed:
files/olsrd.conf.default.lq
files/olsrd.conf.default.lq-fisheye
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/lq_plugin.c
src/lq_plugin.h
src/lq_plugin_default_float.c [moved from src/lq_plugin_default.c with 98% similarity]
src/lq_plugin_default_float.h [moved from src/lq_plugin_default.h with 96% similarity]
src/lq_plugin_default_fpm.c [moved from lib/lq_etx_fpm/src/lq_etx_fpm.c with 97% similarity]
src/lq_plugin_default_fpm.h [moved from lib/lq_etx_fpm/src/lq_etx_fpm.h with 97% similarity]
src/olsr.c
src/olsr_cfg.h

index 85c7bdb..012f841 100644 (file)
@@ -128,8 +128,14 @@ UseHysteresis      no
 LinkQualityLevel       2
 
 # Link quality aging factor
-# Defaults to 0.05, smaller values mean larger LQ window size
-LinkQualityAging 0.1 
+# Defaults to 0.1, smaller values mean faster reaction to changing links
+
+#LinkQualityAging 0.1 
+
+# Link quality algorithm
+# Defaults to "etx_fpm" for fixpoint based etx algorithm
+
+#LinkQualityAlgorithm    "etx_fpm"
 
 # Polling rate in seconds(float). 
 # Default value 0.05 sec
index 9e170c4..21f0a0c 100644 (file)
@@ -240,9 +240,14 @@ UseHysteresis      no
 LinkQualityLevel       2
 
 # Link quality aging factor
-# Defaults to 0.05, smaller values mean larger LQ window size
-LinkQualityAging 0.1 
+# Defaults to 0.1, smaller values mean faster reaction to changing links
 
+#LinkQualityAging 0.1 
+
+# Link quality algorithm
+# Defaults to "etx_fpm" for fixpoint based etx algorithm
+
+#LinkQualityAlgorithm    "etx_fpm"
 
 # Polling rate in seconds(float). 
 # Default value 0.05 sec
index 0c0a054..293d3d0 100644 (file)
@@ -470,6 +470,7 @@ set_default_cnf(struct olsrd_config *cnf)
     cnf->lq_dlimit = DEF_LQ_DIJK_LIMIT;
     cnf->lq_dinter = DEF_LQ_DIJK_INTER;
     cnf->lq_aging = DEF_LQ_AGING;
+    cnf->lq_algorithm = NULL;
     cnf->lq_nat_thresh = DEF_LQ_NAT_THRESH;
     cnf->clear_screen = DEF_CLEAR_SCREEN;
 
@@ -593,6 +594,8 @@ olsrd_print_cnf(struct olsrd_config *cnf)
 
   printf("LQ aging factor  : %f\n", cnf->lq_aging);
 
+  printf("LQ algorithm name: %s\n", cnf->lq_algorithm ? cnf->lq_algorithm : "default");
+  
   printf("NAT threshold    : %f\n", cnf->lq_nat_thresh);
 
   printf("Clear screen     : %s\n", cnf->clear_screen ? "yes" : "no");
index 355e87c..9f99078 100644 (file)
@@ -190,6 +190,7 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_LQ_DLIMIT
 %token TOK_LQ_WSIZE
 %token TOK_LQ_AGING
+%token TOK_LQ_PLUGIN
 %token TOK_LQ_NAT_THRESH
 %token TOK_LQ_MULT
 %token TOK_CLEAR_SCREEN
@@ -244,6 +245,7 @@ stmt:       idebug
           | atcredundancy
           | amprcoverage
           | alq_level
+          | alq_plugin
           | alq_fish
           | alq_dlimit
           | anat_thresh
@@ -998,6 +1000,14 @@ alq_aging: TOK_LQ_AGING TOK_FLOAT
 }
 ;
 
+alq_plugin: TOK_LQ_PLUGIN TOK_STRING
+{
+  olsr_cnf->lq_algorithm = $2->string;
+  PARSER_DEBUG_PRINTF("LQ Algorithm: %s\n", $2->string);
+  free($2);
+}
+;
+
 anat_thresh: TOK_LQ_NAT_THRESH TOK_FLOAT
 {
   PARSER_DEBUG_PRINTF("NAT threshold %0.2f\n", $2->floating);
index 96574c5..acb3f91 100644 (file)
@@ -388,6 +388,11 @@ IPV6ADDR {IP6PAT1}|{IP6PAT2}|{IP6PAT3}|{IP6PAT4}|{IP6PAT5}|{IP6PAT6}|{IP6PAT7}|{
     return TOK_LQ_AGING;
 }
 
+"LinkQualityAlgorithm" {
+    yylval = NULL;
+    return TOK_LQ_PLUGIN;
+}
+
 "LinkQualityWinSize" {
     yylval = NULL;
     return TOK_LQ_WSIZE;
index 5bf8fb6..526c846 100644 (file)
 #include "packet.h"
 #include "olsr.h"
 #include "two_hop_neighbor_table.h"
+#include "common/avl.h"
 
-#include "lq_plugin_default.h"
-#include "lq_plugin.h"
+#include "lq_plugin_default_float.h"
+#include "lq_plugin_default_fpm.h"
 
+struct avl_tree lq_handler_tree;
 struct lq_handler *active_lq_handler = NULL;
 
+int
+avl_strcasecmp(const void *str1, const void *str2)
+{
+  return strcasecmp(str1, str2);
+}
+
+
+void
+init_lq_handler_tree(void)
+{
+  avl_init(&lq_handler_tree, &avl_strcasecmp);
+  register_lq_handler(&lq_etx_float_handler, LQ_ALGORITHM_ETX_FLOAT_NAME);
+  register_lq_handler(&lq_etx_fpm_handler, LQ_ALGORITHM_ETX_FPM_NAME);
+  
+  if (activate_lq_handler(olsr_cnf->lq_algorithm)) {
+    activate_lq_handler(LQ_ALGORITHM_ETX_FPM_NAME);
+  }
+}
+
 /*
  * set_lq_handler
  * 
@@ -65,11 +86,35 @@ struct lq_handler *active_lq_handler = NULL;
  * @param name of the link quality handler for debug output
  */
 void
-set_lq_handler(struct lq_handler *handler, const __attribute__ ((unused)) char *name)
+register_lq_handler(struct lq_handler *handler, const char *name)
 {
-  OLSR_PRINTF(1, "Activated lq_handler: %s\n", name);
-  active_lq_handler = handler;
-  handler->initialize();
+  struct lq_handler_node *node;
+  
+  node = olsr_malloc(sizeof(struct lq_handler) + strlen(name) + 1, "olsr lq handler");
+  
+  strcpy(node->name, name);
+  node->node.key = node->name;
+  node->handler = handler;
+  
+  avl_insert(&lq_handler_tree, &node->node, OLSR_FALSE); 
+}
+
+int
+activate_lq_handler(const char *name)
+{
+  struct lq_handler_node *node;
+  
+  node = (struct lq_handler_node *) avl_find(&lq_handler_tree, name);
+  if (node == NULL) {
+    OLSR_PRINTF(1, "Error, unknown lq_handler '%s'\n", name);
+    return 1;
+  }
+  
+  OLSR_PRINTF(1, "Using '%s' algorithm for lq calculation.\n", name);
+  active_lq_handler = node->handler;
+  active_lq_handler->initialize();
+  
+  return 0;
 }
 
 /*
index ec506bd..af91cf6 100644 (file)
@@ -47,6 +47,7 @@
 #include "olsr_spf.h"
 #include "lq_packet.h"
 #include "packet.h"
+#include "common/avl.h"
 
 #define LINK_COST_BROKEN (1<<22)
 #define ROUTE_COST_BROKEN (0xffffffff)
@@ -90,7 +91,28 @@ struct lq_handler {
   size_t tc_lq_size;
 };
 
-void set_lq_handler(struct lq_handler *handler, const char *name);
+struct lq_handler_node {
+  struct avl_node node;
+  struct lq_handler *handler; 
+  char name[0];
+};
+
+AVLNODE2STRUCT(lq_handler_tree2lq_handler_node, struct lq_handler_node, node);
+
+#define OLSR_FOR_ALL_LQ_HANDLERS(lq) \
+{ \
+  struct avl_node *lq_tree_node, *next_lq_tree_node; \
+  for (lq_tree_node = avl_walk_first(&lq_handler_tree); \
+    lq_tree_node; lq_tree_node = next_lq_tree_node) { \
+    next_lq_tree_node = avl_walk_next(lq_tree_node); \
+    lq = lq_handler_tree2lq_handler_node(lq_tree_node);
+#define OLSR_FOR_ALL_LQ_HANDLERS_END(tc) }}
+
+int avl_strcasecmp(const void *str1, const void *str2);
+void init_lq_handler_tree(void);
+
+void register_lq_handler(struct lq_handler *handler, const char *name);
+int activate_lq_handler(const char *name);
 
 olsr_linkcost olsr_calc_tc_cost(const struct tc_edge_entry *);
 olsr_bool olsr_is_relevant_costchange(olsr_linkcost c1, olsr_linkcost c2);
similarity index 98%
rename from src/lq_plugin_default.c
rename to src/lq_plugin_default_float.c
index c9f0f5c..5a574ff 100644 (file)
 #include "lq_packet.h"
 #include "packet.h"
 #include "olsr.h"
-#include "lq_plugin_default.h"
+#include "lq_plugin_default_float.h"
 
 /* Default lq plugin settings */
-struct lq_handler default_lq_float_handler = {
+struct lq_handler lq_etx_float_handler = {
   &default_lq_initialize_float,
   
   &default_lq_calc_cost_float,
similarity index 96%
rename from src/lq_plugin_default.h
rename to src/lq_plugin_default_float.h
index 4a4bb45..09b8aaa 100644 (file)
@@ -44,7 +44,7 @@
 #include "olsr_types.h"
 #include "lq_plugin.h"
 
-#define DEFAULT_LQ_HANDLER_NAME "ETX plugin (float)"
+#define LQ_ALGORITHM_ETX_FLOAT_NAME "etx_float"
 
 #define LQ_PLUGIN_LC_MULTIPLIER 1024
 #define LQ_PLUGIN_RELEVANT_COSTCHANGE 8
@@ -74,6 +74,6 @@ void default_lq_clear_float(void *target);
 const char *default_lq_print_float(void *ptr, struct lqtextbuffer *buffer);
 const char *default_lq_print_cost_float(olsr_linkcost cost, struct lqtextbuffer *buffer);
 
-extern struct lq_handler default_lq_float_handler;
+extern struct lq_handler lq_etx_float_handler;
 
 #endif /*LQ_PLUGIN_DEFAULT_H_*/
similarity index 97%
rename from lib/lq_etx_fpm/src/lq_etx_fpm.c
rename to src/lq_plugin_default_fpm.c
index c7808e5..bb901a5 100644 (file)
@@ -45,7 +45,7 @@
 #include "lq_packet.h"
 #include "packet.h"
 #include "olsr.h"
-#include "lq_etx_fpm.h"
+#include "lq_plugin_default_fpm.h"
 #include "fpm.h"
 
 /* etx lq plugin (fpm version) settings */
@@ -132,9 +132,9 @@ void default_lq_deserialize_hello_lq_pair_fpm(const olsr_u8_t **curr, void *ptr)
 
 olsr_bool default_lq_is_relevant_costchange_fpm(olsr_linkcost c1, olsr_linkcost c2) {
   if (c1 > c2) {
-    return c2 - c1 > LQ_PLUGIN_RELEVANT_COSTCHANGE;
+    return c2 - c1 > LQ_PLUGIN_RELEVANT_COSTCHANGE_FPM;
   }
-  return c1 - c2 > LQ_PLUGIN_RELEVANT_COSTCHANGE;
+  return c1 - c2 > LQ_PLUGIN_RELEVANT_COSTCHANGE_FPM;
 }
 
 int default_lq_serialize_tc_lq_pair_fpm(unsigned char *buff, void *ptr) {
similarity index 97%
rename from lib/lq_etx_fpm/src/lq_etx_fpm.h
rename to src/lq_plugin_default_fpm.h
index f28ecde..30ccebe 100644 (file)
@@ -46,9 +46,9 @@
 #include "lq_plugin.h"
 
 #define LQ_PLUGIN_LC_MULTIPLIER 1024
-#define LQ_PLUGIN_RELEVANT_COSTCHANGE 16
+#define LQ_PLUGIN_RELEVANT_COSTCHANGE_FPM 16
 
-#define LQ_ETX_FPM_HANDLER_NAME "ETX metric with FPM"
+#define LQ_ALGORITHM_ETX_FPM_NAME "etx_fpm"
 struct default_lq_fpm {
        fpm lq, nlq;
        olsr_u16_t quickstart;
index 28894ac..071b904 100644 (file)
@@ -61,7 +61,7 @@
 #include "lq_packet.h"
 #include "common/avl.h"
 #include "net_olsr.h"
-#include "lq_plugin_default.h"
+#include "lq_plugin.h"
 
 #include <stdarg.h>
 #include <signal.h>
@@ -245,8 +245,8 @@ olsr_init_tables(void)
     avl_comp_prefix_default = avl_comp_ipv6_prefix;
   }
 
-  /* Initialize default LQ plugin */
-  set_lq_handler(&default_lq_float_handler, DEFAULT_LQ_HANDLER_NAME);
+  /* Initialize lq plugin set */
+  init_lq_handler_tree();
   
   /* Initialize link set */
   olsr_init_link_set();
index 39f80a8..3166fbc 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_AGING        0.05
+#define DEF_LQ_AGING        0.1
 #define DEF_CLEAR_SCREEN    OLSR_FALSE
 
 /* Bounds */
@@ -221,6 +221,7 @@ struct olsrd_config
   olsr_u8_t                lq_fish;
   float                    lq_dinter;
   float                    lq_aging;
+  char                     *lq_algorithm;
   olsr_u8_t                lq_dlimit;
 
   /* Stuff set by olsrd */