- verboser log, faster start
[oweals/gnunet.git] / src / testbed / gnunet-service-testbed.h
index df7d7635ca3d05c3d949c7532801ab3c20b77047..1d465318cca11dc3229ced3733ab3914074373de 100644 (file)
  */
 #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
@@ -91,7 +86,7 @@ struct ForwardedOperationContext
    * The prev pointer for DLL
    */
   struct ForwardedOperationContext *prev;
-  
+
   /**
    * The generated operation context
    */
@@ -235,7 +230,7 @@ struct Slave
 
 struct Peer
 {
-  
+
   union
   {
     struct
@@ -250,7 +245,7 @@ struct Peer
        * peer is configured with
        */
       struct GNUNET_CONFIGURATION_Handle *cfg;
-      
+
       /**
        * Is the peer running
        */
@@ -324,7 +319,7 @@ struct Context
    * The TESTING system handle for starting peers locally
    */
   struct GNUNET_TESTING_System *system;
-  
+
   /**
    * Our host id according to this context
    */
@@ -384,12 +379,12 @@ struct ForwardedOverlayConnectContext
    * the id of peer 1
    */
   uint32_t peer1;
-  
+
   /**
    * The id of peer 2
    */
   uint32_t peer2;
-  
+
   /**
    * Id of the host where peer2 is running
    */
@@ -442,11 +437,12 @@ struct RegisteredHostContext
    * Tail of the ForwardedOverlayConnectContext DLL
    */
   struct ForwardedOverlayConnectContext *focc_dll_tail;
-  
+
   /**
    * Enumeration of states for this context
    */
-  enum RHCState {
+  enum RHCState
+  {
 
     /**
      * The initial state
@@ -468,7 +464,6 @@ struct RegisteredHostContext
      * State where we attempt to do the overlay connection again
      */
     RHC_OL_CONNECT
-    
   } state;
 
 };
@@ -488,12 +483,12 @@ enum LCFContextState
    * 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)
    */
@@ -578,7 +573,7 @@ struct GNUNET_CONFIGURATION_Handle *our_config;
 /**
  * The master context; generated with the first INIT message
  */
-extern struct Context *TESTBED_context;
+extern struct Context *GST_context;
 
 /**
  * DLL head for forwarded operation contexts
@@ -593,32 +588,42 @@ extern struct ForwardedOperationContext *fopcq_tail;
 /**
  * A list of peers we know about
  */
-extern struct Peer **TESTBED_peer_list;
+extern struct Peer **GST_peer_list;
 
 /**
  * Array of hosts
  */
-extern struct GNUNET_TESTBED_Host **TESTBED_host_list;
+extern struct GNUNET_TESTBED_Host **GST_host_list;
 
 /**
  * A list of directly linked neighbours
  */
-extern struct Slave **TESTBED_slave_list;
+extern struct Slave **GST_slave_list;
+
+/**
+ * Operation queue for open file descriptors
+ */
+extern struct OperationQueue *GST_opq_openfds;
+
+/**
+ * Timeout for operations which may take some time
+ */
+const extern struct GNUNET_TIME_Relative GST_timeout;
 
 /**
  * The size of the peer list
  */
-extern unsigned int TESTBED_peer_list_size;
+extern unsigned int GST_peer_list_size;
 
 /**
  * The size of the host list
  */
-extern unsigned int TESTBED_host_list_size;
+extern unsigned int GST_host_list_size;
 
 /**
  * The size of directly linked neighbours list
  */
-extern unsigned int TESTBED_slave_list_size;
+extern unsigned int GST_slave_list_size;
 
 
 /**
@@ -628,8 +633,8 @@ extern unsigned int TESTBED_slave_list_size;
  * @param msg the message to queue
  */
 void
-TESTBED_queue_message (struct GNUNET_SERVER_Client *client,
-                       struct GNUNET_MessageHeader *msg);
+GST_queue_message (struct GNUNET_SERVER_Client *client,
+                   struct GNUNET_MessageHeader *msg);
 
 
 /**
@@ -638,44 +643,7 @@ TESTBED_queue_message (struct GNUNET_SERVER_Client *client,
  * @param peer the peer structure to destroy
  */
 void
-TESTBED_destroy_peer (struct Peer *peer);
-
-
-/**
- * Looks up in the hello cache and returns the HELLO of the given peer
- *
- * @param id the peer identity of the peer whose HELLO has to be looked up
- * @return the HELLO message; NULL if not found
- */
-const struct GNUNET_MessageHeader *
-TESTBED_hello_cache_lookup (const struct GNUNET_PeerIdentity *id);
-
-/**
- * Caches the HELLO of the given peer. Updates the HELLO if it was already
- * cached before
- *
- * @param id the peer identity of the peer whose HELLO has to be cached
- * @param hello the HELLO message
- */
-void
-TESTBED_hello_cache_add (const struct GNUNET_PeerIdentity *id,
-                         const struct GNUNET_MessageHeader *hello);
-
-
-/**
- * Initializes the cache
- *
- * @param size the size of the cache
- */
-void
-TESTBED_cache_init (unsigned int size);
-
-
-/**
- * Clear cache
- */
-void
-TESTBED_cache_clear ();
+GST_destroy_peer (struct Peer *peer);
 
 
 /**
@@ -687,7 +655,7 @@ TESTBED_cache_clear ();
  *           is found
  */
 struct Route *
-TESTBED_find_dest_route (uint32_t host_id);
+GST_find_dest_route (uint32_t host_id);
 
 
 /**
@@ -698,24 +666,23 @@ TESTBED_find_dest_route (uint32_t host_id);
  * @param message the actual message
  */
 void
-TESTBED_handle_overlay_connect (void *cls, struct GNUNET_SERVER_Client *client,
-                                const struct GNUNET_MessageHeader *message);
+GST_handle_overlay_connect (void *cls, struct GNUNET_SERVER_Client *client,
+                            const struct GNUNET_MessageHeader *message);
 
 
 /**
  * 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 
+ *          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
-TESTBED_queue_host_registration (struct Slave *slave,
-                                 GNUNET_TESTBED_HostRegistrationCompletion cb,
-                                 void *cb_cls,
-                                 struct GNUNET_TESTBED_Host *host);
+GST_queue_host_registration (struct Slave *slave,
+                             GNUNET_TESTBED_HostRegistrationCompletion cb,
+                             void *cb_cls, struct GNUNET_TESTBED_Host *host);
 
 
 /**
@@ -725,8 +692,8 @@ TESTBED_queue_host_registration (struct Slave *slave,
  * @param msg the message to relay
  */
 void
-TESTBED_forwarded_operation_reply_relay (void *cls,
-                                         const struct GNUNET_MessageHeader *msg);
+GST_forwarded_operation_reply_relay (void *cls,
+                                     const struct GNUNET_MessageHeader *msg);
 
 
 /**
@@ -736,8 +703,8 @@ TESTBED_forwarded_operation_reply_relay (void *cls,
  * @param tc the task context from scheduler
  */
 void
-TESTBED_forwarded_operation_timeout (void *cls,
-                                     const struct GNUNET_SCHEDULER_TaskContext *tc);
+GST_forwarded_operation_timeout (void *cls,
+                                 const struct GNUNET_SCHEDULER_TaskContext *tc);
 
 
 /**
@@ -748,8 +715,8 @@ TESTBED_forwarded_operation_timeout (void *cls,
  * @param emsg the error message; can be NULL
  */
 void
-TESTBED_send_operation_fail_msg (struct GNUNET_SERVER_Client *client,
-                                 uint64_t operation_id, const char *emsg);
+GST_send_operation_fail_msg (struct GNUNET_SERVER_Client *client,
+                             uint64_t operation_id, const char *emsg);
 
 
 /**
@@ -760,10 +727,9 @@ TESTBED_send_operation_fail_msg (struct GNUNET_SERVER_Client *client,
  * @param message the actual message
  */
 void
-TESTBED_handle_overlay_request_connect (void *cls,
-                                        struct GNUNET_SERVER_Client *client, 
-                                        const struct GNUNET_MessageHeader
-                                        *message);
+GST_handle_remote_overlay_connect (void *cls,
+                                   struct GNUNET_SERVER_Client *client,
+                                   const struct GNUNET_MessageHeader *message);
 
 
 /**
@@ -772,7 +738,7 @@ TESTBED_handle_overlay_request_connect (void *cls,
  * @param rhc the RegisteredHostContext
  */
 void
-TESTBED_process_next_focc (struct RegisteredHostContext *rhc);
+GST_process_next_focc (struct RegisteredHostContext *rhc);
 
 
 /**
@@ -781,22 +747,165 @@ TESTBED_process_next_focc (struct RegisteredHostContext *rhc);
  * @param focc the ForwardedOverlayConnectContext to cleanup
  */
 void
-TESTBED_cleanup_focc (struct ForwardedOverlayConnectContext *focc);
+GST_cleanup_focc (struct ForwardedOverlayConnectContext *focc);
 
 
 /**
  * Clears all pending overlay connect contexts in queue
  */
 void
-TESTBED_free_occq ();
+GST_free_occq ();
 
 
 /**
  * Clears all pending remote overlay connect contexts in queue
  */
 void
-TESTBED_free_roccq ();
+GST_free_roccq ();
+
+
+/**
+ * Initializes the cache
+ *
+ * @param size the size of the cache
+ */
+void
+GST_cache_init (unsigned int size);
+
+
+/**
+ * Clear cache
+ */
+void
+GST_cache_clear ();
+
 
+/**
+ * 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 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);
+
+
+/**
+ * Functions of this type are called when the needed handle is available for
+ * usage. These functions are to be registered with either of the functions
+ * GST_cache_get_handle_transport() or GST_cache_get_handle_core(). The
+ * corresponding handles will be set and if they are not, then it signals an
+ * error while opening the handles.
+ *
+ * @param cls the closure passed to GST_cache_get_handle_transport() or
+ *          GST_cache_get_handle_core()
+ * @param ch the handle to CORE. Can be NULL if it is not requested
+ * @param th the handle to TRANSPORT. Can be NULL if it is not requested
+ * @param peer_id the identity of the peer. Will be NULL if ch is NULL. In other
+ *          cases, its value being NULL means that CORE connection has failed.
+ */
+typedef void (*GST_cache_handle_ready_cb) (void *cls,
+                                           struct GNUNET_CORE_Handle * ch,
+                                           struct GNUNET_TRANSPORT_Handle * th,
+                                           const struct GNUNET_PeerIdentity *
+                                           peer_id);
+
+
+/**
+ * Callback to notify when the target peer given to
+ * GST_cache_get_handle_transport() is connected. Note that this callback may
+ * not be called if the target peer is already connected. Use
+ * GNUNET_TRANSPORT_check_neighbour_connected() to check if the target peer is
+ * already connected or not. This callback will be called only once or never (in
+ * case the target cannot be connected).
+ *
+ * @param cls the closure given to GST_cache_get_handle_done() for this callback
+ * @param target the peer identity of the target peer. The pointer should be
+ *          valid until GST_cache_get_handle_done() is called.
+ */
+typedef void (*GST_cache_peer_connect_notify) (void *cls,
+                                               const struct GNUNET_PeerIdentity
+                                               * target);
+
+
+/**
+ * Get a transport handle with the given configuration. If the handle is already
+ * cached before, it will be retured in the given callback; the peer_id is used to lookup in the
+ * cache. If not a new operation is started to open the transport handle and
+ * will be given in the callback when it is available.
+ *
+ * @param peer_id the index of the peer
+ * @param cfg the configuration with which the transport handle has to be
+ *          created if it was not present in the cache
+ * @param cb the callback to notify when the transport handle is available
+ * @param cb_cls the closure for the above callback
+ * @param target the peer identify of the peer whose connection to our TRANSPORT
+ *          subsystem will be notified through the connect_notify_cb. Can be NULL
+ * @param connect_notify_cb the callback to call when the given target peer is
+ *          connected. This callback will only be called once or never again (in
+ *          case the target peer cannot be connected). Can be NULL
+ * @param connect_notify_cb_cls the closure for the above callback
+ * @return the handle which can be used cancel or mark that the handle is no
+ *           longer being used
+ */
+struct GSTCacheGetHandle *
+GST_cache_get_handle_transport (unsigned int peer_id,
+                                const struct GNUNET_CONFIGURATION_Handle *cfg,
+                                GST_cache_handle_ready_cb cb, void *cb_cls,
+                                const struct GNUNET_PeerIdentity *target,
+                                GST_cache_peer_connect_notify connect_notify_cb,
+                                void *connect_notify_cb_cls);
+
+
+/**
+ * Get a CORE handle with the given configuration. If the handle is already
+ * cached before, it will be retured in the given callback; the peer_id is used
+ * to lookup in the cache. If the handle is not cached before, a new operation
+ * is started to open the CORE handle and will be given in the callback when it
+ * is available along with the peer identity
+ *
+ * @param peer_id the index of the peer
+ * @param cfg the configuration with which the transport handle has to be
+ *          created if it was not present in the cache
+ * @param cb the callback to notify when the transport handle is available
+ * @param cb_cls the closure for the above callback
+ * @param target the peer identify of the peer whose connection to our CORE
+ *          subsystem will be notified through the connect_notify_cb. Can be NULL
+ * @param connect_notify_cb the callback to call when the given target peer is
+ *          connected. This callback will only be called once or never again (in
+ *          case the target peer cannot be connected). Can be NULL
+ * @param connect_notify_cb_cls the closure for the above callback
+ * @return the handle which can be used cancel or mark that the handle is no
+ *           longer being used
+ */
+struct GSTCacheGetHandle *
+GST_cache_get_handle_core (unsigned int peer_id,
+                           const struct GNUNET_CONFIGURATION_Handle *cfg,
+                           GST_cache_handle_ready_cb cb, void *cb_cls,
+                           const struct GNUNET_PeerIdentity *target,
+                           GST_cache_peer_connect_notify connect_notify_cb,
+                           void *connect_notify_cb_cls);
+
+
+/**
+ * Mark the GetCacheHandle as being done if a handle has been provided already
+ * or as being cancelled if the callback for the handle hasn't been called.
+ *
+ * @param cgh the CacheGetHandle handle
+ */
+void
+GST_cache_get_handle_done (struct GSTCacheGetHandle *cgh);
+
 /* End of gnunet-service-testbed.h */