- begin work on enhanced multipart receiving
[oweals/gnunet.git] / src / mesh / test_mesh_small.c
index efe939876f7960dcc0703181dd40c0052672192f..368c07a97e9d370e2d7553abc1f347ac46397623 100644 (file)
 /**
  * Time to wait for stuff that should be rather fast
  */
-#define SHORT_TIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 20)
+#define SHORT_TIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 60)
 
 /**
  * DIFFERENT TESTS TO RUN
  */
 #define SETUP 0
-#define UNICAST 1
-#define MULTICAST 2
+#define FORWARD 1
 #define SPEED 3
 #define SPEED_ACK 4
-#define SPEED_MIN 5
-#define SPEED_NOBUF 6
+#define SPEED_REL 8
 #define P2P_SIGNAL 10
 
 /**
@@ -78,11 +76,11 @@ static int ok;
 
  /**
   * Each peer is supposed to generate the following callbacks:
-  * 1 incoming tunnel (@dest)
+  * 1 incoming channel (@dest)
   * 1 connected peer (@orig)
   * 1 received data packet (@dest)
   * 1 received data packet (@orig)
-  * 1 received tunnel destroy (@dest)
+  * 1 received channel destroy (@dest)
   * _________________________________
   * 5 x ok expected per peer
   */
@@ -97,12 +95,12 @@ size_t size_payload = sizeof (struct GNUNET_MessageHeader) + sizeof (uint32_t);
 /**
  * Operation to get peer ids.
  */
-struct GNUNET_TESTBED_Operation *t_op[3];
+struct GNUNET_TESTBED_Operation *t_op[2];
 
 /**
  * Peer ids.
  */
-struct GNUNET_PeerIdentity *p_id[3];
+struct GNUNET_PeerIdentity *p_id[2];
 
 /**
  * Peer ids counter.
@@ -114,16 +112,6 @@ unsigned int p_ids;
  */
 static int initialized;
 
-/**
- * Peers that have been connected
- */
-static int peers_in_tunnel;
-
-/**
- * Peers that have responded
- */
-static int peers_responded;
-
 /**
  * Number of payload packes sent
  */
@@ -175,27 +163,17 @@ static struct GNUNET_MESH_Handle *h1;
 static struct GNUNET_MESH_Handle *h2;
 
 /**
- * Mesh handle for the second leaf peer
+ * Channel handle for the root peer
  */
-static struct GNUNET_MESH_Handle *h3;
+static struct GNUNET_MESH_Channel *ch;
 
 /**
- * Tunnel handle for the root peer
+ * Channel handle for the dest peer
  */
-static struct GNUNET_MESH_Tunnel *t;
+static struct GNUNET_MESH_Channel *incoming_ch;
 
 /**
- * Tunnel handle for the first leaf peer
- */
-static struct GNUNET_MESH_Tunnel *incoming_t;
-
-/**
- * Tunnel handle for the second leaf peer
- */
-static struct GNUNET_MESH_Tunnel *incoming_t2;
-
-/**
- * Time we started the data transmission (after tunnel has been established
+ * Time we started the data transmission (after channel has been established
  * and initilized).
  */
 static struct GNUNET_TIME_Absolute start_time;
@@ -213,21 +191,22 @@ show_end_data (void)
   end_time = GNUNET_TIME_absolute_get();
   total_time = GNUNET_TIME_absolute_get_difference(start_time, end_time);
   FPRINTF (stderr, "\nResults of test \"%s\"\n", test_name);
-  FPRINTF (stderr, "Test time %llu ms\n",
-            (unsigned long long) total_time.rel_value);
+  FPRINTF (stderr, "Test time %s\n",
+          GNUNET_STRINGS_relative_time_to_string (total_time,
+                                                  GNUNET_YES));
   FPRINTF (stderr, "Test bandwidth: %f kb/s\n",
-            4 * TOTAL_PACKETS * 1.0 / total_time.rel_value); // 4bytes * ms
+          4 * TOTAL_PACKETS * 1.0 / (total_time.rel_value_us / 1000)); // 4bytes * ms
   FPRINTF (stderr, "Test throughput: %f packets/s\n\n",
-            TOTAL_PACKETS * 1000.0 / total_time.rel_value); // packets * ms
+          TOTAL_PACKETS * 1000.0 / (total_time.rel_value_us / 1000)); // packets * ms
   GAUGER ("MESH", test_name,
-          TOTAL_PACKETS * 1000.0 / total_time.rel_value,
+          TOTAL_PACKETS * 1000.0 / (total_time.rel_value_us / 1000),
           "packets/s");
 }
 
 
 /**
  * Shut down peergroup, clean up.
- * 
+ *
  * @param cls Closure (unused).
  * @param tc Task Context.
  */
@@ -241,7 +220,7 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 
 /**
  * Disconnect from mesh services af all peers, call shutdown.
- * 
+ *
  * @param cls Closure (unused).
  * @param tc Task Context.
  */
@@ -251,30 +230,23 @@ disconnect_mesh_peers (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   long line = (long) cls;
   unsigned int i;
 
-  for (i = 0; i < 3; i++)
-    if (NULL != t_op[i])
-    {
-      GNUNET_TESTBED_operation_done (t_op[i]);
-      t_op[i] = NULL;
-    }
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "disconnecting mesh service of peers, called from line %ld\n",
               line);
   disconnect_task = GNUNET_SCHEDULER_NO_TASK;
-  if (NULL != t)
+  for (i = 0; i < 2; i++)
   {
-    GNUNET_MESH_tunnel_destroy (t);
-    t = NULL;
+    GNUNET_TESTBED_operation_done (t_op[i]);
   }
-  if (NULL != incoming_t)
+  if (NULL != ch)
   {
-    GNUNET_MESH_tunnel_destroy (incoming_t);
-    incoming_t = NULL;
+    GNUNET_MESH_channel_destroy (ch);
+    ch = NULL;
   }
-  if (NULL != incoming_t2)
+  if (NULL != incoming_ch)
   {
-    GNUNET_MESH_tunnel_destroy (incoming_t2);
-    incoming_t2 = NULL;
+    GNUNET_MESH_channel_destroy (incoming_ch);
+    incoming_ch = NULL;
   }
   GNUNET_MESH_TEST_cleanup (test_ctx);
   if (GNUNET_SCHEDULER_NO_TASK != shutdown_handle)
@@ -287,28 +259,27 @@ disconnect_mesh_peers (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 
 /**
  * Abort test: schedule disconnect and shutdown immediately
- * 
+ *
  * @param line Line in the code the abort is requested from (__LINE__).
  */
-void
+static void
 abort_test (long line)
 {
   if (disconnect_task != GNUNET_SCHEDULER_NO_TASK)
   {
     GNUNET_SCHEDULER_cancel (disconnect_task);
+    disconnect_task = GNUNET_SCHEDULER_add_now (&disconnect_mesh_peers,
+                                                (void *) line);
   }
-  disconnect_task = GNUNET_SCHEDULER_add_delayed (SHORT_TIME,
-                                                  &disconnect_mesh_peers,
-                                                  (void *) line);
 }
 
 /**
  * Transmit ready callback.
- * 
+ *
  * @param cls Closure (message type).
  * @param size Size of the tranmist buffer.
  * @param buf Pointer to the beginning of the buffer.
- * 
+ *
  * @return Number of bytes written to buf.
  */
 static size_t
@@ -317,7 +288,7 @@ tmt_rdy (void *cls, size_t size, void *buf);
 
 /**
  * Task to schedule a new data transmission.
- * 
+ *
  * @param cls Closure (peer #).
  * @param tc Task Context.
  */
@@ -325,8 +296,7 @@ static void
 data_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   struct GNUNET_MESH_TransmitHandle *th;
-  struct GNUNET_MESH_Tunnel *tunnel;
-  struct GNUNET_PeerIdentity *destination;
+  struct GNUNET_MESH_Channel *channel;
 
   if ((GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason) != 0)
     return;
@@ -334,19 +304,15 @@ data_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Data task\n");
   if (GNUNET_YES == test_backwards)
   {
-    tunnel = incoming_t;
-    destination = p_id[0];
+    channel = incoming_ch;
   }
   else
   {
-    tunnel = t;
-    destination = p_id[2];
+    channel = ch;
   }
-  th = GNUNET_MESH_notify_transmit_ready (tunnel, GNUNET_NO,
+  th = GNUNET_MESH_notify_transmit_ready (channel, GNUNET_NO,
                                           GNUNET_TIME_UNIT_FOREVER_REL,
-                                          destination,
-                                          size_payload,
-                                          &tmt_rdy, (void *) 1L);
+                                          size_payload, &tmt_rdy, (void *) 1L);
   if (NULL == th)
   {
     unsigned long i = (unsigned long) cls;
@@ -385,11 +351,11 @@ tmt_rdy (void *cls, size_t size, void *buf)
   uint32_t *data;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              " tmt_rdy called\n");
+              "tmt_rdy called, filling buffer\n");
   if (size < size_payload || NULL == buf)
   {
-    GNUNET_break (0);
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+    GNUNET_break (ok >= ok_goal - 2);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "size %u, buf %p, data_sent %u, data_received %u\n",
                 size,
                 buf,
@@ -401,7 +367,12 @@ tmt_rdy (void *cls, size_t size, void *buf)
   msg->type = htons ((long) cls);
   data = (uint32_t *) &msg[1];
   *data = htonl (data_sent);
-  if (SPEED == test && GNUNET_YES == initialized)
+  if (GNUNET_NO == initialized)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "sending initializer\n");
+  }
+  else if (SPEED == test)
   {
     data_sent++;
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -410,9 +381,10 @@ tmt_rdy (void *cls, size_t size, void *buf)
     {
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               " Scheduling packet %d\n", data_sent + 1);
-      GNUNET_SCHEDULER_add_now(&data_task, NULL);
+      GNUNET_SCHEDULER_add_now (&data_task, NULL);
     }
   }
+
   return size_payload;
 }
 
@@ -421,19 +393,16 @@ tmt_rdy (void *cls, size_t size, void *buf)
  * Function is called whenever a message is received.
  *
  * @param cls closure (set from GNUNET_MESH_connect)
- * @param tunnel connection to the other end
- * @param tunnel_ctx place to store local state associated with the tunnel
- * @param sender who sent the message
+ * @param channel connection to the other end
+ * @param channel_ctx place to store local state associated with the channel
  * @param message the actual message
- * @param atsi performance data for the connection
  * @return GNUNET_OK to keep the connection open,
  *         GNUNET_SYSERR to close it (signal serious error)
  */
 int
-data_callback (void *cls, struct GNUNET_MESH_Tunnel *tunnel, void **tunnel_ctx,
-               const struct GNUNET_PeerIdentity *sender,
-               const struct GNUNET_MessageHeader *message,
-               const struct GNUNET_ATS_Information *atsi)
+data_callback (void *cls, struct GNUNET_MESH_Channel *channel,
+               void **channel_ctx,
+               const struct GNUNET_MessageHeader *message)
 {
   long client = (long) cls;
   long expected_target_client;
@@ -441,31 +410,28 @@ data_callback (void *cls, struct GNUNET_MESH_Tunnel *tunnel, void **tunnel_ctx,
 
   ok++;
 
+  GNUNET_MESH_receive_done (channel);
+
   if ((ok % 20) == 0)
   {
     if (GNUNET_SCHEDULER_NO_TASK != disconnect_task)
     {
       GNUNET_SCHEDULER_cancel (disconnect_task);
+      disconnect_task = GNUNET_SCHEDULER_add_delayed (SHORT_TIME,
+                                                      &disconnect_mesh_peers,
+                                                      (void *) __LINE__);
     }
-    disconnect_task =
-              GNUNET_SCHEDULER_add_delayed (SHORT_TIME, &disconnect_mesh_peers,
-                                            (void *) __LINE__);
   }
 
   switch (client)
   {
   case 0L:
     GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Root client got a message!\n");
-    peers_responded++;
-    if (test == MULTICAST && peers_responded < 2)
-      return GNUNET_OK;
     break;
-  case 3L:
   case 4L:
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                 "Leaf client %li got a message.\n",
                 client);
-    client = 4L;
     break;
   default:
     GNUNET_assert (0);
@@ -495,17 +461,16 @@ data_callback (void *cls, struct GNUNET_MESH_Tunnel *tunnel, void **tunnel_ctx,
     }
   }
 
-  if (client == expected_target_client) // Normally 3 or 4
+  if (client == expected_target_client) // Normally 4
   {
     data_received++;
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                 " received data %u\n", data_received);
     if (SPEED != test || (ok_goal - 2) == ok)
     {
-      GNUNET_MESH_notify_transmit_ready (tunnel, GNUNET_NO,
-                                        GNUNET_TIME_UNIT_FOREVER_REL, sender,
-                                               size_payload,
-                                        &tmt_rdy, (void *) 1L);
+      GNUNET_MESH_notify_transmit_ready (channel, GNUNET_NO,
+                                         GNUNET_TIME_UNIT_FOREVER_REL,
+                                         size_payload, &tmt_rdy, (void *) 1L);
       return GNUNET_OK;
     }
     else
@@ -521,10 +486,9 @@ data_callback (void *cls, struct GNUNET_MESH_Tunnel *tunnel, void **tunnel_ctx,
       data_ack++;
       GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               " received ack %u\n", data_ack);
-      GNUNET_MESH_notify_transmit_ready (tunnel, GNUNET_NO,
-                                        GNUNET_TIME_UNIT_FOREVER_REL, sender,
-                                               size_payload,
-                                        &tmt_rdy, (void *) 1L);
+      GNUNET_MESH_notify_transmit_ready (channel, GNUNET_NO,
+                                         GNUNET_TIME_UNIT_FOREVER_REL,
+                                         size_payload, &tmt_rdy, (void *) 1L);
       if (data_ack < TOTAL_PACKETS && SPEED != test)
         return GNUNET_OK;
       if (ok == 2 && SPEED == test)
@@ -533,23 +497,23 @@ data_callback (void *cls, struct GNUNET_MESH_Tunnel *tunnel, void **tunnel_ctx,
     }
     if (test == P2P_SIGNAL)
     {
-      GNUNET_MESH_tunnel_destroy (incoming_t);
-      incoming_t = NULL;
+      GNUNET_MESH_channel_destroy (incoming_ch);
+      incoming_ch = NULL;
     }
     else
     {
-      GNUNET_MESH_tunnel_destroy (t);
-      t = NULL;
+      GNUNET_MESH_channel_destroy (ch);
+      ch = NULL;
     }
   }
 
   if (GNUNET_SCHEDULER_NO_TASK != disconnect_task)
   {
     GNUNET_SCHEDULER_cancel (disconnect_task);
+    disconnect_task = GNUNET_SCHEDULER_add_delayed (SHORT_TIME,
+                                                    &disconnect_mesh_peers,
+                                                    (void *) __LINE__);
   }
-  disconnect_task =
-        GNUNET_SCHEDULER_add_delayed (SHORT_TIME, &disconnect_mesh_peers,
-                                      (void *) __LINE__);
 
   return GNUNET_OK;
 }
@@ -565,219 +529,111 @@ static struct GNUNET_MESH_MessageHandler handlers[] = {
 
 
 /**
- * Method called whenever another peer has added us to a tunnel
+ * Method called whenever another peer has added us to a channel
  * the other peer initiated.
  *
- * @param cls closure
- * @param tunnel new handle to the tunnel
- * @param initiator peer that started the tunnel
- * @param atsi performance information for the tunnel
- * @return initial tunnel context for the tunnel
- *         (can be NULL -- that's not an error)
+ * @param cls Closure.
+ * @param channel New handle to the channel.
+ * @param initiator Peer that started the channel.
+ * @param port Port this channel is connected to.
+ * @param options channel option flags
+ * @return Initial channel context for the channel
+ *         (can be NULL -- that's not an error).
  */
 static void *
-incoming_tunnel (void *cls, struct GNUNET_MESH_Tunnel *tunnel,
+incoming_channel (void *cls, struct GNUNET_MESH_Channel *channel,
                  const struct GNUNET_PeerIdentity *initiator,
-                 const struct GNUNET_ATS_Information *atsi)
+                 uint32_t port, enum GNUNET_MESH_ChannelOption options)
 {
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-              "Incoming tunnel from %s to peer %d\n",
+              "Incoming channel from %s to peer %d\n",
               GNUNET_i2s (initiator), (long) cls);
   ok++;
   GNUNET_log (GNUNET_ERROR_TYPE_INFO, " ok: %d\n", ok);
   if ((long) cls == 4L)
-    incoming_t = tunnel;
-  else if ((long) cls == 3L)
-    incoming_t2 = tunnel;
+    incoming_ch = channel;
   else
   {
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                "Incoming tunnel for unknown client %lu\n", (long) cls);
+                "Incoming channel for unknown client %lu\n", (long) cls);
     GNUNET_break(0);
   }
   if (GNUNET_SCHEDULER_NO_TASK != disconnect_task)
   {
     GNUNET_SCHEDULER_cancel (disconnect_task);
+    disconnect_task = GNUNET_SCHEDULER_add_delayed (SHORT_TIME,
+                                                    &disconnect_mesh_peers,
+                                                    (void *) __LINE__);
   }
-  disconnect_task =
-        GNUNET_SCHEDULER_add_delayed (SHORT_TIME, &disconnect_mesh_peers,
-                                      (void *) __LINE__);
 
   return NULL;
 }
 
 /**
- * Function called whenever an inbound tunnel is destroyed.  Should clean up
+ * Function called whenever an inbound channel is destroyed.  Should clean up
  * any associated state.
  *
  * @param cls closure (set from GNUNET_MESH_connect)
- * @param tunnel connection to the other end (henceforth invalid)
- * @param tunnel_ctx place where local state associated
- *                   with the tunnel is stored
+ * @param channel connection to the other end (henceforth invalid)
+ * @param channel_ctx place where local state associated
+ *                   with the channel is stored
  */
 static void
-tunnel_cleaner (void *cls, const struct GNUNET_MESH_Tunnel *tunnel,
-                void *tunnel_ctx)
+channel_cleaner (void *cls, const struct GNUNET_MESH_Channel *channel,
+                 void *channel_ctx)
 {
   long i = (long) cls;
 
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-              "Incoming tunnel disconnected at peer %d\n",
+              "Incoming channel disconnected at peer %d\n",
               i);
   if (4L == i)
   {
     ok++;
-    incoming_t = NULL;
+    GNUNET_break (channel == incoming_ch);
+    incoming_ch = NULL;
   }
-  else if (3L == i)
+  else if (0L == i)
   {
-    ok++;
-    incoming_t2 = NULL;
+    if (P2P_SIGNAL == test)
+    {
+      ok ++;
+    }
+    GNUNET_break (channel == ch);
+    ch = NULL;
   }
   else
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                 "Unknown peer! %d\n", i);
   GNUNET_log (GNUNET_ERROR_TYPE_INFO, " ok: %d\n", ok);
-  peers_in_tunnel--;
-  if (peers_in_tunnel > 0)
-    return;
 
   if (GNUNET_SCHEDULER_NO_TASK != disconnect_task)
   {
     GNUNET_SCHEDULER_cancel (disconnect_task);
-  }
-  disconnect_task = GNUNET_SCHEDULER_add_now (&disconnect_mesh_peers,
-                                              (void *) __LINE__);
-
-  return;
-}
-
-
-/**
- * Method called whenever a tunnel falls apart.
- *
- * @param cls closure
- * @param peer peer identity the tunnel stopped working with
- */
-static void
-dh (void *cls, const struct GNUNET_PeerIdentity *peer)
-{
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "peer %s disconnected\n",
-              GNUNET_i2s (peer));
-  if (P2P_SIGNAL == test)
-  {
-    ok ++;
-    if (GNUNET_SCHEDULER_NO_TASK != disconnect_task)
-    {
-      GNUNET_SCHEDULER_cancel (disconnect_task);
-    }
     disconnect_task = GNUNET_SCHEDULER_add_now (&disconnect_mesh_peers,
                                                 (void *) __LINE__);
   }
-  return;
-}
-
-
-/**
- * Method called whenever a peer connects to a tunnel.
- *
- * @param cls closure
- * @param peer peer identity the tunnel was created to, NULL on timeout
- * @param atsi performance data for the connection
- */
-static void
-ch (void *cls, const struct GNUNET_PeerIdentity *peer,
-    const struct GNUNET_ATS_Information *atsi)
-{
-  long i = (long) cls;
 
-  struct GNUNET_PeerIdentity *dest;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-              "%ld peer %s connected\n", i, GNUNET_i2s (peer));
-
-  if (0 == memcmp (p_id[2], peer, sizeof (struct GNUNET_PeerIdentity)) &&
-      i == 0L)
-  {
-    ok++;
-  }
-  if (test == MULTICAST &&
-      0 == memcmp (p_id[1], peer, sizeof (struct GNUNET_PeerIdentity)) &&
-      i == 0L)
-  {
-    ok++;
-  }
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO, " ok: %d\n", ok);
-  switch (test)
-  {
-    case UNICAST:
-    case P2P_SIGNAL:
-    case SPEED:
-    case SPEED_ACK:
-      // incoming_t is NULL unless we send a relevant data packet
-      dest = p_id[2];
-      break;
-    case MULTICAST:
-      peers_in_tunnel++;
-      if (peers_in_tunnel < 2)
-        return;
-      dest = NULL;
-      break;
-    default:
-      GNUNET_assert (0);
-      return;
-  }
-  if (GNUNET_SCHEDULER_NO_TASK != disconnect_task)
-  {
-    GNUNET_SCHEDULER_cancel (disconnect_task);
-    disconnect_task =
-        GNUNET_SCHEDULER_add_delayed (SHORT_TIME, &disconnect_mesh_peers,
-                                      (void *) __LINE__);
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Sending data initializer...\n");
-    peers_responded = 0;
-    data_ack = 0;
-    data_received = 0;
-    data_sent = 0;
-    GNUNET_MESH_notify_transmit_ready (t, GNUNET_NO,
-                                       GNUNET_TIME_UNIT_FOREVER_REL, dest,
-                                           size_payload,
-                                       &tmt_rdy, (void *) 1L);
-  }
-  else
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Disconnect already run?\n");
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Aborting...\n");
-  }
   return;
 }
 
 
 /**
  * START THE TESTCASE ITSELF, AS WE ARE CONNECTED TO THE MESH SERVICES.
- * 
+ *
  * Testcase continues when the root receives confirmation of connected peers,
  * on callback funtion ch.
- * 
+ *
  * @param cls Closure (unsued).
  * @param tc Task Context.
  */
 static void
 do_test (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
+  enum GNUNET_MESH_ChannelOption flags;
+
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test_task\n");
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "add peer 2\n");
-  GNUNET_MESH_peer_request_connect_add (t, p_id[2]);
-
-  if (test == MULTICAST)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "add peer 3\n");
-    GNUNET_MESH_peer_request_connect_add (t, p_id[1]);
-  }
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "schedule timeout in TIMEOUT\n");
@@ -785,21 +641,38 @@ do_test (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   {
     GNUNET_SCHEDULER_cancel (disconnect_task);
   }
-  disconnect_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
+
+  flags = GNUNET_MESH_OPTION_DEFAULT;
+  if (SPEED_REL == test)
+  {
+    test = SPEED;
+    flags |= GNUNET_MESH_OPTION_RELIABLE;
+  }
+  ch = GNUNET_MESH_channel_create (h1, NULL, p_id[1], 1, flags);
+
+  disconnect_task = GNUNET_SCHEDULER_add_delayed (SHORT_TIME,
                                                   &disconnect_mesh_peers,
                                                   (void *) __LINE__);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Sending data initializer...\n");
+  data_ack = 0;
+  data_received = 0;
+  data_sent = 0;
+  GNUNET_MESH_notify_transmit_ready (ch, GNUNET_NO,
+                                     GNUNET_TIME_UNIT_FOREVER_REL,
+                                     size_payload, &tmt_rdy, (void *) 1L);
 }
 
 /**
  * Callback to be called when the requested peer information is available
  *
- * @param cls the closure from GNUNET_TETSBED_peer_get_information()
+ * @param cls the closure from GNUNET_TESTBED_peer_get_information()
  * @param op the operation this callback corresponds to
  * @param pinfo the result; will be NULL if the operation has failed
  * @param emsg error message if the operation has failed;
  *             NULL if the operation is successfull
  */
-void
+static void
 pi_cb (void *cls,
        struct GNUNET_TESTBED_Operation *op,
        const struct GNUNET_TESTBED_PeerInformation *pinfo,
@@ -808,6 +681,7 @@ pi_cb (void *cls,
   long i = (long) cls;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "id callback for %ld\n", i);
+
   if (NULL == pinfo || NULL != emsg)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "pi_cb: %s\n", emsg);
@@ -817,7 +691,7 @@ pi_cb (void *cls,
   p_id[i] = pinfo->result.id;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  id: %s\n", GNUNET_i2s (p_id[i]));
   p_ids++;
-  if ((MULTICAST == test && p_ids < 3) || p_ids < 2)
+  if (p_ids < 2)
     return;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Got all IDs, starting test\n");
   test_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
@@ -846,18 +720,6 @@ tmain (void *cls,
   peers_running = num_peers;
   h1 = meshes[0];
   h2 = meshes[num_peers - 1];
-  t = GNUNET_MESH_tunnel_create (h1, NULL, &ch, &dh, (void *) 0L);
-  if (SPEED_MIN == test)
-  {
-    GNUNET_MESH_tunnel_speed_min(t);
-    test = SPEED;
-  }
-  if (SPEED_NOBUF == test)
-  {
-    GNUNET_MESH_tunnel_buffer(t, GNUNET_NO);
-    test = SPEED;
-  }
-  peers_in_tunnel = 0;
   disconnect_task = GNUNET_SCHEDULER_add_delayed (SHORT_TIME,
                                                   &disconnect_mesh_peers,
                                                   (void *) __LINE__);
@@ -866,20 +728,9 @@ tmain (void *cls,
   t_op[0] = GNUNET_TESTBED_peer_get_information (peers[0],
                                                  GNUNET_TESTBED_PIT_IDENTITY,
                                                  &pi_cb, (void *) 0L);
-  t_op[2] = GNUNET_TESTBED_peer_get_information (peers[num_peers - 1],
+  t_op[1] = GNUNET_TESTBED_peer_get_information (peers[num_peers - 1],
                                                  GNUNET_TESTBED_PIT_IDENTITY,
-                                                 &pi_cb, (void *) 2L);
-  if (MULTICAST == test)
-  {
-    h3 = meshes[num_peers - 2];
-    t_op[1] = GNUNET_TESTBED_peer_get_information (peers[num_peers - 2],
-                                                   GNUNET_TESTBED_PIT_IDENTITY,
-                                                   &pi_cb, (void *) 1L);
-  }
-  else
-  {
-    t_op[1] = NULL;
-  }
+                                                 &pi_cb, (void *) 1L);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "requested peer ids\n");
 }
 
@@ -891,69 +742,59 @@ int
 main (int argc, char *argv[])
 {
   initialized = GNUNET_NO;
+  uint32_t ports[2];
+  const char *config_file;
 
   GNUNET_log_setup ("test", "DEBUG", NULL);
-  
+  config_file = "test_mesh.conf";
+
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Start\n");
-  if (strstr (argv[0], "test_mesh_small_unicast") != NULL)
+  if (strstr (argv[0], "_small_forward") != NULL)
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "UNICAST\n");
-    test = UNICAST;
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "FORWARD\n");
+    test = FORWARD;
     test_name = "unicast";
-    ok_goal = 5;
-  }
-  else if (strstr (argv[0], "test_mesh_small_multicast") != NULL)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "MULTICAST\n");
-    test = MULTICAST;
-    test_name = "multicast";
-    ok_goal = 10;
+    ok_goal = 4;
   }
-  else if (strstr (argv[0], "test_mesh_small_signal") != NULL)
+  else if (strstr (argv[0], "_small_signal") != NULL)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "SIGNAL\n");
     test = P2P_SIGNAL;
     test_name = "signal";
-    ok_goal = 5;
+    ok_goal = 4;
   }
-  else if (strstr (argv[0], "test_mesh_small_speed_ack") != NULL)
+  else if (strstr (argv[0], "_small_speed_ack") != NULL)
   {
    /* Each peer is supposed to generate the following callbacks:
-    * 1 incoming tunnel (@dest)
-    * 1 connected peer (@orig)
+    * 1 incoming channel (@dest)
     * TOTAL_PACKETS received data packet (@dest)
     * TOTAL_PACKETS received data packet (@orig)
-    * 1 received tunnel destroy (@dest)
+    * 1 received channel destroy (@dest)
     * _________________________________
     * 5 x ok expected per peer
     */
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "SPEED_ACK\n");
     test = SPEED_ACK;
     test_name = "speed ack";
-    ok_goal = TOTAL_PACKETS * 2 + 3;
+    ok_goal = TOTAL_PACKETS * 2 + 2;
   }
-  else if (strstr (argv[0], "test_mesh_small_speed") != NULL)
+  else if (strstr (argv[0], "_small_speed") != NULL)
   {
    /* Each peer is supposed to generate the following callbacks:
-    * 1 incoming tunnel (@dest)
-    * 1 connected peer (@orig)
+    * 1 incoming channel (@dest)
     * 1 initial packet (@dest)
     * TOTAL_PACKETS received data packet (@dest)
     * 1 received data packet (@orig)
-    * 1 received tunnel destroy (@dest)
+    * 1 received channel destroy (@dest)
     * _________________________________
     */
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "SPEED\n");
-    ok_goal = TOTAL_PACKETS + 5;
-    if (strstr (argv[0], "_min") != NULL)
+    ok_goal = TOTAL_PACKETS + 4;
+    if (strstr (argv[0], "_reliable") != NULL)
     {
-      test = SPEED_MIN;
-      test_name = "speed min";
-    }
-    else if (strstr (argv[0], "_nobuf") != NULL)
-    {
-      test = SPEED_NOBUF;
-      test_name = "speed nobuf";
+      test = SPEED_REL;
+      test_name = "speed reliable";
+      config_file = "test_mesh_drop.conf";
     }
     else
     {
@@ -980,15 +821,17 @@ main (int argc, char *argv[])
   }
 
   p_ids = 0;
+  ports[0] = 1;
+  ports[1] = 0;
   GNUNET_MESH_TEST_run ("test_mesh_small",
-                        "test_mesh_small.conf",
+                        config_file,
                         5,
                         &tmain,
-                        NULL,
-                        &incoming_tunnel,
-                        &tunnel_cleaner,
+                        NULL, /* tmain cls */
+                        &incoming_channel,
+                        &channel_cleaner,
                         handlers,
-                        NULL);
+                        ports);
 
   if (ok_goal > ok)
   {
@@ -1001,3 +844,4 @@ main (int argc, char *argv[])
 }
 
 /* end of test_mesh_small.c */
+