info: add request timeout configuration parameter
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 4 Jan 2017 08:09:51 +0000 (09:09 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 4 Jan 2017 08:47:11 +0000 (09:47 +0100)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/info/README_INFO
lib/info/info_types.h
lib/info/olsrd_info.c

index 77d0672..5318f7a 100644 (file)
@@ -101,6 +101,13 @@ LoadPlugin "an_info_plugin.so.0.0"
   #       by default.
   # Default: 1000
   # PlParam "cachetimeout"       "1000"
+
+  # The maximum time (in milliseconds) to wait for a request (data) to arrive
+  # after accepting a connection. When waiting for a request to arrive olsrd
+  # will not perform any other tasks (will block), therefore do not set this
+  # to a high value.
+  # Default: 20
+  # PlParam "requesttimeout"       "20"
 }
 
 
index 43f9f85..d1e592d 100644 (file)
@@ -53,6 +53,7 @@
 #include "common/autobuf.h"
 
 #define CACHE_TIMEOUT_DEFAULT 1000
+#define REQUEST_TIMEOUT_DEFAULT 20
 
 typedef struct {
     union olsr_ip_addr accept_ip;
@@ -62,6 +63,9 @@ typedef struct {
     bool allow_localhost;
     bool ipv6_only;
     long cache_timeout;
+    long request_timeout;
+    long request_timeout_sec; /* derived */
+    long request_timeout_usec; /* derived */
 } info_plugin_config_t;
 
 #define INFO_PLUGIN_CONFIG_PLUGIN_PARAMETERS(config) \
@@ -71,7 +75,8 @@ typedef struct {
   { .name = "httpheaders", .set_plugin_parameter = &set_plugin_boolean, .data = &config.http_headers }, \
   { .name = "allowlocalhost", .set_plugin_parameter = &set_plugin_boolean, .data = &config.allow_localhost }, \
   { .name = "ipv6only", .set_plugin_parameter = &set_plugin_boolean, .data = &config.ipv6_only },\
-  { .name = "cachetimeout", .set_plugin_parameter = &set_plugin_long, .data = &config.cache_timeout }
+  { .name = "cachetimeout", .set_plugin_parameter = &set_plugin_long, .data = &config.cache_timeout },\
+  { .name = "requesttimeout", .set_plugin_parameter = &set_plugin_long, .data = &config.request_timeout }
 
 /* these provide all of the runtime status info */
 #define SIW_NEIGHBORS                    (1ULL <<  0)
@@ -297,6 +302,7 @@ static INLINE void info_plugin_config_init(info_plugin_config_t *config, unsigne
   config->allow_localhost = false;
   config->ipv6_only = false;
   config->cache_timeout = CACHE_TIMEOUT_DEFAULT;
+  config->request_timeout = REQUEST_TIMEOUT_DEFAULT;
 }
 
 #endif /* _OLSRD_LIB_INFO_INFO_TYPES_H_ */
index 3dffbdd..81dc034 100644 (file)
@@ -759,8 +759,8 @@ static void ipc_action(int fd, void *data __attribute__ ((unused)), unsigned int
   }
 
   /* Wait at most this much time for the request to arrive on the connection */
-  timeout.tv_sec = 0;
-  timeout.tv_usec = (outbuffer.count >= MAX_CLIENTS) ? 0 : (20 * 1000); /* 20 msec */
+  timeout.tv_sec = (outbuffer.count >= MAX_CLIENTS) ? 0 : config->request_timeout_sec;
+  timeout.tv_usec = (outbuffer.count >= MAX_CLIENTS) ? 0 : config->request_timeout_usec;
 
   FD_ZERO(&read_fds);
 #ifndef _WIN32
@@ -1039,6 +1039,13 @@ static void info_sanitise_config(info_plugin_config_t *cfg) {
   if (cfg->ipc_port < 1) {
     cfg->ipc_port = 1;
   }
+
+  if (cfg->request_timeout < 0) {
+    cfg->request_timeout = 0;
+  }
+
+  cfg->request_timeout_sec = cfg->request_timeout / 1000;
+  cfg->request_timeout_usec = (cfg->request_timeout % 1000) * 1000;
 }
 
 int info_plugin_init(const char * plugin_name, info_plugin_functions_t *plugin_functions, info_plugin_config_t *plugin_config) {