gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r29790 - gnunet/src/mesh


From: gnunet
Subject: [GNUnet-SVN] r29790 - gnunet/src/mesh
Date: Wed, 2 Oct 2013 18:39:56 +0200

Author: bartpolot
Date: 2013-10-02 18:39:56 +0200 (Wed, 02 Oct 2013)
New Revision: 29790

Added:
   gnunet/src/mesh/gnunet-service-mesh-enc
   gnunet/src/mesh/gnunet-service-mesh_dht.c
   gnunet/src/mesh/gnunet-service-mesh_dht.h
   gnunet/src/mesh/gnunet-service-mesh_peer.c
   gnunet/src/mesh/gnunet-service-mesh_peer.h
Modified:
   gnunet/src/mesh/Makefile.am
   gnunet/src/mesh/gnunet-service-mesh-enc.c
   gnunet/src/mesh/gnunet-service-mesh_connection.c
   gnunet/src/mesh/gnunet-service-mesh_connection.h
   gnunet/src/mesh/gnunet-service-mesh_local.c
   gnunet/src/mesh/gnunet-service-mesh_local.h
Log:
- more refactoring

Modified: gnunet/src/mesh/Makefile.am
===================================================================
--- gnunet/src/mesh/Makefile.am 2013-10-02 16:03:42 UTC (rev 29789)
+++ gnunet/src/mesh/Makefile.am 2013-10-02 16:39:56 UTC (rev 29790)
@@ -20,11 +20,11 @@
 
 AM_CLFAGS = -g
 
-EXP_LIB = \
- libgnunetmeshenc.la
+#EXP_LIB = \
+# libgnunetmeshenc.la
 
-EXP_LIBEXEC = \
- gnunet-service-mesh-enc
+#EXP_LIBEXEC = \
+# gnunet-service-mesh-enc
 
 libexec_PROGRAMS = \
  gnunet-service-mesh $(EXP_LIBEXEC)

Added: gnunet/src/mesh/gnunet-service-mesh-enc
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh-enc                             (rev 0)
+++ gnunet/src/mesh/gnunet-service-mesh-enc     2013-10-02 16:39:56 UTC (rev 
29790)
@@ -0,0 +1,228 @@
+#! /bin/sh
+
+# gnunet-service-mesh-enc - temporary wrapper script for 
.libs/gnunet-service-mesh-enc
+# Generated by libtool (GNU libtool) 2.4.2
+#
+# The gnunet-service-mesh-enc program cannot be directly executed until all 
the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command="(cd /home/bart/g/src/mesh; { test -z \"\${LIBRARY_PATH+set}\" 
|| unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z 
\"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export 
COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset 
GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z 
\"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export 
LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset 
LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; 
PATH=/home/bart/bin:/tmp/bartgnunet/bin:/home/bart/bin:/tmp/bartgnunet/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/cuda/bin:/usr/bin/vendor_perl:/usr/bin/core_perl;
 export PATH; gcc -fno-strict-aliasing -Wall -O0 -g -Wall 
-I/tmp/bartgnunet/include -o \$progdir/\$file 
gnunet_service_mesh_enc-gnunet-service-mesh-enc.o 
gnunet_service_mesh_enc-mesh_path.o gnunet_service_mesh_enc-mesh_common.o  -lrt
  ../../s
 rc/util/.libs/libgnunetutil.so -L/tmp/bartgnunet/lib 
../../src/core/.libs/libgnunetcore.so ../../src/dht/.libs/libgnunetdht.so 
../../src/statistics/.libs/libgnunetstatistics.so 
../../src/block/.libs/libgnunetblock.so 
/home/bart/g/src/util/.libs/libgnunetutil.so /tmp/bartgnunet/lib/libgcrypt.so 
-lgpg-error -lltdl -lz -lunistring -lm -Wl,-rpath 
-Wl,/home/bart/g/src/util/.libs -Wl,-rpath -Wl,/home/bart/g/src/core/.libs 
-Wl,-rpath -Wl,/home/bart/g/src/dht/.libs -Wl,-rpath 
-Wl,/home/bart/g/src/statistics/.libs -Wl,-rpath 
-Wl,/home/bart/g/src/block/.libs -Wl,-rpath -Wl,/tmp/bartgnunet/lib -Wl,-rpath 
-Wl,/tmp/bartgnunet/lib)"
+
+# This environment variable determines our operation mode.
+if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='2.4.2'
+  notinst_deplibs=' ../../src/util/libgnunetutil.la 
../../src/core/libgnunetcore.la ../../src/dht/libgnunetdht.la 
../../src/statistics/libgnunetstatistics.la ../../src/block/libgnunetblock.la 
/home/bart/g/src/util/libgnunetutil.la'
+else
+  # When we are sourced in execute mode, $file and $ECHO are already set.
+  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
+    file="$0"
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+    ECHO="printf %s\\n"
+  fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string --lt-
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's ../../libtool value, followed by no.
+lt_option_debug=
+func_parse_lt_options ()
+{
+  lt_script_arg0=$0
+  shift
+  for lt_opt
+  do
+    case "$lt_opt" in
+    --lt-debug) lt_option_debug=1 ;;
+    --lt-dump-script)
+        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 
's%/[^/]*$%%'`
+        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
+        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 
's%^.*/%%'`
+        cat "$lt_dump_D/$lt_dump_F"
+        exit 0
+      ;;
+    --lt-*)
+        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
+        exit 1
+      ;;
+    esac
+  done
+
+  # Print the debug banner immediately:
+  if test -n "$lt_option_debug"; then
+    echo "gnunet-service-mesh-enc:gnunet-service-mesh-enc:${LINENO}: libtool 
wrapper (GNU libtool) 2.4.2" 1>&2
+  fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+  lt_dump_args_N=1;
+  for lt_arg
+  do
+    $ECHO "gnunet-service-mesh-enc:gnunet-service-mesh-enc:${LINENO}: 
newargv[$lt_dump_args_N]: $lt_arg"
+    lt_dump_args_N=`expr $lt_dump_args_N + 1`
+  done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+
+      if test -n "$lt_option_debug"; then
+        $ECHO "gnunet-service-mesh-enc:gnunet-service-mesh-enc:${LINENO}: 
newargv[0]: $progdir/$program" 1>&2
+        func_lt_dump_args ${1+"$@"} 1>&2
+      fi
+      exec "$progdir/$program" ${1+"$@"}
+
+      $ECHO "$0: cannot exec $program $*" 1>&2
+      exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from $@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+  case " $* " in
+  *\ --lt-*)
+    for lt_wr_arg
+    do
+      case $lt_wr_arg in
+      --lt-*) ;;
+      *) set x "$@" "$lt_wr_arg"; shift;;
+      esac
+      shift
+    done ;;
+  esac
+  func_exec_program_core ${1+"$@"}
+}
+
+  # Parse options
+  func_parse_lt_options "$0" ${1+"$@"}
+
+  # Find the directory that this script lives in.
+  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
+  test "x$thisdir" = "x$file" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
+  while test -n "$file"; do
+    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
+
+    # If there was a directory component, then change thisdir.
+    if test "x$destdir" != "x$file"; then
+      case "$destdir" in
+      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
+      *) thisdir="$thisdir/$destdir" ;;
+      esac
+    fi
+
+    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
+    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
+  done
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
+  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
+    # special case for '.'
+    if test "$thisdir" = "."; then
+      thisdir=`pwd`
+    fi
+    # remove .libs from thisdir
+    case "$thisdir" in
+    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 
's%[\\/][^\\/]*$%%'` ;;
+    .libs )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=`cd "$thisdir" && pwd`
+  test -n "$absdir" && thisdir="$absdir"
+
+  program=lt-'gnunet-service-mesh-enc'
+  progdir="$thisdir/.libs"
+
+  if test ! -f "$progdir/$program" ||
+     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | 
/usr/bin/sed 1q`; \
+       test "X$file" != "X$progdir/$program"; }; then
+
+    file="$$-$program"
+
+    if test ! -d "$progdir"; then
+      mkdir "$progdir"
+    else
+      rm -f "$progdir/$file"
+    fi
+
+    # relink executable if necessary
+    if test -n "$relink_command"; then
+      if relink_command_output=`eval $relink_command 2>&1`; then :
+      else
+       printf %s\n "$relink_command_output" >&2
+       rm -f "$progdir/$file"
+       exit 1
+      fi
+    fi
+
+    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
+    { rm -f "$progdir/$program";
+      mv -f "$progdir/$file" "$progdir/$program"; }
+    rm -f "$progdir/$file"
+  fi
+
+  if test -f "$progdir/$program"; then
+    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
+      # Run the actual program with our arguments.
+      func_exec_program ${1+"$@"}
+    fi
+  else
+    # The program doesn't exist.
+    $ECHO "$0: error: \`$progdir/$program' does not exist" 1>&2
+    $ECHO "This script is just a wrapper for $program." 1>&2
+    $ECHO "See the libtool documentation for more information." 1>&2
+    exit 1
+  fi
+fi


Property changes on: gnunet/src/mesh/gnunet-service-mesh-enc
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Modified: gnunet/src/mesh/gnunet-service-mesh-enc.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh-enc.c   2013-10-02 16:03:42 UTC (rev 
29789)
+++ gnunet/src/mesh/gnunet-service-mesh-enc.c   2013-10-02 16:39:56 UTC (rev 
29790)
@@ -46,39 +46,21 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "mesh_enc.h"
-#include "mesh_protocol_enc.h"
-#include "mesh_path.h"
 #include "block_mesh.h"
-#include "gnunet_dht_service.h"
 #include "gnunet_statistics_service.h"
 
 #include "gnunet-service-mesh_local.h"
 #include "gnunet-service-mesh_channel.h"
 #include "gnunet-service-mesh_connection.h"
+#include "gnunet-service-mesh_dht.h"
+#include "gnunet-service-mesh_peer.h"
 
 #define MESH_BLOOM_SIZE         128
-#define MESH_MAX_POLL_TIME      GNUNET_TIME_relative_multiply (\
-                                  GNUNET_TIME_UNIT_MINUTES,\
-                                  10)
-#define MESH_RETRANSMIT_TIME    GNUNET_TIME_UNIT_SECONDS
-#define MESH_RETRANSMIT_MARGIN  4
 
-#define MESH_DEBUG_DHT          GNUNET_NO
-#define MESH_DEBUG_CONNECTION   GNUNET_NO
+
 #define MESH_DEBUG_TIMING       __LINUX__ && GNUNET_NO
 
-#if MESH_DEBUG_DHT
-#define DEBUG_DHT(...) GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
-#else
-#define DEBUG_DHT(...)
-#endif
 
-#if MESH_DEBUG_CONNECTION
-#define DEBUG_CONN(...) GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
-#else
-#define DEBUG_CONN(...)
-#endif
-
 #if MESH_DEBUG_TIMING
 #include <time.h>
 double __sum;
@@ -141,78 +123,10 @@
 
/******************************************************************************/
 
 /** FWD declaration */
-struct MeshClient;
-struct MeshPeer;
 struct MeshTunnel2;
-struct MeshConnection;
 
 
-
 /**
- * Struct containing all information regarding a given peer
- */
-struct MeshPeer
-{
-    /**
-     * ID of the peer
-     */
-  GNUNET_PEER_Id id;
-
-    /**
-     * Last time we heard from this peer
-     */
-  struct GNUNET_TIME_Absolute last_contact;
-
-    /**
-     * Paths to reach the peer, ordered by ascending hop count
-     */
-  struct MeshPeerPath *path_head;
-
-    /**
-     * Paths to reach the peer, ordered by ascending hop count
-     */
-  struct MeshPeerPath *path_tail;
-
-    /**
-     * Handle to stop the DHT search for paths to this peer
-     */
-  struct GNUNET_DHT_GetHandle *dhtget;
-
-    /**
-     * Tunnel to this peer, if any.
-     */
-  struct MeshTunnel2 *tunnel;
-
-    /**
-     * Connections that go through this peer, indexed by tid;
-     */
-  struct GNUNET_CONTAINER_MultiHashMap *connections;
-
-    /**
-     * Handle for queued transmissions
-     */
-  struct GNUNET_CORE_TransmitHandle *core_transmit;
-
-  /**
-   * Transmission queue to core DLL head
-   */
-  struct MeshPeerQueue *queue_head;
-  
-  /**
-   * Transmission queue to core DLL tail
-   */
-  struct MeshPeerQueue *queue_tail;
-
-  /**
-   * How many messages are in the queue to this peer.
-   */
-  unsigned int queue_n;
-};
-
-
-
-
-/**
  * Struct used to queue messages in a tunnel.
  */
 struct MeshTunnelQueue
@@ -354,10 +268,6 @@
 
 /************************** Configuration parameters 
**************************/
 
-/**
- * How often to PUT own ID in the DHT.
- */
-static struct GNUNET_TIME_Relative id_announce_time;
 
 /**
  * Maximum time allowed to connect to a peer found by string.
@@ -370,16 +280,6 @@
 static unsigned long long default_ttl;
 
 /**
- * DHT replication level, see DHT API: GNUNET_DHT_get_start, GNUNET_DHT_put.
- */
-static unsigned long long dht_replication_level;
-
-/**
- * How many peers do we want to remember?
- */
-static unsigned long long max_peers;
-
-/**
  * Percentage of messages that will be dropped (for test purposes only).
  */
 static unsigned long long drop_percent;
@@ -387,21 +287,6 @@
 /*************************** Static global variables 
**************************/
 
 /**
- * Peers known, indexed by PeerIdentity (MeshPeer).
- */
-static struct GNUNET_CONTAINER_MultiPeerMap *peers;
-
-/**
- * Handle to communicate with core.
- */
-static struct GNUNET_CORE_Handle *core_handle;
-
-/**
- * Handle to use DHT.
- */
-static struct GNUNET_DHT_Handle *dht_handle;
-
-/**
  * Handle to the statistics service.
  */
 static struct GNUNET_STATISTICS_Handle *stats;
@@ -421,12 +306,7 @@
  */
 static struct GNUNET_CRYPTO_EccPrivateKey *my_private_key;
 
-/**
- * Task to periodically announce itself in the network.
- */
-GNUNET_SCHEDULER_TaskIdentifier announce_id_task;
 
-
 
/******************************************************************************/
 /***********************         DECLARATIONS        
**************************/
 
/******************************************************************************/
@@ -644,51 +524,6 @@
 
 
 
/******************************************************************************/
-/************************    PERIODIC FUNCTIONS    
****************************/
-/******************************************************************************/
-
-/**
- * Periodically announce self id in the DHT
- *
- * @param cls closure
- * @param tc task context
- */
-static void
-announce_id (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
-{
-  struct PBlock block;
-  struct GNUNET_HashCode phash;
-
-  if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
-  {
-    announce_id_task = GNUNET_SCHEDULER_NO_TASK;
-    return;
-  }
-  /* TODO
-   * - Set data expiration in function of X
-   * - Adapt X to churn
-   */
-  DEBUG_DHT ("DHT_put for ID %s started.\n", GNUNET_i2s (&my_full_id));
-
-  block.id = my_full_id;
-  GNUNET_CRYPTO_hash (&my_full_id, sizeof (struct GNUNET_PeerIdentity), 
&phash);
-  GNUNET_DHT_put (dht_handle,   /* DHT handle */
-                  &phash,       /* Key to use */
-                  dht_replication_level,     /* Replication level */
-                  GNUNET_DHT_RO_RECORD_ROUTE | 
GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE,    /* DHT options */
-                  GNUNET_BLOCK_TYPE_MESH_PEER,       /* Block type */
-                  sizeof (block),  /* Size of the data */
-                  (const char *) &block, /* Data itself */
-                  GNUNET_TIME_UNIT_FOREVER_ABS,  /* Data expiration */
-                  GNUNET_TIME_UNIT_FOREVER_REL, /* Retry time */
-                  NULL,         /* Continuation */
-                  NULL);        /* Continuation closure */
-  announce_id_task =
-      GNUNET_SCHEDULER_add_delayed (id_announce_time, &announce_id, cls);
-}
-
-
-/******************************************************************************/
 /******************      GENERAL HELPER FUNCTIONS      
************************/
 
/******************************************************************************/
 
@@ -2330,342 +2165,9 @@
 }
 
 
-/**
- * Core handler for connection creation.
- *
- * @param cls Closure (unused).
- * @param peer Sender (neighbor).
- * @param message Message.
- *
- * @return GNUNET_OK to keep the connection open,
- *         GNUNET_SYSERR to close it (signal serious error)
- */
-static int
-handle_mesh_connection_create (void *cls,
-                               const struct GNUNET_PeerIdentity *peer,
-                               const struct GNUNET_MessageHeader *message)
-{
-  struct GNUNET_MESH_ConnectionCreate *msg;
-  struct GNUNET_PeerIdentity *id;
-  struct GNUNET_HashCode *cid;
-  struct MeshPeerPath *path;
-  struct MeshPeer *dest_peer;
-  struct MeshPeer *orig_peer;
-  struct MeshConnection *c;
-  unsigned int own_pos;
-  uint16_t size;
-  uint16_t i;
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\n\n");
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received a connection create msg\n");
 
-  /* Check size */
-  size = ntohs (message->size);
-  if (size < sizeof (struct GNUNET_MESH_ConnectionCreate))
-  {
-    GNUNET_break_op (0);
-    return GNUNET_OK;
-  }
-
-  /* Calculate hops */
-  size -= sizeof (struct GNUNET_MESH_ConnectionCreate);
-  if (size % sizeof (struct GNUNET_PeerIdentity))
-  {
-    GNUNET_break_op (0);
-    return GNUNET_OK;
-  }
-  size /= sizeof (struct GNUNET_PeerIdentity);
-  if (1 > size)
-  {
-    GNUNET_break_op (0);
-    return GNUNET_OK;
-  }
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "    path has %u hops.\n", size);
-
-  /* Get parameters */
-  msg = (struct GNUNET_MESH_ConnectionCreate *) message;
-  cid = &msg->cid;
-  id = (struct GNUNET_PeerIdentity *) &msg[1];
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "    connection %s (%s).\n",
-              GNUNET_h2s (cid), GNUNET_i2s (id));
-
-  /* Create connection */
-  c = connection_get (cid);
-  if (NULL == c)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  Creating connection\n");
-    c = connection_new (cid);
-    if (NULL == c)
-      return GNUNET_OK;
-    connection_reset_timeout (c, GNUNET_YES);
-
-    /* Create path */
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  Creating path...\n");
-    path = path_new (size);
-    own_pos = 0;
-    for (i = 0; i < size; i++)
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  ... adding %s\n",
-                  GNUNET_i2s (&id[i]));
-      path->peers[i] = GNUNET_PEER_intern (&id[i]);
-      if (path->peers[i] == myid)
-        own_pos = i;
-    }
-    if (own_pos == 0 && path->peers[own_pos] != myid)
-    {
-      /* create path: self not found in path through self */
-      GNUNET_break_op (0);
-      path_destroy (path);
-      connection_destroy (c);
-      return GNUNET_OK;
-    }
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  Own position: %u\n", own_pos);
-    path_add_to_peers (path, GNUNET_NO);
-    c->path = path_duplicate (path);
-    c->own_pos = own_pos;
-  }
-  else
-  {
-    path = NULL;
-  }
-  if (MESH_CONNECTION_NEW == c->state)
-    connection_change_state (c, MESH_CONNECTION_SENT);
-
-  /* Remember peers */
-  dest_peer = peer_get (&id[size - 1]);
-  orig_peer = peer_get (&id[0]);
-
-  /* Is it a connection to us? */
-  if (c->own_pos == size - 1)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  It's for us!\n");
-    peer_add_path_to_origin (orig_peer, path, GNUNET_YES);
-
-    if (NULL == orig_peer->tunnel)
-    {
-      orig_peer->tunnel = tunnel_new ();
-      orig_peer->tunnel->peer = orig_peer;
-    }
-    tunnel_add_connection (orig_peer->tunnel, c);
-    if (MESH_TUNNEL_NEW == c->t->state)
-      tunnel_change_state (c->t,  MESH_TUNNEL_WAITING);
-
-    send_connection_ack (c, GNUNET_NO);
-    if (MESH_CONNECTION_SENT == c->state)
-      connection_change_state (c, MESH_CONNECTION_ACK);
-
-    /* Keep tunnel alive in direction dest->owner*/
-    connection_reset_timeout (c, GNUNET_NO);
-  }
-  else
-  {
-    /* It's for somebody else! Retransmit. */
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  Retransmitting.\n");
-    peer_add_path (dest_peer, path_duplicate (path), GNUNET_NO);
-    peer_add_path_to_origin (orig_peer, path, GNUNET_NO);
-    send_prebuilt_message_connection (message, c, NULL, GNUNET_YES);
-  }
-  return GNUNET_OK;
-}
-
-
 /**
- * Core handler for path ACKs
- *
- * @param cls closure
- * @param message message
- * @param peer peer identity this notification is about
- *
- * @return GNUNET_OK to keep the connection open,
- *         GNUNET_SYSERR to close it (signal serious error)
- */
-static int
-handle_mesh_connection_ack (void *cls, const struct GNUNET_PeerIdentity *peer,
-                            const struct GNUNET_MessageHeader *message)
-{
-  struct GNUNET_MESH_ConnectionACK *msg;
-  struct MeshConnection *c;
-  struct MeshPeerPath *p;
-  struct MeshPeer *pi;
-  int fwd;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\n\n");
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received a connection ACK msg\n");
-  msg = (struct GNUNET_MESH_ConnectionACK *) message;
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  on connection %s\n",
-              GNUNET_h2s (&msg->cid));
-  c = connection_get (&msg->cid);
-  if (NULL == c)
-  {
-    GNUNET_STATISTICS_update (stats, "# control on unknown connection",
-                              1, GNUNET_NO);
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  don't know the connection!\n");
-    return GNUNET_OK;
-  }
-
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  via peer %s\n",
-              GNUNET_i2s (peer));
-  pi = peer_get (peer);
-  if (connection_get_next_hop (c) == pi)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  SYNACK\n");
-    fwd = GNUNET_NO;
-    if (MESH_CONNECTION_SENT == c->state)
-      connection_change_state (c, MESH_CONNECTION_ACK);
-  }
-  else if (connection_get_prev_hop (c) == pi)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  ACK\n");
-    fwd = GNUNET_YES;
-    connection_change_state (c, MESH_CONNECTION_READY);
-  }
-  else
-  {
-    GNUNET_break_op (0);
-    return GNUNET_OK;
-  }
-  connection_reset_timeout (c, fwd);
-
-  /* Add path to peers? */
-  p = c->path;
-  if (NULL != p)
-  {
-    path_add_to_peers (p, GNUNET_YES);
-  }
-  else
-  {
-    GNUNET_break (0);
-  }
-
-  /* Message for us as creator? */
-  if (connection_is_origin (c, GNUNET_YES))
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  Connection (SYN)ACK for us!\n");
-    connection_change_state (c, MESH_CONNECTION_READY);
-    if (MESH_TUNNEL_READY != c->t->state)
-      tunnel_change_state (c->t, MESH_TUNNEL_READY);
-    send_connection_ack (c, GNUNET_YES);
-    tunnel_send_queued_data (c->t, GNUNET_YES);
-    if (3 <= tunnel_count_connections (c->t) && NULL != c->t->peer->dhtget)
-    {
-      GNUNET_DHT_get_stop (c->t->peer->dhtget);
-      c->t->peer->dhtget = NULL;
-    }
-    return GNUNET_OK;
-  }
-
-  /* Message for us as destination? */
-  if (GMC_is_terminal (c, GNUNET_YES))
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  Connection ACK for us!\n");
-    if (MESH_TUNNEL_READY != c->t->state)
-      tunnel_change_state (c->t, MESH_TUNNEL_READY);
-    connection_change_state (c, MESH_CONNECTION_READY);
-    tunnel_send_queued_data (c->t, GNUNET_NO);
-    return GNUNET_OK;
-  }
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  not for us, retransmitting...\n");
-  send_prebuilt_message_connection (message, c, NULL, fwd);
-  return GNUNET_OK;
-}
-
-
-/**
- * Core handler for notifications of broken paths
- *
- * @param cls Closure (unused).
- * @param peer Peer identity of sending neighbor.
- * @param message Message.
- *
- * @return GNUNET_OK to keep the connection open,
- *         GNUNET_SYSERR to close it (signal serious error)
- */
-static int
-handle_mesh_connection_broken (void *cls, const struct GNUNET_PeerIdentity 
*peer,
-                               const struct GNUNET_MessageHeader *message)
-{
-  struct GNUNET_MESH_ConnectionBroken *msg;
-  struct MeshConnection *c;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Received a CONNECTION BROKEN msg from %s\n", GNUNET_i2s (peer));
-  msg = (struct GNUNET_MESH_ConnectionBroken *) message;
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  regarding %s\n",
-              GNUNET_i2s (&msg->peer1));
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  regarding %s\n",
-              GNUNET_i2s (&msg->peer2));
-  c = connection_get (&msg->cid);
-  if (NULL == c)
-  {
-    GNUNET_break_op (0);
-    return GNUNET_OK;
-  }
-  tunnel_notify_connection_broken (c->t, GNUNET_PEER_search (&msg->peer1),
-                                   GNUNET_PEER_search (&msg->peer2));
-  return GNUNET_OK;
-
-}
-
-
-/**
- * Core handler for tunnel destruction
- *
- * @param cls Closure (unused).
- * @param peer Peer identity of sending neighbor.
- * @param message Message.
- *
- * @return GNUNET_OK to keep the connection open,
- *         GNUNET_SYSERR to close it (signal serious error)
- */
-static int
-handle_mesh_connection_destroy (void *cls,
-                                const struct GNUNET_PeerIdentity *peer,
-                                const struct GNUNET_MessageHeader *message)
-{
-  struct GNUNET_MESH_ConnectionDestroy *msg;
-  struct MeshConnection *c;
-  GNUNET_PEER_Id id;
-  int fwd;
-
-  msg = (struct GNUNET_MESH_ConnectionDestroy *) message;
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Got a CONNECTION DESTROY message from %s\n",
-              GNUNET_i2s (peer));
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "  for connection %s\n",
-              GNUNET_h2s (&msg->cid));
-  c = connection_get (&msg->cid);
-  if (NULL == c)
-  {
-    /* Probably already got the message from another path,
-     * destroyed the tunnel and retransmitted to children.
-     * Safe to ignore.
-     */
-    GNUNET_STATISTICS_update (stats, "# control on unknown tunnel",
-                              1, GNUNET_NO);
-    return GNUNET_OK;
-  }
-  id = GNUNET_PEER_search (peer);
-  if (id == connection_get_prev_hop (c)->id)
-    fwd = GNUNET_YES;
-  else if (id == connection_get_next_hop (c)->id)
-    fwd = GNUNET_NO;
-  else
-  {
-    GNUNET_break_op (0);
-    return GNUNET_OK;
-  }
-  send_prebuilt_message_connection (message, c, NULL, fwd);
-  c->destroy = GNUNET_YES;
-
-  return GNUNET_OK;
-}
-
-
-/**
  * Handler for channel create messages.
  *
  * @param t Tunnel this channel is to be created in.
@@ -2856,399 +2358,6 @@
 
 
 /**
- * Generic handler for mesh network encrypted traffic.
- *
- * @param peer Peer identity this notification is about.
- * @param message Encrypted message.
- * @param fwd Is this FWD traffic? GNUNET_YES : GNUNET_NO;
- *
- * @return GNUNET_OK to keep the connection open,
- *         GNUNET_SYSERR to close it (signal serious error)
- */
-static int
-handle_mesh_encrypted (const struct GNUNET_PeerIdentity *peer,
-                       const struct GNUNET_MESH_Encrypted *msg,
-                       int fwd)
-{
-  struct MeshConnection *c;
-  struct MeshTunnel2 *t;
-  struct MeshPeer *neighbor;
-  struct MeshFlowControl *fc;
-  uint32_t pid;
-  uint32_t ttl;
-  uint16_t type;
-  size_t size;
-
-  /* Check size */
-  size = ntohs (msg->header.size);
-  if (size <
-      sizeof (struct GNUNET_MESH_Encrypted) +
-      sizeof (struct GNUNET_MessageHeader))
-  {
-    GNUNET_break_op (0);
-    return GNUNET_OK;
-  }
-  type = ntohs (msg->header.type);
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\n\n");
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "got a %s message from %s\n",
-              GNUNET_MESH_DEBUG_M2S (type), GNUNET_i2s (peer));
-
-  /* Check connection */
-  c = connection_get (&msg->cid);
-  if (NULL == c)
-  {
-    GNUNET_STATISTICS_update (stats, "# unknown connection", 1, GNUNET_NO);
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "WARNING connection unknown\n");
-    return GNUNET_OK;
-  }
-  t = c->t;
-  fc = fwd ? &c->bck_fc : &c->fwd_fc;
-
-  /* Check if origin is as expected */
-  neighbor = connection_get_hop (c, !fwd);
-  if (peer_get (peer)->id != neighbor->id)
-  {
-    GNUNET_break_op (0);
-    return GNUNET_OK;
-  }
-
-  /* Check PID */
-  pid = ntohl (msg->pid);
-  if (GMC_is_pid_bigger (pid, fc->last_ack_sent))
-  {
-    GNUNET_STATISTICS_update (stats, "# unsolicited message", 1, GNUNET_NO);
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "WARNING Received PID %u, (prev %u), ACK %u\n",
-                pid, fc->last_pid_recv, fc->last_ack_sent);
-    return GNUNET_OK;
-  }
-  if (GNUNET_NO == GMC_is_pid_bigger (pid, fc->last_pid_recv))
-  {
-    GNUNET_STATISTICS_update (stats, "# duplicate PID", 1, GNUNET_NO);
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                " Pid %u not expected (%u+), dropping!\n",
-                pid, fc->last_pid_recv + 1);
-    return GNUNET_OK;
-  }
-  if (MESH_CONNECTION_SENT == c->state)
-    connection_change_state (c, MESH_CONNECTION_READY);
-  connection_reset_timeout (c, fwd);
-  fc->last_pid_recv = pid;
-
-  /* Is this message for us? */
-  if (GMC_is_terminal (c, fwd))
-  {
-    size_t dsize = size - sizeof (struct GNUNET_MESH_Encrypted);
-    char cbuf[dsize];
-    struct GNUNET_MessageHeader *msgh;
-    unsigned int off;
-
-    /* TODO signature verification */
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  message for us!\n");
-    GNUNET_STATISTICS_update (stats, "# messages received", 1, GNUNET_NO);
-
-    fc->last_pid_recv = pid;
-    tunnel_decrypt (t, cbuf, &msg[1], dsize, msg->iv, fwd);
-    off = 0;
-    while (off < dsize)
-    {
-      msgh = (struct GNUNET_MessageHeader *) &cbuf[off];
-      handle_decrypted (t, msgh, fwd);
-      off += ntohs (msgh->size);
-    }
-    send_ack (c, NULL, fwd);
-    return GNUNET_OK;
-  }
-
-  /* Message not for us: forward to next hop */
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  not for us, retransmitting...\n");
-  ttl = ntohl (msg->ttl);
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "   ttl: %u\n", ttl);
-  if (ttl == 0)
-  {
-    GNUNET_STATISTICS_update (stats, "# TTL drops", 1, GNUNET_NO);
-    GNUNET_log (GNUNET_ERROR_TYPE_WARNING, " TTL is 0, DROPPING!\n");
-    send_ack (c, NULL, fwd);
-    return GNUNET_OK;
-  }
-  GNUNET_STATISTICS_update (stats, "# messages forwarded", 1, GNUNET_NO);
-
-  send_prebuilt_message_connection (&msg->header, c, NULL, fwd);
-
-  return GNUNET_OK;
-}
-
-
-/**
- * Core handler for mesh network traffic going orig->dest.
- *
- * @param cls Closure (unused).
- * @param message Message received.
- * @param peer Peer who sent the message.
- *
- * @return GNUNET_OK to keep the connection open,
- *         GNUNET_SYSERR to close it (signal serious error)
- */
-static int
-handle_mesh_fwd (void *cls, const struct GNUNET_PeerIdentity *peer,
-                     const struct GNUNET_MessageHeader *message)
-{
-  return handle_mesh_encrypted (peer,
-                                (struct GNUNET_MESH_Encrypted *)message,
-                                GNUNET_YES);
-}
-
-/**
- * Core handler for mesh network traffic going dest->orig.
- *
- * @param cls Closure (unused).
- * @param message Message received.
- * @param peer Peer who sent the message.
- *
- * @return GNUNET_OK to keep the connection open,
- *         GNUNET_SYSERR to close it (signal serious error)
- */
-static int
-handle_mesh_bck (void *cls, const struct GNUNET_PeerIdentity *peer,
-                     const struct GNUNET_MessageHeader *message)
-{
-  return handle_mesh_encrypted (peer,
-                                (struct GNUNET_MESH_Encrypted *)message,
-                                GNUNET_NO);
-}
-
-
-/**
- * Core handler for mesh network traffic point-to-point acks.
- *
- * @param cls closure
- * @param message message
- * @param peer peer identity this notification is about
- *
- * @return GNUNET_OK to keep the connection open,
- *         GNUNET_SYSERR to close it (signal serious error)
- */
-static int
-handle_mesh_ack (void *cls, const struct GNUNET_PeerIdentity *peer,
-                 const struct GNUNET_MessageHeader *message)
-{
-  struct GNUNET_MESH_ACK *msg;
-  struct MeshConnection *c;
-  struct MeshFlowControl *fc;
-  GNUNET_PEER_Id id;
-  uint32_t ack;
-  int fwd;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\n\n");
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Got an ACK packet from %s!\n",
-              GNUNET_i2s (peer));
-  msg = (struct GNUNET_MESH_ACK *) message;
-
-  c = connection_get (&msg->cid);
-
-  if (NULL == c)
-  {
-    GNUNET_STATISTICS_update (stats, "# ack on unknown connection", 1,
-                              GNUNET_NO);
-    return GNUNET_OK;
-  }
-
-  /* Is this a forward or backward ACK? */
-  id = GNUNET_PEER_search (peer);
-  if (connection_get_next_hop (c)->id == id)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  FWD ACK\n");
-    fc = &c->fwd_fc;
-    fwd = GNUNET_YES;
-  }
-  else if (connection_get_prev_hop (c)->id == id)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  BCK ACK\n");
-    fc = &c->bck_fc;
-    fwd = GNUNET_NO;
-  }
-  else
-  {
-    GNUNET_break_op (0);
-    return GNUNET_OK;
-  }
-
-  ack = ntohl (msg->ack);
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  ACK %u (was %u)\n",
-              ack, fc->last_ack_recv);
-  if (GMC_is_pid_bigger (ack, fc->last_ack_recv))
-    fc->last_ack_recv = ack;
-
-  /* Cancel polling if the ACK is big enough. */
-  if (GNUNET_SCHEDULER_NO_TASK != fc->poll_task &&
-      GMC_is_pid_bigger (fc->last_ack_recv, fc->last_pid_sent))
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  Cancel poll\n");
-    GNUNET_SCHEDULER_cancel (fc->poll_task);
-    fc->poll_task = GNUNET_SCHEDULER_NO_TASK;
-    fc->poll_time = GNUNET_TIME_UNIT_SECONDS;
-  }
-
-  connection_unlock_queue (c, fwd);
-
-  return GNUNET_OK;
-}
-
-
-/**
- * Core handler for mesh network traffic point-to-point ack polls.
- *
- * @param cls closure
- * @param message message
- * @param peer peer identity this notification is about
- *
- * @return GNUNET_OK to keep the connection open,
- *         GNUNET_SYSERR to close it (signal serious error)
- */
-static int
-handle_mesh_poll (void *cls, const struct GNUNET_PeerIdentity *peer,
-                  const struct GNUNET_MessageHeader *message)
-{
-  struct GNUNET_MESH_Poll *msg;
-  struct MeshConnection *c;
-  struct MeshFlowControl *fc;
-  GNUNET_PEER_Id id;
-  uint32_t pid;
-  int fwd;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\n\n");
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Got a POLL packet from %s!\n",
-              GNUNET_i2s (peer));
-
-  msg = (struct GNUNET_MESH_Poll *) message;
-
-  c = connection_get (&msg->cid);
-
-  if (NULL == c)
-  {
-    GNUNET_STATISTICS_update (stats, "# poll on unknown connection", 1,
-                              GNUNET_NO);
-    GNUNET_break_op (0);
-    return GNUNET_OK;
-  }
-
-  /* Is this a forward or backward ACK?
-   * Note: a poll should never be needed in a loopback case,
-   * since there is no possiblility of packet loss there, so
-   * this way of discerining FWD/BCK should not be a problem.
-   */
-  id = GNUNET_PEER_search (peer);
-  if (connection_get_next_hop (c)->id == id)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  FWD ACK\n");
-    fc = &c->fwd_fc;
-  }
-  else if (connection_get_prev_hop (c)->id == id)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  BCK ACK\n");
-    fc = &c->bck_fc;
-  }
-  else
-  {
-    GNUNET_break_op (0);
-    return GNUNET_OK;
-  }
-
-  pid = ntohl (msg->pid);
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  PID %u, OLD %u\n",
-              pid, fc->last_pid_recv);
-  fc->last_pid_recv = pid;
-  fwd = fc == &c->fwd_fc;
-  send_ack (c, NULL, fwd);
-
-  return GNUNET_OK;
-}
-
-
-/**
- * Core handler for mesh keepalives.
- *
- * @param cls closure
- * @param message message
- * @param peer peer identity this notification is about
- * @return GNUNET_OK to keep the connection open,
- *         GNUNET_SYSERR to close it (signal serious error)
- *
- * TODO: Check who we got this from, to validate route.
- */
-static int
-handle_mesh_keepalive (void *cls, const struct GNUNET_PeerIdentity *peer,
-                       const struct GNUNET_MessageHeader *message)
-{
-  struct GNUNET_MESH_ConnectionKeepAlive *msg;
-  struct MeshConnection *c;
-  struct MeshPeer *neighbor;
-  int fwd;
-
-  msg = (struct GNUNET_MESH_ConnectionKeepAlive *) message;
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "got a keepalive packet from %s\n",
-              GNUNET_i2s (peer));
-
-  c = connection_get (&msg->cid);
-  if (NULL == c)
-  {
-    GNUNET_STATISTICS_update (stats, "# keepalive on unknown connection", 1,
-                              GNUNET_NO);
-    return GNUNET_OK;
-  }
-
-  fwd = GNUNET_MESSAGE_TYPE_MESH_FWD_KEEPALIVE == ntohs (message->type) ? 
-        GNUNET_YES : GNUNET_NO;
-
-  /* Check if origin is as expected */
-  neighbor = connection_get_hop (c, fwd);
-  if (peer_get (peer)->id != neighbor->id)
-  {
-    GNUNET_break_op (0);
-    return GNUNET_OK;
-  }
-
-  connection_change_state (c, MESH_CONNECTION_READY);
-  connection_reset_timeout (c, fwd);
-
-  if (GMC_is_terminal (c, fwd))
-    return GNUNET_OK;
-
-  GNUNET_STATISTICS_update (stats, "# keepalives forwarded", 1, GNUNET_NO);
-  send_prebuilt_message_connection (message, c, NULL, fwd);
-
-  return GNUNET_OK;
-}
-
-
-
-/**
- * Functions to handle messages from core
- */
-static struct GNUNET_CORE_MessageHandler core_handlers[] = {
-  {&handle_mesh_connection_create, GNUNET_MESSAGE_TYPE_MESH_CONNECTION_CREATE,
-    0},
-  {&handle_mesh_connection_ack, GNUNET_MESSAGE_TYPE_MESH_CONNECTION_ACK,
-    sizeof (struct GNUNET_MESH_ConnectionACK)},
-  {&handle_mesh_connection_broken, GNUNET_MESSAGE_TYPE_MESH_CONNECTION_BROKEN,
-    sizeof (struct GNUNET_MESH_ConnectionBroken)},
-  {&handle_mesh_connection_destroy, 
GNUNET_MESSAGE_TYPE_MESH_CONNECTION_DESTROY,
-    sizeof (struct GNUNET_MESH_ConnectionDestroy)},
-  {&handle_mesh_keepalive, GNUNET_MESSAGE_TYPE_MESH_FWD_KEEPALIVE,
-    sizeof (struct GNUNET_MESH_ConnectionKeepAlive)},
-  {&handle_mesh_keepalive, GNUNET_MESSAGE_TYPE_MESH_BCK_KEEPALIVE,
-    sizeof (struct GNUNET_MESH_ConnectionKeepAlive)},
-  {&handle_mesh_ack, GNUNET_MESSAGE_TYPE_MESH_ACK,
-    sizeof (struct GNUNET_MESH_ACK)},
-  {&handle_mesh_poll, GNUNET_MESSAGE_TYPE_MESH_POLL,
-    sizeof (struct GNUNET_MESH_Poll)},
-  {&handle_mesh_fwd, GNUNET_MESSAGE_TYPE_MESH_FWD, 0},
-  {&handle_mesh_bck, GNUNET_MESSAGE_TYPE_MESH_BCK, 0},
-  {NULL, 0, 0}
-};
-
-
-/**
  * Function to process paths received for a new peer addition. The recorded
  * paths form the initial tunnel, which can be optimized later.
  * Called on each result obtained for the DHT search.
@@ -3428,27 +2537,7 @@
 /************************      MAIN FUNCTIONS      
****************************/
 
/******************************************************************************/
 
-/**
- * Iterator over tunnel hash map entries to destroy the tunnel during shutdown.
- *
- * @param cls closure
- * @param key current key code
- * @param value value in the hash map
- * @return #GNUNET_YES if we should continue to iterate,
- *         #GNUNET_NO if not.
- */
-static int
-shutdown_tunnel (void *cls, 
-                const struct GNUNET_PeerIdentity *key, 
-                void *value)
-{
-  struct MeshPeer *p = value;
-  struct MeshTunnel2 *t = p->tunnel;
 
-  if (NULL != t)
-    tunnel_destroy (t);
-  return GNUNET_YES;
-}
 
 
 /**
@@ -3462,23 +2551,11 @@
 {
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "shutting down\n");
 
-  if (core_handle != NULL)
-  {
-    GNUNET_CORE_disconnect (core_handle);
-    core_handle = NULL;
-  }
-  GNUNET_CONTAINER_multipeermap_iterate (peers, &shutdown_tunnel, NULL);
-  if (dht_handle != NULL)
-  {
-    GNUNET_DHT_disconnect (dht_handle);
-    dht_handle = NULL;
-  }
   GML_shutdown ();
-  if (GNUNET_SCHEDULER_NO_TASK != announce_id_task)
-  {
-    GNUNET_SCHEDULER_cancel (announce_id_task);
-    announce_id_task = GNUNET_SCHEDULER_NO_TASK;
-  }
+  GMD_shutdown ();
+  GMP_shutdown ();
+  GMC_shutdown ();
+
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "shut down\n");
 }
 
@@ -3499,16 +2576,6 @@
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "starting to run\n");
 
   if (GNUNET_OK !=
-      GNUNET_CONFIGURATION_get_value_time (c, "MESH", "ID_ANNOUNCE_TIME",
-                                           &id_announce_time))
-  {
-    GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
-                               "MESH", "ID_ANNOUNCE_TIME", "MISSING");
-    GNUNET_SCHEDULER_shutdown ();
-    return;
-  }
-
-  if (GNUNET_OK !=
       GNUNET_CONFIGURATION_get_value_time (c, "MESH", "CONNECT_TIMEOUT",
                                            &connect_timeout))
   {
@@ -3528,15 +2595,6 @@
   }
 
   if (GNUNET_OK !=
-      GNUNET_CONFIGURATION_get_value_number (c, "MESH", "MAX_PEERS",
-                                             &max_peers))
-  {
-    GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_WARNING,
-                               "MESH", "MAX_PEERS", "USING DEFAULT");
-    max_peers = 1000;
-  }
-
-  if (GNUNET_OK !=
       GNUNET_CONFIGURATION_get_value_number (c, "MESH", "DROP_PERCENT",
                                              &drop_percent))
   {
@@ -3552,22 +2610,7 @@
                 "***************************************\n");
   }
 
-  if (GNUNET_OK !=
-      GNUNET_CONFIGURATION_get_value_number (c, "MESH", 
"DHT_REPLICATION_LEVEL",
-                                             &dht_replication_level))
-  {
-    GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_WARNING,
-                               "MESH", "DHT_REPLICATION_LEVEL", "USING 
DEFAULT");
-    dht_replication_level = 3;
-  }
 
-  peers = GNUNET_CONTAINER_multipeermap_create (32, GNUNET_NO);
-
-  dht_handle = GNUNET_DHT_connect (c, 64);
-  if (NULL == dht_handle)
-  {
-    GNUNET_break (0);
-  }
   stats = GNUNET_STATISTICS_create ("mesh", c);
 
   /* Scheduled the task to clean up when shutdown is called */
@@ -3578,31 +2621,17 @@
   GNUNET_assert (NULL != pk);
   my_private_key = pk;
   GNUNET_CRYPTO_ecc_key_get_public_for_signature (my_private_key, 
-                                                 &my_full_id.public_key);
+                                                  &my_full_id.public_key);
   myid = GNUNET_PEER_intern (&my_full_id);
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               "Mesh for peer [%s] starting\n",
               GNUNET_i2s(&my_full_id));
 
-  GML_init (server);
-  GMC_init (c);
+  GML_init (server);    /* Local clients */
+  GMC_init (c);         /* Connections */
+  GMP_init (c);         /* Peers */
+  GMD_init (c);         /* DHT */
 
-  core_handle = GNUNET_CORE_connect (c, /* Main configuration */
-                                     NULL,      /* Closure passed to MESH 
functions */
-                                     &core_init,        /* Call core_init once 
connected */
-                                     &core_connect,     /* Handle connects */
-                                     &core_disconnect,  /* remove peers on 
disconnects */
-                                     NULL,      /* Don't notify about all 
incoming messages */
-                                     GNUNET_NO, /* For header only in 
notification */
-                                     NULL,      /* Don't notify about all 
outbound messages */
-                                     GNUNET_NO, /* For header-only out 
notification */
-                                     core_handlers);    /* Register these 
handlers */
-  if (NULL == core_handle)
-  {
-    GNUNET_break (0);
-    GNUNET_SCHEDULER_shutdown ();
-    return;
-  }
   announce_id_task = GNUNET_SCHEDULER_add_now (&announce_id, cls);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Mesh service running\n");
 }

Modified: gnunet/src/mesh/gnunet-service-mesh_connection.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_connection.c    2013-10-02 16:03:42 UTC 
(rev 29789)
+++ gnunet/src/mesh/gnunet-service-mesh_connection.c    2013-10-02 16:39:56 UTC 
(rev 29790)
@@ -25,12 +25,31 @@
  */
 
 #include "platform.h"
+#include "gnunet_util_lib.h"
+
 #include "gnunet_core_service.h"
+
 #include "gnunet-service-mesh_connection.h"
+#include "gnunet-service-mesh_peer.h"
+#include "mesh_protocol_enc.h"
+#include "mesh_path.h"
 
 
+#define MESH_DEBUG_CONNECTION   GNUNET_NO
+#define MESH_MAX_POLL_TIME      GNUNET_TIME_relative_multiply (\
+                                  GNUNET_TIME_UNIT_MINUTES,\
+                                  10)
+#define MESH_RETRANSMIT_TIME    GNUNET_TIME_UNIT_SECONDS
+#define MESH_RETRANSMIT_MARGIN  4
 
 
+#if MESH_DEBUG_CONNECTION
+#define DEBUG_CONN(...) GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
+#else
+#define DEBUG_CONN(...)
+#endif
+
+
 /**
  * All the states a connection can be in.
  */
@@ -239,10 +258,6 @@
 };
 
 
-
-
-
-
 /**
  * Connections known, indexed by cid (MeshConnection).
  */
@@ -265,9 +280,12 @@
  */
 static struct GNUNET_TIME_Relative refresh_connection_time;
 
+/**
+ * Handle to communicate with core.
+ */
+static struct GNUNET_CORE_Handle *core_handle;
 
 
-
 /**
  * Initialize a Flow Control structure to the initial state.
  * 
@@ -1464,7 +1482,733 @@
 }
 
 
+
 /**
+ * Core handler for connection creation.
+ *
+ * @param cls Closure (unused).
+ * @param peer Sender (neighbor).
+ * @param message Message.
+ *
+ * @return GNUNET_OK to keep the connection open,
+ *         GNUNET_SYSERR to close it (signal serious error)
+ */
+static int
+handle_create (void *cls, const struct GNUNET_PeerIdentity *peer,
+               const struct GNUNET_MessageHeader *message)
+{
+  struct GNUNET_MESH_ConnectionCreate *msg;
+  struct GNUNET_PeerIdentity *id;
+  struct GNUNET_HashCode *cid;
+  struct MeshPeerPath *path;
+  struct MeshPeer *dest_peer;
+  struct MeshPeer *orig_peer;
+  struct MeshConnection *c;
+  unsigned int own_pos;
+  uint16_t size;
+  uint16_t i;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\n\n");
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received a connection create msg\n");
+
+  /* Check size */
+  size = ntohs (message->size);
+  if (size < sizeof (struct GNUNET_MESH_ConnectionCreate))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+
+  /* Calculate hops */
+  size -= sizeof (struct GNUNET_MESH_ConnectionCreate);
+  if (size % sizeof (struct GNUNET_PeerIdentity))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+  size /= sizeof (struct GNUNET_PeerIdentity);
+  if (1 > size)
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "    path has %u hops.\n", size);
+
+  /* Get parameters */
+  msg = (struct GNUNET_MESH_ConnectionCreate *) message;
+  cid = &msg->cid;
+  id = (struct GNUNET_PeerIdentity *) &msg[1];
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "    connection %s (%s).\n",
+              GNUNET_h2s (cid), GNUNET_i2s (id));
+
+  /* Create connection */
+  c = connection_get (cid);
+  if (NULL == c)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  Creating connection\n");
+    c = connection_new (cid);
+    if (NULL == c)
+      return GNUNET_OK;
+    connection_reset_timeout (c, GNUNET_YES);
+
+    /* Create path */
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  Creating path...\n");
+    path = path_new (size);
+    own_pos = 0;
+    for (i = 0; i < size; i++)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  ... adding %s\n",
+                  GNUNET_i2s (&id[i]));
+      path->peers[i] = GNUNET_PEER_intern (&id[i]);
+      if (path->peers[i] == myid)
+        own_pos = i;
+    }
+    if (own_pos == 0 && path->peers[own_pos] != myid)
+    {
+      /* create path: self not found in path through self */
+      GNUNET_break_op (0);
+      path_destroy (path);
+      connection_destroy (c);
+      return GNUNET_OK;
+    }
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  Own position: %u\n", own_pos);
+    path_add_to_peers (path, GNUNET_NO);
+    c->path = path_duplicate (path);
+    c->own_pos = own_pos;
+  }
+  else
+  {
+    path = NULL;
+  }
+  if (MESH_CONNECTION_NEW == c->state)
+    connection_change_state (c, MESH_CONNECTION_SENT);
+
+  /* Remember peers */
+  dest_peer = peer_get (&id[size - 1]);
+  orig_peer = peer_get (&id[0]);
+
+  /* Is it a connection to us? */
+  if (c->own_pos == size - 1)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  It's for us!\n");
+    peer_add_path_to_origin (orig_peer, path, GNUNET_YES);
+
+    if (NULL == orig_peer->tunnel)
+    {
+      orig_peer->tunnel = tunnel_new ();
+      orig_peer->tunnel->peer = orig_peer;
+    }
+    tunnel_add_connection (orig_peer->tunnel, c);
+    if (MESH_TUNNEL_NEW == c->t->state)
+      tunnel_change_state (c->t,  MESH_TUNNEL_WAITING);
+
+    send_connection_ack (c, GNUNET_NO);
+    if (MESH_CONNECTION_SENT == c->state)
+      connection_change_state (c, MESH_CONNECTION_ACK);
+
+    /* Keep tunnel alive in direction dest->owner*/
+    connection_reset_timeout (c, GNUNET_NO);
+  }
+  else
+  {
+    /* It's for somebody else! Retransmit. */
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  Retransmitting.\n");
+    peer_add_path (dest_peer, path_duplicate (path), GNUNET_NO);
+    peer_add_path_to_origin (orig_peer, path, GNUNET_NO);
+    send_prebuilt_message_connection (message, c, NULL, GNUNET_YES);
+  }
+  return GNUNET_OK;
+}
+
+
+/**
+ * Core handler for path confirmations.
+ *
+ * @param cls closure
+ * @param message message
+ * @param peer peer identity this notification is about
+ *
+ * @return GNUNET_OK to keep the connection open,
+ *         GNUNET_SYSERR to close it (signal serious error)
+ */
+static int
+handle_confirm (void *cls, const struct GNUNET_PeerIdentity *peer,
+                const struct GNUNET_MessageHeader *message)
+{
+  struct GNUNET_MESH_ConnectionACK *msg;
+  struct MeshConnection *c;
+  struct MeshPeerPath *p;
+  struct MeshPeer *pi;
+  int fwd;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\n\n");
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received a connection ACK msg\n");
+  msg = (struct GNUNET_MESH_ConnectionACK *) message;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  on connection %s\n",
+              GNUNET_h2s (&msg->cid));
+  c = connection_get (&msg->cid);
+  if (NULL == c)
+  {
+    GNUNET_STATISTICS_update (stats, "# control on unknown connection",
+                              1, GNUNET_NO);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  don't know the connection!\n");
+    return GNUNET_OK;
+  }
+
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  via peer %s\n",
+              GNUNET_i2s (peer));
+  pi = peer_get (peer);
+  if (connection_get_next_hop (c) == pi)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  SYNACK\n");
+    fwd = GNUNET_NO;
+    if (MESH_CONNECTION_SENT == c->state)
+      connection_change_state (c, MESH_CONNECTION_ACK);
+  }
+  else if (connection_get_prev_hop (c) == pi)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  ACK\n");
+    fwd = GNUNET_YES;
+    connection_change_state (c, MESH_CONNECTION_READY);
+  }
+  else
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+  connection_reset_timeout (c, fwd);
+
+  /* Add path to peers? */
+  p = c->path;
+  if (NULL != p)
+  {
+    path_add_to_peers (p, GNUNET_YES);
+  }
+  else
+  {
+    GNUNET_break (0);
+  }
+
+  /* Message for us as creator? */
+  if (connection_is_origin (c, GNUNET_YES))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  Connection (SYN)ACK for us!\n");
+    connection_change_state (c, MESH_CONNECTION_READY);
+    if (MESH_TUNNEL_READY != c->t->state)
+      tunnel_change_state (c->t, MESH_TUNNEL_READY);
+    send_connection_ack (c, GNUNET_YES);
+    tunnel_send_queued_data (c->t, GNUNET_YES);
+    if (3 <= tunnel_count_connections (c->t) && NULL != c->t->peer->dhtget)
+    {
+      GNUNET_DHT_get_stop (c->t->peer->dhtget);
+      c->t->peer->dhtget = NULL;
+    }
+    return GNUNET_OK;
+  }
+
+  /* Message for us as destination? */
+  if (GMC_is_terminal (c, GNUNET_YES))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  Connection ACK for us!\n");
+    if (MESH_TUNNEL_READY != c->t->state)
+      tunnel_change_state (c->t, MESH_TUNNEL_READY);
+    connection_change_state (c, MESH_CONNECTION_READY);
+    tunnel_send_queued_data (c->t, GNUNET_NO);
+    return GNUNET_OK;
+  }
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  not for us, retransmitting...\n");
+  send_prebuilt_message_connection (message, c, NULL, fwd);
+  return GNUNET_OK;
+}
+
+
+/**
+ * Core handler for notifications of broken paths
+ *
+ * @param cls Closure (unused).
+ * @param peer Peer identity of sending neighbor.
+ * @param message Message.
+ *
+ * @return GNUNET_OK to keep the connection open,
+ *         GNUNET_SYSERR to close it (signal serious error)
+ */
+static int
+handle_broken (void *cls, const struct GNUNET_PeerIdentity *peer,
+               const struct GNUNET_MessageHeader *message)
+{
+  struct GNUNET_MESH_ConnectionBroken *msg;
+  struct MeshConnection *c;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Received a CONNECTION BROKEN msg from %s\n", GNUNET_i2s (peer));
+  msg = (struct GNUNET_MESH_ConnectionBroken *) message;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  regarding %s\n",
+              GNUNET_i2s (&msg->peer1));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  regarding %s\n",
+              GNUNET_i2s (&msg->peer2));
+  c = connection_get (&msg->cid);
+  if (NULL == c)
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+  tunnel_notify_connection_broken (c->t, GNUNET_PEER_search (&msg->peer1),
+                                   GNUNET_PEER_search (&msg->peer2));
+  return GNUNET_OK;
+
+}
+
+
+/**
+ * Core handler for tunnel destruction
+ *
+ * @param cls Closure (unused).
+ * @param peer Peer identity of sending neighbor.
+ * @param message Message.
+ *
+ * @return GNUNET_OK to keep the connection open,
+ *         GNUNET_SYSERR to close it (signal serious error)
+ */
+static int
+handle_destroy (void *cls, const struct GNUNET_PeerIdentity *peer,
+                const struct GNUNET_MessageHeader *message)
+{
+  struct GNUNET_MESH_ConnectionDestroy *msg;
+  struct MeshConnection *c;
+  GNUNET_PEER_Id id;
+  int fwd;
+
+  msg = (struct GNUNET_MESH_ConnectionDestroy *) message;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Got a CONNECTION DESTROY message from %s\n",
+              GNUNET_i2s (peer));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "  for connection %s\n",
+              GNUNET_h2s (&msg->cid));
+  c = connection_get (&msg->cid);
+  if (NULL == c)
+  {
+    /* Probably already got the message from another path,
+     * destroyed the tunnel and retransmitted to children.
+     * Safe to ignore.
+     */
+    GNUNET_STATISTICS_update (stats, "# control on unknown tunnel",
+                              1, GNUNET_NO);
+    return GNUNET_OK;
+  }
+  id = GNUNET_PEER_search (peer);
+  if (id == connection_get_prev_hop (c)->id)
+    fwd = GNUNET_YES;
+  else if (id == connection_get_next_hop (c)->id)
+    fwd = GNUNET_NO;
+  else
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+  send_prebuilt_message_connection (message, c, NULL, fwd);
+  c->destroy = GNUNET_YES;
+
+  return GNUNET_OK;
+}
+
+/**
+ * Generic handler for mesh network encrypted traffic.
+ *
+ * @param peer Peer identity this notification is about.
+ * @param message Encrypted message.
+ * @param fwd Is this FWD traffic? GNUNET_YES : GNUNET_NO;
+ *
+ * @return GNUNET_OK to keep the connection open,
+ *         GNUNET_SYSERR to close it (signal serious error)
+ */
+static int
+handle_mesh_encrypted (const struct GNUNET_PeerIdentity *peer,
+                       const struct GNUNET_MESH_Encrypted *msg,
+                       int fwd)
+{
+  struct MeshConnection *c;
+  struct MeshTunnel2 *t;
+  struct MeshPeer *neighbor;
+  struct MeshFlowControl *fc;
+  uint32_t pid;
+  uint32_t ttl;
+  uint16_t type;
+  size_t size;
+
+  /* Check size */
+  size = ntohs (msg->header.size);
+  if (size <
+      sizeof (struct GNUNET_MESH_Encrypted) +
+      sizeof (struct GNUNET_MessageHeader))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+  type = ntohs (msg->header.type);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\n\n");
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "got a %s message from %s\n",
+              GNUNET_MESH_DEBUG_M2S (type), GNUNET_i2s (peer));
+
+  /* Check connection */
+  c = connection_get (&msg->cid);
+  if (NULL == c)
+  {
+    GNUNET_STATISTICS_update (stats, "# unknown connection", 1, GNUNET_NO);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "WARNING connection unknown\n");
+    return GNUNET_OK;
+  }
+  t = c->t;
+  fc = fwd ? &c->bck_fc : &c->fwd_fc;
+
+  /* Check if origin is as expected */
+  neighbor = connection_get_hop (c, !fwd);
+  if (peer_get (peer)->id != neighbor->id)
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+
+  /* Check PID */
+  pid = ntohl (msg->pid);
+  if (GMC_is_pid_bigger (pid, fc->last_ack_sent))
+  {
+    GNUNET_STATISTICS_update (stats, "# unsolicited message", 1, GNUNET_NO);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "WARNING Received PID %u, (prev %u), ACK %u\n",
+                pid, fc->last_pid_recv, fc->last_ack_sent);
+    return GNUNET_OK;
+  }
+  if (GNUNET_NO == GMC_is_pid_bigger (pid, fc->last_pid_recv))
+  {
+    GNUNET_STATISTICS_update (stats, "# duplicate PID", 1, GNUNET_NO);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                " Pid %u not expected (%u+), dropping!\n",
+                pid, fc->last_pid_recv + 1);
+    return GNUNET_OK;
+  }
+  if (MESH_CONNECTION_SENT == c->state)
+    connection_change_state (c, MESH_CONNECTION_READY);
+  connection_reset_timeout (c, fwd);
+  fc->last_pid_recv = pid;
+
+  /* Is this message for us? */
+  if (GMC_is_terminal (c, fwd))
+  {
+    size_t dsize = size - sizeof (struct GNUNET_MESH_Encrypted);
+    char cbuf[dsize];
+    struct GNUNET_MessageHeader *msgh;
+    unsigned int off;
+
+    /* TODO signature verification */
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  message for us!\n");
+    GNUNET_STATISTICS_update (stats, "# messages received", 1, GNUNET_NO);
+
+    fc->last_pid_recv = pid;
+    tunnel_decrypt (t, cbuf, &msg[1], dsize, msg->iv, fwd);
+    off = 0;
+    while (off < dsize)
+    {
+      msgh = (struct GNUNET_MessageHeader *) &cbuf[off];
+      handle_decrypted (t, msgh, fwd);
+      off += ntohs (msgh->size);
+    }
+    send_ack (c, NULL, fwd);
+    return GNUNET_OK;
+  }
+
+  /* Message not for us: forward to next hop */
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  not for us, retransmitting...\n");
+  ttl = ntohl (msg->ttl);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "   ttl: %u\n", ttl);
+  if (ttl == 0)
+  {
+    GNUNET_STATISTICS_update (stats, "# TTL drops", 1, GNUNET_NO);
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING, " TTL is 0, DROPPING!\n");
+    send_ack (c, NULL, fwd);
+    return GNUNET_OK;
+  }
+  GNUNET_STATISTICS_update (stats, "# messages forwarded", 1, GNUNET_NO);
+
+  send_prebuilt_message_connection (&msg->header, c, NULL, fwd);
+
+  return GNUNET_OK;
+}
+
+
+/**
+ * Core handler for mesh network traffic going orig->dest.
+ *
+ * @param cls Closure (unused).
+ * @param message Message received.
+ * @param peer Peer who sent the message.
+ *
+ * @return GNUNET_OK to keep the connection open,
+ *         GNUNET_SYSERR to close it (signal serious error)
+ */
+static int
+handle_fwd (void *cls, const struct GNUNET_PeerIdentity *peer,
+            const struct GNUNET_MessageHeader *message)
+{
+  return handle_mesh_encrypted (peer,
+                                (struct GNUNET_MESH_Encrypted *)message,
+                                GNUNET_YES);
+}
+
+/**
+ * Core handler for mesh network traffic going dest->orig.
+ *
+ * @param cls Closure (unused).
+ * @param message Message received.
+ * @param peer Peer who sent the message.
+ *
+ * @return GNUNET_OK to keep the connection open,
+ *         GNUNET_SYSERR to close it (signal serious error)
+ */
+static int
+handle_bck (void *cls, const struct GNUNET_PeerIdentity *peer,
+            const struct GNUNET_MessageHeader *message)
+{
+  return handle_mesh_encrypted (peer,
+                                (struct GNUNET_MESH_Encrypted *)message,
+                                GNUNET_NO);
+}
+
+
+/**
+ * Core handler for mesh network traffic point-to-point acks.
+ *
+ * @param cls closure
+ * @param message message
+ * @param peer peer identity this notification is about
+ *
+ * @return GNUNET_OK to keep the connection open,
+ *         GNUNET_SYSERR to close it (signal serious error)
+ */
+static int
+handle_ack (void *cls, const struct GNUNET_PeerIdentity *peer,
+            const struct GNUNET_MessageHeader *message)
+{
+  struct GNUNET_MESH_ACK *msg;
+  struct MeshConnection *c;
+  struct MeshFlowControl *fc;
+  GNUNET_PEER_Id id;
+  uint32_t ack;
+  int fwd;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\n\n");
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Got an ACK packet from %s!\n",
+              GNUNET_i2s (peer));
+  msg = (struct GNUNET_MESH_ACK *) message;
+
+  c = connection_get (&msg->cid);
+
+  if (NULL == c)
+  {
+    GNUNET_STATISTICS_update (stats, "# ack on unknown connection", 1,
+                              GNUNET_NO);
+    return GNUNET_OK;
+  }
+
+  /* Is this a forward or backward ACK? */
+  id = GNUNET_PEER_search (peer);
+  if (connection_get_next_hop (c)->id == id)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  FWD ACK\n");
+    fc = &c->fwd_fc;
+    fwd = GNUNET_YES;
+  }
+  else if (connection_get_prev_hop (c)->id == id)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  BCK ACK\n");
+    fc = &c->bck_fc;
+    fwd = GNUNET_NO;
+  }
+  else
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+
+  ack = ntohl (msg->ack);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  ACK %u (was %u)\n",
+              ack, fc->last_ack_recv);
+  if (GMC_is_pid_bigger (ack, fc->last_ack_recv))
+    fc->last_ack_recv = ack;
+
+  /* Cancel polling if the ACK is big enough. */
+  if (GNUNET_SCHEDULER_NO_TASK != fc->poll_task &&
+      GMC_is_pid_bigger (fc->last_ack_recv, fc->last_pid_sent))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  Cancel poll\n");
+    GNUNET_SCHEDULER_cancel (fc->poll_task);
+    fc->poll_task = GNUNET_SCHEDULER_NO_TASK;
+    fc->poll_time = GNUNET_TIME_UNIT_SECONDS;
+  }
+
+  connection_unlock_queue (c, fwd);
+
+  return GNUNET_OK;
+}
+
+
+/**
+ * Core handler for mesh network traffic point-to-point ack polls.
+ *
+ * @param cls closure
+ * @param message message
+ * @param peer peer identity this notification is about
+ *
+ * @return GNUNET_OK to keep the connection open,
+ *         GNUNET_SYSERR to close it (signal serious error)
+ */
+static int
+handle_poll (void *cls, const struct GNUNET_PeerIdentity *peer,
+             const struct GNUNET_MessageHeader *message)
+{
+  struct GNUNET_MESH_Poll *msg;
+  struct MeshConnection *c;
+  struct MeshFlowControl *fc;
+  GNUNET_PEER_Id id;
+  uint32_t pid;
+  int fwd;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\n\n");
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Got a POLL packet from %s!\n",
+              GNUNET_i2s (peer));
+
+  msg = (struct GNUNET_MESH_Poll *) message;
+
+  c = connection_get (&msg->cid);
+
+  if (NULL == c)
+  {
+    GNUNET_STATISTICS_update (stats, "# poll on unknown connection", 1,
+                              GNUNET_NO);
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+
+  /* Is this a forward or backward ACK?
+   * Note: a poll should never be needed in a loopback case,
+   * since there is no possiblility of packet loss there, so
+   * this way of discerining FWD/BCK should not be a problem.
+   */
+  id = GNUNET_PEER_search (peer);
+  if (connection_get_next_hop (c)->id == id)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  FWD ACK\n");
+    fc = &c->fwd_fc;
+  }
+  else if (connection_get_prev_hop (c)->id == id)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  BCK ACK\n");
+    fc = &c->bck_fc;
+  }
+  else
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+
+  pid = ntohl (msg->pid);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  PID %u, OLD %u\n",
+              pid, fc->last_pid_recv);
+  fc->last_pid_recv = pid;
+  fwd = fc == &c->fwd_fc;
+  send_ack (c, NULL, fwd);
+
+  return GNUNET_OK;
+}
+
+
+/**
+ * Core handler for mesh keepalives.
+ *
+ * @param cls closure
+ * @param message message
+ * @param peer peer identity this notification is about
+ * @return GNUNET_OK to keep the connection open,
+ *         GNUNET_SYSERR to close it (signal serious error)
+ *
+ * TODO: Check who we got this from, to validate route.
+ */
+static int
+handle_keepalive (void *cls, const struct GNUNET_PeerIdentity *peer,
+                const struct GNUNET_MessageHeader *message)
+{
+  struct GNUNET_MESH_ConnectionKeepAlive *msg;
+  struct MeshConnection *c;
+  struct MeshPeer *neighbor;
+  int fwd;
+
+  msg = (struct GNUNET_MESH_ConnectionKeepAlive *) message;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "got a keepalive packet from %s\n",
+              GNUNET_i2s (peer));
+
+  c = connection_get (&msg->cid);
+  if (NULL == c)
+  {
+    GNUNET_STATISTICS_update (stats, "# keepalive on unknown connection", 1,
+                              GNUNET_NO);
+    return GNUNET_OK;
+  }
+
+  fwd = GNUNET_MESSAGE_TYPE_MESH_FWD_KEEPALIVE == ntohs (message->type) ? 
+        GNUNET_YES : GNUNET_NO;
+
+  /* Check if origin is as expected */
+  neighbor = connection_get_hop (c, fwd);
+  if (peer_get (peer)->id != neighbor->id)
+  {
+    GNUNET_break_op (0);
+    return GNUNET_OK;
+  }
+
+  connection_change_state (c, MESH_CONNECTION_READY);
+  connection_reset_timeout (c, fwd);
+
+  if (GMC_is_terminal (c, fwd))
+    return GNUNET_OK;
+
+  GNUNET_STATISTICS_update (stats, "# keepalives forwarded", 1, GNUNET_NO);
+  send_prebuilt_message_connection (message, c, NULL, fwd);
+
+  return GNUNET_OK;
+}
+
+
+/**
+ * Functions to handle messages from core
+ */
+static struct GNUNET_CORE_MessageHandler core_handlers[] = {
+  {&handle_create, GNUNET_MESSAGE_TYPE_MESH_CONNECTION_CREATE,
+    0},
+  {&handle_confirm, GNUNET_MESSAGE_TYPE_MESH_CONNECTION_ACK,
+    sizeof (struct GNUNET_MESH_ConnectionACK)},
+  {&handle_broken, GNUNET_MESSAGE_TYPE_MESH_CONNECTION_BROKEN,
+    sizeof (struct GNUNET_MESH_ConnectionBroken)},
+  {&handle_destroy, GNUNET_MESSAGE_TYPE_MESH_CONNECTION_DESTROY,
+    sizeof (struct GNUNET_MESH_ConnectionDestroy)},
+  {&handle_keepalive, GNUNET_MESSAGE_TYPE_MESH_FWD_KEEPALIVE,
+    sizeof (struct GNUNET_MESH_ConnectionKeepAlive)},
+  {&handle_keepalive, GNUNET_MESSAGE_TYPE_MESH_BCK_KEEPALIVE,
+    sizeof (struct GNUNET_MESH_ConnectionKeepAlive)},
+  {&handle_ack, GNUNET_MESSAGE_TYPE_MESH_ACK,
+    sizeof (struct GNUNET_MESH_ACK)},
+  {&handle_poll, GNUNET_MESSAGE_TYPE_MESH_POLL,
+    sizeof (struct GNUNET_MESH_Poll)},
+  {&handle_fwd, GNUNET_MESSAGE_TYPE_MESH_FWD, 0},
+  {&handle_bck, GNUNET_MESSAGE_TYPE_MESH_BCK, 0},
+  {NULL, 0, 0}
+};
+
+
+
+/**
  * Iterator to notify all connections of a broken link. Mark connections
  * to destroy after all traffic has been sent.
  *
@@ -1513,7 +2257,7 @@
  * @param c Configuration handle.
  */
 void
-GMC_init (struct GNUNET_CONFIGURATION_Handle *c)
+GMC_init (const struct GNUNET_CONFIGURATION_Handle *c)
 {
   if (GNUNET_OK !=
       GNUNET_CONFIGURATION_get_value_number (c, "MESH", "MAX_MSGS_QUEUE",
@@ -1545,9 +2289,39 @@
     return;
   }
   connections = GNUNET_CONTAINER_multihashmap_create (1024, GNUNET_YES);
+
+  core_handle = GNUNET_CORE_connect (c, /* Main configuration */
+                                     NULL,      /* Closure passed to MESH 
functions */
+                                     &core_init,        /* Call core_init once 
connected */
+                                     &core_connect,     /* Handle connects */
+                                     &core_disconnect,  /* remove peers on 
disconnects */
+                                     NULL,      /* Don't notify about all 
incoming messages */
+                                     GNUNET_NO, /* For header only in 
notification */
+                                     NULL,      /* Don't notify about all 
outbound messages */
+                                     GNUNET_NO, /* For header-only out 
notification */
+                                     core_handlers);    /* Register these 
handlers */
+  if (NULL == core_handle)
+  {
+    GNUNET_break (0);
+    GNUNET_SCHEDULER_shutdown ();
+    return;
+  }
 }
 
+/**
+ * Shut down the connections subsystem.
+ */
+void
+GMC_shutdown (void)
+{
+  if (core_handle != NULL)
+  {
+    GNUNET_CORE_disconnect (core_handle);
+    core_handle = NULL;
+  }
+}
 
+
 /**
  * Is this peer the first one on the connection?
  *
@@ -1580,4 +2354,4 @@
 GMC_is_terminal (struct MeshConnection *c, int fwd)
 {
   return GMC_is_origin (c, !fwd);
-}
\ No newline at end of file
+}

Modified: gnunet/src/mesh/gnunet-service-mesh_connection.h
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_connection.h    2013-10-02 16:03:42 UTC 
(rev 29789)
+++ gnunet/src/mesh/gnunet-service-mesh_connection.h    2013-10-02 16:39:56 UTC 
(rev 29790)
@@ -39,7 +39,9 @@
 
 #include "gnunet_util_lib.h"
 
-
+/**
+ * Struct containing all information regarding a connection to a peer.
+ */
 struct MeshConnection;
 
 /**
@@ -48,9 +50,15 @@
  * @param c Configuration handle.
  */
 void
-GMC_init (struct GNUNET_CONFIGURATION_Handle *c);
+GMC_init (const struct GNUNET_CONFIGURATION_Handle *c);
 
 /**
+ * Shut down the connections subsystem.
+ */
+void
+GMC_shutdown (void);
+
+/**
  * Create a connection.
  *
  * @param cid Connection ID.
@@ -185,6 +193,7 @@
 GMC_is_terminal (struct MeshConnection *c, int fwd);
 
 
+
 #if 0                           /* keep Emacsens' auto-indent happy */
 {
 #endif

Added: gnunet/src/mesh/gnunet-service-mesh_dht.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_dht.c                           (rev 0)
+++ gnunet/src/mesh/gnunet-service-mesh_dht.c   2013-10-02 16:39:56 UTC (rev 
29790)
@@ -0,0 +1,183 @@
+/*
+     This file is part of GNUnet.
+     (C) 2013 Christian Grothoff (and other contributing authors)
+
+     GNUnet is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+
+#include "platform.h"
+#include "gnunet_util_lib.h"
+
+#include "gnunet_dht_service.h"
+
+#include "gnunet-service-mesh_dht.h"
+#include "gnunet-service-mesh_peer.h"
+
+#define MESH_DEBUG_DHT          GNUNET_NO
+
+#if MESH_DEBUG_DHT
+#define DEBUG_DHT(...) GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
+#else
+#define DEBUG_DHT(...)
+#endif
+
+/******************************************************************************/
+/********************************   STRUCTS  
**********************************/
+/******************************************************************************/
+
+
+
+
+/******************************************************************************/
+/*******************************   GLOBALS  
***********************************/
+/******************************************************************************/
+
+/**
+ * Handle to use DHT.
+ */
+static struct GNUNET_DHT_Handle *dht_handle;
+
+/**
+ * How often to PUT own ID in the DHT.
+ */
+static struct GNUNET_TIME_Relative id_announce_time;
+
+/**
+ * DHT replication level, see DHT API: GNUNET_DHT_get_start, GNUNET_DHT_put.
+ */
+static unsigned long long dht_replication_level;
+
+/**
+ * Task to periodically announce itself in the network.
+ */
+static GNUNET_SCHEDULER_TaskIdentifier announce_id_task;
+
+/**
+ * Own ID (full value).
+ */
+static struct GNUNET_PeerIdentity *id;
+
+/**
+ * Own private key.
+ */
+static struct GNUNET_CRYPTO_EccPrivateKey *private_key;
+
+
+/******************************************************************************/
+/********************************   STATIC  
***********************************/
+/******************************************************************************/
+
+
+/**
+ * Periodically announce self id in the DHT
+ *
+ * @param cls closure
+ * @param tc task context
+ */
+static void
+announce_id (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  struct PBlock block;
+  struct GNUNET_HashCode phash;
+
+  if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
+  {
+    announce_id_task = GNUNET_SCHEDULER_NO_TASK;
+    return;
+  }
+  /* TODO
+   * - Set data expiration in function of X
+   * - Adapt X to churn
+   */
+  DEBUG_DHT ("DHT_put for ID %s started.\n", GNUNET_i2s (&my_full_id));
+
+  block.id = my_full_id;
+  GNUNET_CRYPTO_hash (&my_full_id, sizeof (struct GNUNET_PeerIdentity), 
&phash);
+  GNUNET_DHT_put (dht_handle,   /* DHT handle */
+                  &phash,       /* Key to use */
+                  dht_replication_level,     /* Replication level */
+                  GNUNET_DHT_RO_RECORD_ROUTE | 
GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE,    /* DHT options */
+                  GNUNET_BLOCK_TYPE_MESH_PEER,       /* Block type */
+                  sizeof (block),  /* Size of the data */
+                  (const char *) &block, /* Data itself */
+                  GNUNET_TIME_UNIT_FOREVER_ABS,  /* Data expiration */
+                  GNUNET_TIME_UNIT_FOREVER_REL, /* Retry time */
+                  NULL,         /* Continuation */
+                  NULL);        /* Continuation closure */
+  announce_id_task =
+      GNUNET_SCHEDULER_add_delayed (id_announce_time, &announce_id, cls);
+}
+
+
+/******************************************************************************/
+/********************************    API    
***********************************/
+/******************************************************************************/
+
+/**
+ * Initialize the DHT subsystem.
+ *
+ * @param c Configuration.
+ */
+void
+GMD_init (const struct GNUNET_CONFIGURATION_Handle *c)
+{
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_number (c, "MESH", 
"DHT_REPLICATION_LEVEL",
+                                             &dht_replication_level))
+  {
+    GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_WARNING,
+                               "MESH", "DHT_REPLICATION_LEVEL", "USING 
DEFAULT");
+    dht_replication_level = 3;
+  }
+
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_time (c, "MESH", "ID_ANNOUNCE_TIME",
+                                           &id_announce_time))
+  {
+    GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
+                               "MESH", "ID_ANNOUNCE_TIME", "MISSING");
+    GNUNET_SCHEDULER_shutdown ();
+    return;
+  }
+
+  dht_handle = GNUNET_DHT_connect (c, 64);
+  if (NULL == dht_handle)
+  {
+    GNUNET_break (0);
+  }
+
+  announce_id_task = GNUNET_SCHEDULER_add_now (&announce_id, cls);
+}
+
+
+/**
+ * Shut down the DHT subsystem.
+ */
+void
+GMD_shutdown(void )
+{
+  if (dht_handle != NULL)
+  {
+    GNUNET_DHT_disconnect (dht_handle);
+    dht_handle = NULL;
+  }
+  if (GNUNET_SCHEDULER_NO_TASK != announce_id_task)
+  {
+    GNUNET_SCHEDULER_cancel (announce_id_task);
+    announce_id_task = GNUNET_SCHEDULER_NO_TASK;
+  }
+}

Added: gnunet/src/mesh/gnunet-service-mesh_dht.h
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_dht.h                           (rev 0)
+++ gnunet/src/mesh/gnunet-service-mesh_dht.h   2013-10-02 16:39:56 UTC (rev 
29790)
@@ -0,0 +1,71 @@
+/*
+     This file is part of GNUnet.
+     (C) 2013 Christian Grothoff (and other contributing authors)
+
+     GNUnet is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file mesh/gnunet-service-mesh_dht.h
+ * @brief mesh service; dealing with DHT requests and results
+ * @author Bartlomiej Polot
+ *
+ * All functions in this file should use the prefix GMD (Gnunet Mesh Dht)
+ */
+
+#ifndef GNUNET_SERVICE_MESH_DHT_H
+#define GNUNET_SERVICE_MESH_DHT_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#if 0                           /* keep Emacsens' auto-indent happy */
+}
+#endif
+#endif
+
+#include "platform.h"
+#include "gnunet_util_lib.h"
+
+
+/******************************************************************************/
+/********************************    API    
***********************************/
+/******************************************************************************/
+
+/**
+ * Initialize DHT subsystem.
+ *
+ * @param c Configuration.
+ */
+void
+GMD_init (const struct GNUNET_CONFIGURATION_Handle *c);
+
+/**
+ * Shut down the DHT subsystem.
+ */
+void
+GMD_shutdown (void);
+
+#if 0                           /* keep Emacsens' auto-indent happy */
+{
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+/* ifndef GNUNET_MESH_SERVICE_LOCAL_H */
+#endif
+/* end of gnunet-mesh-service_LOCAL.h */
\ No newline at end of file

Modified: gnunet/src/mesh/gnunet-service-mesh_local.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_local.c 2013-10-02 16:03:42 UTC (rev 
29789)
+++ gnunet/src/mesh/gnunet-service-mesh_local.c 2013-10-02 16:39:56 UTC (rev 
29790)
@@ -789,16 +789,9 @@
 /********************************    API    
***********************************/
 
/******************************************************************************/
 
-void
-GML_init (void)
-{
-  ports = GNUNET_CONTAINER_multihashmap32_create (32);
-}
-
-
 /**
  * Initialize server subsystem.
- * 
+ *
  * @param handle Server handle.
  */
 void
@@ -806,6 +799,7 @@
 {
   server_handle = handle;
   GNUNET_SERVER_suspend (server_handle);
+  ports = GNUNET_CONTAINER_multihashmap32_create (32);
 }
 
 /**

Modified: gnunet/src/mesh/gnunet-service-mesh_local.h
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_local.h 2013-10-02 16:03:42 UTC (rev 
29789)
+++ gnunet/src/mesh/gnunet-service-mesh_local.h 2013-10-02 16:39:56 UTC (rev 
29790)
@@ -21,7 +21,7 @@
 /**
  * @file mesh/gnunet-service-mesh_local.h
  * @brief mesh service; dealing with local clients
- * @author Bart Polot
+ * @author Bartlomiej Polot
  *
  * All functions in this file should use the prefix GML (Gnunet Mesh Local)
  */
@@ -37,7 +37,9 @@
 #endif
 #endif
 
+#include "platform.h"
 #include "gnunet_util_lib.h"
+
 #include "gnunet-service-mesh_channel.h"
 
 /**

Added: gnunet/src/mesh/gnunet-service-mesh_peer.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_peer.c                          (rev 0)
+++ gnunet/src/mesh/gnunet-service-mesh_peer.c  2013-10-02 16:39:56 UTC (rev 
29790)
@@ -0,0 +1,166 @@
+/*
+     This file is part of GNUnet.
+     (C) 2013 Christian Grothoff (and other contributing authors)
+
+     GNUnet is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+
+#include "platform.h"
+#include "gnunet_util_lib.h"
+
+#include "gnunet-service-mesh_peer.h"
+
+/******************************************************************************/
+/********************************   STRUCTS  
**********************************/
+/******************************************************************************/
+
+/**
+ * Struct containing all information regarding a given peer
+ */
+struct MeshPeer
+{
+    /**
+     * ID of the peer
+     */
+  GNUNET_PEER_Id id;
+
+    /**
+     * Last time we heard from this peer
+     */
+  struct GNUNET_TIME_Absolute last_contact;
+
+    /**
+     * Paths to reach the peer, ordered by ascending hop count
+     */
+  struct MeshPeerPath *path_head;
+
+    /**
+     * Paths to reach the peer, ordered by ascending hop count
+     */
+  struct MeshPeerPath *path_tail;
+
+    /**
+     * Handle to stop the DHT search for paths to this peer
+     */
+  struct GNUNET_DHT_GetHandle *dhtget;
+
+    /**
+     * Tunnel to this peer, if any.
+     */
+  struct MeshTunnel2 *tunnel;
+
+    /**
+     * Connections that go through this peer, indexed by tid;
+     */
+  struct GNUNET_CONTAINER_MultiHashMap *connections;
+
+    /**
+     * Handle for queued transmissions
+     */
+  struct GNUNET_CORE_TransmitHandle *core_transmit;
+
+  /**
+   * Transmission queue to core DLL head
+   */
+  struct MeshPeerQueue *queue_head;
+  
+  /**
+   * Transmission queue to core DLL tail
+   */
+  struct MeshPeerQueue *queue_tail;
+
+  /**
+   * How many messages are in the queue to this peer.
+   */
+  unsigned int queue_n;
+};
+
+
+/******************************************************************************/
+/*******************************   GLOBALS  
***********************************/
+/******************************************************************************/
+
+/**
+ * Peers known, indexed by PeerIdentity (MeshPeer).
+ */
+static struct GNUNET_CONTAINER_MultiPeerMap *peers;
+
+/**
+ * How many peers do we want to remember?
+ */
+static unsigned long long max_peers;
+
+
+/******************************************************************************/
+/********************************   STATIC  
***********************************/
+/******************************************************************************/
+
+/**
+ * Iterator over tunnel hash map entries to destroy the tunnel during shutdown.
+ *
+ * @param cls closure
+ * @param key current key code
+ * @param value value in the hash map
+ * @return #GNUNET_YES if we should continue to iterate,
+ *         #GNUNET_NO if not.
+ */
+static int
+shutdown_tunnel (void *cls, 
+                 const struct GNUNET_PeerIdentity *key, 
+                 void *value)
+{
+  struct MeshPeer *p = value;
+  struct MeshTunnel2 *t = p->tunnel;
+
+  if (NULL != t)
+    GMT_destroy (t);
+  return GNUNET_YES;
+}
+
+
+/******************************************************************************/
+/********************************    API    
***********************************/
+/******************************************************************************/
+
+/**
+ * Initialize the peer subsystem.
+ *
+ * @param c Configuration.
+ */
+void
+GMP_init (const struct GNUNET_CONFIGURATION_Handle *c)
+{
+  peers = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_NO);
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_number (c, "MESH", "MAX_PEERS",
+                                             &max_peers))
+  {
+    GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_WARNING,
+                               "MESH", "MAX_PEERS", "USING DEFAULT");
+    max_peers = 1000;
+  }
+}
+
+/**
+ * Shut down the peer subsystem.
+ */
+void
+GMP_shutdown (void)
+{
+  GNUNET_CONTAINER_multipeermap_iterate (peers, &shutdown_tunnel, NULL);
+}
+

Added: gnunet/src/mesh/gnunet-service-mesh_peer.h
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_peer.h                          (rev 0)
+++ gnunet/src/mesh/gnunet-service-mesh_peer.h  2013-10-02 16:39:56 UTC (rev 
29790)
@@ -0,0 +1,77 @@
+/*
+     This file is part of GNUnet.
+     (C) 2013 Christian Grothoff (and other contributing authors)
+
+     GNUnet is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file mesh/gnunet-service-mesh_peer.h
+ * @brief mesh service; dealing with remote peers
+ * @author Bartlomiej Polot
+ *
+ * All functions in this file should use the prefix GMP (Gnunet Mesh Peer)
+ */
+
+#ifndef GNUNET_SERVICE_MESH_PEER_H
+#define GNUNET_SERVICE_MESH_PEER_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#if 0                           /* keep Emacsens' auto-indent happy */
+}
+#endif
+#endif
+
+#include "platform.h"
+#include "gnunet_util_lib.h"
+
+/**
+ * Struct containing all information regarding a given peer
+ */
+struct MeshPeer;
+
+
+/******************************************************************************/
+/********************************    API    
***********************************/
+/******************************************************************************/
+
+/**
+ * Initialize peer subsystem.
+ *
+ * @param c Configuration.
+ */
+void
+GMP_init (const struct GNUNET_CONFIGURATION_Handle *c);
+
+/**
+ * Shut down the peer subsystem.
+ */
+void
+GMP_shutdown (void);
+
+
+#if 0                           /* keep Emacsens' auto-indent happy */
+{
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+/* ifndef GNUNET_MESH_SERVICE_PEER_H */
+#endif
+/* end of gnunet-mesh-service_peer.h */
\ No newline at end of file




reply via email to

[Prev in Thread] Current Thread [Next in Thread]