Cleanup of olsr_socket API interface
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Tue, 15 Feb 2011 08:59:38 +0000 (09:59 +0100)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Tue, 15 Feb 2011 08:59:38 +0000 (09:59 +0100)
13 files changed:
lib/dot_draw/src/olsrd_dot_draw.c
lib/httpinfo/src/olsrd_httpinfo.c
lib/mdns/src/NetworkInterfaces.c
lib/obamp/src/obamp.c
src/interfaces.c
src/interfaces.h
src/linux/kernel_routes.c
src/main.c
src/net_olsr.c
src/olsr_comport.c
src/olsr_comport.h
src/olsr_socket.c
src/olsr_socket.h

index 9a731ae..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 */
-  olsr_socket_add(ipc_socket, &ipc_action, NULL, OLSR_SOCKET_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 f3901d2..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 */
-  olsr_socket_add(http_socket, &parse_http_request, NULL, OLSR_SOCKET_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 ff7dbda..9c00150 100644 (file)
@@ -162,7 +162,11 @@ CreateCaptureSocket(const char *ifName)
     return -1;
   }
   //AddDescriptorToInputSet(skfd);
-  olsr_socket_add(skfd, &DoMDNS, NULL, OLSR_SOCKET_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 0174a2b..3798775 100644 (file)
@@ -234,7 +234,11 @@ CreateCaptureSocket(const char *ifName)
     return -1;
   }
 
-  olsr_socket_add(skfd, &EncapFlowInObamp, NULL, OLSR_SOCKET_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 */
index 20222c4..f0c17da 100644 (file)
@@ -177,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;
@@ -186,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);
   }
@@ -196,11 +197,11 @@ add_interface(struct olsr_if_config *iface) {
   set_buffer_timer(ifp);
 
   /* Register sockets */
-  olsr_socket_add(ifp->olsr_socket, &olsr_input, NULL, OLSR_SOCKET_READ);
-  olsr_socket_add(ifp->send_socket, &olsr_input, NULL, OLSR_SOCKET_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
@@ -346,10 +347,11 @@ remove_interface(struct interface *ifp)
   unlock_interface(ifp);
 
   /* Close olsr socket */
-  olsr_socket_remove(ifp->olsr_socket, &olsr_input);
-  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);
@@ -405,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 28cb261..5b6550f 100644 (file)
@@ -137,12 +137,19 @@ 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 olsr_timer_entry *hello_gen_timer;
@@ -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 6190655..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;
   }
 
-  olsr_socket_add(sock, &rtnetlink_read, NULL, OLSR_SOCKET_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 7f0b1ee..c6dbc26 100644 (file)
@@ -266,7 +266,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();
index 6e12585..bb86feb 100644 (file)
@@ -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 e03e717..37fe58e 100644 (file)
@@ -75,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;
@@ -94,7 +94,9 @@ 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));
 
@@ -110,23 +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 {
-      olsr_socket_add(comsocket_http, &olsr_com_parse_request, NULL, OLSR_SOCKET_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 {
-      olsr_socket_add(comsocket_txt, &olsr_com_parse_request, NULL, OLSR_SOCKET_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);
     }
   }
 }
@@ -144,7 +144,7 @@ olsr_com_destroy(void) {
 
 void
 olsr_com_activate_output(struct comport_connection *con) {
-  olsr_socket_enable(con->fd, &olsr_com_parse_connection, OLSR_SOCKETPOLL_WRITE);
+  olsr_socket_enable(con->sock, OLSR_SOCKET_WRITE);
 }
 
 static int
@@ -160,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 */
@@ -196,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;
@@ -231,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;
@@ -270,7 +269,8 @@ olsr_com_parse_request(int fd, void *data __attribute__ ((unused)), unsigned int
 
   con->timeout = olsr_timer_start(con->timeout_value, 0, con, connection_timeout);
 
-  olsr_socket_add(sock, &olsr_com_parse_connection, con, OLSR_SOCKET_READ | OLSR_SOCKETPOLL_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);
 }
@@ -288,8 +288,9 @@ olsr_com_cleanup_session(struct comport_connection *con) {
   if (con->stop_handler) {
     con->stop_handler(con);
   }
-  olsr_socket_remove(con->fd, &olsr_com_parse_connection);
-  os_close(con->fd);
+
+  os_close(con->sock->fd);
+  olsr_socket_remove(con->sock);
 
   abuf_free(&con->in);
   abuf_free(&con->out);
@@ -366,7 +367,7 @@ olsr_com_parse_connection(int fd, void *data, unsigned int flags) {
       con->send_as = PLAIN;
     }
 
-    if (flags & OLSR_SOCKETPOLL_WRITE) {
+    if (flags & OLSR_SOCKET_WRITE) {
       int len;
 
       len = send(fd, con->out.buf, con->out.len, 0);
@@ -380,12 +381,12 @@ olsr_com_parse_connection(int fd, void *data, unsigned int flags) {
       }
     } else {
       OLSR_DEBUG(LOG_COMPORT, "  activating output in scheduler\n");
-      olsr_socket_enable(fd, &olsr_com_parse_connection, OLSR_SOCKETPOLL_WRITE);
+      olsr_socket_enable(con->sock, OLSR_SOCKET_WRITE);
     }
   }
   if (con->out.len == 0) {
     OLSR_DEBUG(LOG_COMPORT, "  deactivating output in scheduler\n");
-    olsr_socket_disable(fd, &olsr_com_parse_connection, OLSR_SOCKETPOLL_WRITE);
+    olsr_socket_disable(con->sock, OLSR_SOCKET_WRITE);
     if (con->state == SEND_AND_QUIT) {
       con->state = CLEANUP;
     }
index b83f0c2..0f454fd 100644 (file)
@@ -91,7 +91,7 @@ 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;
@@ -100,7 +100,7 @@ struct comport_connection {
   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 451747c..8d056e1 100644 (file)
 #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.h"
 #include "olsr_logging.h"
 #include "olsr_memcookie.h"
 #include "olsr_timer.h"
 #include "os_net.h"
-#include "os_time.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));
 }
 
 /**
@@ -75,8 +85,7 @@ olsr_socket_cleanup(void)
 
   OLSR_FOR_ALL_SOCKETS(entry, iterator) {
     os_close(entry->fd);
-    list_remove(&entry->socket_node);
-    free(entry);
+    olsr_socket_intfree(entry);
   }
 }
 
@@ -88,92 +97,43 @@ olsr_socket_cleanup(void)
  * @param pf_imm processing callback
  * @param data custom data
  * @param flags OLSR_SOCKET_READ/OLSR_SOCKET_WRITE (or both)
+ * @return pointer to socket_entry
  */
-void
+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;
+    return NULL;
   }
   OLSR_DEBUG(LOG_SCHEDULER, "Adding OLSR socket entry %d\n", fd);
 
-  new_entry = olsr_malloc(sizeof(*new_entry), "Socket entry");
+  new_entry = olsr_memcookie_malloc(socket_memcookie);
 
   new_entry->fd = fd;
-  new_entry->process_immediate = pf_imm;
+  new_entry->process = pf_imm;
   new_entry->data = data;
   new_entry->flags = flags;
 
   /* Queue */
-  list_add_before(&socket_head, &new_entry->socket_node);
-}
-
-/**
- * Remove a socket and handler to the socketset
- * beeing used in the main select(2) loop
- *
- *@param fd the socket
- *@param pf_imm the processing function
- */
-int
-olsr_socket_remove(int fd, socket_handler_func pf_imm)
-{
-  struct olsr_socket_entry *entry, *iterator;
-
-  if (fd < 0 || 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) {
-      /* just mark this node as "deleted", it will be cleared later at the end of handle_fds() */
-      entry->process_immediate = NULL;
-      entry->flags = 0;
-      return 1;
-    }
-  }
-  return 0;
-}
+  list_add_before(&socket_head, &new_entry->node);
 
-/**
- * Enable one or both flags of a socket handler
- * @param fd file descriptor of socket handler
- * @param pf_imm process function
- * @param flags flags to be enabled
- */
-void
-olsr_socket_enable(int fd, socket_handler_func pf_imm, unsigned int flags)
-{
-  struct olsr_socket_entry *entry, *iterator;
-
-  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
-    if (entry->fd == fd && entry->process_immediate == pf_imm) {
-      entry->flags |= flags;
-    }
-  }
+  return new_entry;
 }
 
 /**
- * Disable one or both flags of a socket handler
- * @param fd file descriptor of socket handler
- * @param pf_imm process function
- * @param flags flags to be disabled
+ * Remove a socket and handler from the socket scheduler
+ * @param sock pointer to socket entry
  */
 void
-olsr_socket_disable(int fd, socket_handler_func pf_imm, unsigned int flags)
+olsr_socket_remove(struct olsr_socket_entry *entry)
 {
-  struct olsr_socket_entry *entry, *iterator;
+  OLSR_DEBUG(LOG_SCHEDULER, "Removing OLSR socket entry %d\n", entry->fd);
 
-  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
-    if (entry->fd == fd && entry->process_immediate == pf_imm) {
-      entry->flags &= ~flags;
-    }
-  }
+  entry->process = NULL;
+  entry->flags = 0;
 }
 
 /**
@@ -214,18 +174,18 @@ handle_sockets(uint32_t next_interval)
 
     /* Adding file-descriptors to FD set */
     OLSR_FOR_ALL_SOCKETS(entry, iterator) {
-      if (entry->process_immediate == NULL) {
+      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_SOCKETPOLL_WRITE) != 0) {
-        fdsets |= OLSR_SOCKETPOLL_WRITE;
+      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_SOCKETPOLL_WRITE)) != 0 && entry->fd >= hfd) {
+      if ((entry->flags & (OLSR_SOCKET_READ | OLSR_SOCKET_WRITE)) != 0 && entry->fd >= hfd) {
         hfd = entry->fd + 1;
       }
     }
@@ -236,14 +196,17 @@ handle_sockets(uint32_t next_interval)
     }
 
     do {
-      n = os_select(hfd, fdsets & OLSR_SOCKET_READ ? &ibits : NULL, fdsets & OLSR_SOCKETPOLL_WRITE ? &obits : NULL, NULL, &tvp);
+      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", strerror(errno));
+      OLSR_WARN(LOG_SCHEDULER, "select error: %s (%d)", strerror(errno), errno);
       break;
     }
 
@@ -251,7 +214,7 @@ handle_sockets(uint32_t next_interval)
     olsr_timer_updateClock();
     OLSR_FOR_ALL_SOCKETS(entry, iterator) {
       int flags;
-      if (entry->process_immediate == NULL) {
+      if (entry->process == NULL) {
         continue;
       }
       flags = 0;
@@ -259,10 +222,10 @@ handle_sockets(uint32_t next_interval)
         flags |= OLSR_SOCKET_READ;
       }
       if (FD_ISSET(entry->fd, &obits)) {
-        flags |= OLSR_SOCKETPOLL_WRITE;
+        flags |= OLSR_SOCKET_WRITE;
       }
       if (flags != 0) {
-        entry->process_immediate(entry->fd, entry->data, flags);
+        entry->process(entry->fd, entry->data, flags);
       }
     }
 
@@ -278,10 +241,8 @@ handle_sockets(uint32_t next_interval)
   }
 
   OLSR_FOR_ALL_SOCKETS(entry, iterator) {
-    if (entry->process_immediate == NULL) {
-      /* clean up socket handler */
-      list_remove(&entry->socket_node);
-      free(entry);
+    if (entry->process == NULL) {
+      olsr_socket_intfree(entry);
     }
   }
 }
index 5f768b8..8239ab8 100644 (file)
@@ -43,7 +43,6 @@
 #ifndef _OLSR_SCHEDULER
 #define _OLSR_SCHEDULER
 
-#include "olsr_time.h"
 #include "common/list.h"
 #include "common/avl.h"
 
@@ -51,7 +50,7 @@
 
 /* flags for socket handler */
 static const unsigned int OLSR_SOCKET_READ = 0x04;
-static const unsigned int OLSR_SOCKETPOLL_WRITE = 0x08;
+static const unsigned int OLSR_SOCKET_WRITE = 0x08;
 
 /* prototype for socket handler */
 typedef void (*socket_handler_func) (int fd, void *data, unsigned int flags);
@@ -59,13 +58,13 @@ 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 socket_node;
+  struct list_entity node;
 
   /* file descriptor of the socket */
   int fd;
 
   /* socket handler */
-  socket_handler_func process_immediate;
+  socket_handler_func process;
 
   /* custom data pointer for sockets */
   void *data;
@@ -76,17 +75,36 @@ struct olsr_socket_entry {
 
 /* 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, socket_node, iterator)
+#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);
 
-void EXPORT(olsr_socket_add) (int fd, socket_handler_func pf_imm, void *data, unsigned int flags);
-int EXPORT(olsr_socket_remove) (int fd, socket_handler_func pf_imm);
+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 *);
 
-void EXPORT(olsr_socket_enable) (int fd, socket_handler_func pf_imm, unsigned int flags);
-void EXPORT(olsr_socket_disable) (int fd, socket_handler_func pf_imm, unsigned int flags);
+/**
+ * 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