migrating towards XDG configuration specification (#3000)
[oweals/gnunet.git] / src / experimentation / gnunet-daemon-experimentation.h
index c6fc670f4ca6b300fb7ff924d8f3da383825669e..86e41a114313dbe3d0bc11e7e821e385e1303ccf 100644 (file)
  */
 extern struct GNUNET_STATISTICS_Handle *GED_stats;
 
-
 /**
  * Configuration handle shared between components
  */
 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
 };
 
 
@@ -92,89 +86,105 @@ enum GNUNET_EXPERIMENTATION_capabilities
  */
 struct Experiment
 {
-       /* Header */
-       /* ----------------- */
-       char *name;
-
-       /* Experiment issuer */
-       struct GNUNET_PeerIdentity issuer;
+  /* Header */
+  /* ----------------- */
+  char *name;
+
+  /**
+   * Experiment issuer
+   */
+  struct GNUNET_CRYPTO_EccPublicSignKey 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_EccPublicSignKey *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 ExperimentStartCtx *e_req_head;
-       struct ExperimentStartCtx *e_req_tail;
-};
-
-struct Experimentation_Issuer
-{
-       struct GNUNET_PeerIdentity issuer_id;
-};
-
 GNUNET_NETWORK_STRUCT_BEGIN
 
 /**
@@ -182,35 +192,52 @@ GNUNET_NETWORK_STRUCT_BEGIN
  * Used to detect experimentation capability
  *
  * This struct is followed by issuer identities:
- * (issuer_count * struct Experimentation_Request_Issuer)
+ * (issuer_count * struct GNUNET_CRYPTO_EccPublicSignKey)
  *
  */
 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_EccPublicSignKey)
  */
 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;
 };
 
 
+/**
+ * Struct to store information about an experiment issuer
+ */
+struct Issuer
+{
+  struct GNUNET_CRYPTO_EccPublicSignKey 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
  *
@@ -218,50 +245,64 @@ struct Experimentation_Response
  */
 struct GED_start_message
 {
-       struct GNUNET_MessageHeader header;
-
-       /**
-        * String length of experiment name following the struct
-        */
-       uint32_t len_name;
-
-       /* Experiment issuer */
-       struct GNUNET_PeerIdentity issuer;
-
-       /* Experiment version as timestamp of creation */
-       struct GNUNET_TIME_AbsoluteNBO version_nbo;
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * String length of experiment name following the struct
+   */
+  uint32_t len_name GNUNET_PACKED;
+
+  /**
+   * Experiment issuer
+   */
+  struct GNUNET_CRYPTO_EccPublicSignKey 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;
-
-       /* Experiment issuer */
-       struct GNUNET_PeerIdentity issuer;
-
-       /* Experiment version as timestamp of creation */
-       struct GNUNET_TIME_AbsoluteNBO version_nbo;
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * String length of experiment name following the struct
+   */
+  uint32_t len_name GNUNET_PACKED;
+
+  /**
+   * Experiment issuer
+   */
+  struct GNUNET_CRYPTO_EccPublicSignKey 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;
-
-       /* Experiment issuer */
-       struct GNUNET_PeerIdentity issuer;
-
-       /* Experiment version as timestamp of creation */
-       struct GNUNET_TIME_AbsoluteNBO version_nbo;
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * String length of experiment name following the struct
+   */
+  uint32_t len_name GNUNET_PACKED;
+
+  /**
+   * Experiment issuer
+   */
+  struct GNUNET_CRYPTO_EccPublicSignKey issuer;
+
+  /**
+   * Experiment version as timestamp of creation
+   */
+  struct GNUNET_TIME_AbsoluteNBO version_nbo;
 };
 
 GNUNET_NETWORK_STRUCT_END
@@ -270,22 +311,31 @@ GNUNET_NETWORK_STRUCT_END
 int
 GED_nodes_rts (struct Node *n);
 
+
 int
-GED_nodes_request_start (struct Node *n, struct Experiment *e);
+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
-GED_nodes_start ();
+GED_nodes_start (void);
 
 
 /**
  * Stop the nodes management
  */
 void
-GED_nodes_stop ();
+GED_nodes_stop (void);
 
 
 /**
@@ -303,7 +353,7 @@ 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
 GED_capabilities_have (uint32_t have, uint32_t desired);
@@ -313,23 +363,23 @@ GED_capabilities_have (uint32_t have, uint32_t desired);
  * Start the detecting capabilities
  */
 void
-GED_capabilities_start ();
+GED_capabilities_start (void);
 
 
 /**
  * Stop the detecting capabilities
  */
 void
-GED_capabilities_stop ();
+GED_capabilities_stop (void);
 
 
 /**
  * Start experiments management
  *
- * @return GNUNET_YES or GNUNET_NO
+ * @return #GNUNET_YES or #GNUNET_NO
  */
 int
-GED_experiments_issuer_accepted (struct GNUNET_PeerIdentity *issuer_ID);
+GED_experiments_issuer_accepted (const struct GNUNET_CRYPTO_EccPublicSignKey *issuer_ID);
 
 
 /*
@@ -341,33 +391,36 @@ GED_experiments_issuer_accepted (struct GNUNET_PeerIdentity *issuer_ID);
  * @return the experiment or NULL if not found
  */
 struct Experiment *
-GED_experiments_find (const struct GNUNET_PeerIdentity *issuer,
-                                                                                       const char *name,
-                                                                                       const struct GNUNET_TIME_Absolute version);
+GED_experiments_find (const struct GNUNET_CRYPTO_EccPublicSignKey *issuer,
+                     const char *name,
+                     const struct GNUNET_TIME_Absolute version);
 
 
-typedef void (*GNUNET_EXPERIMENTATION_experiments_get_cb) (struct Node *n, struct Experiment *e);
+typedef void (*GNUNET_EXPERIMENTATION_experiments_get_cb) (struct Node *n,
+                                                          struct Experiment *e);
 
 
 void
 GED_experiments_get (struct Node *n,
-                                                                                                                                                               struct GNUNET_PeerIdentity *issuer,
-                                                                                                                                                               GNUNET_EXPERIMENTATION_experiments_get_cb get_cb);
+                    struct GNUNET_CRYPTO_EccPublicSignKey *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
-GED_experiments_start ();
+GED_experiments_start (void);
 
 
 /**
  * Stop experiments management
  */
 void
-GED_experiments_stop ();
+GED_experiments_stop (void);
+
 
 /**
  * Handle a START message from a remote node
@@ -388,6 +441,7 @@ GED_scheduler_handle_start (struct Node *n, struct Experiment *e);
 void
 GED_scheduler_handle_start_ack (struct Node *n, struct Experiment *e);
 
+
 /**
  * Handle a STOP message from a remote node
  *
@@ -399,38 +453,44 @@ GED_scheduler_handle_stop (struct Node *n, struct Experiment *e);
 
 
 /**
- * Start the scheduler component
+ * 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);
+GED_scheduler_add (struct Node *n,
+                  struct Experiment *e,
+                  int outbound);
+
 
 /**
  * Start the scheduler component
  */
 void
-GED_scheduler_start ();
+GED_scheduler_start (void);
 
 
 /**
  * Stop the scheduler component
  */
 void
-GED_scheduler_stop ();
+GED_scheduler_stop (void);
 
 
 /**
  * Start the storage component
  */
 void
-GED_storage_start ();
-
+GED_storage_start (void);
 
 
 /**
  * Stop the storage component
  */
 void
-GED_storage_stop ();
+GED_storage_stop (void);
 
 
 /* end of gnunet-daemon-experimentation.h */