GNUnet  0.11.x
Data Structures | Macros | Typedefs | Enumerations | Functions | Variables
ats-testing.h File Reference

ats testing library: setup topology and provide logging to test ats More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_testbed_service.h"
#include "gnunet_ats_service.h"
#include "gnunet_core_service.h"
#include "gnunet_transport_service.h"
Include dependency graph for ats-testing.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  TestMessage
 
struct  BenchmarkPeer
 Information we track for a peer in the testbed. More...
 
struct  TrafficGenerator
 
struct  PreferenceGenerator
 
struct  BenchmarkPartner
 Information about a benchmarking partner. More...
 
struct  BenchmarkState
 Overall state of the performance benchmark. More...
 
struct  GNUNET_ATS_TEST_Topology
 
struct  GNUNET_ATS_TEST_Operation
 An operation in an experiment. More...
 
struct  Episode
 
struct  Experiment
 

Macros

#define TEST_ATS_PREFERENCE_DEFAULT   1.0
 
#define TEST_MESSAGE_TYPE_PING   12345
 Message type sent for traffic generation. More...
 
#define TEST_MESSAGE_TYPE_PONG   12346
 Message type sent as response during traffic generation. More...
 
#define TEST_MESSAGE_SIZE   100
 Size of test messages. More...
 

Typedefs

typedef void(* GNUNET_ATS_TEST_TopologySetupDoneCallback) (void *cls, struct BenchmarkPeer *masters, struct BenchmarkPeer *slaves)
 Callback to call when topology setup is completed. More...
 
typedef void(* GNUNET_ATS_TEST_LogRequest) (void *cls, const struct GNUNET_HELLO_Address *address, int address_active, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in, const struct GNUNET_ATS_Properties *prop)
 Callback called when logging is required for the data contained. More...
 
typedef void(* GNUNET_ATS_TESTING_EpisodeDoneCallback) (struct Episode *e)
 
typedef void(* GNUNET_ATS_TESTING_ExperimentDoneCallback) (struct Experiment *e, struct GNUNET_TIME_Relative duration, int success)
 

Enumerations

enum  GeneratorType {
  GNUNET_ATS_TEST_TG_LINEAR, GNUNET_ATS_TEST_TG_CONSTANT, GNUNET_ATS_TEST_TG_RANDOM, GNUNET_ATS_TEST_TG_SINUS,
  GNUNET_ATS_TEST_TG_LINEAR, GNUNET_ATS_TEST_TG_CONSTANT, GNUNET_ATS_TEST_TG_RANDOM, GNUNET_ATS_TEST_TG_SINUS
}
 
enum  OperationType {
  SOLVER_OP_ADD_ADDRESS, SOLVER_OP_DEL_ADDRESS, SOLVER_OP_START_SET_PROPERTY, SOLVER_OP_STOP_SET_PROPERTY,
  SOLVER_OP_START_SET_PREFERENCE, SOLVER_OP_STOP_SET_PREFERENCE, SOLVER_OP_START_REQUEST, SOLVER_OP_STOP_REQUEST,
  START_SEND, STOP_SEND, START_PREFERENCE, STOP_PREFERENCE,
  OP_PEER_CREATE, OP_PEER_START, OP_PEER_STOP, OP_PEER_DESTROY,
  OP_PEER_INFO, OP_PEER_RECONFIGURE, OP_OVERLAY_CONNECT, OP_FORWARDED,
  OP_LINK_CONTROLLERS, OP_GET_SLAVE_CONFIG, OP_SHUTDOWN_PEERS, OP_MANAGE_SERVICE
}
 

Functions

void GNUNET_ATS_TEST_experimentation_run (struct Experiment *e, GNUNET_ATS_TESTING_EpisodeDoneCallback ep_done_cb, GNUNET_ATS_TESTING_ExperimentDoneCallback e_done_cb)
 Execute the specified experiment. More...
 
struct ExperimentGNUNET_ATS_TEST_experimentation_load (const char *filename)
 Load an experiment from a file. More...
 
void GNUNET_ATS_TEST_experimentation_stop (struct Experiment *e)
 Stop an experiment. More...
 
void GNUNET_ATS_TEST_traffic_handle_ping (struct BenchmarkPartner *p)
 
void GNUNET_ATS_TEST_traffic_handle_pong (struct BenchmarkPartner *p)
 
struct TrafficGeneratorGNUNET_ATS_TEST_generate_traffic_start (struct BenchmarkPeer *src, struct BenchmarkPartner *dest, enum GeneratorType type, unsigned int base_rate, unsigned int max_rate, struct GNUNET_TIME_Relative period, struct GNUNET_TIME_Relative duration)
 Generate between the source master and the partner and send traffic with a maximum rate. More...
 
void GNUNET_ATS_TEST_generate_traffic_stop (struct TrafficGenerator *tg)
 
void GNUNET_ATS_TEST_generate_traffic_stop_all (void)
 Stop all traffic generators. More...
 
struct PreferenceGeneratorGNUNET_ATS_TEST_generate_preferences_start (struct BenchmarkPeer *src, struct BenchmarkPartner *dest, enum GeneratorType type, unsigned int base_value, unsigned int value_rate, struct GNUNET_TIME_Relative period, struct GNUNET_TIME_Relative frequency, enum GNUNET_ATS_PreferenceKind kind)
 Generate between the source master and the partner and set preferences with a value depending on the generator. More...
 
void GNUNET_ATS_TEST_generate_preferences_stop (struct PreferenceGenerator *pg)
 
void GNUNET_ATS_TEST_generate_preferences_stop_all (void)
 Stop all preferences generators. More...
 
struct LoggingHandleGNUNET_ATS_TEST_logging_start (struct GNUNET_TIME_Relative log_frequency, const char *testname, struct BenchmarkPeer *masters, int num_masters, int num_slaves, int verbose)
 Start logging. More...
 
void GNUNET_ATS_TEST_logging_clean_up (struct LoggingHandle *l)
 Stop logging. More...
 
void GNUNET_ATS_TEST_logging_stop (struct LoggingHandle *l)
 Stop logging. More...
 
void GNUNET_ATS_TEST_logging_now (struct LoggingHandle *l)
 Log all data now. More...
 
void GNUNET_ATS_TEST_logging_write_to_file (struct LoggingHandle *l, const char *test_name, int plots)
 Write logging data to file. More...
 
struct BenchmarkPeerGNUNET_ATS_TEST_get_peer (int src)
 Topology related functions. More...
 
struct BenchmarkPartnerGNUNET_ATS_TEST_get_partner (int src, int dest)
 
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_ATS_TEST_LogRequest ats_perf_cb)
 Create a topology for ats testing. More...
 
void GNUNET_ATS_TEST_shutdown_topology (void)
 Shutdown topology. More...
 

Variables

struct GNUNET_CONFIGURATION_Handlecfg
 Handle to our configuration. More...
 

Detailed Description

ats testing library: setup topology and provide logging to test ats

Author
Christian Grothoff
Matthias Wachs

Definition in file ats-testing.h.

Macro Definition Documentation

◆ TEST_ATS_PREFERENCE_DEFAULT

#define TEST_ATS_PREFERENCE_DEFAULT   1.0

Definition at line 33 of file ats-testing.h.

Referenced by main_run().

◆ TEST_MESSAGE_TYPE_PING

#define TEST_MESSAGE_TYPE_PING   12345

Message type sent for traffic generation.

Definition at line 38 of file ats-testing.h.

Referenced by comm_schedule_send(), core_connect_adapter(), GNUNET_ATS_TEST_traffic_handle_ping(), and transport_connect_adapter().

◆ TEST_MESSAGE_TYPE_PONG

#define TEST_MESSAGE_TYPE_PONG   12346

Message type sent as response during traffic generation.

Definition at line 43 of file ats-testing.h.

Referenced by core_connect_adapter(), and transport_connect_adapter().

◆ TEST_MESSAGE_SIZE

#define TEST_MESSAGE_SIZE   100

Typedef Documentation

◆ GNUNET_ATS_TEST_TopologySetupDoneCallback

typedef void(* GNUNET_ATS_TEST_TopologySetupDoneCallback) (void *cls, struct BenchmarkPeer *masters, struct BenchmarkPeer *slaves)

Callback to call when topology setup is completed.

Parameters
clsthe closure
mastersarray of master peers
slavesarray of master peers

Definition at line 85 of file ats-testing.h.

◆ GNUNET_ATS_TEST_LogRequest

typedef void(* GNUNET_ATS_TEST_LogRequest) (void *cls, const struct GNUNET_HELLO_Address *address, int address_active, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in, const struct GNUNET_ATS_Properties *prop)

Callback called when logging is required for the data contained.

Parameters
clsthe closure
addressan address
address_activeis address active
bandwidth_outbandwidth outbound
bandwidth_inbandwidth inbound
propperformance information

Definition at line 100 of file ats-testing.h.

◆ GNUNET_ATS_TESTING_EpisodeDoneCallback

typedef void(* GNUNET_ATS_TESTING_EpisodeDoneCallback) (struct Episode *e)

Definition at line 482 of file ats-testing.h.

◆ GNUNET_ATS_TESTING_ExperimentDoneCallback

typedef void(* GNUNET_ATS_TESTING_ExperimentDoneCallback) (struct Experiment *e, struct GNUNET_TIME_Relative duration, int success)

Definition at line 484 of file ats-testing.h.

Enumeration Type Documentation

◆ GeneratorType

Enumerator
GNUNET_ATS_TEST_TG_LINEAR 
GNUNET_ATS_TEST_TG_CONSTANT 
GNUNET_ATS_TEST_TG_RANDOM 
GNUNET_ATS_TEST_TG_SINUS 
GNUNET_ATS_TEST_TG_LINEAR 
GNUNET_ATS_TEST_TG_CONSTANT 
GNUNET_ATS_TEST_TG_RANDOM 
GNUNET_ATS_TEST_TG_SINUS 

Definition at line 69 of file ats-testing.h.

◆ OperationType

Enumerator
SOLVER_OP_ADD_ADDRESS 
SOLVER_OP_DEL_ADDRESS 
SOLVER_OP_START_SET_PROPERTY 
SOLVER_OP_STOP_SET_PROPERTY 
SOLVER_OP_START_SET_PREFERENCE 
SOLVER_OP_STOP_SET_PREFERENCE 
SOLVER_OP_START_REQUEST 
SOLVER_OP_STOP_REQUEST 
START_SEND 
STOP_SEND 
START_PREFERENCE 
STOP_PREFERENCE 
OP_PEER_CREATE 

Peer create operation.

OP_PEER_START 

Peer start operation.

OP_PEER_STOP 

Peer stop operation.

OP_PEER_DESTROY 

Peer destroy operation.

OP_PEER_INFO 

Get peer information operation.

OP_PEER_RECONFIGURE 

Reconfigure a peer.

OP_OVERLAY_CONNECT 

Overlay connection operation.

OP_FORWARDED 

Forwarded operation.

OP_LINK_CONTROLLERS 

Link controllers operation.

OP_GET_SLAVE_CONFIG 

Get slave config operation.

OP_SHUTDOWN_PEERS 

Stop and destroy all peers.

OP_MANAGE_SERVICE 

Start/stop service at a peer.

Definition at line 470 of file ats-testing.h.

Function Documentation

◆ GNUNET_ATS_TEST_experimentation_run()

void GNUNET_ATS_TEST_experimentation_run ( struct Experiment e,
GNUNET_ATS_TESTING_EpisodeDoneCallback  ep_done_cb,
GNUNET_ATS_TESTING_ExperimentDoneCallback  e_done_cb 
)

Execute the specified experiment.

Parameters
ethe Experiment
ep_done_cba episode is completed
e_done_cbthe experiment is completed

Definition at line 673 of file ats-testing-experiment.c.

References Experiment::cur, Episode::duration, Experiment::e_done_cb, enforce_episode(), Experiment::ep_done_cb, Experiment::episode_timeout_task, Experiment::experiment_timeout_task, GNUNET_SCHEDULER_add_delayed(), GNUNET_STRINGS_relative_time_to_string(), GNUNET_TIME_absolute_get(), GNUNET_YES, Episode::id, Experiment::max_duration, Experiment::name, Experiment::start, Experiment::start_time, timeout_episode(), and timeout_experiment().

Referenced by topology_setup_done().

678 {
679  fprintf (stderr, "Running experiment `%s' with timeout %s\n", e->name,
681  GNUNET_YES));
682  e->e_done_cb = e_done_cb;
683  e->ep_done_cb = ep_done_cb;
685 
686  /* Start total time out */
689  e);
690 
691  /* Start */
692  e->cur = e->start;
693  fprintf (stderr, "Running episode %u with timeout %s\n",
694  e->cur->id,
696  GNUNET_YES));
697  enforce_episode (e->cur);
699  &timeout_episode, e);
700 }
struct Episode * start
GNUNET_ATS_TESTING_EpisodeDoneCallback ep_done_cb
GNUNET_ATS_TESTING_ExperimentDoneCallback e_done_cb
static void timeout_experiment(void *cls)
struct GNUNET_SCHEDULER_Task * experiment_timeout_task
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1253
struct Episode * cur
const char * GNUNET_STRINGS_relative_time_to_string(struct GNUNET_TIME_Relative delta, int do_round)
Give relative time in human-readable fancy format.
Definition: strings.c:687
struct GNUNET_SCHEDULER_Task * episode_timeout_task
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:118
struct GNUNET_TIME_Relative duration
struct GNUNET_TIME_Absolute start_time
static void enforce_episode(struct Episode *ep)
static void timeout_episode(void *cls)
#define GNUNET_YES
Definition: gnunet_common.h:77
struct GNUNET_TIME_Relative max_duration
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_experimentation_load()

struct Experiment* GNUNET_ATS_TEST_experimentation_load ( const char *  filename)

Load an experiment from a file.

Parameters
filenamethe file
Returns
the Experiment or NULL on failure

Definition at line 704 of file ats-testing-experiment.c.

References cfg, Experiment::cfg_file, create_experiment(), e, free_experiment(), GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_get_value_filename(), GNUNET_CONFIGURATION_get_value_number(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_get_value_time(), GNUNET_CONFIGURATION_load(), GNUNET_STRINGS_relative_time_to_string(), GNUNET_SYSERR, GNUNET_YES, load_episodes(), Experiment::log_freq, Experiment::max_duration, Experiment::name, Experiment::num_episodes, Experiment::num_masters, Experiment::num_slaves, and Experiment::total_duration.

Referenced by main().

705 {
706  struct Experiment *e;
708 
709  e = NULL;
710 
713  {
714  fprintf (stderr, "Failed to load `%s'\n", filename);
716  return NULL;
717  }
718 
719  e = create_experiment ();
720 
721  if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (cfg, "experiment",
722  "name", &e->name))
723  {
724  fprintf (stderr, "Invalid %s", "name");
725  free_experiment (e);
726  return NULL;
727  }
728  else
729  fprintf (stderr, "Experiment name: `%s'\n", e->name);
730 
732  "experiment",
733  "cfg_file",
734  &e->cfg_file))
735  {
736  fprintf (stderr, "Invalid %s", "cfg_file");
737  free_experiment (e);
738  return NULL;
739  }
740  else
741  fprintf (stderr, "Experiment name: `%s'\n", e->cfg_file);
742 
743  if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg, "experiment",
744  "masters",
745  &e->num_masters))
746  {
747  fprintf (stderr, "Invalid %s", "masters");
748  free_experiment (e);
749  return NULL;
750  }
751  else
752  fprintf (stderr, "Experiment masters: `%llu'\n",
753  e->num_masters);
754 
755  if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg, "experiment",
756  "slaves",
757  &e->num_slaves))
758  {
759  fprintf (stderr, "Invalid %s", "slaves");
760  free_experiment (e);
761  return NULL;
762  }
763  else
764  fprintf (stderr, "Experiment slaves: `%llu'\n",
765  e->num_slaves);
766 
767  if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_time (cfg, "experiment",
768  "log_freq",
769  &e->log_freq))
770  {
771  fprintf (stderr, "Invalid %s", "log_freq");
772  free_experiment (e);
773  return NULL;
774  }
775  else
776  fprintf (stderr, "Experiment logging frequency: `%s'\n",
778 
779  if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_time (cfg, "experiment",
780  "max_duration",
781  &e->max_duration))
782  {
783  fprintf (stderr, "Invalid %s", "max_duration");
784  free_experiment (e);
785  return NULL;
786  }
787  else
788  fprintf (stderr, "Experiment duration: `%s'\n",
790  GNUNET_YES));
791 
792  load_episodes (e, cfg);
793  fprintf (stderr, "Loaded %u episodes with total duration %s\n",
794  e->num_episodes,
796  GNUNET_YES));
797 
799  return e;
800 }
static struct Experiment * create_experiment()
int GNUNET_CONFIGURATION_get_value_time(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, struct GNUNET_TIME_Relative *time)
Get a configuration value that should be a relative time.
int GNUNET_CONFIGURATION_get_value_number(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *number)
Get a configuration value that should be a number.
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
Definition: gnunet-abd.c:36
unsigned long long int num_masters
Definition: ats-testing.h:525
struct GNUNET_TIME_Relative total_duration
static struct Experiment * e
unsigned int num_episodes
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create(void)
Create a new configuration object.
static int load_episodes(struct Experiment *e, struct GNUNET_CONFIGURATION_Handle *cfg)
static void free_experiment(struct Experiment *e)
int GNUNET_CONFIGURATION_load(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Load configuration.
struct GNUNET_TIME_Relative log_freq
const char * GNUNET_STRINGS_relative_time_to_string(struct GNUNET_TIME_Relative delta, int do_round)
Give relative time in human-readable fancy format.
Definition: strings.c:687
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
unsigned long long int num_slaves
Definition: ats-testing.h:526
static char * filename
int GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
configuration data
Definition: configuration.c:85
int GNUNET_CONFIGURATION_get_value_filename(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be the name of a file or directory.
#define GNUNET_YES
Definition: gnunet_common.h:77
struct GNUNET_TIME_Relative max_duration
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_experimentation_stop()

void GNUNET_ATS_TEST_experimentation_stop ( struct Experiment e)

Stop an experiment.

Parameters
ethe experiment

Definition at line 804 of file ats-testing-experiment.c.

References Experiment::episode_timeout_task, Experiment::experiment_timeout_task, free_experiment(), and GNUNET_SCHEDULER_cancel().

Referenced by do_shutdown().

805 {
806  if (NULL != e->experiment_timeout_task)
807  {
809  e->experiment_timeout_task = NULL;
810  }
811  if (NULL != e->episode_timeout_task)
812  {
814  e->episode_timeout_task = NULL;
815  }
816  free_experiment (e);
817 }
static void free_experiment(struct Experiment *e)
struct GNUNET_SCHEDULER_Task * experiment_timeout_task
struct GNUNET_SCHEDULER_Task * episode_timeout_task
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:966
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_traffic_handle_ping()

void GNUNET_ATS_TEST_traffic_handle_ping ( struct BenchmarkPartner p)

Definition at line 183 of file ats-testing-traffic.c.

References BenchmarkPartner::bytes_received, BenchmarkPartner::dest, env, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_MQ_msg, GNUNET_MQ_notify_sent(), GNUNET_MQ_send(), BenchmarkPartner::me, BenchmarkPartner::messages_received, BenchmarkPartner::mq, msg, BenchmarkPeer::no, TestMessage::padding, TEST_MESSAGE_SIZE, TEST_MESSAGE_TYPE_PING, BenchmarkPeer::total_bytes_received, BenchmarkPeer::total_messages_received, and update_pong_data().

Referenced by handle_ping().

184 {
185  struct TestMessage *msg;
186  struct GNUNET_MQ_Envelope *env;
187 
189  "Slave [%u]: Received PING from [%u], sending PONG\n",
190  p->me->no,
191  p->dest->no);
192  p->messages_received++;
196 
197 
198  env = GNUNET_MQ_msg (msg,
200  memset (msg->padding,
201  'a',
202  sizeof(msg->padding));
205  p);
206  GNUNET_MQ_send (p->mq,
207  env);
208 }
unsigned int total_bytes_received
Total number of bytes this peer has received.
Definition: ats-testing.h:227
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
unsigned int total_messages_received
Total number of messages this peer has received.
Definition: ats-testing.h:222
#define TEST_MESSAGE_TYPE_PING
Message type sent for traffic generation.
Definition: ats-testing.h:38
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
unsigned int bytes_received
Number of bytes received from this partner.
Definition: ats-testing.h:330
uint8_t padding[100 - sizeof(struct GNUNET_MessageHeader)]
Definition: ats-testing.h:55
int no
Unique identifier.
Definition: ats-testing.h:121
void GNUNET_MQ_notify_sent(struct GNUNET_MQ_Envelope *ev, GNUNET_SCHEDULER_TaskCallback cb, void *cb_cls)
Call a callback once the envelope has been sent, that is, sending it can not be canceled anymore...
Definition: mq.c:774
unsigned int messages_received
Number of messages received from this partner.
Definition: ats-testing.h:325
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
struct GNUNET_MQ_Handle * mq
Message queue handle.
Definition: ats-testing.h:290
#define GNUNET_log(kind,...)
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:353
static void update_pong_data(void *cls)
struct BenchmarkPeer * me
The peer itself this partner belongs to.
Definition: ats-testing.h:280
struct BenchmarkPeer * dest
The partner peer.
Definition: ats-testing.h:285
#define TEST_MESSAGE_SIZE
Size of test messages.
Definition: ats-testing.h:48
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_traffic_handle_pong()

void GNUNET_ATS_TEST_traffic_handle_pong ( struct BenchmarkPartner p)

Definition at line 212 of file ats-testing-traffic.c.

References TrafficGenerator::base_rate, BenchmarkPartner::bytes_received, comm_schedule_send(), BenchmarkPartner::dest, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_SCHEDULER_add_delayed(), GNUNET_SCHEDULER_add_now(), GNUNET_TIME_absolute_get(), GNUNET_TIME_absolute_get_difference(), GNUNET_TIME_absolute_get_remaining(), GNUNET_TIME_relative_min(), GNUNET_TIME_UNIT_SECONDS, BenchmarkPartner::last_message_sent, BenchmarkPartner::me, BenchmarkPartner::messages_received, TrafficGenerator::next_ping_transmission, BenchmarkPeer::no, GNUNET_TIME_Relative::rel_value_us, TrafficGenerator::send_task, TEST_MESSAGE_SIZE, BenchmarkPartner::tg, BenchmarkPartner::total_app_rtt, BenchmarkPeer::total_bytes_received, and BenchmarkPeer::total_messages_received.

Referenced by handle_pong().

213 {
214  struct GNUNET_TIME_Relative left;
215 
217  "Master [%u]: Received PONG from [%u], next message\n",
218  p->me->no,
219  p->dest->no);
220 
221  p->messages_received++;
227  .rel_value_us;
228 
229  /* Schedule next send event */
230  if (NULL == p->tg)
231  return;
232 
234  if (UINT32_MAX == p->tg->base_rate)
235  {
237  }
238  else if (0 == left.rel_value_us)
239  {
241  }
242  else
243  {
244  /* Enforce minimum transmission rate 1 msg / sec */
245  if (GNUNET_TIME_UNIT_SECONDS.rel_value_us == (left =
247  left,
249  .rel_value_us)
251  "Enforcing minimum send rate between master [%u] and slave [%u]\n",
252  p->me->no, p->dest->no);
254  &comm_schedule_send, p);
255  }
256 }
unsigned int total_bytes_received
Total number of bytes this peer has received.
Definition: ats-testing.h:227
uint64_t rel_value_us
The actual value.
static void comm_schedule_send(void *cls)
#define GNUNET_TIME_UNIT_SECONDS
One second.
unsigned int total_messages_received
Total number of messages this peer has received.
Definition: ats-testing.h:222
unsigned int bytes_received
Number of bytes received from this partner.
Definition: ats-testing.h:330
struct GNUNET_SCHEDULER_Task * send_task
Definition: ats-testing.h:244
struct TrafficGenerator * tg
Handle for traffic generator.
Definition: ats-testing.h:295
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1253
int no
Unique identifier.
Definition: ats-testing.h:121
unsigned int total_app_rtt
Accumulated RTT for all messages.
Definition: ats-testing.h:310
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
unsigned int messages_received
Number of messages received from this partner.
Definition: ats-testing.h:325
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:118
struct GNUNET_TIME_Relative GNUNET_TIME_relative_min(struct GNUNET_TIME_Relative t1, struct GNUNET_TIME_Relative t2)
Return the minimum of two relative time values.
Definition: time.c:272
struct GNUNET_TIME_Absolute last_message_sent
Timestamp to calculate communication layer delay.
Definition: ats-testing.h:305
long int base_rate
Definition: ats-testing.h:240
#define GNUNET_log(kind,...)
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_remaining(struct GNUNET_TIME_Absolute future)
Given a timestamp in the future, how much time remains until then?
Definition: time.c:331
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_difference(struct GNUNET_TIME_Absolute start, struct GNUNET_TIME_Absolute end)
Compute the time difference between the given start and end times.
Definition: time.c:354
struct BenchmarkPeer * me
The peer itself this partner belongs to.
Definition: ats-testing.h:280
struct BenchmarkPeer * dest
The partner peer.
Definition: ats-testing.h:285
struct GNUNET_TIME_Absolute next_ping_transmission
Definition: ats-testing.h:245
#define TEST_MESSAGE_SIZE
Size of test messages.
Definition: ats-testing.h:48
Time for relative time used by GNUnet, in microseconds.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_generate_traffic_start()

struct TrafficGenerator* GNUNET_ATS_TEST_generate_traffic_start ( struct BenchmarkPeer src,
struct BenchmarkPartner dest,
enum GeneratorType  type,
unsigned int  base_rate,
unsigned int  max_rate,
struct GNUNET_TIME_Relative  period,
struct GNUNET_TIME_Relative  duration 
)

Generate between the source master and the partner and send traffic with a maximum rate.

Parameters
srctraffic source
desttraffic partner
typetype of traffic to generate
base_ratetraffic base rate to send data with
max_ratetraffic maximum rate to send data with
periodduration of a period of traffic generation (~ 1/frequency)
durationhow long to generate traffic
Returns
the traffic generator

Definition at line 273 of file ats-testing-traffic.c.

References TrafficGenerator::base_rate, comm_schedule_send(), TrafficGenerator::dest, BenchmarkPartner::dest, TrafficGenerator::duration_period, GNUNET_ATS_TEST_TG_CONSTANT, GNUNET_ATS_TEST_TG_LINEAR, GNUNET_ATS_TEST_TG_RANDOM, GNUNET_ATS_TEST_TG_SINUS, GNUNET_break, GNUNET_CONTAINER_DLL_insert, GNUNET_ERROR_TYPE_INFO, GNUNET_i2s(), GNUNET_log, GNUNET_new, GNUNET_SCHEDULER_add_now(), GNUNET_TIME_absolute_get(), GNUNET_TIME_UNIT_FOREVER_ABS, BenchmarkPeer::id, TrafficGenerator::max_rate, BenchmarkPartner::me, TrafficGenerator::next_ping_transmission, BenchmarkPeer::no, TrafficGenerator::send_task, TrafficGenerator::src, BenchmarkPartner::tg, TrafficGenerator::time_start, type, and TrafficGenerator::type.

Referenced by enforce_start_send(), and topology_setup_done().

280 {
281  struct TrafficGenerator *tg;
282 
283  if (NULL != dest->tg)
284  {
285  GNUNET_break (0);
286  return NULL;
287  }
288 
289  tg = GNUNET_new (struct TrafficGenerator);
291  tg_tail,
292  tg);
293  tg->type = type;
294  tg->src = src;
295  tg->dest = dest;
296  tg->base_rate = base_rate;
297  tg->max_rate = max_rate;
298  tg->duration_period = period;
301 
302  switch (type)
303  {
306  "Setting up constant traffic generator master[%u] `%s' and slave [%u] `%s' max %u Bips\n",
307  dest->me->no,
308  GNUNET_i2s (&dest->me->id),
309  dest->dest->no,
310  GNUNET_i2s (&dest->dest->id),
311  base_rate);
312  break;
313 
316  "Setting up linear traffic generator master[%u] `%s' and slave [%u] `%s' min %u Bips max %u Bips\n",
317  dest->me->no,
318  GNUNET_i2s (&dest->me->id),
319  dest->dest->no,
320  GNUNET_i2s (&dest->dest->id),
321  base_rate,
322  max_rate);
323  break;
324 
327  "Setting up sinus traffic generator master[%u] `%s' and slave [%u] `%s' baserate %u Bips, amplitude %u Bps\n",
328  dest->me->no,
329  GNUNET_i2s (&dest->me->id),
330  dest->dest->no,
331  GNUNET_i2s (&dest->dest->id),
332  base_rate,
333  max_rate);
334  break;
335 
338  "Setting up random traffic generator master[%u] `%s' and slave [%u] `%s' min %u Bips max %u Bps\n",
339  dest->me->no,
340  GNUNET_i2s (&dest->me->id),
341  dest->dest->no,
342  GNUNET_i2s (&dest->dest->id),
343  base_rate,
344  max_rate);
345  break;
346 
347  default:
348  break;
349  }
350 
351  dest->tg = tg;
352  tg->send_task
354  dest);
355  return tg;
356 }
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
static struct TrafficGenerator * tg_head
static void comm_schedule_send(void *cls)
long int max_rate
Definition: ats-testing.h:241
struct GNUNET_SCHEDULER_Task * send_task
Definition: ats-testing.h:244
#define GNUNET_new(type)
Allocate a struct or union of the given type.
struct BenchmarkPartner * dest
Definition: ats-testing.h:238
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define GNUNET_TIME_UNIT_FOREVER_ABS
Constant used to specify "forever".
struct TrafficGenerator * tg
Handle for traffic generator.
Definition: ats-testing.h:295
int no
Unique identifier.
Definition: ats-testing.h:121
struct GNUNET_TIME_Absolute time_start
Definition: ats-testing.h:246
static struct TrafficGenerator * tg_tail
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:118
enum GeneratorType type
Definition: ats-testing.h:235
struct BenchmarkPeer * src
Definition: ats-testing.h:237
long int base_rate
Definition: ats-testing.h:240
#define GNUNET_log(kind,...)
struct GNUNET_TIME_Relative duration_period
Definition: ats-testing.h:242
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
struct BenchmarkPeer * me
The peer itself this partner belongs to.
Definition: ats-testing.h:280
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
struct BenchmarkPeer * dest
The partner peer.
Definition: ats-testing.h:285
struct GNUNET_PeerIdentity id
Peer ID.
Definition: ats-testing.h:131
struct GNUNET_TIME_Absolute next_ping_transmission
Definition: ats-testing.h:245
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_generate_traffic_stop()

void GNUNET_ATS_TEST_generate_traffic_stop ( struct TrafficGenerator tg)

Definition at line 360 of file ats-testing-traffic.c.

References TrafficGenerator::dest, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_SCHEDULER_cancel(), TrafficGenerator::send_task, and BenchmarkPartner::tg.

Referenced by enforce_start_send(), enforce_stop_send(), and GNUNET_ATS_TEST_generate_traffic_stop_all().

361 {
363  tg_tail,
364  tg);
365  tg->dest->tg = NULL;
366  if (NULL != tg->send_task)
367  {
369  tg->send_task = NULL;
370  }
371  GNUNET_free (tg);
372 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
static struct TrafficGenerator * tg_head
struct GNUNET_SCHEDULER_Task * send_task
Definition: ats-testing.h:244
struct BenchmarkPartner * dest
Definition: ats-testing.h:238
struct TrafficGenerator * tg
Handle for traffic generator.
Definition: ats-testing.h:295
static struct TrafficGenerator * tg_tail
#define GNUNET_free(ptr)
Wrapper around free.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:966
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_generate_traffic_stop_all()

void GNUNET_ATS_TEST_generate_traffic_stop_all ( void  )

Stop all traffic generators.

Definition at line 379 of file ats-testing-traffic.c.

References GNUNET_ATS_TEST_generate_traffic_stop(), TrafficGenerator::next, and tg_head.

Referenced by do_shutdown(), and experiment_done_cb().

380 {
381  struct TrafficGenerator *cur;
382  struct TrafficGenerator *next;
383 
384  next = tg_head;
385  for (cur = next; NULL != cur; cur = next)
386  {
387  next = cur->next;
389  }
390 }
struct TrafficGenerator * next
Definition: ats-testing.h:233
static struct TrafficGenerator * tg_head
void GNUNET_ATS_TEST_generate_traffic_stop(struct TrafficGenerator *tg)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_generate_preferences_start()

struct PreferenceGenerator* GNUNET_ATS_TEST_generate_preferences_start ( struct BenchmarkPeer src,
struct BenchmarkPartner dest,
enum GeneratorType  type,
unsigned int  base_value,
unsigned int  value_rate,
struct GNUNET_TIME_Relative  period,
struct GNUNET_TIME_Relative  frequency,
enum GNUNET_ATS_PreferenceKind  kind 
)

Generate between the source master and the partner and set preferences with a value depending on the generator.

Parameters
srcsource
destpartner
typetype of preferences to generate
base_valuetraffic base rate to send data with
value_ratetraffic maximum rate to send data with
periodduration of a period of preferences generation (~ 1/frequency)
frequencyhow long to generate preferences
kindATS preference to generate
Returns
the traffic generator
Parameters
srcsource
destpartner
typetype of preferences to generate
base_valuetraffic base rate to send data with
value_ratetraffic maximum rate to send data with
periodduration of a period of preferences generation (~ 1/frequency)
frequencyhow long to generate preferences
kindATS preference to generate
Returns
the preference generator

Definition at line 157 of file ats-testing-preferences.c.

References PreferenceGenerator::base_value, PreferenceGenerator::dest, BenchmarkPartner::dest, PreferenceGenerator::duration_period, PreferenceGenerator::frequency, GNUNET_ATS_TEST_TG_CONSTANT, GNUNET_ATS_TEST_TG_LINEAR, GNUNET_ATS_TEST_TG_RANDOM, GNUNET_ATS_TEST_TG_SINUS, GNUNET_break, GNUNET_CONTAINER_DLL_insert, GNUNET_ERROR_TYPE_INFO, GNUNET_i2s(), GNUNET_log, GNUNET_new, GNUNET_SCHEDULER_add_now(), GNUNET_TIME_absolute_get(), BenchmarkPeer::id, PreferenceGenerator::kind, PreferenceGenerator::max_value, BenchmarkPartner::me, BenchmarkPeer::no, BenchmarkPartner::pg, set_pref_task(), PreferenceGenerator::set_task, PreferenceGenerator::src, PreferenceGenerator::time_start, type, and PreferenceGenerator::type.

Referenced by enforce_start_preference().

166 {
167  struct PreferenceGenerator *pg;
168 
169  if (NULL != dest->pg)
170  {
171  GNUNET_break (0);
172  return NULL;
173  }
174 
175  pg = GNUNET_new (struct PreferenceGenerator);
177  pg->type = type;
178  pg->src = src;
179  pg->dest = dest;
180  pg->kind = kind;
181  pg->base_value = base_value;
182  pg->max_value = value_rate;
183  pg->duration_period = period;
184  pg->frequency = frequency;
186 
187  switch (type)
188  {
191  "Setting up constant preference generator master[%u] `%s' and slave [%u] `%s' max %u Bips\n",
192  dest->me->no, GNUNET_i2s (&dest->me->id),
193  dest->dest->no, GNUNET_i2s (&dest->dest->id),
194  base_value);
195  break;
196 
199  "Setting up linear preference generator master[%u] `%s' and slave [%u] `%s' min %u Bips max %u Bips\n",
200  dest->me->no, GNUNET_i2s (&dest->me->id),
201  dest->dest->no, GNUNET_i2s (&dest->dest->id),
202  base_value, value_rate);
203  break;
204 
207  "Setting up sinus preference generator master[%u] `%s' and slave [%u] `%s' baserate %u Bips, amplitude %u Bps\n",
208  dest->me->no, GNUNET_i2s (&dest->me->id),
209  dest->dest->no, GNUNET_i2s (&dest->dest->id),
210  base_value, value_rate);
211  break;
212 
215  "Setting up random preference generator master[%u] `%s' and slave [%u] `%s' min %u Bips max %u Bps\n",
216  dest->me->no, GNUNET_i2s (&dest->me->id),
217  dest->dest->no, GNUNET_i2s (&dest->dest->id),
218  base_value, value_rate);
219  break;
220 
221  default:
222  break;
223  }
224 
225  dest->pg = pg;
227  return pg;
228 }
struct GNUNET_TIME_Absolute time_start
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
struct GNUNET_TIME_Relative duration_period
struct PreferenceGenerator * pg
Handle for preference generator.
Definition: ats-testing.h:300
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
enum GNUNET_ATS_PreferenceKind kind
struct BenchmarkPartner * dest
Definition: ats-testing.h:258
int no
Unique identifier.
Definition: ats-testing.h:121
static void set_pref_task(void *cls)
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
static struct PreferenceGenerator * pg_head
struct GNUNET_SCHEDULER_Task * set_task
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:118
struct BenchmarkPeer * src
Definition: ats-testing.h:257
struct GNUNET_TIME_Relative frequency
#define GNUNET_log(kind,...)
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
static struct PreferenceGenerator * pg_tail
struct BenchmarkPeer * me
The peer itself this partner belongs to.
Definition: ats-testing.h:280
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
struct BenchmarkPeer * dest
The partner peer.
Definition: ats-testing.h:285
struct GNUNET_PeerIdentity id
Peer ID.
Definition: ats-testing.h:131
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_generate_preferences_stop()

void GNUNET_ATS_TEST_generate_preferences_stop ( struct PreferenceGenerator pg)

Definition at line 232 of file ats-testing-preferences.c.

References PreferenceGenerator::dest, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_SCHEDULER_cancel(), BenchmarkPartner::pg, and PreferenceGenerator::set_task.

Referenced by enforce_start_preference(), enforce_stop_preference(), and GNUNET_ATS_TEST_generate_preferences_stop_all().

233 {
235  pg->dest->pg = NULL;
236 
237  if (NULL != pg->set_task)
238  {
240  pg->set_task = NULL;
241  }
242 
243  GNUNET_free (pg);
244 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct PreferenceGenerator * pg
Handle for preference generator.
Definition: ats-testing.h:300
struct BenchmarkPartner * dest
Definition: ats-testing.h:258
static struct PreferenceGenerator * pg_head
struct GNUNET_SCHEDULER_Task * set_task
static struct PreferenceGenerator * pg_tail
#define GNUNET_free(ptr)
Wrapper around free.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:966
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_generate_preferences_stop_all()

void GNUNET_ATS_TEST_generate_preferences_stop_all ( void  )

Stop all preferences generators.

Definition at line 251 of file ats-testing-preferences.c.

References GNUNET_ATS_TEST_generate_preferences_stop(), PreferenceGenerator::next, and pg_head.

Referenced by do_shutdown(), and experiment_done_cb().

252 {
253  struct PreferenceGenerator *cur;
254  struct PreferenceGenerator *next;
255 
256  next = pg_head;
257  for (cur = next; NULL != cur; cur = next)
258  {
259  next = cur->next;
261  }
262 }
struct PreferenceGenerator * next
static struct PreferenceGenerator * pg_head
void GNUNET_ATS_TEST_generate_preferences_stop(struct PreferenceGenerator *pg)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_logging_start()

struct LoggingHandle* GNUNET_ATS_TEST_logging_start ( struct GNUNET_TIME_Relative  log_frequency,
const char *  testname,
struct BenchmarkPeer masters,
int  num_masters,
int  num_slaves,
int  verbose 
)

Start logging.

Parameters
log_frequencythe logging frequency
testnamethe testname
mastersthe master peers used for benchmarking
num_mastersthe number of master peers
num_slavesthe number of slave peers
verboseverbose logging
Returns
the logging handle or NULL on error

Definition at line 941 of file ats-testing-log.c.

References _, collect_log_task(), LoggingHandle::frequency, GNUNET_ERROR_TYPE_INFO, GNUNET_log, GNUNET_malloc, GNUNET_new, GNUNET_SCHEDULER_add_now(), GNUNET_TIME_absolute_get(), GNUNET_YES, l, LoggingHandle::log_task, LoggingHandle::lp, LoggingHandle::name, LoggingHandle::num_masters, LoggingHandle::num_slaves, LoggingPeer::peer, LoggingHandle::running, LoggingPeer::start, verbose, and LoggingHandle::verbose.

Referenced by topology_setup_done().

947 {
948  struct LoggingHandle *l;
949  int c_m;
950 
952  _ ("Start logging `%s'\n"), testname);
953 
954  l = GNUNET_new (struct LoggingHandle);
956  l->num_slaves = num_slaves;
957  l->name = testname;
958  l->frequency = log_frequency;
959  l->verbose = verbose;
960  l->lp = GNUNET_malloc (num_masters * sizeof(struct LoggingPeer));
961 
962  for (c_m = 0; c_m < num_masters; c_m++)
963  {
964  l->lp[c_m].peer = &masters[c_m];
965  l->lp[c_m].start = GNUNET_TIME_absolute_get ();
966  }
967 
968  /* Schedule logging task */
970  l->running = GNUNET_YES;
971 
972  return l;
973 }
const char * name
static void collect_log_task(void *cls)
struct BenchmarkPeer * peer
Peer.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
struct LoggingPeer * lp
Log structure of length num_peers.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
static struct LoggingHandle * l
static int verbose
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
struct GNUNET_TIME_Absolute start
Start time.
struct GNUNET_TIME_Relative frequency
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:118
Entry for a benchmark peer.
struct GNUNET_SCHEDULER_Task * log_task
Logging task.
#define GNUNET_log(kind,...)
int num_masters
Reference to perf_ats&#39; masters.
#define GNUNET_YES
Definition: gnunet_common.h:77
#define GNUNET_malloc(size)
Wrapper around malloc.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_logging_clean_up()

void GNUNET_ATS_TEST_logging_clean_up ( struct LoggingHandle l)

Stop logging.

Parameters
lthe logging handle

Stop logging.

Parameters
lthe logging handle

Definition at line 906 of file ats-testing-log.c.

References GNUNET_ATS_TEST_logging_stop(), GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_YES, LoggingPeer::head, LoggingHandle::lp, LoggingHandle::num_masters, LoggingHandle::running, PeerLoggingTimestep::slaves_log, and LoggingPeer::tail.

Referenced by do_shutdown().

907 {
908  int c_m;
909  struct PeerLoggingTimestep *cur;
910 
911  if (GNUNET_YES == l->running)
913 
914  for (c_m = 0; c_m < l->num_masters; c_m++)
915  {
916  while (NULL != (cur = l->lp[c_m].head))
917  {
918  GNUNET_CONTAINER_DLL_remove (l->lp[c_m].head, l->lp[c_m].tail, cur);
919  GNUNET_free (cur->slaves_log);
920  GNUNET_free (cur);
921  }
922  }
923 
924  GNUNET_free (l->lp);
925  GNUNET_free (l);
926 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct PeerLoggingTimestep * head
DLL for logging entries: head.
struct PartnerLoggingTimestep * slaves_log
Logs for slaves.
struct LoggingPeer * lp
Log structure of length num_peers.
A single logging time step for a peer.
void GNUNET_ATS_TEST_logging_stop(struct LoggingHandle *l)
Stop logging.
struct PeerLoggingTimestep * tail
DLL for logging entries: tail.
int num_masters
Reference to perf_ats&#39; masters.
#define GNUNET_YES
Definition: gnunet_common.h:77
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_logging_stop()

void GNUNET_ATS_TEST_logging_stop ( struct LoggingHandle l)

Stop logging.

Parameters
lthe logging handle

Definition at line 883 of file ats-testing-log.c.

References _, GNUNET_ERROR_TYPE_INFO, GNUNET_log, GNUNET_NO, GNUNET_SCHEDULER_cancel(), GNUNET_YES, LoggingHandle::log_task, and LoggingHandle::running.

Referenced by do_shutdown(), experiment_done_cb(), and GNUNET_ATS_TEST_logging_clean_up().

884 {
885  if (GNUNET_YES != l->running)
886  return;
887 
888  if (NULL != l->log_task)
889  {
891  l->log_task = NULL;
892  }
893  l->running = GNUNET_NO;
894 
896  _ ("Stop logging\n"));
897 }
#define GNUNET_NO
Definition: gnunet_common.h:78
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
struct GNUNET_SCHEDULER_Task * log_task
Logging task.
#define GNUNET_log(kind,...)
#define GNUNET_YES
Definition: gnunet_common.h:77
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:966
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_logging_now()

void GNUNET_ATS_TEST_logging_now ( struct LoggingHandle l)

Log all data now.

Parameters
llogging handle to use

Definition at line 674 of file ats-testing-log.c.

References PartnerLoggingTimestep::app_rtt, PartnerLoggingTimestep::ats_delay, PartnerLoggingTimestep::ats_distance, PartnerLoggingTimestep::ats_network_type, PartnerLoggingTimestep::ats_utilization_in, PartnerLoggingTimestep::ats_utilization_out, PartnerLoggingTimestep::bandwidth_in, BenchmarkPartner::bandwidth_in, PartnerLoggingTimestep::bandwidth_out, BenchmarkPartner::bandwidth_out, BenchmarkPartner::bytes_received, BenchmarkPartner::bytes_sent, GNUNET_ATS_Properties::delay, BenchmarkPartner::dest, GNUNET_ATS_Properties::distance, GNUNET_CONTAINER_DLL_insert_tail, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_log, GNUNET_malloc, GNUNET_new, GNUNET_TIME_absolute_get(), GNUNET_TIME_absolute_get_difference(), GNUNET_TIME_UNIT_SECONDS, GNUNET_YES, LoggingPeer::head, LoggingHandle::lp, BenchmarkPartner::messages_received, BenchmarkPartner::messages_sent, BenchmarkPeer::no, LoggingHandle::num_masters, BenchmarkPeer::num_partners, p, BenchmarkPeer::partners, LoggingPeer::peer, PartnerLoggingTimestep::pref_bandwidth, BenchmarkPartner::pref_bandwidth, PartnerLoggingTimestep::pref_delay, BenchmarkPartner::pref_delay, PeerLoggingTimestep::prev, BenchmarkPartner::props, GNUNET_TIME_Relative::rel_value_us, LoggingHandle::running, GNUNET_ATS_Properties::scope, PartnerLoggingTimestep::slave, PeerLoggingTimestep::slaves_log, LoggingPeer::start, LoggingPeer::tail, PartnerLoggingTimestep::throughput_recv, PartnerLoggingTimestep::throughput_sent, PeerLoggingTimestep::timestamp, PartnerLoggingTimestep::total_app_rtt, BenchmarkPartner::total_app_rtt, PartnerLoggingTimestep::total_bytes_received, PeerLoggingTimestep::total_bytes_received, BenchmarkPeer::total_bytes_received, PartnerLoggingTimestep::total_bytes_sent, PeerLoggingTimestep::total_bytes_sent, BenchmarkPeer::total_bytes_sent, PartnerLoggingTimestep::total_messages_received, PeerLoggingTimestep::total_messages_received, BenchmarkPeer::total_messages_received, PartnerLoggingTimestep::total_messages_sent, PeerLoggingTimestep::total_messages_sent, BenchmarkPeer::total_messages_sent, PeerLoggingTimestep::total_throughput_recv, PeerLoggingTimestep::total_throughput_send, GNUNET_ATS_Properties::utilization_out, and LoggingHandle::verbose.

Referenced by collect_log_task().

675 {
676  struct LoggingPeer *bp;
677  struct PeerLoggingTimestep *mlt;
678  struct PeerLoggingTimestep *prev_log_mlt;
679  struct PartnerLoggingTimestep *slt;
680  struct PartnerLoggingTimestep *prev_log_slt;
681  struct BenchmarkPartner *p;
683  int c_s;
684  int c_m;
685  unsigned int app_rtt;
686  double mult;
687 
688  if (GNUNET_YES != l->running)
689  return;
690 
691  for (c_m = 0; c_m < l->num_masters; c_m++)
692  {
693  bp = &l->lp[c_m];
694  mlt = GNUNET_new (struct PeerLoggingTimestep);
695  GNUNET_CONTAINER_DLL_insert_tail (l->lp[c_m].head, l->lp[c_m].tail, mlt);
696  prev_log_mlt = mlt->prev;
697 
698  /* Collect data */
699  /* Current master state */
705 
706  /* Throughput */
707  if (NULL == prev_log_mlt)
708  {
709  /* Get difference to start */
711  mlt->timestamp);
712  }
713  else
714  {
715  /* Get difference to last timestep */
717  mlt->timestamp);
718  }
719 
720  /* Multiplication factor for throughput calculation */
721  mult = (double) GNUNET_TIME_UNIT_SECONDS.rel_value_us
722  / (delta.rel_value_us);
723 
724  /* Total throughput */
725  if (NULL != prev_log_mlt)
726  {
727  if (mlt->total_bytes_sent - mlt->prev->total_bytes_sent > 0)
728  {
729  mlt->total_throughput_send = mult * (mlt->total_bytes_sent
730  - mlt->prev->total_bytes_sent);
731  }
732  else
733  {
734  mlt->total_throughput_send = 0;
735  // mlt->total_throughput_send = prev_log_mlt->total_throughput_send; /* no msgs send */
736  }
737 
738  if (mlt->total_bytes_received - mlt->prev->total_bytes_received > 0)
739  {
740  mlt->total_throughput_recv = mult * (mlt->total_bytes_received
741  - mlt->prev->total_bytes_received);
742  }
743  else
744  {
745  mlt->total_throughput_recv = 0;
746  // mlt->total_throughput_recv = prev_log_mlt->total_throughput_recv; /* no msgs received */
747  }
748  }
749  else
750  {
751  mlt->total_throughput_send = mult * mlt->total_bytes_sent;
752  mlt->total_throughput_recv = mult * mlt->total_bytes_received;
753  }
754 
755  if (GNUNET_YES == l->verbose)
756  {
758  "Master[%u] delta: %llu us, bytes (sent/received): %u / %u; throughput send/recv: %u / %u\n",
759  c_m,
760  (unsigned long long) delta.rel_value_us,
761  mlt->total_bytes_sent,
764  mlt->total_throughput_recv);
765  }
766 
768  * sizeof(struct PartnerLoggingTimestep));
769 
770  for (c_s = 0; c_s < bp->peer->num_partners; c_s++)
771  {
773  "Collect logging data master[%u] slave [%u]\n", c_m, c_s);
774 
775  p = &bp->peer->partners[c_s];
776  slt = &mlt->slaves_log[c_s];
777 
778  slt->slave = p->dest;
779  /* Bytes sent from master to this slave */
780  slt->total_bytes_sent = p->bytes_sent;
781  /* Messages sent from master to this slave */
783  /* Bytes master received from this slave */
785  /* Messages master received from this slave */
787  slt->total_app_rtt = p->total_app_rtt;
788  /* ats performance information */
789  slt->ats_delay = p->props.delay;
790  slt->ats_distance = p->props.distance;
791  slt->ats_network_type = p->props.scope;
794  slt->bandwidth_in = p->bandwidth_in;
795  slt->bandwidth_out = p->bandwidth_out;
796  slt->pref_bandwidth = p->pref_bandwidth;
797  slt->pref_delay = p->pref_delay;
798 
799  /* Total application level rtt */
800  if (NULL == prev_log_mlt)
801  {
802  if (0 != slt->total_messages_sent)
803  app_rtt = slt->total_app_rtt / slt->total_messages_sent;
804  else
805  app_rtt = 0;
806  }
807  else
808  {
809  prev_log_slt = &prev_log_mlt->slaves_log[c_s];
810  if ((slt->total_messages_sent - prev_log_slt->total_messages_sent) > 0)
811  app_rtt = (slt->total_app_rtt - prev_log_slt->total_app_rtt)
812  / (slt->total_messages_sent
813  - prev_log_slt->total_messages_sent);
814  else
815  {
816  app_rtt = prev_log_slt->app_rtt; /* No messages were */
817  }
818  }
819  slt->app_rtt = app_rtt;
820 
821  /* Partner throughput */
822  if (NULL != prev_log_mlt)
823  {
824  prev_log_slt = &prev_log_mlt->slaves_log[c_s];
825  if (slt->total_bytes_sent > prev_log_slt->total_bytes_sent)
826  slt->throughput_sent = mult * (slt->total_bytes_sent
827  - prev_log_slt->total_bytes_sent);
828  else
829  slt->throughput_sent = 0;
830 
831  if (slt->total_bytes_received > prev_log_slt->total_bytes_received)
832  slt->throughput_recv = mult
833  * (slt->total_bytes_received
834  - prev_log_slt->total_bytes_received);
835  else
836  slt->throughput_recv = 0;
837  }
838  else
839  {
840  slt->throughput_sent = mult * slt->total_bytes_sent;
841  slt->throughput_recv = mult * slt->total_bytes_received;
842  }
843 
844  if (GNUNET_YES == l->verbose)
845  {
847  "Master [%u] -> Slave [%u]: delta: %llu us, bytes (sent/received): %u / %u; throughput send/recv: %u / %u\n",
848  c_m, c_s,
849  (unsigned long long) delta.rel_value_us,
850  mlt->total_bytes_sent,
852  slt->throughput_sent,
853  slt->throughput_recv);
854  }
855  else
857  "Master [%u]: slave [%u]\n",
858  bp->peer->no, p->dest->no);
859  }
860  }
861 }
unsigned int total_bytes_sent
Total number of bytes this peer has sent.
unsigned int total_bytes_sent
Total number of bytes this peer has sent.
Definition: ats-testing.h:217
unsigned int messages_sent
Number of messages sent to this partner.
Definition: ats-testing.h:315
unsigned int total_bytes_received
Total number of bytes this peer has received.
Definition: ats-testing.h:227
A single logging time step for a partner.
uint64_t rel_value_us
The actual value.
static struct GNUNET_TIME_Relative delta
Definition: speedup.c:35
struct PeerLoggingTimestep * head
DLL for logging entries: head.
unsigned int throughput_recv
Total inbound throughput for master in Bytes / s.
unsigned int total_messages_received
Total number of messages this peer has received.
#define GNUNET_TIME_UNIT_SECONDS
One second.
double pref_bandwidth
Current preference values for bandwidth.
Definition: ats-testing.h:350
struct BenchmarkPartner * partners
Array of partners with num_slaves entries (if master) or num_master entries (if slave) ...
Definition: ats-testing.h:191
unsigned int total_messages_received
Total number of messages this peer has received.
Definition: ats-testing.h:222
struct PartnerLoggingTimestep * slaves_log
Logs for slaves.
enum GNUNET_NetworkType ats_network_type
struct BenchmarkPeer * slave
Peer.
unsigned int bytes_received
Number of bytes received from this partner.
Definition: ats-testing.h:330
struct BenchmarkPeer * peer
Peer.
struct PeerLoggingTimestep * prev
Prev in DLL.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
struct LoggingPeer * lp
Log structure of length num_peers.
unsigned int total_messages_sent
Total number of messages this peer has sent.
Definition: ats-testing.h:212
unsigned int total_bytes_sent
Total number of bytes this peer has sent.
A single logging time step for a peer.
unsigned int total_messages_sent
Total number of messages this peer has sent.
int num_partners
Number of partners.
Definition: ats-testing.h:196
int no
Unique identifier.
Definition: ats-testing.h:121
static struct GNUNET_OS_Process * p
Helper process we started.
Definition: gnunet-qr.c:59
unsigned int total_app_rtt
Accumulated RTT for all messages.
Definition: ats-testing.h:310
uint32_t bandwidth_in
Bandwidth assigned inbound.
Definition: ats-testing.h:340
double pref_delay
Current preference values for delay.
Definition: ats-testing.h:355
unsigned int total_app_rtt
Accumulated RTT for all messages.
Information about a benchmarking partner.
Definition: ats-testing.h:275
struct GNUNET_TIME_Relative delay
Delay.
unsigned int messages_received
Number of messages received from this partner.
Definition: ats-testing.h:325
uint32_t bandwidth_out
Bandwidth assigned outbound.
Definition: ats-testing.h:345
struct GNUNET_TIME_Absolute start
Start time.
unsigned int app_rtt
Current application level delay.
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:118
Entry for a benchmark peer.
unsigned int total_messages_received
Total number of messages this peer has received.
unsigned int throughput_sent
Total outbound throughput for master in Bytes / s.
unsigned int total_throughput_send
Total outbound throughput for master in Bytes / s.
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
struct GNUNET_TIME_Relative ats_delay
enum GNUNET_NetworkType scope
Which network scope does the respective address belong to? This property does not change...
struct GNUNET_TIME_Absolute timestamp
Logging timestamp.
unsigned int bytes_sent
Number of bytes sent to this partner.
Definition: ats-testing.h:320
unsigned int total_messages_sent
Total number of messages this peer has sent.
struct PeerLoggingTimestep * tail
DLL for logging entries: tail.
#define GNUNET_log(kind,...)
unsigned int total_throughput_recv
Total inbound throughput for master in Bytes / s.
int num_masters
Reference to perf_ats&#39; masters.
#define GNUNET_YES
Definition: gnunet_common.h:77
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_difference(struct GNUNET_TIME_Absolute start, struct GNUNET_TIME_Absolute end)
Compute the time difference between the given start and end times.
Definition: time.c:354
struct GNUNET_ATS_Properties props
Current ATS properties.
Definition: ats-testing.h:335
unsigned int total_bytes_received
Total number of bytes this peer has received.
unsigned int distance
Distance on network layer (required for distance-vector routing) in hops.
struct BenchmarkPeer * dest
The partner peer.
Definition: ats-testing.h:285
#define GNUNET_malloc(size)
Wrapper around malloc.
unsigned int total_bytes_received
Total number of bytes this peer has received.
Time for relative time used by GNUnet, in microseconds.
uint32_t utilization_out
Actual traffic on this connection from this peer to the other peer.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_logging_write_to_file()

void GNUNET_ATS_TEST_logging_write_to_file ( struct LoggingHandle l,
const char *  test_name,
int  plots 
)

Write logging data to file.

Parameters
llogging handle to use
test_namename of the current test
plotscreate gnuplots: GNUNET_YES or GNUNET_NO

Definition at line 447 of file ats-testing-log.c.

References GNUNET_TIME_Absolute::abs_value_us, PartnerLoggingTimestep::app_rtt, PartnerLoggingTimestep::ats_delay, PartnerLoggingTimestep::ats_distance, PartnerLoggingTimestep::ats_network_type, PartnerLoggingTimestep::ats_utilization_in, PartnerLoggingTimestep::ats_utilization_out, PartnerLoggingTimestep::bandwidth_in, PartnerLoggingTimestep::bandwidth_out, data, removetrailingwhitespace::f, GNUNET_asprintf(), GNUNET_break, GNUNET_DISK_file_close(), GNUNET_DISK_file_open(), GNUNET_DISK_file_write(), GNUNET_DISK_OPEN_CREATE, GNUNET_DISK_OPEN_WRITE, GNUNET_DISK_PERM_USER_READ, GNUNET_DISK_PERM_USER_WRITE, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_free, GNUNET_log, GNUNET_log_strerror_file, GNUNET_OK, GNUNET_SYSERR, GNUNET_TIME_absolute_get(), GNUNET_TIME_absolute_get_difference(), GNUNET_YES, LoggingPeer::head, LoggingHandle::lp, LoggingHandle::name, PeerLoggingTimestep::next, BenchmarkPeer::no, LoggingHandle::num_masters, BenchmarkPeer::num_partners, LoggingHandle::num_slaves, LoggingPeer::peer, PartnerLoggingTimestep::pref_bandwidth, PartnerLoggingTimestep::pref_delay, GNUNET_TIME_Relative::rel_value_us, PartnerLoggingTimestep::slave, PeerLoggingTimestep::slaves_log, LoggingPeer::start, PartnerLoggingTimestep::throughput_recv, PartnerLoggingTimestep::throughput_sent, PeerLoggingTimestep::timestamp, PartnerLoggingTimestep::total_bytes_received, PeerLoggingTimestep::total_bytes_received, PartnerLoggingTimestep::total_bytes_sent, PeerLoggingTimestep::total_bytes_sent, PartnerLoggingTimestep::total_messages_received, PeerLoggingTimestep::total_messages_received, PartnerLoggingTimestep::total_messages_sent, PeerLoggingTimestep::total_messages_sent, PeerLoggingTimestep::total_throughput_recv, PeerLoggingTimestep::total_throughput_send, LoggingHandle::verbose, write_bw_gnuplot_script(), write_rtt_gnuplot_script(), and write_throughput_gnuplot_script().

Referenced by experiment_done_cb().

450 {
451  struct GNUNET_DISK_FileHandle *f[l->num_slaves];
452  struct GNUNET_DISK_FileHandle *f_m;
453  const char *tmp_exp_name;
454  char *filename_master;
455  char *filename_slaves[l->num_slaves];
456  char *data;
457  struct PeerLoggingTimestep *cur_lt;
458  struct PartnerLoggingTimestep *plt;
459  struct GNUNET_TIME_Absolute timestamp;
460  int c_m;
461  int c_s;
462 
463 
464  timestamp = GNUNET_TIME_absolute_get ();
465 
466  tmp_exp_name = experiment_name;
467  for (c_m = 0; c_m < l->num_masters; c_m++)
468  {
469  GNUNET_asprintf (&filename_master, "%s_%llu_master%u_%s",
470  experiment_name, timestamp.abs_value_us, c_m, l->name);
471  fprintf (stderr, "Writing data for master %u to file `%s'\n",
472  c_m, filename_master);
473 
474  f_m = GNUNET_DISK_file_open (filename_master,
479  if (NULL == f_m)
480  {
481  GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Cannot open log file `%s'\n",
482  filename_master);
483  GNUNET_free (filename_master);
484  return;
485  }
486 
487  GNUNET_asprintf (&data, "# master %u; experiment : %s\n"
488  "timestamp; timestamp delta; #messages sent; #bytes sent; #throughput sent; #messages received; #bytes received; #throughput received; \n",
489  c_m, experiment_name);
490  if (GNUNET_SYSERR == GNUNET_DISK_file_write (f_m, data, strlen (data)))
492  "Cannot write data to log file `%s'\n", filename_master);
493  GNUNET_free (data);
494 
495  for (c_s = 0; c_s < l->lp[c_m].peer->num_partners; c_s++)
496  {
497  GNUNET_asprintf (&filename_slaves[c_s], "%s_%llu_master%u_slave_%u_%s",
498  tmp_exp_name, timestamp.abs_value_us, c_m, c_s, l->name);
499 
500  fprintf (stderr, "Writing data for master %u slave %u to file `%s'\n",
501  c_m, c_s, filename_slaves[c_s]);
502 
503  f[c_s] = GNUNET_DISK_file_open (filename_slaves[c_s],
508  if (NULL == f[c_s])
509  {
510  GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Cannot open log file `%s'\n",
511  filename_slaves[c_s]);
512  GNUNET_free (filename_slaves[c_s]);
514  GNUNET_free (filename_master);
515  return;
516  }
517 
518  /* Header */
519  GNUNET_asprintf (&data, "# master %u; slave %u ; experiment : %s\n"
520  "timestamp; timestamp delta; #messages sent; #bytes sent; #throughput sent; #messages received; #bytes received; #throughput received; " \
521  "rtt; bw in; bw out; ats_cost_lan; ats_cost_wlan; ats_delay; ats_distance; ats_network_type; ats_utilization_up ;ats_utilization_down;" \
522  "pref bandwidth; pref delay\n",
523  c_m, c_s, experiment_name);
524  if (GNUNET_SYSERR == GNUNET_DISK_file_write (f[c_s], data, strlen (data)))
526  "Cannot write data to log file `%s'\n",
527  filename_slaves[c_s]);
528  GNUNET_free (data);
529  }
530 
531  for (cur_lt = l->lp[c_m].head; NULL != cur_lt; cur_lt = cur_lt->next)
532  {
533  if (l->verbose)
534  fprintf (stderr,
535  "Master [%u]: timestamp %llu %llu ; %u %u %u ; %u %u %u\n",
536  l->lp[c_m].peer->no,
537  (long long unsigned int) cur_lt->timestamp.abs_value_us,
538  (long long unsigned int) GNUNET_TIME_absolute_get_difference (
539  l->lp[c_m].start,
540  cur_lt
541  ->timestamp).rel_value_us / 1000,
542  cur_lt->total_messages_sent,
543  cur_lt->total_bytes_sent,
544  cur_lt->total_throughput_send,
545  cur_lt->total_messages_received,
546  cur_lt->total_bytes_received,
547  cur_lt->total_throughput_recv);
548 
549  /* Assembling master string */
550  GNUNET_asprintf (&data, "%llu;%llu;%u;%u;%u;%u;%u;%u;\n",
551  (long long unsigned int) cur_lt->timestamp.abs_value_us,
552  (long long unsigned
554  l->lp[c_m].start,
555  cur_lt
556  ->timestamp).
557  rel_value_us / 1000,
558  cur_lt->total_messages_sent,
559  cur_lt->total_bytes_sent,
560  cur_lt->total_throughput_send,
561  cur_lt->total_messages_received,
562  cur_lt->total_bytes_received,
563  cur_lt->total_throughput_recv);
564 
565  if (GNUNET_SYSERR == GNUNET_DISK_file_write (f_m, data, strlen (data)))
567  "Cannot write data to master file %u\n", c_m);
568  GNUNET_free (data);
569 
570 
571  for (c_s = 0; c_s < l->lp[c_m].peer->num_partners; c_s++)
572  {
573  plt = &cur_lt->slaves_log[c_s];
574  /* Log partners */
575 
576  /* Assembling slave string */
577  GNUNET_asprintf (&data,
578  "%llu;%llu;%u;%u;%u;%u;%u;%u;%.3f;%u;%u;%u;%u;%u;%u;%u;%.3f;%.3f\n",
579  (long long unsigned
580  int) cur_lt->timestamp.abs_value_us,
581  (long long unsigned
583  l->lp[c_m].start,
584  cur_lt
585  ->timestamp)
586  .rel_value_us / 1000,
587  plt->total_messages_sent,
588  plt->total_bytes_sent,
589  plt->throughput_sent,
592  plt->throughput_recv,
593  (double) plt->app_rtt / 1000,
594  plt->bandwidth_in,
595  plt->bandwidth_out,
596  plt->ats_delay,
597  plt->ats_distance,
598  plt->ats_network_type,
599  plt->ats_utilization_out,
600  plt->ats_utilization_in,
601  plt->pref_bandwidth,
602  plt->pref_delay);
603 
604  if (l->verbose)
605  fprintf (stderr,
606  "\t Slave [%u]: %u %u %u ; %u %u %u rtt %u delay %llu bw_in %u bw_out %u \n",
607  plt->slave->no,
608  plt->total_messages_sent,
609  plt->total_bytes_sent,
610  plt->throughput_sent,
613  plt->throughput_recv,
614  plt->app_rtt,
615  (long long unsigned int) plt->ats_delay.rel_value_us,
616  plt->bandwidth_in,
617  plt->bandwidth_out);
618 
619  if (GNUNET_SYSERR == GNUNET_DISK_file_write (f[c_s], data, strlen (
620  data)))
622  "Cannot write data to log file `%s'\n",
623  filename_slaves[c_s]);
624  GNUNET_free (data);
625  }
626  }
627 
628  for (c_s = 0; c_s < l->lp[c_m].peer->num_partners; c_s++)
629  {
630  if (GNUNET_SYSERR == GNUNET_DISK_file_close (f[c_s]))
631  {
633  "Cannot close log file for master[%u] slave[%u]\n", c_m,
634  c_s);
635  continue;
636  }
638  "Data file successfully written to log file for `%s'\n",
639  filename_slaves[c_s]);
640  }
641 
643  {
645  "close",
646  filename_master);
647  GNUNET_free (filename_master);
648  return;
649  }
651  "Data file successfully written to log file for master `%s'\n",
652  filename_master);
653 
654  if (GNUNET_YES == plots)
655  {
656  write_throughput_gnuplot_script (filename_master, &l->lp[c_m],
657  filename_slaves, l->num_slaves);
658  write_rtt_gnuplot_script (filename_master, &l->lp[c_m], filename_slaves,
659  l->num_slaves);
660  write_bw_gnuplot_script (filename_master, &l->lp[c_m], filename_slaves,
661  l->num_slaves);
662  }
663  }
664  GNUNET_free (filename_master);
665 }
unsigned int total_bytes_sent
Total number of bytes this peer has sent.
static void write_rtt_gnuplot_script(char *fn, struct LoggingPeer *lp, char **fs, int slaves)
Create file if it doesn&#39;t exist.
A single logging time step for a partner.
const char * name
int GNUNET_DISK_file_close(struct GNUNET_DISK_FileHandle *h)
Close an open file.
Definition: disk.c:1345
uint64_t rel_value_us
The actual value.
struct PeerLoggingTimestep * head
DLL for logging entries: head.
unsigned int throughput_recv
Total inbound throughput for master in Bytes / s.
unsigned int total_messages_received
Total number of messages this peer has received.
static void write_bw_gnuplot_script(char *fn, struct LoggingPeer *lp, char **fs, int slaves)
struct PartnerLoggingTimestep * slaves_log
Logs for slaves.
enum GNUNET_NetworkType ats_network_type
struct BenchmarkPeer * slave
Peer.
struct BenchmarkPeer * peer
Peer.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
struct LoggingPeer * lp
Log structure of length num_peers.
uint64_t abs_value_us
The actual value.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
unsigned int total_bytes_sent
Total number of bytes this peer has sent.
A single logging time step for a peer.
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
unsigned int total_messages_sent
Total number of messages this peer has sent.
int num_partners
Number of partners.
Definition: ats-testing.h:196
int no
Unique identifier.
Definition: ats-testing.h:121
#define GNUNET_log_strerror_file(level, cmd, filename)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; with the mess...
ssize_t GNUNET_DISK_file_write(const struct GNUNET_DISK_FileHandle *h, const void *buffer, size_t n)
Write a buffer to a file.
Definition: disk.c:820
struct GNUNET_TIME_Absolute start
Start time.
unsigned int app_rtt
Current application level delay.
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:118
unsigned int total_messages_received
Total number of messages this peer has received.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
unsigned int throughput_sent
Total outbound throughput for master in Bytes / s.
Open the file for writing.
unsigned int total_throughput_send
Total outbound throughput for master in Bytes / s.
struct GNUNET_TIME_Relative ats_delay
struct GNUNET_TIME_Absolute timestamp
Logging timestamp.
unsigned int total_messages_sent
Total number of messages this peer has sent.
#define GNUNET_log(kind,...)
unsigned int total_throughput_recv
Total inbound throughput for master in Bytes / s.
struct PeerLoggingTimestep * next
Next in DLL.
int num_masters
Reference to perf_ats&#39; masters.
Time for absolute times used by GNUnet, in microseconds.
#define GNUNET_YES
Definition: gnunet_common.h:77
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_difference(struct GNUNET_TIME_Absolute start, struct GNUNET_TIME_Absolute end)
Compute the time difference between the given start and end times.
Definition: time.c:354
unsigned int total_bytes_received
Total number of bytes this peer has received.
uint32_t data
The data value.
static void write_throughput_gnuplot_script(char *fn, struct LoggingPeer *lp, char **fs, int slaves)
struct GNUNET_DISK_FileHandle * GNUNET_DISK_file_open(const char *fn, enum GNUNET_DISK_OpenFlags flags, enum GNUNET_DISK_AccessPermissions perm)
Open a file.
Definition: disk.c:1268
Handle used to access files (and pipes).
unsigned int total_bytes_received
Total number of bytes this peer has received.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_get_peer()

struct BenchmarkPeer* GNUNET_ATS_TEST_get_peer ( int  src)

Topology related functions.

Definition at line 894 of file ats-testing.c.

References GNUNET_ATS_TEST_Topology::mps, and GNUNET_ATS_TEST_Topology::num_masters.

Referenced by enforce_start_preference(), and enforce_start_send().

895 {
896  if (src > top->num_masters)
897  return NULL;
898  return &top->mps[src];
899 }
struct GNUNET_ATS_TEST_Topology * top
Definition: ats-testing.c:53
struct BenchmarkPeer * mps
Array of master peers.
Definition: ats-testing.h:436
unsigned int num_masters
Number master peers.
Definition: ats-testing.h:431
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_get_partner()

struct BenchmarkPartner* GNUNET_ATS_TEST_get_partner ( int  src,
int  dest 
)

Definition at line 903 of file ats-testing.c.

References BenchmarkPartner::dest, GNUNET_ATS_TEST_Topology::mps, GNUNET_ATS_TEST_Topology::num_masters, GNUNET_ATS_TEST_Topology::num_slaves, and BenchmarkPeer::partners.

Referenced by enforce_start_preference(), enforce_start_send(), enforce_stop_preference(), and enforce_stop_send().

905 {
906  if (src > top->num_masters)
907  return NULL;
908  if (dest > top->num_slaves)
909  return NULL;
910  return &top->mps[src].partners[dest];
911 }
struct BenchmarkPartner * partners
Array of partners with num_slaves entries (if master) or num_master entries (if slave) ...
Definition: ats-testing.h:191
struct GNUNET_ATS_TEST_Topology * top
Definition: ats-testing.c:53
unsigned int num_slaves
Number slave peers.
Definition: ats-testing.h:441
struct BenchmarkPeer * mps
Array of master peers.
Definition: ats-testing.h:436
unsigned int num_masters
Number master peers.
Definition: ats-testing.h:431
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_create_topology()

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_ATS_AddressInformationCallback  log_request_cb 
)

Create a topology for ats testing.

Parameters
nametest name
cfg_fileconfiguration file to use for the peers
num_slavesnumber of slaves
num_mastersnumber of masters
test_coreconnect to CORE service (GNUNET_YES) or transport (GNUNET_NO)
done_cbfunction to call when topology is setup
done_cb_clscls for callback
log_request_cbcallback to call when logging is required
nametest name
cfg_fileconfiguration file to use for the peers
num_slavesnumber of slaves
num_mastersnumber of masters
test_coreconnect to CORE service (GNUNET_YES) or transport (GNUNET_NO)
done_cbfunction to call when topology is setup
done_cb_clscls for callback
log_request_cbcallback to call when logging is required

Definition at line 927 of file ats-testing.c.

References GNUNET_ATS_TEST_Topology::ats_perf_cb, controller_event_cb(), GNUNET_ATS_TEST_Topology::done_cb, GNUNET_ATS_TEST_Topology::done_cb_cls, event_mask, GNUNET_new, GNUNET_new_array, GNUNET_TESTBED_ET_CONNECT, GNUNET_TESTBED_ET_OPERATION_FINISHED, GNUNET_TESTBED_test_run(), main_run(), GNUNET_ATS_TEST_Topology::mps, GNUNET_ATS_TEST_Topology::num_masters, GNUNET_ATS_TEST_Topology::num_slaves, GNUNET_ATS_TEST_Topology::sps, and GNUNET_ATS_TEST_Topology::test_core.

Referenced by main().

936 {
938  top->num_masters = num_masters;
939  top->num_slaves = num_slaves;
940  top->done_cb = done_cb;
941  top->done_cb_cls = done_cb_cls;
942  top->test_core = test_core;
943  top->ats_perf_cb = log_request_cb;
944  top->mps = GNUNET_new_array (num_masters,
945  struct BenchmarkPeer);
946  top->sps = GNUNET_new_array (num_slaves,
947  struct BenchmarkPeer);
948 
949  /* Start topology */
950  uint64_t event_mask;
951  event_mask = 0;
952  event_mask |= (1LL << GNUNET_TESTBED_ET_CONNECT);
953  event_mask |= (1LL << GNUNET_TESTBED_ET_OPERATION_FINISHED);
955  cfg_file,
956  num_slaves + num_masters,
957  event_mask,
958  &controller_event_cb, NULL,
959  &main_run, NULL);
960 }
int test_core
Test core (GNUNET_YES) or transport (GNUNET_NO)
Definition: ats-testing.h:406
int GNUNET_TESTBED_test_run(const char *testname, const char *cfg_filename, unsigned int num_peers, uint64_t event_mask, GNUNET_TESTBED_ControllerCallback cc, void *cc_cls, GNUNET_TESTBED_TestMaster test_master, void *test_master_cls)
Convenience method for running a "simple" test on the local system with a single call from &#39;main&#39;...
struct GNUNET_ATS_TEST_Topology * top
Definition: ats-testing.c:53
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static void main_run(void *cls, struct GNUNET_TESTBED_RunHandle *h, unsigned int num_peers, struct GNUNET_TESTBED_Peer **peers_, unsigned int links_succeeded, unsigned int links_failed)
Signature of a main function for a testcase.
Definition: ats-testing.c:786
Information we track for a peer in the testbed.
Definition: ats-testing.h:111
A requested testbed operation has been completed.
#define GNUNET_new_array(n, type)
Allocate a size n array with structs or unions of the given type.
static const char * cfg_file
Configuration filename.
uint64_t event_mask
Global event mask for all testbed events.
unsigned int num_slaves
Number slave peers.
Definition: ats-testing.h:441
struct BenchmarkPeer * sps
Array of slave peers.
Definition: ats-testing.h:446
struct BenchmarkPeer * mps
Array of master peers.
Definition: ats-testing.h:436
A connection between two peers was established.
GNUNET_ATS_AddressInformationCallback ats_perf_cb
Definition: ats-testing.h:465
const char * name
static void controller_event_cb(void *cls, const struct GNUNET_TESTBED_EventInformation *event)
Controller event callback.
Definition: ats-testing.c:875
GNUNET_ATS_TEST_TopologySetupDoneCallback done_cb
Definition: ats-testing.h:463
unsigned int num_masters
Number master peers.
Definition: ats-testing.h:431
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ATS_TEST_shutdown_topology()

void GNUNET_ATS_TEST_shutdown_topology ( void  )

Shutdown topology.

Definition at line 967 of file ats-testing.c.

References GNUNET_SCHEDULER_shutdown().

Referenced by do_shutdown().

968 {
969  if (NULL == top)
970  return;
972 }
struct GNUNET_ATS_TEST_Topology * top
Definition: ats-testing.c:53
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:526
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ cfg

Handle to our configuration.

Handle to our configuration.

Definition at line 51 of file ats-testing.c.