Convert etx_lq_fpm plugin to new plugin interface
[olsrd.git] / lib / lq_etx_float / src / lq_plugin_etx_float.c
index 0c4234d..4dbca77 100644 (file)
 #include "olsr_spf.h"
 #include "lq_packet.h"
 #include "olsr.h"
+#include "olsr_logging.h"
 #include "lq_plugin_etx_float.h"
 
+#define PLUGIN_DESCR    "Floating point based ETX metric with exponential aging"
+#define PLUGIN_AUTHOR   "Henning Rogge and others"
+
 #define LQ_PLUGIN_LC_MULTIPLIER 1024
 
-static void lq_etxfloat_initialize(void);
-static void lq_etxfloat_deinitialize(void);
+#define LQ_FLOAT_DEFAULT_AGING       0.05        /* 65536 * 0.05 */
+#define LQ_FLOAT_QUICKSTART_AGING    0.25       /* 65536 * 0.25 */
+#define LQ_QUICKSTART_STEPS        12
+
+static int set_plugin_float(const char *, void *, set_plugin_parameter_addon);
+static int lq_etxfloat_post_init(void);
 
 static olsr_linkcost lq_etxfloat_calc_link_entry_cost(struct link_entry *);
 static olsr_linkcost lq_etxfloat_calc_lq_hello_neighbor_cost(struct lq_hello_neighbor *);
@@ -78,8 +86,8 @@ static char *lq_etxfloat_print_cost(olsr_linkcost cost, struct lqtextbuffer *buf
 struct lq_handler lq_etxfloat_handler = {
   "etx (float)",
 
-  &lq_etxfloat_initialize,
-  &lq_etxfloat_deinitialize,
+  NULL,
+  NULL,
 
   &lq_etxfloat_calc_link_entry_cost,
   &lq_etxfloat_calc_lq_hello_neighbor_cost,
@@ -118,14 +126,29 @@ struct lq_handler lq_etxfloat_handler = {
   LQ_TC_MESSAGE
 };
 
-static void
-lq_etxfloat_initialize(void)
+static float lq_aging = LQ_FLOAT_DEFAULT_AGING;
+
+static const struct olsrd_plugin_parameters plugin_parameters[] = {
+  {.name = "LinkQualityAging",.set_plugin_parameter = &set_plugin_float,.data = &lq_aging},
+};
+
+DEFINE_PLUGIN6(PLUGIN_DESCR, PLUGIN_AUTHOR, NULL, lq_etxfloat_post_init, NULL, NULL, false, plugin_parameters)
+
+static int
+set_plugin_float(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused)))
 {
+  if (data != NULL) {
+    sscanf(value, "%f", (float *)data);
+    OLSR_INFO(LOG_LQ_PLUGINS, "%s float %f\n", "Got", *(float *)data);
+  } else {
+    OLSR_INFO(LOG_LQ_PLUGINS, "%s float %s\n", "Ignored", value);
+  }
+  return 0;
 }
 
-static void
-lq_etxfloat_deinitialize(void)
-{
+static int lq_etxfloat_post_init(void) {
+  active_lq_handler = &lq_etxfloat_handler;
+  return 0;
 }
 
 static olsr_linkcost
@@ -196,7 +219,8 @@ lq_etxfloat_packet_loss_handler(struct link_entry *link, bool loss)
   float alpha = lq_aging;
 
   if (lq_link->quickstart < LQ_QUICKSTART_STEPS) {
-    alpha = LQ_QUICKSTART_AGING;        /* fast enough to get the LQ value within 6 Hellos up to 0.9 */
+    /* fast enough to get the LQ value within 6 Hellos up to 0.9 */
+    alpha = LQ_FLOAT_QUICKSTART_AGING;
     lq_link->quickstart++;
   }
   // exponential moving average