45 #define LOG(kind, ...) GNUNET_log_from (kind, "testbed-api-hosts", __VA_ARGS__);
50 #define LOG_DEBUG(...) LOG (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__);
55 #define API_VIOLATION(cond, errstr) \
60 LOG (GNUNET_ERROR_TYPE_ERROR, "API violation detected: %s\n", errstr); \
68 #define LOG_GAI(level, cmd, rc) \
72 _ ("`%s' failed at %s:%d with error: %s\n"), \
82 #define HOST_LIST_GROW_STEP 10
328 unsigned int new_size;
345 while (
id >= new_size)
373 static uint32_t uid_generator;
401 regmatch_t pmatch[6];
420 _ (
"Hosts file %s has no data\n"),
429 _ (
"Hosts file %s cannot be read\n"),
435 starting_host = NULL;
439 "^(([[:alnum:]]+)@)?"
440 "([[:alnum:]]+[-[:alnum:]_\\.]+)"
441 "(:([[:digit:]]{1,5}))?",
442 REG_EXTENDED | REG_ICASE));
443 while (offset < (
fs - 1))
446 if (((
data[offset] ==
'\n')) && (
buf != &
data[offset]))
454 if ((REG_NOMATCH == regexec (&rex,
buf, 6, pmatch, 0)) ||
455 (-1 == pmatch[3].rm_so))
458 "Error reading line `%s' in hostfile\n",
463 if (-1 != pmatch[2].rm_so)
465 size = pmatch[2].rm_eo - pmatch[2].rm_so;
470 if (-1 != pmatch[5].rm_so)
472 (void) sscanf (
buf + pmatch[5].rm_so,
"%5hd", &
port);
474 size = pmatch[3].rm_eo - pmatch[3].rm_so;
479 "Successfully read host %s, port %d and user %s from file\n",
485 if (NULL == starting_host)
495 else if ((
data[offset] ==
'\n') || (
data[offset] ==
'\0'))
500 if (NULL == starting_host)
519 struct addrinfo *
res;
520 const struct sockaddr_in *in_addr;
522 struct addrinfo hint;
525 hint.ai_family = AF_INET;
526 hint.ai_socktype = 0;
527 hint.ai_protocol = 0;
530 hint.ai_canonname = NULL;
535 if (0 != (rc = getaddrinfo (host,
"22", &hint, &
res)))
543 in_addr = (
const struct sockaddr_in *)
res->ai_addr;
544 hostip = inet_ntoa (in_addr->sin_addr);
547 LOG_DEBUG (
"Resolved [%s] to [%s]\n", host, hostip);
611 for (rc = host->
rc_head; NULL != rc; rc = rc->
next)
638 for (rc = host->
rc_head; NULL != rc; rc = rc->
next)
665 for (rc = host->
rc_head; NULL != rc; rc = rc->
next)
731 for (argp = 0; NULL != argv[argp]; argp++)
734 for (argp = 0; NULL != argv[argp]; argp++)
748 join_argv (
const char *
const *argv1,
const char *
const *argv2)
757 for (cnt = 0; NULL != argv1[cnt]; cnt++)
762 for (cnt = 0; NULL != argv2[cnt]; cnt++)
782 for (argp = 0; NULL != argv[argp]; argp++)
805 static const char *default_ssh_args[] =
810 "NoHostAuthenticationForLocalhost=yes",
812 "StrictHostKeyChecking=no",
814 "PasswordAuthentication=no",
826 if (NULL != (ssh_cmd =
getenv (
"GNUNET_TESTBED_RSH_CMD")))
829 ssh_cmd_cp = ssh_cmd;
830 for (
size = 0; NULL != (
arg = strtok (ssh_cmd,
" ")); ssh_cmd = NULL)
837 size = (
sizeof(default_ssh_args)) / (
sizeof(
const char *));
840 for (cnt = 0; cnt <
size; cnt++)
890 unsigned int append_cnt;
894 if (NULL != (rshell_cmd =
getenv (
"GNUNET_TESTBED_RSH_CMD_SUFFIX")))
897 rshell_cmd_cp = rshell_cmd;
898 for (; NULL != (
arg = strtok (rshell_cmd,
" ")); rshell_cmd = NULL)
902 if (NULL != append_args)
904 for (append_cnt = 0; NULL != append_args[append_cnt]; append_cnt++)
941 xconfig_size = (uLongf) (ntohs (
msg->header.
size)
946 (
const Bytef *) &
msg[1],
1053 "Host is already locked by a previous call to GNUNET_TESTBED_controller_start()");
1057 "Attempting to start a controller on a host on which a controller is already started");
1070 char *helper_binary_path_args[2];
1072 char **rsh_suffix_args;
1073 const char *username;
1086 "HELPER_BINARY_PATH",
1087 &helper_binary_path_args[0]))
1088 helper_binary_path_args[0] =
1090 helper_binary_path_args[1] = NULL;
1095 join_argv ((
const char **) rsh_args, (
const char **) rsh_suffix_args);
1100 for (cnt = 0; NULL != cp->
helper_argv[cnt]; cnt++)
1107 LOG_DEBUG (
"Helper cmd str: %s\n", argstr);
1151 if (NULL != cproc->
helper)
1164 if (NULL != cproc->
helper)
1253 h->habitability_check_task = NULL;
1264 h->habitability_check_task =
1273 if (NULL !=
h->auxp)
1281 cb (cb_cls, host,
ret);
1305 char **rsh_suffix_args;
1318 "HELPER_BINARY_PATH",
1325 stat_args[0] =
"stat";
1326 stat_args[2] = NULL;
1330 join_argv ((
const char **) rsh_args, (
const char **) rsh_suffix_args);
1339 if (NULL ==
h->auxp)
1347 h->habitability_check_task =
1391 const char *username;
1402 if (NULL != controller->
rh)
1408 "Host hostname: %s already registered\n",
1418 controller->
rh = rh;
1421 if (NULL != username)
1432 msg_size += cc_size;
1434 msg->header.
size = htons (msg_size);
1439 if (NULL != username)
1493 h->opq_parallel_overlay_connect_operations,
struct GNUNET_MessageHeader * msg
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
static int ret
Return value of the commandline.
static struct GNUNET_ARM_Operation * op
Current operation.
static struct GNUNET_ARM_Handle * h
Connection with ARM.
static uint16_t port
Port number.
static struct GNUNET_IDENTITY_Handle * id
Handle to identity service.
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
static struct GNUNET_FS_Handle * fs
Handle to FS service.
uint32_t data
The data value.
static int result
Global testing status.
static char * hostname
Our hostname; we give this to all the peers we start.
static const struct GNUNET_CONFIGURATION_Handle * config
Core service; the main API for encrypted P2P communications.
API for writing tests and creating large-scale emulation testbeds for GNUnet.
void GNUNET_CONFIGURATION_set_value_string(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
Set a configuration value that should be a string.
char * GNUNET_CONFIGURATION_serialize(const struct GNUNET_CONFIGURATION_Handle *cfg, size_t *size)
Serializes the given configuration.
enum GNUNET_GenericReturnValue 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.
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create(void)
Create a new configuration object.
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_deserialize(struct GNUNET_CONFIGURATION_Handle *cfg, const char *mem, size_t size, const char *source_filename)
De-serializes configuration.
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_dup(const struct GNUNET_CONFIGURATION_Handle *cfg)
Duplicate an existing configuration object.
enum GNUNET_GenericReturnValue GNUNET_DISK_file_test(const char *fil)
Check that fil corresponds to a filename (of a file that exists and that is not a directory).
enum GNUNET_GenericReturnValue GNUNET_DISK_file_size(const char *filename, uint64_t *size, int include_symbolic_links, int single_file_mode)
Get the size of the file (or directory) of the given file (in bytes).
ssize_t GNUNET_DISK_fn_read(const char *fn, void *result, size_t len)
Read the contents of a binary file into a buffer.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
void GNUNET_HELPER_send_cancel(struct GNUNET_HELPER_SendHandle *sh)
Cancel a GNUNET_HELPER_send operation.
int GNUNET_HELPER_kill(struct GNUNET_HELPER_Handle *h, int soft_kill)
Sends termination signal to the helper process.
struct GNUNET_HELPER_SendHandle * GNUNET_HELPER_send(struct GNUNET_HELPER_Handle *h, const struct GNUNET_MessageHeader *msg, int can_drop, GNUNET_HELPER_Continuation cont, void *cont_cls)
Send an message to the helper.
int GNUNET_HELPER_wait(struct GNUNET_HELPER_Handle *h)
Reap the helper process.
struct GNUNET_HELPER_Handle * GNUNET_HELPER_start(int with_control_pipe, const char *binary_name, char *const binary_argv[], GNUNET_MessageTokenizerCallback cb, GNUNET_HELPER_ExceptionCallback exp_cb, void *cb_cls)
Starts a helper and begins reading from it.
void GNUNET_HELPER_destroy(struct GNUNET_HELPER_Handle *h)
Free's the resources occupied by the helper handle.
#define GNUNET_log(kind,...)
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#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.
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_DEBUG
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_array_grow(arr, size, tsize)
Grow a well-typed (!) array.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_realloc(ptr, size)
Wrapper around realloc.
#define GNUNET_array_append(arr, len, element)
Append an element to an array (growing the array by one).
#define GNUNET_free(ptr)
Wrapper around free.
#define GNUNET_free_nz(ptr)
Wrapper around free.
char * GNUNET_OS_get_libexec_binary_path(const char *progname)
Given the name of a gnunet-helper, gnunet-service or gnunet-daemon binary, try to prefix it with the ...
struct GNUNET_OS_Process * GNUNET_OS_start_process_vap(enum GNUNET_OS_InheritStdioFlags std_inheritance, struct GNUNET_DISK_PipeHandle *pipe_stdin, struct GNUNET_DISK_PipeHandle *pipe_stdout, struct GNUNET_DISK_PipeHandle *pipe_stderr, const char *filename, char *const argv[])
Start a process.
GNUNET_OS_ProcessStatusType
Process status types.
void GNUNET_OS_process_destroy(struct GNUNET_OS_Process *proc)
Cleans up process structure contents (OS-dependent) and deallocates it.
int GNUNET_OS_process_kill(struct GNUNET_OS_Process *proc, int sig)
Sends a signal to the process.
enum GNUNET_GenericReturnValue GNUNET_OS_process_status(struct GNUNET_OS_Process *proc, enum GNUNET_OS_ProcessStatusType *type, unsigned long *code)
Retrieve the status of a process.
enum GNUNET_GenericReturnValue GNUNET_OS_process_wait(struct GNUNET_OS_Process *proc)
Wait for a process to terminate.
@ GNUNET_OS_INHERIT_STD_ERR
When this flag is set, the child process will inherit stderr of the parent.
#define GNUNET_MESSAGE_TYPE_TESTBED_ADD_HOST
Message to add host.
#define GNUNET_MESSAGE_TYPE_TESTBED_HELPER_REPLY
The reply message from gnunet-testbed-helper.
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.
size_t GNUNET_strlcpy(char *dst, const char *src, size_t n)
Like strlcpy but portable.
struct GNUNET_TESTBED_Host * GNUNET_TESTBED_host_create_with_id(uint32_t id, const char *hostname, const char *username, const struct GNUNET_CONFIGURATION_Handle *cfg, uint16_t port)
Create a host to run peers and controllers on.
void GNUNET_TESTBED_cancel_registration(struct GNUNET_TESTBED_HostRegistrationHandle *handle)
Cancel the pending registration.
struct GNUNET_TESTBED_HostHabitableCheckHandle * GNUNET_TESTBED_is_host_habitable(const struct GNUNET_TESTBED_Host *host, const struct GNUNET_CONFIGURATION_Handle *config, GNUNET_TESTBED_HostHabitableCallback cb, void *cb_cls)
Checks whether a host can be used to start testbed service.
struct GNUNET_TESTBED_Host * GNUNET_TESTBED_host_create(const char *hostname, const char *username, const struct GNUNET_CONFIGURATION_Handle *cfg, uint16_t port)
Create a host to run peers and controllers on.
void GNUNET_TESTBED_is_host_habitable_cancel(struct GNUNET_TESTBED_HostHabitableCheckHandle *handle)
Function to cancel a request started using GNUNET_TESTBED_is_host_habitable()
void(* GNUNET_TESTBED_ControllerStatusCallback)(void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg, int status)
Callback to signal successful startup of the controller process.
unsigned int GNUNET_TESTBED_hosts_load_from_file(const char *filename, const struct GNUNET_CONFIGURATION_Handle *cfg, struct GNUNET_TESTBED_Host ***hosts)
Load a set of hosts from a configuration file.
void(* GNUNET_TESTBED_HostHabitableCallback)(void *cls, const struct GNUNET_TESTBED_Host *host, int status)
Callbacks of this type are called by GNUNET_TESTBED_is_host_habitable to inform whether the given hos...
void(* GNUNET_TESTBED_HostRegistrationCompletion)(void *cls, const char *emsg)
Callback which will be called to after a host registration succeeded or failed.
void GNUNET_TESTBED_controller_stop(struct GNUNET_TESTBED_ControllerProc *cproc)
Stop the controller process (also will terminate all peers and controllers dependent on this controll...
void GNUNET_TESTBED_host_destroy(struct GNUNET_TESTBED_Host *host)
Destroy a host handle.
const char * GNUNET_TESTBED_host_get_hostname(const struct GNUNET_TESTBED_Host *host)
Obtain the host's hostname.
struct GNUNET_TESTBED_ControllerProc * GNUNET_TESTBED_controller_start(const char *trusted_ip, struct GNUNET_TESTBED_Host *host, GNUNET_TESTBED_ControllerStatusCallback cb, void *cls)
Starts a controller process at the given host.
struct GNUNET_TESTBED_HostRegistrationHandle * GNUNET_TESTBED_register_host(struct GNUNET_TESTBED_Controller *controller, struct GNUNET_TESTBED_Host *host, GNUNET_TESTBED_HostRegistrationCompletion cc, void *cc_cls)
Register a host with the controller.
#define GNUNET_TIME_STD_BACKOFF(r)
Perform our standard exponential back-off calculation, starting at 1 ms and then going by a factor of...
static unsigned int size
Size of the "table".
GNUNET_DNS_RequestHandler rh
Function to call to get replies.
The handle to a helper process.
Entry in the queue of messages we need to transmit to the helper.
Entry in list of pending tasks.
Notify the service about a host that we intend to use.
uint16_t username_length
Number of bytes in the user name that follows; 0 to use no user name; otherwise 'strlen (username)',...
uint16_t hostname_length
Number of bytes in the host name (excluding 0-termination) that follows the user name; cannot be 0.
uint16_t config_size
The length of the uncompressed configuration.
Handle for controller process.
struct GNUNET_HELPER_SendHandle * shandle
The send handle for the helper.
char ** helper_argv
The arguments used to start the helper.
GNUNET_TESTBED_ControllerStatusCallback cb
The controller error callback.
struct GNUNET_HELPER_Handle * helper
The process handle.
struct GNUNET_MessageHeader * msg
The message corresponding to send handle.
struct GNUNET_TESTBED_Host * host
The host where the helper is run.
void * cls
The closure for the above callback.
Handle to interact with a GNUnet testbed controller.
struct GNUNET_TESTBED_HostRegistrationHandle * rh
The host registration handle; NULL if no current registration requests are present.
Initialization message for gnunet-helper-testbed to start testbed service.
Reply message from helper process.
uint16_t config_size
Size of the uncompressed configuration.
The handle for whether a host is habitable or not.
void * cb_cls
The callback closure.
const struct GNUNET_TESTBED_Host * host
The host to check.
char ** helper_argv
The arguments used to start the helper.
struct GNUNET_OS_Process * auxp
The process handle for the SSH process.
struct GNUNET_TIME_Relative wait_time
How long we wait before checking the process status.
GNUNET_TESTBED_HostHabitableCallback cb
The callback to call once we have the status.
struct GNUNET_SCHEDULER_Task * habitability_check_task
Task id for the habitability check task.
handle for host registration
struct GNUNET_TESTBED_Host * host
The host being registered.
struct GNUNET_TESTBED_Controller * c
The controller at which this host is being registered.
GNUNET_TESTBED_HostRegistrationCompletion cc
The Registration completion callback.
void * cc_cls
The closure for above callback.
Opaque handle to a host running experiments managed by the testing framework.
struct GNUNET_CONFIGURATION_Handle * cfg
the configuration to use as a template while starting a controller on this host.
struct RegisteredController * rc_head
The head for the list of controllers where this host is registered.
const char * hostname
The hostname of the host; NULL for localhost.
uint32_t id
Global ID we use to refer to a host on the network.
struct OperationQueue * opq_parallel_overlay_connect_operations
Operation queue for simultaneous overlay connect operations target at this host.
uint16_t port
The port which is to be used for SSH.
int locked
Is this host locked by GNUNET_TESTBED_controller_start()?
const char * username
The username to be used for SSH login.
int controller_started
Is a controller started on this host? FIXME: Is this needed?
struct RegisteredController * rc_tail
The tail for the list of controllers where this host is registered.
Opaque handle to an abstract operation to be executed by the testing framework.
Time for relative time used by GNUnet, in microseconds.
Queue of operations where we can only support a certain number of concurrent operations of a particul...
A list entry for registered controllers list.
const struct GNUNET_TESTBED_Controller * controller
The controller at which this host is registered.
struct RegisteredController * prev
The prev ptr for DLL.
struct RegisteredController * next
The next ptr for DLL.
void GNUNET_TESTBED_queue_message_(struct GNUNET_TESTBED_Controller *controller, struct GNUNET_MessageHeader *msg)
Queues a message in send queue for sending to the service.
struct GNUNET_TESTBED_HelperInit * GNUNET_TESTBED_create_helper_init_msg_(const char *trusted_ip, const char *hostname, const struct GNUNET_CONFIGURATION_Handle *cfg)
Creates a helper initialization message.
size_t GNUNET_TESTBED_compress_config_(const char *config, size_t size, char **xconfig)
Compresses given configuration using zlib compress.
Interface for functions internally exported from testbed_api.c.
#define HELPER_TESTBED_BINARY
Testbed Helper binary name.
static char ** gen_rsh_args(const char *port, const char *hostname, const char *username)
Generates arguments for opening a remote shell.
struct GNUNET_TESTBED_Host * GNUNET_TESTBED_host_create_by_id_(uint32_t id, const struct GNUNET_CONFIGURATION_Handle *cfg)
Create a host by ID; given this host handle, we could not run peers at the host, but we can talk abou...
void GNUNET_TESTBED_host_queue_oc_(struct GNUNET_TESTBED_Host *h, struct GNUNET_TESTBED_Operation *op)
Queues the given operation in the queue for parallel overlay connects of the given host.
const char * GNUNET_TESTBED_host_get_username_(const struct GNUNET_TESTBED_Host *host)
Obtain the host's username.
void GNUNET_TESTBED_mark_host_registered_at_(struct GNUNET_TESTBED_Host *host, const struct GNUNET_TESTBED_Controller *const controller)
Marks a host as registered with a controller.
static unsigned int host_list_size
The size of the available hosts list.
int GNUNET_TESTBED_host_controller_started(const struct GNUNET_TESTBED_Host *host)
Check whether a controller is already started on the given host.
static void clear_msg(void *cls, int result)
Continuation function from GNUNET_HELPER_send()
void GNUNET_TESTBED_deregister_host_at_(struct GNUNET_TESTBED_Host *host, const struct GNUNET_TESTBED_Controller *const controller)
Unmarks a host registered at a controller.
int GNUNET_TESTBED_is_host_registered_(const struct GNUNET_TESTBED_Host *host, const struct GNUNET_TESTBED_Controller *const controller)
Checks whether a host has been registered.
void GNUNET_TESTBED_controller_kill_(struct GNUNET_TESTBED_ControllerProc *cproc)
Sends termination signal to the controller's helper process.
static struct GNUNET_TESTBED_Host ** host_list
Array of available hosts.
void GNUNET_TESTBED_host_resolve_(struct GNUNET_TESTBED_Host *host)
Resolves the hostname of the host to an ip address.
#define API_VIOLATION(cond, errstr)
Prints API violation message.
void GNUNET_TESTBED_controller_destroy_(struct GNUNET_TESTBED_ControllerProc *cproc)
Cleans-up the controller's helper process handle.
static void helper_exp_cb(void *cls)
Callback that will be called when the helper process dies.
static char ** gen_rsh_suffix_args(const char *const *append_args)
Generates the arguments needed for executing the given binary in a remote shell.
#define LOG_DEBUG(...)
Debug logging shorthand.
static void habitability_check(void *cls)
Task for checking whether a host is habitable or not.
static char ** copy_argv(const char *const *argv)
Function to copy NULL terminated list of arguments.
static void free_argv(char **argv)
Frees the given NULL terminated arguments.
void GNUNET_TESTBED_host_replace_cfg_(struct GNUNET_TESTBED_Host *host, const struct GNUNET_CONFIGURATION_Handle *new_cfg)
Function to replace host's configuration.
static char ** join_argv(const char *const *argv1, const char *const *argv2)
Function to join NULL terminated list of arguments.
static int helper_mst(void *cls, const struct GNUNET_MessageHeader *message)
Functions with this signature are called whenever a complete message is received by the tokenizer.
const char * simple_resolve(const char *host)
Resolves a hostname using getaddrinfo.
uint16_t GNUNET_TESTBED_host_get_ssh_port_(const struct GNUNET_TESTBED_Host *host)
Obtain the host's ssh port.
const struct GNUNET_CONFIGURATION_Handle * GNUNET_TESTBED_host_get_cfg_(const struct GNUNET_TESTBED_Host *host)
Obtain the host's configuration template.
#define LOG_GAI(level, cmd, rc)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...
struct GNUNET_TESTBED_Host * GNUNET_TESTBED_host_lookup_by_id_(uint32_t id)
Lookup a host by ID.
#define LOG(kind,...)
Generic logging shorthand.
uint32_t GNUNET_TESTBED_host_get_id_(const struct GNUNET_TESTBED_Host *host)
Obtain a host's unique global ID.
#define HOST_LIST_GROW_STEP
Number of extra elements we create space for when we grow host list.
internal API to access the 'hosts' subsystem
struct OperationQueue * GNUNET_TESTBED_operation_queue_create_(enum OperationQueueType type, unsigned int max_active)
Create an operation queue.
void GNUNET_TESTBED_operation_queue_insert_(struct OperationQueue *queue, struct GNUNET_TESTBED_Operation *op)
Add an operation to a queue.
void GNUNET_TESTBED_operation_queue_destroy_(struct OperationQueue *queue)
Destroys an operation queue.
internal API to access the 'operations' subsystem
@ OPERATION_QUEUE_TYPE_ADAPTIVE
Operation queue which adapts the number of operations to be active based on the operation completion ...
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
Message formats for communication between testbed api and gnunet-helper-testbed process.