Merge branch 'master' of ssh://gnunet.org/gnunet
[oweals/gnunet.git] / src / ats / gnunet-ats-solver-eval.h
index 8c8e1c459ce788492b588ff524cf92273ab1bbfe..92693bd38ed583601af6b9ff409c3a7cd5aed006 100644 (file)
@@ -1,21 +1,19 @@
 /*
  This file is part of GNUnet.
- (C) 2010-2013 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2010-2013 GNUnet e.V.
 
- GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 3, or (at your
- option) any later version.
+ GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
 
  GNUnet is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- General Public License for more details.
Affero General Public License for more details.
 
- You should have received a copy of the GNU General Public License
- along with GNUnet; see the file COPYING.  If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
+ You should have received a copy of the GNU Affero General Public License
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 /**
  * @file ats-tests/ats-testing-experiment.c
@@ -23,6 +21,9 @@
  * @author Christian Grothoff
  * @author Matthias Wachs
  */
+#ifndef GNUNET_ATS_SOLVER_EVAL_H
+#define GNUNET_ATS_SOLVER_EVAL_H
+
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_ats_plugin.h"
@@ -67,7 +68,7 @@ struct SolverHandle
   /**
    * Solver handle
    */
-  void *solver;
+  struct GNUNET_ATS_SolverFunctions *sf;
 
   /**
    * Address hashmap
@@ -82,17 +83,99 @@ enum GNUNET_ATS_Solvers
   GNUNET_ATS_SOLVER_RIL,
 };
 
+struct LoggingFileHandle
+{
+  /* DLL list for logging time steps */
+  struct LoggingFileHandle *next;
+  struct LoggingFileHandle *prev;
+
+  /* peer id */
+  long long unsigned int pid;
+
+  /* address id */
+  long long unsigned int aid;
+
+  struct GNUNET_DISK_FileHandle *f_hd;
+
+};
+
+struct LoggingTimeStep
+{
+  struct LoggingTimeStep *prev;
+  struct LoggingTimeStep *next;
+
+  struct LoggingPeer *head;
+  struct LoggingPeer *tail;
+
+  struct GNUNET_TIME_Absolute timestamp;
+  struct GNUNET_TIME_Relative delta;
+};
+
+struct LoggingPeer
+{
+  struct LoggingPeer *prev;
+  struct LoggingPeer *next;
+
+  long long unsigned int id;
+  struct GNUNET_PeerIdentity peer_id;
+  double pref_abs[GNUNET_ATS_PREFERENCE_END];
+  double pref_norm[GNUNET_ATS_PREFERENCE_END];
+  int is_requested;
+
+  struct LoggingAddress *addr_head;
+  struct LoggingAddress *addr_tail;
+};
+
+struct LoggingAddress
+{
+  struct LoggingAddress *next;
+  struct LoggingAddress *prev;
+
+  long long unsigned int aid;
+  int active;
+  uint32_t network;
+  uint32_t assigned_bw_in;
+  uint32_t assigned_bw_out;
+
+  double prop_abs[GNUNET_ATS_PropertyCount];
+  double prop_norm[GNUNET_ATS_PropertyCount];
+};
+
 
 struct TestPeer
 {
   struct TestPeer *prev;
   struct TestPeer *next;
 
-  int id;
+
+  long long unsigned int id;
+  int is_requested;
   struct GNUNET_PeerIdentity peer_id;
+
+  double pref_abs[GNUNET_ATS_PreferenceCount];
+  double pref_norm[GNUNET_ATS_PreferenceCount];
+
+  uint32_t assigned_bw_in;
+  uint32_t assigned_bw_out;
+
+  struct TestAddress *addr_head;
+  struct TestAddress *addr_tail;
 };
 
 
+struct TestAddress
+{
+  struct TestAddress *next;
+  struct TestAddress *prev;
+
+  long long unsigned int aid;
+  struct ATS_Address *ats_addr;
+  uint32_t network;
+
+  double prop_abs[GNUNET_ATS_PropertyCount];
+  double prop_norm[GNUNET_ATS_PropertyCount];
+};
+
 struct Episode;
 
 struct Experiment;
@@ -113,8 +196,10 @@ struct GNUNET_ATS_TEST_Operation
 
   long long unsigned int address_id;
   long long unsigned int peer_id;
+  long long unsigned int client_id;
+
   long long unsigned int address_session;
-  long long unsigned int address_network;
+  unsigned int address_network;
   char*address;
   char*plugin;
 
@@ -123,11 +208,12 @@ struct GNUNET_ATS_TEST_Operation
   long long unsigned int max_rate;
   struct GNUNET_TIME_Relative period;
   struct GNUNET_TIME_Relative frequency;
+  struct GNUNET_TIME_Relative feedback_delay;
 
   enum OperationType type;
   enum GeneratorType gen_type;
   enum GNUNET_ATS_PreferenceKind pref_type;
-  enum GNUNET_ATS_Property prop_type;
+  // enum GNUNET_ATS_Property prop_type;
 };
 
 struct Episode
@@ -142,16 +228,22 @@ struct Episode
 
 struct LoggingHandle
 {
-  GNUNET_SCHEDULER_TaskIdentifier logging_task;
+  struct GNUNET_SCHEDULER_Task * logging_task;
   struct GNUNET_TIME_Relative log_freq;
+
+  /* DLL list for logging time steps */
+  struct LoggingTimeStep *head;
+  struct LoggingTimeStep *tail;
 };
 
 struct Experiment
 {
   char *name;
+  char *log_prefix;
   char *cfg_file;
-  unsigned long long int num_masters;
-  unsigned long long int num_slaves;
+  char *log_output_dir;
+  int log_append_time_stamp;
+
   struct GNUNET_TIME_Relative log_freq;
   struct GNUNET_TIME_Relative max_duration;
   struct GNUNET_TIME_Relative total_duration;
@@ -161,8 +253,8 @@ struct Experiment
 
   struct GNUNET_CONFIGURATION_Handle *cfg;
 
-  GNUNET_SCHEDULER_TaskIdentifier experiment_timeout_task;
-  GNUNET_SCHEDULER_TaskIdentifier episode_timeout_task;
+  struct GNUNET_SCHEDULER_Task * experiment_timeout_task;
+  struct GNUNET_SCHEDULER_Task * episode_timeout_task;
   struct Episode *cur;
 
   GNUNET_ATS_TESTING_EpisodeDoneCallback ep_done_cb;
@@ -176,8 +268,8 @@ struct PreferenceGenerator
 
   enum GeneratorType type;
 
-  unsigned int peer;
-  unsigned int address_id;
+  long long unsigned int peer;
+  unsigned int client_id;
 
   enum GNUNET_ATS_PreferenceKind kind;
 
@@ -185,602 +277,56 @@ struct PreferenceGenerator
   long int max_value;
   struct GNUNET_TIME_Relative duration_period;
   struct GNUNET_TIME_Relative frequency;
+  struct GNUNET_TIME_Relative feedback_frequency;
 
-  GNUNET_SCHEDULER_TaskIdentifier set_task;
+  struct GNUNET_SCHEDULER_Task * set_task;
+  struct GNUNET_SCHEDULER_Task * feedback_task;
   struct GNUNET_TIME_Absolute next_ping_transmission;
   struct GNUNET_TIME_Absolute time_start;
-};
 
 
-struct PropertyGenerator
-{
-  struct PropertyGenerator *prev;
-  struct PropertyGenerator *next;
+  /* Feedback */
+  uint32_t feedback_bw_out_acc;
+  uint32_t feedback_bw_in_acc;
+  uint32_t feedback_delay_acc;
 
-  enum GeneratorType type;
+  double pref_bw_old;
+  double pref_latency_old;
 
-  unsigned int peer;
-  unsigned int address_id;
+  struct GNUNET_TIME_Absolute feedback_last;
 
-  uint32_t ats_property;
+  struct GNUNET_TIME_Absolute feedback_last_bw_update;
+  struct GNUNET_TIME_Absolute feedback_last_delay_update;
+  uint32_t last_assigned_bw_in;
+  uint32_t last_assigned_bw_out;
+  double last_delay_value;
 
-  long int base_value;
-  long int max_value;
-  struct GNUNET_TIME_Relative duration_period;
-  struct GNUNET_TIME_Relative frequency;
-
-  GNUNET_SCHEDULER_TaskIdentifier set_task;
-  struct GNUNET_TIME_Absolute next_ping_transmission;
-  struct GNUNET_TIME_Absolute time_start;
 };
 
 
-/* LEGACY */
-
-#if 0
-#define TEST_ATS_PREFERENCE_DEFAULT 1.0
-
-/**
- * Message type sent for traffic generation
- */
-#define TEST_MESSAGE_TYPE_PING 12345
-
-/**
- * Message type sent as response during traffic generation
- */
-#define TEST_MESSAGE_TYPE_PONG 12346
-
-/**
- * Size of test messages
- */
-#define TEST_MESSAGE_SIZE 100
-
-struct BenchmarkPartner;
-
-struct BenchmarkPeer;
-
-struct GNUNET_ATS_TEST_Topology;
-
-struct TrafficGenerator;
-
-
-
-
-
-/**
- * Callback to call when topology setup is completed
- *
- * @param cls the closure
- * @param masters array of master peers
- * @param slaves array of master peers
- */
-typedef void (*GNUNET_ATS_TEST_TopologySetupDoneCallback) (void *cls,
-    struct BenchmarkPeer *masters,
-    struct BenchmarkPeer *slaves);
-
-/**
- * Callback called when logging is required for the data contained
- *
- * @param cls the closure
- * @param address an address
- * @param address_active is address active
- * @param bandwidth_out bandwidth outbound
- * @param bandwidth_in bandwidth inbound
- * @param ats ats information
- * @param ats_count number of ats inforation
- */
-typedef void
-(*GNUNET_ATS_TEST_LogRequest) (void *cls,
-    const struct GNUNET_HELLO_Address *address_id,
-    int address_active,
-    struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
-    struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
-    const struct GNUNET_ATS_Information *ats,
-    uint32_t ats_count);
-
-/**
- * Information we track for a peer in the testbed.
- */
-struct BenchmarkPeer
-{
-  /**
-   * Handle with testbed.
-   */
-  struct GNUNET_TESTBED_Peer *peer;
-
-  /**
-   * Unique identifier
-   */
-  int no;
-
-  /**
-   * Is this peer a measter: GNUNET_YES/GNUNET_NO
-   */
-  int master;
-
-  /**
-   *  Peer ID
-   */
-  struct GNUNET_PeerIdentity id;
-
-  /**
-   * Testbed operation to get peer information
-   */
-  struct GNUNET_TESTBED_Operation *peer_id_op;
-
-  /**
-   * Testbed operation to connect to ATS performance service
-   */
-  struct GNUNET_TESTBED_Operation *ats_perf_op;
-
-  /**
-   * Testbed operation to connect to core
-   */
-  struct GNUNET_TESTBED_Operation *comm_op;
-
-  /**
-   * ATS performance handle
-   */
-  struct GNUNET_ATS_PerformanceHandle *ats_perf_handle;
-
-  /**
-   * Masters only:
-   * Testbed connect operations to connect masters to slaves
-   */
-  struct TestbedConnectOperation *core_connect_ops;
-
-  /**
-   *  Core handle
-   */
-  struct GNUNET_CORE_Handle *ch;
-
-  /**
-   *  Core handle
-   */
-  struct GNUNET_TRANSPORT_Handle *th;
-
-  /**
-   * Masters only:
-   * Peer to set ATS preferences for
-   */
-  struct BenchmarkPeer *pref_partner;
-
-  /**
-   * Masters only
-   * Progress task
-   */
-  GNUNET_SCHEDULER_TaskIdentifier ats_task;
-
-  /**
-   * Masters only
-   * Progress task
-   */
-  double pref_value;
-
-  /**
-   * Array of partners with num_slaves entries (if master) or
-   * num_master entries (if slave)
-   */
-  struct BenchmarkPartner *partners;
-
-  /**
-   * Number of partners
-   */
-  int num_partners;
-
-  /**
-   * Number of core connections
-   */
-  int core_connections;
-
-  /**
-   * Masters only:
-   * Number of connections to slave peers
-   */
-  int core_slave_connections;
-
-  /**
-   * Total number of messages this peer has sent
-   */
-  unsigned int total_messages_sent;
-
-  /**
-   * Total number of bytes this peer has sent
-   */
-  unsigned int total_bytes_sent;
-
-  /**
-   * Total number of messages this peer has received
-   */
-  unsigned int total_messages_received;
-
-  /**
-   * Total number of bytes this peer has received
-   */
-  unsigned int total_bytes_received;
-};
-
-struct TrafficGenerator
-{
-  struct TrafficGenerator *prev;
-  struct TrafficGenerator *next;
-
-  enum GeneratorType type;
-
-  struct BenchmarkPeer *src;
-  struct BenchmarkPartner *dest;
-
-  long int base_rate;
-  long int max_rate;
-  struct GNUNET_TIME_Relative duration_period;
-
-  GNUNET_SCHEDULER_TaskIdentifier send_task;
-  struct GNUNET_TIME_Absolute next_ping_transmission;
-  struct GNUNET_TIME_Absolute time_start;
-};
-
-
-struct PreferenceGenerator
+struct PropertyGenerator
 {
-  struct PreferenceGenerator *prev;
-  struct PreferenceGenerator *next;
+  struct PropertyGenerator *prev;
+  struct PropertyGenerator *next;
 
   enum GeneratorType type;
 
-  struct BenchmarkPeer *src;
-  struct BenchmarkPartner *dest;
+  long long unsigned int peer;
+  long long unsigned int address_id;
 
-  enum GNUNET_ATS_PreferenceKind kind;
+  struct TestPeer *test_peer;
+  struct TestAddress *test_address;
+  uint32_t ats_property;
 
   long int base_value;
   long int max_value;
   struct GNUNET_TIME_Relative duration_period;
   struct GNUNET_TIME_Relative frequency;
 
-  GNUNET_SCHEDULER_TaskIdentifier set_task;
+  struct GNUNET_SCHEDULER_Task * set_task;
   struct GNUNET_TIME_Absolute next_ping_transmission;
   struct GNUNET_TIME_Absolute time_start;
 };
 
-/**
- * Information about a benchmarking partner
- */
-struct BenchmarkPartner
-{
-  /**
-   * The peer itself this partner belongs to
-   */
-  struct BenchmarkPeer *me;
-
-  /**
-   * The partner peer
-   */
-  struct BenchmarkPeer *dest;
-
-  /**
-   * Core transmit handles
-   */
-  struct GNUNET_CORE_TransmitHandle *cth;
-
-  /**
-   * Transport transmit handles
-   */
-  struct GNUNET_TRANSPORT_TransmitHandle *tth;
-
-  struct TrafficGenerator *tg;
-  struct PreferenceGenerator *pg;
-
-  /**
-   * Timestamp to calculate communication layer delay
-   */
-  struct GNUNET_TIME_Absolute last_message_sent;
-
-  /**
-   * Accumulated RTT for all messages
-   */
-  unsigned int total_app_rtt;
-
-  /**
-   * Number of messages sent to this partner
-   */
-  unsigned int messages_sent;
-
-  /**
-   * Number of bytes sent to this partner
-   */
-  unsigned int bytes_sent;
-
-  /**
-   * Number of messages received from this partner
-   */
-  unsigned int messages_received;
-
-  /**
-   * Number of bytes received from this partner
-   */
-  unsigned int bytes_received;
-
-  /* Current ATS properties */
-
-  uint32_t ats_distance;
-
-  uint32_t ats_delay;
-
-  uint32_t bandwidth_in;
-
-  uint32_t bandwidth_out;
-
-  uint32_t ats_utilization_up;
-
-  uint32_t ats_utilization_down;
-
-  uint32_t ats_network_type;
-
-  uint32_t ats_cost_wan;
-
-  uint32_t ats_cost_lan;
-
-  uint32_t ats_cost_wlan;
-
-  double pref_bandwidth;
-  double pref_delay;
-};
-
-/**
- * Overall state of the performance benchmark
- */
-struct BenchmarkState
-{
-  /**
-   * Are we connected to ATS service of all peers: GNUNET_YES/NO
-   */
-  int connected_ATS_service;
-
-  /**
-   * Are we connected to CORE service of all peers: GNUNET_YES/NO
-   */
-  int connected_COMM_service;
-
-  /**
-   * Are we connected to all peers: GNUNET_YES/NO
-   */
-  int connected_PEERS;
-
-  /**
-   * Are we connected to all slave peers on CORE level: GNUNET_YES/NO
-   */
-  int connected_CORE;
-
-  /**
-   * Are we connected to CORE service of all peers: GNUNET_YES/NO
-   */
-  int benchmarking;
-};
-
-
-struct GNUNET_ATS_TEST_Topology
-{
-  /**
-   * Shutdown task
-   */
-  GNUNET_SCHEDULER_TaskIdentifier shutdown_task;
-
-  /**
-   * Progress task
-   */
-  GNUNET_SCHEDULER_TaskIdentifier progress_task;
-
-  /**
-   * Test result
-   */
-  int result;
-
-  /**Test core (GNUNET_YES) or transport (GNUNET_NO)
-   */
-  int test_core;
-
-  /**
-   * Solver string
-   */
-  char *solver;
-
-  /**
-   * Preference string
-   */
-  char *testname;
-
-  /**
-   * Preference string
-   */
-  char *pref_str;
-
-  /**
-   * ATS preference value
-   */
-  int pref_val;
-
-  /**
-   * Number master peers
-   */
-  unsigned int num_masters;
-
-  /**
-   * Array of master peers
-   */
-  struct BenchmarkPeer *mps;
-
-  /**
-   * Number slave peers
-   */
-  unsigned int num_slaves;
-
-  /**
-   * Array of slave peers
-   */
-  struct BenchmarkPeer *sps;
-
-  /**
-   * Benchmark duration
-   */
-  struct GNUNET_TIME_Relative perf_duration;
-
-  /**
-   * Logging frequency
-   */
-  struct GNUNET_TIME_Relative log_frequency;
-
-  /**
-   * Benchmark state
-   */
-  struct BenchmarkState state;
-
-  struct GNUNET_CORE_MessageHandler *handlers;
-
-  GNUNET_TRANSPORT_ReceiveCallback transport_recv_cb;
-
-  GNUNET_ATS_TEST_TopologySetupDoneCallback done_cb;
-  GNUNET_ATS_AddressInformationCallback ats_perf_cb;
-  void *done_cb_cls;
-};
-
-
-
-/*
- * Experiment related functions
- */
-
-
-/**
- * Execute the specified experiment
- *
- * @param e the Experiment
- * @param ep_done_cb a episode is completed
- * @param e_done_cb the experiment is completed
- */
-void
-GNUNET_ATS_TEST_experimentation_run (struct Experiment *e,
-    GNUNET_ATS_TESTING_EpisodeDoneCallback ep_done_cb,
-    GNUNET_ATS_TESTING_ExperimentDoneCallback e_done_cb);
-
-/**
- * Load an experiment from a file
- *
- * @param filename the file
- * @return the Experiment or NULL on failure
- */
-struct Experiment *
-GNUNET_ATS_TEST_experimentation_load (char *filename);
-
-
-/**
- * Stop an experiment
- *
- * @param e the experiment
- */
-void
-GNUNET_ATS_TEST_experimentation_stop (struct Experiment *e);
-
-/*
- * Traffic related functions
- */
-
-void
-GNUNET_ATS_TEST_traffic_handle_ping (struct BenchmarkPartner *p);
-
-void
-GNUNET_ATS_TEST_traffic_handle_pong (struct BenchmarkPartner *p);
-
-
-/**
- * Generate between the source master and the partner and send traffic with a
- * maximum rate.
- *
- * @param src traffic source
- * @param dest traffic partner
- * @param type type of traffic to generate
- * @param base_rate traffic base rate to send data with
- * @param max_rate  traffic maximum rate to send data with
- * @param period duration of a period of traffic generation (~ 1/frequency)
- * @param duration how long to generate traffic
- * @return the traffic generator
- */
-struct TrafficGenerator *
-GNUNET_ATS_TEST_generate_traffic_start (struct BenchmarkPeer *src,
-    struct BenchmarkPartner *dest,
-    enum GeneratorType type,
-    long int base_rate,
-    long int max_rate,
-    struct GNUNET_TIME_Relative period,
-    struct GNUNET_TIME_Relative duration);
-
-void
-GNUNET_ATS_TEST_generate_traffic_stop (struct TrafficGenerator *tg);
-
-/**
- * Stop all traffic generators
- */
-void
-GNUNET_ATS_TEST_generate_traffic_stop_all ();
-
-struct PreferenceGenerator *
-GNUNET_ATS_TEST_generate_preferences_start (struct BenchmarkPeer *src,
-    struct BenchmarkPartner *dest,
-    enum GeneratorType type,
-    long int base_value,
-    long int value_rate,
-    struct GNUNET_TIME_Relative period,
-    struct GNUNET_TIME_Relative frequency,
-    enum GNUNET_ATS_PreferenceKind kind);
-
-void
-GNUNET_ATS_TEST_generate_preferences_stop (struct PreferenceGenerator *pg);
-
-void
-GNUNET_ATS_TEST_generate_preferences_stop_all ();
-
-/*
- * Logging related functions
- */
-
-
-
-/*
- * Topology related functions
- */
-
-struct BenchmarkPeer *
-GNUNET_ATS_TEST_get_peer (int src);
-
-struct BenchmarkPartner *
-GNUNET_ATS_TEST_get_partner (int src, int dest);
-
-/**
- * Create a topology for ats testing
- *
- * @param name test name
- * @param cfg_file configuration file to use for the peers
- * @param num_slaves number of slaves
- * @param num_masters number of masters
- * @param test_core connect to CORE service (GNUNET_YES) or transport (GNUNET_NO)
- * @param done_cb function to call when topology is setup
- * @param done_cb_cls cls for callback
- * @param recv_cb callback to call when data are received
- * @param perf_cb callback to call when performance info are received
- */
-void
-GNUNET_ATS_TEST_create_topology (char *name, char *cfg_file,
-    unsigned int num_slaves,
-    unsigned int num_masters,
-    int test_core,
-    GNUNET_ATS_TEST_TopologySetupDoneCallback done_cb,
-    void *done_cb_cls,
-    GNUNET_TRANSPORT_ReceiveCallback recv_cb,
-    GNUNET_ATS_TEST_LogRequest ats_perf_cb);
-
-/**
- * Shutdown topology
- */
-void
-GNUNET_ATS_TEST_shutdown_topology (void);
-#endif
+#endif /* #ifndef GNUNET_ATS_SOLVER_EVAL_H */
 /* end of file ats-testing.h */