Merge branch 'master' into scheduler_cleanup
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Thu, 17 Feb 2011 07:39:41 +0000 (08:39 +0100)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Thu, 17 Feb 2011 07:39:41 +0000 (08:39 +0100)
52 files changed:
lib/arprefresh/src/olsrd_arprefresh.c
lib/arproaming/src/olsrd_arproaming.c
lib/bmf/src/PacketHistory.c
lib/bmf/src/olsrd_plugin.c
lib/cl_roam/src/cl_roam.c
lib/debuginfo/src/olsrd_debuginfo.c
lib/dot_draw/src/olsrd_dot_draw.c
lib/dyn_gw/src/olsrd_dyn_gw.c
lib/dyn_gw_plain/src/olsrd_dyn_gw_plain.c
lib/httpinfo/src/olsrd_httpinfo.c
lib/lq_etx_ff/src/lq_plugin_etx_ff.c
lib/mdns/src/NetworkInterfaces.c
lib/mdns/src/olsrd_plugin.c
lib/nameservice/src/mapwrite.c
lib/nameservice/src/nameservice.c
lib/nameservice/src/nameservice.h
lib/obamp/src/obamp.c
lib/obamp/src/olsrd_plugin.c
lib/quagga/src/olsrd_plugin.c
lib/secure/src/olsrd_secure.c
lib/txtinfo/src/olsrd_txtinfo.c
lib/watchdog/src/olsrd_plugin.c
src/duplicate_set.c
src/duplicate_set.h
src/hna_set.c
src/hna_set.h
src/interfaces.c
src/interfaces.h
src/link_set.c
src/link_set.h
src/linux/kernel_routes.c
src/lq_mpr.c
src/main.c
src/mid_set.c
src/mid_set.h
src/neighbor_table.c
src/neighbor_table.h
src/net_olsr.c
src/olsr.c
src/olsr_comport.c
src/olsr_comport.h
src/olsr_comport_txt.c
src/olsr_socket.c [new file with mode: 0644]
src/olsr_socket.h [new file with mode: 0644]
src/olsr_spf.c
src/olsr_timer.c [moved from src/scheduler.c with 50% similarity]
src/olsr_timer.h [new file with mode: 0644]
src/scheduler.h [deleted file]
src/tc_set.c
src/tc_set.h
src/unix/ifnet.c
src/win32/ifnet.c

index d15b5fc..5514b38 100644 (file)
@@ -62,7 +62,8 @@
 #include <unistd.h>
 
 #include "olsrd_arprefresh.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "os_net.h"
 #include "olsr_logging.h"
 #include "olsr_cfg.h"
@@ -167,7 +168,7 @@ int
 olsrd_plugin_init(void)
 {
   int ret = 0;
-  arp_event_timer_info = olsr_alloc_timerinfo("Arprefresh: event", &olsr_arp_event, true);
+  arp_event_timer_info = olsr_timer_add("Arprefresh: event", &olsr_arp_event, true);
 
   if (AF_INET == olsr_cnf->ip_version) {
     struct sock_fprog filter;
@@ -197,7 +198,7 @@ olsrd_plugin_init(void)
         0 <= os_socket_set_nonblocking(arprefresh_sockfd) &&
         0 <= setsockopt(arprefresh_sockfd, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter))) {
       /* Register the ARP refresh event */
-      olsr_start_timer(2 * MSEC_PER_SEC, 0, NULL, arp_event_timer_info);
+      olsr_timer_start(2 * MSEC_PER_SEC, 0, NULL, arp_event_timer_info);
       ret = 1;
     } else {
       OLSR_WARN(LOG_PLUGINS, "*** ARPREFRESH: Cannot create non-blocking filtering packet socket: %s\n", strerror(errno));
index fad0ac4..00dddb1 100644 (file)
@@ -52,7 +52,8 @@
 #include "defs.h"
 #include "olsr_types.h"
 #include "olsr_logging.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "plugin_util.h"
 #include "olsr_ip_prefix_list.h"
 #include "net_olsr.h"
@@ -84,7 +85,7 @@ struct arproaming_nodes {
 };
 
 static struct olsr_timer_info *timer_info;
-static struct timer_entry *event_timer;
+static struct olsr_timer_entry *event_timer;
 
 static char arproaming_parameter_interface[25];
 static int arproaming_parameter_timeout;
@@ -403,8 +404,8 @@ arproaming_init(void)
 
        arproaming_systemconf(arproaming_socketfd_system);
 
-  timer_info = olsr_alloc_timerinfo("arproaming", &arproaming_schedule_event, true);
-  event_timer = olsr_start_timer(MSEC_PER_SEC/3, 0, NULL, timer_info);
+  timer_info = olsr_timer_add("arproaming", &arproaming_schedule_event, true);
+  event_timer = olsr_timer_start(MSEC_PER_SEC/3, 0, NULL, timer_info);
 
        close(arproaming_socketfd_system);
        return 0;
@@ -413,7 +414,7 @@ arproaming_init(void)
 static int
 arproaming_exit(void)
 {
-  olsr_stop_timer(event_timer);
+  olsr_timer_stop(event_timer);
 
        if (arproaming_socketfd_netlink >= 0) {
                OLSR_DEBUG(LOG_PLUGINS, "[ARPROAMING] Closing netlink socket.\n");
index f2d596f..e49fe24 100644 (file)
@@ -52,7 +52,8 @@
 /* OLSRD includes */
 #include "defs.h"               /* GET_TIMESTAMP, TIMED_OUT */
 #include "olsr.h"
-#include "scheduler.h"          /* now_times */
+#include "olsr_timer.h"
+#include "olsr_socket.h"          /* now_times */
 
 /* Plugin includes */
 #include "Packet.h"
@@ -247,7 +248,7 @@ CheckAndMarkRecentPacket(u_int32_t crc32)
       /* Found duplicate entry */
 
       /* Always mark as "seen recently": refresh time-out */
-      walker->timeOut = GET_TIMESTAMP(HISTORY_HOLD_TIME);
+      walker->timeOut = olsr_timer_getAbsolute(HISTORY_HOLD_TIME);
 
       return 1;
     }                           /* if */
@@ -257,7 +258,7 @@ CheckAndMarkRecentPacket(u_int32_t crc32)
   newEntry = malloc(sizeof(struct TDupEntry));
   if (newEntry != NULL) {
     newEntry->crc32 = crc32;
-    newEntry->timeOut = GET_TIMESTAMP(HISTORY_HOLD_TIME);
+    newEntry->timeOut = olsr_timer_getAbsolute(HISTORY_HOLD_TIME);
 
     /* Add new entry at the front of the list */
     newEntry->next = PacketHistory[idx];
@@ -287,7 +288,7 @@ PrunePacketHistory(void *useless __attribute__ ((unused)))
         struct TDupEntry *entry = nextEntry;
         nextEntry = entry->next;
 
-        if (TIMED_OUT(entry->timeOut)) {
+        if (olsr_timer_isTimedOut(entry->timeOut)) {
           /* De-queue */
           if (prevEntry != NULL) {
             prevEntry->next = entry->next;
index 53b9140..2506b5a 100644 (file)
@@ -46,7 +46,8 @@
 #include "plugin.h"
 #include "plugin_util.h"
 #include "defs.h"               /* uint8_t, olsr_cnf */
-#include "scheduler.h"          /* olsr_start_timer() */
+#include "olsr_timer.h"
+#include "olsr_socket.h"          /* olsr_timer_start() */
 #include "olsr_cfg.h"           /* olsr_cnf() */
 #include "olsr_memcookie.h"        /* olsr_memcookie_add() */
 #include "olsr_logging.h"
@@ -106,10 +107,10 @@ olsrd_plugin_init(void)
 
   /* create the cookie */
   prune_packet_history_timer_info =
-      olsr_alloc_timerinfo("BMF: Prune Packet History", &PrunePacketHistory, true);
+      olsr_timer_add("BMF: Prune Packet History", &PrunePacketHistory, true);
 
   /* Register the duplicate registration pruning process */
-  olsr_start_timer(3 * MSEC_PER_SEC, 0, NULL, prune_packet_history_timer_info);
+  olsr_timer_start(3 * MSEC_PER_SEC, 0, NULL, prune_packet_history_timer_info);
 
 
   return InitBmf(NULL);
index 3f51922..59cc6c1 100644 (file)
@@ -41,7 +41,8 @@
 #include "cl_roam.h"
 #include "olsr_types.h"
 #include "ipcalc.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "olsr.h"
 #include "olsr_memcookie.h"
 #include "olsr_ip_prefix_list.h"
@@ -102,7 +103,7 @@ struct guest_client {
   pthread_t ping_thread_add;
   struct olsr_memcookie_info *arping_timer_cookie;
   char ping_thread_done;
-  struct timer_entry *arping_timer;
+  struct olsr_timer_entry *arping_timer;
   int remaing_announcements;
   //who is in charge of this client
   union olsr_ip_addr master_ip;
@@ -315,13 +316,13 @@ int olsrd_plugin_init(void) {
   has_inet_gateway = 0;
 
   /* create the cookie */
-  event_timer_info1 = olsr_alloc_timerinfo("cl roam: Event1", &olsr_event1, true);
-  event_timer_info2 = olsr_alloc_timerinfo("cl roam: Event2", &olsr_event2, true);
-  arping_timer_info = olsr_alloc_timerinfo("cl roam: Maybe add something", &check_ping_result, true);
+  event_timer_info1 = olsr_timer_add("cl roam: Event1", &olsr_event1, true);
+  event_timer_info2 = olsr_timer_add("cl roam: Event2", &olsr_event2, true);
+  arping_timer_info = olsr_timer_add("cl roam: Maybe add something", &check_ping_result, true);
 
   /* Register the GW check */
-  olsr_start_timer(1 * MSEC_PER_SEC, 0, NULL, event_timer_info1);
-  olsr_start_timer(20 * MSEC_PER_SEC, 0, NULL, event_timer_info2);
+  olsr_timer_start(1 * MSEC_PER_SEC, 0, NULL, event_timer_info1);
+  olsr_timer_start(20 * MSEC_PER_SEC, 0, NULL, event_timer_info2);
 
   /* register functions with olsrd */
   // somehow my cool new message.....
@@ -382,7 +383,7 @@ static void check_ping_result(void *foo) {
     /* should be same size as (void*) */
     ssize_t ping_res;
 
-    olsr_stop_timer(host->arping_timer);
+    olsr_timer_stop(host->arping_timer);
     pthread_join(host->ping_thread_add, (void*) &ping_res);
     host->arping_timer = NULL;
     host->ping_thread_done = 0;
@@ -423,7 +424,7 @@ static void check_for_route(struct guest_client * host) {
     //printf("maybe add something\n");
     if (host->arping_timer_cookie == NULL)
     //printf("timer started\n");
-    host->arping_timer = olsr_start_timer(250, 5, host, arping_timer_info);
+    host->arping_timer = olsr_timer_start(250, 5, host, arping_timer_info);
     rc = pthread_create(&(host->ping_thread_add), NULL, ping_thread, (void *) host);
   } else if ((host->last_seen > 60.0) && host->is_announced) {
     char route_command[50];
index 3a501c8..a053664 100644 (file)
@@ -228,8 +228,8 @@ debuginfo_enable(void)
     commands[i].cmd->acl = &allowed_nets;
   }
 
-  statistics_timer = olsr_alloc_timerinfo("debuginfo timer", &update_statistics_ptr, true);
-  olsr_start_timer(traffic_interval * 1000, 0, NULL, statistics_timer);
+  statistics_timer = olsr_timer_add("debuginfo timer", &update_statistics_ptr, true);
+  olsr_timer_start(traffic_interval * 1000, 0, NULL, statistics_timer);
 
   statistics_msg_mem = olsr_memcookie_add("debuginfo msgstat",
       sizeof(struct debug_msgtraffic) + sizeof(struct debug_msgtraffic_count) * traffic_slots);
index f37cf6b..edf37b9 100644 (file)
@@ -200,7 +200,7 @@ dotdraw_enable(void) {
 #if defined __FreeBSD__ && defined SO_NOSIGPIPE
   if (setsockopt(ipc_socket, SOL_SOCKET, SO_NOSIGPIPE, (char *)&yes, sizeof(yes)) < 0) {
     OLSR_WARN(LOG_PLUGINS, "SO_REUSEADDR failed %s\n", strerror(errno));
-    CLOSESOCKET(ipc_socket);
+    os_close(ipc_socket);
     return 1;
   }
 #endif
@@ -228,7 +228,11 @@ dotdraw_enable(void) {
   }
 
   /* Register socket with olsrd */
-  add_olsr_socket(ipc_socket, &ipc_action, NULL, NULL, SP_PR_READ);
+  if (NULL == olsr_socket_add(ipc_socket, &ipc_action, NULL, OLSR_SOCKET_READ)) {
+    OLSR_WARN(LOG_PLUGINS, "(DOT DRAW)Could not register socket with scheduler\n");
+    os_close(ipc_socket);
+    return 1;
+  }
 
   return 0;
 }
index b2c420a..1a3ed43 100644 (file)
@@ -48,7 +48,8 @@
 #include "olsr.h"
 #include "defs.h"
 #include "ipcalc.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "olsr_memcookie.h"
 #include "olsr_ip_prefix_list.h"
 #include "olsr_logging.h"
@@ -223,10 +224,10 @@ olsrd_plugin_init(void)
   pthread_create(&ping_thread, NULL, (void *(*)(void *))looped_checks, NULL);
 
   /* create the cookie */
-  doing_hna_timer_info = olsr_alloc_timerinfo("DynGW: Doing HNS", &olsr_event_doing_hna, true);
+  doing_hna_timer_info = olsr_timer_add("DynGW: Doing HNS", &olsr_event_doing_hna, true);
 
   /* Register the GW check */
-  olsr_start_timer(3 * MSEC_PER_SEC, 0, NULL, doing_hna_timer_info);
+  olsr_timer_start(3 * MSEC_PER_SEC, 0, NULL, doing_hna_timer_info);
 
   return 1;
 }
index 30b0b45..8a688a9 100644 (file)
@@ -42,7 +42,8 @@
 #include "olsrd_dyn_gw_plain.h"
 #include "olsr_types.h"
 #include "ipcalc.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "olsr.h"
 #include "olsr_memcookie.h"
 #include "olsr_ip_prefix_list.h"
@@ -102,10 +103,10 @@ olsrd_plugin_init(void)
   }
 
   /* create the cookie */
-  event_timer_info = olsr_alloc_timerinfo("DynGW Plain: Event", &olsr_event, true);
+  event_timer_info = olsr_timer_add("DynGW Plain: Event", &olsr_event, true);
 
   /* Register the GW check */
-  olsr_start_timer(3 * MSEC_PER_SEC, 0, NULL, event_timer_info);
+  olsr_timer_start(3 * MSEC_PER_SEC, 0, NULL, event_timer_info);
 
   return 1;
 }
index 731f94e..07fb5cb 100644 (file)
@@ -329,7 +329,7 @@ olsrd_plugin_init(void)
 
   if (http_socket < 0) {
     OLSR_ERROR(LOG_PLUGINS, "(HTTPINFO) could not initialize HTTP socket\n");
-    olsr_exit(0);
+    olsr_exit(1);
   }
 
   /* always allow localhost */
@@ -344,7 +344,10 @@ olsrd_plugin_init(void)
   }
 
   /* Register socket */
-  add_olsr_socket(http_socket, &parse_http_request, NULL, NULL, SP_PR_READ);
+  if (NULL == olsr_socket_add(http_socket, &parse_http_request, NULL, OLSR_SOCKET_READ)) {
+    OLSR_ERROR(LOG_PLUGINS, "(HTTPINFO) Could not register socket with scheduler\n");
+    olsr_exit(1);
+  }
 
   return 1;
 }
index e2dce90..9880302 100644 (file)
@@ -48,7 +48,8 @@
 #include "lq_plugin_etx_ff.h"
 #include "parser.h"
 #include "mid_set.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "olsr_logging.h"
 #include "common/string.h"
 #include "neighbor_table.h"
@@ -264,21 +265,21 @@ lq_etxff_timer(void __attribute__ ((unused)) * context)
   }
 }
 
-static struct timer_entry *lq_etxff_timer_struct = NULL;
+static struct olsr_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_info = olsr_alloc_timerinfo("Default Freifunk LQ",  &lq_etxff_timer, true);
-  lq_etxff_timer_struct = olsr_start_timer(1000, 0, NULL, default_lq_ff_timer_info);
+  default_lq_ff_timer_info = olsr_timer_add("Default Freifunk LQ",  &lq_etxff_timer, true);
+  lq_etxff_timer_struct = olsr_timer_start(1000, 0, NULL, default_lq_ff_timer_info);
 }
 
 static void
 lq_etxff_deinitialize(void)
 {
-  olsr_stop_timer(lq_etxff_timer_struct);
+  olsr_timer_stop(lq_etxff_timer_struct);
   olsr_packetparser_remove_function(&lq_etxff_packet_parser);
 }
 
index a7403b5..9c00150 100644 (file)
@@ -162,7 +162,11 @@ CreateCaptureSocket(const char *ifName)
     return -1;
   }
   //AddDescriptorToInputSet(skfd);
-  add_olsr_socket(skfd, &DoMDNS, NULL, NULL, SP_PR_READ);
+  if (NULL == olsr_socket_add(skfd, &DoMDNS, NULL, OLSR_SOCKET_READ)) {
+    BmfPError("Cannot bind socket to scheduler");
+    close(skfd);
+    return -1;
+  }
 
   return skfd;
 }                               /* CreateCaptureSocket */
index dcd7a33..02ac122 100644 (file)
@@ -46,7 +46,8 @@
 #include "plugin.h"
 #include "plugin_util.h"
 #include "defs.h"               /* uint8_t, olsr_cnf */
-#include "scheduler.h"          /* olsr_start_timer() */
+#include "olsr_timer.h"
+#include "olsr_socket.h"          /* olsr_timer_start() */
 #include "olsr_cfg.h"           /* olsr_cnf() */
 #include "olsr_memcookie.h"        /* olsr_memcookie_add() */
 
@@ -100,7 +101,7 @@ olsrd_plugin_init(void)
   //prune_packet_history_timer_cookie = olsr_memcookie_add("BMF: Prune Packet History", OLSR_COOKIE_TYPE_TIMER);
 
   /* Register the duplicate registration pruning process */
-  //olsr_start_timer(3 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC,
+  //olsr_timer_start(3 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC,
   //                 &PrunePacketHistory, NULL, prune_packet_history_timer_cookie->ci_id);
 
 
index 62ad50f..06459a3 100644 (file)
@@ -49,7 +49,8 @@
 #include <sys/stat.h>
 
 #include "defs.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "nameservice.h"
 #include "mid_set.h"
 #include "tc_set.h"
@@ -233,8 +234,8 @@ mapwrite_init(const char *fifoname)
       OLSR_WARN(LOG_PLUGINS, "mkfifo(%s): %s", fifoname, strerror(errno));
       return false;
     } else {
-      map_poll_timer_info = olsr_alloc_timerinfo("Nameservice: mapwrite", &mapwrite_poll, true);
-      olsr_start_timer(800, 5, NULL, map_poll_timer_info);
+      map_poll_timer_info = olsr_timer_add("Nameservice: mapwrite", &mapwrite_poll, true);
+      olsr_timer_start(800, 5, NULL, map_poll_timer_info);
     }
   }
   return true;
index 77052ec..edb3486 100644 (file)
@@ -61,7 +61,8 @@
 #include "net_olsr.h"
 #include "routing_table.h"
 #include "olsr_time.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "parser.h"
 #include "duplicate_set.h"
 #include "tc_set.h"
@@ -126,10 +127,10 @@ struct list_entity latlon_list[HASHSIZE];
 static bool latlon_table_changed = true;
 
 /* backoff timer for writing changes into a file */
-struct timer_entry *write_file_timer = NULL;
+struct olsr_timer_entry *write_file_timer = NULL;
 
 /* periodic message generation */
-struct timer_entry *msg_gen_timer = NULL;
+struct olsr_timer_entry *msg_gen_timer = NULL;
 
 /* regular expression to be matched by valid hostnames, compiled in name_init() */
 static regex_t regex_t_name;
@@ -201,11 +202,11 @@ name_constructor(void)
   }
 
   msg_gen_timer_cookie =
-      olsr_alloc_timerinfo("Nameservice: message gen", &olsr_namesvc_gen, true);
+      olsr_timer_add("Nameservice: message gen", &olsr_namesvc_gen, true);
   write_file_timer_cookie =
-      olsr_alloc_timerinfo("Nameservice: write file", &olsr_expire_write_file_timer, false);
+      olsr_timer_add("Nameservice: write file", &olsr_expire_write_file_timer, false);
   db_timer_cookie =
-      olsr_alloc_timerinfo("Nameservice: DB", &olsr_nameservice_expire_db_timer, false);
+      olsr_timer_add("Nameservice: DB", &olsr_nameservice_expire_db_timer, false);
 }
 
 
@@ -427,7 +428,7 @@ name_init(void)
   olsr_parser_add_function(&olsr_parser, PARSER_TYPE);
 
   /* periodic message generation */
-  msg_gen_timer = olsr_start_timer(my_interval * MSEC_PER_SEC, EMISSION_JITTER,
+  msg_gen_timer = olsr_timer_start(my_interval * MSEC_PER_SEC, EMISSION_JITTER,
                                    NULL, msg_gen_timer_cookie);
 
   mapwrite_init(my_latlon_file);
@@ -511,9 +512,9 @@ name_destructor(void)
   free_all_listold_entries(forwarder_list);
   free_all_listold_entries(latlon_list);
 
-  olsr_stop_timer(write_file_timer);
+  olsr_timer_stop(write_file_timer);
   write_file_timer = NULL;
-  olsr_stop_timer(msg_gen_timer);
+  olsr_timer_stop(msg_gen_timer);
   msg_gen_timer = NULL;
 
   regfree(&regex_t_name);
@@ -569,7 +570,7 @@ olsr_start_write_file_timer(void)
     return;
   }
 
-  write_file_timer = olsr_start_timer(5 * MSEC_PER_SEC, 5, NULL, write_file_timer_cookie);
+  write_file_timer = olsr_timer_start(5 * MSEC_PER_SEC, 5, NULL, write_file_timer_cookie);
 }
 
 /*
@@ -584,7 +585,7 @@ olsr_namesvc_delete_db_entry(struct db_entry *db)
   OLSR_DEBUG(LOG_PLUGINS, "NAME PLUGIN: %s timed out... deleting\n", olsr_ip_to_string(&strbuf, &db->originator));
 
   olsr_start_write_file_timer();
-  olsr_stop_timer(db->db_timer);        /* stop timer if running */
+  olsr_timer_stop(db->db_timer);        /* stop timer if running */
   db->db_timer = NULL;
 
   /* Delete */
@@ -953,7 +954,7 @@ insert_new_name_in_list(union olsr_ip_addr *originator,
       //delegate to function for parsing the packet and linking it to entry->names
       decap_namemsg(from_packet, &entry->names, this_table_changed);
 
-      olsr_set_timer(&entry->db_timer, vtime,
+      olsr_timer_set(&entry->db_timer, vtime,
                      OLSR_NAMESVC_DB_JITTER, entry, db_timer_cookie);
 
       entry_found = true;
@@ -972,7 +973,7 @@ insert_new_name_in_list(union olsr_ip_addr *originator,
 
     entry->originator = *originator;
 
-    olsr_set_timer(&entry->db_timer, vtime,
+    olsr_timer_set(&entry->db_timer, vtime,
                    OLSR_LINK_LOSS_JITTER, entry, db_timer_cookie);
 
     entry->names = NULL;
index 2e6db22..718af19 100644 (file)
@@ -109,7 +109,7 @@ struct name_entry {
  * */
 struct db_entry {
   union olsr_ip_addr originator;       /* IP address of the node this entry describes */
-  struct timer_entry *db_timer;        /* Validity time */
+  struct olsr_timer_entry *db_timer;        /* Validity time */
   struct name_entry *names;            /* list of names this originator declares */
   struct list_entity db_list;            /* linked list of db entries per hash container */
 };
index 82e1206..3798775 100644 (file)
@@ -234,7 +234,11 @@ CreateCaptureSocket(const char *ifName)
     return -1;
   }
 
-  add_olsr_socket(skfd, &EncapFlowInObamp, NULL, NULL, SP_PR_READ);
+  if (NULL == olsr_socket_add(skfd, &EncapFlowInObamp, NULL, OLSR_SOCKET_READ)) {
+    OLSR_DEBUG(LOG_PLUGINS, "Could not register socket with scheduler");
+    close(skfd);
+    return -1;
+  }
 
   return skfd;
 }                               /* CreateCaptureSocket */
@@ -715,7 +719,7 @@ UdpServer(void)
     return (-1);
   }
 
-  add_olsr_socket(sdudp, &ObampSignalling, NULL, NULL, SP_PR_READ);
+  olsr_socket_add(sdudp, &ObampSignalling, NULL, OLSR_SOCKET_READ);
 
   return 0;
 
@@ -1590,12 +1594,12 @@ InitOBAMP(void)
 
 //Structs necessary for timers
 
-  struct timer_entry *OBAMP_alive_timer;
-  struct timer_entry *purge_nodes_timer;
-  struct timer_entry *mesh_create_timer;
-  struct timer_entry *tree_create_timer;
-  struct timer_entry *outer_tree_create_timer;
-  struct timer_entry *unsolicited_tree_destroy_timer;
+  struct olsr_timer_entry *OBAMP_alive_timer;
+  struct olsr_timer_entry *purge_nodes_timer;
+  struct olsr_timer_entry *mesh_create_timer;
+  struct olsr_timer_entry *tree_create_timer;
+  struct olsr_timer_entry *outer_tree_create_timer;
+  struct olsr_timer_entry *unsolicited_tree_destroy_timer;
 
 
 
@@ -1632,17 +1636,17 @@ InitOBAMP(void)
 
 //OLSR cookies stuff for timers
   OBAMP_alive_gen_timer_cookie =
-      olsr_alloc_timerinfo("OBAMP Alive Generation", &obamp_alive_gen, true);
+      olsr_timer_add("OBAMP Alive Generation", &obamp_alive_gen, true);
   purge_nodes_timer_cookie =
-      olsr_alloc_timerinfo("purge nodes Generation", &purge_nodes, true);
+      olsr_timer_add("purge nodes Generation", &purge_nodes, true);
   mesh_create_timer_cookie =
-      olsr_alloc_timerinfo("mesh create Generation", &mesh_create, true);
+      olsr_timer_add("mesh create Generation", &mesh_create, true);
   tree_create_timer_cookie =
-      olsr_alloc_timerinfo("tree create Generation", &tree_create, true);
+      olsr_timer_add("tree create Generation", &tree_create, true);
   outer_tree_create_timer_cookie =
-      olsr_alloc_timerinfo("outer tree create Generation", &outer_tree_create, true);
+      olsr_timer_add("outer tree create Generation", &outer_tree_create, true);
   unsolicited_tree_destroy_timer_cookie =
-      olsr_alloc_timerinfo("tree destroy Generation", &unsolicited_tree_destroy, true);
+      olsr_timer_add("tree destroy Generation", &unsolicited_tree_destroy, true);
 
 
 //Tells OLSR to launch olsr_parser when the packets for this plugin arrive
@@ -1650,32 +1654,32 @@ InitOBAMP(void)
 
 // start to send alive messages to appear in other joined lists
   OBAMP_alive_timer =
-    olsr_start_timer(OBAMP_ALIVE_EIVAL * MSEC_PER_SEC, OBAMP_JITTER, NULL,
+    olsr_timer_start(OBAMP_ALIVE_EIVAL * MSEC_PER_SEC, OBAMP_JITTER, NULL,
                      OBAMP_alive_gen_timer_cookie);
 
 // start timer to purge nodes from list in softstate fashion
   purge_nodes_timer =
-    olsr_start_timer(_Texpire_timer_ * MSEC_PER_SEC, OBAMP_JITTER, NULL,
+    olsr_timer_start(_Texpire_timer_ * MSEC_PER_SEC, OBAMP_JITTER, NULL,
                      purge_nodes_timer_cookie);
 
 //start timer to create mesh
   mesh_create_timer =
-    olsr_start_timer(OBAMP_MESH_CREATE_IVAL * MSEC_PER_SEC, OBAMP_JITTER, NULL,
+    olsr_timer_start(OBAMP_MESH_CREATE_IVAL * MSEC_PER_SEC, OBAMP_JITTER, NULL,
                      mesh_create_timer_cookie);
 
 //start timer for tree create procedure
   tree_create_timer =
-    olsr_start_timer(OBAMP_TREE_CREATE_IVAL * MSEC_PER_SEC, OBAMP_JITTER, NULL,
+    olsr_timer_start(OBAMP_TREE_CREATE_IVAL * MSEC_PER_SEC, OBAMP_JITTER, NULL,
                      tree_create_timer_cookie);
 
 //start timer for tree create procedure
   outer_tree_create_timer =
-    olsr_start_timer(OBAMP_OUTER_TREE_CREATE_IVAL * MSEC_PER_SEC, OBAMP_JITTER, NULL,
+    olsr_timer_start(OBAMP_OUTER_TREE_CREATE_IVAL * MSEC_PER_SEC, OBAMP_JITTER, NULL,
                      tree_create_timer_cookie);
 
 //start timer for tree create procedure
   unsolicited_tree_destroy_timer =
-    olsr_start_timer(30 * MSEC_PER_SEC, OBAMP_JITTER, NULL,
+    olsr_timer_start(30 * MSEC_PER_SEC, OBAMP_JITTER, NULL,
                      unsolicited_tree_destroy_timer_cookie);
 
 //Create udp server socket for OBAMP signalling and register it to the scheduler
index a4b0508..03f1b50 100644 (file)
@@ -50,7 +50,8 @@
 #include "plugin_loader.h"
 #include "plugin_util.h"
 #include "defs.h"               /* uint8_t, olsr_cnf */
-#include "scheduler.h"          /* olsr_start_timer() */
+#include "olsr_timer.h"
+#include "olsr_socket.h"          /* olsr_timer_start() */
 #include "olsr_cfg.h"           /* olsr_cnf() */
 #include "olsr_memcookie.h"        /* olsr_memcookie_add() */
 
index b732818..5bedb6f 100644 (file)
@@ -24,7 +24,8 @@
 
 #include "plugin.h"
 #include "plugin_util.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "defs.h"
 #include "quagga.h"
 #include "net_olsr.h"
@@ -138,9 +139,9 @@ olsrd_plugin_init(void)
     return 1;
   }
 
-  event_timer_info = olsr_alloc_timerinfo("Quagga: Event", &zebra_parse, true);
+  event_timer_info = olsr_timer_add("Quagga: Event", &zebra_parse, true);
 
-  olsr_start_timer(1 * MSEC_PER_SEC, 0, NULL, event_timer_info);
+  olsr_timer_start(1 * MSEC_PER_SEC, 0, NULL, event_timer_info);
 
   return 0;
 }
index 22173f3..968ce3a 100644 (file)
@@ -60,7 +60,8 @@
 #include "ipcalc.h"
 #include "olsr.h"
 #include "parser.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "net_olsr.h"
 #include "common/string.h"
 #include "olsr_logging.h"
@@ -204,10 +205,10 @@ secure_plugin_init(void)
   olsr_preprocessor_add_function(&secure_preprocessor);
 
   /* create the cookie */
-  timeout_timestamps_timer_info = olsr_alloc_timerinfo("Secure: Timeout Timestamps", &timeout_timestamps, true);
+  timeout_timestamps_timer_info = olsr_timer_add("Secure: Timeout Timestamps", &timeout_timestamps, true);
 
   /* Register timeout - poll every 2 seconds */
-  olsr_start_timer(2 * MSEC_PER_SEC, 0, NULL, timeout_timestamps_timer_info);
+  olsr_timer_start(2 * MSEC_PER_SEC, 0, NULL, timeout_timestamps_timer_info);
 
   return 1;
 }
@@ -556,7 +557,7 @@ check_timestamp(struct interface *olsr_if_config, const union olsr_ip_addr *orig
 
   /* update validtime */
 
-  entry->valtime = GET_TIMESTAMP(TIMESTAMP_HOLD_TIME * 1000);
+  entry->valtime = olsr_timer_getAbsolute(TIMESTAMP_HOLD_TIME * 1000);
 
   return 1;
 }
@@ -632,7 +633,7 @@ send_challenge(struct interface *olsr_if_config, const union olsr_ip_addr *new_h
   memcpy(&entry->addr, new_host, olsr_cnf->ipsize);
 
   /* update validtime - not validated */
-  entry->conftime = GET_TIMESTAMP(EXCHANGE_HOLD_TIME * 1000);
+  entry->conftime = olsr_timer_getAbsolute(EXCHANGE_HOLD_TIME * 1000);
 
   hash = olsr_ip_hashing(new_host);
 
@@ -729,7 +730,7 @@ parse_cres(struct interface *olsr_if_config, uint8_t *in_msg)
   entry->diff = now.tv_sec - msg->timestamp;
 
   /* update validtime - validated entry */
-  entry->valtime = GET_TIMESTAMP(TIMESTAMP_HOLD_TIME * 1000);
+  entry->valtime = olsr_timer_getAbsolute(TIMESTAMP_HOLD_TIME * 1000);
 
   OLSR_DEBUG(LOG_PLUGINS, "[ENC]%s registered with diff %d!\n",
              olsr_ip_to_string(&buf, (union olsr_ip_addr *)&msg->originator), entry->diff);
@@ -821,7 +822,7 @@ parse_rres(uint8_t *in_msg)
   entry->diff = now.tv_sec - msg->timestamp;
 
   /* update validtime - validated entry */
-  entry->valtime = GET_TIMESTAMP(TIMESTAMP_HOLD_TIME * 1000);
+  entry->valtime = olsr_timer_getAbsolute(TIMESTAMP_HOLD_TIME * 1000);
 
   OLSR_DEBUG(LOG_PLUGINS, "[ENC]%s registered with diff %d!\n",
              olsr_ip_to_string(&buf, (union olsr_ip_addr *)&msg->originator), entry->diff);
@@ -865,7 +866,7 @@ parse_challenge(struct interface *olsr_if_config, uint8_t *in_msg)
     entry->prev = &timestamps[hash];
   } else {
     /* Check configuration timeout */
-    if (!TIMED_OUT(entry->conftime)) {
+    if (!olsr_timer_isTimedOut(entry->conftime)) {
       /* If registered - do not accept! */
       OLSR_DEBUG(LOG_PLUGINS, "[ENC]Challenge from registered node...dropping!\n");
       return 0;
@@ -901,7 +902,7 @@ parse_challenge(struct interface *olsr_if_config, uint8_t *in_msg)
   entry->validated = 0;
 
   /* update validtime - not validated */
-  entry->conftime = GET_TIMESTAMP(EXCHANGE_HOLD_TIME * 1000);
+  entry->conftime = olsr_timer_getAbsolute(EXCHANGE_HOLD_TIME * 1000);
 
   /* Build and send response */
 
@@ -1116,7 +1117,7 @@ timeout_timestamps(void *foo __attribute__ ((unused)))
     /*Traverse MID list */
     while (tmp_list != &timestamps[idx]) {
       /*Check if the entry is timed out */
-      if ((TIMED_OUT(tmp_list->valtime)) && (TIMED_OUT(tmp_list->conftime))) {
+      if ((olsr_timer_isTimedOut(tmp_list->valtime)) && (olsr_timer_isTimedOut(tmp_list->conftime))) {
 #if !defined REMOVE_LOG_DEBUG
         struct ipaddr_str buf;
 #endif
index cbae295..c1743ee 100644 (file)
@@ -432,7 +432,7 @@ txtinfo_link(struct comport_connection *con,
     olsr_ip_to_string(&buf_neighip, &lnk->neighbor_iface_addr);
     strscpy(buf_sym, lnk->status == SYM_LINK ? OLSR_YES : OLSR_NO, sizeof(buf_sym));
     strscpy(buf_mrp, lnk->is_mpr ? OLSR_YES : OLSR_NO, sizeof(buf_mrp));
-    olsr_milli_to_txt(&buf_vtime, lnk->link_sym_timer == NULL ? 0 : lnk->link_sym_timer->timer_clock - now_times);
+    olsr_milli_to_txt(&buf_vtime, lnk->link_sym_timer == NULL ? 0 : lnk->link_sym_timer->timer_clock - olsr_timer_getNow());
     snprintf(buf_rawlinkcost, sizeof(buf_rawlinkcost), "%ud", lnk->linkcost);
 
     olsr_get_linkcost_text(lnk->linkcost, false, buf_linkcost, sizeof(buf_linkcost));
@@ -528,7 +528,7 @@ txtinfo_topology(struct comport_connection *con,
     struct tc_edge_entry *tc_edge, *edge_iterator;
     olsr_ip_to_string(&buf_localip, &tc->addr);
     if (tc->validity_timer) {
-      olsr_milli_to_txt(&buf_vtime, tc->validity_timer->timer_clock - now_times);
+      olsr_milli_to_txt(&buf_vtime, tc->validity_timer->timer_clock - olsr_timer_getNow());
     }
     else {
       strscpy(buf_vtime.buf, "0.0", sizeof(buf_vtime));
@@ -654,7 +654,7 @@ txtinfo_hna(struct comport_connection *con,
 
     olsr_ip_to_string(&buf_localip, &tc->addr);
     if (tc->validity_timer) {
-      olsr_milli_to_txt(&buf_vtime, tc->validity_timer->timer_clock - now_times);
+      olsr_milli_to_txt(&buf_vtime, tc->validity_timer->timer_clock - olsr_timer_getNow());
     }
     else {
       strscpy(buf_vtime.buf, "0.0", sizeof(buf_vtime));
@@ -717,7 +717,7 @@ txtinfo_mid(struct comport_connection *con,
     olsr_ip_to_string(&buf_localip, &tc->addr);
     if (tc->validity_timer) {
       if (tc->validity_timer) {
-        olsr_milli_to_txt(&buf_vtime, tc->validity_timer->timer_clock - now_times);
+        olsr_milli_to_txt(&buf_vtime, tc->validity_timer->timer_clock - olsr_timer_getNow());
       }
       else {
         strscpy(buf_vtime.buf, "0.0", sizeof(buf_vtime));
index 3a02d1a..4a0311a 100644 (file)
@@ -49,7 +49,8 @@
 #include "olsrd_plugin.h"
 #include "olsr.h"
 #include "defs.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "olsr_memcookie.h"
 #include "olsr_logging.h"
 
@@ -129,11 +130,11 @@ int
 olsrd_plugin_init(void)
 {
   /* create the cookie */
-  watchdog_timer_info = olsr_alloc_timerinfo("Watchdog: write alive-file",
+  watchdog_timer_info = olsr_timer_add("Watchdog: write alive-file",
       &olsr_watchdog_write_alivefile, true);
 
   /* Register the watchdog check */
-  olsr_start_timer(watchdog_interval * MSEC_PER_SEC, 0, NULL, watchdog_timer_info);
+  olsr_timer_start(watchdog_interval * MSEC_PER_SEC, 0, NULL, watchdog_timer_info);
 
   return 1;
 }
index bd1f3ea..8adc893 100644 (file)
@@ -44,7 +44,8 @@
 #include "common/avl.h"
 #include "olsr.h"
 #include "mid_set.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "olsr_time.h"
 #include "olsr_memcookie.h"
 #include "olsr_logging.h"
@@ -94,7 +95,7 @@ olsr_delete_duplicate_entry(struct dup_entry *entry)
 {
   avl_delete(entry->tree, &entry->avl);
   entry->tree = NULL;
-  olsr_stop_timer(entry->validity_timer);
+  olsr_timer_stop(entry->validity_timer);
   entry->validity_timer = NULL;
   olsr_memcookie_free(duplicate_mem_cookie, entry);
 }
@@ -119,7 +120,7 @@ olsr_init_duplicate_set(void)
   /*
    * Get some cookies for getting stats to ease troubleshooting.
    */
-  duplicate_timer_info = olsr_alloc_timerinfo("Duplicate Set", &olsr_expire_duplicate_entry, false);
+  duplicate_timer_info = olsr_timer_add("Duplicate Set", &olsr_expire_duplicate_entry, false);
 
   duplicate_mem_cookie = olsr_memcookie_add("dup_entry", sizeof(struct dup_entry));
 }
@@ -147,7 +148,6 @@ olsr_is_duplicate_message(struct olsr_message *m, bool forwarding, enum duplicat
   struct avl_tree *tree;
   struct dup_entry *entry;
   int diff;
-  uint32_t valid_until;
   enum duplicate_status dummy = 0;
 
 #if !defined(REMOVE_LOG_DEBUG)
@@ -160,8 +160,6 @@ olsr_is_duplicate_message(struct olsr_message *m, bool forwarding, enum duplicat
 
   tree = forwarding ? &forward_set : &processing_set;
 
-  valid_until = GET_TIMESTAMP(DUPLICATE_VTIME);
-
   /* Check if entry exists */
   entry = (struct dup_entry *)avl_find(tree, &m->originator);
   if (entry == NULL) {
@@ -169,7 +167,7 @@ olsr_is_duplicate_message(struct olsr_message *m, bool forwarding, enum duplicat
     if (entry != NULL) {
       avl_insert(tree, &entry->avl);
       entry->tree = tree;
-      entry->validity_timer = olsr_start_timer(DUPLICATE_CLEANUP_INTERVAL, DUPLICATE_CLEANUP_JITTER,
+      entry->validity_timer = olsr_timer_start(DUPLICATE_CLEANUP_INTERVAL, DUPLICATE_CLEANUP_JITTER,
                                                entry, duplicate_timer_info);
     }
 
@@ -180,7 +178,7 @@ olsr_is_duplicate_message(struct olsr_message *m, bool forwarding, enum duplicat
   /*
    * Refresh timer.
    */
-  olsr_change_timer(entry->validity_timer, DUPLICATE_CLEANUP_INTERVAL, DUPLICATE_CLEANUP_JITTER);
+  olsr_timer_change(entry->validity_timer, DUPLICATE_CLEANUP_INTERVAL, DUPLICATE_CLEANUP_JITTER);
 
   diff = olsr_seqno_diff(m->seqno, entry->seqnr);
 
@@ -241,29 +239,29 @@ olsr_print_duplicate_table(void)
 {
 #if !defined REMOVE_LOG_INFO
   /* The whole function makes no sense without it. */
+  struct timeval_buf timebuf;
+  struct ipaddr_str addrbuf;
   struct dup_entry *entry, *iterator;
   const int ipwidth = olsr_cnf->ip_version == AF_INET ? 15 : 30;
 
   OLSR_INFO(LOG_DUPLICATE_SET, "\n--- %s ------------------------------------------------- DUPLICATE SET (forwarding)\n\n",
-            olsr_wallclock_string());
+            olsr_timer_getWallclockString(&timebuf));
   OLSR_INFO_NH(LOG_DUPLICATE_SET, "%-*s %8s %s\n", ipwidth, "Node IP", "DupArray", "VTime");
 
   OLSR_FOR_ALL_FORWARD_DUP_ENTRIES(entry, iterator) {
-    struct ipaddr_str addrbuf;
     OLSR_INFO_NH(LOG_DUPLICATE_SET, "%-*s %08x %s\n",
                  ipwidth, olsr_ip_to_string(&addrbuf, entry->avl.key), entry->array,
-                 olsr_clock_string(entry->validity_timer->timer_clock));
+                 olsr_timer_getClockString(&timebuf, entry->validity_timer->timer_clock));
   }
 
-    OLSR_INFO(LOG_DUPLICATE_SET, "\n--- %s ------------------------------------------------- DUPLICATE SET (processing)\n\n",
-              olsr_wallclock_string());
+  OLSR_INFO(LOG_DUPLICATE_SET, "\n--- %s ------------------------------------------------- DUPLICATE SET (processing)\n\n",
+              olsr_timer_getWallclockString(&timebuf));
   OLSR_INFO_NH(LOG_DUPLICATE_SET, "%-*s %8s %s\n", ipwidth, "Node IP", "DupArray", "VTime");
 
   OLSR_FOR_ALL_PROCESS_DUP_ENTRIES(entry, iterator) {
-    struct ipaddr_str addrbuf;
     OLSR_INFO_NH(LOG_DUPLICATE_SET, "%-*s %08x %s\n",
                  ipwidth, olsr_ip_to_string(&addrbuf, entry->avl.key), entry->array,
-                 olsr_clock_string(entry->validity_timer->timer_clock));
+                 olsr_timer_getClockString(&timebuf, entry->validity_timer->timer_clock));
   }
 #endif
 }
index 366edb0..92669ae 100644 (file)
@@ -57,7 +57,7 @@ struct dup_entry {
   uint16_t seqnr;
   uint16_t too_low_counter;
   uint32_t array;
-  struct timer_entry *validity_timer;
+  struct olsr_timer_entry *validity_timer;
   struct avl_tree *tree;               /* backpointer to owning tree */
 };
 
index d7f9029..973beac 100644 (file)
@@ -44,7 +44,8 @@
 #include "defs.h"
 #include "parser.h"
 #include "olsr.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "net_olsr.h"
 #include "tc_set.h"
 #include "olsr_ip_prefix_list.h"
@@ -64,7 +65,7 @@ olsr_init_hna_set(void)
 {
   OLSR_INFO(LOG_HNA, "Initialize HNA set...\n");
 
-  hna_net_timer_info = olsr_alloc_timerinfo("HNA Network", &olsr_expire_hna_net_entry, false);
+  hna_net_timer_info = olsr_timer_add("HNA Network", &olsr_expire_hna_net_entry, false);
 
   hna_net_mem_cookie = olsr_memcookie_add("hna_net", sizeof(struct hna_net));
 }
@@ -137,7 +138,7 @@ olsr_delete_hna_net(struct hna_net *hna_net)
   avl_delete(&tc->hna_tree, &hna_net->hna_tc_node);
 
   if (hna_net->hna_net_timer) {
-    olsr_stop_timer(hna_net->hna_net_timer);
+    olsr_timer_stop(hna_net->hna_net_timer);
     hna_net->hna_net_timer = NULL;
   }
   /*
@@ -222,7 +223,7 @@ olsr_update_hna_entry(const union olsr_ip_addr *gw, const struct olsr_ip_prefix
   /*
    * Start, or refresh the timer, whatever is appropriate.
    */
-  olsr_set_timer(&net_entry->hna_net_timer, vtime,
+  olsr_timer_set(&net_entry->hna_net_timer, vtime,
                  OLSR_HNA_NET_JITTER, net_entry, hna_net_timer_info);
 }
 
@@ -239,9 +240,11 @@ olsr_print_hna_set(void)
   struct tc_entry *tc, *tc_iterator;
   struct ipaddr_str buf;
   struct ipprefix_str prefixstr;
+  struct timeval_buf timebuf;
   struct hna_net *hna_net, *hna_iterator;
 
-  OLSR_INFO(LOG_HNA, "\n--- %s ------------------------------------------------- HNA\n\n", olsr_wallclock_string());
+  OLSR_INFO(LOG_HNA, "\n--- %s ------------------------------------------------- HNA\n\n",
+      olsr_timer_getWallclockString(&timebuf));
 
   OLSR_FOR_ALL_TC_ENTRIES(tc, tc_iterator) {
     OLSR_INFO_NH(LOG_HNA, "HNA-gw %s:\n", olsr_ip_to_string(&buf, &tc->addr));
index 5f78192..6afa9fe 100644 (file)
@@ -51,7 +51,7 @@
 struct hna_net {
   struct avl_node hna_tc_node;         /* node in the per-tc hna tree */
   struct olsr_ip_prefix hna_prefix;    /* the prefix, key */
-  struct timer_entry *hna_net_timer;   /* expiration timer */
+  struct olsr_timer_entry *hna_net_timer;   /* expiration timer */
   struct tc_entry *hna_tc;             /* backpointer to the owning tc entry */
   uint16_t tc_entry_seqno;             /* sequence number for cleanup */
 };
index b2107d2..f0c17da 100644 (file)
@@ -41,7 +41,8 @@
 
 #include "defs.h"
 #include "interfaces.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "olsr.h"
 #include "parser.h"
 #include "net_olsr.h"
@@ -103,8 +104,8 @@ init_interfaces(void)
 
   interface_lost_mem_cookie = olsr_memcookie_add("Interface lost", sizeof(struct interface_lost));
 
-  interface_poll_timerinfo = olsr_alloc_timerinfo("Interface Polling", &check_interface_updates, true);
-  hello_gen_timerinfo = olsr_alloc_timerinfo("Hello Generation", &generate_hello, true);
+  interface_poll_timerinfo = olsr_timer_add("Interface Polling", &check_interface_updates, true);
+  hello_gen_timerinfo = olsr_timer_add("Hello Generation", &generate_hello, true);
 
   OLSR_INFO(LOG_INTERFACE, "\n ---- Interface configuration ---- \n\n");
 
@@ -114,7 +115,7 @@ init_interfaces(void)
   }
 
   /* Kick a periodic timer for the network interface update function */
-  olsr_start_timer(olsr_cnf->nic_chgs_pollrate, 5,
+  olsr_timer_start(olsr_cnf->nic_chgs_pollrate, 5,
                    NULL, interface_poll_timerinfo);
 
   return (!list_is_empty(&interface_head));
@@ -140,7 +141,7 @@ static void add_lost_interface_ip(union olsr_ip_addr *ip, uint32_t hello_timeout
   lost = olsr_memcookie_malloc(interface_lost_mem_cookie);
   lost->node.key = &lost->ip;
   lost->ip = *ip;
-  lost->valid_until = olsr_getTimestamp(hello_timeout * 2);
+  lost->valid_until = olsr_timer_getAbsolute(hello_timeout * 2);
   avl_insert(&interface_lost_tree, &lost->node);
 
   OLSR_DEBUG(LOG_INTERFACE, "Added %s to lost interface list for %d ms\n",
@@ -176,6 +177,7 @@ void destroy_interfaces(void) {
 struct interface *
 add_interface(struct olsr_if_config *iface) {
   struct interface *ifp;
+  int sock_rcv, sock_send;
 
   ifp = olsr_memcookie_malloc(interface_mem_cookie);
   ifp->int_name = iface->name;
@@ -185,9 +187,9 @@ add_interface(struct olsr_if_config *iface) {
     return NULL;
   }
 
-  ifp->olsr_socket = os_getsocket46(olsr_cnf->ip_version, ifp->int_name, olsr_cnf->olsr_port, BUFSPACE, NULL);
-  ifp->send_socket = os_getsocket46(olsr_cnf->ip_version, ifp->int_name, olsr_cnf->olsr_port, BUFSPACE, &ifp->int_multicast);
-  if (ifp->olsr_socket < 0 || ifp->send_socket < 0) {
+  sock_rcv = os_getsocket46(olsr_cnf->ip_version, ifp->int_name, olsr_cnf->olsr_port, BUFSPACE, NULL);
+  sock_send = os_getsocket46(olsr_cnf->ip_version, ifp->int_name, olsr_cnf->olsr_port, BUFSPACE, &ifp->int_multicast);
+  if (sock_rcv < 0 || sock_send < 0) {
     OLSR_ERROR(LOG_INTERFACE, "Could not initialize socket... exiting!\n\n");
     olsr_exit(EXIT_FAILURE);
   }
@@ -195,11 +197,11 @@ add_interface(struct olsr_if_config *iface) {
   set_buffer_timer(ifp);
 
   /* Register sockets */
-  add_olsr_socket(ifp->olsr_socket, &olsr_input, NULL, NULL, SP_PR_READ);
-  add_olsr_socket(ifp->send_socket, &olsr_input, NULL, NULL, SP_PR_READ);
+  ifp->olsr_socket = olsr_socket_add(sock_rcv, &olsr_input, NULL, OLSR_SOCKET_READ);
+  ifp->send_socket = olsr_socket_add(sock_send, &olsr_input, NULL, OLSR_SOCKET_READ);
 
-  os_socket_set_olsr_options(ifp, ifp->olsr_socket, &ifp->int_multicast);
-  os_socket_set_olsr_options(ifp, ifp->send_socket, &ifp->int_multicast);
+  os_socket_set_olsr_options(ifp, ifp->olsr_socket->fd, &ifp->int_multicast);
+  os_socket_set_olsr_options(ifp, ifp->send_socket->fd, &ifp->int_multicast);
 
   /*
    *Initialize packet sequencenumber as a random 16bit value
@@ -227,7 +229,7 @@ add_interface(struct olsr_if_config *iface) {
    * Register functions for periodic message generation
    */
   ifp->hello_gen_timer =
-    olsr_start_timer(iface->cnf->hello_params.emission_interval,
+    olsr_timer_start(iface->cnf->hello_params.emission_interval,
                      HELLO_JITTER, ifp, hello_gen_timerinfo);
   ifp->hello_interval = iface->cnf->hello_params.emission_interval;
   ifp->hello_validity = iface->cnf->hello_params.validity_time;
@@ -289,7 +291,7 @@ check_interface_updates(void *foo __attribute__ ((unused)))
 
   /* clean up lost interface tree */
   OLSR_FOR_ALL_LOSTIF_ENTRIES(lost, iterator) {
-    if (olsr_isTimedOut(lost->valid_until)) {
+    if (olsr_timer_isTimedOut(lost->valid_until)) {
       remove_lost_interface_ip(lost);
     }
   }
@@ -325,13 +327,13 @@ remove_interface(struct interface *ifp)
   /*
    * Deregister functions for periodic message generation
    */
-  olsr_stop_timer(ifp->hello_gen_timer);
+  olsr_timer_stop(ifp->hello_gen_timer);
   ifp->hello_gen_timer = NULL;
 
   /*
    * Stop interface pacing.
    */
-  olsr_stop_timer(ifp->buffer_hold_timer);
+  olsr_timer_stop(ifp->buffer_hold_timer);
   ifp->buffer_hold_timer = NULL;
 
   /*
@@ -345,10 +347,11 @@ remove_interface(struct interface *ifp)
   unlock_interface(ifp);
 
   /* Close olsr socket */
-  remove_olsr_socket(ifp->olsr_socket, &olsr_input, NULL);
-  os_close(ifp->olsr_socket);
-  os_close(ifp->send_socket);
-  ifp->olsr_socket = -1;
+  os_close(ifp->olsr_socket->fd);
+  os_close(ifp->send_socket->fd);
+
+  olsr_socket_remove(ifp->olsr_socket);
+  olsr_socket_remove(ifp->send_socket);
 
   ifp->int_name = NULL;
   unlock_interface(ifp);
@@ -404,10 +407,10 @@ if_ifwithsock(int fd)
   struct interface *ifp, *iterator;
 
   OLSR_FOR_ALL_INTERFACES(ifp, iterator) {
-    if (ifp->olsr_socket == fd) {
+    if (ifp->olsr_socket->fd == fd) {
       return ifp;
     }
-    if (ifp->send_socket == fd) {
+    if (ifp->send_socket->fd == fd) {
       return ifp;
     }
   }
index 9fe8d69..5b6550f 100644 (file)
@@ -137,18 +137,25 @@ struct interface {
   /* source IP of interface */
   union olsr_ip_addr ip_addr;
 
-  int olsr_socket;                     /* The broadcast socket for this interface */
-  int send_socket;                     /* The send socket for this interface */
+  /* The broadcast socket for this interface */
+  struct olsr_socket_entry *olsr_socket;
+
+  /* The send socket for this interface */
+  struct olsr_socket_entry *send_socket;
+
+  /* interface data */
   int int_mtu;                         /* MTU of interface */
   int if_index;                        /* Kernels index of this interface */
   char *int_name;                      /* from kernel if structure */
-  uint16_t olsr_seqnum;                /* Olsr message seqno */
+
+  /* current packet sequence number for this interface */
+  uint16_t olsr_seqnum;
 
   /* Periodic message generation timers */
-  struct timer_entry *hello_gen_timer;
+  struct olsr_timer_entry *hello_gen_timer;
 
   /* Message build related  */
-  struct timer_entry *buffer_hold_timer;        /* Timer for message batching */
+  struct olsr_timer_entry *buffer_hold_timer;        /* Timer for message batching */
   struct olsr_netbuf netbuf;           /* the build buffer */
 
 #ifdef linux
@@ -162,11 +169,8 @@ struct interface {
 
   uint32_t hello_interval;
   uint32_t hello_validity;
-#if 0
-  struct if_gen_property *gen_properties;       /* Generic interface properties */
-#endif
 
-  uint32_t refcount;                   /* Refcount */
+  uint32_t refcount;
 };
 
 /* deletion safe macro for interface list traversal */
index b7684d1..7504fcc 100644 (file)
@@ -48,7 +48,8 @@
 #include "mid_set.h"
 #include "neighbor_table.h"
 #include "olsr.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "olsr_spf.h"
 #include "net_olsr.h"
 #include "ipcalc.h"
@@ -91,9 +92,9 @@ olsr_init_link_set(void)
   /* Init list head */
   list_init_head(&link_entry_head);
 
-  link_dead_timer_info = olsr_alloc_timerinfo("Link dead", &olsr_expire_link_entry, false);
-  link_loss_timer_info = olsr_alloc_timerinfo("Link loss", &olsr_expire_link_loss_timer, true);
-  link_sym_timer_info = olsr_alloc_timerinfo("Link SYM", &olsr_expire_link_sym_timer, false);
+  link_dead_timer_info = olsr_timer_add("Link dead", &olsr_expire_link_entry, false);
+  link_loss_timer_info = olsr_timer_add("Link loss", &olsr_expire_link_loss_timer, true);
+  link_sym_timer_info = olsr_timer_add("Link SYM", &olsr_expire_link_sym_timer, false);
 
 }
 
@@ -116,7 +117,7 @@ lookup_link_status(const struct link_entry *entry)
     return SYM_LINK;
   }
 
-  if (!TIMED_OUT(entry->ASYM_time)) {
+  if (!olsr_timer_isTimedOut(entry->ASYM_time)) {
     return ASYM_LINK;
   }
 
@@ -231,13 +232,13 @@ olsr_delete_link_entry(struct link_entry *link)
   }
 
   /* Kill running timers */
-  olsr_stop_timer(link->link_timer);
+  olsr_timer_stop(link->link_timer);
   link->link_timer = NULL;
 
-  olsr_stop_timer(link->link_sym_timer);
+  olsr_timer_stop(link->link_sym_timer);
   link->link_sym_timer = NULL;
 
-  olsr_stop_timer(link->link_loss_timer);
+  olsr_timer_stop(link->link_loss_timer);
   link->link_loss_timer = NULL;
 
   list_remove(&link->link_list);
@@ -286,7 +287,7 @@ olsr_expire_link_loss_timer(void *context)
   olsr_lq_hello_handler(link, true);
 
   /* next timeout in 1.0 x htime */
-  olsr_change_timer(link->link_loss_timer, link->loss_helloint, OLSR_LINK_LOSS_JITTER);
+  olsr_timer_change(link->link_loss_timer, link->loss_helloint, OLSR_LINK_LOSS_JITTER);
 }
 
 /**
@@ -343,7 +344,7 @@ olsr_expire_link_entry(void *context)
 static void
 olsr_set_link_timer(struct link_entry *link, unsigned int rel_timer)
 {
-  olsr_set_timer(&link->link_timer, rel_timer, OLSR_LINK_JITTER,
+  olsr_timer_set(&link->link_timer, rel_timer, OLSR_LINK_JITTER,
                  link, link_dead_timer_info);
 }
 
@@ -411,7 +412,7 @@ add_link_entry(const union olsr_ip_addr *local,
 
   link->loss_helloint = htime;
 
-  olsr_set_timer(&link->link_loss_timer, htime + htime / 2,
+  olsr_timer_set(&link->link_loss_timer, htime + htime / 2,
                  OLSR_LINK_LOSS_JITTER, link, link_loss_timer_info);
 
   set_loss_link_multiplier(link);
@@ -527,20 +528,20 @@ update_link_entry(const union olsr_ip_addr *local,
 
   /* Update ASYM_time */
   entry->vtime = message->comm->vtime;
-  entry->ASYM_time = GET_TIMESTAMP(message->comm->vtime);
+  entry->ASYM_time = olsr_timer_getAbsolute(message->comm->vtime);
 
   entry->status = check_link_status(message, in_if);
 
   switch (entry->status) {
   case (LOST_LINK):
-    olsr_stop_timer(entry->link_sym_timer);
+    olsr_timer_stop(entry->link_sym_timer);
     entry->link_sym_timer = NULL;
     break;
   case (SYM_LINK):
   case (ASYM_LINK):
 
     /* L_SYM_time = current time + validity time */
-    olsr_set_timer(&entry->link_sym_timer, message->comm->vtime,
+    olsr_timer_set(&entry->link_sym_timer, message->comm->vtime,
                    OLSR_LINK_SYM_JITTER, entry, link_sym_timer_info);
 
     /* L_time = L_SYM_time + NEIGHB_HOLD_TIME */
@@ -551,7 +552,7 @@ update_link_entry(const union olsr_ip_addr *local,
 
   /* L_time = max(L_time, L_ASYM_time) */
   if (entry->link_timer && (entry->link_timer->timer_clock < entry->ASYM_time)) {
-    olsr_set_link_timer(entry, TIME_DUE(entry->ASYM_time));
+    olsr_set_link_timer(entry, olsr_timer_getRelative(entry->ASYM_time));
   }
 
   /* Update neighbor */
@@ -634,6 +635,7 @@ olsr_print_link_set(void)
   char totaltxt[256] = { 0 };
   const char *txt;
   int addrsize;
+  struct timeval_buf timebuf;
   size_t i, j, length, max, totaltxt_len;
   addrsize = olsr_cnf->ip_version == AF_INET ? INET_ADDRSTRLEN : INET6_ADDRSTRLEN;
 
@@ -664,7 +666,8 @@ olsr_print_link_set(void)
   }
   totaltxt[totaltxt_len] = 0;
 
-  OLSR_INFO(LOG_LINKS, "\n--- %s ---------------------------------------------------- LINKS\n\n", olsr_wallclock_string());
+  OLSR_INFO(LOG_LINKS, "\n--- %s ---------------------------------------------------- LINKS\n\n",
+      olsr_timer_getWallclockString(&timebuf));
   OLSR_INFO_NH(LOG_LINKS, "%-*s  %-6s %s %s\n", addrsize, "IP address", "hyst", totaltxt , olsr_get_linklabel(0));
 
   OLSR_FOR_ALL_LINK_ENTRIES(walker, iterator) {
@@ -720,7 +723,7 @@ olsr_update_packet_loss(struct link_entry *entry)
   olsr_lq_hello_handler(entry, false);
 
   /* timeout for the first lost packet is 1.5 x htime */
-  olsr_set_timer(&entry->link_loss_timer, entry->loss_helloint + entry->loss_helloint / 2,
+  olsr_timer_set(&entry->link_loss_timer, entry->loss_helloint + entry->loss_helloint / 2,
                  OLSR_LINK_LOSS_JITTER, entry, link_loss_timer_info);
 }
 
index 9720300..2f38ac4 100644 (file)
@@ -60,8 +60,8 @@ struct link_entry {
   union olsr_ip_addr neighbor_iface_addr;
   struct interface *inter;
   char *if_name;
-  struct timer_entry *link_timer;
-  struct timer_entry *link_sym_timer;
+  struct olsr_timer_entry *link_timer;
+  struct olsr_timer_entry *link_sym_timer;
   uint32_t ASYM_time;
   uint32_t vtime;
   struct nbr_entry *neighbor;
@@ -76,7 +76,7 @@ struct link_entry {
    * packet loss
    */
   uint32_t loss_helloint;
-  struct timer_entry *link_loss_timer;
+  struct olsr_timer_entry *link_loss_timer;
 
   /* user defined multiplies for link quality, multiplied with 65536 */
   uint32_t loss_link_multiplier;
index 9cf1552..1280e16 100644 (file)
@@ -104,10 +104,15 @@ int rtnetlink_register_socket(int rtnl_mgrp)
 
   if (bind(sock,(struct sockaddr *)&addr,sizeof(addr))<0) {
     OLSR_ERROR(LOG_ROUTING,"could not bind rtnetlink socket! %s (%d)",strerror(errno), errno);
+    os_close(sock);
     return -1;
   }
 
-  add_olsr_socket(sock, NULL, &rtnetlink_read, NULL, SP_IMM_READ);
+  if (NULL == olsr_socket_add(sock, &rtnetlink_read, NULL, OLSR_SOCKET_READ)) {
+    OLSR_ERROR(LOG_ROUTING, "Could not register socket with scheduler");
+    os_close(sock);
+    return -1;
+  }
   return sock;
 }
 
index a4e3e39..0f5fb5b 100644 (file)
@@ -43,7 +43,8 @@
 #include "neighbor_table.h"
 #include "link_set.h"
 #include "lq_mpr.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "lq_plugin.h"
 
 void
index 3df2020..925cafb 100644 (file)
@@ -50,7 +50,8 @@
 #include "common/avl_olsr_comp.h"
 #include "olsr.h"
 #include "ipcalc.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "parser.h"
 #include "plugin_loader.h"
 #include "os_apm.h"
@@ -102,9 +103,9 @@ static char copyright_string[] __attribute__ ((unused)) =
 static char pulsedata[] = "\\|/-";
 static uint8_t pulse_state = 0;
 
-static struct timer_entry *hna_gen_timer;
-static struct timer_entry *mid_gen_timer;
-static struct timer_entry *tc_gen_timer;
+static struct olsr_timer_entry *hna_gen_timer;
+static struct olsr_timer_entry *mid_gen_timer;
+static struct olsr_timer_entry *tc_gen_timer;
 
 static void
 generate_stdout_pulse(void *foo __attribute__ ((unused)))
@@ -242,16 +243,17 @@ main(int argc, char *argv[])
   olsr_memcookie_init();
 
   /* Initialize timers and scheduler part */
-  olsr_init_timers();
+  olsr_timer_init();
+  olsr_socket_init();
 
   /* initialize callback system */
   olsr_callback_init();
 
   /* generate global timers */
-  pulse_timer_info = olsr_alloc_timerinfo("Stdout pulse", &generate_stdout_pulse, true);
-  tc_gen_timer_info = olsr_alloc_timerinfo("TC generation", &olsr_output_lq_tc, true);
-  mid_gen_timer_info = olsr_alloc_timerinfo("MID generation", &generate_mid, true);
-  hna_gen_timer_info = olsr_alloc_timerinfo("HNA generation", &generate_hna, true);
+  pulse_timer_info = olsr_timer_add("Stdout pulse", &generate_stdout_pulse, true);
+  tc_gen_timer_info = olsr_timer_add("TC generation", &olsr_output_lq_tc, true);
+  mid_gen_timer_info = olsr_timer_add("MID generation", &generate_mid, true);
+  hna_gen_timer_info = olsr_timer_add("HNA generation", &generate_hna, true);
 
   /* initialize plugin system */
   olsr_init_pluginsystem();
@@ -282,7 +284,7 @@ main(int argc, char *argv[])
   olsr_plugins_enable(PLUGIN_TYPE_LQ, true);
 
   /* initialize built in server services */
-  olsr_com_init(true);
+  olsr_com_init();
 
   /* Initialize net */
   init_net();
@@ -370,7 +372,7 @@ main(int argc, char *argv[])
 
 #if !defined WINCE
   if (olsr_cnf->log_target_stderr > 0 && isatty(STDOUT_FILENO)) {
-    olsr_start_timer(STDOUT_PULSE_INT, 0, NULL, pulse_timer_info);
+    olsr_timer_start(STDOUT_PULSE_INT, 0, NULL, pulse_timer_info);
   }
 #endif
 
@@ -427,26 +429,26 @@ main(int argc, char *argv[])
   link_changes = false;
 
   tc_gen_timer =
-    olsr_start_timer(olsr_cnf->tc_params.emission_interval, TC_JITTER, NULL, tc_gen_timer_info);
+    olsr_timer_start(olsr_cnf->tc_params.emission_interval, TC_JITTER, NULL, tc_gen_timer_info);
   mid_gen_timer =
-    olsr_start_timer(olsr_cnf->mid_params.emission_interval, MID_JITTER, NULL, mid_gen_timer_info);
+    olsr_timer_start(olsr_cnf->mid_params.emission_interval, MID_JITTER, NULL, mid_gen_timer_info);
   hna_gen_timer =
-    olsr_start_timer(olsr_cnf->hna_params.emission_interval, HNA_JITTER, NULL, hna_gen_timer_info);
+    olsr_timer_start(olsr_cnf->hna_params.emission_interval, HNA_JITTER, NULL, hna_gen_timer_info);
 
   /* enable default plugins */
   olsr_plugins_enable(PLUGIN_TYPE_DEFAULT, true);
 
   /* Starting scheduler */
   app_state = STATE_RUNNING;
-  olsr_scheduler();
+  olsr_timer_scheduler();
 
-  olsr_stop_timer(tc_gen_timer);
+  olsr_timer_stop(tc_gen_timer);
   tc_gen_timer = NULL;
 
-  olsr_stop_timer(mid_gen_timer);
+  olsr_timer_stop(mid_gen_timer);
   mid_gen_timer = NULL;
 
-  olsr_stop_timer(hna_gen_timer);
+  olsr_timer_stop(hna_gen_timer);
   hna_gen_timer = NULL;
 
   exitcode = olsr_cnf->exit_value;
@@ -596,10 +598,10 @@ olsr_shutdown(void)
 #endif
 
   /* Close and delete all sockets */
-  olsr_flush_sockets();
+  olsr_socket_cleanup();
 
   /* Stop and delete all timers. */
-  olsr_flush_timers();
+  olsr_timer_cleanup();
 
   /* Remove parser hooks */
   olsr_deinit_parser();
index c620479..1739531 100644 (file)
@@ -43,7 +43,8 @@
 #include "defs.h"
 #include "mid_set.h"
 #include "olsr.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "neighbor_table.h"
 #include "link_set.h"
 #include "tc_set.h"
@@ -78,7 +79,7 @@ olsr_init_mid_set(void)
   /*
    * Get some cookies for getting stats to ease troubleshooting.
    */
-  mid_validity_timer_info = olsr_alloc_timerinfo("MID validity", &olsr_expire_mid_entries, false);
+  mid_validity_timer_info = olsr_timer_add("MID validity", &olsr_expire_mid_entries, false);
 
   mid_address_mem_cookie = olsr_memcookie_add("MID address", sizeof(struct mid_entry));
 }
@@ -108,7 +109,7 @@ olsr_expire_mid_entries(void *context)
 static void
 olsr_set_mid_timer(struct mid_entry *mid, uint32_t rel_timer)
 {
-  olsr_set_timer(&mid->mid_timer, rel_timer, OLSR_MID_JITTER, mid, mid_validity_timer_info);
+  olsr_timer_set(&mid->mid_timer, rel_timer, OLSR_MID_JITTER, mid, mid_validity_timer_info);
 }
 
 /**
@@ -374,7 +375,7 @@ olsr_delete_mid_entry(struct mid_entry *alias)
   tc = alias->mid_tc;
 
   /* kill timer */
-  olsr_stop_timer(alias->mid_timer);
+  olsr_timer_stop(alias->mid_timer);
   alias->mid_timer = NULL;
 
   /*
@@ -420,8 +421,10 @@ olsr_print_mid_set(void)
   struct tc_entry *tc, *tc_iterator;
   struct mid_entry *alias, *mid_iterator;
   struct ipaddr_str buf1, buf2;
+  struct timeval_buf timebuf;
 
-  OLSR_INFO(LOG_MID, "\n--- %s ------------------------------------------------- MID\n\n", olsr_wallclock_string());
+  OLSR_INFO(LOG_MID, "\n--- %s ------------------------------------------------- MID\n\n",
+      olsr_timer_getWallclockString(&timebuf));
 
   OLSR_FOR_ALL_TC_ENTRIES(tc, tc_iterator) {
     OLSR_FOR_ALL_TC_MID_ENTRIES(tc, alias, mid_iterator) {
index d2754d8..ce69e3e 100644 (file)
@@ -53,7 +53,7 @@ struct mid_entry {
   struct avl_node mid_node;            /* node in the global mid tree */
   union olsr_ip_addr mid_alias_addr;   /* key for both trees */
   struct tc_entry *mid_tc;             /* backpointer to owning tc entry */
-  struct timer_entry *mid_timer;       /* Vtime */
+  struct olsr_timer_entry *mid_timer;       /* Vtime */
 };
 
 #define OLSR_FOR_ALL_MID_ENTRIES(mid_alias, iterator) avl_for_each_element_safe(&mid_tree, mid_alias, mid_node, iterator)
index fd0d940..17ea69e 100644 (file)
@@ -44,7 +44,8 @@
 #include "mid_set.h"
 #include "neighbor_table.h"
 #include "olsr.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "link_set.h"
 #include "net_olsr.h"
 #include "olsr_logging.h"
@@ -77,7 +78,7 @@ olsr_init_neighbor_table(void)
   avl_init(&nbr_tree, avl_comp_default, false, NULL);
   avl_init(&nbr2_tree, avl_comp_default, false, NULL);
 
-  nbr_connector_timer_info = olsr_alloc_timerinfo("Neighbor connector", &olsr_expire_nbr_con, false);
+  nbr_connector_timer_info = olsr_timer_add("Neighbor connector", &olsr_expire_nbr_con, false);
   nbr_connector_mem_cookie = olsr_memcookie_add("Neighbor connector", sizeof(struct nbr_con));
 
   nbr_mem_cookie = olsr_memcookie_add("1-Hop Neighbor", sizeof(struct nbr_entry));
@@ -357,7 +358,7 @@ olsr_link_nbr_nbr2(struct nbr_entry *nbr, const union olsr_ip_addr *nbr2_addr, u
    */
   connector = olsr_lookup_nbr_con_entry(nbr, nbr2_addr);
   if (connector) {
-    olsr_change_timer(connector->nbr2_con_timer, vtime, OLSR_NBR2_LIST_JITTER);
+    olsr_timer_change(connector->nbr2_con_timer, vtime, OLSR_NBR2_LIST_JITTER);
     return connector;
   }
 
@@ -378,7 +379,7 @@ olsr_link_nbr_nbr2(struct nbr_entry *nbr, const union olsr_ip_addr *nbr2_addr, u
 
   connector->path_linkcost = LINK_COST_BROKEN;
 
-  connector->nbr2_con_timer = olsr_start_timer(vtime, OLSR_NBR2_LIST_JITTER,
+  connector->nbr2_con_timer = olsr_timer_start(vtime, OLSR_NBR2_LIST_JITTER,
       connector, nbr_connector_timer_info);
 
   return connector;
@@ -390,7 +391,7 @@ olsr_link_nbr_nbr2(struct nbr_entry *nbr, const union olsr_ip_addr *nbr2_addr, u
  */
 static void
 internal_delete_nbr_con(struct nbr_con *connector) {
-  olsr_stop_timer(connector->nbr2_con_timer);
+  olsr_timer_stop(connector->nbr2_con_timer);
   connector->nbr2_con_timer = NULL;
 
   avl_delete(&connector->nbr->con_tree, &connector->nbr_tree_node);
@@ -480,9 +481,10 @@ olsr_print_neighbor_table(void)
   struct nbr_con *connector, *con_iterator;
   char lqbuffer[LQTEXT_MAXLENGTH];
   bool first;
+  struct timeval_buf timebuf;
 
   OLSR_INFO(LOG_NEIGHTABLE, "\n--- %s ------------------------------------------------ NEIGHBORS\n\n"
-            "%-*s\tSYM\tMPR\tMPRS\twill\n", olsr_wallclock_string(), ipwidth, "IP address");
+            "%-*s\tSYM\tMPR\tMPRS\twill\n", olsr_timer_getWallclockString(&timebuf), ipwidth, "IP address");
 
   OLSR_FOR_ALL_NBR_ENTRIES(nbr, nbr_iterator) {
 
@@ -500,7 +502,7 @@ olsr_print_neighbor_table(void)
   }
 
   OLSR_INFO(LOG_2NEIGH, "\n--- %s ----------------------- TWO-HOP NEIGHBORS\n\n"
-            "IP addr (2-hop)  IP addr (1-hop)  Total cost\n", olsr_wallclock_string());
+            "IP addr (2-hop)  IP addr (1-hop)  Total cost\n", olsr_timer_getWallclockString(&timebuf));
 
   OLSR_FOR_ALL_NBR2_ENTRIES(nbr2, nbr2_iterator) {
     first = true;
index 3858120..62b5bfd 100644 (file)
@@ -61,7 +61,7 @@ struct nbr_con {
   struct nbr_entry *nbr;
   struct nbr2_entry *nbr2;
 
-  struct timer_entry *nbr2_con_timer;
+  struct olsr_timer_entry *nbr2_con_timer;
 
   olsr_linkcost second_hop_linkcost;
   olsr_linkcost path_linkcost;
index 901f774..bb86feb 100644 (file)
@@ -115,7 +115,7 @@ init_net(void)
     olsr_add_invalid_address(&addr);
   }
 
-  buffer_hold_timer_info = olsr_alloc_timerinfo("Buffer writeback", olsr_expire_buffer_timer, false);
+  buffer_hold_timer_info = olsr_timer_add("Buffer writeback", olsr_expire_buffer_timer, false);
 }
 
 /**
@@ -169,7 +169,7 @@ set_buffer_timer(struct interface *ifn)
    * been drained. Flush the buffer in second or so.
    */
   ifn->buffer_hold_timer =
-    olsr_start_timer(OLSR_BUFFER_HOLD_TIME, OLSR_BUFFER_HOLD_JITTER,
+    olsr_timer_start(OLSR_BUFFER_HOLD_TIME, OLSR_BUFFER_HOLD_JITTER,
                      ifn, buffer_hold_timer_info);
 }
 
@@ -398,7 +398,7 @@ net_output(struct interface *ifp)
     tmp_ptf->function(ifp->netbuf.buff, &ifp->netbuf.pending);
   }
 
-  if (os_sendto(ifp->send_socket, ifp->netbuf.buff, ifp->netbuf.pending,
+  if (os_sendto(ifp->send_socket->fd, ifp->netbuf.buff, ifp->netbuf.pending,
       MSG_DONTROUTE, &ifp->int_multicast) < 0) {
 #if !defined REMOVE_LOG_WARN
     const int save_errno = errno;
index 8f57d6c..5f719f4 100644 (file)
@@ -51,7 +51,8 @@
 #include "mid_set.h"
 #include "lq_mpr.h"
 #include "olsr_spf.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "neighbor_table.h"
 #include "lq_packet.h"
 #include "common/avl.h"
@@ -190,8 +191,8 @@ olsr_init_willingness(void)
     /* Run it first and then periodic. */
     olsr_update_willingness(NULL);
 
-    willingness_timer_info = olsr_alloc_timerinfo("Update Willingness", &olsr_update_willingness, true);
-    olsr_start_timer(olsr_cnf->will_int, 5, NULL, willingness_timer_info);
+    willingness_timer_info = olsr_timer_add("Update Willingness", &olsr_update_willingness, true);
+    olsr_timer_start(olsr_cnf->will_int, 5, NULL, willingness_timer_info);
   }
 }
 
index 75da7f6..37fe58e 100644 (file)
@@ -52,7 +52,8 @@
 #include "defs.h"
 #include "olsr_logging.h"
 #include "olsr_cfg.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "olsr_memcookie.h"
 #include "common/autobuf.h"
 #include "common/avl.h"
@@ -74,8 +75,8 @@
 struct list_entity olsr_comport_head;
 
 /* server socket */
-static int comsocket_http = 0;
-static int comsocket_txt = 0;
+static struct olsr_socket_entry *comsocket_http;
+static struct olsr_socket_entry *comsocket_txt;
 
 static struct olsr_memcookie_info *connection_cookie;
 static struct olsr_timer_info *connection_timeout;
@@ -93,11 +94,13 @@ static void olsr_com_cleanup_session(struct comport_connection *con);
 static void olsr_com_timeout_handler(void *);
 
 void
-olsr_com_init(bool failfast) {
+olsr_com_init(void) {
+  int sock_http, sock_txt;
+
   connection_cookie =
       olsr_memcookie_add("comport connections", sizeof(struct comport_connection));
 
-  connection_timeout = olsr_alloc_timerinfo("comport timout",
+  connection_timeout = olsr_timer_add("comport timout",
       &olsr_com_timeout_handler, false);
 
   connection_http_count = 0;
@@ -109,25 +112,21 @@ olsr_com_init(bool failfast) {
   olsr_com_init_txt();
 
   if (olsr_cnf->comport_http > 0) {
-    if ((comsocket_http = olsr_com_openport(olsr_cnf->comport_http)) == -1) {
-      if (failfast) {
-        olsr_exit(1);
-      }
-    }
-    else {
-      add_olsr_socket(comsocket_http, &olsr_com_parse_request, NULL, NULL,
-          SP_PR_READ);
+    sock_http = olsr_com_openport(olsr_cnf->comport_http);
+
+    if (NULL == (comsocket_http =
+        olsr_socket_add(sock_http, &olsr_com_parse_request, NULL, OLSR_SOCKET_READ))) {
+      OLSR_ERROR(LOG_COMPORT, "Cannot http-register socket with scheduler");
+      olsr_exit(1);
     }
   }
   if (olsr_cnf->comport_txt > 0) {
-    if ((comsocket_txt = olsr_com_openport(olsr_cnf->comport_txt)) == -1) {
-      if (failfast) {
-        olsr_exit(1);
-      }
-    }
-    else {
-      add_olsr_socket(comsocket_txt, &olsr_com_parse_request, NULL, NULL,
-          SP_PR_READ);
+    sock_txt = olsr_com_openport(olsr_cnf->comport_txt);
+
+    if (NULL == (comsocket_txt =
+        olsr_socket_add(sock_txt, &olsr_com_parse_request, NULL, OLSR_SOCKET_READ))) {
+      OLSR_ERROR(LOG_COMPORT, "Cannot register txt-socket with scheduler");
+      olsr_exit(1);
     }
   }
 }
@@ -145,7 +144,7 @@ olsr_com_destroy(void) {
 
 void
 olsr_com_activate_output(struct comport_connection *con) {
-  enable_olsr_socket(con->fd, &olsr_com_parse_connection, NULL, SP_PR_WRITE);
+  olsr_socket_enable(con->sock, OLSR_SOCKET_WRITE);
 }
 
 static int
@@ -161,14 +160,14 @@ olsr_com_openport(int port) {
   /* Init ipc socket */
   int s = socket(olsr_cnf->ip_version, SOCK_STREAM, 0);
   if (s == -1) {
-    OLSR_WARN(LOG_COMPORT, "Cannot open %d com-socket for IPv%c: %s\n", port, ipchar, strerror(errno));
-    return -1;
+    OLSR_ERROR(LOG_COMPORT, "Cannot open %d com-socket for IPv%c: %s\n", port, ipchar, strerror(errno));
+    olsr_exit(1);
   }
 
   if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof(yes)) < 0) {
-    OLSR_WARN(LOG_COMPORT, "Com-port %d SO_REUSEADDR for IPv%c failed: %s\n", port, ipchar, strerror(errno));
+    OLSR_ERROR(LOG_COMPORT, "Com-port %d SO_REUSEADDR for IPv%c failed: %s\n", port, ipchar, strerror(errno));
     os_close(s);
-    return -1;
+    olsr_exit(1);
   }
 
   /* Bind the socket */
@@ -197,16 +196,16 @@ olsr_com_openport(int port) {
 
   /* bind the socket to the port number */
   if (bind(s, (struct sockaddr *) &sst, addrlen) == -1) {
-    OLSR_WARN(LOG_COMPORT, "Com-port %d bind failed for IPv%c: %s\n", port, ipchar, strerror(errno));
+    OLSR_ERROR(LOG_COMPORT, "Com-port %d bind failed for IPv%c: %s\n", port, ipchar, strerror(errno));
     os_close(s);
-    return -1;
+    olsr_exit(1);
   }
 
   /* show that we are willing to listen */
   if (listen(s, 1) == -1) {
-    OLSR_WARN(LOG_COMPORT, "Com-port %d listen for IPv%c failed %s\n", port, ipchar, strerror(errno));
+    OLSR_ERROR(LOG_COMPORT, "Com-port %d listen for IPv%c failed %s\n", port, ipchar, strerror(errno));
     os_close(s);
-    return -1;
+    olsr_exit(1);
   }
 
   return s;
@@ -232,8 +231,7 @@ olsr_com_parse_request(int fd, void *data __attribute__ ((unused)), unsigned int
   abuf_init(&con->in, 1024);
   abuf_init(&con->out, 0);
 
-  con->is_http = fd == comsocket_http;
-  con->fd = sock;
+  con->is_http = fd == comsocket_http->fd;
 
   if (olsr_cnf->ip_version == AF_INET6) {
     struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) &addr;
@@ -269,10 +267,10 @@ olsr_com_parse_request(int fd, void *data __attribute__ ((unused)), unsigned int
   OLSR_DEBUG(LOG_COMPORT, "Got connection through socket %d from %s.\n",
       sock, olsr_ip_to_string(&buf, &con->addr));
 
-  con->timeout = olsr_start_timer(con->timeout_value, 0, con, connection_timeout);
+  con->timeout = olsr_timer_start(con->timeout_value, 0, con, connection_timeout);
 
-  add_olsr_socket(sock, &olsr_com_parse_connection, NULL, con, SP_PR_READ
-      | SP_PR_WRITE);
+  con->sock = olsr_socket_add(sock, &olsr_com_parse_connection, con,
+      OLSR_SOCKET_READ | OLSR_SOCKET_WRITE);
 
   list_add_after(&olsr_comport_head, &con->node);
 }
@@ -290,8 +288,9 @@ olsr_com_cleanup_session(struct comport_connection *con) {
   if (con->stop_handler) {
     con->stop_handler(con);
   }
-  remove_olsr_socket(con->fd, &olsr_com_parse_connection, NULL);
-  os_close(con->fd);
+
+  os_close(con->sock->fd);
+  olsr_socket_remove(con->sock);
 
   abuf_free(&con->in);
   abuf_free(&con->out);
@@ -314,7 +313,7 @@ olsr_com_parse_connection(int fd, void *data, unsigned int flags) {
 
   OLSR_DEBUG(LOG_COMPORT, "Parsing connection of socket %d\n", fd);
   /* read data if necessary */
-  if (flags & SP_PR_READ) {
+  if (flags & OLSR_SOCKET_READ) {
     char buffer[1024];
     int len;
 
@@ -368,7 +367,7 @@ olsr_com_parse_connection(int fd, void *data, unsigned int flags) {
       con->send_as = PLAIN;
     }
 
-    if (flags & SP_PR_WRITE) {
+    if (flags & OLSR_SOCKET_WRITE) {
       int len;
 
       len = send(fd, con->out.buf, con->out.len, 0);
@@ -382,12 +381,12 @@ olsr_com_parse_connection(int fd, void *data, unsigned int flags) {
       }
     } else {
       OLSR_DEBUG(LOG_COMPORT, "  activating output in scheduler\n");
-      enable_olsr_socket(fd, &olsr_com_parse_connection, NULL, SP_PR_WRITE);
+      olsr_socket_enable(con->sock, OLSR_SOCKET_WRITE);
     }
   }
   if (con->out.len == 0) {
     OLSR_DEBUG(LOG_COMPORT, "  deactivating output in scheduler\n");
-    disable_olsr_socket(fd, &olsr_com_parse_connection, NULL, SP_PR_WRITE);
+    olsr_socket_disable(con->sock, OLSR_SOCKET_WRITE);
     if (con->state == SEND_AND_QUIT) {
       con->state = CLEANUP;
     }
@@ -397,7 +396,7 @@ olsr_com_parse_connection(int fd, void *data, unsigned int flags) {
   if (con->state == CLEANUP) {
     OLSR_DEBUG(LOG_COMPORT, "  cleanup\n");
     /* clean up connection by calling timeout directly */
-    olsr_stop_timer(con->timeout);
+    olsr_timer_stop(con->timeout);
     con->timeout = NULL;
     olsr_com_cleanup_session(con);
   }
index b4be484..0f454fd 100644 (file)
@@ -91,16 +91,16 @@ struct comport_connection {
    * internal part of the server
    */
   struct list_entity node;
-  int fd;
+  struct olsr_socket_entry *sock;
   enum connection_state state;
   enum http_header_type send_as;
   const char *http_contenttype;
-  struct timer_entry *timeout;
+  struct olsr_timer_entry *timeout;
   bool is_http, show_echo;
   struct autobuf in;
 };
 
-void olsr_com_init(bool);
+void olsr_com_init(void);
 void olsr_com_destroy(void);
 
 void EXPORT(olsr_com_activate_output) (struct comport_connection *con);
index 649cd29..d87ad9b 100644 (file)
@@ -48,7 +48,8 @@
 #include "olsr_ip_acl.h"
 #include "olsr.h"
 #include "ipcalc.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "olsr_comport.h"
 #include "olsr_comport_txt.h"
 #include "plugin_loader.h"
@@ -56,7 +57,7 @@
 #define OLSR_FOR_EACH_TXTCMD_ENTRY(cmd, iterator) avl_for_each_element_safe(&txt_normal_tree, cmd, node, iterator)
 
 struct txt_repeat_data {
-  struct timer_entry *timer;
+  struct olsr_timer_entry *timer;
   struct autobuf *buf;
   char *cmd;
   char *param;
@@ -136,7 +137,7 @@ olsr_com_init_txt(void) {
 
   txtcommand_cookie = olsr_memcookie_add("comport txt commands", sizeof(struct olsr_txtcommand));
 
-  txt_repeat_timerinfo = olsr_alloc_timerinfo("txt repeat timer", olsr_txt_repeat_timer, true);
+  txt_repeat_timerinfo = olsr_timer_add("txt repeat timer", olsr_txt_repeat_timer, true);
 
   for (i=0; i < ARRAYSIZE(txt_internal_names); i++) {
     txt_internal_normalcmd[i] = olsr_com_add_normal_txtcommand(txt_internal_names[i], txt_internal_handlers[i]);
@@ -318,7 +319,7 @@ void olsr_com_parse_txt(struct comport_connection *con,
   }
 
   /* reset timeout */
-  olsr_change_timer(con->timeout, con->timeout_value, 0);
+  olsr_timer_change(con->timeout, con->timeout_value, 0);
 
   /* print prompt */
   if (processedCommand && con->state == INTERACTIVE && con->show_echo) {
@@ -408,7 +409,7 @@ olsr_txtcmd_timeout(struct comport_connection *con,
 }
 
 static void olsr_txt_repeat_stophandler(struct comport_connection *con) {
-  olsr_stop_timer((struct timer_entry *)con->stop_data[0]);
+  olsr_timer_stop((struct olsr_timer_entry *)con->stop_data[0]);
   free(con->stop_data[1]);
 
   con->stop_handler = NULL;
@@ -431,7 +432,7 @@ olsr_txtcmd_repeat(struct comport_connection *con,
     const char *cmd __attribute__ ((unused)), const char *param) {
   int interval = 0;
   char *ptr;
-  struct timer_entry *timer;
+  struct olsr_timer_entry *timer;
 
   if (con->stop_handler) {
     abuf_puts(&con->out, "Error, you cannot stack continous output commands\n");
@@ -447,7 +448,7 @@ olsr_txtcmd_repeat(struct comport_connection *con,
 
   interval = atoi(param);
 
-  timer = olsr_start_timer(interval * 1000, 0, con, txt_repeat_timerinfo);
+  timer = olsr_timer_start(interval * 1000, 0, con, txt_repeat_timerinfo);
   con->stop_handler = olsr_txt_repeat_stophandler;
   con->stop_data[0] = timer;
   con->stop_data[1] = strdup(ptr);
diff --git a/src/olsr_socket.c b/src/olsr_socket.c
new file mode 100644 (file)
index 0000000..8d056e1
--- /dev/null
@@ -0,0 +1,255 @@
+
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+#include <unistd.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include "common/avl.h"
+#include "common/avl_olsr_comp.h"
+#include "olsr_logging.h"
+#include "olsr_memcookie.h"
+#include "olsr_timer.h"
+#include "os_net.h"
+#include "olsr_socket.h"
+
+/* Head of all OLSR used sockets */
+struct list_entity socket_head;
+
+static struct olsr_memcookie_info *socket_memcookie;
+
+/* helper function to free socket entry */
+static inline void olsr_socket_intfree(struct olsr_socket_entry *sock) {
+  list_remove(&sock->node);
+  olsr_memcookie_free(socket_memcookie, sock);
+}
+
+/**
+ * Initialize olsr socket scheduler
+ */
+void
+olsr_socket_init(void) {
+  list_init_head(&socket_head);
+
+  socket_memcookie = olsr_memcookie_add("socket entry", sizeof(struct olsr_socket_entry));
+}
+
+/**
+ * Cleanup olsr socket scheduler.
+ * This will close and free all sockets.
+ */
+void
+olsr_socket_cleanup(void)
+{
+  struct olsr_socket_entry *entry, *iterator;
+
+  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
+    os_close(entry->fd);
+    olsr_socket_intfree(entry);
+  }
+}
+
+/**
+ * Add a socket and handler to the socketset
+ * beeing used in the main select(2) loop
+ *
+ * @param fd file descriptor for socket
+ * @param pf_imm processing callback
+ * @param data custom data
+ * @param flags OLSR_SOCKET_READ/OLSR_SOCKET_WRITE (or both)
+ * @return pointer to socket_entry
+ */
+struct olsr_socket_entry *
+olsr_socket_add(int fd, socket_handler_func pf_imm, void *data, unsigned int flags)
+{
+  struct olsr_socket_entry *new_entry;
+
+  if (fd < 0 || pf_imm == NULL) {
+    OLSR_WARN(LOG_SCHEDULER, "Bogus socket entry - not registering...");
+    return NULL;
+  }
+  OLSR_DEBUG(LOG_SCHEDULER, "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);
+
+  return new_entry;
+}
+
+/**
+ * Remove a socket and handler from the socket scheduler
+ * @param sock pointer to socket entry
+ */
+void
+olsr_socket_remove(struct olsr_socket_entry *entry)
+{
+  OLSR_DEBUG(LOG_SCHEDULER, "Removing OLSR socket entry %d\n", entry->fd);
+
+  entry->process = NULL;
+  entry->flags = 0;
+}
+
+/**
+ * Handle all incoming socket events until a certain time
+ * @param next_interval
+ */
+void
+handle_sockets(uint32_t next_interval)
+{
+  struct olsr_socket_entry *entry, *iterator;
+  struct timeval tvp;
+  int32_t remaining;
+
+  /* Update time since this is much used by the parsing functions */
+  olsr_timer_updateClock();
+
+  remaining = olsr_timer_getRelative(next_interval);
+  if (remaining <= 0) {
+    /* we are already over the interval */
+    if (list_is_empty(&socket_head)) {
+      /* If there are no registered sockets we do not call select(2) */
+      return;
+    }
+    tvp.tv_sec = 0;
+    tvp.tv_usec = 0;
+  } else {
+    /* we need an absolute time - milliseconds */
+    tvp.tv_sec = remaining / MSEC_PER_SEC;
+    tvp.tv_usec = (remaining % MSEC_PER_SEC) * USEC_PER_MSEC;
+  }
+
+  /* do at least one select */
+  for (;;) {
+    fd_set ibits, obits;
+    int n, hfd = 0, fdsets = 0;
+    FD_ZERO(&ibits);
+    FD_ZERO(&obits);
+
+    /* Adding file-descriptors to FD set */
+    OLSR_FOR_ALL_SOCKETS(entry, iterator) {
+      if (entry->process == NULL) {
+        continue;
+      }
+      if ((entry->flags & OLSR_SOCKET_READ) != 0) {
+        fdsets |= OLSR_SOCKET_READ;
+        FD_SET((unsigned int)entry->fd, &ibits);        /* And we cast here since we get a warning on Win32 */
+      }
+      if ((entry->flags & OLSR_SOCKET_WRITE) != 0) {
+        fdsets |= OLSR_SOCKET_WRITE;
+        FD_SET((unsigned int)entry->fd, &obits);        /* And we cast here since we get a warning on Win32 */
+      }
+      if ((entry->flags & (OLSR_SOCKET_READ | OLSR_SOCKET_WRITE)) != 0 && entry->fd >= hfd) {
+        hfd = entry->fd + 1;
+      }
+    }
+
+    if (hfd == 0 && (long)remaining <= 0) {
+      /* we are over the interval and we have no fd's. Skip the select() etc. */
+      return;
+    }
+
+    do {
+      n = os_select(hfd,
+          fdsets & OLSR_SOCKET_READ ? &ibits : NULL,
+          fdsets & OLSR_SOCKET_WRITE ? &obits : NULL,
+          NULL, &tvp);
+    } while (n == -1 && errno == EINTR);
+
+    if (n == 0) {               /* timeout! */
+      break;
+    }
+    if (n == -1) {              /* Did something go wrong? */
+      OLSR_WARN(LOG_SCHEDULER, "select error: %s (%d)", strerror(errno), errno);
+      break;
+    }
+
+    /* Update time since this is much used by the parsing functions */
+    olsr_timer_updateClock();
+    OLSR_FOR_ALL_SOCKETS(entry, iterator) {
+      int flags;
+      if (entry->process == NULL) {
+        continue;
+      }
+      flags = 0;
+      if (FD_ISSET(entry->fd, &ibits)) {
+        flags |= OLSR_SOCKET_READ;
+      }
+      if (FD_ISSET(entry->fd, &obits)) {
+        flags |= OLSR_SOCKET_WRITE;
+      }
+      if (flags != 0) {
+        entry->process(entry->fd, entry->data, flags);
+      }
+    }
+
+    /* calculate the next timeout */
+    remaining = olsr_timer_getRelative(next_interval);
+    if (remaining <= 0) {
+      /* we are already over the interval */
+      break;
+    }
+    /* we need an absolute time - milliseconds */
+    tvp.tv_sec = remaining / MSEC_PER_SEC;
+    tvp.tv_usec = (remaining % MSEC_PER_SEC) * USEC_PER_MSEC;
+  }
+
+  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
+    if (entry->process == NULL) {
+      olsr_socket_intfree(entry);
+    }
+  }
+}
+
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/src/olsr_socket.h b/src/olsr_socket.h
new file mode 100644 (file)
index 0000000..8239ab8
--- /dev/null
@@ -0,0 +1,117 @@
+
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+
+#ifndef _OLSR_SCHEDULER
+#define _OLSR_SCHEDULER
+
+#include "common/list.h"
+#include "common/avl.h"
+
+#include "olsr_types.h"
+
+/* flags for socket handler */
+static const unsigned int OLSR_SOCKET_READ = 0x04;
+static const unsigned int OLSR_SOCKET_WRITE = 0x08;
+
+/* prototype for socket handler */
+typedef void (*socket_handler_func) (int fd, void *data, unsigned int flags);
+
+/* This struct represents a single registered socket handler */
+struct olsr_socket_entry {
+  /* list of socket handlers */
+  struct list_entity node;
+
+  /* file descriptor of the socket */
+  int fd;
+
+  /* socket handler */
+  socket_handler_func process;
+
+  /* custom data pointer for sockets */
+  void *data;
+
+  /* flags (OLSR_SOCKET_READ and OLSR_SOCKET_WRITE) */
+  unsigned int flags;
+};
+
+/* deletion safe macro for socket list traversal */
+extern struct list_entity EXPORT(socket_head);
+#define OLSR_FOR_ALL_SOCKETS(socket, iterator) list_for_each_element_safe(&socket_head, socket, node, iterator)
+
+void olsr_socket_init(void);
+void olsr_socket_cleanup(void);
+
+struct olsr_socket_entry *EXPORT(olsr_socket_add) (int fd,
+    socket_handler_func pf_imm, void *data, unsigned int flags);
+void EXPORT(olsr_socket_remove) (struct olsr_socket_entry *);
+
+/**
+ * Enable one or both flags of a socket handler
+ * @param sock pointer to socket entry
+ */
+static inline void
+olsr_socket_enable(struct olsr_socket_entry *entry, unsigned int flags)
+{
+  entry->flags |= flags;
+}
+
+/**
+ * Disable one or both flags of a socket handler
+ * @param sock pointer to socket entry
+ */
+static inline void
+olsr_socket_disable(struct olsr_socket_entry *entry, unsigned int flags)
+{
+  entry->flags &= ~flags;
+}
+
+/* used by timer scheduler */
+void handle_sockets(uint32_t next_interval);
+
+#endif
+
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * End:
+ */
index 2e592ed..76aa652 100644 (file)
@@ -50,7 +50,7 @@
 #include "olsr_logging.h"
 
 struct olsr_timer_info *spf_backoff_timer_info = NULL;
-struct timer_entry *spf_backoff_timer = NULL;
+struct olsr_timer_entry *spf_backoff_timer = NULL;
 
 /*
  * avl_comp_etx
@@ -276,7 +276,7 @@ olsr_expire_spf_backoff(void *context __attribute__ ((unused)))
 
 void
 olsr_init_spf(void) {
-  spf_backoff_timer_info = olsr_alloc_timerinfo("SPF backoff", olsr_expire_spf_backoff, false);
+  spf_backoff_timer_info = olsr_timer_add("SPF backoff", olsr_expire_spf_backoff, false);
 }
 
 void
@@ -293,13 +293,16 @@ olsr_calculate_routing_table(bool force)
   struct nbr_entry *neigh, *neigh_iterator;
   struct link_entry *link;
   int path_count = 0;
+#if !defined(REMOVE_LOG_DEBUG)
+  struct timeval_buf timebuf;
+#endif
 
   /* We are done if our backoff timer is running */
   if (!force && spf_backoff_timer != NULL) {
     return;
   }
 
-  olsr_set_timer(&spf_backoff_timer, OLSR_SPF_BACKOFF_TIME, OLSR_SPF_BACKOFF_JITTER,
+  olsr_timer_set(&spf_backoff_timer, OLSR_SPF_BACKOFF_TIME, OLSR_SPF_BACKOFF_JITTER,
       NULL, spf_backoff_timer_info);
 
 #ifdef SPF_PROFILING
@@ -368,7 +371,8 @@ olsr_calculate_routing_table(bool force)
    */
   olsr_spf_run_full(&cand_tree, &path_list, &path_count);
 
-  OLSR_DEBUG(LOG_ROUTING, "\n--- %s ------------------------------------------------- DIJKSTRA\n\n", olsr_wallclock_string());
+  OLSR_DEBUG(LOG_ROUTING, "\n--- %s ------------------------------------------------- DIJKSTRA\n\n",
+      olsr_timer_getWallclockString(&timebuf));
 
 #ifdef SPF_PROFILING
   gettimeofday(&t3, NULL);
similarity index 50%
rename from src/scheduler.c
rename to src/olsr_timer.c
index 566165f..8891409 100644 (file)
@@ -1,42 +1,8 @@
-
 /*
- * The olsr.org Optimized Link-State Routing daemon(olsrd)
- * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in
- *   the documentation and/or other materials provided with the
- *   distribution.
- * * Neither the name of olsr.org, olsrd nor the names of its
- *   contributors may be used to endorse or promote products derived
- *   from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * Visit http://www.olsr.org for more information.
- *
- * If you find this software useful feel free to make a donation
- * to the project. For more information see the website or contact
- * the copyright holders.
+ * olsr_timer.c
  *
+ *  Created on: Feb 14, 2011
+ *      Author: rogge
  */
 
 #include <unistd.h>
 
 #include "common/avl.h"
 #include "common/avl_olsr_comp.h"
-#include "scheduler.h"
-#include "link_set.h"
 #include "olsr.h"
+#include "olsr_logging.h"
 #include "olsr_memcookie.h"
-#include "os_net.h"
+#include "olsr_socket.h"
 #include "os_time.h"
-#include "olsr_logging.h"
+#include "olsr_timer.h"
 
-/* Timer data, global. Externed in scheduler.h */
-uint32_t now_times;                    /* relative time compared to startup (in milliseconds */
-struct timeval first_tv;               /* timevalue during startup */
-struct timeval last_tv;                /* timevalue used for last olsr_times() calculation */
+/* Timer data */
+static uint32_t now_times;             /* relative time compared to startup (in milliseconds */
+static struct timeval first_tv;        /* timevalue during startup */
+static struct timeval last_tv;         /* timevalue used for last olsr_times() calculation */
 
 /* Hashed root of all timers */
 static struct list_entity timer_wheel[TIMER_WHEEL_SLOTS];
 static uint32_t timer_last_run;        /* remember the last timeslot walk */
 
 /* Memory cookie for the timer manager */
-struct avl_tree timerinfo_tree;
+struct list_entity timerinfo_list;
 static struct olsr_memcookie_info *timer_mem_cookie = NULL;
 static struct olsr_memcookie_info *timerinfo_cookie = NULL;
 
-/* Head of all OLSR used sockets */
-static struct list_entity socket_head;
-
 /* Prototypes */
 static void walk_timers(uint32_t *);
-static void poll_sockets(void);
 static uint32_t calc_jitter(unsigned int rel_time, uint8_t jitter_pct, unsigned int random_val);
+static int olsr_get_timezone(void);
 
-/*
- * A wrapper around times(2). Note, that this function has some
- * portability problems, so do not rely on absolute values returned.
- * Under Linux, uclibc and libc directly call the sys_times() located
- * in kernel/sys.c and will only return an error if the tms_buf is
- * not writeable.
+/**
+ * Init datastructures for maintaining timers.
  */
-static uint32_t
-olsr_times(void)
+void
+olsr_timer_init(void)
+{
+  int idx;
+
+  OLSR_INFO(LOG_SCHEDULER, "Initializing scheduler.\n");
+
+  /* Grab initial timestamp */
+  if (os_gettimeofday(&first_tv, NULL)) {
+    OLSR_ERROR(LOG_TIMER, "OS clock is not working, have to shut down OLSR (%s)\n", strerror(errno));
+    olsr_exit(1);
+  }
+  last_tv = first_tv;
+  olsr_timer_updateClock();
+
+  /* init lists */
+  for (idx = 0; idx < TIMER_WHEEL_SLOTS; idx++) {
+    list_init_head(&timer_wheel[idx]);
+  }
+
+  /*
+   * Reset the last timer run.
+   */
+  timer_last_run = now_times;
+
+  /* Allocate a cookie for the block based memory manager. */
+  timer_mem_cookie = olsr_memcookie_add("timer_entry", sizeof(struct olsr_timer_entry));
+
+  list_init_head(&timerinfo_list);
+  timerinfo_cookie = olsr_memcookie_add("timerinfo", sizeof(struct olsr_timer_info));
+}
+
+/**
+ * Cleanup timer scheduler, this stops and deletes all timers
+ */
+void
+olsr_timer_cleanup(void)
+{
+  struct olsr_timer_info *ti, *iterator;
+
+  struct list_entity *timer_head_node;
+  unsigned int wheel_slot = 0;
+
+  for (wheel_slot = 0; wheel_slot < TIMER_WHEEL_SLOTS; wheel_slot++) {
+    timer_head_node = &timer_wheel[wheel_slot & TIMER_WHEEL_MASK];
+
+    /* Kill all entries hanging off this hash bucket. */
+    while (!list_is_empty(timer_head_node)) {
+      struct olsr_timer_entry *timer;
+
+      timer = list_first_element(timer_head_node, timer, timer_list);
+      olsr_timer_stop(timer);
+    }
+  }
+
+  /* free all timerinfos */
+  OLSR_FOR_ALL_TIMERS(ti, iterator) {
+    list_remove(&ti->node);
+    free(ti->name);
+    olsr_memcookie_free(timerinfo_cookie, ti);
+  }
+
+  /* release memory cookie for timers */
+  olsr_memcookie_remove(timerinfo_cookie);
+}
+
+/**
+ * Update the internal clock to current system time
+ */
+void
+olsr_timer_updateClock(void)
 {
   struct timeval tv;
   uint32_t t;
@@ -111,31 +138,35 @@ olsr_times(void)
       first_tv.tv_usec += 1000000;
     }
     last_tv = tv;
-    return t;
+    now_times =  t;
   }
   last_tv = tv;
-  return (tv.tv_sec - first_tv.tv_sec) * 1000 + (tv.tv_usec - first_tv.tv_usec) / 1000;
+  now_times = (tv.tv_sec - first_tv.tv_sec) * 1000 + (tv.tv_usec - first_tv.tv_usec) / 1000;
 }
 
 /**
  * Returns a timestamp s seconds in the future
+ * @param s milliseconds until timestamp
+ * @return absolute time when event will happen
  */
 uint32_t
-olsr_getTimestamp(uint32_t s)
+olsr_timer_getAbsolute(uint32_t relative)
 {
-  return now_times + s;
+  return now_times + relative;
 }
 
 /**
  * Returns the number of milliseconds until the timestamp will happen
+ * @param absolute timestamp
+ * @return milliseconds until event will happen, negative if it already
+ *   happened.
  */
-
 int32_t
-olsr_getTimeDue(uint32_t s)
+olsr_timer_getRelative(uint32_t absolute)
 {
   uint32_t diff;
-  if (s > now_times) {
-    diff = s - now_times;
+  if (absolute > now_times) {
+    diff = absolute - now_times;
 
     /* overflow ? */
     if (diff > (1u << 31)) {
@@ -144,7 +175,7 @@ olsr_getTimeDue(uint32_t s)
     return (int32_t) (diff);
   }
 
-  diff = now_times - s;
+  diff = now_times - absolute;
   /* overflow ? */
   if (diff > (1u << 31)) {
     return (int32_t) (0xffffffff - diff);
@@ -152,354 +183,268 @@ olsr_getTimeDue(uint32_t s)
   return -(int32_t) (diff);
 }
 
+/**
+ * Checks if a timestamp has already happened
+ * @param absolute timestamp
+ * @return true if the event already happened, false otherwise
+ */
 bool
-olsr_isTimedOut(uint32_t s)
+olsr_timer_isTimedOut(uint32_t absolute)
 {
-  if (s > now_times) {
-    return s - now_times > (1u << 31);
+  if (absolute > now_times) {
+    return absolute - now_times > (1u << 31);
   }
 
-  return now_times - s <= (1u << 31);
+  return now_times - absolute <= (1u << 31);
 }
 
+/**
+ * Add a new group of timers to the scheduler
+ * @param name
+ * @param callback timer event function
+ * @param periodic true if the timer is periodic, false otherwise
+ * @return new timer info
+ */
 struct olsr_timer_info *
-olsr_alloc_timerinfo(const char *name, timer_cb_func callback, bool periodic) {
+olsr_timer_add(const char *name, timer_cb_func callback, bool periodic) {
   struct olsr_timer_info *ti;
 
   ti = olsr_memcookie_malloc(timerinfo_cookie);
   ti->name = strdup(name);
-  ti->node.key = ti->name;
   ti->callback = callback;
   ti->periodic = periodic;
 
-  avl_insert(&timerinfo_tree, &ti->node);
+  list_add_tail(&timerinfo_list, &ti->node);
   return ti;
 }
 
 /**
- * Add a socket and handler to the socketset
- * beeing used in the main select(2) loop
- * in listen_loop
- *
- *@param fd the socket
- *@param pf the processing function
+ * Main timer scheduler event loop.
+ * Will call socket scheduler and olsr_process_changes()
  */
 void
-add_olsr_socket(int fd, socket_handler_func pf_pr, socket_handler_func pf_imm, void *data, unsigned int flags)
+olsr_timer_scheduler(void)
 {
-  struct olsr_socket_entry *new_entry;
+  OLSR_INFO(LOG_SCHEDULER, "Scheduler started - polling every %u ms\n", olsr_cnf->pollrate);
 
-  if (fd < 0 || (pf_pr == NULL && pf_imm == NULL)) {
-    OLSR_WARN(LOG_SCHEDULER, "Bogus socket entry - not registering...");
-    return;
-  }
-  OLSR_DEBUG(LOG_SCHEDULER, "Adding OLSR socket entry %d\n", fd);
+  /* Main scheduler loop */
+  while (app_state == STATE_RUNNING) {
+    uint32_t next_interval;
+
+    /*
+     * Update the global timestamp. We are using a non-wallclock timer here
+     * to avoid any undesired side effects if the system clock changes.
+     */
+    olsr_timer_updateClock();
+    next_interval = olsr_timer_getAbsolute(olsr_cnf->pollrate);
 
-  new_entry = olsr_malloc(sizeof(*new_entry), "Socket entry");
+    /* Process timers */
+    walk_timers(&timer_last_run);
 
-  new_entry->fd = fd;
-  new_entry->process_immediate = pf_imm;
-  new_entry->process_pollrate = pf_pr;
-  new_entry->data = data;
-  new_entry->flags = flags;
+    /* Update */
+    olsr_process_changes();
 
-  /* Queue */
-  list_add_before(&socket_head, &new_entry->socket_node);
+    /* Read incoming data and handle it immediately */
+    handle_sockets(next_interval);
+  }
 }
 
 /**
- * Remove a socket and handler to the socketset
- * beeing used in the main select(2) loop
- * in listen_loop
+ * Format an absolute wallclock system time string.
+ * May be called upto 4 times in a single printf() statement.
+ * Displays microsecond resolution.
  *
- *@param fd the socket
- *@param pf the processing function
+ * @return buffer to a formatted system time string.
  */
-int
-remove_olsr_socket(int fd, socket_handler_func pf_pr, socket_handler_func pf_imm)
+const char *
+olsr_timer_getWallclockString(struct timeval_buf *buf)
 {
-  struct olsr_socket_entry *entry, *iterator;
+  struct timeval now;
+  int sec, usec;
 
-  if (fd < 0 || (pf_pr == NULL && pf_imm == NULL)) {
-    OLSR_WARN(LOG_SCHEDULER, "Bogus socket entry - not processing...");
-    return 0;
-  }
-  OLSR_DEBUG(LOG_SCHEDULER, "Removing OLSR socket entry %d\n", fd);
-
-  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
-    if (entry->fd == fd && entry->process_immediate == pf_imm && entry->process_pollrate == pf_pr) {
-      /* just mark this node as "deleted", it will be cleared later at the end of handle_fds() */
-      entry->process_immediate = NULL;
-      entry->process_pollrate = NULL;
-      entry->flags = 0;      return 1;
-    }
-  }
-  return 0;
-}
+  os_gettimeofday(&now, NULL);
 
-void
-enable_olsr_socket(int fd, socket_handler_func pf_pr, socket_handler_func pf_imm, unsigned int flags)
-{
-  struct olsr_socket_entry *entry, *iterator;
+  sec = (int)now.tv_sec + olsr_get_timezone();
+  usec = (int)now.tv_usec;
 
-  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
-    if (entry->fd == fd && entry->process_immediate == pf_imm && entry->process_pollrate == pf_pr) {
-      entry->flags |= flags;
-    }
-  }
+  snprintf(buf->buf, sizeof(buf), "%02d:%02d:%02d.%06d",
+      (sec % 86400) / 3600, (sec % 3600) / 60, sec % 60, usec);
+
+  return buf->buf;
 }
 
-void
-disable_olsr_socket(int fd, socket_handler_func pf_pr, socket_handler_func pf_imm, unsigned int flags)
+/**
+ * Format an relative non-wallclock system time string.
+ * Displays millisecond resolution.
+ *
+ * @param absolute timestamp
+ * @return buffer to a formatted system time string.
+ */
+const char *
+olsr_timer_getClockString(struct timeval_buf *buf, uint32_t clk)
 {
-  struct olsr_socket_entry *entry, *iterator;
+  unsigned int msec = clk % 1000;
+  unsigned int sec = clk / 1000;
 
-  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
-    if (entry->fd == fd && entry->process_immediate == pf_imm && entry->process_pollrate == pf_pr) {
-      entry->flags &= ~flags;
-    }
-  }
+  snprintf(buf->buf, sizeof(buf),
+      "%02u:%02u:%02u.%03u", sec / 3600, (sec % 3600) / 60, (sec % 60), (msec % MSEC_PER_SEC));
+
+  return buf->buf;
 }
 
 /**
- * Close and free all sockets.
+ * Start a new timer.
+ *
+ * @param relative time expressed in milliseconds
+ * @param jitter expressed in percent
+ * @param timer callback function
+ * @param context for the callback function
+ * @return a pointer to the created entry
  */
-void
-olsr_flush_sockets(void)
+struct olsr_timer_entry *
+olsr_timer_start(unsigned int rel_time,
+                 uint8_t jitter_pct, void *context, struct olsr_timer_info *ti)
 {
-  struct olsr_socket_entry *entry, *iterator;
+  struct olsr_timer_entry *timer;
+#if !defined(REMOVE_LOG_DEBUG)
+  struct timeval_buf timebuf;
+#endif
 
-  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
-    os_close(entry->fd);
-    list_remove(&entry->socket_node);
-    free(entry);
-  }
-}
+  assert(ti != 0);          /* we want timer cookies everywhere */
+  assert(rel_time);
+  assert(jitter_pct <= 100);
 
-static void
-poll_sockets(void)
-{
-  int n;
-  struct olsr_socket_entry *entry, *iterator;
-  fd_set ibits, obits;
-  struct timeval tvp = { 0, 0 };
-  int hfd = 0, fdsets = 0;
-
-  /* If there are no registered sockets we
-   * do not call select(2)
+  timer = olsr_memcookie_malloc(timer_mem_cookie);
+
+  /*
+   * Compute random numbers only once.
    */
-  if (list_is_empty(&socket_head)) {
-    return;
+  if (!timer->timer_random) {
+    timer->timer_random = random();
   }
 
-  FD_ZERO(&ibits);
-  FD_ZERO(&obits);
-
-  /* Adding file-descriptors to FD set */
-  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
-    if (entry->process_pollrate == NULL) {
-      continue;
-    }
-    if ((entry->flags & SP_PR_READ) != 0) {
-      fdsets |= SP_PR_READ;
-      FD_SET((unsigned int)entry->fd, &ibits);  /* And we cast here since we get a warning on Win32 */
-    }
-    if ((entry->flags & SP_PR_WRITE) != 0) {
-      fdsets |= SP_PR_WRITE;
-      FD_SET((unsigned int)entry->fd, &obits);  /* And we cast here since we get a warning on Win32 */
-    }
-    if ((entry->flags & (SP_PR_READ | SP_PR_WRITE)) != 0 && entry->fd >= hfd) {
-      hfd = entry->fd + 1;
-    }
-  }
+  /* Fill entry */
+  timer->timer_clock = calc_jitter(rel_time, jitter_pct, timer->timer_random);
+  timer->timer_cb_context = context;
+  timer->timer_jitter_pct = jitter_pct;
+  timer->timer_running = true;
 
-  /* Running select on the FD set */
-  do {
-    n = os_select(hfd, fdsets & SP_PR_READ ? &ibits : NULL, fdsets & SP_PR_WRITE ? &obits : NULL, NULL, &tvp);
-  } while (n == -1 && errno == EINTR);
+  /* The cookie is used for debugging to traceback the originator */
+  timer->timer_info = ti;
+  ti->usage++;
+  ti->changes++;
 
-  if (n == 0) {
-    return;
-  }
-  if (n == -1) {                /* Did something go wrong? */
-    OLSR_WARN(LOG_SCHEDULER, "select error: %s", strerror(errno));
-    return;
-  }
+  /* Singleshot or periodical timer ? */
+  timer->timer_period = ti->periodic ? rel_time : 0;
 
-  /* Update time since this is much used by the parsing functions */
-  now_times = olsr_times();
-  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
-    int flags;
-    if (entry->process_pollrate == NULL) {
-      continue;
-    }
-    flags = 0;
-    if (FD_ISSET(entry->fd, &ibits)) {
-      flags |= SP_PR_READ;
-    }
-    if (FD_ISSET(entry->fd, &obits)) {
-      flags |= SP_PR_WRITE;
-    }
+  /*
+   * Now insert in the respective timer_wheel slot.
+   */
+  list_add_before(&timer_wheel[timer->timer_clock & TIMER_WHEEL_MASK], &timer->timer_list);
 
-    if (flags) {
-      OLSR_DEBUG(LOG_SCHEDULER, "Event from socket %d (%d)", entry->fd, flags);
-    }
+  OLSR_DEBUG(LOG_TIMER, "TIMER: start %s timer %p firing in %s, ctx %p\n",
+             ti->name, timer, olsr_timer_getClockString(&timebuf, timer->timer_clock), context);
 
-    if (flags != 0) {
-      entry->process_pollrate(entry->fd, entry->data, flags);
-    }
-  }
+  return timer;
 }
 
-static void
-handle_fds(uint32_t next_interval)
+/**
+ * Delete a timer.
+ *
+ * @param the olsr_timer_entry that shall be removed
+ * @return nada
+ */
+void
+olsr_timer_stop(struct olsr_timer_entry *timer)
 {
-  struct olsr_socket_entry *entry, *iterator;
-  struct timeval tvp;
-  int32_t remaining;
-
-  /* calculate the first timeout */
-  now_times = olsr_times();
-
-  remaining = TIME_DUE(next_interval);
-  if (remaining <= 0) {
-    /* we are already over the interval */
-    if (list_is_empty(&socket_head)) {
-      /* If there are no registered sockets we do not call select(2) */
-      return;
-    }
-    tvp.tv_sec = 0;
-    tvp.tv_usec = 0;
-  } else {
-    /* we need an absolute time - milliseconds */
-    tvp.tv_sec = remaining / MSEC_PER_SEC;
-    tvp.tv_usec = (remaining % MSEC_PER_SEC) * USEC_PER_MSEC;
+  /* It's okay to get a NULL here */
+  if (timer == NULL) {
+    return;
   }
 
-  /* do at least one select */
-  for (;;) {
-    fd_set ibits, obits;
-    int n, hfd = 0, fdsets = 0;
-    FD_ZERO(&ibits);
-    FD_ZERO(&obits);
-
-    /* Adding file-descriptors to FD set */
-    OLSR_FOR_ALL_SOCKETS(entry, iterator) {
-      if (entry->process_immediate == NULL) {
-        continue;
-      }
-      if ((entry->flags & SP_IMM_READ) != 0) {
-        fdsets |= SP_IMM_READ;
-        FD_SET((unsigned int)entry->fd, &ibits);        /* And we cast here since we get a warning on Win32 */
-      }
-      if ((entry->flags & SP_IMM_WRITE) != 0) {
-        fdsets |= SP_IMM_WRITE;
-        FD_SET((unsigned int)entry->fd, &obits);        /* And we cast here since we get a warning on Win32 */
-      }
-      if ((entry->flags & (SP_IMM_READ | SP_IMM_WRITE)) != 0 && entry->fd >= hfd) {
-        hfd = entry->fd + 1;
-      }
-    }
-
-    if (hfd == 0 && (long)remaining <= 0) {
-      /* we are over the interval and we have no fd's. Skip the select() etc. */
-      return;
-    }
-
-    do {
-      n = os_select(hfd, fdsets & SP_IMM_READ ? &ibits : NULL, fdsets & SP_IMM_WRITE ? &obits : NULL, NULL, &tvp);
-    } while (n == -1 && errno == EINTR);
+  assert(timer->timer_info);     /* we want timer cookies everywhere */
+  assert(timer->timer_list.next != NULL && timer->timer_list.prev != NULL);
 
-    if (n == 0) {               /* timeout! */
-      break;
-    }
-    if (n == -1) {              /* Did something go wrong? */
-      OLSR_WARN(LOG_SCHEDULER, "select error: %s", strerror(errno));
-      break;
-    }
+  OLSR_DEBUG(LOG_TIMER, "TIMER: stop %s timer %p, ctx %p\n",
+             timer->timer_info->name, timer, timer->timer_cb_context);
 
-    /* Update time since this is much used by the parsing functions */
-    now_times = olsr_times();
-    OLSR_FOR_ALL_SOCKETS(entry, iterator) {
-      int flags;
-      if (entry->process_immediate == NULL) {
-        continue;
-      }
-      flags = 0;
-      if (FD_ISSET(entry->fd, &ibits)) {
-        flags |= SP_IMM_READ;
-      }
-      if (FD_ISSET(entry->fd, &obits)) {
-        flags |= SP_IMM_WRITE;
-      }
-      if (flags != 0) {
-        entry->process_immediate(entry->fd, entry->data, flags);
-      }
-    }
 
-    /* calculate the next timeout */
-    remaining = TIME_DUE(next_interval);
-    if (remaining <= 0) {
-      /* we are already over the interval */
-      break;
-    }
-    /* we need an absolute time - milliseconds */
-    tvp.tv_sec = remaining / MSEC_PER_SEC;
-    tvp.tv_usec = (remaining % MSEC_PER_SEC) * USEC_PER_MSEC;
-  }
+  /*
+   * Carve out of the existing wheel_slot and free.
+   */
+  list_remove(&timer->timer_list);
+  timer->timer_running = false;
+  timer->timer_info->usage--;
+  timer->timer_info->changes++;
 
-  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
-    if (entry->process_immediate == NULL && entry->process_pollrate == NULL) {
-      /* clean up socket handler */
-      list_remove(&entry->socket_node);
-      free(entry);
-    }
+  if (!timer->timer_in_callback) {
+    olsr_memcookie_free(timer_mem_cookie, timer);
   }
 }
 
 /**
- * Main scheduler event loop. Polls at every
- * sched_poll_interval and calls all functions
- * that are timed out or that are triggered.
- * Also calls the olsr_process_changes()
- * function at every poll.
+ * Change a olsr_timer_entry.
  *
+ * @param olsr_timer_entry to be changed.
+ * @param new relative time expressed in units of milliseconds.
+ * @param new jitter expressed in percent.
  * @return nada
  */
 void
-olsr_scheduler(void)
+olsr_timer_change(struct olsr_timer_entry *timer, unsigned int rel_time, uint8_t jitter_pct)
 {
-  OLSR_INFO(LOG_SCHEDULER, "Scheduler started - polling every %u ms\n", olsr_cnf->pollrate);
+#if !defined(REMOVE_LOG_DEBUG)
+  struct timeval_buf timebuf;
+#endif
 
-  /* Main scheduler loop */
-  while (app_state == STATE_RUNNING) {
-    uint32_t next_interval;
+  /* Sanity check. */
+  if (!timer) {
+    return;
+  }
 
-    /*
-     * Update the global timestamp. We are using a non-wallclock timer here
-     * to avoid any undesired side effects if the system clock changes.
-     */
-    now_times = olsr_times();
-    next_interval = GET_TIMESTAMP(olsr_cnf->pollrate);
+  assert(timer->timer_info);     /* we want timer cookies everywhere */
 
-    /* Read incoming data */
-    poll_sockets();
+  /* Singleshot or periodical timer ? */
+  timer->timer_period = timer->timer_info->periodic ? rel_time : 0;
 
-    /* Process timers */
-    walk_timers(&timer_last_run);
+  timer->timer_clock = calc_jitter(rel_time, jitter_pct, timer->timer_random);
+  timer->timer_jitter_pct = jitter_pct;
 
-    /* Update */
-    olsr_process_changes();
+  /*
+   * Changes are easy: Remove timer from the exisiting timer_wheel slot
+   * and reinsert into the new slot.
+   */
+  list_remove(&timer->timer_list);
+  list_add_before(&timer_wheel[timer->timer_clock & TIMER_WHEEL_MASK], &timer->timer_list);
 
-    /* Check for changes in topology */
-    if (link_changes) {
-      increase_local_ansn_number();
-      OLSR_DEBUG(LOG_SCHEDULER, "ANSN UPDATED %d\n\n", get_local_ansn_number());
-      link_changes = false;
-    }
+  OLSR_DEBUG(LOG_TIMER, "TIMER: change %s timer %p, firing to %s, ctx %p\n",
+             timer->timer_info->name, timer,
+             olsr_timer_getClockString(&timebuf, timer->timer_clock), timer->timer_cb_context);
+}
 
-    /* Read incoming data and handle it immediiately */
-    handle_fds(next_interval);
+/*
+ * This is the one stop shop for all sort of timer manipulation.
+ * Depending on the paseed in parameters a new timer is started,
+ * or an existing timer is started or an existing timer is
+ * terminated.
+ */
+void
+olsr_timer_set(struct olsr_timer_entry **timer_ptr,
+               unsigned int rel_time,
+               uint8_t jitter_pct, void *context, struct olsr_timer_info *ti)
+{
+  assert(ti);          /* we want timer cookies everywhere */
+  if (rel_time == 0) {
+    /* No good future time provided, kill it. */
+    olsr_timer_stop(*timer_ptr);
+    *timer_ptr = NULL;
+  }
+  else if ((*timer_ptr) == NULL) {
+    /* No timer running, kick it. */
+    *timer_ptr = olsr_timer_start(rel_time, jitter_pct, context, ti);
+  }
+  else {
+    olsr_timer_change(*timer_ptr, rel_time, jitter_pct);
   }
 }
 
@@ -509,7 +454,7 @@ olsr_scheduler(void)
  * @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 in system clock tick units
+ * @return the absolute timer
  */
 static uint32_t
 calc_jitter(unsigned int rel_time, uint8_t jitter_pct, unsigned int random_val)
@@ -521,7 +466,7 @@ calc_jitter(unsigned int rel_time, uint8_t jitter_pct, unsigned int random_val)
    * Also protect against overflows resulting from > 25 bit timers.
    */
   if (jitter_pct == 0 || jitter_pct > 99 || rel_time > (1 << 24)) {
-    return GET_TIMESTAMP(rel_time);
+    return olsr_timer_getAbsolute(rel_time);
   }
 
   /*
@@ -532,43 +477,7 @@ calc_jitter(unsigned int rel_time, uint8_t jitter_pct, unsigned int random_val)
 
   OLSR_DEBUG(LOG_TIMER, "TIMER: jitter %u%% rel_time %ums to %ums\n", jitter_pct, rel_time, rel_time - jitter_time);
 
-  return GET_TIMESTAMP(rel_time - jitter_time);
-}
-
-/**
- * Init datastructures for maintaining timers.
- */
-void
-olsr_init_timers(void)
-{
-  int idx;
-
-  OLSR_INFO(LOG_SCHEDULER, "Initializing scheduler.\n");
-
-  /* Grab initial timestamp */
-  if (os_gettimeofday(&first_tv, NULL)) {
-    OLSR_ERROR(LOG_TIMER, "OS clock is not working, have to shut down OLSR (%s)\n", strerror(errno));
-    olsr_exit(1);
-  }
-  last_tv = first_tv;
-  now_times = olsr_times();
-
-  /* init lists */
-  list_init_head(&socket_head);
-  for (idx = 0; idx < TIMER_WHEEL_SLOTS; idx++) {
-    list_init_head(&timer_wheel[idx]);
-  }
-
-  /*
-   * Reset the last timer run.
-   */
-  timer_last_run = now_times;
-
-  /* Allocate a cookie for the block based memory manager. */
-  timer_mem_cookie = olsr_memcookie_add("timer_entry", sizeof(struct timer_entry));
-
-  avl_init(&timerinfo_tree, avl_comp_strcasecmp, false, NULL);
-  timerinfo_cookie = olsr_memcookie_add("timerinfo", sizeof(struct olsr_timer_info));
+  return olsr_timer_getAbsolute(rel_time - jitter_time);
 }
 
 /**
@@ -602,7 +511,7 @@ walk_timers(uint32_t * last_run)
     list_init_head(&tmp_head_node);
     while (!list_is_empty(timer_head_node)) {
       /* the top element */
-      struct timer_entry *timer;
+      struct olsr_timer_entry *timer;
 
       timer = list_first_element(timer_head_node, timer, timer_list);
 
@@ -616,11 +525,15 @@ walk_timers(uint32_t * last_run)
       timers_walked++;
 
       /* Ready to fire ? */
-      if (TIMED_OUT(timer->timer_clock)) {
+      if (olsr_timer_isTimedOut(timer->timer_clock)) {
+#if !defined(REMOVE_LOG_DEBUG)
+  struct timeval_buf timebuf;
+#endif
         OLSR_DEBUG(LOG_TIMER, "TIMER: fire %s timer %p, ctx %p, "
                    "at clocktick %u (%s)\n",
                    timer->timer_info->name,
-                   timer, timer->timer_cb_context, (unsigned int)*last_run, olsr_wallclock_string());
+                   timer, timer->timer_cb_context, (unsigned int)*last_run,
+                   olsr_timer_getWallclockString(&timebuf));
 
         /* This timer is expired, call into the provided callback function */
         timer->timer_in_callback = true;
@@ -637,10 +550,10 @@ walk_timers(uint32_t * last_run)
           if (timer->timer_period) {
             /* For periodical timers, rehash the random number and restart */
             timer->timer_random = random();
-            olsr_change_timer(timer, timer->timer_period, timer->timer_jitter_pct);
+            olsr_timer_change(timer, timer->timer_period, timer->timer_jitter_pct);
           } else {
             /* Singleshot timers are stopped */
-            olsr_stop_timer(timer);
+            olsr_timer_stop(timer);
           }
         }
         else {
@@ -677,40 +590,6 @@ walk_timers(uint32_t * last_run)
   *last_run = now_times;
 }
 
-/**
- * Stop and delete all timers.
- */
-void
-olsr_flush_timers(void)
-{
-  struct olsr_timer_info *ti, *iterator;
-
-  struct list_entity *timer_head_node;
-  unsigned int wheel_slot = 0;
-
-  for (wheel_slot = 0; wheel_slot < TIMER_WHEEL_SLOTS; wheel_slot++) {
-    timer_head_node = &timer_wheel[wheel_slot & TIMER_WHEEL_MASK];
-
-    /* Kill all entries hanging off this hash bucket. */
-    while (!list_is_empty(timer_head_node)) {
-      struct timer_entry *timer;
-
-      timer = list_first_element(timer_head_node, timer, timer_list);
-      olsr_stop_timer(timer);
-    }
-  }
-
-  /* free all timerinfos */
-  OLSR_FOR_ALL_TIMERS(ti, iterator) {
-    avl_delete(&timerinfo_tree, &ti->node);
-    free(ti->name);
-    olsr_memcookie_free(timerinfo_cookie, ti);
-  }
-
-  /* release memory cookie for timers */
-  olsr_memcookie_remove(timerinfo_cookie);
-}
-
 /**
  * Returns the difference between gmt and local time in seconds.
  * Use gmtime() and localtime() to keep things simple.
@@ -745,205 +624,3 @@ olsr_get_timezone(void)
   return time_diff;
 }
 
-/**
- * Format an absolute wallclock system time string.
- * May be called upto 4 times in a single printf() statement.
- * Displays microsecond resolution.
- *
- * @return buffer to a formatted system time string.
- */
-const char *
-olsr_wallclock_string(void)
-{
-  static char buf[sizeof("00:00:00.000000")];
-  struct timeval now;
-  int sec, usec;
-
-  os_gettimeofday(&now, NULL);
-
-  sec = (int)now.tv_sec + olsr_get_timezone();
-  usec = (int)now.tv_usec;
-
-  snprintf(buf, sizeof(buf), "%02d:%02d:%02d.%06d", (sec % 86400) / 3600, (sec % 3600) / 60, sec % 60, usec);
-
-  return buf;
-}
-
-/**
- * Format an relative non-wallclock system time string.
- * May be called upto 4 times in a single printf() statement.
- * Displays millisecond resolution.
- *
- * @param absolute time expressed in clockticks
- * @return buffer to a formatted system time string.
- */
-const char *
-olsr_clock_string(uint32_t clk)
-{
-  static char buf[sizeof("00:00:00.000")];
-
-  /* On most systems a clocktick is a 10ms quantity. */
-  unsigned int msec = clk % 1000;
-  unsigned int sec = clk / 1000;
-
-  snprintf(buf, sizeof(buf), "%02u:%02u:%02u.%03u", sec / 3600, (sec % 3600) / 60, (sec % 60), (msec % MSEC_PER_SEC));
-
-  return buf;
-}
-
-/**
- * Start a new timer.
- *
- * @param relative time expressed in milliseconds
- * @param jitter expressed in percent
- * @param timer callback function
- * @param context for the callback function
- * @return a pointer to the created entry
- */
-struct timer_entry *
-olsr_start_timer(unsigned int rel_time,
-                 uint8_t jitter_pct, void *context, struct olsr_timer_info *ti)
-{
-  struct timer_entry *timer;
-
-  assert(ti != 0);          /* we want timer cookies everywhere */
-  assert(rel_time);
-  assert(jitter_pct <= 100);
-
-  timer = olsr_memcookie_malloc(timer_mem_cookie);
-
-  /*
-   * Compute random numbers only once.
-   */
-  if (!timer->timer_random) {
-    timer->timer_random = random();
-  }
-
-  /* Fill entry */
-  timer->timer_clock = calc_jitter(rel_time, jitter_pct, timer->timer_random);
-  timer->timer_cb_context = context;
-  timer->timer_jitter_pct = jitter_pct;
-  timer->timer_running = true;
-
-  /* The cookie is used for debugging to traceback the originator */
-  timer->timer_info = ti;
-  ti->usage++;
-  ti->changes++;
-
-  /* Singleshot or periodical timer ? */
-  timer->timer_period = ti->periodic ? rel_time : 0;
-
-  /*
-   * Now insert in the respective timer_wheel slot.
-   */
-  list_add_before(&timer_wheel[timer->timer_clock & TIMER_WHEEL_MASK], &timer->timer_list);
-
-  OLSR_DEBUG(LOG_TIMER, "TIMER: start %s timer %p firing in %s, ctx %p\n",
-             ti->name, timer, olsr_clock_string(timer->timer_clock), context);
-
-  return timer;
-}
-#include "valgrind/valgrind.h"
-
-/**
- * Delete a timer.
- *
- * @param the timer_entry that shall be removed
- * @return nada
- */
-void
-olsr_stop_timer(struct timer_entry *timer)
-{
-  /* It's okay to get a NULL here */
-  if (timer == NULL) {
-    return;
-  }
-
-  assert(timer->timer_info);     /* we want timer cookies everywhere */
-  assert(timer->timer_list.next != NULL && timer->timer_list.prev != NULL);
-
-  OLSR_DEBUG(LOG_TIMER, "TIMER: stop %s timer %p, ctx %p\n",
-             timer->timer_info->name, timer, timer->timer_cb_context);
-
-
-  /*
-   * Carve out of the existing wheel_slot and free.
-   */
-  list_remove(&timer->timer_list);
-  timer->timer_running = false;
-  timer->timer_info->usage--;
-  timer->timer_info->changes++;
-
-  if (!timer->timer_in_callback) {
-    olsr_memcookie_free(timer_mem_cookie, timer);
-  }
-}
-
-/**
- * Change a timer_entry.
- *
- * @param timer_entry to be changed.
- * @param new relative time expressed in units of milliseconds.
- * @param new jitter expressed in percent.
- * @return nada
- */
-void
-olsr_change_timer(struct timer_entry *timer, unsigned int rel_time, uint8_t jitter_pct)
-{
-  /* Sanity check. */
-  if (!timer) {
-    return;
-  }
-
-  assert(timer->timer_info);     /* we want timer cookies everywhere */
-
-  /* Singleshot or periodical timer ? */
-  timer->timer_period = timer->timer_info->periodic ? rel_time : 0;
-
-  timer->timer_clock = calc_jitter(rel_time, jitter_pct, timer->timer_random);
-  timer->timer_jitter_pct = jitter_pct;
-
-  /*
-   * Changes are easy: Remove timer from the exisiting timer_wheel slot
-   * and reinsert into the new slot.
-   */
-  list_remove(&timer->timer_list);
-  list_add_before(&timer_wheel[timer->timer_clock & TIMER_WHEEL_MASK], &timer->timer_list);
-
-  OLSR_DEBUG(LOG_TIMER, "TIMER: change %s timer %p, firing to %s, ctx %p\n",
-             timer->timer_info->name, timer,
-             olsr_clock_string(timer->timer_clock), timer->timer_cb_context);
-}
-
-/*
- * This is the one stop shop for all sort of timer manipulation.
- * Depending on the paseed in parameters a new timer is started,
- * or an existing timer is started or an existing timer is
- * terminated.
- */
-void
-olsr_set_timer(struct timer_entry **timer_ptr,
-               unsigned int rel_time,
-               uint8_t jitter_pct, void *context, struct olsr_timer_info *ti)
-{
-  assert(ti);          /* we want timer cookies everywhere */
-  if (rel_time == 0) {
-    /* No good future time provided, kill it. */
-    olsr_stop_timer(*timer_ptr);
-    *timer_ptr = NULL;
-  }
-  else if ((*timer_ptr) == NULL) {
-    /* No timer running, kick it. */
-    *timer_ptr = olsr_start_timer(rel_time, jitter_pct, context, ti);
-  }
-  else {
-    olsr_change_timer(*timer_ptr, rel_time, jitter_pct);
-  }
-}
-
-/*
- * Local Variables:
- * c-basic-offset: 2
- * indent-tabs-mode: nil
- * End:
- */
diff --git a/src/olsr_timer.h b/src/olsr_timer.h
new file mode 100644 (file)
index 0000000..e40d713
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * olsr_timer.h
+ *
+ *  Created on: Feb 14, 2011
+ *      Author: rogge
+ */
+
+#ifndef OLSR_TIMER_H_
+#define OLSR_TIMER_H_
+
+#include "olsr_time.h"
+#include "common/list.h"
+#include "common/avl.h"
+
+#include "olsr_types.h"
+
+#define TIMER_WHEEL_SLOTS 1024
+#define TIMER_WHEEL_MASK (TIMER_WHEEL_SLOTS - 1)
+
+/* prototype for timer callback */
+typedef void (*timer_cb_func) (void *);
+
+/*
+ * This struct defines a class of timers which have the same
+ * type (periodic/non-periodic) and callback.
+ */
+struct olsr_timer_info {
+  /* node of timerinfo list */
+  struct list_entity node;
+
+  /* name of this timer class */
+  char *name;
+
+  /* callback function */
+  timer_cb_func callback;
+
+  /* true if this is a class of periodic timers */
+  bool periodic;
+
+  /* Stats, resource usage */
+  uint32_t usage;
+
+  /* Stats, resource churn */
+  uint32_t changes;
+};
+
+
+/*
+ * Our timer implementation is a based on individual timers arranged in
+ * a double linked list hanging of hash containers called a timer wheel slot.
+ * For every timer a olsr_timer_entry is created and attached to the timer wheel slot.
+ * When the timer fires, the timer_cb function is called with the
+ * context pointer.
+ */
+struct olsr_timer_entry {
+  /* Wheel membership */
+  struct list_entity timer_list;
+
+  /* backpointer to timer info */
+  struct olsr_timer_info *timer_info;
+
+  /* when timer shall fire (absolute internal timerstamp) */
+  uint32_t timer_clock;
+
+  /* timeperiod between two timer events for periodical timers */
+  uint32_t timer_period;
+
+  /* the jitter expressed in percent */
+  uint8_t timer_jitter_pct;
+
+  /* true if timer is running at the moment */
+  bool timer_running;
+
+  /* true if timer is in callback at the moment */
+  bool timer_in_callback;
+
+  /* cache random() result for performance reasons */
+  unsigned int timer_random;
+
+  /* context pointer */
+  void *timer_cb_context;
+};
+
+/* buffer for displaying absolute timestamps */
+struct timeval_buf {
+  char buf[sizeof("00:00:00.000000")];
+};
+
+/* Timers */
+extern struct list_entity EXPORT(timerinfo_list);
+#define OLSR_FOR_ALL_TIMERS(ti, iterator) list_for_each_element_safe(&timerinfo_list, ti, node, iterator)
+
+void olsr_timer_init(void);
+void olsr_timer_cleanup(void);
+void olsr_timer_updateClock(void);
+
+uint32_t EXPORT(olsr_timer_getAbsolute) (uint32_t relative);
+int32_t EXPORT(olsr_timer_getRelative) (uint32_t absolute);
+bool EXPORT(olsr_timer_isTimedOut) (uint32_t s);
+
+/**
+ * Calculates the current time in the internal OLSR representation
+ * @return current time
+ */
+static inline uint32_t olsr_timer_getNow(void) {
+  return olsr_timer_getAbsolute(0);
+}
+
+void EXPORT(olsr_timer_set) (struct olsr_timer_entry **, uint32_t, uint8_t,
+    void *, struct olsr_timer_info *);
+struct olsr_timer_entry *EXPORT(olsr_timer_start) (uint32_t, uint8_t,
+    void *, struct olsr_timer_info *);
+void EXPORT(olsr_timer_change)(struct olsr_timer_entry *, uint32_t, uint8_t);
+void EXPORT(olsr_timer_stop) (struct olsr_timer_entry *);
+
+struct olsr_timer_info *EXPORT(olsr_timer_add)(const char *name, timer_cb_func callback, bool periodic);
+
+const char *EXPORT(olsr_timer_getClockString)(struct timeval_buf *, uint32_t);
+const char *EXPORT(olsr_timer_getWallclockString)(struct timeval_buf *);
+
+/* Main scheduler loop */
+void olsr_timer_scheduler(void);
+
+#endif /* OLSR_TIMER_H_ */
diff --git a/src/scheduler.h b/src/scheduler.h
deleted file mode 100644 (file)
index 22e8f1f..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-
-/*
- * The olsr.org Optimized Link-State Routing daemon(olsrd)
- * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in
- *   the documentation and/or other materials provided with the
- *   distribution.
- * * Neither the name of olsr.org, olsrd nor the names of its
- *   contributors may be used to endorse or promote products derived
- *   from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * Visit http://www.olsr.org for more information.
- *
- * If you find this software useful feel free to make a donation
- * to the project. For more information see the website or contact
- * the copyright holders.
- *
- */
-
-
-#ifndef _OLSR_SCHEDULER
-#define _OLSR_SCHEDULER
-
-#include "olsr_time.h"
-#include "common/list.h"
-#include "common/avl.h"
-
-#include "olsr_types.h"
-
-#include <time.h>
-
-#define TIMER_WHEEL_SLOTS 1024
-#define TIMER_WHEEL_MASK (TIMER_WHEEL_SLOTS - 1)
-
-typedef void (*timer_cb_func) (void *); /* callback function */
-
-struct olsr_timer_info {
-  /* node of timerinfo tree */
-  struct avl_node node;
-
-  /* name of this timer class */
-  char *name;
-
-  /* callback function */
-  timer_cb_func callback;
-
-  /* true if this is a class of periodic timers */
-  bool periodic;
-
-  /* Stats, resource usage */
-  uint32_t usage;
-
-  /* Stats, resource churn */
-  uint32_t changes;
-};
-
-#define OLSR_FOR_ALL_TIMERS(ti, iterator) avl_for_each_element_safe(&timerinfo_tree, ti, node, iterator)
-
-/*
- * Our timer implementation is a based on individual timers arranged in
- * a double linked list hanging of hash containers called a timer wheel slot.
- * For every timer a timer_entry is created and attached to the timer wheel slot.
- * When the timer fires, the timer_cb function is called with the
- * context pointer.
- * The implementation supports periodic and oneshot timers.
- * For a periodic timer the timer_period field is set to non zero,
- * which causes the timer to run forever until manually stopped.
- */
-struct timer_entry {
-  /* Wheel membership */
-  struct list_entity timer_list;
-
-  /* backpointer to timer info */
-  struct olsr_timer_info *timer_info;
-
-  /* when timer shall fire (absolute internal timerstamp) */
-  uint32_t timer_clock;
-
-  /* timeperiod between two timer events for periodical timers */
-  uint32_t timer_period;           /* set for periodical timers (relative time) */
-
-  /* the jitter expressed in percent */
-  uint8_t timer_jitter_pct;
-
-  /* true if timer is running at the moment */
-  bool timer_running;
-
-  /* true if timer is in callback at the moment */
-  bool timer_in_callback;
-
-  /* cache random() result for performance reasons */
-  unsigned int timer_random;
-
-  /* context pointer */
-  void *timer_cb_context;
-};
-
-/* Timers */
-extern struct avl_tree EXPORT(timerinfo_tree);
-
-void olsr_init_timers(void);
-void olsr_flush_timers(void);
-
-uint32_t EXPORT(olsr_getTimestamp) (uint32_t s);
-int32_t EXPORT(olsr_getTimeDue) (uint32_t s);
-bool EXPORT(olsr_isTimedOut) (uint32_t s);
-
-void EXPORT(olsr_set_timer) (struct timer_entry **, uint32_t, uint8_t,
-    void *, struct olsr_timer_info *);
-struct timer_entry *EXPORT(olsr_start_timer) (uint32_t, uint8_t,
-    void *, struct olsr_timer_info *);
-void EXPORT(olsr_change_timer)(struct timer_entry *, uint32_t, uint8_t);
-void EXPORT(olsr_stop_timer) (struct timer_entry *);
-
-struct olsr_timer_info *EXPORT(olsr_alloc_timerinfo)(const char *name, timer_cb_func callback, bool periodic);
-
-/* Printing timestamps */
-const char *EXPORT(olsr_clock_string)(uint32_t);
-const char *EXPORT(olsr_wallclock_string)(void);
-
-/* Main scheduler loop */
-void olsr_scheduler(void);
-
-/*
- * Provides a timestamp s1 milliseconds in the future
- */
-#define GET_TIMESTAMP(s1)      olsr_getTimestamp(s1)
-
-/* Compute the time in milliseconds when a timestamp will expire. */
-#define TIME_DUE(s1)    olsr_getTimeDue(s1)
-
-/* Returns TRUE if a timestamp is expired */
-#define TIMED_OUT(s1)    olsr_isTimedOut(s1)
-
-/* Timer data */
-extern uint32_t EXPORT(now_times);     /* current idea of times(2) reported uptime */
-
-
-#define SP_PR_READ             0x01
-#define SP_PR_WRITE            0x02
-
-#define SP_IMM_READ            0x04
-#define SP_IMM_WRITE           0x08
-
-
-typedef void (*socket_handler_func) (int fd, void *data, unsigned int flags);
-
-
-struct olsr_socket_entry {
-  int fd;
-  socket_handler_func process_immediate;
-  socket_handler_func process_pollrate;
-  void *data;
-  unsigned int flags;
-  struct list_entity socket_node;
-};
-
-/* deletion safe macro for socket list traversal */
-
-#define OLSR_FOR_ALL_SOCKETS(socket, iterator) list_for_each_element_safe(&socket_head, socket, socket_node, iterator)
-
-void EXPORT(add_olsr_socket) (int fd, socket_handler_func pf_pr, socket_handler_func pf_imm, void *data, unsigned int flags);
-int EXPORT(remove_olsr_socket) (int fd, socket_handler_func pf_pr, socket_handler_func pf_imm);
-void olsr_flush_sockets(void);
-void EXPORT(enable_olsr_socket) (int fd, socket_handler_func pf_pr, socket_handler_func pf_imm, unsigned int flags);
-void EXPORT(disable_olsr_socket) (int fd, socket_handler_func pf_pr, socket_handler_func pf_imm, unsigned int flags);
-
-#endif
-
-/*
- * Local Variables:
- * c-basic-offset: 2
- * indent-tabs-mode: nil
- * End:
- */
index 74bc72c..8090599 100644 (file)
@@ -139,8 +139,8 @@ olsr_init_tc(void)
   /*
    * Get some cookies for getting stats to ease troubleshooting.
    */
-  tc_edge_gc_timer_info = olsr_alloc_timerinfo("TC edge GC", olsr_expire_tc_edge_gc, false);
-  tc_validity_timer_info = olsr_alloc_timerinfo("TC validity", &olsr_expire_tc_entry, false);
+  tc_edge_gc_timer_info = olsr_timer_add("TC edge GC", olsr_expire_tc_edge_gc, false);
+  tc_validity_timer_info = olsr_timer_add("TC validity", &olsr_expire_tc_entry, false);
 
   tc_mem_cookie = olsr_memcookie_add("tc_entry", sizeof(struct tc_entry));
 }
@@ -230,10 +230,10 @@ olsr_delete_tc_entry(struct tc_entry *tc)
   }
 
   /* Stop running timers */
-  olsr_stop_timer(tc->validity_timer);
+  olsr_timer_stop(tc->validity_timer);
   tc->validity_timer = NULL;
 
-  olsr_stop_timer(tc->edge_gc_timer);
+  olsr_timer_stop(tc->edge_gc_timer);
   tc->edge_gc_timer = NULL;
 
   /* still virtual edges left, node has to stay in database */
@@ -482,7 +482,7 @@ olsr_delete_tc_edge_entry(struct tc_edge_entry *tc_edge)
 
   if (was_real && tc_inv != tc_myself && tc_inv->virtual) {
     /* mark tc_entry to be gone in one ms */
-    olsr_set_timer(&tc_inv->validity_timer, 1, 0, tc, tc_validity_timer_info);
+    olsr_timer_set(&tc_inv->validity_timer, 1, 0, tc, tc_validity_timer_info);
   }
 }
 
@@ -644,8 +644,10 @@ olsr_print_tc_table(void)
   struct tc_entry *tc, *tc_iterator;
   const int ipwidth = olsr_cnf->ip_version == AF_INET ? 15 : 30;
   static char NONE[] = "-";
+  struct timeval_buf timebuf;
 
-  OLSR_INFO(LOG_TC, "\n--- %s ------------------------------------------------- TOPOLOGY\n\n", olsr_wallclock_string());
+  OLSR_INFO(LOG_TC, "\n--- %s ------------------------------------------------- TOPOLOGY\n\n",
+      olsr_timer_getWallclockString(&timebuf));
   OLSR_INFO_NH(LOG_TC, "%-*s %-*s %-7s      %8s %12s %5s\n", ipwidth,
                "Source IP addr", ipwidth, "Dest IP addr", "", olsr_get_linklabel(0), "vtime", "ansn");
 
@@ -655,7 +657,7 @@ olsr_print_tc_table(void)
     char *vtime = NONE;
 
     if (tc->validity_timer) {
-      olsr_milli_to_txt(&tbuf, olsr_getTimeDue(tc->validity_timer->timer_clock));
+      olsr_milli_to_txt(&tbuf, olsr_timer_getRelative(tc->validity_timer->timer_clock));
       vtime = tbuf.buf;
     }
 
@@ -829,7 +831,7 @@ olsr_input_tc(struct olsr_message * msg,
    * Set or change the expiration timer accordingly.
    */
   assert(msg);
-  olsr_set_timer(&tc->validity_timer, msg->vtime,
+  olsr_timer_set(&tc->validity_timer, msg->vtime,
                  OLSR_TC_VTIME_JITTER, tc, tc_validity_timer_info);
 
   if (borderSet) {
@@ -844,7 +846,7 @@ olsr_input_tc(struct olsr_message * msg,
      * Kick the the edge garbage collection timer. In the meantime hopefully
      * all edges belonging to a multipart neighbor set will arrive.
      */
-    olsr_set_timer(&tc->edge_gc_timer, OLSR_TC_EDGE_GC_TIME,
+    olsr_timer_set(&tc->edge_gc_timer, OLSR_TC_EDGE_GC_TIME,
                    OLSR_TC_EDGE_GC_JITTER, tc, tc_edge_gc_timer_info);
   }
 }
index 889b694..be5dc27 100644 (file)
@@ -46,7 +46,8 @@
 #include "common/list.h"
 #include "olsr_protocol.h"
 #include "lq_packet.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "olsr_memcookie.h"
 #include "duplicate_set.h"
 
@@ -79,8 +80,8 @@ struct tc_entry {
   struct avl_tree mid_tree;            /* subtree for MID entries */
   struct avl_tree hna_tree;            /* subtree for HNA entries */
   struct link_entry *next_hop;         /* SPF calculated link to the 1st hop neighbor */
-  struct timer_entry *edge_gc_timer;   /* used for edge garbage collection */
-  struct timer_entry *validity_timer;  /* tc validity time */
+  struct olsr_timer_entry *edge_gc_timer;   /* used for edge garbage collection */
+  struct olsr_timer_entry *validity_timer;  /* tc validity time */
   bool virtual;                        /* true if node is virtual */
   int tc_seq;                          /* sequence number of the tc message */
   int mid_seq;                         /* sequence number of the mid message */
index cbb62bc..97e08b6 100644 (file)
@@ -51,7 +51,8 @@
 #include "os_net.h"
 #include "net_olsr.h"
 #include "parser.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "olsr_time.h"
 #include "lq_packet.h"
 #include "link_set.h"
index d59dc07..dac21f9 100644 (file)
@@ -47,7 +47,8 @@
 #include "parser.h"
 #include "defs.h"
 #include "os_net.h"
-#include "scheduler.h"
+#include "olsr_timer.h"
+#include "olsr_socket.h"
 #include "olsr_time.h"
 #include "lq_packet.h"
 #include "net_olsr.h"