*/
/**
- * @file experimentation/gnunet-daemon-experimentation.c
+ * @file experimentation/gnunet-daemon-experimentation.h
* @brief experimentation daemon
* @author Christian Grothoff
* @author Matthias Wachs
#include "gnunet_core_service.h"
#include "gnunet_statistics_service.h"
-#define EXP_RESPONSE_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10)
+
+/**
+ * Timeout between request and expected response
+ */
+#define EXP_RESPONSE_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
+
+/**
+ * Default experiment frequency
+ */
+#define EXP_DEFAULT_EXP_FREQ GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 6)
+
+/**
+ * Default experiment duration
+ */
+#define EXP_DEFAULT_EXP_DUR GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
+
+/**
+ * Statistics handle shared between components
+ */
+extern struct GNUNET_STATISTICS_Handle *GSE_stats;
+
+
+/**
+ * Configuration handle shared between components
+ */
+extern struct GNUNET_CONFIGURATION_Handle *GSE_cfg;
+
+
+/**
+ * Capability value shared between components
+ */
+extern uint32_t GSE_node_capabilities;
+
+
+extern uint32_t GSE_my_issuer_count;
+
+extern struct Experimentation_Issuer *GSE_my_issuer;
+
+/**
+ * Capabilities a node has or an experiment requires
+ */
+enum GNUNET_EXPERIMENTATION_capabilities
+{
+ NONE = 0,
+ PLUGIN_TCP = 1,
+ PLUGIN_UDP = 2,
+ PLUGIN_UNIX = 4,
+ PLUGIN_HTTP_CLIENT = 8,
+ PLUGIN_HTTP_SERVER = 16,
+ PLUGIN_HTTPS_CLIENT = 32,
+ PLUGIN_HTTPS_SERVER = 64,
+ PLUGIN_WLAN = 128,
+ HAVE_IPV6 = 256,
+ BEHIND_NAT = 512
+};
+
+
+/**
+ * Struct to store information about a specific experiment
+ */
+struct Experiment
+{
+ /* Header */
+ /* ----------------- */
+ char *name;
+
+ /* Experiment issuer */
+ struct GNUNET_PeerIdentity issuer;
+
+ /* Experiment version as timestamp of creation */
+ struct GNUNET_TIME_Absolute version;
+
+ /* Description */
+ char *description;
+
+ /* Required capabilities */
+ uint32_t required_capabilities;
+
+ /* Experiment timing */
+ /* ----------------- */
+
+ /* When to start experiment */
+ struct GNUNET_TIME_Absolute start;
+
+ /* When to end experiment */
+ struct GNUNET_TIME_Absolute stop;
+
+ /* How often to run experiment */
+ struct GNUNET_TIME_Relative frequency;
+
+ /* How long to run each execution */
+ struct GNUNET_TIME_Relative duration;
+
+
+ /* Experiment itself */
+ /* ----------------- */
+
+ /* TBD */
+};
+
+
/**
* A experimentation node
*/
struct Node
{
+ /**
+ * Peer id
+ */
struct GNUNET_PeerIdentity id;
+ /**
+ * Task for response timeout
+ */
GNUNET_SCHEDULER_TaskIdentifier timeout_task;
+ /**
+ * Core transmission handle
+ */
struct GNUNET_CORE_TransmitHandle *cth;
+
+ /**
+ * Node capabilities
+ */
+ uint32_t capabilities;
+
+ /* Experiment version as timestamp of creation */
+ struct GNUNET_TIME_Absolute version;
+
+ uint32_t issuer_count;
+
+ /**
+ * Array of fssuer ids
+ */
+ struct GNUNET_PeerIdentity *issuer_id;
};
+struct Experimentation_Issuer
+{
+ struct GNUNET_PeerIdentity issuer_id;
+};
+/**
+ * Experimentation request message
+ * Used to detect experimentation capability
+ *
+ * This struct is followed by issuer identities:
+ * (issuer_count * struct Experimentation_Request_Issuer)
+ *
+ */
struct Experimentation_Request
{
struct GNUNET_MessageHeader msg;
+
+ uint32_t capabilities;
+
+ uint32_t issuer_count;
};
+/**
+ * Experimentation response message
+ * Sent if peer is running the daemon
+ *
+ * This struct is followed by issuer identities:
+ * (issuer_count * struct Experimentation_Request_Issuer)
+ */
struct Experimentation_Response
{
struct GNUNET_MessageHeader msg;
+
+ uint32_t capabilities;
+
+ uint32_t issuer_count;
};
+void
+GNUNET_EXPERIMENT_nodes_request_start (struct Node *n, struct Experiment *e);
+
/**
- * The main function for the experimentation daemon.
- *
- * @param argc number of arguments from the command line
- * @param argv command line arguments
+ * Start the nodes management
*/
void
-GNUNET_EXPERIMENTATION_nodes_start (const struct GNUNET_CONFIGURATION_Handle *cfg);
+GNUNET_EXPERIMENTATION_nodes_start ();
+
+/**
+ * Stop the nodes management
+ */
void
GNUNET_EXPERIMENTATION_nodes_stop ();
-/* end of gnunet-daemon-experimentation.c */
+
+/**
+ * Print a single capability value
+ *
+ * @param cap capability value
+ * @return the string to print
+ */
+const char *
+GNUNET_EXPERIMENTATION_capability_to_str (uint32_t cap);
+
+
+/**
+ * Are the capabilities provided?
+ *
+ * @param have bitstring containing the provided capabilities
+ * @param desired bitstring containing the desired capabilities\
+ * @return GNUNET_YES or GNUNET_NO
+ */
+int
+GNUNET_EXPERIMENTATION_capabilities_have (uint32_t have, uint32_t desired);
+
+
+/**
+ * Start the detecting capabilities
+ */
+void
+GNUNET_EXPERIMENTATION_capabilities_start ();
+
+
+/**
+ * Stop the detecting capabilities
+ */
+void
+GNUNET_EXPERIMENTATION_capabilities_stop ();
+
+
+/**
+ * Start experiments management
+ *
+ * @return GNUNET_YES or GNUNET_NO
+ */
+int
+GNUNET_EXPERIMENTATION_experiments_issuer_accepted (struct GNUNET_PeerIdentity *issuer_ID);
+
+
+typedef void (*GNUNET_EXPERIMENTATION_experiments_get_cb) (struct Node *n, struct Experiment *e);
+
+void
+GNUNET_EXPERIMENTATION_experiments_get (struct Node *n,
+ struct GNUNET_PeerIdentity *issuer,
+ GNUNET_EXPERIMENTATION_experiments_get_cb get_cb);
+
+/**
+ * Start experiments management
+ *
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
+ */
+int
+GNUNET_EXPERIMENTATION_experiments_start ();
+
+
+/**
+ * Stop experiments management
+ */
+void
+GNUNET_EXPERIMENTATION_experiments_stop ();
+
+
+/**
+ * Start the scheduler component
+ */
+void
+GNUNET_EXPERIMENTATION_scheduler_add (struct Node *n, struct Experiment *e);
+
+/**
+ * Start the scheduler component
+ */
+void
+GNUNET_EXPERIMENTATION_scheduler_start ();
+
+
+/**
+ * Stop the scheduler component
+ */
+void
+GNUNET_EXPERIMENTATION_scheduler_stop ();
+
+
+/**
+ * Start the storage component
+ */
+void
+GNUNET_EXPERIMENTATION_storage_start ();
+
+
+
+/**
+ * Stop the storage component
+ */
+void
+GNUNET_EXPERIMENTATION_storage_stop ();
+
+
+/* end of gnunet-daemon-experimentation.h */