-towards fixing FTBFS in experimentation
[oweals/gnunet.git] / src / experimentation / gnunet-daemon-experimentation.h
index a8bfc3523c69b5c5c1ef6a03933f6b0cceb4199a..838d06b698a6ed2d36f248c71a89def29678bcec 100644 (file)
 /**
  * Timeout between request and expected response
  */
-#define EXP_RESPONSE_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10)
+#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;
+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;
 
 
 /**
@@ -55,6 +64,10 @@ extern struct GNUNET_CONFIGURATION_Handle *GSE_cfg;
 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
  */
@@ -74,6 +87,50 @@ enum GNUNET_EXPERIMENTATION_capabilities
 };
 
 
+/**
+ * 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
  */
@@ -94,44 +151,148 @@ struct Node
         */
        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 NodeComCtx *e_req_head;
+       struct NodeComCtx *e_req_tail;
+};
+
+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)
+ *
  */
 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;
+};
+
+
+/**
+ * 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;
+
+       /* Experiment issuer */
+       struct GNUNET_PeerIdentity 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 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;
+};
+
+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 ();
 
 
 /**
  * Stop the nodes management
  */
 void
-GNUNET_EXPERIMENTATION_nodes_stop ();
+GED_nodes_stop ();
 
 
 /**
@@ -141,7 +302,7 @@ GNUNET_EXPERIMENTATION_nodes_stop ();
  * @return the string to print
  */
 const char *
-GNUNET_EXPERIMENTATION_capability_to_str (uint32_t cap);
+GED_capability_to_str (uint32_t cap);
 
 
 /**
@@ -152,21 +313,21 @@ GNUNET_EXPERIMENTATION_capability_to_str (uint32_t cap);
  * @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 ();
 
 
 /**
  * Stop the detecting capabilities
  */
 void
-GNUNET_EXPERIMENTATION_capabilities_stop ();
+GED_capabilities_stop ();
 
 
 /**
@@ -175,30 +336,104 @@ GNUNET_EXPERIMENTATION_capabilities_stop ();
  * @return GNUNET_YES or GNUNET_NO
  */
 int
-GNUNET_EXPERIMENTATION_experiments_issuer_accepted (struct GNUNET_PeerIdentity *issuer_ID);
+GED_experiments_issuer_accepted (struct GNUNET_PeerIdentity *issuer_ID);
 
 
+/*
+ * 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_PeerIdentity *issuer,
+                                                                                       const char *name,
+                                                                                       const struct GNUNET_TIME_Absolute version);
+
+
+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);
+
 /**
  * Start experiments management
  *
  * @return GNUNET_OK on success, GNUNET_SYSERR on error
  */
 int
-GNUNET_EXPERIMENTATION_experiments_start ();
+GED_experiments_start ();
 
 
 /**
  * Stop experiments management
  */
 void
-GNUNET_EXPERIMENTATION_experiments_stop ();
+GED_experiments_stop ();
+
+/**
+ * Handle a START message from a remote node
+ *
+ * @param n the node
+ * @param e the experiment
+ */
+void
+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
+GED_scheduler_start ();
+
+
+/**
+ * Stop the scheduler component
+ */
+void
+GED_scheduler_stop ();
 
 
 /**
  * Start the storage component
  */
 void
-GNUNET_EXPERIMENTATION_storage_start ();
+GED_storage_start ();
 
 
 
@@ -206,7 +441,7 @@ GNUNET_EXPERIMENTATION_storage_start ();
  * Stop the storage component
  */
 void
-GNUNET_EXPERIMENTATION_storage_stop ();
+GED_storage_stop ();
 
 
 /* end of gnunet-daemon-experimentation.h */