/* This file is part of GNUnet. 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 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . SPDX-License-Identifier: AGPL3.0-or-later */ /** * @file ats/perf_ats.c * @brief ats benchmark: start peers and modify preferences, monitor change over time * @author Christian Grothoff * @author Matthias Wachs */ #include "platform.h" #include "gnunet_util_lib.h" #include "gnunet_testbed_service.h" #include "gnunet_ats_service.h" #include "gnunet_core_service.h" #include "ats-testing.h" #define TEST_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, \ 120) #define BENCHMARK_DURATION GNUNET_TIME_relative_multiply ( \ GNUNET_TIME_UNIT_SECONDS, 10) #define LOGGING_FREQUENCY GNUNET_TIME_relative_multiply ( \ GNUNET_TIME_UNIT_MILLISECONDS, 500) #define TESTNAME_PREFIX "perf_ats_" #define DEFAULT_SLAVES_NUM 2 #define DEFAULT_MASTERS_NUM 1 #define TEST_ATS_PREFRENCE_FREQUENCY GNUNET_TIME_relative_multiply ( \ GNUNET_TIME_UNIT_SECONDS, 1) #define TEST_ATS_PREFRENCE_START 1.0 #define TEST_ATS_PREFRENCE_DELTA 1.0 #define TEST_MESSAGE_TYPE_PING 12345 #define TEST_MESSAGE_TYPE_PONG 12346 #define TEST_MESSAGE_SIZE 1000 #define TEST_MESSAGE_FREQUENCY GNUNET_TIME_relative_multiply ( \ GNUNET_TIME_UNIT_SECONDS, 1) /** * 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; /** * 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; }; /** * 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 */ struct GNUNET_SCHEDULER_Task *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; }; /* end of file perf_ats.h */