Add more comments and some smaller refactorings
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Tue, 6 Sep 2011 13:39:53 +0000 (15:39 +0200)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Tue, 6 Sep 2011 13:39:53 +0000 (15:39 +0200)
20 files changed:
CMakeLists.txt
Makefile
framework.doxyfile.in [new file with mode: 0644]
src/core/olsr_cfg.h
src/core/olsr_logging.c
src/core/olsr_logging.h
src/core/olsr_logging_cfg.c
src/core/olsr_logging_sources.c
src/core/olsr_logging_sources.h
src/core/olsr_memcookie.c
src/core/olsr_packet_socket.c
src/core/olsr_packet_socket.h
src/core/olsr_plugins.c
src/core/olsr_plugins.h
src/core/olsr_socket.c
src/core/olsr_stream_socket.c
src/core/olsr_stream_socket.h
src/core/olsr_timer.c
src/core/os_net_generic.c
src/olsr.c

index a53135e..59d47a2 100644 (file)
@@ -48,6 +48,18 @@ IF (WIN32)
     SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--enable-auto-import")
 ENDIF(WIN32)
 
+# add a target to generate API documentation with Doxygen
+find_package(Doxygen)
+if(DOXYGEN_FOUND)
+    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/framework.doxyfile.in
+        ${CMAKE_CURRENT_BINARY_DIR}/framework.doxyfile @ONLY)
+    add_custom_target(doc
+        ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/framework.doxyfile
+        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+        COMMENT "Generating API documentation with Doxygen" VERBATIM
+    )
+endif(DOXYGEN_FOUND)
+
 # set include directories
 include_directories(src)
 include_directories(src/core)
index 8824945..e08e1ef 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,10 +1,12 @@
 BUILD_DIR=build
 
-
 .ONESHELL:
 all: default_target FORCE
        @make -s -C $(BUILD_DIR) all
 
+doc: default_target FORCE
+       @make -s -C $(BUILD_DIR) doc
+
 clean: default_target FORCE
        @make -s -C $(BUILD_DIR) clean
 
diff --git a/framework.doxyfile.in b/framework.doxyfile.in
new file mode 100644 (file)
index 0000000..cfc837b
--- /dev/null
@@ -0,0 +1,276 @@
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = Olsrd Framework
+PROJECT_NUMBER = 0.2
+OUTPUT_DIRECTORY = 
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF = "The $name class" "The $name widget" "The $name file" is provides specifies contains represents a an the
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = YES
+STRIP_FROM_PATH = 
+STRIP_FROM_INC_PATH = 
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = NO
+QT_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS = YES
+SEPARATE_MEMBER_PAGES = NO
+TAB_SIZE = 8
+ALIASES = 
+OPTIMIZE_OUTPUT_FOR_C = YES
+OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+EXTENSION_MAPPING = 
+BUILTIN_STL_SUPPORT = YES
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = YES
+DISTRIBUTE_GROUP_DOC = NO
+SUBGROUPING = YES
+TYPEDEF_HIDES_STRUCT = NO
+SYMBOL_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = NO
+EXTRACT_STATIC = NO
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+EXTRACT_ANON_NSPACES = NO
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = NO
+HIDE_SCOPE_NAMES = YES
+SHOW_INCLUDE_FILES = YES
+FORCE_LOCAL_INCLUDES = NO
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES = NO
+SORT_BY_SCOPE_NAME = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST = YES
+ENABLED_SECTIONS = 
+MAX_INITIALIZER_LINES = 30
+SHOW_USED_FILES = YES
+SHOW_DIRECTORIES = NO
+SHOW_FILES = YES
+SHOW_NAMESPACES = YES
+FILE_VERSION_FILTER = 
+LAYOUT_FILE = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_IF_DOC_ERROR = YES
+WARN_NO_PARAMDOC = YES
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = @CMAKE_CURRENT_SOURCE_DIR@/src 
+INPUT_ENCODING = UTF-8
+FILE_PATTERNS = *.c *.h
+RECURSIVE = YES
+EXCLUDE = 
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS = 
+EXCLUDE_SYMBOLS = __*
+EXAMPLE_PATH = 
+EXAMPLE_PATTERNS = *
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH = 
+INPUT_FILTER = 
+FILTER_PATTERNS = 
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = NO
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS = NO
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = NO
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT = html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER = 
+HTML_FOOTER = 
+HTML_STYLESHEET = 
+HTML_TIMESTAMP = YES
+HTML_ALIGN_MEMBERS = YES
+HTML_DYNAMIC_SECTIONS = NO
+GENERATE_DOCSET = NO
+DOCSET_FEEDNAME = "Doxygen generated docs"
+DOCSET_BUNDLE_ID = org.doxygen.Project
+GENERATE_HTMLHELP = NO
+CHM_FILE = 
+HHC_LOCATION = 
+GENERATE_CHI = NO
+CHM_INDEX_ENCODING = 
+BINARY_TOC = YES
+TOC_EXPAND = YES
+GENERATE_QHP = NO
+QCH_FILE = 
+QHP_NAMESPACE = org.doxygen.Project
+QHP_VIRTUAL_FOLDER = doc
+QHP_CUST_FILTER_NAME = 
+QHP_CUST_FILTER_ATTRS = 
+QHP_SECT_FILTER_ATTRS = 
+QHG_LOCATION = 
+GENERATE_ECLIPSEHELP = NO
+ECLIPSE_DOC_ID = org.doxygen.Project
+DISABLE_INDEX = NO
+ENUM_VALUES_PER_LINE = 1
+GENERATE_TREEVIEW = YES
+USE_INLINE_TREES = NO
+TREEVIEW_WIDTH = 250
+FORMULA_FONTSIZE = 10
+SEARCHENGINE = NO
+SERVER_BASED_SEARCH = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = NO
+LATEX_OUTPUT = latex
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES = 
+LATEX_HEADER = 
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = YES
+LATEX_BATCHMODE = NO
+LATEX_HIDE_INDICES = NO
+LATEX_SOURCE_CODE = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE = 
+RTF_EXTENSIONS_FILE = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+XML_OUTPUT = xml
+XML_SCHEMA = 
+XML_DTD = 
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
+SEARCH_INCLUDES = YES
+INCLUDE_PATH = 
+INCLUDE_FILE_PATTERNS = 
+PREDEFINED = " __attribute__(x)="
+EXPAND_AS_DEFINED = 
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES = 
+GENERATE_TAGFILE = 
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = NO
+MSCGEN_PATH = 
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = NO
+DOT_FONTNAME = FreeSans
+DOT_FONTSIZE = 10
+DOT_FONTPATH = 
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+CALLER_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DIRECTORY_GRAPH = YES
+DOT_IMAGE_FORMAT = png
+DOT_PATH = 
+DOTFILE_DIRS = 
+DOT_GRAPH_MAX_NODES = 50
+MAX_DOT_GRAPH_DEPTH = 0
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
index 9f4acac..4956fb2 100644 (file)
@@ -58,6 +58,7 @@ int olsr_cfg_init(void) __attribute__((warn_unused_result));
 void olsr_cfg_cleanup(void);
 int olsr_cfg_apply(void);
 
+/* do not export this to plugins */
 int olsr_cfg_create_new_rawdb(void);
 
 EXPORT struct cfg_db *olsr_cfg_get_db(void);
index 665847a..a8a2ca2 100644 (file)
@@ -73,7 +73,7 @@ const char OUT_OF_MEMORY_ERROR[] = "Out of memory error!";
 OLSR_SUBSYSTEM_STATE(olsr_logging_state);
 
 /**
- * Called by main method just after configuration options have been parsed
+ * Initialize logging system
  */
 int
 olsr_log_init(enum log_severity def_severity)
@@ -102,7 +102,7 @@ olsr_log_init(enum log_severity def_severity)
 }
 
 /**
- * Called just before olsr_shutdown finishes
+ * Cleanup all resources allocated by logging system
  */
 void
 olsr_log_cleanup(void)
@@ -121,33 +121,19 @@ olsr_log_cleanup(void)
 }
 
 /**
- * Registers a custom logevent handler
- * @param handler pointer to handler function
- * @param mask pointer to custom event filter or NULL if handler use filter
- *   from olsr_cnf
+ * Registers a custom logevent handler. Handler and bitmask_ptr have to
+ * be initialized.
+ * @param h pointer to log event handler struct
  */
-struct log_handler_entry *
-olsr_log_addhandler(log_handler_cb *handler, struct log_handler_mask *mask)
+void
+olsr_log_addhandler(struct log_handler_entry *h)
 {
-  struct log_handler_entry *h;
-
-  /*
-   * The logging system is used in the memory cookie manager, so the logging
-   * system has to allocate its memory directly. Do not try to use
-   * olsr_memcookie_malloc() here.
-   */
-  h = calloc(sizeof(*h), 1);
-  h->handler = handler;
-  h->bitmask_ptr = mask;
-
   list_add_tail(&log_handler_list, &h->node);
   olsr_log_updatemask();
-
-  return h;
 }
 
 /**
- * Call this function to remove a logevent handler
+ * Unregister a logevent handler
  * @param handler pointer to handler function
  */
 void
@@ -155,14 +141,12 @@ olsr_log_removehandler(struct log_handler_entry *h)
 {
   list_remove(&h->node);
   olsr_log_updatemask();
-
-  free(h);
 }
 
 /**
  * Recalculate the combination of the olsr_cnf log event mask and all (if any)
  * custom masks of logfile handlers. Must be called every times a event mask
- * changes.
+ * changes without a logevent handler being added or removed.
  */
 void
 olsr_log_updatemask(void)
@@ -333,6 +317,18 @@ olsr_log_oom(enum log_severity severity, enum log_source source,
   }
 }
 
+/**
+ * Logger for stderr output
+ * @param entry
+ * @param severity
+ * @param source
+ * @param no_header
+ * @param file
+ * @param line
+ * @param buffer
+ * @param timeLength
+ * @param prefixLength
+ */
 void
 olsr_log_stderr(struct log_handler_entry *entry __attribute__ ((unused)),
     enum log_severity severity __attribute__ ((unused)),
@@ -347,6 +343,18 @@ olsr_log_stderr(struct log_handler_entry *entry __attribute__ ((unused)),
   fputc('\n', stderr);
 }
 
+/**
+ * Logger for file output
+ * @param entry
+ * @param severity
+ * @param source
+ * @param no_header
+ * @param file
+ * @param line
+ * @param buffer
+ * @param timeLength
+ * @param prefixLength
+ */
 void
 olsr_log_file(struct log_handler_entry *entry,
     enum log_severity severity __attribute__ ((unused)),
@@ -364,6 +372,18 @@ olsr_log_file(struct log_handler_entry *entry,
   fputc('\n', f);
 }
 
+/**
+ * Logger for syslog output
+ * @param entry
+ * @param severity
+ * @param source
+ * @param no_header
+ * @param file
+ * @param line
+ * @param buffer
+ * @param timeLength
+ * @param prefixLength
+ */
 void
 olsr_log_syslog(struct log_handler_entry *entry __attribute__ ((unused)),
     enum log_severity severity __attribute__ ((unused)),
index 533540e..ddc50e0 100644 (file)
@@ -75,6 +75,9 @@ extern const char *LOG_SEVERITY_NAMES[LOG_SEVERITY_COUNT];
  * from XXX.XXX.XXX.XXX".
  *
  * OLSR_WARN should be used for all error messages.
+ *
+ * OLSR_WARN_OOM should be called in an out-of-memory event to display some warning
+ * without allocating more memory.
  */
 #ifdef REMOVE_LOG_DEBUG
 #define OLSR_DEBUG(source, format, args...) do { } while(0)
@@ -126,11 +129,12 @@ struct log_handler_entry {
   void *custom;
 };
 
+EXPORT extern struct log_handler_mask log_global_mask;
+
 EXPORT int olsr_log_init(enum log_severity) __attribute__((warn_unused_result));
 EXPORT void olsr_log_cleanup(void);
 
-EXPORT struct log_handler_entry *olsr_log_addhandler(log_handler_cb *hanlder,
-    struct log_handler_mask *mask);
+EXPORT void olsr_log_addhandler(struct log_handler_entry *);
 EXPORT void olsr_log_removehandler(struct log_handler_entry *);
 EXPORT void olsr_log_updatemask(void);
 
@@ -152,6 +156,4 @@ EXPORT void olsr_log_file(struct log_handler_entry *,
     bool no_header, const char *file, int line, char *buffer,
     int timeLength, int prefixLength);
 
-EXPORT extern struct log_handler_mask log_global_mask;
-
 #endif /* OLSR_LOGGING_H_ */
index 70da7f3..f4657ba 100644 (file)
@@ -65,6 +65,8 @@
 
 /* prototype for configuration change handler */
 static void _olsr_logcfg_apply(void);
+static void _apply_log_setting(struct cfg_named_section *named,
+    const char *entry_name, enum log_severity severity);
 
 /* define logging configuration template */
 static struct cfg_schema_section logging_section = {
@@ -91,13 +93,24 @@ static size_t debug_lvl_1_count = 0;
 
 /* global logger configuration */
 static struct log_handler_mask logging_cfg;
-static struct log_handler_entry *stderr_handler = NULL;
-static struct log_handler_entry *syslog_handler = NULL;
-static struct log_handler_entry *file_handler = NULL;
+static struct log_handler_entry stderr_handler = {
+    .handler = olsr_log_stderr, .bitmask_ptr = &logging_cfg
+};
+static struct log_handler_entry syslog_handler = {
+    .handler = olsr_log_syslog, .bitmask_ptr = &logging_cfg
+};
+static struct log_handler_entry file_handler = {
+    .handler = olsr_log_file, .bitmask_ptr = &logging_cfg
+};
 
 /* remember if initialized or not */
 OLSR_SUBSYSTEM_STATE(olsr_logcfg_state);
 
+/**
+ * Initialize logging configuration
+ * @param debug_lvl_1_ptr array of logging sources for debug level 1
+ * @param count number of logging sources in array
+ */
 void
 olsr_logcfg_init(enum log_source *debug_lvl_1_ptr, size_t count) {
   if (olsr_subsystem_init(&olsr_logcfg_state))
@@ -106,16 +119,15 @@ olsr_logcfg_init(enum log_source *debug_lvl_1_ptr, size_t count) {
   debug_lvl_1 = debug_lvl_1_ptr;
   debug_lvl_1_count = count;
 
-  stderr_handler = NULL;
-  syslog_handler = NULL;
-  file_handler = NULL;
-
   memset(&logging_cfg, 0, sizeof(logging_cfg));
 
   /* setup delta handler */
   cfg_delta_add_handler(olsr_cfg_get_delta(), &logcfg_delta_handler);
 }
 
+/**
+ * Cleanup all allocated resources of logging configuration
+ */
 void
 olsr_logcfg_cleanup(void) {
   if (olsr_subsystem_cleanup(&olsr_logcfg_state))
@@ -125,54 +137,40 @@ olsr_logcfg_cleanup(void) {
   cfg_delta_remove_handler(olsr_cfg_get_delta(), &logcfg_delta_handler);
 
   /* clean up former handlers */
-  if (stderr_handler) {
-    olsr_log_removehandler(stderr_handler);
+  if (list_node_added(&stderr_handler.node)) {
+    olsr_log_removehandler(&stderr_handler);
   }
-  if (syslog_handler) {
-    olsr_log_removehandler(syslog_handler);
+  if (list_node_added(&syslog_handler.node)) {
+    olsr_log_removehandler(&syslog_handler);
   }
-  if (file_handler) {
+  if (list_node_added(&file_handler.node)) {
     FILE *f;
 
-    f = file_handler->custom;
+    f = file_handler.custom;
     fflush(f);
     fclose(f);
 
-    olsr_log_removehandler(file_handler);
+    olsr_log_removehandler(&file_handler);
   }
 }
 
+/**
+ * Add logging section to global configuration schema
+ * @param schema pointer to schema
+ */
 void
 olsr_logcfg_addschema(struct cfg_schema *schema) {
   cfg_schema_add_section(schema, &logging_section);
   cfg_schema_add_entries(&logging_section, logging_entries, ARRAYSIZE(logging_entries));
 }
 
-static void
-apply_log_setting(struct cfg_named_section *named,
-    const char *entry_name, enum log_severity severity) {
-  struct cfg_entry *entry;
-  char *ptr;
-  size_t i;
-
-  entry = cfg_db_get_entry(named, entry_name);
-  if (entry) {
-    OLSR_FOR_ALL_CFG_LIST_ENTRIES(entry, ptr) {
-      i = cfg_get_choice_index(ptr, LOG_SOURCE_NAMES, ARRAYSIZE(LOG_SOURCE_NAMES));
-      logging_cfg.mask[severity][i] = true;
-    }
-  }
-}
-
-static void
-_olsr_logcfg_apply(void) {
-  if (olsr_logcfg_apply(olsr_cfg_get_db())) {
-    /* TODO: really exit OLSR when logging file cannot be opened ? */
-    olsr_exit();
-  }
-}
-
-int olsr_logcfg_apply(struct cfg_db *db) {
+/**
+ * Apply the configuration settings of a db to the logging system
+ * @param db pointer to configuration database
+ * @return -1 if an error happened, 0 otherwise
+ */
+int
+olsr_logcfg_apply(struct cfg_db *db) {
   struct cfg_named_section *named;
   const char *ptr, *file_name;
   size_t i;
@@ -214,9 +212,9 @@ int olsr_logcfg_apply(struct cfg_db *db) {
   /* now apply specific settings */
   named = cfg_db_find_namedsection(db, LOG_SECTION, NULL);
   if (named != NULL) {
-    apply_log_setting(named, LOG_WARN_ENTRY, SEVERITY_WARN);
-    apply_log_setting(named, LOG_INFO_ENTRY, SEVERITY_INFO);
-    apply_log_setting(named, LOG_DEBUG_ENTRY, SEVERITY_DEBUG);
+    _apply_log_setting(named, LOG_WARN_ENTRY, SEVERITY_WARN);
+    _apply_log_setting(named, LOG_INFO_ENTRY, SEVERITY_INFO);
+    _apply_log_setting(named, LOG_DEBUG_ENTRY, SEVERITY_DEBUG);
   }
 
   /* and finally modify the logging handlers */
@@ -224,46 +222,47 @@ int olsr_logcfg_apply(struct cfg_db *db) {
   /* log.syslog */
   ptr = cfg_db_get_entry_value(db, LOG_SECTION, NULL, LOG_SYSLOG_ENTRY);
   activate_syslog = cfg_get_bool(ptr);
-  if (activate_syslog && syslog_handler == NULL) {
-    syslog_handler = olsr_log_addhandler(olsr_log_syslog, &logging_cfg);
+  if (activate_syslog && !list_node_added(&syslog_handler.node)) {
+    olsr_log_addhandler(&syslog_handler);
   }
-  else if (!activate_syslog && syslog_handler != NULL) {
-    olsr_log_removehandler(syslog_handler);
-    syslog_handler = NULL;
+  else if (!activate_syslog && list_node_added(&syslog_handler.node)) {
+    olsr_log_removehandler(&syslog_handler);
   }
 
   /* log.file */
   file_name = cfg_db_get_entry_value(db, LOG_SECTION, NULL, LOG_FILE_ENTRY);
   activate_file = file_name != NULL && *file_name != 0;
 
-  if (activate_file && file_handler == NULL) {
+  if (activate_file && !list_node_added(&file_handler.node)) {
     FILE *f;
 
     f = fopen(file_name, "w");
     if (f != NULL) {
-      file_handler = olsr_log_addhandler(olsr_log_file, &logging_cfg);
-      file_handler->custom = f;
+      olsr_log_addhandler(&file_handler);
+      file_handler.custom = f;
     }
     else {
       file_errno = errno;
     }
   }
-  else if (!activate_file && file_handler != NULL) {
-    olsr_log_removehandler(file_handler);
-    file_handler = NULL;
+  else if (!activate_file && list_node_added(&file_handler.node)) {
+    FILE *f = file_handler.custom;
+    olsr_log_removehandler(&file_handler);
+
+    fflush(f);
+    fclose(f);
   }
 
   /* log.stderr (activate if syslog and file ar offline) */
   ptr = cfg_db_get_entry_value(db, LOG_SECTION, NULL, LOG_STDERR_ENTRY);
   activate_stderr = cfg_get_bool(ptr)
-      || (syslog_handler == NULL && file_handler == NULL);
+      || (!list_node_added(&syslog_handler.node) && !list_node_added(&file_handler.node));
 
-  if (activate_stderr && stderr_handler == NULL) {
-    stderr_handler = olsr_log_addhandler(olsr_log_stderr, &logging_cfg);
+  if (activate_stderr && !list_node_added(&stderr_handler.node)) {
+    olsr_log_addhandler(&stderr_handler);
   }
-  else if (!activate_stderr && stderr_handler != NULL) {
-    olsr_log_removehandler(stderr_handler);
-    stderr_handler = NULL;
+  else if (!activate_stderr && list_node_added(&stderr_handler.node)) {
+    olsr_log_removehandler(&stderr_handler);
   }
 
   /* reload logging mask */
@@ -277,3 +276,36 @@ int olsr_logcfg_apply(struct cfg_db *db) {
 
   return 0;
 }
+
+/**
+ * Apply the logging options of one severity setting to the logging mask
+ * @param named pointer to configuration section
+ * @param entry_name name of setting (debug, info, warn)
+ * @param severity severity level corresponding severity level
+ */
+static void
+_apply_log_setting(struct cfg_named_section *named,
+    const char *entry_name, enum log_severity severity) {
+  struct cfg_entry *entry;
+  char *ptr;
+  size_t i;
+
+  entry = cfg_db_get_entry(named, entry_name);
+  if (entry) {
+    OLSR_FOR_ALL_CFG_LIST_ENTRIES(entry, ptr) {
+      i = cfg_get_choice_index(ptr, LOG_SOURCE_NAMES, ARRAYSIZE(LOG_SOURCE_NAMES));
+      logging_cfg.mask[severity][i] = true;
+    }
+  }
+}
+
+/**
+ * Wrapper for configuration delta handling
+ */
+static void
+_olsr_logcfg_apply(void) {
+  if (olsr_logcfg_apply(olsr_cfg_get_db())) {
+    /* TODO: really exit OLSR when logging file cannot be opened ? */
+    olsr_exit();
+  }
+}
index 55cf301..6bdd1a3 100644 (file)
@@ -42,7 +42,7 @@
 #include "olsr_logging_sources.h"
 
 /*
- * String constants for olsr_log_* and if_mode as used in olsrd.conf.
+ * String constants for olsr_log_* functions.
  * Keep this in the same order as the log_source and
  * log_severity enums (see olsr_logging_sources.h).
  */
index e46cdb2..3028625 100644 (file)
 #ifndef OLSR_LOGGING_SOURCES_H_
 #define OLSR_LOGGING_SOURCES_H_
 
-/**
- * defines the source of a logging event
+/*
+ * Defines the source of a logging event.
+ * Keep this in the same order as the log_source and
+ * log_severity enums (see olsr_logging_sources.h).
  */
 enum log_source {
   LOG_ALL,
index ff233bf..21b387f 100644 (file)
@@ -74,7 +74,7 @@ calc_aligned_size(size_t size) {
  * @param ci pointer to memcookie info
  */
 static inline void
-olsr_cookie_usage_incr(struct olsr_memcookie_info *ci)
+_usage_incr(struct olsr_memcookie_info *ci)
 {
   ci->ci_usage++;
   ci->ci_changes++;
@@ -85,7 +85,7 @@ olsr_cookie_usage_incr(struct olsr_memcookie_info *ci)
  * @param ci pointer to memcookie info
  */
 static inline void
-olsr_cookie_usage_decr(struct olsr_memcookie_info *ci)
+_usage_decr(struct olsr_memcookie_info *ci)
 {
   ci->ci_usage--;
   ci->ci_changes++;
@@ -252,7 +252,7 @@ olsr_memcookie_malloc(struct olsr_memcookie_info *ci)
   }
 
   /* Stats keeping */
-  olsr_cookie_usage_incr(ci);
+  _usage_incr(ci);
 
   OLSR_DEBUG(LOG_MEMCOOKIE, "MEMORY: alloc %s, %p, %lu bytes%s\n",
              ci->ci_name, mem + 1, (unsigned long)ci->ci_size, reuse ? ", reuse" : "");
@@ -303,7 +303,7 @@ olsr_memcookie_free(struct olsr_memcookie_info *ci, void *ptr)
   }
 
   /* Stats keeping */
-  olsr_cookie_usage_decr(ci);
+  _usage_decr(ci);
 
   OLSR_DEBUG(LOG_MEMCOOKIE, "MEMORY: free %s, %p, %lu bytes%s\n",
              ci->ci_name, ptr, (unsigned long)ci->ci_total_size, reuse ? ", reuse" : "");
index b20b3cd..0818b40 100644 (file)
@@ -59,6 +59,9 @@ OLSR_SUBSYSTEM_STATE(olsr_packet_state);
 
 static void olsr_packet_event(int fd, void *data, enum olsr_sockethandler_flags flags);
 
+/**
+ * Initialize packet socket handler
+ */
 void
 olsr_packet_init(void) {
   if (olsr_subsystem_init(&olsr_packet_state))
@@ -67,6 +70,9 @@ olsr_packet_init(void) {
   list_init_head(&packet_sockets);
 }
 
+/**
+ * Cleanup all resources allocated by packet socket handler
+ */
 void
 olsr_packet_cleanup(void) {
   struct olsr_packet_socket *skt;
@@ -81,6 +87,12 @@ olsr_packet_cleanup(void) {
   }
 }
 
+/**
+ * Add a new packet socket handler
+ * @param pktsocket pointer to uninitialized packet socket struct
+ * @param local pointer local IP address of packet socket
+ * @return -1 if an error happened, 0 otherwise
+ */
 int
 olsr_packet_add(struct olsr_packet_socket *pktsocket,
     union netaddr_socket *local) {
@@ -123,6 +135,10 @@ open_comport_error:
   return -1;
 }
 
+/**
+ * Remove a packet socket from the global scheduler
+ * @param pktsocket pointer to packet socket
+ */
 void
 olsr_packet_remove(struct olsr_packet_socket *pktsocket) {
   if (list_node_added(&pktsocket->node)) {
@@ -134,6 +150,15 @@ olsr_packet_remove(struct olsr_packet_socket *pktsocket) {
   }
 }
 
+/**
+ * Send a data packet through a packet socket. The transmission might not
+ * be happen synchronously if the socket would block.
+ * @param pktsocket pointer to packet socket
+ * @param remote ip/address to send packet to
+ * @param data pointer to data to be sent
+ * @param length length of data
+ * @return -1 if an error happened, 0 otherwise
+ */
 int
 olsr_packet_send(struct olsr_packet_socket *pktsocket, union netaddr_socket *remote,
     const void *data, size_t length) {
@@ -171,6 +196,12 @@ olsr_packet_send(struct olsr_packet_socket *pktsocket, union netaddr_socket *rem
   return 0;
 }
 
+/**
+ * Callback to handle data from the olsr socket scheduler
+ * @param fd filedescriptor to read data from
+ * @param data custom data pointer
+ * @param flags socket handler flags about event (read and/or write)
+ */
 static void
 olsr_packet_event(int fd, void *data, enum olsr_sockethandler_flags flags) {
   struct olsr_packet_socket *pktsocket = data;
@@ -183,6 +214,7 @@ olsr_packet_event(int fd, void *data, enum olsr_sockethandler_flags flags) {
 #endif
 
   if ((flags & OLSR_SOCKET_READ) != 0) {
+    /* handle incoming data */
     result = os_recvfrom(fd, pktsocket->input_buffer, pktsocket->input_buffer_length-1, &sock);
     if (result > 0 && pktsocket->receive_data != NULL) {
       /* null terminate it */
@@ -198,6 +230,8 @@ olsr_packet_event(int fd, void *data, enum olsr_sockethandler_flags flags) {
   }
 
   if ((flags & OLSR_SOCKET_WRITE) != 0 && pktsocket->out.len == 0) {
+    /* handle outgoing data */
+
     /* pointer to remote socket */
     skt = data;
 
@@ -226,6 +260,7 @@ olsr_packet_event(int fd, void *data, enum olsr_sockethandler_flags flags) {
   }
 
   if (pktsocket->out.len == 0) {
+    /* nothing left to send, disable outgoing events */
     olsr_socket_disable(pktsocket->scheduler_entry, OLSR_SOCKET_WRITE);
   }
 }
index 15463cf..af9125c 100644 (file)
@@ -65,11 +65,11 @@ struct olsr_packet_socket {
 void olsr_packet_init(void);
 void olsr_packet_cleanup(void);
 
-int olsr_packet_add(struct olsr_packet_socket *,
+EXPORT int olsr_packet_add(struct olsr_packet_socket *,
     union netaddr_socket *local);
-void olsr_packet_remove(struct olsr_packet_socket *);
+EXPORT void olsr_packet_remove(struct olsr_packet_socket *);
 
-int olsr_packet_send(struct olsr_packet_socket *, union netaddr_socket *remove,
+EXPORT int olsr_packet_send(struct olsr_packet_socket *, union netaddr_socket *remove,
     const void *data, size_t length);
 
 #endif /* OLSR_PACKET_SOCKET_H_ */
index 227497e..86ac9ac 100644 (file)
@@ -79,44 +79,12 @@ static const char *dlopen_patterns[] = {
   "%LIB%",
 };
 
-static int olsr_internal_unload_plugin(struct olsr_plugin *plugin, bool cleanup);
+static int _unload_plugin(struct olsr_plugin *plugin, bool cleanup);
 static void *_open_plugin(const char *filename);
 
 /* remember if initialized or not */
 OLSR_SUBSYSTEM_STATE(olsr_plugins_state);
 
-/**
- * This function is called by the constructor of a plugin.
- * because of this the first call has to initialize the list
- * head.
- *
- * @param pl_def pointer to plugin definition
- */
-void
-olsr_plugins_hook(struct olsr_plugin *pl_def) {
-  assert (pl_def->name);
-
-  /* make sure plugin system is initialized */
-  olsr_plugins_init();
-
-  /* check if plugin is already in tree */
-  if (olsr_plugins_get(pl_def->name)) {
-    return;
-  }
-
-  /* hook static plugin into avl tree */
-  pl_def->p_node.key = pl_def->name;
-  avl_insert(&plugin_tree, &pl_def->p_node);
-
-  /* initialize the plugin */
-  if (olsr_plugins_load(pl_def->name) == NULL) {
-    OLSR_WARN(LOG_PLUGINLOADER, "Cannot load plugin %s", pl_def->name);
-    return;
-  }
-
-  OLSR_INFO(LOG_PLUGINLOADER, "Loaded plugin %s", pl_def->name);
-}
-
 /**
  * Initialize the plugin loader system
  */
@@ -147,8 +115,38 @@ olsr_plugins_cleanup(void) {
 
   OLSR_FOR_ALL_PLUGIN_ENTRIES(plugin, iterator) {
     olsr_plugins_disable(plugin);
-    olsr_internal_unload_plugin(plugin, true);
+    _unload_plugin(plugin, true);
+  }
+}
+
+/**
+ * This function is called by the constructor of a plugin.
+ *
+ * @param pl_def pointer to plugin definition
+ */
+void
+olsr_plugins_hook(struct olsr_plugin *pl_def) {
+  assert (pl_def->name);
+
+  /* make sure plugin system is initialized */
+  olsr_plugins_init();
+
+  /* check if plugin is already in tree */
+  if (olsr_plugins_get(pl_def->name)) {
+    return;
   }
+
+  /* hook static plugin into avl tree */
+  pl_def->p_node.key = pl_def->name;
+  avl_insert(&plugin_tree, &pl_def->p_node);
+
+  /* initialize the plugin */
+  if (olsr_plugins_load(pl_def->name) == NULL) {
+    OLSR_WARN(LOG_PLUGINLOADER, "Cannot load plugin %s", pl_def->name);
+    return;
+  }
+
+  OLSR_INFO(LOG_PLUGINLOADER, "Loaded plugin %s", pl_def->name);
 }
 
 /**
@@ -161,7 +159,7 @@ olsr_plugins_get(const char *libname) {
   struct olsr_plugin *plugin;
   char *ptr, memorize = 0;
 
-  /* SOT: Hacked away the funny plugin check which fails if pathname is included */
+  /* extract only the filename, without path, prefix or suffix */
   if ((ptr = strrchr(libname, '/')) != NULL) {
     libname = ptr + 1;
   }
@@ -199,17 +197,10 @@ olsr_plugins_load(const char *libname)
   /* see if the plugin is there */
   if ((plugin = olsr_plugins_get(libname)) == NULL) {
     /* attempt to load the plugin */
-#if 0
-    if (olsr_cnf->dlPath) {
-      char *path;
-      path = malloc(strlen(olsr_cnf->dlPath) + strlen(libname) + 1, "Memory for absolute library path");
-      strcpy(path, olsr_cnf->dlPath);
-      strcat(path, libname);
-    }
-#endif
     dlhandle = _open_plugin(libname);
 
     if (dlhandle == NULL) {
+      /* Logging output has already been done by _open_plugin() */
       return NULL;
     }
 
@@ -314,7 +305,7 @@ olsr_plugins_disable(struct olsr_plugin *plugin) {
  */
 int
 olsr_plugins_unload(struct olsr_plugin *plugin) {
-  return olsr_internal_unload_plugin(plugin, false);
+  return _unload_plugin(plugin, false);
 }
 
 /**
@@ -325,7 +316,7 @@ olsr_plugins_unload(struct olsr_plugin *plugin) {
  * @return 0 if the plugin was removed, -1 otherwise
  */
 static int
-olsr_internal_unload_plugin(struct olsr_plugin *plugin, bool cleanup) {
+_unload_plugin(struct olsr_plugin *plugin, bool cleanup) {
   if (plugin->int_enabled) {
     /* deactivate first if necessary */
     olsr_plugins_disable(plugin);
@@ -356,7 +347,11 @@ olsr_internal_unload_plugin(struct olsr_plugin *plugin, bool cleanup) {
   return false;
 }
 
-
+/**
+ * Internal helper to load plugin with different variants of the
+ * filename.
+ * @param filename pointer to filename
+ */
 static void *
 _open_plugin(const char *filename) {
   struct abuf_template_storage table[5];
index 8e2ccda..4a26631 100644 (file)
@@ -96,18 +96,18 @@ struct olsr_plugin {
 #define OLSR_FOR_ALL_PLUGIN_ENTRIES(plugin, iterator) avl_for_each_element_safe(&plugin_tree, plugin, p_node, iterator)
 EXPORT extern struct avl_tree plugin_tree;
 
-EXPORT void olsr_plugins_hook(struct olsr_plugin *plugin);
-
 void olsr_plugins_init(void);
 void olsr_plugins_cleanup(void);
 
+EXPORT void olsr_plugins_hook(struct olsr_plugin *plugin);
+
+EXPORT struct olsr_plugin *olsr_plugins_get(const char *libname);
+
 EXPORT struct olsr_plugin *olsr_plugins_load(const char *);
 EXPORT int olsr_plugins_unload(struct olsr_plugin *);
 EXPORT int olsr_plugins_enable(struct olsr_plugin *);
 EXPORT int olsr_plugins_disable(struct olsr_plugin *);
 
-EXPORT struct olsr_plugin *olsr_plugins_get(const char *libname);
-
 /**
  * @param p pointer to plugin
  * @return true if its a static plugin, false otherwise
index 4c49058..e7905ad 100644 (file)
@@ -54,7 +54,7 @@
 #include "olsr_socket.h"
 #include "olsr.h"
 
-/* Head of all OLSR used sockets */
+/* List of all active sockets in scheduler */
 struct list_entity socket_head;
 
 static struct olsr_memcookie_info *socket_memcookie;
@@ -124,33 +124,33 @@ olsr_socket_add(int fd, socket_handler_func pf_imm, void *data,
 {
   struct olsr_socket_entry *new_entry;
 
-  if (fd < 0 || pf_imm == NULL) {
-    OLSR_WARN(LOG_SOCKET, "Bogus socket entry - not registering...");
-    return NULL;
-  }
+  assert (fd);
+  assert (pf_imm);
+
   OLSR_DEBUG(LOG_SOCKET, "Adding OLSR socket entry %d\n", fd);
 
   new_entry = olsr_memcookie_malloc(socket_memcookie);
-
-  new_entry->fd = fd;
-  new_entry->process = pf_imm;
-  new_entry->data = data;
-  new_entry->flags = flags;
-
-  /* Queue */
-  list_add_before(&socket_head, &new_entry->node);
+  if (new_entry) {
+    new_entry->fd = fd;
+    new_entry->process = pf_imm;
+    new_entry->data = data;
+    new_entry->flags = flags;
+
+    /* Queue */
+    list_add_before(&socket_head, &new_entry->node);
+  }
 
   return new_entry;
 }
 
 /**
- * Remove a socket and handler from the socket scheduler
+ * Mark a socket and handler for removal from the socket scheduler
  * @param sock pointer to socket entry
  */
 void
 olsr_socket_remove(struct olsr_socket_entry *entry)
 {
-  OLSR_DEBUG(LOG_SOCKET, "Removing OLSR socket entry %d\n", entry->fd);
+  OLSR_DEBUG(LOG_SOCKET, "Trigger removing OLSR socket entry %d\n", entry->fd);
 
   entry->process = NULL;
   entry->flags = 0;
@@ -158,7 +158,7 @@ olsr_socket_remove(struct olsr_socket_entry *entry)
 
 /**
  * Handle all incoming socket events until a certain time
- * @param next_interval
+ * @param until_time timestamp when the function should return
  * @return -1 if an error happened, 0 otherwise
  */
 int
index 0c2a91a..59f44ee 100644 (file)
@@ -67,15 +67,19 @@ static struct olsr_timer_info *connection_timeout;
 /* remember if initialized or not */
 OLSR_SUBSYSTEM_STATE(olsr_stream_state);
 
-static void olsr_stream_parse_request(int fd, void *data, unsigned int flags);
-static struct olsr_stream_session *olsr_stream_create_session(
+static void _parse_request(int fd, void *data, unsigned int flags);
+static struct olsr_stream_session *_create_session(
     struct olsr_stream_socket *comport, int sock, union netaddr_socket *remote_addr);
-static void olsr_stream_parse_connection(int fd, void *data,
+static void _parse_connection(int fd, void *data,
         enum olsr_sockethandler_flags flags);
-static void olsr_stream_remove_session(struct olsr_stream_session *con);
+static void _remove_session(struct olsr_stream_session *con);
 
-static void olsr_stream_timeout_handler(void *);
+static void _timeout_handler(void *);
 
+/**
+ * Initialize the stream socket handlers
+ * @return -1 if an error happened, 0 otherwise.
+ */
 int
 olsr_stream_init(void) {
   if (olsr_subsystem_init(&olsr_stream_state))
@@ -90,7 +94,7 @@ olsr_stream_init(void) {
   }
 
   connection_timeout = olsr_timer_add("stream socket timout",
-      &olsr_stream_timeout_handler, false);
+      &_timeout_handler, false);
   if (connection_timeout == NULL) {
     OLSR_WARN_OOM(LOG_SOCKET_STREAM);
     olsr_memcookie_remove(connection_cookie);
@@ -102,6 +106,9 @@ olsr_stream_init(void) {
   return 0;
 }
 
+/**
+ * Cleanup all resources allocated be stream socket handlers
+ */
 void
 olsr_stream_cleanup(void) {
   struct olsr_stream_socket *comport;
@@ -119,11 +126,21 @@ olsr_stream_cleanup(void) {
   olsr_timer_remove(connection_timeout);
 }
 
+/**
+ * Flush all data in outgoing buffer of a stream socket
+ * @param con pointer to stream socket
+ */
 void
 olsr_stream_flush(struct olsr_stream_session *con) {
   olsr_socket_enable(con->scheduler_entry, OLSR_SOCKET_WRITE);
 }
 
+/**
+ * Add a new stream socket to the scheduler
+ * @param comport pointer to uninitialized stream socket struct
+ * @param local pointer to local ip/port of socket
+ * @return -1 if an error happened, 0 otherwise
+ */
 int
 olsr_stream_add(struct olsr_stream_socket *comport,
     union netaddr_socket *local) {
@@ -134,30 +151,29 @@ olsr_stream_add(struct olsr_stream_socket *comport,
 
   memset(comport, 0, sizeof(*comport));
 
-  if (local) {
-    /* Init socket */
-    s = os_net_getsocket(local, OS_SOCKET_TCP, 0, LOG_SOCKET_STREAM);
-    if (s < 0) {
-      goto add_stream_error;
-    }
+  /* Init socket */
+  s = os_net_getsocket(local, OS_SOCKET_TCP, 0, LOG_SOCKET_STREAM);
+  if (s < 0) {
+    goto add_stream_error;
+  }
 
-    /* show that we are willing to listen */
-    if (listen(s, 1) == -1) {
-      OLSR_WARN(LOG_SOCKET_STREAM, "tcp socket listen failed for %s: %s (%d)\n",
-          netaddr_socket_to_string(&buf, local), strerror(errno), errno);
-      goto add_stream_error;
-    }
+  /* show that we are willing to listen */
+  if (listen(s, 1) == -1) {
+    OLSR_WARN(LOG_SOCKET_STREAM, "tcp socket listen failed for %s: %s (%d)\n",
+        netaddr_socket_to_string(&buf, local), strerror(errno), errno);
+    goto add_stream_error;
+  }
 
-    if ((comport->scheduler_entry = olsr_socket_add(s,
-        olsr_stream_parse_request, comport, OLSR_SOCKET_READ)) == NULL) {
-      OLSR_WARN(LOG_SOCKET_STREAM, "tcp socket hookup to scheduler failed for %s\n",
-          netaddr_socket_to_string(&buf, local));
-      goto add_stream_error;
-    }
-    memcpy(&comport->local_socket, local, sizeof(comport->local_socket));
+  if ((comport->scheduler_entry = olsr_socket_add(s,
+      _parse_request, comport, OLSR_SOCKET_READ)) == NULL) {
+    OLSR_WARN(LOG_SOCKET_STREAM, "tcp socket hookup to scheduler failed for %s\n",
+        netaddr_socket_to_string(&buf, local));
+    goto add_stream_error;
   }
+  memcpy(&comport->local_socket, local, sizeof(comport->local_socket));
+
   comport->memcookie = connection_cookie;
-  comport->allowes_sessions = 10;
+  comport->allowed_sessions = 10;
   comport->maximum_input_buffer = 65536;
 
   list_init_head(&comport->session);
@@ -183,7 +199,7 @@ olsr_stream_remove(struct olsr_stream_socket *comport) {
     comport = list_first_element(&olsr_stream_head, comport, node);
     while (!list_is_empty(&comport->session)) {
       session = list_first_element(&comport->session, session, node);
-      olsr_stream_remove_session(session);
+      _remove_session(session);
     }
 
     list_remove(&comport->node);
@@ -219,7 +235,7 @@ olsr_stream_connect_to(struct olsr_stream_socket *comport,
     wait_for_connect = true;
   }
 
-  session = olsr_stream_create_session(comport, s, remote);
+  session = _create_session(comport, s, remote);
   if (session) {
     session->wait_for_connect = wait_for_connect;
     return session;
@@ -234,7 +250,7 @@ connect_to_error:
 }
 
 static void
-olsr_stream_parse_request(int fd, void *data, unsigned int flags) {
+_parse_request(int fd, void *data, unsigned int flags) {
   struct olsr_stream_socket *comport;
   union netaddr_socket remote_addr;
   socklen_t addrlen;
@@ -253,11 +269,11 @@ olsr_stream_parse_request(int fd, void *data, unsigned int flags) {
     return;
   }
 
-  olsr_stream_create_session(comport, sock, &remote_addr);
+  _create_session(comport, sock, &remote_addr);
 }
 
 static struct olsr_stream_session *
-olsr_stream_create_session(struct olsr_stream_socket *comport,
+_create_session(struct olsr_stream_socket *comport,
     int sock, union netaddr_socket *remote_addr) {
   struct olsr_stream_session *session;
 #if !defined REMOVE_LOG_DEBUG
@@ -287,7 +303,7 @@ olsr_stream_create_session(struct olsr_stream_socket *comport,
   }
 
   if ((session->scheduler_entry = olsr_socket_add(sock,
-      &olsr_stream_parse_connection, session,
+      &_parse_connection, session,
       OLSR_SOCKET_READ | OLSR_SOCKET_WRITE)) == NULL) {
     OLSR_WARN(LOG_SOCKET_STREAM, "Cannot hook incoming session into scheduler");
     goto parse_request_error;
@@ -297,7 +313,7 @@ olsr_stream_create_session(struct olsr_stream_socket *comport,
   session->comport = comport;
   memcpy(&session->peer_addr, &remote_addr, sizeof(session->peer_addr));
 
-  if (comport->allowes_sessions-- > 0) {
+  if (comport->allowed_sessions-- > 0) {
     /* create active session */
     session->state = COMPORT_SESSION_ACTIVE;
   } else {
@@ -332,12 +348,12 @@ parse_request_error:
 }
 
 static void
-olsr_stream_remove_session(struct olsr_stream_session *session) {
+_remove_session(struct olsr_stream_session *session) {
   if (session->comport->cleanup) {
     session->comport->cleanup(session);
   }
 
-  session->comport->allowes_sessions++;
+  session->comport->allowed_sessions++;
   list_remove(&session->node);
 
   os_close(session->scheduler_entry->fd);
@@ -350,13 +366,13 @@ olsr_stream_remove_session(struct olsr_stream_session *session) {
 }
 
 static void
-olsr_stream_timeout_handler(void *data) {
+_timeout_handler(void *data) {
   struct olsr_stream_session *session = data;
-  olsr_stream_remove_session(session);
+  _remove_session(session);
 }
 
 static void
-olsr_stream_parse_connection(int fd, void *data,
+_parse_connection(int fd, void *data,
     enum olsr_sockethandler_flags flags) {
   struct olsr_stream_session *session;
   struct olsr_stream_socket *comport;
@@ -473,7 +489,7 @@ olsr_stream_parse_connection(int fd, void *data,
     /* clean up connection by calling cleanup directly */
     olsr_timer_stop(session->timeout);
     session->timeout = NULL;
-    olsr_stream_remove_session(session);
+    _remove_session(session);
   }
   return;
 }
index 5edfd8a..a0c0276 100644 (file)
@@ -60,6 +60,7 @@ enum olsr_stream_errors {
   SERVICE_UNAVAILABLE = 503
 };
 
+/* represents a TCP stream */
 struct olsr_stream_session {
   /*
    * public part of the session data
@@ -79,48 +80,95 @@ struct olsr_stream_session {
    * internal part of the server
    */
   struct list_entity node;
+
+  /* backpointer to the stream socket */
   struct olsr_stream_socket *comport;
 
+  /* scheduler handler for the session */
   struct olsr_socket_entry *scheduler_entry;
 
+  /* timer for handling session timeout */
   struct olsr_timer_entry *timeout;
+
+  /* input buffer for session */
   struct autobuf in;
-  bool send_first, wait_for_connect;
+
+  /*
+   * true if session user want to send before receiving anything. Will trigger
+   * an empty read even as soon as session is connected
+   */
+  bool send_first;
+
+  /* true if session is still waiting for initial handshake to finish */
+  bool wait_for_connect;
 
   enum olsr_stream_session_state state;
 };
 
+/*
+ * Represents a TCP server socket or a configuration for a set of outgoing
+ * TCP streams.
+ */
 struct olsr_stream_socket {
   struct list_entity node;
 
   union netaddr_socket local_socket;
 
   struct list_entity session;
-  int allowes_sessions;
 
+  /* number of simultaneous sessions (default 10) */
+  int allowed_sessions;
+
+  /* memory cookie to allocate struct for tcp session */
   struct olsr_memcookie_info *memcookie;
+
+  /*
+   * Timeout of the socket. A session will be closed if it does not
+   * send or receive data for timeout milliseconds.
+   */
   uint32_t session_timeout;
+
+  /* maximum allowed size of input buffer (default 65536) */
   size_t maximum_input_buffer;
+
+  /*
+   * true if the socket wants to send data before it receives anything.
+   * This will trigger an size 0 read event as soon as the socket is connected
+   */
   bool send_first;
 
-  /* NULL for outgoing streams */
+  /*
+   * represents the scheduler handler for the server socket,
+   * NULL for outgoing streams
+   */
   struct olsr_socket_entry *scheduler_entry;
 
+  /* Called when a new session is created */
   void (*init)(struct olsr_stream_session *);
+
+  /* Called when a TCP session ends */
   void (*cleanup)(struct olsr_stream_session *);
 
+  /*
+   * An error happened during parsing the TCP session,
+   * the user of the session might want to create an error message
+   */
   void (*create_error)(struct olsr_stream_session *, enum olsr_stream_errors);
+
+  /*
+   * Called when new data will be available in the input buffer
+   */
   enum olsr_stream_session_state (*receive_data)(struct olsr_stream_session *);
 };
 
 int olsr_stream_init(void) __attribute__((warn_unused_result));
 void olsr_stream_cleanup(void);
 
-int olsr_stream_add(struct olsr_stream_socket *,
+EXPORT int olsr_stream_add(struct olsr_stream_socket *,
     union netaddr_socket *local);
-void olsr_stream_remove(struct olsr_stream_socket *);
-struct olsr_stream_session *olsr_stream_connect_to(
+EXPORT void olsr_stream_remove(struct olsr_stream_socket *);
+EXPORT struct olsr_stream_session *olsr_stream_connect_to(
     struct olsr_stream_socket *, union netaddr_socket *remote);
-void olsr_stream_flush(struct olsr_stream_session *con);
+EXPORT void olsr_stream_flush(struct olsr_stream_session *con);
 
 #endif /* OLSR_STREAM_SOCKET_H_ */
index c375fa4..c1821c7 100644 (file)
@@ -250,7 +250,6 @@ olsr_timer_start(unsigned int rel_time,
  * Delete a timer.
  *
  * @param the olsr_timer_entry that shall be removed
- * @return nada
  */
 void
 olsr_timer_stop(struct olsr_timer_entry *timer)
@@ -351,38 +350,6 @@ olsr_timer_set(struct olsr_timer_entry **timer_ptr,
   }
 }
 
-/**
- * Decrement a relative timer by a random number range.
- *
- * @param the relative timer expressed in units of milliseconds.
- * @param the jitter in percent
- * @param cached result of random() at system init.
- * @return the absolute timer
- */
-static uint32_t
-calc_jitter(unsigned int rel_time, uint8_t jitter_pct, unsigned int random_val)
-{
-  unsigned int jitter_time;
-
-  /*
-   * No jitter or, jitter larger than 99% does not make sense.
-   * Also protect against overflows resulting from > 25 bit timers.
-   */
-  if (jitter_pct == 0 || jitter_pct > 99 || rel_time > (1 << 24)) {
-    return olsr_clock_get_absolute(rel_time);
-  }
-
-  /*
-   * Play some tricks to avoid overflows with integer arithmetic.
-   */
-  jitter_time = (jitter_pct * rel_time) / 100;
-  jitter_time = random_val / (1 + RAND_MAX / (jitter_time + 1));
-
-  OLSR_DEBUG(LOG_TIMER, "TIMER: jitter %u%% rel_time %ums to %ums\n", jitter_pct, rel_time, rel_time - jitter_time);
-
-  return olsr_clock_get_absolute(rel_time - jitter_time);
-}
-
 /**
  * Walk through the timer list and check if any timer is ready to fire.
  * Callback the provided function with the context pointer.
@@ -492,3 +459,35 @@ olsr_timer_walk(void)
    */
   timer_last_run = olsr_clock_getNow();
 }
+
+/**
+ * Decrement a relative timer by a random number range.
+ *
+ * @param the relative timer expressed in units of milliseconds.
+ * @param the jitter in percent
+ * @param cached result of random() at system init.
+ * @return the absolute timer
+ */
+static uint32_t
+calc_jitter(unsigned int rel_time, uint8_t jitter_pct, unsigned int random_val)
+{
+  unsigned int jitter_time;
+
+  /*
+   * No jitter or, jitter larger than 99% does not make sense.
+   * Also protect against overflows resulting from > 25 bit timers.
+   */
+  if (jitter_pct == 0 || jitter_pct > 99 || rel_time > (1 << 24)) {
+    return olsr_clock_get_absolute(rel_time);
+  }
+
+  /*
+   * Play some tricks to avoid overflows with integer arithmetic.
+   */
+  jitter_time = (jitter_pct * rel_time) / 100;
+  jitter_time = random_val / (1 + RAND_MAX / (jitter_time + 1));
+
+  OLSR_DEBUG(LOG_TIMER, "TIMER: jitter %u%% rel_time %ums to %ums\n", jitter_pct, rel_time, rel_time - jitter_time);
+
+  return olsr_clock_get_absolute(rel_time - jitter_time);
+}
index a9a6e51..5967170 100644 (file)
 #include "os_net.h"
 
 #if OS_NET_CONFIGSOCKET == OS_GENERIC
+/**
+ * Configure a network socket
+ * @param sock filedescriptor
+ * @param bindto ip/port to bind the socket to
+ * @param flags type of socket (udp/tcp, blocking, multicast)
+ * @param recvbuf size of input buffer for socket
+ * @param log_src logging source for error messages
+ * @return -1 if an error happened, 0 otherwise
+ */
 int
 os_net_configsocket(int sock, union netaddr_socket *bindto,
     enum olsr_socket_opt flags, int recvbuf,
@@ -125,6 +134,14 @@ os_net_configsocket(int sock, union netaddr_socket *bindto,
 #endif
 
 #if OS_NET_GETSOCKET == OS_GENERIC
+/**
+ * Creates a new socket and configures it
+ * @param bindto address to bind the socket to
+ * @param flags type of socket (udp/tcp, blocking, multicast)
+ * @param recvbuf size of input buffer for socket
+ * @param log_src logging source for error messages
+ * @return socket filedescriptor, -1 if an error happened
+ */
 int
 os_net_getsocket(union netaddr_socket *bindto,
     enum olsr_socket_opt flags, int recvbuf,
@@ -148,6 +165,14 @@ os_net_getsocket(union netaddr_socket *bindto,
 #endif
 
 #if OS_NET_JOINMCAST == OS_GENERIC
+/**
+ * Join a socket into a multicast group
+ * @param sock filedescriptor of socket
+ * @param multicast multicast ip/port to join
+ * @param oif pointer to outgoing interface for multicast
+ * @param log_src logging source for error messages
+ * @return -1 if an error happened, 0 otherwise
+ */
 int
 net_os_join_mcast(int sock, union netaddr_socket *multicast,
     struct olsr_interface *oif,
@@ -161,6 +186,7 @@ net_os_join_mcast(int sock, union netaddr_socket *multicast,
 
   if (multicast->std.sa_family == AF_INET) {
     if (!IN_MULTICAST(ntohl(multicast->v4.sin_addr.s_addr))) {
+      /* TODO: silent fail ? */
       return 0;
     }
 
@@ -227,6 +253,11 @@ net_os_join_mcast(int sock, union netaddr_socket *multicast,
 #endif
 
 #if OS_NET_SETNONBLOCK == OS_GENERIC
+/**
+ * Set a socket to non-blocking mode
+ * @param sock filedescriptor of socket
+ * @return -1 if an error happened, 0 otherwise
+ */
 int
 os_net_set_nonblocking(int sock) {
   int state;
@@ -244,6 +275,12 @@ os_net_set_nonblocking(int sock) {
 #endif
 
 #if OS_NET_BINDTOIF == OS_GENERIC
+/**
+ * Bind a socket to an interface. Filters out alias part of interface name.
+ * @param sock filedescriptor of socket
+ * @param if_name name of interface
+ * @return -1 if an error happened, 0 otherwise
+ */
 int
 os_net_bind_to_interface(int sock, const char *if_name) {
   char if_buf[IF_NAMESIZE];
index bbae8c3..5622ffb 100644 (file)
@@ -382,8 +382,11 @@ setup_signalhandler(void) {
  * @param argv argument vector
  * @param def_config default configuration file, NULL if
  *   no default config file should be loaded
- * @return -1 if olsrd should start, otherwise olsrd should exit
- *   with the returned number
+ * @param reload_only true if only the command line arguments should
+ *   be parsed that load a configuration (--set, --remove, --load,
+ *   and --format), false for normal full parsing.
+ * @return -1 if olsrd should start normally, otherwise olsrd should
+ *   exit with the returned number
  */
 static int
 parse_commandline(int argc, char **argv, bool reload_only) {