2 This file is part of GNUnet.
3 (C) 2010-2013 Christian Grothoff (and other contributing authors)
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
21 * @file ats/perf_ats.c
22 * @brief ats benchmark: start peers and modify preferences, monitor change over time
23 * @author Christian Grothoff
24 * @author Matthias Wachs
27 #include "gnunet_util_lib.h"
28 #include "gnunet_testbed_service.h"
29 #include "gnunet_ats_service.h"
30 #include "gnunet_core_service.h"
32 #define TEST_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 120)
33 #define BENCHMARK_DURATION GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10)
34 #define LOGGING_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 500)
35 #define TESTNAME_PREFIX "perf_ats_"
36 #define DEFAULT_SLAVES_NUM 2
37 #define DEFAULT_MASTERS_NUM 1
39 #define TEST_ATS_PREFRENCE_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1)
40 #define TEST_ATS_PREFRENCE_START 1.0
41 #define TEST_ATS_PREFRENCE_DELTA 1.0
43 #define TEST_MESSAGE_TYPE_PING 12345
44 #define TEST_MESSAGE_TYPE_PONG 12346
45 #define TEST_MESSAGE_SIZE 1000
46 #define TEST_MESSAGE_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1)
49 * Overall state of the performance benchmark
54 * Are we connected to ATS service of all peers: GNUNET_YES/NO
56 int connected_ATS_service;
59 * Are we connected to CORE service of all peers: GNUNET_YES/NO
61 int connected_COMM_service;
64 * Are we connected to all peers: GNUNET_YES/NO
69 * Are we connected to all slave peers on CORE level: GNUNET_YES/NO
74 * Are we connected to CORE service of all peers: GNUNET_YES/NO
81 * Information about a benchmarking partner
83 struct BenchmarkPartner
86 * The peer itself this partner belongs to
88 struct BenchmarkPeer *me;
93 struct BenchmarkPeer *dest;
96 * Core transmit handles
98 struct GNUNET_CORE_TransmitHandle *cth;
101 * Transport transmit handles
103 struct GNUNET_TRANSPORT_TransmitHandle *tth;
106 * Timestamp to calculate communication layer delay
108 struct GNUNET_TIME_Absolute last_message_sent;
111 * Accumulated RTT for all messages
113 unsigned int total_app_rtt;
116 * Number of messages sent to this partner
118 unsigned int messages_sent;
121 * Number of bytes sent to this partner
123 unsigned int bytes_sent;
126 * Number of messages received from this partner
128 unsigned int messages_received;
131 * Number of bytes received from this partner
133 unsigned int bytes_received;
135 /* Current ATS properties */
137 uint32_t ats_distance;
141 uint32_t bandwidth_in;
143 uint32_t bandwidth_out;
145 uint32_t ats_utilization_up;
147 uint32_t ats_utilization_down;
149 uint32_t ats_network_type;
151 uint32_t ats_cost_wan;
153 uint32_t ats_cost_lan;
155 uint32_t ats_cost_wlan;
160 * Information we track for a peer in the testbed.
165 * Handle with testbed.
167 struct GNUNET_TESTBED_Peer *peer;
175 * Is this peer a measter: GNUNET_YES/GNUNET_NO
182 struct GNUNET_PeerIdentity id;
185 * Testbed operation to get peer information
187 struct GNUNET_TESTBED_Operation *peer_id_op;
190 * Testbed operation to connect to ATS performance service
192 struct GNUNET_TESTBED_Operation *ats_perf_op;
195 * Testbed operation to connect to core
197 struct GNUNET_TESTBED_Operation *comm_op;
200 * ATS performance handle
202 struct GNUNET_ATS_PerformanceHandle *ats_perf_handle;
206 * Testbed connect operations to connect masters to slaves
208 struct TestbedConnectOperation *core_connect_ops;
213 struct GNUNET_CORE_Handle *ch;
218 struct GNUNET_TRANSPORT_Handle *th;
222 * Peer to set ATS preferences for
224 struct BenchmarkPeer *pref_partner;
230 GNUNET_SCHEDULER_TaskIdentifier ats_task;
239 * Array of partners with num_slaves entries (if master) or
240 * num_master entries (if slave)
242 struct BenchmarkPartner *partners;
250 * Number of core connections
252 int core_connections;
256 * Number of connections to slave peers
258 int core_slave_connections;
261 * Total number of messages this peer has sent
263 unsigned int total_messages_sent;
266 * Total number of bytes this peer has sent
268 unsigned int total_bytes_sent;
271 * Total number of messages this peer has received
273 unsigned int total_messages_received;
276 * Total number of bytes this peer has received
278 unsigned int total_bytes_received;
282 * Connect peers with testbed
284 struct TestbedConnectOperation
287 * The benchmarking master initiating this connection
289 struct BenchmarkPeer *master;
292 * The benchmarking slave to connect to
294 struct BenchmarkPeer *slave;
297 * Testbed operation to connect peers
299 struct GNUNET_TESTBED_Operation *connect_op;
302 typedef void (*GNUNET_ATS_TESTING_TopologySetupDoneCallback) (void *cls,
303 struct BenchmarkPeer *masters,
304 struct BenchmarkPeer *slaves);
306 struct GNUNET_ATS_TEST_Topology
311 GNUNET_SCHEDULER_TaskIdentifier shutdown_task;
316 GNUNET_SCHEDULER_TaskIdentifier progress_task;
324 * Test result logging
328 /**Test core (GNUNET_YES) or transport (GNUNET_NO)
348 * ATS preference value
353 * Number master peers
355 unsigned int num_masters;
358 * Array of master peers
360 struct BenchmarkPeer *mps;
365 unsigned int num_slaves;
368 * Array of slave peers
370 struct BenchmarkPeer *sps;
375 struct GNUNET_TIME_Relative perf_duration;
380 struct GNUNET_TIME_Relative log_frequency;
385 struct BenchmarkState state;
387 struct GNUNET_CORE_MessageHandler *handlers;
389 GNUNET_TRANSPORT_ReceiveCallback transport_recv_cb;
391 GNUNET_ATS_TESTING_TopologySetupDoneCallback done_cb;
397 GNUNET_ATS_TEST_create_topology (char *name, char *cfg_file,
398 unsigned int num_slaves,
399 unsigned int num_masters,
401 GNUNET_ATS_TESTING_TopologySetupDoneCallback done_cb,
403 struct GNUNET_CORE_MessageHandler *handlers,
404 GNUNET_TRANSPORT_ReceiveCallback transport_recv_cb);
407 GNUNET_ATS_TEST_shutdown_topology (void);
409 /* end of file perf_ats.c */