Added some de-initializing funcs to plugins, lq_plugins, netfilter, parser
authorSven-Ola Tuecke <sven-ola@gmx.de>
Fri, 2 Jan 2009 13:32:32 +0000 (14:32 +0100)
committerSven-Ola Tuecke <sven-ola@gmx.de>
Fri, 2 Jan 2009 13:32:32 +0000 (14:32 +0100)
16 files changed:
lib/nameservice/src/nameservice.c
lib/txtinfo/src/olsrd_plugin.c
src/lq_plugin.c
src/lq_plugin.h
src/lq_plugin_etx_ff.c
src/lq_plugin_etx_float.c
src/lq_plugin_etx_fpm.c
src/lq_plugin_rfc.c
src/main.c
src/net_olsr.c
src/net_olsr.h
src/parser.c
src/parser.h
src/plugin_loader.c
src/process_package.c
src/process_package.h

index b68d081..1790395 100644 (file)
@@ -490,6 +490,8 @@ name_destructor(void)
 {
        OLSR_PRINTF(2, "NAME PLUGIN: exit. cleaning up...\n");
 
+       olsr_parser_remove_function(&olsr_parser, PARSER_TYPE);
+
        free_name_entry_list(&my_names);
        free_name_entry_list(&my_services);
        free_name_entry_list(&my_macs);
index 97aec0a..8d95179 100644 (file)
@@ -54,6 +54,7 @@
 #include "olsrd_txtinfo.h"
 #include "defs.h"
 #include "olsr_cfg.h"
+#include "olsr.h"
 
 
 #define PLUGIN_NAME    "OLSRD txtinfo plugin"
@@ -81,7 +82,7 @@ static void my_init(void)
 
     /* defaults for parameters */
     ipc_port = 2006;
-    ipc_accept_ip = malloc(sizeof(union olsr_ip_addr));
+    ipc_accept_ip = olsr_malloc(sizeof(union olsr_ip_addr), "ipc_accept_ip");
     if (!ipc_accept_ip) {
         OLSR_PRINTF(0, "Error, no memory for txtinfo plugin");
         exit(1);
@@ -107,6 +108,7 @@ static void my_fini(void)
      * sourcefile and all data destruction
      * should happen there - NOT HERE!
      */
+    if (ipc_accept_ip) free(ipc_accept_ip);
     olsr_plugin_exit();
 }
 
@@ -118,17 +120,22 @@ int olsrd_plugin_interface_version(void)
 
 static int set_txtinfo_iplist(const char *value, void *data __attribute__((unused)), set_plugin_parameter_addon addon __attribute__((unused)))
 {
+    union olsr_ip_addr *tmp = ipc_accept_ip;
     union olsr_ip_addr ip_addr;
     if (inet_pton(olsr_cnf->ip_version, value, &ip_addr) <= 0) {
         OLSR_PRINTF(0, "Illegal IP address \"%s\"", value);
         return 1;
     }
 
-    ipc_accept_ip = realloc(ipc_accept_ip, sizeof(ip_addr) * (ipc_accept_count + 1));
+    ipc_accept_ip = (union olsr_ip_addr *)olsr_malloc(sizeof(ip_addr) * (ipc_accept_count + 1), "txtinfo iplist");
     if (ipc_accept_ip == NULL) {
       OLSR_PRINTF(0, "Error, cannot allocate memory for ipc_accept_ip list in txtinfo plugin");
       exit(1);
     }
+    if (tmp) {
+      memmove(ipc_accept_ip, tmp, sizeof(ip_addr) * ipc_accept_count);
+      free(tmp);
+    }
 
     ipc_accept_ip[ipc_accept_count++] = ip_addr;
     return 0;
index 7180404..afaff75 100644 (file)
@@ -146,6 +146,17 @@ activate_lq_handler(void)
   active_lq_handler->initialize();
 }
 
+void
+deactivate_lq_handler(void)
+{
+  struct lq_handler_node *handler;
+  active_lq_handler->deinitialize();
+  OLSR_FOR_ALL_LQ_HANDLERS(handler) {
+    avl_delete(&lq_handler_tree, &handler->node);
+    free(handler);
+  } OLSR_FOR_ALL_LQ_HANDLERS_END(handler);
+}
+
 /*
  * olsr_calc_tc_cost
  *
index 42e9abf..7e33f77 100644 (file)
@@ -64,6 +64,7 @@ struct lqtextbuffer {
 
 struct lq_handler {
   void (*initialize)(void);
+  void (*deinitialize)(void);
 
   olsr_linkcost (*calc_link_entry_cost) (struct link_entry *);
   olsr_linkcost (*calc_lq_hello_neighbor_cost) (struct lq_hello_neighbor *);
@@ -117,12 +118,13 @@ AVLNODE2STRUCT(lq_handler_tree2lq_handler_node, struct lq_handler_node, node);
     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) }}
+#define OLSR_FOR_ALL_LQ_HANDLERS_END(lq) }}
 
 void init_lq_handler_tree(void);
 
 void activate_lq_handler(void);
 void register_lq_handler(struct lq_handler *, const char *);
+void deactivate_lq_handler(void);
 
 olsr_linkcost olsr_calc_tc_cost(struct tc_edge_entry *);
 bool olsr_is_relevant_costchange(olsr_linkcost c1, olsr_linkcost c2);
@@ -166,6 +168,7 @@ uint8_t olsr_get_TC_MessageId(void);
 /* Externals. */
 extern struct lq_handler *active_lq_handler;
 
+
 #endif /*LQPLUGIN_H_ */
 
 /*
index f073640..ade80e1 100644 (file)
@@ -52,6 +52,7 @@
 #define LQ_PLUGIN_RELEVANT_COSTCHANGE_FF 16
 
 static void lq_etxff_initialize(void);
+static void lq_etxff_deinitialize(void);
 
 static olsr_linkcost lq_etxff_calc_link_entry_cost(struct link_entry *);
 static olsr_linkcost lq_etxff_calc_lq_hello_neighbor_cost(
@@ -93,6 +94,7 @@ static struct olsr_cookie_info *default_lq_ff_timer_cookie = NULL;
 /* etx lq plugin (freifunk fpm version) settings */
 struct lq_handler lq_etxff_handler = {
   &lq_etxff_initialize,
+  &lq_etxff_deinitialize,
 
   &lq_etxff_calc_link_entry_cost,
   &lq_etxff_calc_lq_hello_neighbor_cost,
@@ -229,13 +231,20 @@ static void lq_etxff_timer(void __attribute__((unused)) *context) {
   }OLSR_FOR_ALL_LINK_ENTRIES_END(link);
 }
 
+static struct timer_entry *lq_etxff_timer_struct = NULL;
+
 static void lq_etxff_initialize(void) {
   /* Some cookies for stats keeping */
   olsr_packetparser_add_function(&lq_etxff_packet_parser);
   default_lq_ff_timer_cookie = olsr_alloc_cookie("Default Freifunk LQ",
       OLSR_COOKIE_TYPE_TIMER);
-  olsr_start_timer(1000, 0, OLSR_TIMER_PERIODIC, &lq_etxff_timer, NULL,
-      default_lq_ff_timer_cookie->ci_id);
+  lq_etxff_timer_struct = olsr_start_timer(1000, 0, OLSR_TIMER_PERIODIC,
+      &lq_etxff_timer, NULL, default_lq_ff_timer_cookie->ci_id);
+}
+
+static void lq_etxff_deinitialize(void) {
+  olsr_stop_timer(lq_etxff_timer_struct);
+  olsr_packetparser_remove_function(&lq_etxff_packet_parser);
 }
 
 static olsr_linkcost lq_etxff_calc_linkcost(struct lq_etxff_linkquality *lq) {
index 37332a5..71e879d 100644 (file)
@@ -48,6 +48,7 @@
 #define LQ_PLUGIN_LC_MULTIPLIER 1024
 
 static void lq_etxfloat_initialize(void);
+static void lq_etxfloat_deinitialize(void);
 
 static olsr_linkcost lq_etxfloat_calc_link_entry_cost(struct link_entry *);
 static olsr_linkcost lq_etxfloat_calc_lq_hello_neighbor_cost(
@@ -85,6 +86,7 @@ static char *lq_etxfloat_print_cost(olsr_linkcost cost, struct lqtextbuffer * bu
 /* etx lq plugin (freifunk fpm version) settings */
 struct lq_handler lq_etxfloat_handler = {
   &lq_etxfloat_initialize,
+  &lq_etxfloat_deinitialize,
 
   &lq_etxfloat_calc_link_entry_cost,
   &lq_etxfloat_calc_lq_hello_neighbor_cost,
@@ -126,6 +128,9 @@ struct lq_handler lq_etxfloat_handler = {
 static void lq_etxfloat_initialize(void) {
 }
 
+static void lq_etxfloat_deinitialize(void) {
+}
+
 static olsr_linkcost lq_etxfloat_calc_linkcost(struct lq_etxfloat_linkquality *lq) {
   olsr_linkcost cost;
 
index f70cda8..bc46ee1 100644 (file)
@@ -49,6 +49,7 @@
 #define LQ_FPM_LINKCOST_MULTIPLIER 65535
 
 static void lq_etxfpm_initialize(void);
+static void lq_etxfpm_deinitialize(void);
 
 static olsr_linkcost lq_etxfpm_calc_link_entry_cost(struct link_entry *);
 static olsr_linkcost lq_etxfpm_calc_lq_hello_neighbor_cost(
@@ -86,6 +87,7 @@ static char *lq_etxfpm_print_cost(olsr_linkcost cost, struct lqtextbuffer * buff
 /* etx lq plugin (freifunk fpm version) settings */
 struct lq_handler lq_etxfpm_handler = {
   &lq_etxfpm_initialize,
+  &lq_etxfpm_deinitialize,
 
   &lq_etxfpm_calc_link_entry_cost,
   &lq_etxfpm_calc_lq_hello_neighbor_cost,
@@ -135,6 +137,9 @@ static void lq_etxfpm_initialize(void) {
   aging_quickstart_old = LQ_FPM_INTERNAL_MULTIPLIER - aging_quickstart_new;
 }
 
+static void lq_etxfpm_deinitialize(void) {
+}
+
 static olsr_linkcost lq_etxfpm_calc_linkcost(struct lq_etxfpm_linkquality *lq) {
   olsr_linkcost cost;
 
index 058c29e..aa029f1 100644 (file)
@@ -48,6 +48,7 @@
 #define LQ_PLUGIN_LC_MULTIPLIER 1024
 
 static void lq_rfc_initialize(void);
+static void lq_rfc_deinitialize(void);
 
 static olsr_linkcost lq_rfc_calc_link_entry_cost(struct link_entry *);
 static olsr_linkcost lq_rfc_calc_lq_hello_neighbor_cost(
@@ -85,6 +86,7 @@ static char *lq_rfc_print_cost(olsr_linkcost cost, struct lqtextbuffer * buffer)
 /* etx lq plugin (freifunk fpm version) settings */
 struct lq_handler lq_rfc_handler = {
   &lq_rfc_initialize,
+  &lq_rfc_deinitialize,
 
   &lq_rfc_calc_link_entry_cost,
   &lq_rfc_calc_lq_hello_neighbor_cost,
@@ -126,6 +128,9 @@ struct lq_handler lq_rfc_handler = {
 static void lq_rfc_initialize(void) {
 }
 
+static void lq_rfc_deinitialize(void) {
+}
+
 static olsr_linkcost lq_rfc_calc_link_entry_cost(struct link_entry __attribute__((unused)) *link) {
   return 1;
 }
index f3257e6..d75027e 100644 (file)
@@ -473,6 +473,9 @@ olsr_shutdown(void)
     shutdown_ipc();
   }
 
+  /* Shut down LQ plugin */
+  deactivate_lq_handler();
+
   /* Closing plug-ins */
   olsr_close_plugins();
 
@@ -508,6 +511,12 @@ olsr_shutdown(void)
   /* Free cookies and memory pools attached. */
   olsr_delete_all_cookies();
 
+  /* Remove parser hooks */
+  olsr_deinit_parser();
+
+  /* Remove IP filters */
+  deinit_netfilters();
+
   olsr_syslog(OLSR_LOG_INFO, "%s stopped", olsrd_version);
 
   OLSR_PRINTF(1, "\n <<<< %s - terminating >>>>\n           http://www.olsr.org\n", olsrd_version);
index 3f76fec..8836034 100644 (file)
@@ -110,6 +110,15 @@ init_net(void)
   }
 }
 
+void deinit_netfilters(void)
+{
+  struct filter_entry *filter;
+  OLSR_FOR_ALL_FILTERS(filter) {
+    avl_delete(&filter_tree, &filter->filter_node);
+    free(filter);
+  } OLSR_FOR_ALL_FILTERS_END(filter);
+}
+
 /**
  * Create an outputbuffer for the given interface. This
  * function will allocate the needed storage according
index c3cb781..058bc0c 100644 (file)
@@ -62,6 +62,14 @@ struct filter_entry {
 
 AVLNODE2STRUCT(filter_tree2filter, struct filter_entry, filter_node);
 
+#define OLSR_FOR_ALL_FILTERS(filter) \
+{ \
+  struct avl_node *filter_tree_node, *next_filter_tree_node; \
+  for (filter_tree_node = avl_walk_first(&filter_tree); \
+    filter_tree_node; filter_tree_node = next_filter_tree_node) { \
+    next_filter_tree_node = avl_walk_next(filter_tree_node); \
+    filter = filter_tree2filter(filter_tree_node);
+#define OLSR_FOR_ALL_FILTERS_END(filter) }}
 
 extern bool disp_pack_out;
 
@@ -69,6 +77,8 @@ static INLINE void net_set_disp_pack_out(bool val) { disp_pack_out = val; }
 
 void init_net(void);
 
+void deinit_netfilters(void);
+
 int net_add_buffer(struct interface *);
 
 void net_remove_buffer(struct interface *);
index b4290b4..0ee757d 100644 (file)
@@ -97,6 +97,12 @@ void olsr_init_parser(void)
   olsr_init_package_process();
 }
 
+void olsr_deinit_parser(void)
+{
+  OLSR_PRINTF(3, "Deinitializing parser...\n");
+  olsr_deinit_package_process();
+}
+
 void olsr_parser_add_function(parse_function *function, uint32_t type)
 {
   struct parse_function_entry *new_entry;
@@ -115,7 +121,6 @@ void olsr_parser_add_function(parse_function *function, uint32_t type)
   OLSR_PRINTF(3, "Register parse function: Added function for type %u\n", type);
 }
 
-#if 0
 int olsr_parser_remove_function(parse_function *function, uint32_t type)
 {
   struct parse_function_entry *entry, *prev;
@@ -135,7 +140,6 @@ int olsr_parser_remove_function(parse_function *function, uint32_t type)
   }
   return 0;
 }
-#endif
 
 void olsr_preprocessor_add_function(preprocessor_function *function)
 {
@@ -191,7 +195,6 @@ void olsr_packetparser_add_function(packetparser_function *function)
 
 }
 
-#if 0
 int olsr_packetparser_remove_function(packetparser_function *function)
 {
   struct packetparser_function_entry *entry, *prev;
@@ -211,7 +214,6 @@ int olsr_packetparser_remove_function(packetparser_function *function)
   }
   return 0;
 }
-#endif
 
 /**
  * Shared code to parse the message headers and validate the message originator.
index ed2d247..a042123 100644 (file)
@@ -79,6 +79,9 @@ void
 olsr_init_parser(void);
 
 void
+olsr_deinit_parser(void);
+
+void
 olsr_input(int, void *, unsigned int);
 
 void
@@ -87,10 +90,8 @@ olsr_input_hostemu(int, void *, unsigned int);
 void
 EXPORT(olsr_parser_add_function)(parse_function, uint32_t);
 
-#if 0
 int
-olsr_parser_remove_function(parse_function, uint32_t);
-#endif
+EXPORT(olsr_parser_remove_function)(parse_function, uint32_t);
 
 void
 EXPORT(olsr_preprocessor_add_function)(preprocessor_function);
@@ -101,10 +102,8 @@ EXPORT(olsr_preprocessor_remove_function)(preprocessor_function);
 void
 olsr_packetparser_add_function(packetparser_function *function);
 
-#if 0
 int
 olsr_packetparser_remove_function(packetparser_function *function);
-#endif
 
 const unsigned char *
 olsr_parse_msg_hdr(const union olsr_message *, struct olsrmsg_hdr *);
index a6361c2..fd2ea40 100644 (file)
@@ -303,9 +303,11 @@ void olsr_close_plugins(void)
     struct olsr_plugin *entry;
 
     OLSR_PRINTF(0, "Closing plugins...\n");
-    for(entry = olsr_plugins; entry != NULL; entry = entry->next) {
+    while (olsr_plugins) {
+        entry = olsr_plugins;
+        olsr_plugins = entry->next;
         dlclose(entry->dlhandle);
-        entry->dlhandle = NULL;
+        free(entry);
     }
 }
 
index 8bdb823..7a04788 100644 (file)
@@ -318,6 +318,17 @@ olsr_init_package_process(void)
   olsr_parser_add_function(&olsr_input_hna, HNA_MESSAGE);
 }
 
+void
+olsr_deinit_package_process(void)
+{
+  olsr_parser_remove_function(&olsr_input_hello, HELLO_MESSAGE);
+  olsr_parser_remove_function(&olsr_input_hello, LQ_HELLO_MESSAGE);
+  olsr_parser_remove_function(&olsr_input_tc, TC_MESSAGE);
+  olsr_parser_remove_function(&olsr_input_tc, LQ_TC_MESSAGE);
+  olsr_parser_remove_function(&olsr_input_mid, MID_MESSAGE);
+  olsr_parser_remove_function(&olsr_input_hna, HNA_MESSAGE);
+}
+
 static int
 deserialize_hello(struct lq_hello_message *hello, const void *ser)
 {
index 10564ca..328f687 100644 (file)
@@ -48,6 +48,9 @@ void
 olsr_init_package_process(void);
 
 void
+olsr_deinit_package_process(void);
+
+void
 olsr_process_received_hello(union olsr_message *, struct interface *, union olsr_ip_addr *);
 
 #endif