Refactor v6 pluginloader to clean up callback names (init/enable/disable/exit)
authorHenning Rogge <hrogge@googlemail.com>
Sun, 29 Nov 2009 16:33:48 +0000 (17:33 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Sun, 29 Nov 2009 16:33:48 +0000 (17:33 +0100)
Add "Plugintype" to solve bootstrap conflict between normal plugins and lq-plugins

12 files changed:
lib/lq_etx_ff/src/lq_plugin_etx_ff.c
lib/lq_etx_float/src/lq_plugin_etx_float.c
lib/lq_etx_fpm/src/lq_plugin_etx_fpm.c
lib/lq_rfc/src/lq_plugin_rfc.c
lib/obamp/src/olsrd_plugin.c
lib/txtinfo/src/olsrd_txtinfo.c
src/main.c
src/olsr.h
src/olsr_comport_txt.c
src/plugin_loader.c
src/plugin_loader.h
src/tc_set.c

index 6100d9f..5c82379 100644 (file)
@@ -61,7 +61,7 @@
 
 #define LQ_PLUGIN_RELEVANT_COSTCHANGE_FF 16
 
-static bool lq_etxff_post_init(void);
+static bool lq_etxff_enable(void);
 
 static void lq_etxff_initialize(void);
 static void lq_etxff_deinitialize(void);
@@ -93,7 +93,8 @@ static struct olsr_cookie_info *default_lq_ff_timer_cookie = NULL;
 OLSR_PLUGIN6_NP() {
   .descr = PLUGIN_DESCR,
   .author = PLUGIN_AUTHOR,
-  .post_init = lq_etxff_post_init
+  .enable = lq_etxff_enable,
+  .type = PLUGIN_TYPE_LQ
 };
 
 /* etx lq plugin (freifunk fpm version) settings */
@@ -146,7 +147,7 @@ struct lq_handler lq_etxff_handler = {
   4,4
 };
 
-static bool lq_etxff_post_init(void) {
+static bool lq_etxff_enable(void) {
   active_lq_handler = &lq_etxff_handler;
   return false;
 }
index 30d64d6..b9b86dc 100644 (file)
@@ -57,7 +57,7 @@
 #define LQ_QUICKSTART_STEPS        12
 
 static int set_plugin_float(const char *, void *, set_plugin_parameter_addon);
-static bool lq_etxfloat_post_init(void);
+static bool lq_etxfloat_enable(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 *);
@@ -138,7 +138,8 @@ static const struct olsrd_plugin_parameters plugin_parameters[] = {
 OLSR_PLUGIN6(plugin_parameters) {
   .descr = PLUGIN_DESCR,
   .author = PLUGIN_AUTHOR,
-  .post_init = lq_etxfloat_post_init
+  .enable = lq_etxfloat_enable,
+  .type = PLUGIN_TYPE_LQ
 };
 
 static int
@@ -153,7 +154,7 @@ set_plugin_float(const char *value, void *data, set_plugin_parameter_addon addon
   return 0;
 }
 
-static bool lq_etxfloat_post_init(void) {
+static bool lq_etxfloat_enable(void) {
   active_lq_handler = &lq_etxfloat_handler;
   return false;
 }
index e7eb47c..88c2605 100644 (file)
@@ -58,7 +58,7 @@
 #define LQ_FPM_QUICKSTART_AGING    16384       /* 65536 * 0.25 */
 #define LQ_QUICKSTART_STEPS        12
 
-static bool lq_etxfpm_post_init(void);
+static bool lq_etxfpm_enable(void);
 static int set_plugin_aging(const char *, void *, set_plugin_parameter_addon);
 
 static olsr_linkcost lq_etxfpm_calc_link_entry_cost(struct link_entry *);
@@ -143,11 +143,12 @@ static const struct olsrd_plugin_parameters plugin_parameters[] = {
 OLSR_PLUGIN6(plugin_parameters) {
   .descr = PLUGIN_DESCR,
   .author = PLUGIN_AUTHOR,
-  .post_init = lq_etxfpm_post_init
+  .enable = lq_etxfpm_enable,
+  .type = PLUGIN_TYPE_LQ
 };
 
 
-static bool lq_etxfpm_post_init(void) {
+static bool lq_etxfpm_enable(void) {
   active_lq_handler = &lq_etxfpm_handler;
   return false;
 }
index 10af554..50b9cda 100644 (file)
@@ -58,7 +58,7 @@
 
 #define LQ_PLUGIN_LC_MULTIPLIER 1024
 
-static bool lq_rfc_post_init(void);
+static bool lq_rfc_enable(void);
 static int set_plugin_float(const char *, void *, set_plugin_parameter_addon);
 
 static olsr_linkcost lq_rfc_calc_link_entry_cost(struct link_entry *);
@@ -143,10 +143,11 @@ static const struct olsrd_plugin_parameters plugin_parameters[] = {
 OLSR_PLUGIN6(plugin_parameters) {
   .descr = PLUGIN_DESCR,
   .author = PLUGIN_AUTHOR,
-  .post_init = lq_rfc_post_init
+  .enable = lq_rfc_enable,
+  .type = PLUGIN_TYPE_LQ
 };
 
-static bool lq_rfc_post_init(void) {
+static bool lq_rfc_enable(void) {
   active_lq_handler = &lq_rfc_handler;
   return false;
 }
index 2beeaa8..332c992 100644 (file)
@@ -61,9 +61,9 @@
 static void __attribute__ ((constructor)) my_init(void);
 static void __attribute__ ((destructor)) my_fini(void);
 
-static bool obamp_pre_init(void);
-static bool obamp_post_init(void);
-static bool obamp_pre_cleanup(void);
+static bool obamp_init(void);
+static bool obamp_enable(void);
+static bool obamp_disable(void);
 
 static const struct olsrd_plugin_parameters plugin_parameters[] = {
   {.name = "NonOlsrIf",.set_plugin_parameter = &AddObampSniffingIf,.data = NULL},
@@ -71,14 +71,18 @@ static const struct olsrd_plugin_parameters plugin_parameters[] = {
 
 OLSR_PLUGIN6(plugin_parameters)
 {
-.descr = PLUGIN_DESCR,.author = PLUGIN_AUTHOR,.pre_init = obamp_pre_init,.post_init = obamp_post_init,.pre_cleanup =
-    obamp_pre_cleanup,};
+  .descr = PLUGIN_DESCR,
+  .author = PLUGIN_AUTHOR,
+  .init = obamp_init,
+  .enable = obamp_enable,
+  .disable = obamp_disable
+};
 
 /**
  * Constructor of plugin, called before parameters are initialized
  */
 static bool
-obamp_pre_init(void)
+obamp_init(void)
 {
   PreInitOBAMP();
 
@@ -87,7 +91,7 @@ obamp_pre_init(void)
 }
 
 static bool
-obamp_post_init(void)
+obamp_enable(void)
 {
   olsrd_plugin_init();
 
@@ -101,7 +105,7 @@ obamp_post_init(void)
  * Destructor of plugin
  */
 static bool
-obamp_pre_cleanup(void)
+obamp_disable(void)
 {
   //return 0;
   return false;
index 9c8e172..59353d2 100644 (file)
@@ -70,9 +70,10 @@ struct txtinfo_cmd {
   struct olsr_txtcommand *cmd;
 };
 
-static bool txtinfo_pre_init(void);
-static bool txtinfo_post_init(void);
-static bool txtinfo_pre_cleanup(void);
+static bool txtinfo_init(void);
+static bool txtinfo_enable(void);
+static bool txtinfo_disable(void);
+static bool txtinfo_exit(void);
 
 static enum olsr_txtcommand_result txtinfo_neigh(struct comport_connection *con,
     const char *cmd, const char *param);
@@ -101,9 +102,10 @@ static const struct olsrd_plugin_parameters plugin_parameters[] = {
 OLSR_PLUGIN6(plugin_parameters) {
   .descr = PLUGIN_DESCR,
   .author = PLUGIN_AUTHOR,
-  .pre_init = txtinfo_pre_init,
-  .post_init = txtinfo_post_init,
-  .pre_cleanup = txtinfo_pre_cleanup,
+  .init = txtinfo_init,
+  .enable = txtinfo_enable,
+  .disable = txtinfo_disable,
+  .exit = txtinfo_exit,
   .deactivate = true
 };
 
@@ -214,7 +216,7 @@ static char *values_mid[] = {
  * Constructor of plugin, called before parameters are initialized
  */
 static bool
-txtinfo_pre_init(void)
+txtinfo_init(void)
 {
   ip_acl_init(&allowed_nets);
 
@@ -235,7 +237,7 @@ txtinfo_pre_init(void)
  * Destructor of plugin
  */
 static bool
-txtinfo_pre_cleanup(void)
+txtinfo_disable(void)
 {
   size_t i;
 
@@ -245,7 +247,6 @@ txtinfo_pre_cleanup(void)
   for (i=link_keys_static; i<link_keys_count; i++) {
     free(values_link[i]);
   }
-  ip_acl_flush(&allowed_nets);
   return false;
 }
 
@@ -253,7 +254,7 @@ txtinfo_pre_cleanup(void)
  * Initialization of plugin AFTER parameters have been read
  */
 static bool
-txtinfo_post_init(void)
+txtinfo_enable(void)
 {
   size_t i;
 
@@ -296,6 +297,12 @@ txtinfo_post_init(void)
   return false;
 }
 
+static bool
+txtinfo_exit(void) {
+  ip_acl_flush(&allowed_nets);
+  return false;
+}
+
 /**
  * Parse user templates for \%, \n and \t
  *
index 0a010eb..6ad9d29 100644 (file)
@@ -232,15 +232,19 @@ main(int argc, char *argv[])
   /* Initialize timers and scheduler part */
   olsr_init_timers();
 
-  /* Initialisation of different tables to be used. */
+  /* initialize plugin system */
+  olsr_init_pluginsystem();
+  olsr_plugins_init(true);
+
+  /* initialisation of different tables to be used. */
   olsr_init_tables();
 
+  /* enable lq-plugins */
+  olsr_plugins_enable(PLUGIN_TYPE_LQ, true);
+
   /* initialize built in server services */
   olsr_com_init(true);
 
-  /* Load plugins */
-  olsr_init_pluginsystem(true);
-
   /* Initialize net */
   init_net();
 
@@ -407,7 +411,11 @@ main(int argc, char *argv[])
     olsr_start_timer(olsr_cnf->hna_params.emission_interval,
                      HNA_JITTER, OLSR_TIMER_PERIODIC, &generate_hna, NULL, hna_gen_timer_cookie);
 
+  /* enable default plugins */
+  olsr_plugins_enable(PLUGIN_TYPE_DEFAULT, true);
+
   /* Starting scheduler */
+
   app_state = STATE_RUNNING;
   olsr_scheduler();
 
index 0136760..6c777fa 100644 (file)
@@ -62,7 +62,7 @@ void
 
 uint16_t EXPORT(get_msg_seqno) (void);
 
-uint8_t *olsr_put_msg_hdr(uint8_t **curr, struct olsr_message *msg);
+uint8_t *EXPORT(olsr_put_msg_hdr)(uint8_t **curr, struct olsr_message *msg);
 
 int
   olsr_forward_message(struct olsr_message *, uint8_t *binary, struct interface *, union olsr_ip_addr *);
index 5370ce6..2f52228 100644 (file)
@@ -382,7 +382,7 @@ olsr_txtcmd_plugin(struct comport_connection *con, const char *cmd, const char *
       abuf_appendf(&con->out, "Plugin %s already loaded\n", para2);
       return CONTINUE;
     }
-    plugin = olsr_load_plugin(para2);
+    plugin = olsr_init_plugin(para2);
     if (plugin != NULL) {
       abuf_appendf(&con->out, "Plugin %s successfully loaded\n", para2);
     }
@@ -402,7 +402,7 @@ olsr_txtcmd_plugin(struct comport_connection *con, const char *cmd, const char *
     if (plugin->internal_active) {
       abuf_appendf(&con->out, "Plugin %s already active\n", para2);
     }
-    else if (olsr_activate_plugin(plugin)) {
+    else if (olsr_enable_plugin(plugin)) {
       abuf_appendf(&con->out, "Could not activate plugin %s\n", para2);
     }
     else {
@@ -413,7 +413,7 @@ olsr_txtcmd_plugin(struct comport_connection *con, const char *cmd, const char *
     if (!plugin->internal_active) {
       abuf_appendf(&con->out, "Plugin %s is not active\n", para2);
     }
-    else if (olsr_deactivate_plugin(plugin)) {
+    else if (olsr_disable_plugin(plugin)) {
       abuf_appendf(&con->out, "Could not deactivate plugin %s\n", para2);
     }
     else {
@@ -424,7 +424,7 @@ olsr_txtcmd_plugin(struct comport_connection *con, const char *cmd, const char *
     if (plugin->internal_dlhandle == NULL) {
       abuf_appendf(&con->out, "Plugin %s is static and cannot be unloaded\n", para2);
     }
-    else if (olsr_unload_plugin(plugin)) {
+    else if (olsr_exit_plugin(plugin)) {
       abuf_appendf(&con->out, "Could not unload plugin %s\n", para2);
     }
     else {
index 21ece27..9c0df9c 100644 (file)
@@ -94,10 +94,7 @@ struct olsr_plugin *olsr_get_plugin(const char *libname) {
 }
 
 void
-olsr_init_pluginsystem(bool fail_fast) {
-  struct plugin_entry *entry;
-  struct olsr_plugin *plugin;
-
+olsr_init_pluginsystem(void) {
   plugin_mem_cookie = olsr_alloc_cookie("Plugin handle", OLSR_COOKIE_TYPE_MEMORY);
   olsr_cookie_set_memory_size(plugin_mem_cookie, sizeof(struct olsr_plugin));
 
@@ -106,11 +103,16 @@ olsr_init_pluginsystem(bool fail_fast) {
     avl_init(&plugin_tree, avl_comp_strcasecmp);
     plugin_tree_initialized = true;
   }
+}
 
-  OLSR_INFO(LOG_PLUGINS, "Activating configured plugins...\n");
+void olsr_plugins_init(bool fail_fast) {
+  struct plugin_entry *entry;
+  struct olsr_plugin *plugin;
+
+  OLSR_INFO(LOG_PLUGINS, "Loading configured plugins...\n");
   /* first load anything requested but not already loaded */
   for (entry = olsr_cnf->plugins; entry != NULL; entry = entry->next) {
-    if (olsr_load_plugin(entry->name) == NULL) {
+    if (olsr_init_plugin(entry->name) == NULL) {
       if (fail_fast) {
         OLSR_ERROR(LOG_PLUGINS, "Cannot load plugin %s.\n", entry->name);
         olsr_exit(1);
@@ -132,18 +134,26 @@ olsr_init_pluginsystem(bool fail_fast) {
 
     plugin->internal_params = entry->params;
   }
+}
+
+void olsr_plugins_enable(enum plugin_type type, bool fail_fast) {
+  struct olsr_plugin *plugin;
 
   /* activate all plugins (configured and static linked ones) */
   OLSR_FOR_ALL_PLUGIN_ENTRIES(plugin) {
-    if (olsr_activate_plugin(plugin)) {
+    if ((type != PLUGIN_TYPE_ALL && type != plugin->type) || plugin->internal_active) {
+      continue;
+    }
+
+    if (olsr_enable_plugin(plugin)) {
       if (fail_fast) {
-        OLSR_ERROR(LOG_PLUGINS, "Error, cannot activate plugin %s.\n", entry->name);
+        OLSR_ERROR(LOG_PLUGINS, "Error, cannot activate plugin %s.\n", plugin->name);
         olsr_exit(1);
       }
-      OLSR_WARN(LOG_PLUGINS, "Error, cannot activate plugin %s.\n", entry->name);
+      OLSR_WARN(LOG_PLUGINS, "Error, cannot activate plugin %s.\n", plugin->name);
     }
   } OLSR_FOR_ALL_PLUGIN_ENTRIES_END(plugin)
-  OLSR_INFO(LOG_PLUGINS, "All preconfigured plugins loaded.\n");
+  OLSR_INFO(LOG_PLUGINS, "All plugins loaded.\n");
 }
 
 void
@@ -151,7 +161,7 @@ olsr_destroy_pluginsystem(void) {
   struct olsr_plugin *plugin;
 
   OLSR_FOR_ALL_PLUGIN_ENTRIES(plugin) {
-    olsr_deactivate_plugin(plugin);
+    olsr_disable_plugin(plugin);
     olsr_internal_unload_plugin(plugin, true);
   } OLSR_FOR_ALL_PLUGIN_ENTRIES_END(plugin)
 }
@@ -222,7 +232,7 @@ olsr_load_legacy_plugin(const char *libname, void *dlhandle) {
  *@return dlhandle
  */
 struct olsr_plugin *
-olsr_load_plugin(const char *libname)
+olsr_init_plugin(const char *libname)
 {
   void *dlhandle;
   struct olsr_plugin *plugin;
@@ -264,7 +274,11 @@ olsr_internal_unload_plugin(struct olsr_plugin *plugin, bool cleanup) {
   bool legacy = false;
 
   if (plugin->internal_active) {
-    olsr_deactivate_plugin(plugin);
+    olsr_disable_plugin(plugin);
+  }
+
+  if (plugin->exit != NULL) {
+    plugin->exit();
   }
 
   if (plugin->internal_dlhandle == NULL && !cleanup) {
@@ -296,11 +310,11 @@ olsr_internal_unload_plugin(struct olsr_plugin *plugin, bool cleanup) {
 }
 
 bool
-olsr_unload_plugin(struct olsr_plugin *plugin) {
+olsr_exit_plugin(struct olsr_plugin *plugin) {
   return olsr_internal_unload_plugin(plugin, false);
 }
 
-bool olsr_activate_plugin(struct olsr_plugin *plugin) {
+bool olsr_enable_plugin(struct olsr_plugin *plugin) {
   struct plugin_param *params;
   unsigned int i;
 
@@ -309,8 +323,8 @@ bool olsr_activate_plugin(struct olsr_plugin *plugin) {
     return false;
   }
 
-  if (plugin->pre_init != NULL) {
-    if (plugin->pre_init()) {
+  if (plugin->init != NULL) {
+    if (plugin->init()) {
       OLSR_WARN(LOG_PLUGINS, "Error, pre init failed for plugin %s\n", plugin->name);
       return true;
     }
@@ -339,8 +353,8 @@ bool olsr_activate_plugin(struct olsr_plugin *plugin) {
     }
   }
 
-  if (plugin->post_init != NULL) {
-    if (plugin->post_init()) {
+  if (plugin->enable != NULL) {
+    if (plugin->enable()) {
       OLSR_WARN(LOG_PLUGINS, "Error, post init failed for plugin %s\n", plugin->name);
       return true;
     }
@@ -367,15 +381,15 @@ bool olsr_activate_plugin(struct olsr_plugin *plugin) {
   return false;
 }
 
-bool olsr_deactivate_plugin(struct olsr_plugin *plugin) {
+bool olsr_disable_plugin(struct olsr_plugin *plugin) {
   if (!plugin->internal_active) {
     OLSR_DEBUG(LOG_PLUGINS, "Plugin %s is not active.\n", plugin->name);
     return false;
   }
 
   OLSR_INFO(LOG_PLUGINS, "Deactivating plugin %s\n", plugin->name);
-  if (plugin->pre_cleanup != NULL) {
-    if (plugin->pre_cleanup()) {
+  if (plugin->disable != NULL) {
+    if (plugin->disable()) {
       OLSR_DEBUG(LOG_PLUGINS, "Plugin %s cannot be deactivated, error in pre cleanup\n", plugin->name);
       return true;
     }
@@ -383,11 +397,6 @@ bool olsr_deactivate_plugin(struct olsr_plugin *plugin) {
   }
 
   plugin->internal_active = false;
-
-  if (plugin->post_cleanup != NULL) {
-    plugin->post_cleanup();
-  }
-
   return false;
 }
 
index 7ae38e3..bab84c4 100644 (file)
@@ -68,6 +68,12 @@ static void hookup_plugin_definition (void) { \
 } \
 static struct olsr_plugin olsr_internal_plugin_definition =
 
+enum plugin_type {
+  PLUGIN_TYPE_ALL = -1,
+  PLUGIN_TYPE_DEFAULT = 0,
+  PLUGIN_TYPE_LQ = 1
+};
+
 /* version 5 */
 typedef int (*plugin_init_func) (void);
 typedef int (*get_interface_version_func) (void);
@@ -81,12 +87,13 @@ struct olsr_plugin {
   const char *descr;
   const char *author;
   bool deactivate;    /* plugin can be deactivated */
+  enum plugin_type type;
 
   /* function pointers */
-  bool (*pre_init) (void);
-  bool (*post_init) (void);
-  bool (*pre_cleanup) (void);
-  bool (*post_cleanup) (void);
+  bool (*init) (void);
+  bool (*enable) (void);
+  bool (*disable) (void);
+  bool (*exit) (void);
   int  (*internal_legacy_init) (void);
 
   /* plugin interface version */
@@ -113,14 +120,16 @@ struct olsr_plugin *EXPORT(olsr_get_plugin)(const char *libname);
 void EXPORT(olsr_hookup_plugin) (struct olsr_plugin *plugin);
 void EXPORT(olsr_unhookup_plugin) (struct olsr_plugin *plugin);
 
-void EXPORT(olsr_init_pluginsystem)(bool);
-void EXPORT(olsr_destroy_pluginsystem)(void);
+void olsr_init_pluginsystem(void);
+void olsr_plugins_init(bool);
+void olsr_plugins_enable(enum plugin_type type, bool fail_fast);
+void olsr_destroy_pluginsystem(void);
 
-struct olsr_plugin *EXPORT(olsr_load_plugin)(const char *);
-bool EXPORT(olsr_unload_plugin)(struct olsr_plugin *);
+struct olsr_plugin *EXPORT(olsr_init_plugin)(const char *);
+bool EXPORT(olsr_exit_plugin)(struct olsr_plugin *);
 
-bool EXPORT(olsr_activate_plugin)(struct olsr_plugin *);
-bool EXPORT(olsr_deactivate_plugin)(struct olsr_plugin *);
+bool EXPORT(olsr_enable_plugin)(struct olsr_plugin *);
+bool EXPORT(olsr_disable_plugin)(struct olsr_plugin *);
 
 extern struct avl_tree EXPORT(plugin_tree);
 
index 1d3aa20..411a92d 100644 (file)
@@ -704,7 +704,6 @@ olsr_print_tc_table(void)
  * @param pointer to upper border ip
  * @result 1 if lower/upper border ip have been set
  */
-#if 0
 static int
 olsr_calculate_tc_border(uint8_t lower_border,
                          union olsr_ip_addr *lower_border_ip, uint8_t upper_border, union olsr_ip_addr *upper_border_ip)
@@ -740,7 +739,7 @@ olsr_calculate_tc_border(uint8_t lower_border,
   }
   return 1;
 }
-#endif
+
 /*
  * Process an incoming TC or TC_LQ message.
  *
@@ -844,7 +843,7 @@ olsr_input_tc(struct olsr_message * msg, const uint8_t *payload, const uint8_t *
    */
   assert(msg);
   if (borderSet) {
-    // borderSet = olsr_calculate_tc_border(lower_border, &lower_border_ip, upper_border, &upper_border_ip);
+    borderSet = olsr_calculate_tc_border(lower_border, &lower_border_ip, upper_border, &upper_border_ip);
   }
 
   /*