- correct port
[oweals/gnunet.git] / src / transport / plugin_transport_wlan.c
index 2763b5082446b464fe59be7577e39af74ddb66d5..4510ae12c754879509cd7ac92355da536b5c9283 100644 (file)
@@ -38,8 +38,6 @@
 #include "gnunet_crypto_lib.h"
 #include "gnunet_fragmentation_lib.h"
 #include "gnunet_constants.h"
-//#include "wlan/ieee80211.h"
-//#include  <netinet/ip.h>
 
 #include <string.h>
 
 #define IEEE80211_FC0_TYPE_CTL                  0x04
 #define IEEE80211_FC0_TYPE_DATA                 0x08
 
-/*
- * Structure of an internet header, naked of options.
- */
-struct iph
-{
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-  unsigned int ip_hl:4;         /* header length */
-  unsigned int ip_v:4;          /* version */
-#endif
-#if __BYTE_ORDER == __BIG_ENDIAN
-  unsigned int ip_v:4;          /* version */
-  unsigned int ip_hl:4;         /* header length */
-#endif
-  u_int8_t ip_tos;              /* type of service */
-  u_short ip_len;               /* total length */
-  u_short ip_id;                /* identification */
-  u_short ip_off;               /* fragment offset field */
-#define IP_RF 0x8000            /* reserved fragment flag */
-#define IP_DF 0x4000            /* dont fragment flag */
-#define IP_MF 0x2000            /* more fragments flag */
-#define IP_OFFMASK 0x1fff       /* mask for fragmenting bits */
-  u_int8_t ip_ttl;              /* time to live */
-  u_int8_t ip_p;                /* protocol */
-  u_short ip_sum;               /* checksum */
-  struct in_addr ip_src, ip_dst;        /* source and dest address */
-};
-
-struct udphdr
-{
-  u_int16_t source;
-  u_int16_t dest;
-  u_int16_t len;
-  u_int16_t check;
-};
+GNUNET_NETWORK_STRUCT_BEGIN
 
 /*
  * generic definitions for IEEE 802.11 frames
@@ -169,11 +134,8 @@ struct ieee80211_frame
   u_int8_t i_addr3[IEEE80211_ADDR_LEN];
   u_int8_t i_seq[2];
   u_int8_t llc[4];
-#if DEBUG_wlan_ip_udp_packets_on_air > 1
-  struct iph ip;
-  struct udphdr udp;
-#endif
 } GNUNET_PACKED;
+GNUNET_NETWORK_STRUCT_END
 
 /**
  * Encapsulation of all of the state of the plugin.
@@ -211,22 +173,22 @@ struct Plugin
   struct GNUNET_SERVER_MessageStreamTokenizer *data_tokenizer;
 
   /**
-   * stdout pipe handle for the gnunet-wlan-helper process
+   * stdout pipe handle for the gnunet-helper-transport-wlan process
    */
   struct GNUNET_DISK_PipeHandle *server_stdout;
 
   /**
-   * stdout file handle for the gnunet-wlan-helper process
+   * stdout file handle for the gnunet-helper-transport-wlan process
    */
   const struct GNUNET_DISK_FileHandle *server_stdout_handle;
 
   /**
-   * stdin pipe handle for the gnunet-wlan-helper process
+   * stdin pipe handle for the gnunet-helper-transport-wlan process
    */
   struct GNUNET_DISK_PipeHandle *server_stdin;
 
   /**
-   * stdin file handle for the gnunet-wlan-helper process
+   * stdin file handle for the gnunet-helper-transport-wlan process
    */
   const struct GNUNET_DISK_FileHandle *server_stdin_handle;
 
@@ -314,6 +276,11 @@ struct Plugin
    * Tracker for bandwidth limit
    */
   struct GNUNET_BANDWIDTH_Tracker tracker;
+
+  /**
+   * saves the current state of the helper process
+   */
+  int helper_is_running;
 };
 
 /**
@@ -351,6 +318,9 @@ struct Sessionqueue
   struct Sessionqueue *next;
   struct Sessionqueue *prev;
   struct Session *content;
+#if !HAVE_UNALIGNED_64_ACCESS
+  void *dummy;                  /* for alignment, see #1909 */
+#endif
 };
 
 /**
@@ -393,6 +363,38 @@ struct Plugin_Session_pair
   struct Session *session;
 };
 
+
+GNUNET_NETWORK_STRUCT_BEGIN
+
+/**
+ * Header for messages which need fragmentation
+ */
+struct WlanHeader
+{
+
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * checksum/error correction
+   */
+  uint32_t crc GNUNET_PACKED;
+
+  /**
+   * To whom are we talking to (set to our identity
+   * if we are still waiting for the welcome message)
+   */
+  struct GNUNET_PeerIdentity target;
+
+  /**
+   *  Where the packet came from
+   */
+  struct GNUNET_PeerIdentity source;
+
+// followed by payload
+
+};
+GNUNET_NETWORK_STRUCT_END
+
 /**
  * Information kept for each message that is yet to
  * be transmitted.
@@ -477,7 +479,6 @@ struct AckSendQueue
 /**
  * Session infos gathered from a messages
  */
-
 struct Session_light
 {
   /**
@@ -642,14 +643,12 @@ struct MacEndpoint
 /**
  * Struct for Messages in the fragment queue
  */
-
 struct FragmentMessage
 {
 
   /**
    * Session this message belongs to
    */
-
   struct Session *session;
 
   /**
@@ -699,9 +698,11 @@ struct FragmentMessage
 
 static void
 do_transmit (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc);
+
 static void
 free_session (struct Plugin *plugin, struct Sessionqueue *queue,
               int do_free_macendpoint);
+
 static struct MacEndpoint *
 create_macendpoint (struct Plugin *plugin, const struct MacAddress *addr);
 
@@ -737,7 +738,8 @@ hexdump (const void *mem, unsigned length)
         t += sprintf (t, "%02X", src[j] & 0xff);
       else
         t += sprintf (t, "  ");
-      t += sprintf (t, j % 2 ? " " : "-");
+
+      t += sprintf (t, (j % 2) ? " " : "-");
     }
 
     t += sprintf (t, "  ");
@@ -861,7 +863,7 @@ session_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   struct Sessionqueue *queue = cls;
 
   GNUNET_assert (queue != NULL);
-  GNUNET_assert(queue->content != NULL);
+  GNUNET_assert (queue->content != NULL);
   queue->content->timeout_task = GNUNET_SCHEDULER_NO_TASK;
   if (tc->reason == GNUNET_SCHEDULER_REASON_SHUTDOWN)
   {
@@ -872,9 +874,10 @@ session_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
        (queue->content->last_activity, SESSION_TIMEOUT)).rel_value == 0)
   {
 
-    GNUNET_assert(queue->content->mac != NULL);
-    GNUNET_assert(queue->content->mac->plugin != NULL);
-    GNUNET_STATISTICS_update (queue->content->mac->plugin->env->stats, _("# wlan session timeouts"), 1, GNUNET_NO);
+    GNUNET_assert (queue->content->mac != NULL);
+    GNUNET_assert (queue->content->mac->plugin != NULL);
+    GNUNET_STATISTICS_update (queue->content->mac->plugin->env->stats,
+                              _("# wlan session timeouts"), 1, GNUNET_NO);
     free_session (queue->content->mac->plugin, queue, GNUNET_YES);
   }
   else
@@ -892,14 +895,14 @@ session_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
  * @param peer peer identity to use for this session
  * @return returns the session
  */
-
 static struct Session *
 create_session (struct Plugin *plugin, struct MacEndpoint *endpoint,
                 const struct GNUNET_PeerIdentity *peer)
 {
   GNUNET_assert (endpoint != NULL);
   GNUNET_assert (plugin != NULL);
-  GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan session created"), 1, GNUNET_NO);
+  GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan session created"), 1,
+                            GNUNET_NO);
   struct Sessionqueue *queue =
       GNUNET_malloc (sizeof (struct Sessionqueue) + sizeof (struct Session));
 
@@ -908,7 +911,7 @@ create_session (struct Plugin *plugin, struct MacEndpoint *endpoint,
 
   queue->content = (struct Session *) &queue[1];
   queue->content->mac = endpoint;
-  memcpy (&(queue->content->target), peer, sizeof (struct GNUNET_PeerIdentity));
+  queue->content->target = *peer;
   queue->content->last_activity = GNUNET_TIME_absolute_get ();
   queue->content->timeout_task =
       GNUNET_SCHEDULER_add_delayed (SESSION_TIMEOUT, &session_timeout, queue);
@@ -982,7 +985,8 @@ queue_session (struct Plugin *plugin, struct Session *session)
     GNUNET_CONTAINER_DLL_insert_tail (plugin->pending_Sessions_head,
                                       plugin->pending_Sessions_tail, queue);
     plugin->pendingsessions++;
-    GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan pending sessions"), plugin->pendingsessions, GNUNET_NO);
+    GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan pending sessions"),
+                           plugin->pendingsessions, GNUNET_NO);
   }
 
 }
@@ -1016,7 +1020,6 @@ delay_fragment_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
  * Function to calculate the time of the next periodic "hello-beacon"
  * @param plugin pointer to the plugin struct
  */
-
 static void
 set_next_beacon_time (struct Plugin *const plugin)
 {
@@ -1053,12 +1056,17 @@ set_next_beacon_time (struct Plugin *const plugin)
  * Function to set the timer for the next timeout of the fragment queue
  * @param plugin the handle to the plugin struct
  */
-
 static void
 set_next_send (struct Plugin *const plugin)
 {
   struct GNUNET_TIME_Relative next_send;
 
+  //abort if helper is not running
+  if (plugin->helper_is_running == GNUNET_NO)
+  {
+    return;
+  }
+
   //cancel old task
   if (plugin->server_write_delay_task != GNUNET_SCHEDULER_NO_TASK)
   {
@@ -1131,24 +1139,25 @@ get_next_queue_session (struct Plugin *plugin)
     pm = session->pending_message_head;
 
     if (pm == NULL)
-        {
+    {
 #if DEBUG_wlan
-          GNUNET_log_from(GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
-              "pending message is empty, should not happen. session %p\n",
-              session);
+      GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
+                       "pending message is empty, should not happen. session %p\n",
+                       session);
 #endif
-          sessionqueue_alt = sessionqueue;
-          sessionqueue = sessionqueue->next;
-          plugin->pendingsessions--;
-          GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan pending sessions"), plugin->pendingsessions, GNUNET_NO);
-          GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions_head,
-              plugin->pending_Sessions_tail,
-              sessionqueue_alt);
+      sessionqueue_alt = sessionqueue;
+      sessionqueue = sessionqueue->next;
+      plugin->pendingsessions--;
+      GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan pending sessions"),
+                             plugin->pendingsessions, GNUNET_NO);
+      GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions_head,
+                                   plugin->pending_Sessions_tail,
+                                   sessionqueue_alt);
 
-          GNUNET_free (sessionqueue_alt);
-          continue;
+      GNUNET_free (sessionqueue_alt);
+      continue;
 
-        }
+    }
 
     //check for message timeout
     if (GNUNET_TIME_absolute_get_remaining (pm->timeout).rel_value > 0)
@@ -1160,7 +1169,8 @@ get_next_queue_session (struct Plugin *plugin)
            FRAGMENT_QUEUE_MESSAGES_OUT_PER_SESSION))
       {
         plugin->pendingsessions--;
-        GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan pending sessions"), plugin->pendingsessions, GNUNET_NO);
+        GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan pending sessions"),
+                               plugin->pendingsessions, GNUNET_NO);
         GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions_head,
                                      plugin->pending_Sessions_tail,
                                      sessionqueue);
@@ -1190,7 +1200,8 @@ get_next_queue_session (struct Plugin *plugin)
         sessionqueue_alt = sessionqueue;
         sessionqueue = sessionqueue->next;
         plugin->pendingsessions--;
-        GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan pending sessions"), plugin->pendingsessions, GNUNET_NO);
+        GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan pending sessions"),
+                               plugin->pendingsessions, GNUNET_NO);
         GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions_head,
                                      plugin->pending_Sessions_tail,
                                      sessionqueue_alt);
@@ -1216,42 +1227,41 @@ free_fragment_message (struct Plugin *plugin, struct FragmentMessage *fm)
   struct FragmentMessage_queue *fmq;
   struct FragmentMessage_queue *fmq_next;
 
-  if (fm != NULL)
+  fmq = plugin->sending_messages_head;
+  while (fmq != NULL)
   {
-    fmq = plugin->sending_messages_head;
-    while (fmq != NULL)
+    fmq_next = fmq->next;
+    if (fmq->content == fm)
     {
-      fmq_next = fmq->next;
-      if (fmq->content == fm)
-      {
-        GNUNET_CONTAINER_DLL_remove (plugin->sending_messages_head,
-                                     plugin->sending_messages_tail, fmq);
-        GNUNET_free (fmq);
-      }
-      fmq = fmq_next;
+      GNUNET_CONTAINER_DLL_remove (plugin->sending_messages_head,
+                                   plugin->sending_messages_tail, fmq);
+      GNUNET_free (fmq);
     }
+    fmq = fmq_next;
+  }
 
-    (session->mac->fragment_messages_out_count)--;
-    session->fragment_messages_out_count--;
-    plugin->pending_Fragment_Messages--;
-    GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan pending fragments"), plugin->pending_Fragment_Messages, GNUNET_NO);
-    GNUNET_CONTAINER_DLL_remove (endpoint->sending_messages_head,
-                                 endpoint->sending_messages_tail, fm);
-    GNUNET_FRAGMENT_context_destroy (fm->fragcontext);
-    if (fm->timeout_task != GNUNET_SCHEDULER_NO_TASK){
-       GNUNET_SCHEDULER_cancel (fm->timeout_task);
-       fm->timeout_task = GNUNET_SCHEDULER_NO_TASK;
-    }
+  (session->mac->fragment_messages_out_count)--;
+  session->fragment_messages_out_count--;
+  plugin->pending_Fragment_Messages--;
+  GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan pending fragments"),
+                         plugin->pending_Fragment_Messages, GNUNET_NO);
+  GNUNET_CONTAINER_DLL_remove (endpoint->sending_messages_head,
+                               endpoint->sending_messages_tail, fm);
+  GNUNET_FRAGMENT_context_destroy (fm->fragcontext);
+  if (fm->timeout_task != GNUNET_SCHEDULER_NO_TASK)
+  {
+    GNUNET_SCHEDULER_cancel (fm->timeout_task);
+    fm->timeout_task = GNUNET_SCHEDULER_NO_TASK;
+  }
 
-    GNUNET_free (fm);
+  GNUNET_free (fm);
 
-    queue_session (plugin, session);
+  queue_session (plugin, session);
 #if DEBUG_wlan
-    GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
-                     "Free pending fragment messages %p, session %p\n", fm,
-                     session);
+  GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
+                   "Free pending fragment messages %p, session %p\n", fm,
+                   session);
 #endif
-  }
 }
 
 /**
@@ -1300,88 +1310,26 @@ getWlanHeader (struct ieee80211_frame *Header,
 
   Header->i_fc[0] = IEEE80211_FC0_TYPE_DATA;
   Header->i_fc[1] = 0x00;
-  memcpy (&Header->i_addr3, &mac_bssid, sizeof (mac_bssid));
+  memcpy (&Header->i_addr3, &mac_bssid_gnunet, sizeof (mac_bssid_gnunet));
   memcpy (&Header->i_addr2, plugin->mac_address.mac,
           sizeof (plugin->mac_address));
   memcpy (&Header->i_addr1, to_mac_addr, sizeof (struct MacAddress));
 
   tmp16 = (uint16_t *) Header->i_dur;
-  *tmp16 = (uint16_t) htole16 ((size * 1000000) / rate + 290);
+  *tmp16 = (uint16_t) GNUNET_htole16 ((size * 1000000) / rate + 290);
   Header->llc[0] = WLAN_LLC_DSAP_FIELD;
   Header->llc[1] = WLAN_LLC_SSAP_FIELD;
 
-#if DEBUG_wlan_ip_udp_packets_on_air > 1
-  uint crc = 0;
-  uint16_t *x;
-  int count;
-
-  Header->ip.ip_dst.s_addr = *((uint32_t *) & to_mac_addr->mac[2]);
-  Header->ip.ip_src.s_addr = *((uint32_t *) & plugin->mac_address.mac[2]);
-  Header->ip.ip_v = 4;
-  Header->ip.ip_hl = 5;
-  Header->ip.ip_p = 17;
-  Header->ip.ip_ttl = 1;
-  Header->ip.ip_len = htons (size + 8);
-  Header->ip.ip_sum = 0;
-  x = (uint16_t *) & Header->ip;
-  count = sizeof (struct iph);
-  while (count > 1)
-  {
-    /* This is the inner loop */
-    crc += (unsigned short) *x++;
-    count -= 2;
-  }
-  /* Add left-over byte, if any */
-  if (count > 0)
-    crc += *(unsigned char *) x;
-  crc = (crc & 0xffff) + (crc >> 16);
-  Header->ip.ip_sum = htons (~(unsigned short) crc);
-  Header->udp.len = htons (size - sizeof (struct ieee80211_frame));
-
-#endif
-
   return GNUNET_YES;
 }
 
-/**
- * 32bit CRC
- *
- * @param msgbuf pointer tor the data
- * @param msgbuf_size size of the data
- *
- * @return 32bit crc value
- */
-
-uint32_t
-getcrc32 (const char *msgbuf, size_t msgbuf_size)
-{
-
-  return GNUNET_CRYPTO_crc32_n (msgbuf, msgbuf_size);;
-}
-
-/**
- * 16bit CRC
- *
- * @param msgbuf pointer tor the data
- * @param msgbuf_size size of the data
- *
- * @return 16bit crc value
- */
-
-uint16_t
-getcrc16 (const char *msgbuf, size_t msgbuf_size)
-{
-  //TODO calc some crc
-  return 0;
-}
 
 /**
  * function to add a fragment of a message to send
  * @param cls FragmentMessage this message belongs to
  * @param hdr pointer to the start of the message
  */
-
-void
+static void
 add_message_for_send (void *cls, const struct GNUNET_MessageHeader *hdr)
 {
 
@@ -1427,7 +1375,7 @@ add_message_for_send (void *cls, const struct GNUNET_MessageHeader *hdr)
 
 
 /**
- * We have been notified that wlan-helper has written something to stdout.
+ * We have been notified that gnunet-helper-transport-wlan has written something to stdout.
  * Handle the output, then reschedule this function to be called again once
  * more is available.
  *
@@ -1456,7 +1404,7 @@ wlan_plugin_helper_read (void *cls,
 #if DEBUG_wlan
     GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
                      _
-                     ("Finished reading from wlan-helper stdout with code: %d\n"),
+                     ("Finished reading from gnunet-helper-transport-wlan stdout with code: %d\n"),
                      bytes);
 #endif
     return;
@@ -1472,7 +1420,7 @@ wlan_plugin_helper_read (void *cls,
 }
 
 /**
- * Start the gnunet-wlan-helper process.
+ * Start the gnunet-helper-transport-wlan process.
  *
  * @param plugin the transport plugin
  * @return GNUNET_YES if process was started, GNUNET_SYSERR on error
@@ -1480,17 +1428,51 @@ wlan_plugin_helper_read (void *cls,
 static int
 wlan_transport_start_wlan_helper (struct Plugin *plugin)
 {
-  const char *filenamehw = "gnunet-transport-wlan-helper";
-  const char *filenameloopback = "gnunet-transport-wlan-helper-dummy";
+  const char *filenamehw = "gnunet-helper-transport-wlan";
+  const char *filenameloopback = "gnunet-helper-transport-wlan-dummy";
+  char *absolute_filename = NULL;
 
-  plugin->server_stdout = GNUNET_DISK_pipe (GNUNET_YES, GNUNET_NO, GNUNET_YES);
+  if (plugin->helper_is_running == GNUNET_YES)
+  {
+#if DEBUG_wlan
+    GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
+                     "wlan_transport_start_wlan_helper not needed, helper already running!");
+#endif
+    return GNUNET_YES;
+  }
+
+  plugin->server_stdout = GNUNET_DISK_pipe (GNUNET_YES, GNUNET_YES, GNUNET_NO, GNUNET_YES);
   if (plugin->server_stdout == NULL)
     return GNUNET_SYSERR;
 
-  plugin->server_stdin = GNUNET_DISK_pipe (GNUNET_YES, GNUNET_YES, GNUNET_NO);
+  plugin->server_stdin = GNUNET_DISK_pipe (GNUNET_YES, GNUNET_YES, GNUNET_YES, GNUNET_NO);
   if (plugin->server_stdin == NULL)
     return GNUNET_SYSERR;
 
+  if ((plugin->testmode == 1) || (plugin->testmode == 2))
+  {
+    if (GNUNET_OS_check_helper_binary (filenameloopback) == GNUNET_YES)
+    {
+      absolute_filename = GNUNET_strdup (filenameloopback);
+    }
+    else
+    {
+      char cwd[FILENAME_MAX];
+
+      GNUNET_assert (getcwd (cwd, sizeof (cwd)) != NULL);
+
+      GNUNET_asprintf (&absolute_filename, "%s%s%s", cwd, DIR_SEPARATOR_STR,
+                       filenameloopback);
+
+      if (GNUNET_DISK_file_test (filenameloopback) != GNUNET_YES)
+      {
+        GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
+                         "Helper `%s' not found! %i\n", absolute_filename);
+        GNUNET_break (0);
+      }
+    }
+  }
+
   /* Start the server process */
 
   if (plugin->testmode == 0)
@@ -1498,27 +1480,27 @@ wlan_transport_start_wlan_helper (struct Plugin *plugin)
 
 #if DEBUG_wlan
     GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
-                     "Starting gnunet-wlan-helper process cmd: %s %s %i\n",
+                     "Starting gnunet-helper-transport-wlan process cmd: %s %s %i\n",
                      filenamehw, plugin->interface, plugin->testmode);
 #endif
 
     if (GNUNET_OS_check_helper_binary (filenamehw) == GNUNET_YES)
     {
       plugin->server_proc =
-          GNUNET_OS_start_process (plugin->server_stdin, plugin->server_stdout,
+         GNUNET_OS_start_process (GNUNET_NO, plugin->server_stdin, plugin->server_stdout,
                                    filenamehw, filenamehw, plugin->interface,
                                    NULL);
     }
     else if (GNUNET_OS_check_helper_binary (filenamehw) == GNUNET_NO)
     {
       GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
-                       "gnunet-transport-wlan-helper is not suid, please change it or look at the doku\n");
+                       "gnunet-helper-transport-wlan is not suid, please change it or look at the doku\n");
       GNUNET_break (0);
     }
     else
     {
       GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
-                       "gnunet-transport-wlan-helper not found, please look if it exists and is the $PATH variable!\n");
+                       "gnunet-helper-transport-wlan not found, please look if it exists and is the $PATH variable!\n");
       GNUNET_break (0);
     }
 
@@ -1527,55 +1509,55 @@ wlan_transport_start_wlan_helper (struct Plugin *plugin)
   {
 
 #if DEBUG_wlan
-    GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
-                     "Starting gnunet-wlan-helper loopback 1 process cmd: %s %s %i\n",
-                     filenameloopback, plugin->interface, plugin->testmode);
+    GNUNET_log_from (GNUNET_ERROR_TYPE_INFO, PLUGIN_LOG_NAME,
+                     "Starting gnunet-helper-transport-wlan-dummy loopback 1 process cmd: %s %s %i\n",
+                     absolute_filename, plugin->interface, plugin->testmode);
 #endif
-
-    if (GNUNET_OS_check_helper_binary (filenameloopback) != GNUNET_SYSERR)
-    {
-      plugin->server_proc =
-          GNUNET_OS_start_process (plugin->server_stdin, plugin->server_stdout,
-                                   filenameloopback, filenameloopback, "1",
-                                   NULL);
-    }
-    else
+    plugin->server_proc =
+        GNUNET_OS_start_process (GNUNET_NO, plugin->server_stdin, plugin->server_stdout,
+                                 absolute_filename, absolute_filename, "1",
+                                 NULL);
+    if (plugin->server_proc == NULL)
     {
       GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
-                       "gnunet-transport-wlan-helper-dummy not found, please look if it exists and is the $PATH variable!\n");
+                       "`%s' not found, please look if it exists and is in the $PATH variable!\n",
+                       absolute_filename);
       GNUNET_break (0);
     }
   }
   else if (plugin->testmode == 2)
   {
 #if DEBUG_wlan
-    GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
-                     "Starting gnunet-wlan-helper loopback 2 process cmd: %s %s %i\n",
-                     filenameloopback, plugin->interface, plugin->testmode);
+    GNUNET_log_from (GNUNET_ERROR_TYPE_INFO, PLUGIN_LOG_NAME,
+                     "Starting gnunet-helper-transport-wlan-dummy loopback 2 process cmd: %s %s %i\n",
+                     absolute_filename, plugin->interface, plugin->testmode);
 #endif
-    if (GNUNET_OS_check_helper_binary (filenameloopback) != GNUNET_SYSERR)
-    {
-      plugin->server_proc =
-          GNUNET_OS_start_process (plugin->server_stdin, plugin->server_stdout,
-                                   filenameloopback, filenameloopback, "2",
-                                   NULL);
-    }
-    else
+
+    plugin->server_proc =
+        GNUNET_OS_start_process (GNUNET_NO, plugin->server_stdin, plugin->server_stdout,
+                                 absolute_filename, absolute_filename, "2",
+                                 NULL);
+    if (plugin->server_proc == NULL)
     {
       GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
-                       "gnunet-transport-wlan-helper-dummy not found, please look if it exists and is in the $PATH variable!\n");
+                       "`%s' not found, please look if it exists and is in the $PATH variable!\n",
+                       absolute_filename);
       GNUNET_break (0);
     }
   }
+  if (absolute_filename != NULL)
+    GNUNET_free (absolute_filename);
   if (plugin->server_proc == NULL)
   {
 #if DEBUG_wlan
     GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
-                     "Failed to start gnunet-wlan-helper process\n");
+                     "Failed to start gnunet-helper-transport-wlan process\n");
 #endif
     return GNUNET_SYSERR;
   }
 
+
+
   /* Close the write end of the read pipe */
   GNUNET_DISK_pipe_close_end (plugin->server_stdout,
                               GNUNET_DISK_PIPE_END_WRITE);
@@ -1594,7 +1576,7 @@ wlan_transport_start_wlan_helper (struct Plugin *plugin)
 
 #if DEBUG_wlan
   GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
-                   "Adding server_read_task for the wlan-helper\n");
+                   "Adding server_read_task for the gnunet-helper-transport-wlan\n");
 #endif
 
   plugin->server_read_task =
@@ -1602,11 +1584,12 @@ wlan_transport_start_wlan_helper (struct Plugin *plugin)
                                       plugin->server_stdout_handle,
                                       &wlan_plugin_helper_read, plugin);
 
+  plugin->helper_is_running = GNUNET_YES;
   return GNUNET_YES;
 }
 
 /**
- * Stops the gnunet-wlan-helper process.
+ * Stops the gnunet-helper-transport-wlan process.
  *
  * @param plugin the transport plugin
  * @return GNUNET_YES if process was started, GNUNET_SYSERR on error
@@ -1614,10 +1597,19 @@ wlan_transport_start_wlan_helper (struct Plugin *plugin)
 static int
 wlan_transport_stop_wlan_helper (struct Plugin *plugin)
 {
+#if DEBUG_wlan
+  GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
+                   "Stoping WLAN helper process\n");
+#endif
+
+  if (plugin->helper_is_running == GNUNET_NO)
+  {
 #if DEBUG_wlan
     GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
-                     "Stoping WLAN helper process\n");
+                     "wlan_transport_stop_wlan_helper not needed, helper already stopped!");
 #endif
+    return GNUNET_YES;
+  }
 
   if (plugin->server_write_delay_task != GNUNET_SCHEDULER_NO_TASK)
   {
@@ -1640,9 +1632,11 @@ wlan_transport_stop_wlan_helper (struct Plugin *plugin)
   GNUNET_DISK_pipe_close (plugin->server_stdout);
   GNUNET_DISK_pipe_close (plugin->server_stdin);
   GNUNET_OS_process_kill (plugin->server_proc, SIGKILL);
-  GNUNET_OS_process_wait(plugin->server_proc);
+  GNUNET_OS_process_wait (plugin->server_proc);
   GNUNET_OS_process_close (plugin->server_proc);
 
+  plugin->helper_is_running = GNUNET_NO;
+
   return GNUNET_YES;
 }
 
@@ -1656,31 +1650,32 @@ delay_restart_helper (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   struct Finish_send *finish = cls;
   struct Plugin *plugin;
+
   plugin = finish->plugin;
 
   plugin->server_write_task = GNUNET_SCHEDULER_NO_TASK;
   if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
   {
-    GNUNET_free_non_null(finish->msgstart);
+    GNUNET_free_non_null (finish->msgstart);
     GNUNET_free (finish);
     return;
   }
 
-  wlan_transport_start_wlan_helper(plugin);
+  wlan_transport_start_wlan_helper (plugin);
 
   if (finish->size != 0)
-    {
-      plugin->server_write_task =
-                      GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
-                                                       plugin->server_stdin_handle,
-                                                       &finish_sending, finish);
-    }
+  {
+    plugin->server_write_task =
+        GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
+                                         plugin->server_stdin_handle,
+                                         &finish_sending, finish);
+  }
   else
-    {
-      set_next_send (plugin);
-      GNUNET_free_non_null(finish->msgstart);
-      GNUNET_free (finish);
-    }
+  {
+    set_next_send (plugin);
+    GNUNET_free_non_null (finish->msgstart);
+    GNUNET_free (finish);
+  }
 
 }
 
@@ -1690,14 +1685,15 @@ delay_restart_helper (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
  * @param finish pointer to the Finish_send struct to finish
  */
 static void
-restart_helper(struct Plugin *plugin, struct Finish_send *finish)
+restart_helper (struct Plugin *plugin, struct Finish_send *finish)
 {
-  static struct GNUNET_TIME_Relative next_try = {1000};
-  GNUNET_assert(finish != NULL);
+  static struct GNUNET_TIME_Relative next_try = { 1000 };
+  GNUNET_assert (finish != NULL);
 
-  wlan_transport_stop_wlan_helper(plugin);
-  plugin->server_write_task = GNUNET_SCHEDULER_add_delayed (next_try, &delay_restart_helper, finish);
-  GNUNET_TIME_relative_multiply(next_try, HELPER_RESTART_SCALING_FACTOR);
+  wlan_transport_stop_wlan_helper (plugin);
+  plugin->server_write_task =
+      GNUNET_SCHEDULER_add_delayed (next_try, &delay_restart_helper, finish);
+  GNUNET_TIME_relative_multiply (next_try, HELPER_RESTART_SCALING_FACTOR);
 
 }
 
@@ -1723,24 +1719,24 @@ finish_sending (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
     return;
   }
   bytes =
-      GNUNET_DISK_file_write (plugin->server_stdin_handle, finish->head_of_next_write,
-                              finish->size);
+      GNUNET_DISK_file_write (plugin->server_stdin_handle,
+                              finish->head_of_next_write, finish->size);
 
   if (bytes != finish->size)
   {
     if (bytes != GNUNET_SYSERR)
-      {
+    {
       finish->head_of_next_write += bytes;
       finish->size -= bytes;
       plugin->server_write_task =
           GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
                                            plugin->server_stdin_handle,
                                            &finish_sending, finish);
-      }
+    }
     else
-      {
-       restart_helper(plugin, finish);
-      }
+    {
+      restart_helper (plugin, finish);
+    }
   }
   else
   {
@@ -1771,11 +1767,12 @@ send_hello_beacon (struct Plugin *plugin)
   struct Radiotap_Send *radioHeader;
   struct GNUNET_MessageHeader *msgheader2;
   const struct GNUNET_MessageHeader *hello;
-  struct Finish_send * finish;
+  struct Finish_send *finish;
 
   GNUNET_assert (plugin != NULL);
 
-  GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan hello beacons send"), 1, GNUNET_NO);
+  GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan hello beacons send"),
+                            1, GNUNET_NO);
 
   hello = plugin->env->get_our_hello ();
   hello_size = GNUNET_HELLO_size ((struct GNUNET_HELLO_Message *) hello);
@@ -1795,10 +1792,10 @@ send_hello_beacon (struct Plugin *plugin)
 
   msgheader2 = (struct GNUNET_MessageHeader *) &ieeewlanheader[1];
   /*msgheader2->size =
-      htons (GNUNET_HELLO_size ((struct GNUNET_HELLO_Message *) hello) +
-             sizeof (struct GNUNET_MessageHeader));
-
-  msgheader2->type = htons (GNUNET_MESSAGE_TYPE_WLAN_ADVERTISEMENT);*/
+   * htons (GNUNET_HELLO_size ((struct GNUNET_HELLO_Message *) hello) +
+   * sizeof (struct GNUNET_MessageHeader));
+   *
+   * msgheader2->type = htons (GNUNET_MESSAGE_TYPE_WLAN_ADVERTISEMENT); */
   memcpy (msgheader2, hello, hello_size);
 
   bytes = GNUNET_DISK_file_write (plugin->server_stdin_handle, msgheader, size);
@@ -1807,24 +1804,24 @@ send_hello_beacon (struct Plugin *plugin)
   {
     GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
                      _
-                     ("Error writing to wlan healper. errno == %d, ERROR: %s\n"),
+                     ("Error writing to wlan helper. errno == %d, ERROR: %s\n"),
                      errno, strerror (errno));
     finish = GNUNET_malloc (sizeof (struct Finish_send));
     finish->plugin = plugin;
     finish->head_of_next_write = NULL;
     finish->size = 0;
     finish->msgstart = NULL;
-    restart_helper(plugin, finish);
+    restart_helper (plugin, finish);
 
     set_next_beacon_time (plugin);
 
   }
   else
-    {
+  {
     GNUNET_assert (bytes == size);
     set_next_beacon_time (plugin);
     set_next_send (plugin);
-    }
+  }
   GNUNET_free (msgheader);
 
 
@@ -1837,7 +1834,6 @@ send_hello_beacon (struct Plugin *plugin)
  * @param hdr pointer to the hdr where the ack is stored
  *
  */
-
 static void
 add_ack_for_send (void *cls, uint32_t msg_id,
                   const struct GNUNET_MessageHeader *hdr)
@@ -1934,7 +1930,8 @@ check_fragment_queue (struct Plugin *plugin)
       session->mac->fragment_messages_out_count++;
       session->fragment_messages_out_count++;
       plugin->pending_Fragment_Messages++;
-      GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan pending fragments"), plugin->pending_Fragment_Messages, GNUNET_NO);
+      GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan pending fragments"),
+                             plugin->pending_Fragment_Messages, GNUNET_NO);
 
       fm = GNUNET_malloc (sizeof (struct FragmentMessage));
       fm->session = session;
@@ -1995,7 +1992,7 @@ send_ack (struct Plugin *plugin)
 
   ssize_t bytes;
   struct AckSendQueue *ack;
-  struct Finish_send * finish;
+  struct Finish_send *finish;
 
   ack = plugin->ack_send_queue_head;
 
@@ -2008,7 +2005,8 @@ send_ack (struct Plugin *plugin)
 #endif
 
   GNUNET_assert (plugin != NULL);
-  GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan acks send"), 1, GNUNET_NO);
+  GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan acks send"), 1,
+                            GNUNET_NO);
 
   getRadiotapHeader (plugin, ack->endpoint, ack->radioHeader);
   getWlanHeader (ack->ieeewlanheader, &ack->endpoint->addr, plugin,
@@ -2021,14 +2019,14 @@ send_ack (struct Plugin *plugin)
   {
     GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
                      _
-                     ("Error writing to wlan healper. errno == %d, ERROR: %s\n"),
+                     ("Error writing to wlan helper. errno == %d, ERROR: %s\n"),
                      errno, strerror (errno));
     finish = GNUNET_malloc (sizeof (struct Finish_send));
     finish->plugin = plugin;
     finish->head_of_next_write = NULL;
     finish->size = 0;
     finish->msgstart = NULL;
-    restart_helper(plugin, finish);
+    restart_helper (plugin, finish);
   }
   else
   {
@@ -2050,6 +2048,7 @@ static void
 do_transmit (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   struct Plugin *plugin = cls;
+
   GNUNET_assert (plugin != NULL);
 
   plugin->server_write_task = GNUNET_SCHEDULER_NO_TASK;
@@ -2077,7 +2076,8 @@ do_transmit (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 
   if (plugin->sending_messages_head != NULL)
   {
-    GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan fragments send"), 1, GNUNET_NO);
+    GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan fragments send"), 1,
+                              GNUNET_NO);
 
     fmq = plugin->sending_messages_head;
     fm = fmq->content;
@@ -2114,21 +2114,21 @@ do_transmit (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
       {
         GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
                          _
-                         ("Error writing to wlan healper. errno == %d, ERROR: %s\n"),
+                         ("Error writing to wlan helper. errno == %d, ERROR: %s\n"),
                          errno, strerror (errno));
 
         finish->head_of_next_write = fm->frag;
         finish->size = fm->size;
-        restart_helper(plugin, finish);
+        restart_helper (plugin, finish);
       }
       else
       {
         finish->head_of_next_write = fm->frag + bytes;
         finish->size = fm->size - bytes;
         plugin->server_write_task =
-                  GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
-                                                   plugin->server_stdin_handle,
-                                                   &finish_sending, finish);
+            GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
+                                             plugin->server_stdin_handle,
+                                             &finish_sending, finish);
       }
 
       fm->frag = NULL;
@@ -2143,8 +2143,11 @@ do_transmit (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
     return;
   }
 
-  GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING, PLUGIN_LOG_NAME,
+#if 1
+  GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
                    "do_transmit did nothing, should not happen!\n");
+#endif
+  set_next_send (plugin);
 }
 
 /**
@@ -2175,74 +2178,98 @@ wlan_plugin_address_suggested (void *cls, const void *addr, size_t addrlen)
     /* TODO check for bad addresses like multicast, broadcast, etc */
 #if DEBUG_wlan
     GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
-                         "wlan_plugin_address_suggested got good address, size %u!\n", addrlen);
+                     "wlan_plugin_address_suggested got good address, size %u!\n",
+                     addrlen);
 #endif
     return GNUNET_OK;
   }
 #if DEBUG_wlan
-    GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
-                         "wlan_plugin_address_suggested got bad address, size %u!\n", addrlen);
+  GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
+                   "wlan_plugin_address_suggested got bad address, size %u!\n",
+                   addrlen);
 #endif
   return GNUNET_SYSERR;
 }
 
+
+/**
+ * Creates a new outbound session the transport service will use to send data to the
+ * peer
+ *
+ * @param cls the plugin
+ * @param address the address
+ * @return the session or NULL of max connections exceeded
+ */
+
+static struct Session *
+wlan_plugin_get_session (void *cls,
+                  const struct GNUNET_HELLO_Address *address)
+{
+  struct Plugin *plugin = cls;
+  struct Session * s = NULL;
+
+  GNUNET_assert (plugin != NULL);
+  GNUNET_assert (address != NULL);
+
+  if (GNUNET_OK == wlan_plugin_address_suggested (plugin,
+            address->address,
+            address->address_length))
+  {
+    s = get_session (plugin, address->address, &address->peer);
+  }
+  else
+  {
+    GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
+                     _("Wlan Address len %d is wrong\n"), address->address_length);
+    return s;
+  }
+
+  return s;
+}
+
 /**
  * Function that can be used by the transport service to transmit
- * a message using the plugin.
+ * a message using the plugin.   Note that in the case of a
+ * peer disconnecting, the continuation MUST be called
+ * prior to the disconnect notification itself.  This function
+ * will be called with this peer's HELLO message to initiate
+ * a fresh connection to another peer.
  *
  * @param cls closure
- * @param target who should receive this message
- * @param priority how important is the message
+ * @param session which session must be used
  * @param msgbuf the message to transmit
  * @param msgbuf_size number of bytes in 'msgbuf'
- * @param timeout when should we time out
- * @param session which session must be used (or NULL for "any")
- * @param addr the address to use (can be NULL if the plugin
- *                is "on its own" (i.e. re-use existing TCP connection))
- * @param addrlen length of the address in bytes
- * @param force_address GNUNET_YES if the plugin MUST use the given address,
- *                otherwise the plugin may use other addresses or
- *                existing connections (if available)
+ * @param priority how important is the message (most plugins will
+ *                 ignore message priority and just FIFO)
+ * @param to how long to wait at most for the transmission (does not
+ *                require plugins to discard the message after the timeout,
+ *                just advisory for the desired delay; most plugins will ignore
+ *                this as well)
  * @param cont continuation to call once the message has
  *        been transmitted (or if the transport is ready
  *        for the next transmission call; or if the
- *        peer disconnected...)
+ *        peer disconnected...); can be NULL
  * @param cont_cls closure for cont
  * @return number of bytes used (on the physical network, with overheads);
  *         -1 on hard errors (i.e. address invalid); 0 is a legal value
  *         and does NOT mean that the message was not transmitted (DV)
  */
 static ssize_t
-wlan_plugin_send (void *cls, const struct GNUNET_PeerIdentity *target,
-                  const char *msgbuf, size_t msgbuf_size, unsigned int priority,
-                  struct GNUNET_TIME_Relative timeout, struct Session *session,
-                  const void *addr, size_t addrlen, int force_address,
+wlan_plugin_send (void *cls,
+                  struct Session *session,
+                  const char *msgbuf, size_t msgbuf_size,
+                  unsigned int priority,
+                  struct GNUNET_TIME_Relative to,
                   GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls)
 {
   struct Plugin *plugin = cls;
   struct PendingMessage *newmsg;
   struct WlanHeader *wlanheader;
+
   GNUNET_assert (plugin != NULL);
-  //check if msglen > 0
+  GNUNET_assert (session != NULL);
   GNUNET_assert (msgbuf_size > 0);
 
-  //get session if needed
-  if (session == NULL)
-  {
-    if (wlan_plugin_address_suggested (plugin, addr, addrlen) == GNUNET_OK)
-    {
-      session = get_session (plugin, addr, target);
-    }
-    else
-    {
-      GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
-                       _("Wlan Address len %d is wrong\n"), addrlen);
-      return -1;
-    }
-  }
-
-  GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan messages queued"), 1, GNUNET_NO);
-
   //queue message:
 
   //queue message in session
@@ -2264,20 +2291,18 @@ wlan_plugin_send (void *cls, const struct GNUNET_PeerIdentity *target,
   //copy msg to buffer, not fragmented / segmented yet, but with message header
   wlanheader->header.size = htons (msgbuf_size + sizeof (struct WlanHeader));
   wlanheader->header.type = htons (GNUNET_MESSAGE_TYPE_WLAN_DATA);
-  memcpy (&(wlanheader->target), target, sizeof (struct GNUNET_PeerIdentity));
+  memcpy (&(wlanheader->target), &session->target, sizeof (struct GNUNET_PeerIdentity));
   memcpy (&(wlanheader->source), plugin->env->my_identity,
           sizeof (struct GNUNET_PeerIdentity));
   wlanheader->crc = 0;
   memcpy (&wlanheader[1], msgbuf, msgbuf_size);
   wlanheader->crc =
-      htonl (getcrc32
+      htonl (GNUNET_CRYPTO_crc32_n
              ((char *) wlanheader, msgbuf_size + sizeof (struct WlanHeader)));
-  //GNUNET_log_from(GNUNET_ERROR_TYPE_INFO, PLUGIN_LOG_NAME,  "Wlan message Header crc: %u, %u\n",getcrc32((char*) wlanheader, msgbuf_size + sizeof(struct WlanHeader)), wlanheader->crc);
-  //hexdump(newmsg->msg, msgbuf_size + sizeof(struct WlanHeader));
 
   newmsg->transmit_cont = cont;
   newmsg->transmit_cont_cls = cont_cls;
-  newmsg->timeout = GNUNET_TIME_relative_to_absolute (timeout);
+  newmsg->timeout = GNUNET_TIME_relative_to_absolute (to);
 
   newmsg->timeout.abs_value = newmsg->timeout.abs_value - 500;
 
@@ -2300,9 +2325,9 @@ wlan_plugin_send (void *cls, const struct GNUNET_PeerIdentity *target,
   check_fragment_queue (plugin);
   //FIXME not the correct size
   return msgbuf_size;
-
 }
 
+
 /**
  * function to free a mac endpoint
  * @param plugin pointer to the plugin struct
@@ -2331,7 +2356,8 @@ free_macendpoint (struct Plugin *plugin, struct MacEndpoint *endpoint)
     endpoint->timeout_task = GNUNET_SCHEDULER_NO_TASK;
   }
   plugin->mac_count--;
-  GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan mac endpoints"), plugin->mac_count, GNUNET_NO);
+  GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan mac endpoints"),
+                         plugin->mac_count, GNUNET_NO);
   GNUNET_free (endpoint);
 
 }
@@ -2340,7 +2366,7 @@ free_macendpoint (struct Plugin *plugin, struct MacEndpoint *endpoint)
  * function to free a session
  * @param plugin pointer to the plugin
  * @param queue pointer to the sessionqueue element to free
- * @param free_macendpoint if GNUNET_YES and mac endpoint would be empty, free mac endpoint
+ * @param do_free_macendpoint if GNUNET_YES and mac endpoint would be empty, free mac endpoint
  */
 static void
 free_session (struct Plugin *plugin, struct Sessionqueue *queue,
@@ -2369,7 +2395,8 @@ free_session (struct Plugin *plugin, struct Sessionqueue *queue,
     if (pendingsession_tmp->content == queue->content)
     {
       plugin->pendingsessions--;
-      GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan pending sessions"), plugin->pendingsessions, GNUNET_NO);
+      GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan pending sessions"),
+                             plugin->pendingsessions, GNUNET_NO);
       GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions_head,
                                    plugin->pending_Sessions_tail,
                                    pendingsession_tmp);
@@ -2406,12 +2433,14 @@ free_session (struct Plugin *plugin, struct Sessionqueue *queue,
   GNUNET_CONTAINER_DLL_remove (endpoint->sessions_head, endpoint->sessions_tail,
                                queue);
   //Check that no ohter session on this endpoint for this session exits
-  GNUNET_assert(search_session(plugin, endpoint, &queue->content->target) == NULL);
+  GNUNET_assert (search_session (plugin, endpoint, &queue->content->target) ==
+                 NULL);
   if (endpoint->sessions_head == NULL && do_free_macendpoint == GNUNET_YES)
   {
     free_macendpoint (plugin, endpoint);
     //check if no endpoint with the same address exists
-    GNUNET_assert(get_macendpoint(plugin, &endpoint->addr, GNUNET_NO) == NULL);
+    GNUNET_assert (get_macendpoint (plugin, &endpoint->addr, GNUNET_NO) ==
+                   NULL);
   }
 
   if (queue->content->timeout_task != GNUNET_SCHEDULER_NO_TASK)
@@ -2490,31 +2519,31 @@ wlan_plugin_address_pretty_printer (void *cls, const char *type,
   const unsigned char *input;
 
   //GNUNET_assert(cls !=NULL);
-  if (addrlen != sizeof(struct MacAddress))
+  if (addrlen != sizeof (struct MacAddress))
   {
     /* invalid address (MAC addresses have 6 bytes) */
     //GNUNET_break (0);
 #if DEBUG_wlan
-      GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
-                   "Func wlan_plugin_address_pretty_printer got size: %u, worng size!\n",
-                   addrlen);
+    GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
+                     "Func wlan_plugin_address_pretty_printer got size: %u, worng size!\n",
+                     addrlen);
 #endif
-    asc(asc_cls, NULL);
+    asc (asc_cls, NULL);
     return;
   }
   input = (const unsigned char *) addr;
   GNUNET_asprintf (&ret,
-                   "Transport %s: %s Mac-Address %.2X:%.2X:%.2X:%.2X:%.2X:%.2X",type,
-                   PROTOCOL_PREFIX, input[0], input[1], input[2], input[3],
-                   input[4], input[5]);
+                   "Transport %s: %s Mac-Address %.2X:%.2X:%.2X:%.2X:%.2X:%.2X",
+                   type, PROTOCOL_PREFIX, input[0], input[1], input[2],
+                   input[3], input[4], input[5]);
 #if DEBUG_wlan
   GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
                    "Func wlan_plugin_address_pretty_printer got size: %u, nummeric %u, type %s; made string: %s\n",
                    addrlen, numeric, type, ret);
 #endif
-  asc ( asc_cls, ret);
+  asc (asc_cls, ret);
   //only one mac address per plugin
-  asc ( asc_cls, NULL);
+  asc (asc_cls, NULL);
 }
 
 
@@ -2554,7 +2583,9 @@ wlan_data_message_handler (void *cls, const struct GNUNET_MessageHeader *hdr)
       return;
     }
 
-    GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan whole messages received"), 1, GNUNET_NO);
+    GNUNET_STATISTICS_update (plugin->env->stats,
+                              _("# wlan whole messages received"), 1,
+                              GNUNET_NO);
     wlanheader = (struct WlanHeader *) hdr;
 
     session = search_session (plugin, endpoint, &wlanheader->source);
@@ -2562,13 +2593,15 @@ wlan_data_message_handler (void *cls, const struct GNUNET_MessageHeader *hdr)
     temp_hdr = (const struct GNUNET_MessageHeader *) &wlanheader[1];
     crc = ntohl (wlanheader->crc);
     wlanheader->crc = 0;
-    if (getcrc32 ((char *) wlanheader, ntohs (wlanheader->header.size)) != crc)
+    if (GNUNET_CRYPTO_crc32_n
+        ((char *) wlanheader, ntohs (wlanheader->header.size)) != crc)
     {
       //wrong crc, dispose message
       GNUNET_log_from (GNUNET_ERROR_TYPE_INFO, PLUGIN_LOG_NAME,
                        "Wlan message header crc was wrong: %u != %u\n",
-                       getcrc32 ((char *) wlanheader,
-                                 ntohs (wlanheader->header.size)), crc);
+                       GNUNET_CRYPTO_crc32_n ((char *) wlanheader,
+                                              ntohs (wlanheader->header.size)),
+                       crc);
       hexdump ((void *) hdr, ntohs (hdr->size));
       return;
     }
@@ -2678,11 +2711,12 @@ process_data (void *cls, void *client, const struct GNUNET_MessageHeader *hdr)
   GNUNET_assert (cls != NULL);
   struct Session *session = (struct Session *) client;
   struct Plugin *plugin = (struct Plugin *) cls;
+  struct GNUNET_ATS_Information ats[2];
 
-  struct GNUNET_ATS_Information distance;
-
-  distance.type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE);
-  distance.value = htonl (1);
+  ats[0].type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE);
+  ats[0].value = htonl (1);
+  ats[1].type = htonl (GNUNET_ATS_NETWORK_TYPE);
+  ats[1].value = htonl (GNUNET_ATS_NET_WLAN);
 
 #if DEBUG_wlan
   GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
@@ -2694,9 +2728,8 @@ process_data (void *cls, void *client, const struct GNUNET_MessageHeader *hdr)
 #endif
 
   plugin->env->receive (plugin->env->cls, &(session->target), hdr,
-                        (const struct GNUNET_ATS_Information *)
-                        &distance, 1, session,
-                        (const char *) &session->mac->addr,
+                        (const struct GNUNET_ATS_Information *) &ats, 2,
+                        session, (const char *) &session->mac->addr,
                         sizeof (session->mac->addr));
 }
 
@@ -2718,7 +2751,7 @@ wlan_data_helper (void *cls, struct Session_light *session_light,
   struct FragmentMessage *fm2;
   struct GNUNET_PeerIdentity tmpsource;
 
-  GNUNET_assert(plugin != NULL);
+  GNUNET_assert (plugin != NULL);
 
   //ADVERTISEMENT
   if (ntohs (hdr->type) == GNUNET_MESSAGE_TYPE_HELLO)
@@ -2744,18 +2777,22 @@ wlan_data_helper (void *cls, struct Session_light *session_light,
 
 
     if (GNUNET_HELLO_get_id
-        ((const struct GNUNET_HELLO_Message *) hdr,
-         &tmpsource) == GNUNET_OK)
+        ((const struct GNUNET_HELLO_Message *) hdr, &tmpsource) == GNUNET_OK)
     {
-        session_light->session = search_session (plugin, session_light->macendpoint, &tmpsource);
+      session_light->session =
+          search_session (plugin, session_light->macendpoint, &tmpsource);
       if (session_light->session == NULL)
-        {
-          session_light->session = create_session (plugin, session_light->macendpoint, &tmpsource);
-        }
-      GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan hello messages received"), 1, GNUNET_NO);
-      plugin->env->receive(plugin->env->cls,&session_light->session->target,hdr, NULL, 0, session_light->session,
-          (const char *) &session_light->session->mac->addr,
-          sizeof (session_light->session->mac->addr));
+      {
+        session_light->session =
+            create_session (plugin, session_light->macendpoint, &tmpsource);
+      }
+      GNUNET_STATISTICS_update (plugin->env->stats,
+                                _("# wlan hello messages received"), 1,
+                                GNUNET_NO);
+      plugin->env->receive (plugin->env->cls, &session_light->session->target,
+                            hdr, NULL, 0, session_light->session,
+                            (const char *) &session_light->session->mac->addr,
+                            sizeof (session_light->session->mac->addr));
     }
     else
     {
@@ -2786,7 +2823,8 @@ wlan_data_helper (void *cls, struct Session_light *session_light,
                                                     6));
 #endif
 
-    GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan fragments received"), 1, GNUNET_NO);
+    GNUNET_STATISTICS_update (plugin->env->stats,
+                              _("# wlan fragments received"), 1, GNUNET_NO);
     int ret =
         GNUNET_DEFRAGMENT_process_fragment (session_light->macendpoint->defrag,
                                             hdr);
@@ -2838,7 +2876,8 @@ wlan_data_helper (void *cls, struct Session_light *session_light,
     while (fm != NULL)
     {
       fm2 = fm->next;
-      GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan acks received"), 1, GNUNET_NO);
+      GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan acks received"),
+                                1, GNUNET_NO);
       int ret = GNUNET_FRAGMENT_process_ack (fm->fragcontext, hdr);
 
       if (ret == GNUNET_OK)
@@ -2895,12 +2934,13 @@ wlan_data_helper (void *cls, struct Session_light *session_light,
 
 }
 
+#if DEBUG_wlan
 /**
  * Function to print mac addresses nice *
  * @param pointer to 6 byte with the mac address
  * @return pointer to the chars which hold the print out
  */
-const char *
+static const char *
 macprinter (const u_int8_t * mac)
 {
   static char macstr[20];
@@ -2909,6 +2949,7 @@ macprinter (const u_int8_t * mac)
                    mac[2], mac[3], mac[4], mac[5]);
   return macstr;
 }
+#endif
 
 /**
  * Function for the scheduler if a mac endpoint times out
@@ -2930,8 +2971,9 @@ macendpoint_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
       (GNUNET_TIME_absolute_add
        (endpoint->last_activity, MACENDPOINT_TIMEOUT)).rel_value == 0)
   {
-    GNUNET_assert(endpoint->plugin != NULL);
-    GNUNET_STATISTICS_update (endpoint->plugin->env->stats, _("# wlan mac endpoints timeouts"), 1, GNUNET_NO);
+    GNUNET_assert (endpoint->plugin != NULL);
+    GNUNET_STATISTICS_update (endpoint->plugin->env->stats,
+                              _("# wlan mac endpoints timeouts"), 1, GNUNET_NO);
     free_macendpoint (endpoint->plugin, endpoint);
   }
   else
@@ -2953,8 +2995,9 @@ create_macendpoint (struct Plugin *plugin, const struct MacAddress *addr)
 {
   struct MacEndpoint *newend = GNUNET_malloc (sizeof (struct MacEndpoint));
 
-  GNUNET_assert(plugin != NULL);
-  GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan mac endpoints created"), 1, GNUNET_NO);
+  GNUNET_assert (plugin != NULL);
+  GNUNET_STATISTICS_update (plugin->env->stats,
+                            _("# wlan mac endpoints created"), 1, GNUNET_NO);
   newend->addr = *addr;
   newend->plugin = plugin;
   newend->addr = *addr;
@@ -2970,7 +3013,8 @@ create_macendpoint (struct Plugin *plugin, const struct MacAddress *addr)
                                     newend);
 
   plugin->mac_count++;
-  GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan mac endpoints"), plugin->mac_count, GNUNET_NO);
+  GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan mac endpoints"),
+                         plugin->mac_count, GNUNET_NO);
   GNUNET_CONTAINER_DLL_insert_tail (plugin->mac_head, plugin->mac_tail, newend);
 #if DEBUG_wlan
   GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
@@ -3000,7 +3044,7 @@ wlan_process_helper (void *cls, void *client,
   int datasize = 0;
   int pos;
 
-  GNUNET_assert(plugin != NULL);
+  GNUNET_assert (plugin != NULL);
   switch (ntohs (hdr->type))
   {
   case GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA:
@@ -3010,11 +3054,13 @@ wlan_process_helper (void *cls, void *client,
                      ntohs (hdr->size));
 #endif
 
-    GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan WLAN_HELPER_DATA received"), 1, GNUNET_NO);
+    GNUNET_STATISTICS_update (plugin->env->stats,
+                              _("# wlan WLAN_HELPER_DATA received"), 1,
+                              GNUNET_NO);
     //call wlan_process_helper with the message inside, later with wlan: analyze signal
     if (ntohs (hdr->size) <
-        sizeof (struct ieee80211_frame) + 2*sizeof (struct GNUNET_MessageHeader) +
-        sizeof (struct Radiotap_rx))
+        sizeof (struct ieee80211_frame) +
+        2 * sizeof (struct GNUNET_MessageHeader) + sizeof (struct Radiotap_rx))
     {
 #if DEBUG_wlan
       GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
@@ -3035,21 +3081,24 @@ wlan_process_helper (void *cls, void *client,
 
     //check for bssid
     if (memcmp
-        (&(wlanIeeeHeader->i_addr3), &mac_bssid,
+        (&(wlanIeeeHeader->i_addr3), &mac_bssid_gnunet,
          sizeof (struct MacAddress)) == 0)
     {
       //check for broadcast or mac
       if ((memcmp
-          (&(wlanIeeeHeader->i_addr1), &bc_all_mac,
-           sizeof (struct MacAddress)) == 0) ||
-          (memcmp (&(wlanIeeeHeader->i_addr1), &(plugin->mac_address),
-                  sizeof (struct MacAddress)) == 0))
+           (&(wlanIeeeHeader->i_addr1), &bc_all_mac,
+            sizeof (struct MacAddress)) == 0) ||
+          (memcmp
+           (&(wlanIeeeHeader->i_addr1), &(plugin->mac_address),
+            sizeof (struct MacAddress)) == 0))
       {
-          //if packet is from us return
-          if ((memcmp (&(wlanIeeeHeader->i_addr2), &(plugin->mac_address),
-                  sizeof (struct MacAddress)) == 0)){
-              return;
-          }
+        //if packet is from us return
+        if ((memcmp
+             (&(wlanIeeeHeader->i_addr2), &(plugin->mac_address),
+              sizeof (struct MacAddress)) == 0))
+        {
+          return;
+        }
         // process the inner data
 
 
@@ -3061,25 +3110,30 @@ wlan_process_helper (void *cls, void *client,
         memcpy (&session_light->addr, &(wlanIeeeHeader->i_addr2),
                 sizeof (struct MacAddress));
         //session_light->session = search_session(plugin,session_light->addr);
-        GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan messages for this client received"), 1, GNUNET_NO);
+        GNUNET_STATISTICS_update (plugin->env->stats,
+                                  _("# wlan messages for this client received"),
+                                  1, GNUNET_NO);
 
         pos = 0;
         while (pos < datasize)
         {
           temp_hdr = (struct GNUNET_MessageHeader *) &wlanIeeeHeader[1] + pos;
-          if (ntohs(temp_hdr->size) <= datasize + pos)
-            {
-              GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan messages inside WLAN_HELPER_DATA received"), 1, GNUNET_NO);
-              wlan_data_helper (plugin, session_light, temp_hdr, rxinfo);
-            }
+          if (ntohs (temp_hdr->size) <= datasize + pos)
+          {
+            GNUNET_STATISTICS_update (plugin->env->stats,
+                                      _
+                                      ("# wlan messages inside WLAN_HELPER_DATA received"),
+                                      1, GNUNET_NO);
+            wlan_data_helper (plugin, session_light, temp_hdr, rxinfo);
+          }
           else
-            {
+          {
 #if DEBUG_wlan
             GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
-                       "Size of packet is too small; size: %u > size of packet: %u\n",
-                       ntohs(temp_hdr->size),datasize + pos);
+                             "Size of packet is too small; size: %u > size of packet: %u\n",
+                             ntohs (temp_hdr->size), datasize + pos);
 #endif
-            }
+          }
           pos += ntohs (temp_hdr->size);
 
         }
@@ -3107,7 +3161,7 @@ wlan_process_helper (void *cls, void *client,
     break;
   case GNUNET_MESSAGE_TYPE_WLAN_HELPER_CONTROL:
     //TODO more control messages
-    if (ntohs (hdr->size) != sizeof (struct Wlan_Helper_Control_Message))
+    if (ntohs (hdr->size) != sizeof (struct GNUNET_TRANSPORT_WLAN_HelperControlMessage))
     {
       GNUNET_break (0);
       /* FIXME: restart SUID process */
@@ -3159,7 +3213,7 @@ libgnunet_plugin_transport_wlan_done (void *cls)
                    "libgnunet_plugin_transport_wlan_done started\n");
 #endif
 
-  wlan_transport_stop_wlan_helper(plugin);
+  wlan_transport_stop_wlan_helper (plugin);
 
   GNUNET_assert (cls != NULL);
   //free sessions
@@ -3203,9 +3257,11 @@ libgnunet_plugin_transport_wlan_init (void *cls)
   plugin = GNUNET_malloc (sizeof (struct Plugin));
   plugin->env = env;
   plugin->pendingsessions = 0;
-  GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan pending sessions"), plugin->pendingsessions, GNUNET_NO);
+  GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan pending sessions"),
+                         plugin->pendingsessions, GNUNET_NO);
   plugin->mac_count = 0;
-  GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan mac endpoints"), plugin->mac_count, GNUNET_NO);
+  GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan mac endpoints"),
+                         plugin->mac_count, GNUNET_NO);
   plugin->server_write_task = GNUNET_SCHEDULER_NO_TASK;
   plugin->server_read_task = GNUNET_SCHEDULER_NO_TASK;
   plugin->server_write_delay_task = GNUNET_SCHEDULER_NO_TASK;
@@ -3224,6 +3280,7 @@ libgnunet_plugin_transport_wlan_init (void *cls)
   api = GNUNET_malloc (sizeof (struct GNUNET_TRANSPORT_PluginFunctions));
   api->cls = plugin;
   api->send = &wlan_plugin_send;
+  api->get_session = &wlan_plugin_get_session;
   api->disconnect = &wlan_plugin_disconnect;
   api->address_pretty_printer = &wlan_plugin_address_pretty_printer;
   api->check_address = &wlan_plugin_address_suggested;
@@ -3236,7 +3293,7 @@ libgnunet_plugin_transport_wlan_init (void *cls)
     if (GNUNET_SYSERR ==
         GNUNET_CONFIGURATION_get_value_number (env->cfg, "transport-wlan",
                                                "TESTMODE", &(plugin->testmode)))
-      plugin->testmode = 0;             //default value
+      plugin->testmode = 0;     //default value
   }
 
   if (GNUNET_CONFIGURATION_have_value (env->cfg, "transport-wlan", "INTERFACE"))
@@ -3253,7 +3310,7 @@ libgnunet_plugin_transport_wlan_init (void *cls)
   //start the plugin
   wlan_transport_start_wlan_helper (plugin);
   set_next_beacon_time (plugin);
-  set_next_send(plugin);
+  set_next_send (plugin);
 #if DEBUG_wlan
   GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
                    "wlan init finished\n");