* @author Christian Grothoff
* @author Matthias Wachs
*/
+#ifndef GNUNET_DAEMON_EXPERIMENTATION_H
+#define GNUNET_DAEMON_EXPERIMENTATION_H
#include "platform.h"
#include "gnunet_getopt_lib.h"
#include "gnunet_util_lib.h"
/**
* Statistics handle shared between components
*/
-extern struct GNUNET_STATISTICS_Handle *GSE_stats;
-
+extern struct GNUNET_STATISTICS_Handle *GED_stats;
/**
* Configuration handle shared between components
*/
-extern struct GNUNET_CONFIGURATION_Handle *GSE_cfg;
-
+extern struct GNUNET_CONFIGURATION_Handle *GED_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
+ 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 Experiment
{
- /* Header */
- /* ----------------- */
- char *name;
-
- /* Experiment issuer */
- struct GNUNET_PeerIdentity issuer;
+ /* Header */
+ /* ----------------- */
+ char *name;
+
+ /**
+ * Experiment issuer
+ */
+ struct GNUNET_CRYPTO_EddsaPublicKey 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 */
+};
- /* Experiment version as timestamp of creation */
- struct GNUNET_TIME_Absolute version;
- /* Description */
- char *description;
+/**
+ * A experimentation node
+ */
+struct Node
+{
+ /**
+ * Peer id
+ */
+ struct GNUNET_PeerIdentity id;
- /* Required capabilities */
- uint32_t required_capabilities;
+ /**
+ * Task for response timeout
+ */
+ GNUNET_SCHEDULER_TaskIdentifier timeout_task;
- /* Experiment timing */
- /* ----------------- */
+ /**
+ * Core transmission handle
+ */
+ struct GNUNET_CORE_TransmitHandle *cth;
- /* When to start experiment */
- struct GNUNET_TIME_Absolute start;
+ /**
+ * Node capabilities
+ */
+ uint32_t capabilities;
- /* When to end experiment */
- struct GNUNET_TIME_Absolute stop;
+ /**
+ * Experiment version as timestamp of creation
+ */
+ struct GNUNET_TIME_Absolute version;
- /* How often to run experiment */
- struct GNUNET_TIME_Relative frequency;
+ struct NodeComCtx *e_req_head;
- /* How long to run each execution */
- struct GNUNET_TIME_Relative duration;
+ struct NodeComCtx *e_req_tail;
+ /**
+ * Array of issuers accepted by this neighbor.
+ */
+ struct GNUNET_CRYPTO_EddsaPublicKey *issuer_id;
- /* Experiment itself */
- /* ----------------- */
+ unsigned int issuer_count;
- /* 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;
-};
+GNUNET_NETWORK_STRUCT_BEGIN
/**
* Experimentation request message
* Used to detect experimentation capability
*
* This struct is followed by issuer identities:
- * (issuer_count * struct Experimentation_Request_Issuer)
+ * (issuer_count * struct GNUNET_CRYPTO_EddsaPublicKey)
*
*/
struct Experimentation_Request
{
- struct GNUNET_MessageHeader msg;
+ struct GNUNET_MessageHeader msg;
- uint32_t capabilities;
+ uint32_t capabilities GNUNET_PACKED;
- uint32_t issuer_count;
+ uint32_t issuer_count GNUNET_PACKED;
};
+
/**
* Experimentation response message
* Sent if peer is running the daemon
*
* This struct is followed by issuer identities:
- * (issuer_count * struct Experimentation_Request_Issuer)
+ * (issuer_count * struct GNUNET_CRYPTO_EddsaPublicKey)
*/
struct Experimentation_Response
{
- struct GNUNET_MessageHeader msg;
+ struct GNUNET_MessageHeader msg;
- uint32_t capabilities;
+ uint32_t capabilities GNUNET_PACKED;
- uint32_t issuer_count;
+ uint32_t issuer_count GNUNET_PACKED;
};
-void
-GNUNET_EXPERIMENT_nodes_request_start (struct Node *n, struct Experiment *e);
+/**
+ * Struct to store information about an experiment issuer
+ */
+struct Issuer
+{
+ struct GNUNET_CRYPTO_EddsaPublicKey pubkey;
+};
+
+
+/**
+ * Hashmap containing valid experiment issuers
+ * (the key is the hash of the respective public key,
+ * the values are of type `struct Issuer').
+ */
+struct GNUNET_CONTAINER_MultiHashMap *valid_issuers;
+
+/**
+ * Experiment start message
+ *
+ * struct is followed by string with length len_name
+ */
+struct GED_start_message
+{
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * String length of experiment name following the struct
+ */
+ uint32_t len_name GNUNET_PACKED;
+
+ /**
+ * Experiment issuer
+ */
+ struct GNUNET_CRYPTO_EddsaPublicKey issuer;
+
+ /**
+ * Experiment version as timestamp of creation
+ */
+ struct GNUNET_TIME_AbsoluteNBO version_nbo;
+};
+
+
+struct GED_start_ack_message
+{
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * String length of experiment name following the struct
+ */
+ uint32_t len_name GNUNET_PACKED;
+
+ /**
+ * Experiment issuer
+ */
+ struct GNUNET_CRYPTO_EddsaPublicKey issuer;
+
+ /**
+ * Experiment version as timestamp of creation
+ */
+ struct GNUNET_TIME_AbsoluteNBO version_nbo;
+};
+
+
+struct GED_stop_message
+{
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * String length of experiment name following the struct
+ */
+ uint32_t len_name GNUNET_PACKED;
+
+ /**
+ * Experiment issuer
+ */
+ struct GNUNET_CRYPTO_EddsaPublicKey issuer;
+
+ /**
+ * Experiment version as timestamp of creation
+ */
+ struct GNUNET_TIME_AbsoluteNBO version_nbo;
+};
+
+GNUNET_NETWORK_STRUCT_END
+
+
+int
+GED_nodes_rts (struct Node *n);
+
+
+int
+GED_nodes_send_start (struct Node *n, struct Experiment *e);
+
+
+/**
+ * Confirm a experiment START with a node
+ *
+ * @return #GNUNET_NO if core was busy with sending, #GNUNET_OK otherwise
+ */
+int
+GED_nodes_send_start_ack (struct Node *n, struct Experiment *e);
/**
* Start the nodes management
*/
void
-GNUNET_EXPERIMENTATION_nodes_start ();
+GED_nodes_start (void);
/**
* Stop the nodes management
*/
void
-GNUNET_EXPERIMENTATION_nodes_stop ();
+GED_nodes_stop (void);
/**
* @return the string to print
*/
const char *
-GNUNET_EXPERIMENTATION_capability_to_str (uint32_t cap);
+GED_capability_to_str (uint32_t cap);
/**
*
* @param have bitstring containing the provided capabilities
* @param desired bitstring containing the desired capabilities\
- * @return GNUNET_YES or GNUNET_NO
+ * @return #GNUNET_YES or #GNUNET_NO
*/
int
-GNUNET_EXPERIMENTATION_capabilities_have (uint32_t have, uint32_t desired);
+GED_capabilities_have (uint32_t have, uint32_t desired);
/**
* Start the detecting capabilities
*/
void
-GNUNET_EXPERIMENTATION_capabilities_start ();
+GED_capabilities_start (void);
/**
* Stop the detecting capabilities
*/
void
-GNUNET_EXPERIMENTATION_capabilities_stop ();
+GED_capabilities_stop (void);
/**
* Start experiments management
*
- * @return GNUNET_YES or GNUNET_NO
+ * @return #GNUNET_YES or #GNUNET_NO
*/
int
-GNUNET_EXPERIMENTATION_experiments_issuer_accepted (struct GNUNET_PeerIdentity *issuer_ID);
+GED_experiments_issuer_accepted (const struct GNUNET_CRYPTO_EddsaPublicKey *issuer_ID);
-typedef void (*GNUNET_EXPERIMENTATION_experiments_get_cb) (struct Node *n, struct Experiment *e);
+/*
+ * Find an experiment based on issuer name and version
+ *
+ * @param issuer the issuer
+ * @param name experiment name
+ * @param version experiment version
+ * @return the experiment or NULL if not found
+ */
+struct Experiment *
+GED_experiments_find (const struct GNUNET_CRYPTO_EddsaPublicKey *issuer,
+ const char *name,
+ const struct GNUNET_TIME_Absolute version);
+
+
+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);
+GED_experiments_get (struct Node *n,
+ struct GNUNET_CRYPTO_EddsaPublicKey *issuer,
+ GNUNET_EXPERIMENTATION_experiments_get_cb get_cb);
+
/**
* Start experiments management
*
- * @return GNUNET_OK on success, GNUNET_SYSERR on error
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
*/
int
-GNUNET_EXPERIMENTATION_experiments_start ();
+GED_experiments_start (void);
/**
* Stop experiments management
*/
void
-GNUNET_EXPERIMENTATION_experiments_stop ();
+GED_experiments_stop (void);
/**
- * Start the scheduler component
+ * Handle a START message from a remote node
+ *
+ * @param n the node
+ * @param e the experiment
*/
void
-GNUNET_EXPERIMENTATION_scheduler_add (struct Node *n, struct Experiment *e);
+GED_scheduler_handle_start (struct Node *n, struct Experiment *e);
+
+
+/**
+ * Handle a START_ACL message from a remote node
+ *
+ * @param n the node
+ * @param e the experiment
+ */
+void
+GED_scheduler_handle_start_ack (struct Node *n, struct Experiment *e);
+
+
+/**
+ * Handle a STOP message from a remote node
+ *
+ * @param n the node
+ * @param e the experiment
+ */
+void
+GED_scheduler_handle_stop (struct Node *n, struct Experiment *e);
+
+
+/**
+ * Add a new experiment for a node
+ *
+ * @param n the node
+ * @param e the experiment
+ * @param outbound are we initiator (#GNUNET_YES) or client (#GNUNET_NO)?
+ */
+void
+GED_scheduler_add (struct Node *n,
+ struct Experiment *e,
+ int outbound);
+
/**
* Start the scheduler component
*/
void
-GNUNET_EXPERIMENTATION_scheduler_start ();
+GED_scheduler_start (void);
/**
* Stop the scheduler component
*/
void
-GNUNET_EXPERIMENTATION_scheduler_stop ();
+GED_scheduler_stop (void);
/**
* Start the storage component
*/
void
-GNUNET_EXPERIMENTATION_storage_start ();
-
+GED_storage_start (void);
/**
* Stop the storage component
*/
void
-GNUNET_EXPERIMENTATION_storage_stop ();
+GED_storage_stop (void);
+#endif /* #ifndef GNUNET_DAEMON_EXPERIMENTATION_H */
/* end of gnunet-daemon-experimentation.h */