tighten formatting rules
[oweals/gnunet.git] / src / testbed / gnunet-service-testbed.h
index 1ddc895408c25d86cfb30353884e7df17d005a82..03955327cb2e2680bb43d71d65e57ebaabbab506 100644 (file)
@@ -1,22 +1,22 @@
 /*
-  This file is part of GNUnet.
-  (C) 2012 Christian Grothoff (and other contributing authors)
+   This file is part of GNUnet.
+   Copyright (C) 2008--2013 GNUnet e.V.
 
-  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 2, or (at your
-  option) any later version.
+   GNUnet is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Affero General Public License as published
+   by the Free Software Foundation, either version 3 of the License,
+   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.
+   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
+   Affero 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.
-*/
+   You should have received a copy of the GNU Affero General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
+ */
 
 /**
  * @file testbed/gnunet-service-testbed.h
@@ -24,6 +24,7 @@
  * @author Sree Harsha Totakura
  */
 
+#include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_testbed_service.h"
 #include "gnunet_transport_service.h"
 #include "testbed_api_operations.h"
 #include "testbed_api_hosts.h"
 #include "gnunet_testing_lib.h"
+#include "gnunet-service-testbed_links.h"
 
 
 /**
  * Generic logging
  */
-#define LOG(kind,...)                           \
+#define LOG(kind, ...)                           \
   GNUNET_log (kind, __VA_ARGS__)
 
 /**
  */
 #define LIST_GROW_STEP 10
 
-/**
- * Default timeout for operations which may take some time
- */
-#define TIMEOUT GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 15)
-
 
 /**
  * A routing entry
@@ -90,7 +87,7 @@ struct ForwardedOperationContext
    * The prev pointer for DLL
    */
   struct ForwardedOperationContext *prev;
-  
+
   /**
    * The generated operation context
    */
@@ -99,7 +96,7 @@ struct ForwardedOperationContext
   /**
    * The client to which we have to reply
    */
-  struct GNUNET_SERVER_Client *client;
+  struct GNUNET_SERVICE_Client *client;
 
   /**
    * Closure pointer
@@ -109,7 +106,7 @@ struct ForwardedOperationContext
   /**
    * Task ID for the timeout task
    */
-  GNUNET_SCHEDULER_TaskIdentifier timeout_task;
+  struct GNUNET_SCHEDULER_Task *timeout_task;
 
   /**
    * The id of the operation that has been forwarded
@@ -120,7 +117,6 @@ struct ForwardedOperationContext
    * The type of the operation which is forwarded
    */
   enum OperationType type;
-
 };
 
 
@@ -164,77 +160,20 @@ struct LinkControllersContext
   /**
    * The client which initiated the link controller operation
    */
-  struct GNUNET_SERVER_Client *client;
+  struct GNUNET_SERVICE_Client *client;
 
   /**
    * The ID of the operation
    */
   uint64_t operation_id;
-
-};
-
-
-/**
- * Structure representing a connected(directly-linked) controller
- */
-struct Slave
-{
-  /**
-   * The controller process handle if we had started the controller
-   */
-  struct GNUNET_TESTBED_ControllerProc *controller_proc;
-
-  /**
-   * The controller handle
-   */
-  struct GNUNET_TESTBED_Controller *controller;
-
-  /**
-   * The configuration of the slave. Cannot be NULL
-   */
-  struct GNUNET_CONFIGURATION_Handle *cfg;
-
-  /**
-   * handle to lcc which is associated with this slave startup. Should be set to
-   * NULL when the slave has successfully started up
-   */
-  struct LinkControllersContext *lcc;
-
-  /**
-   * Head of the host registration DLL
-   */
-  struct HostRegistration *hr_dll_head;
-
-  /**
-   * Tail of the host registration DLL
-   */
-  struct HostRegistration *hr_dll_tail;
-
-  /**
-   * The current host registration handle
-   */
-  struct GNUNET_TESTBED_HostRegistrationHandle *rhandle;
-
-  /**
-   * Hashmap to hold Registered host contexts
-   */
-  struct GNUNET_CONTAINER_MultiHashMap *reghost_map;
-
-  /**
-   * The id of the host this controller is running on
-   */
-  uint32_t host_id;
-
 };
 
 
 /**
  * A peer
  */
-
 struct Peer
 {
-  
   union
   {
     struct
@@ -249,12 +188,11 @@ struct Peer
        * peer is configured with
        */
       struct GNUNET_CONFIGURATION_Handle *cfg;
-      
+
       /**
        * Is the peer running
        */
       int is_running;
-
     } local;
 
     struct
@@ -268,9 +206,7 @@ struct Peer
        * The id of the remote host this peer is running on
        */
       uint32_t remote_host_id;
-
     } remote;
-
   } details;
 
   /**
@@ -300,511 +236,665 @@ struct Peer
    * the peer
    */
   uint32_t destroy_flag;
-
 };
 
 
 /**
- * Context information for transport try connect
+ * The main context information associated with the client which started us
  */
-struct TryConnectContext
+struct Context
 {
   /**
-   * The identity of the peer to which the transport has to attempt a connection
-   */
-  struct GNUNET_PeerIdentity *pid;
-
-  /**
-   * The transport handle
-   */
-  struct GNUNET_TRANSPORT_Handle *th;
-
-  /**
-   * the try connect handle
+   * The client handle associated with this context
    */
-  struct GNUNET_TRANSPORT_TryConnectHandle *tch;
+  struct GNUNET_SERVICE_Client *client;
 
   /**
-   * The task handle
+   * The network address of the master controller
    */
-  GNUNET_SCHEDULER_TaskIdentifier task;
+  char *master_ip;
 
   /**
-   * The id of the operation which is resposible for this context
+   * The TESTING system handle for starting peers locally
    */
-  uint64_t op_id;
+  struct GNUNET_TESTING_System *system;
 
   /**
-   * The number of times we attempted to connect
+   * Our host id according to this context
    */
-  unsigned int retries;
-
+  uint32_t host_id;
 };
 
 
 /**
- * Context information for connecting 2 peers in overlay
+ * The structure for identifying a shared service
  */
-struct OverlayConnectContext
+struct SharedService
 {
   /**
-   * The next pointer for maintaining a DLL
+   * The name of the shared service
    */
-  struct OverlayConnectContext *next;
+  char *name;
 
   /**
-   * The prev pointer for maintaining a DLL
-   */
-  struct OverlayConnectContext *prev;
-  
-  /**
-   * The client which has requested for overlay connection
+   * Number of shared peers per instance of the shared service
    */
-  struct GNUNET_SERVER_Client *client;
+  uint32_t num_shared;
 
   /**
-   * the peer which has to connect to the other peer
+   * Number of peers currently sharing the service
    */
-  struct Peer *peer;
+  uint32_t num_sharing;
+};
 
-  /**
-   * Transport handle of the first peer to get its HELLO
-   */
-  struct GNUNET_TRANSPORT_Handle *p1th;
 
-  /**
-   * Core handles of the first peer; used to notify when second peer connects to it
-   */
-  struct GNUNET_CORE_Handle *ch;
+struct RegisteredHostContext;
 
-  /**
-   * HELLO of the other peer
-   */
-  struct GNUNET_MessageHeader *hello;
 
+/**
+ * Context information to used during operations which forward the overlay
+ * connect message
+ */
+struct ForwardedOverlayConnectContext
+{
   /**
-   * Get hello handle to acquire HELLO of first peer
+   * next ForwardedOverlayConnectContext in the DLL
    */
-  struct GNUNET_TRANSPORT_GetHelloHandle *ghh;
+  struct ForwardedOverlayConnectContext *next;
 
   /**
-   * The handle for offering HELLO
+   * previous ForwardedOverlayConnectContext in the DLL
    */
-  struct GNUNET_TRANSPORT_OfferHelloHandle *ohh;
+  struct ForwardedOverlayConnectContext *prev;
 
   /**
-   * The error message we send if this overlay connect operation has timed out
+   * Which host does this FOCC belong to?
    */
-  char *emsg;
+  struct RegisteredHostContext *rhc;
 
   /**
-   * Operation context for suboperations
+   * A copy of the original overlay connect message
    */
-  struct OperationContext *opc;
+  struct GNUNET_MessageHeader *orig_msg;
 
   /**
-   * Controller of peer 2; NULL if the peer is local
+   * The client handle
    */
-  struct GNUNET_TESTBED_Controller *peer2_controller;
+  struct GNUNET_SERVICE_Client *client;
 
   /**
-   * The transport try connect context
+   * The id of the operation which created this context information
    */
-  struct TryConnectContext tcc;
+  uint64_t operation_id;
 
   /**
-   * The peer identity of the first peer
+   * the id of peer 1
    */
-  struct GNUNET_PeerIdentity peer_identity;
+  uint32_t peer1;
 
   /**
-   * The peer identity of the other peer
+   * The id of peer 2
    */
-  struct GNUNET_PeerIdentity other_peer_identity;
+  uint32_t peer2;
 
   /**
-   * The id of the operation responsible for creating this context
+   * Id of the host where peer2 is running
    */
-  uint64_t op_id;
+  uint32_t peer2_host_id;
+};
+
 
+/**
+ * This context information will be created for each host that is registered at
+ * slave controllers during overlay connects.
+ */
+struct RegisteredHostContext
+{
   /**
-   * The id of the task for sending HELLO of peer 2 to peer 1 and ask peer 1 to
-   * connect to peer 2
+   * The host which is being registered
    */
-  GNUNET_SCHEDULER_TaskIdentifier send_hello_task;
+  struct GNUNET_TESTBED_Host *reg_host;
 
   /**
-   * The id of the overlay connect timeout task
+   * The host of the controller which has to connect to the above rhost
    */
-  GNUNET_SCHEDULER_TaskIdentifier timeout_task;
+  struct GNUNET_TESTBED_Host *host;
 
   /**
-   * The id of the cleanup task
+   * Head of the ForwardedOverlayConnectContext DLL
    */
-  GNUNET_SCHEDULER_TaskIdentifier cleanup_task;
+  struct ForwardedOverlayConnectContext *focc_dll_head;
 
   /**
-   * The id of peer A
+   * Tail of the ForwardedOverlayConnectContext DLL
    */
-  uint32_t peer_id;
+  struct ForwardedOverlayConnectContext *focc_dll_tail;
 
   /**
-   * The id of peer B
+   * Enumeration of states for this context
    */
-  uint32_t other_peer_id;
+  enum RHCState
+  {
+    /**
+     * The initial state
+     */
+    RHC_INIT = 0,
 
+    /**
+     * State where we attempt to do the overlay connection again
+     */
+    RHC_DONE
+  } state;
 };
 
 
 /**
- * Context information for RequestOverlayConnect
- * operations. RequestOverlayConnect is used when peers A, B reside on different
- * hosts and the host controller for peer B is asked by the host controller of
- * peer A to make peer B connect to peer A
+ * Context data for #GNUNET_MESSAGE_TYPE_TESTBED_SHUTDOWN_PEERS handler
  */
-struct RequestOverlayConnectContext
+struct HandlerContext_ShutdownPeers
 {
   /**
-   * the next pointer for DLL
+   * The number of slave we expect to hear from since we forwarded the
+   * #GNUNET_MESSAGE_TYPE_TESTBED_SHUTDOWN_PEERS message to them
    */
-  struct RequestOverlayConnectContext *next;
+  unsigned int nslaves;
 
   /**
-   * the prev pointer for DLL
+   * Did we observe a timeout with respect to this operation at any of the
+   * slaves
    */
-  struct RequestOverlayConnectContext *prev;
+  int timeout;
+};
 
-  /**
-   * The peer handle of peer B
-   */
-  struct Peer *peer;
-  
-  /**
-   * Peer A's HELLO
-   */
-  struct GNUNET_MessageHeader *hello;
 
-  /**
-   * The handle for offering HELLO
  */
-  struct GNUNET_TRANSPORT_OfferHelloHandle *ohh;
+/**
+ * Our configuration
+ */
+extern struct GNUNET_CONFIGURATION_Handle *GST_config;
 
-  /**
-   * The transport try connect context
  */
-  struct TryConnectContext tcc;
+/**
+ * The master context; generated with the first INIT message
+ */
+extern struct Context *GST_context;
 
-  /**
-   * The peer identity of peer A
  */
-  struct GNUNET_PeerIdentity a_id;
+/**
+ * DLL head for forwarded operation contexts
+ */
+extern struct ForwardedOperationContext *fopcq_head;
 
-  /**
-   * Task for offering HELLO of A to B and doing try_connect
-   */
-  GNUNET_SCHEDULER_TaskIdentifier attempt_connect_task_id;
-  
-  /**
-   * Task to timeout RequestOverlayConnect
-   */
-  GNUNET_SCHEDULER_TaskIdentifier timeout_rocc_task_id;
-  
-  /**
-   * The id of the operation responsible for creating this context
-   */
-  uint64_t op_id;
-};
+/**
+ * DLL tail for forwarded operation contexts
+ */
+extern struct ForwardedOperationContext *fopcq_tail;
 
+/**
+ * A list of peers we know about
+ */
+extern struct Peer **GST_peer_list;
 
 /**
- * Context information to used during operations which forward the overlay
- * connect message
+ * Array of hosts
  */
-struct ForwardedOverlayConnectContext
-{
-  /**
-   * next ForwardedOverlayConnectContext in the DLL
-   */
-  struct ForwardedOverlayConnectContext *next;
+extern struct GNUNET_TESTBED_Host **GST_host_list;
 
-  /**
-   * previous ForwardedOverlayConnectContext in the DLL
  */
-  struct ForwardedOverlayConnectContext *prev;
+/**
+ * Operation queue for open file descriptors
+ */
+extern struct OperationQueue *GST_opq_openfds;
 
-  /**
  * A copy of the original overlay connect message
  */
-  struct GNUNET_MessageHeader *orig_msg;
+/**
* Timeout for operations which may take some time
+ */
+extern struct GNUNET_TIME_Relative GST_timeout;
 
-  /**
-   * The id of the operation which created this context information
  */
-  uint64_t operation_id;
+/**
+ * The size of the peer list
+ */
+extern unsigned int GST_peer_list_size;
 
-  /**
-   * the id of peer 1
-   */
-  uint32_t peer1;
-  
-  /**
-   * The id of peer 2
-   */
-  uint32_t peer2;
-  
-  /**
-   * Id of the host where peer2 is running
-   */
-  uint32_t peer2_host_id;
-};
+/**
+ * The current number of peers running locally under this controller
+ */
+extern unsigned int GST_num_local_peers;
 
+/**
+ * The size of the host list
+ */
+extern unsigned int GST_host_list_size;
 
 /**
- * The main context information associated with the client which started us
+ * The directory where to store load statistics data
  */
-struct Context
-{
-  /**
-   * The client handle associated with this context
-   */
-  struct GNUNET_SERVER_Client *client;
+extern char *GST_stats_dir;
 
-  /**
-   * The network address of the master controller
-   */
-  char *master_ip;
+/**
+ * Condition to check if host id is valid
+ */
+#define VALID_HOST_ID(id) \
+  (((id) < GST_host_list_size) && (NULL != GST_host_list[id]))
 
-  /**
-   * The TESTING system handle for starting peers locally
-   */
-  struct GNUNET_TESTING_System *system;
-  
-  /**
-   * Our host id according to this context
-   */
-  uint32_t host_id;
-};
+/**
+ * Condition to check if peer id is valid
+ */
+#define VALID_PEER_ID(id) \
+  (((id) < GST_peer_list_size) && (NULL != GST_peer_list[id]))
 
 
 /**
- * The structure for identifying a shared service
+ * Similar to GNUNET_array_grow(); however instead of calling GNUNET_array_grow()
+ * several times we call it only once. The array is also made to grow in steps
+ * of LIST_GROW_STEP.
+ *
+ * @param ptr the array pointer to grow
+ * @param size the size of array
+ * @param accommodate_size the size which the array has to accommdate; after
+ *          this call the array will be big enough to accommdate sizes upto
+ *          accommodate_size
  */
-struct SharedService
-{
-  /**
-   * The name of the shared service
-   */
-  char *name;
+#define GST_array_grow_large_enough(ptr, size, accommodate_size) \
+  do                                                                    \
+  {                                                                     \
+    unsigned int growth_size;                                           \
+    GNUNET_assert (size <= accommodate_size);                            \
+    growth_size = size;                                                 \
+    while (growth_size <= accommodate_size)                             \
+      growth_size += LIST_GROW_STEP;                                    \
+    GNUNET_array_grow (ptr, size, growth_size);                         \
+    GNUNET_assert (size > accommodate_size);                            \
+  } while (0)
 
-  /**
-   * Number of shared peers per instance of the shared service
-   */
-  uint32_t num_shared;
 
-  /**
-   * Number of peers currently sharing the service
-   */
-  uint32_t num_sharing;
-};
+/**
+ * Function to destroy a peer
+ *
+ * @param peer the peer structure to destroy
+ */
+void
+GST_destroy_peer (struct Peer *peer);
 
 
 /**
- * This context information will be created for each host that is registered at
- * slave controllers during overlay connects.
+ * Stops and destroys all peers
  */
-struct RegisteredHostContext
-{
-  /**
-   * The host which is being registered
-   */
-  struct GNUNET_TESTBED_Host *reg_host;
+void
+GST_destroy_peers (void);
 
-  /**
-   * The host of the controller which has to connect to the above rhost
-   */
-  struct GNUNET_TESTBED_Host *host;
 
-  /**
-   * The gateway to which this operation is forwarded to
-   */
-  struct Slave *gateway;
+/**
+ * Finds the route with directly connected host as destination through which
+ * the destination host can be reached
+ *
+ * @param host_id the id of the destination host
+ * @return the route with directly connected destination host; NULL if no route
+ *           is found
+ */
+struct Route *
+GST_find_dest_route (uint32_t host_id);
 
-  /**
-   * The gateway through which peer2's controller can be reached
-   */
-  struct Slave *gateway2;
 
-  /**
-   * Handle for sub-operations
-   */
-  struct GNUNET_TESTBED_Operation *sub_op;
+/**
+ * Handler for #GNUNET_MESSAGE_TYPE_TESTBED_OVERLAY_CONNECT messages
+ *
+ * @param cls identification of the client
+ * @param msg the actual message
+ */
+void
+handle_overlay_connect (void *cls,
+                        const struct GNUNET_TESTBED_OverlayConnectMessage *msg);
 
-  /**
-   * The client which initiated the link controller operation
-   */
-  struct GNUNET_SERVER_Client *client;
 
-  /**
-   * Head of the ForwardedOverlayConnectContext DLL
-   */
-  struct ForwardedOverlayConnectContext *focc_dll_head;
+/**
+ * Adds a host registration's request to a slave's registration queue
+ *
+ * @param slave the slave controller at which the given host has to be
+ *          registered
+ * @param cb the host registration completion callback
+ * @param cb_cls the closure for the host registration completion callback
+ * @param host the host which has to be registered
+ */
+void
+GST_queue_host_registration (struct Slave *slave,
+                             GNUNET_TESTBED_HostRegistrationCompletion cb,
+                             void *cb_cls, struct GNUNET_TESTBED_Host *host);
 
-  /**
-   * Tail of the ForwardedOverlayConnectContext DLL
-   */
-  struct ForwardedOverlayConnectContext *focc_dll_tail;
-  
-  /**
-   * Enumeration of states for this context
-   */
-  enum RHCState {
 
-    /**
-     * The initial state
-     */
-    RHC_INIT = 0,
+/**
+ * Callback to relay the reply msg of a forwarded operation back to the client
+ *
+ * @param cls ForwardedOperationContext
+ * @param msg the message to relay
+ */
+void
+GST_forwarded_operation_reply_relay (void *cls,
+                                     const struct GNUNET_MessageHeader *msg);
 
-    /**
-     * State where we attempt to get peer2's controller configuration
-     */
-    RHC_GET_CFG,
 
-    /**
-     * State where we attempt to link the controller of peer 1 to the controller
-     * of peer2
-     */
-    RHC_LINK,
+/**
+ * Task to free resources when forwarded operation has been timedout
+ *
+ * @param cls the ForwardedOperationContext
+ * @param tc the task context from scheduler
+ */
+void
+GST_forwarded_operation_timeout (void *cls);
 
-    /**
-     * State where we attempt to do the overlay connection again
-     */
-    RHC_OL_CONNECT
-    
-  } state;
 
-};
+/**
+ * Clears the forwarded operations queue
+ */
+void
+GST_clear_fopcq (void);
 
 
 /**
- * States of LCFContext
+ * Send operation failure message to client
+ *
+ * @param client the client to which the failure message has to be sent to
+ * @param operation_id the id of the failed operation
+ * @param emsg the error message; can be NULL
  */
-enum LCFContextState
-{
-  /**
-   * The Context has been initialized; Nothing has been done on it
-   */
-  INIT,
+void
+GST_send_operation_fail_msg (struct GNUNET_SERVICE_Client *client,
+                             uint64_t operation_id,
+                             const char *emsg);
 
-  /**
-   * Delegated host has been registered at the forwarding controller
-   */
-  DELEGATED_HOST_REGISTERED,
-  
-  /**
-   * The slave host has been registred at the forwarding controller
-   */
-  SLAVE_HOST_REGISTERED,
-  
-  /**
-   * The context has been finished (may have error)
-   */
-  FINISHED
-};
+
+/**
+ * Notify OC subsystem that @a client disconnected.
+ *
+ * @param client the client that disconnected
+ */
+void
+GST_notify_client_disconnect_oc (struct GNUNET_SERVICE_Client *client);
 
 
 /**
- * Link controllers request forwarding context
+ * Notify peers subsystem that @a client disconnected.
+ *
+ * @param client the client that disconnected
  */
-struct LCFContext
-{
-  /**
-   * The gateway which will pass the link message to delegated host
-   */
-  struct Slave *gateway;
+void
+GST_notify_client_disconnect_peers (struct GNUNET_SERVICE_Client *client);
 
-  /**
-   * The controller link message that has to be forwarded to
-   */
-  struct GNUNET_TESTBED_ControllerLinkMessage *msg;
 
-  /**
-   * The client which has asked to perform this operation
-   */
-  struct GNUNET_SERVER_Client *client;
+/**
+ * Function to send generic operation success message to given client
+ *
+ * @param client the client to send the message to
+ * @param operation_id the id of the operation which was successful
+ */
+void
+GST_send_operation_success_msg (struct GNUNET_SERVICE_Client *client,
+                                uint64_t operation_id);
 
-  /**
-   * Handle for operations which are forwarded while linking controllers
-   */
-  struct ForwardedOperationContext *fopc;
 
-  /**
-   * The id of the operation which created this context
-   */
-  uint64_t operation_id;
+/**
+ * Check #GNUNET_MESSAGE_TYPE_TESTBED_REMOTE_OVERLAY_CONNECT messages
+ *
+ * @param cls identification of the client
+ * @param msg the actual message
+ * @return #GNUNET_OK if @a msg is well-formed
+ */
+int
+check_remote_overlay_connect (void *cls,
+                              const struct
+                              GNUNET_TESTBED_RemoteOverlayConnectMessage *msg);
 
-  /**
-   * The state of this context
-   */
-  enum LCFContextState state;
 
-  /**
-   * The delegated host
-   */
-  uint32_t delegated_host_id;
+/**
+ * Handler for #GNUNET_MESSAGE_TYPE_TESTBED_REMOTE_OVERLAY_CONNECT messages
+ *
+ * @param cls identification of the client
+ * @param msg the actual message
+ */
+void
+handle_remote_overlay_connect (void *cls,
+                               const struct
+                               GNUNET_TESTBED_RemoteOverlayConnectMessage *msg);
 
-  /**
-   * The slave host
-   */
-  uint32_t slave_host_id;
 
-};
+/**
+ * Check #GNUNET_MESSAGE_TYPE_TESTBED_CREATEPEER messages
+ *
+ * @param cls identification of the client
+ * @param msg the actual message
+ * @return #GNUNET_OK if @a msg is well-formed
+ */
+int
+check_peer_create (void *cls,
+                   const struct GNUNET_TESTBED_PeerCreateMessage *msg);
 
 
 /**
- * Structure of a queue entry in LCFContext request queue
+ * Handler for #GNUNET_MESSAGE_TYPE_TESTBED_CREATEPEER messages
+ *
+ * @param cls identification of the client
+ * @param message the actual message
  */
-struct LCFContextQueue
-{
-  /**
-   * The LCFContext
-   */
-  struct LCFContext *lcf;
+void
+handle_peer_create (void *cls,
+                    const struct GNUNET_TESTBED_PeerCreateMessage *msg);
 
-  /**
-   * Head prt for DLL
-   */
-  struct LCFContextQueue *next;
 
-  /**
-   * Tail ptr for DLL
-   */
-  struct LCFContextQueue *prev;
-};
+/**
+ * Message handler for #GNUNET_MESSAGE_TYPE_TESTBED_DESTROYPEER messages
+ *
+ * @param cls identification of the client
+ * @param msg the actual message
+ */
+void
+handle_peer_destroy (void *cls,
+                     const struct GNUNET_TESTBED_PeerDestroyMessage *msg);
 
 
 /**
- * Hello cache entry
+ * Message handler for #GNUNET_MESSAGE_TYPE_TESTBED_DESTROYPEER messages
+ *
+ * @param cls identification of the client
+ * @param msg the actual message
  */
-struct HelloCacheEntry
-{
-  /**
-   * DLL next ptr for least recently used hello cache entries
-   */
-  struct HelloCacheEntry *next;
+void
+handle_peer_start (void *cls,
+                   const struct GNUNET_TESTBED_PeerStartMessage *msg);
 
-  /**
-   * DLL prev ptr for least recently used hello cache entries
-   */
-  struct HelloCacheEntry *prev;
 
-  /**
-   * The key for this entry
-   */
-  struct GNUNET_HashCode key;
-  
-  /**
-   * The HELLO message
-   */
-  struct GNUNET_MessageHeader *hello;
-};
+/**
+ * Message handler for #GNUNET_MESSAGE_TYPE_TESTBED_DESTROYPEER messages
+ *
+ * @param cls identification of the client
+ * @param message the actual message
+ */
+void
+handle_peer_stop (void *cls,
+                  const struct GNUNET_TESTBED_PeerStopMessage *msg);
+
+
+/**
+ * Handler for #GNUNET_MESSAGE_TYPE_TESTBED_GETPEERCONFIG messages
+ *
+ * @param cls identification of the client
+ * @param msg the actual message
+ */
+void
+handle_peer_get_config (void *cls,
+                        const struct
+                        GNUNET_TESTBED_PeerGetConfigurationMessage *msg);
+
+
+/**
+ * Handler for #GNUNET_MESSAGE_TYPE_TESTBED_SHUTDOWN_PEERS messages
+ *
+ * @param cls identification of the client
+ * @param msg the actual message
+ */
+void
+handle_shutdown_peers (void *cls,
+                       const struct GNUNET_TESTBED_ShutdownPeersMessage *msg);
+
+
+/**
+ * Check #GNUNET_MESSAGE_TYPE_TESTBED_MANAGE_PEER_SERVICE message
+ *
+ * @param cls identification of client
+ * @param msg the actual message
+ * @return #GNUNET_OK if @a msg is well-formed
+ */
+int
+check_manage_peer_service (void *cls,
+                           const struct
+                           GNUNET_TESTBED_ManagePeerServiceMessage *msg);
+
+
+/**
+ * Handler for #GNUNET_MESSAGE_TYPE_TESTBED_MANAGE_PEER_SERVICE message
+ *
+ * @param cls identification of client
+ * @param msg the actual message
+ */
+void
+handle_manage_peer_service (void *cls,
+                            const struct
+                            GNUNET_TESTBED_ManagePeerServiceMessage *msg);
+
+
+/**
+ * Check #GNUNET_MESSAGE_TYPDE_TESTBED_RECONFIGURE_PEER type messages.
+ *
+ * @param cls identification of the client
+ * @param msg the actual message
+ * @return #GNUNET_OK if @a msg is well-formed
+ */
+int
+check_peer_reconfigure (void *cls,
+                        const struct
+                        GNUNET_TESTBED_PeerReconfigureMessage *msg);
+
+
+/**
+ * Handler for #GNUNET_MESSAGE_TYPDE_TESTBED_RECONFIGURE_PEER type messages.
+ * Should stop the peer asyncronously, destroy it and create it again with the
+ * new configuration.
+ *
+ * @param cls identification of the client
+ * @param msg the actual message
+ */
+void
+handle_peer_reconfigure (void *cls,
+                         const struct
+                         GNUNET_TESTBED_PeerReconfigureMessage *msg);
+
+
+/**
+ * Frees the ManageServiceContext queue
+ */
+void
+GST_free_mctxq (void);
+
+
+/**
+ * Cleans up the queue used for forwarding link controllers requests
+ */
+void
+GST_free_lcf (void);
+
+
+/**
+ * Cleans up the route list
+ */
+void
+GST_route_list_clear (void);
+
+
+/**
+ * Processes a forwarded overlay connect context in the queue of the given RegisteredHostContext
+ *
+ * @param rhc the RegisteredHostContext
+ */
+void
+GST_process_next_focc (struct RegisteredHostContext *rhc);
+
+
+/**
+ * Cleans up ForwardedOverlayConnectContext
+ *
+ * @param focc the ForwardedOverlayConnectContext to cleanup
+ */
+void
+GST_cleanup_focc (struct ForwardedOverlayConnectContext *focc);
+
+
+/**
+ * Clears all pending overlay connect contexts in queue
+ */
+void
+GST_free_occq (void);
+
+
+/**
+ * Clears all pending remote overlay connect contexts in queue
+ */
+void
+GST_free_roccq (void);
+
+
+/**
+ * Cleans up the Peer reconfigure context list
+ */
+void
+GST_free_prcq (void);
+
+
+/**
+ * Initializes the cache
+ *
+ * @param size the size of the cache
+ */
+void
+GST_cache_init (unsigned int size);
+
+
+/**
+ * Clear cache
+ */
+void
+GST_cache_clear (void);
+
+
+/**
+ * Looks up in the hello cache and returns the HELLO of the given peer
+ *
+ * @param peer_id the index of the peer whose HELLO has to be looked up
+ * @return the HELLO message; NULL if not found
+ */
+const struct GNUNET_MessageHeader *
+GST_cache_lookup_hello (const unsigned int peer_id);
+
+
+/**
+ * Caches the HELLO of the given peer. Updates the HELLO if it was already
+ * cached before
+ *
+ * @param peer_id the peer identity of the peer whose HELLO has to be cached
+ * @param hello the HELLO message
+ */
+void
+GST_cache_add_hello (const unsigned int peer_id,
+                     const struct GNUNET_MessageHeader *hello);
+
+
+/**
+ * Initialize logging CPU and IO statisticfs.  Checks the configuration for
+ * "STATS_DIR" and logs to a file in that directory.  The file is name is
+ * generated from the hostname and the process's PID.
+ */
+void
+GST_stats_init (const struct GNUNET_CONFIGURATION_Handle *cfg);
+
+
+/**
+ * Shutdown the status calls module.
+ */
+void
+GST_stats_destroy (void);
 
+/* End of gnunet-service-testbed.h */