/*
This file is part of GNUnet.
- (C) 2012 Christian Grothoff (and other contributing authors)
+ (C) 2008--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
#include "testbed_api_operations.h"
#include "testbed_api_hosts.h"
#include "gnunet_testing_lib.h"
+#include "gnunet-service-testbed_links.h"
/**
};
-/**
- * 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;
-
- /**
- * 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 GNUNET_MessageHeader *orig_msg;
+ /**
+ * The client handle
+ */
+ struct GNUNET_SERVER_Client *client;
+
/**
* The id of the operation which created this context information
*/
};
-/**
- * The type for data structures which commonly arrive at the slave_event_callback
- */
-enum ClosureType
-{
- /**
- * Type for RegisteredHostContext closures
- */
- CLOSURE_TYPE_RHC = 1,
-
- /**
- * Type for LinkControllersForwardingContext closures
- */
- CLOSURE_TYPE_LCF
-};
-
-
/**
* This context information will be created for each host that is registered at
* slave controllers during overlay connects.
*/
struct RegisteredHostContext
{
- /**
- * The type of this data structure. Set this to CLOSURE_TYPE_RHC
- */
- enum ClosureType type;
-
/**
* The host which is being registered
*/
*/
struct GNUNET_TESTBED_Host *host;
- /**
- * The gateway to which this operation is forwarded to
- */
- struct Slave *gateway;
-
- /**
- * The gateway through which peer2's controller can be reached
- */
- struct Slave *gateway2;
-
- /**
- * Handle for sub-operations
- */
- struct GNUNET_TESTBED_Operation *sub_op;
-
- /**
- * The client which initiated the link controller operation
- */
- struct GNUNET_SERVER_Client *client;
-
/**
* Head of the ForwardedOverlayConnectContext DLL
*/
*/
RHC_INIT = 0,
- /**
- * 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,
-
/**
* State where we attempt to do the overlay connection again
*/
- RHC_OL_CONNECT
+ RHC_DONE
} state;
};
-/**
- * States of LCFContext
- */
-enum LCFContextState
-{
- /**
- * The Context has been initialized; Nothing has been done on it
- */
- INIT,
-
- /**
- * 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
-};
-
-
-/**
- * Link controllers request forwarding context
- */
-struct LCFContext
-{
- /**
- * The type of this data structure. Set this to CLOSURE_TYPE_LCF
- */
- enum ClosureType type;
-
- /**
- * The gateway which will pass the link message to delegated host
- */
- struct Slave *gateway;
-
- /**
- * The client which has asked to perform this operation
- */
- struct GNUNET_SERVER_Client *client;
-
- /**
- * Handle for operations which are forwarded while linking controllers
- */
- struct GNUNET_TESTBED_Operation *op;
-
- /**
- * The configuration which has to be either used as a template while starting
- * the delegated controller or for connecting to the delegated controller
- */
- struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * The timeout task
- */
- GNUNET_SCHEDULER_TaskIdentifier timeout_task;
-
- /**
- * The id of the operation which created this context
- */
- uint64_t operation_id;
-
- /**
- * should the slave controller start the delegated controller?
- */
- int is_subordinate;
-
- /**
- * The state of this context
- */
- enum LCFContextState state;
-
- /**
- * The delegated host
- */
- uint32_t delegated_host_id;
-
- /**
- * The slave host
- */
- uint32_t slave_host_id;
-
-};
-
-
-/**
- * Structure of a queue entry in LCFContext request queue
- */
-struct LCFContextQueue
-{
- /**
- * The LCFContext
- */
- struct LCFContext *lcf;
-
- /**
- * Head prt for DLL
- */
- struct LCFContextQueue *next;
-
- /**
- * Tail ptr for DLL
- */
- struct LCFContextQueue *prev;
-};
-
-
/**
* Context data for GNUNET_MESSAGE_TYPE_TESTBED_SHUTDOWN_PEERS handler
*/
/**
* Our configuration
*/
-struct GNUNET_CONFIGURATION_Handle *our_config;
+extern struct GNUNET_CONFIGURATION_Handle *our_config;
/**
* The master context; generated with the first INIT message
*/
extern struct GNUNET_TESTBED_Host **GST_host_list;
-/**
- * A list of directly linked neighbours
- */
-extern struct Slave **GST_slave_list;
-
/**
* Operation queue for open file descriptors
*/
extern unsigned int GST_host_list_size;
/**
- * The size of directly linked neighbours list
+ * The directory where to store load statistics data
*/
-extern unsigned int GST_slave_list_size;
+extern char *GST_stats_dir;
/**
- * The directory where to store load statistics data
+ * Condition to check if host id is valid
*/
-extern char *GST_stats_dir;
+#define VALID_HOST_ID(id) \
+ ( ((id) < GST_host_list_size) && (NULL != GST_host_list[id]) )
+
+/**
+ * Condition to check if peer id is valid
+ */
+#define VALID_PEER_ID(id) \
+ ( ((id) < GST_peer_list_size) && (NULL != GST_peer_list[id]) )
/**
const struct GNUNET_MessageHeader *message);
+/**
+ * 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 NULL
+ * @param client identification of the client
+ * @param message the actual message
+ */
+void
+GST_handle_peer_reconfigure (void *cls, struct GNUNET_SERVER_Client *client,
+ const struct GNUNET_MessageHeader *message);
+
+
/**
* Frees the ManageServiceContext queue
*/
GST_free_mctxq ();
+/**
+ * Cleans up the queue used for forwarding link controllers requests
+ */
+void
+GST_free_lcfq ();
+
+
+/**
+ * Cleans up the route list
+ */
+void
+GST_route_list_clear ();
+
+
/**
* Processes a forwarded overlay connect context in the queue of the given RegisteredHostContext
*
GST_free_roccq ();
+/**
+ * Cleans up the Peer reconfigure context list
+ */
+void
+GST_free_prcq ();
+
+
/**
* Initializes the cache
*