34 #define MESSAGE(...) \
35 GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, __VA_ARGS__)
38 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
297 for (
unsigned int cnt = 0; cnt <
num_peers; cnt++)
303 if (NULL !=
ac->delay_task)
305 if (NULL !=
ac->hash)
307 if (NULL !=
ac->dht_put)
309 if (NULL !=
ac->dht_get)
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");
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",
430 ac->delay_task = NULL;
475 unsigned int get_path_length,
477 unsigned int put_path_length,
487 DEBUG (
"We found a GET request; %u remaining\n",
493 if (
ac->delay_task != NULL)
495 ac->delay_task = NULL;
502 DEBUG (
"total_put_path_length = %u,put_path \n",
528 ac->delay_task = NULL;
542 DEBUG (
"GET_REQUEST_START key %s \n",
605 ac->delay_task = NULL;
606 if (0 ==
ac->put_count)
631 &
ac->hash[
ac->put_count]);
632 DEBUG (
"PUT_REQUEST_START key %s\n",
635 &
ac->hash[
ac->put_count],
673 "Connection to DHT service failed: %s\n",
689 ac->hash = calloc (
ac->put_count,
691 if (NULL ==
ac->hash)
788 DEBUG (
"GNUNET_TESTBED_service_connect\n");
790 for (
unsigned int i = 0; i <
n_active; i++)
826 DEBUG (
"Peers Started = %d; num_peers = %d \n",
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++)
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)"),
1024 "gnunet-dht-profiler",
1026 "Measure quality and performance of the DHT service."),
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_OPTION_END
struct GNUNET_GETOPT_CommandLineOption options[]
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.
#define gettext_noop(String)
static struct GNUNET_ARM_Operation * op
Current operation.
static struct GNUNET_ARM_Handle * h
Connection with ARM.
static struct CadetPeer * peers
Operation to get peer ids.
struct GNUNET_HashCode key
The key used in the DHT.
uint32_t data
The data value.
static char * value
Value of the record to add/remove.
static struct GNUNET_MQ_Envelope * ac
Handle to current GNUNET_PEERINFO_add_peer() operation.
static const struct GNUNET_CONFIGURATION_Handle * config
static char * subsystem
Set to subsystem that we're going to get stats for (or NULL for all).
uint64_t event_mask
Global event mask for all testbed events.
static struct GNUNET_DNSSTUB_Context * ctx
Context for DNS resolution.
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 struct GNUNET_TIME_Relative delay_put
The delay to start puts.
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 enum @8 mode
Should we do a PUT (mode = 0) or GET (mode = 1);.
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 void * dht_connect(void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg)
Connect to DHT service and return the DHT client handler.
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.
API for writing tests and creating large-scale emulation testbeds for GNUnet.
#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.
void GNUNET_DHT_get_stop(struct GNUNET_DHT_GetHandle *get_handle)
Stop async DHT-get.
struct GNUNET_DHT_Handle * GNUNET_DHT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, unsigned int ht_len)
Initialize the connection with the DHT service.
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.
void GNUNET_DHT_disconnect(struct GNUNET_DHT_Handle *handle)
Shutdown connection with the DHT service.
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.
@ 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(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_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_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_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
enum GNUNET_GenericReturnValue GNUNET_STRINGS_get_utf8_args(int argc, char *const *argv, int *u8argc, char *const **u8argv)
Returns utf-8 encoded arguments.
void GNUNET_TESTBED_operation_done(struct GNUNET_TESTBED_Operation *operation)
This function is used to signal that the event information (struct GNUNET_TESTBED_EventInformation) f...
struct GNUNET_TESTBED_Operation * GNUNET_TESTBED_peer_manage_service(void *op_cls, struct GNUNET_TESTBED_Peer *peer, const char *service_name, GNUNET_TESTBED_OperationCompletionCallback cb, void *cb_cls, unsigned int start)
Start or stop given service at a peer.
void GNUNET_TESTBED_run(const char *host_filename, const struct GNUNET_CONFIGURATION_Handle *cfg, 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 testbed with a single call.
struct GNUNET_TESTBED_Operation * GNUNET_TESTBED_service_connect(void *op_cls, struct GNUNET_TESTBED_Peer *peer, const char *service_name, GNUNET_TESTBED_ServiceConnectCompletionCallback cb, void *cb_cls, GNUNET_TESTBED_ConnectAdapter ca, GNUNET_TESTBED_DisconnectAdapter da, void *cada_cls)
Connect to a service offered by the given peer.
struct GNUNET_TESTBED_Operation * GNUNET_TESTBED_get_statistics(unsigned int num_peers, struct GNUNET_TESTBED_Peer **peers, const char *subsystem, const char *name, GNUNET_TESTBED_StatisticsIterator proc, GNUNET_TESTBED_OperationCompletionCallback cont, void *cls)
Convenience method that iterates over all (running) peers and retrieves all statistics from each peer...
#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 int op_result(struct GNUNET_OP_Handle *h, uint64_t op_id, int64_t result_code, const void *data, uint16_t data_size, void **ctx, uint8_t cancel)
Remove an operation, and call its result callback (unless it was cancelled).
static unsigned int size
Size of the "table".
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.
Opaque handle to an abstract operation to be executed by the testing framework.
A peer controlled by the testing framework.
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.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.