29#include "gnunet_testbed_service.h"
35 GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, __VA_ARGS__)
38 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
68 struct GNUNET_TESTBED_Peer *
peer;
73 struct GNUNET_TESTBED_Operation *
op;
297 for (
unsigned int cnt = 0; cnt <
num_peers; cnt++)
305 if (NULL != ac->
hash)
315 GNUNET_TESTBED_operation_done (
a_ctx[cnt].
op);
341 struct GNUNET_TESTBED_Operation *
op,
344 MESSAGE (
"# Outgoing (core) bandwidth: %llu bytes\n",
346 MESSAGE (
"# Incoming (core) bandwidth: %llu bytes\n",
349 "Benchmark done. Collect data via gnunet-statistics, then press ENTER to exit.\n");
368 const struct GNUNET_TESTBED_Peer *peer,
374 static const char *s_sent =
"# bytes encrypted";
375 static const char *s_recv =
"# bytes decrypted";
377 if (0 == strncmp (s_sent,
name, strlen (s_sent)))
379 else if (0 == strncmp (s_recv,
name, strlen (s_recv)))
388 MESSAGE (
"# PUTS started: %llu\n",
390 MESSAGE (
"# PUTS succeeded: %llu\n",
394 MESSAGE (
"# GETS succeeded: %u\n",
396 MESSAGE (
"# GETS failed: %u\n",
398 MESSAGE (
"# average_put_path_length: %f\n",
400 MESSAGE (
"# average_get_path_length: %f\n",
436 GNUNET_TESTBED_operation_done (
ctx->op);
475 unsigned int get_path_length,
477 unsigned int put_path_length,
487 DEBUG (
"We found a GET request; %u remaining\n",
497 GNUNET_TESTBED_operation_done (
ctx->op);
502 DEBUG (
"total_put_path_length = %u,put_path \n",
542 DEBUG (
"GET_REQUEST_START key %s \n",
609 struct GNUNET_TESTBED_Operation *
op;
614 GNUNET_TESTBED_operation_done (
op);
632 DEBUG (
"PUT_REQUEST_START key %s\n",
659 struct GNUNET_TESTBED_Operation *
op,
673 "Connection to DHT service failed: %s\n",
675 GNUNET_TESTBED_operation_done (
ctx->op);
691 if (NULL == ac->
hash)
788 DEBUG (
"GNUNET_TESTBED_service_connect\n");
790 for (
unsigned int i = 0; i <
n_active; i++)
795 ctx->op = GNUNET_TESTBED_service_connect (
ctx,
816 struct GNUNET_TESTBED_Operation *
op,
823 GNUNET_TESTBED_operation_done (
ctx->op);
826 DEBUG (
"Peers Started = %d; num_peers = %d \n",
847 struct GNUNET_TESTBED_RunHandle *
h,
849 struct GNUNET_TESTBED_Peer **
peers,
850 unsigned int links_succeeded,
851 unsigned int links_failed)
861 MESSAGE (
"%u peers started, %u/%u links up\n",
864 links_succeeded + links_failed);
893 for (
unsigned int cnt = 0; cnt <
num_peers; cnt++)
896 a_ctx[cnt].
op = GNUNET_TESTBED_peer_manage_service (&
a_ctx[cnt],
925 _ (
"Exiting as the number of peers is %u\n"),
964 "number of PUTs to perform per peer"),
970 "name of the file with the login information for the testbed"),
976 "delay between rounds for collecting statistics (default: 30 sec)"),
982 "delay to start doing PUTs (default: 1 sec)"),
988 "delay to start doing GETs (default: 5 min)"),
999 "chance that a peer is selected at random for PUTs"),
1005 "timeout for DHT PUT and GET requests (default: 1 min)"),
1020 "gnunet-dht-profiler",
1022 "Measure quality and performance of the DHT service."),
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_OPTION_END
struct GNUNET_GETOPT_CommandLineOption options[]
#define gettext_noop(String)
static struct GNUNET_ARM_Operation * op
Current operation.
static struct GNUNET_ARM_Handle * h
Connection with ARM.
static char * data
The data to insert into the dht.
struct GNUNET_HashCode key
The key used in the DHT.
static struct GNUNET_FS_Handle * ctx
const struct GNUNET_CONFIGURATION_Handle * config
static char * name
Name (label) of the records to list.
static char * value
Value of the record to add/remove.
static uint32_t type
Type string converted to DNS type value.
static uint64_t event_mask
Global event mask for all testbed events.
struct GNUNET_CONTAINER_MultiPeerMap * peers
Map from PIDs to struct CadetPeer entries.
static char * subsystem
Set to subsystem that we're going to get stats for (or NULL for all).
static struct GNUNET_TESTBED_Peer ** testbed_handles
Testbed peer handles.
static unsigned long long n_puts_ok
Number of DHT PUTs succeeded.
static void get_iter(void *cls, struct GNUNET_TIME_Absolute exp, const struct GNUNET_HashCode *key, const struct GNUNET_PeerIdentity *trunc_peer, const struct GNUNET_DHT_PathElement *get_path, unsigned int get_path_length, const struct GNUNET_DHT_PathElement *put_path, unsigned int put_path_length, enum GNUNET_BLOCK_Type type, size_t size, const void *data)
Iterator called on each result obtained for a DHT operation that expects a reply.
static void test_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.
static void dht_connected(void *cls, struct GNUNET_TESTBED_Operation *op, void *ca_result, const char *emsg)
Connection to DHT has been established.
static void * dht_connect(void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg)
Connect to DHT service and return the DHT client handler.
static struct GNUNET_TIME_Relative delay_put
The delay to start puts.
static enum @44 mode
Should we do a PUT (mode = 0) or GET (mode = 1);.
static unsigned int n_gets_ok
Number of DHT GETs succeeded.
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration.
static int bandwidth_stats_iterator(void *cls, const struct GNUNET_TESTBED_Peer *peer, const char *subsystem, const char *name, uint64_t value, int is_persistent)
Process statistic values.
static double average_get_path_length
Average number of hops taken to do get.
static int in_shutdown
Are we shutting down.
static void delayed_get(void *cls)
Task to do DHT GETs.
static struct GNUNET_TESTBED_Operation * bandwidth_stats_op
Testbed Operation (to get stats).
static void do_shutdown(void *cls)
Shutdown task.
static void delayed_put(void *cls)
Task to do DHT PUTs.
static unsigned int n_active
Number of active peers.
static char * hosts_file
Name of the file with the hosts to run the test over.
static struct GNUNET_TIME_Relative delay_get
The delay to start puts.
static unsigned int total_put_path_length
Total put path length across all peers.
static unsigned int n_dht
Number of DHT service connections we currently have.
static void bandwidth_stats_cont(void *cls, struct GNUNET_TESTBED_Operation *op, const char *emsg)
Stats callback.
static void cancel_get(void *cls)
Task to cancel DHT GET.
static unsigned int n_gets_fail
Number of DHT GETs succeeded.
static unsigned int replication
Replication degree.
static void service_started(void *cls, struct GNUNET_TESTBED_Operation *op, const char *emsg)
Callback called when DHT service on the peer is started.
static void start_profiling(void)
Connect to DHT services of active peers.
static struct GNUNET_TIME_Relative timeout
The timeout for GET and PUT.
static unsigned long long n_puts
Number of DHT PUTs made.
static struct GNUNET_TIME_Relative delay_stats
The delay between rounds for collecting statistics.
static struct Context * a_ctx
An array of contexts.
static unsigned int total_get_path_length
Total get path length across all peers.
static uint64_t outgoing_bandwidth
Total number of messages sent by peer.
static double average_put_path_length
Average number of hops taken to do put.
int main(int argc, char *const *argv)
Main function.
static unsigned int put_probability
Number of peers which should perform a PUT out of 100 peers.
static void run(void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *config)
Main function that will be run by the scheduler.
static unsigned int num_puts_per_peer
Number of DHT PUTs to be made per peer.
static void dht_disconnect(void *cls, void *op_result)
Adapter function called to destroy a connection to a service.
static struct ActiveContext * a_ac
Array of active peers.
static unsigned int num_peers
Number of peers.
static int peers_started
Counter to keep track of peers added to peer_context lists.
static uint64_t incoming_bandwidth
Total number of messages received by peer.
static unsigned int n_gets
Number of DHT GETs made.
static void put_cont(void *cls)
Conclude individual PUT operation, schedule the next one.
#define GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE
What is the maximum size for encrypted messages? Note that this number imposes a clear limit on the m...
uint64_t GNUNET_CRYPTO_random_u64(enum GNUNET_CRYPTO_Quality mode, uint64_t max)
Generate a random unsigned 64-bit value.
void GNUNET_CRYPTO_random_block(enum GNUNET_CRYPTO_Quality mode, void *buffer, size_t length)
Fill block with a random values.
uint32_t GNUNET_CRYPTO_random_u32(enum GNUNET_CRYPTO_Quality mode, uint32_t i)
Produce a random value.
@ GNUNET_CRYPTO_QUALITY_WEAK
No good quality of the operation is needed (i.e., random numbers can be pseudo-random).
void GNUNET_DHT_put_cancel(struct GNUNET_DHT_PutHandle *ph)
Cancels a DHT PUT operation.
struct GNUNET_DHT_PutHandle * GNUNET_DHT_put(struct GNUNET_DHT_Handle *handle, const struct GNUNET_HashCode *key, uint32_t desired_replication_level, enum GNUNET_DHT_RouteOption options, enum GNUNET_BLOCK_Type type, size_t size, const void *data, struct GNUNET_TIME_Absolute exp, GNUNET_SCHEDULER_TaskCallback cont, void *cont_cls)
Perform a PUT operation storing data in the DHT.
struct GNUNET_DHT_Handle * GNUNET_DHT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, unsigned int ht_len)
Initialize the connection with the DHT service.
void GNUNET_DHT_get_stop(struct GNUNET_DHT_GetHandle *get_handle)
Stop async DHT-get.
struct GNUNET_DHT_GetHandle * GNUNET_DHT_get_start(struct GNUNET_DHT_Handle *handle, enum GNUNET_BLOCK_Type type, const struct GNUNET_HashCode *key, uint32_t desired_replication_level, enum GNUNET_DHT_RouteOption options, const void *xquery, size_t xquery_size, GNUNET_DHT_GetIterator iter, void *iter_cls)
Perform an asynchronous GET operation on the DHT identified.
void GNUNET_DHT_disconnect(struct GNUNET_DHT_Handle *handle)
Shutdown connection with the DHT service.
@ GNUNET_DHT_RO_NONE
Default.
@ GNUNET_DHT_RO_RECORD_ROUTE
We should keep track of the route that the message took in the P2P network.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_uint(char shortName, const char *name, const char *argumentHelp, const char *description, unsigned int *val)
Allow user to specify an unsigned int.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_relative_time(char shortName, const char *name, const char *argumentHelp, const char *description, struct GNUNET_TIME_Relative *val)
Allow user to specify a struct GNUNET_TIME_Relative (using human-readable "fancy" time).
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_string(char shortName, const char *name, const char *argumentHelp, const char *description, char **str)
Allow user to specify a string.
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
#define GNUNET_log(kind,...)
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
#define GNUNET_log_strerror(level, cmd)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...
@ GNUNET_ERROR_TYPE_ERROR
#define GNUNET_new_array(n, type)
Allocate a size n array with structs or unions of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
enum GNUNET_GenericReturnValue GNUNET_PROGRAM_run(const struct GNUNET_OS_ProjectData *pd, int argc, char *const *argv, const char *binaryName, const char *binaryHelp, const struct GNUNET_GETOPT_CommandLineOption *options, GNUNET_PROGRAM_Main task, void *task_cls)
Run a standard GNUnet command startup sequence (initialize loggers and configuration,...
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received,...
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
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.
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.
#define GNUNET_TIME_UNIT_SECONDS
One second.
struct GNUNET_TIME_Relative GNUNET_TIME_relative_multiply(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Multiply relative time by a given factor.
#define GNUNET_TIME_UNIT_FOREVER_ABS
Constant used to specify "forever".
static unsigned int size
Size of the "table".
GNUNET_BLOCK_Type
WARNING: This header is generated! In order to add DHT block types, you must register them in GANA,...
@ GNUNET_BLOCK_TYPE_TEST
Block for testing.
Context for a peer which actively does DHT PUT/GET.
struct GNUNET_HashCode * hash
The hashes of the values stored via this activity context.
struct GNUNET_DHT_Handle * dht
Handler to the DHT service.
uint16_t nrefs
The number of peers currently doing GET on our data.
unsigned int put_count
How many puts should we still issue?
struct GNUNET_SCHEDULER_Task * delay_task
Delay task.
struct ActiveContext * get_ac
The active context used for our DHT GET.
struct GNUNET_DHT_PutHandle * dht_put
The put handle.
struct Context * ctx
The linked peer context.
struct GNUNET_DHT_GetHandle * dht_get
The get handle.
Context to hold data of peer.
struct GNUNET_TESTBED_Peer * peer
The testbed peer this context belongs to.
struct ActiveContext * ac
Active context; NULL if this peer is not an active peer.
struct GNUNET_TESTBED_Operation * op
Testbed operation acting on this peer.
Connection to the DHT service.
A (signed) path tracking a block's flow through the DHT is represented by an array of path elements,...
Definition of a command line option.
The identity of the host (wraps the signing key of the peer).
Entry in list of pending tasks.
Time for absolute times used by GNUnet, in microseconds.
Time for relative time used by GNUnet, in microseconds.
uint64_t rel_value_us
The actual value.