GNUnet 0.22.2
testing_api_cmd_netjail_start_cmds_helper.c File Reference

Command to start the netjail peers. More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_testing_lib.h"
#include "testing_api_barrier.h"
#include "testing_api_loop.h"
#include "testing_cmds.h"
#include "testing_api_topology.h"
Include dependency graph for testing_api_cmd_netjail_start_cmds_helper.c:

Go to the source code of this file.

Data Structures

struct  NetJailState
 Struct to hold information for callbacks. More...
 
struct  HelperState
 
struct  TestingSystemCount
 Struct containing the number of the netjail node and the NetJailState which will be handed to callbacks specific to a test environment. More...
 

Macros

#define LOG(kind, ...)   GNUNET_log (kind, __VA_ARGS__)
 Generic logging shortcut. More...
 

Functions

static void clear_msg (void *cls, enum GNUNET_GenericReturnValue result)
 Continuation function from GNUNET_HELPER_send() More...
 
static void handle_helper_barrier_reached (void *cls, const struct GNUNET_TESTING_CommandBarrierReached *rm)
 
static void handle_helper_local_finished (void *cls, const struct GNUNET_TESTING_CommandLocalFinished *lf)
 
static enum GNUNET_GenericReturnValue helper_mst (void *cls, const struct GNUNET_MessageHeader *message)
 Functions with this signature are called whenever a complete message is received by the tokenizer. More...
 
static void exp_cb (void *cls)
 Callback called if there was an exception during execution of the helper. More...
 
static enum GNUNET_GenericReturnValue add_barrier (void *cls, const struct GNUNET_ShortHashCode *key, void *value)
 
static bool send_start_messages (struct NetJailState *ns, struct GNUNET_HELPER_Handle *helper)
 
static bool start_helper (struct NetJailState *ns, unsigned int script_num)
 Function which start a single helper process. More...
 
static void do_timeout (void *cls)
 Function run when the cmd terminates (good or bad) with timeout. More...
 
static int start_peer (void *cls, const struct GNUNET_ShortHashCode *key, void *value)
 
static int start_subnets (void *cls, const struct GNUNET_ShortHashCode *key, void *value)
 
static int start_carriers (void *cls, const struct GNUNET_ShortHashCode *key, void *value)
 
static void netjail_exec_run (void *cls, struct GNUNET_TESTING_Interpreter *is)
 This function starts a helper process for each node. More...
 
static void netjail_exec_cleanup (void *cls)
 Code to clean up resource this cmd used. More...
 
static enum GNUNET_GenericReturnValue netjail_exec_traits (void *cls, const void **ret, const char *trait, unsigned int index)
 This function prepares an array with traits. More...
 
struct GNUNET_TESTING_Command GNUNET_TESTING_cmd_netjail_start_helpers (const char *label, const char *topology_cmd_label, struct GNUNET_TIME_Relative timeout)
 Create command. More...
 

Variables

unsigned int node_number
 The network namespace number of a node. More...
 

Detailed Description

Command to start the netjail peers.

Author
t3sserakt

Definition in file testing_api_cmd_netjail_start_cmds_helper.c.

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log (kind, __VA_ARGS__)

Generic logging shortcut.

Definition at line 37 of file testing_api_cmd_netjail_start_cmds_helper.c.

Function Documentation

◆ clear_msg()

static void clear_msg ( void *  cls,
enum GNUNET_GenericReturnValue  result 
)
static

Continuation function from GNUNET_HELPER_send()

Parameters
clsclosure
resultGNUNET_OK on success, GNUNET_NO if helper process died GNUNET_SYSERR during GNUNET_HELPER_stop

Definition at line 178 of file testing_api_cmd_netjail_start_cmds_helper.c.

180{
181 struct TestingSystemCount *tbc = cls;
182 struct NetJailState *ns = tbc->ns;
183
184 GNUNET_assert (NULL != tbc->shandle);
185 tbc->shandle = NULL;
187 ns->tbc_tail,
188 tbc);
189 GNUNET_free (tbc);
190 if ( (! ns->failed) &&
191 (GNUNET_OK != result) )
192 {
193 ns->failed = true;
195 "Failed sending message to helper!\n");
197 }
198}
static struct GNUNET_NAMECACHE_Handle * ns
Handle to the namecache.
static int result
Global testing status.
#define GNUNET_TESTING_FAIL(is)
Print failing line number and trigger shutdown.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_log(kind,...)
@ GNUNET_OK
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
@ GNUNET_ERROR_TYPE_ERROR
#define GNUNET_free(ptr)
Wrapper around free.
Struct to hold information for callbacks.
Struct containing the number of the netjail node and the NetJailState which will be handed to callbac...
struct GNUNET_HELPER_SendHandle * shandle
The send handle for the helper.
struct NetJailState * ns
Struct to store information handed over to callbacks.

References GNUNET_assert, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log, GNUNET_OK, GNUNET_TESTING_FAIL, ns, TestingSystemCount::ns, result, and TestingSystemCount::shandle.

Referenced by send_start_messages().

Here is the caller graph for this function:

◆ handle_helper_barrier_reached()

static void handle_helper_barrier_reached ( void *  cls,
const struct GNUNET_TESTING_CommandBarrierReached rm 
)
static

Definition at line 202 of file testing_api_cmd_netjail_start_cmds_helper.c.

205{
206 struct HelperState *hs = cls;
207 struct NetJailState *ns = hs->ns;
208 struct GNUNET_TESTING_Barrier *barrier;
209
210 barrier = GNUNET_TESTING_get_barrier2_ (ns->is,
211 &rm->barrier_key);
212 if (NULL == barrier)
213 {
214 if (! ns->failed)
215 {
216 ns->failed = true;
218 "We did not found the barrier that was supposedly reached.!\n");
220 }
221 return;
222 }
223 if (barrier->inherited)
224 {
225 /* pass on to parent */
227 &rm->header);
228 }
229 else
230 {
231 barrier->reached++;
232 if (barrier->reached == barrier->expected_reaches)
233 {
235 .header.size
236 = htons (sizeof (cbs)),
237 .header.type
239 .barrier_key
240 = rm->barrier_key
241 };
242
243 GNUNET_assert (! barrier->satisfied);
244 barrier->satisfied = true;
245 /* unblock children */
247 &cbs.header);
248 /* unblock self */
249 for (unsigned int i = 0; i<barrier->cnt_waiting; i++)
251 GNUNET_array_grow (barrier->waiting,
252 barrier->cnt_waiting,
253 0);
254 }
255 }
256}
void GNUNET_TESTING_async_finish(struct GNUNET_TESTING_AsyncContext *ac)
The asynchronous command of ac has finished.
void GNUNET_TESTING_async_fail(struct GNUNET_TESTING_AsyncContext *ac)
The asynchronous command of ac has failed.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
#define GNUNET_array_grow(arr, size, tsize)
Grow a well-typed (!) array.
#define GNUNET_MESSAGE_TYPE_CMDS_HELPER_BARRIER_CROSSABLE
An entry for a barrier list.
bool inherited
Did we inherit the barrier from our parent loop?
unsigned int reached
Number of times the barrier has been reached.
unsigned int expected_reaches
Number of total commands expected to be reached by the barrier.
struct GNUNET_TESTING_AsyncContext ** waiting
Context of barrier reached commands of our local interpreter that are currently blocked on this barri...
unsigned int cnt_waiting
Length of the waiting array.
bool satisfied
Did we reach expected_reaches? Used in particular if inherited is true and we cannot compute locally.
struct GNUNET_ShortHashCode barrier_key
Definition: testing_cmds.h:80
struct GNUNET_MessageHeader header
Definition: testing_cmds.h:79
Parent to child: this barrier was satisfied.
Definition: testing_cmds.h:100
struct GNUNET_MessageHeader header
Definition: testing_cmds.h:101
struct NetJailState * ns
The state of this command.
struct GNUNET_TESTING_Barrier * GNUNET_TESTING_get_barrier2_(struct GNUNET_TESTING_Interpreter *is, const struct GNUNET_ShortHashCode *create_key)
void GNUNET_TESTING_loop_notify_parent_(struct GNUNET_TESTING_Interpreter *is, const struct GNUNET_MessageHeader *hdr)
Send message to our parent.
void GNUNET_TESTING_loop_notify_children_(struct GNUNET_TESTING_Interpreter *is, const struct GNUNET_MessageHeader *hdr)
Send message to all netjail children (if there are any).

References GNUNET_TESTING_CommandBarrierReached::barrier_key, GNUNET_TESTING_Barrier::cnt_waiting, GNUNET_TESTING_Barrier::expected_reaches, GNUNET_array_grow, GNUNET_assert, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_MESSAGE_TYPE_CMDS_HELPER_BARRIER_CROSSABLE, GNUNET_TESTING_async_fail(), GNUNET_TESTING_async_finish(), GNUNET_TESTING_get_barrier2_(), GNUNET_TESTING_loop_notify_children_(), GNUNET_TESTING_loop_notify_parent_(), GNUNET_TESTING_CommandBarrierReached::header, GNUNET_TESTING_CommandBarrierSatisfied::header, GNUNET_TESTING_Barrier::inherited, ns, HelperState::ns, GNUNET_TESTING_Barrier::reached, GNUNET_TESTING_Barrier::satisfied, GNUNET_MessageHeader::size, and GNUNET_TESTING_Barrier::waiting.

Here is the call graph for this function:

◆ handle_helper_local_finished()

static void handle_helper_local_finished ( void *  cls,
const struct GNUNET_TESTING_CommandLocalFinished lf 
)
static

Definition at line 260 of file testing_api_cmd_netjail_start_cmds_helper.c.

263{
264 struct HelperState *hs = cls;
265 struct NetJailState *ns = hs->ns;
266
268 hs->finished = GNUNET_YES;
269 ns->n_finished++;
270 if ( (! ns->failed) &&
271 (GNUNET_OK != ntohl (lf->rv)) )
272 {
273 ns->failed = true;
275 "Helper finished with error!\n");
277 return;
278 }
279 if (ns->n_finished == ns->n_helpers)
280 {
281 GNUNET_SCHEDULER_cancel (ns->timeout_task);
282 ns->timeout_task = NULL;
284 }
285}
void lf(char *msg)
Definition: gnunet_gst.c:587
void GNUNET_HELPER_stop(struct GNUNET_HELPER_Handle *h, int soft_kill)
Kills the helper, closes the pipe, frees the handle and calls wait() on the helper process.
Definition: helper.c:538
@ GNUNET_YES
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:980
struct GNUNET_HELPER_Handle * helper
The helper handle for this state.
enum GNUNET_GenericReturnValue finished
Did we got a GNUNET_TESTING_CommandLocalFinished message?

References HelperState::finished, GNUNET_ERROR_TYPE_ERROR, GNUNET_HELPER_stop(), GNUNET_log, GNUNET_OK, GNUNET_SCHEDULER_cancel(), GNUNET_TESTING_async_fail(), GNUNET_TESTING_async_finish(), GNUNET_YES, HelperState::helper, lf(), ns, and HelperState::ns.

Here is the call graph for this function:

◆ helper_mst()

static enum GNUNET_GenericReturnValue helper_mst ( void *  cls,
const struct GNUNET_MessageHeader message 
)
static

Functions with this signature are called whenever a complete message is received by the tokenizer.

Do not call GNUNET_SERVER_mst_destroy in callback

Parameters
clsclosure
messagethe actual message
Returns
GNUNET_OK on success, GNUNET_SYSERR to stop further processing

Definition at line 299 of file testing_api_cmd_netjail_start_cmds_helper.c.

301{
302 struct HelperState *hs = cls;
303 struct NetJailState *ns = hs->ns;
306 helper_barrier_reached,
309 hs),
311 helper_local_finished,
314 hs),
316 };
318
320 message);
321 if (GNUNET_OK != ret)
322 {
323 GNUNET_break (0);
324 if (! ns->failed)
325 {
326 ns->failed = true;
328 "We got an unknown message from the helper process!\n");
330 }
331 }
332 return ret;
333}
struct GNUNET_MQ_MessageHandlers handlers[]
Definition: 003.c:1
static int ret
Final status code.
Definition: gnunet-arm.c:93
GNUNET_GenericReturnValue
Named constants for return values.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
enum GNUNET_GenericReturnValue GNUNET_MQ_handle_message(const struct GNUNET_MQ_MessageHandler *handlers, const struct GNUNET_MessageHeader *mh)
Call the message message handler that was registered for the type of the given message in the given h...
Definition: mq.c:205
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
#define GNUNET_MESSAGE_TYPE_CMDS_HELPER_LOCAL_FINISHED
#define GNUNET_MESSAGE_TYPE_CMDS_HELPER_BARRIER_REACHED
Message handler for a specific message type.
Child to parent: I reached the given barrier, increment the counter (or pass to grandparent).
Definition: testing_cmds.h:78

References GNUNET_break, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_MESSAGE_TYPE_CMDS_HELPER_BARRIER_REACHED, GNUNET_MESSAGE_TYPE_CMDS_HELPER_LOCAL_FINISHED, GNUNET_MQ_handle_message(), GNUNET_MQ_handler_end, GNUNET_MQ_hd_fixed_size, GNUNET_OK, GNUNET_TESTING_async_fail(), handlers, ns, HelperState::ns, and ret.

Referenced by start_helper().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ exp_cb()

static void exp_cb ( void *  cls)
static

Callback called if there was an exception during execution of the helper.

Definition at line 340 of file testing_api_cmd_netjail_start_cmds_helper.c.

341{
342 struct HelperState *hs = cls;
343 struct NetJailState *ns = hs->ns;
344
346 "Called exp_cb.\n");
347 // TODO find in ns->helpers[] and remove???
348 hs->helper = NULL;
349 hs->finished = GNUNET_YES;
350 if (NULL != ns->timeout_task)
351 {
352 GNUNET_SCHEDULER_cancel (ns->timeout_task);
353 ns->timeout_task = NULL;
354 }
355 if (! ns->failed)
357}

References HelperState::finished, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_SCHEDULER_cancel(), GNUNET_TESTING_async_fail(), GNUNET_YES, HelperState::helper, ns, and HelperState::ns.

Referenced by GNUNET_HELPER_start(), and start_helper().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_barrier()

static enum GNUNET_GenericReturnValue add_barrier ( void *  cls,
const struct GNUNET_ShortHashCode key,
void *  value 
)
static

Definition at line 361 of file testing_api_cmd_netjail_start_cmds_helper.c.

364{
365 struct GNUNET_ShortHashCode **bar_posp = cls;
366 struct GNUNET_ShortHashCode *bar_pos = *bar_posp;
367
368 *bar_pos = *key;
369 *bar_posp = bar_pos + 1;
370 return GNUNET_OK;
371}
struct GNUNET_HashCode key
The key used in the DHT.
A 256-bit hashcode.

References GNUNET_OK, and key.

Referenced by send_start_messages().

Here is the caller graph for this function:

◆ send_start_messages()

static bool send_start_messages ( struct NetJailState ns,
struct GNUNET_HELPER_Handle helper 
)
static
Returns
true on success

Definition at line 378 of file testing_api_cmd_netjail_start_cmds_helper.c.

380{
382 struct TestingSystemCount *tbc;
383 struct GNUNET_ShortHashCode *bar;
384 struct GNUNET_ShortHashCode *bar_pos;
385 unsigned int num_barriers = GNUNET_TESTING_barrier_count_ (ns->is);
386 size_t topo_length;
387 size_t msg_len;
388
389 topo_length = strlen (ns->topology_data) + 1;
390 GNUNET_assert (topo_length < SIZE_MAX - sizeof (*msg));
391 GNUNET_assert (SIZE_MAX / sizeof (struct GNUNET_ShortHashCode) >
392 num_barriers);
393 GNUNET_assert (sizeof (*msg) + topo_length <
395 - num_barriers * sizeof (struct GNUNET_ShortHashCode));
396 msg_len = sizeof (*msg) + topo_length
397 + num_barriers * sizeof (struct GNUNET_ShortHashCode);
398 if (msg_len > UINT16_MAX)
399 {
400 /* ask a wizard to enhance the protocol;
401 start with gzip topology_data? multiple
402 init messages for barriers + topo data,
403 etc.*/
404 GNUNET_break (0);
405 return false;
406 }
407 msg = GNUNET_malloc (msg_len);
408 msg->header.size = htons ((uint16_t) msg_len);
410 msg->barrier_count = htonl (num_barriers);
411 bar = (struct GNUNET_ShortHashCode *) &msg[1];
412 bar_pos = bar;
415 &bar_pos);
416 GNUNET_assert (bar_pos == &bar[num_barriers]);
417 memcpy (&bar[num_barriers],
418 ns->topology_data,
419 topo_length);
420 tbc = GNUNET_new (struct TestingSystemCount);
421 tbc->ns = ns;
423 helper,
424 &msg->header,
425 GNUNET_NO,
426 &clear_msg,
427 tbc);
429 if (NULL == tbc->shandle)
430 {
432 "Send handle is NULL!\n");
433 GNUNET_free (tbc);
434 return false;
435 }
437 ns->tbc_tail,
438 tbc);
439 return true;
440}
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
struct GNUNET_HELPER_SendHandle * GNUNET_HELPER_send(struct GNUNET_HELPER_Handle *h, const struct GNUNET_MessageHeader *msg, bool can_drop, GNUNET_HELPER_Continuation cont, void *cont_cls)
Send an message to the helper.
Definition: helper.c:615
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.
@ GNUNET_NO
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_MESSAGE_TYPE_CMDS_HELPER_INIT
The initialization message towards gnunet-cmds-helper.
#define SIZE_MAX
Definition: platform.h:208
Initialization message for gnunet-cmds-testbed to start cmd binary.
Definition: testing_cmds.h:42
static enum GNUNET_GenericReturnValue add_barrier(void *cls, const struct GNUNET_ShortHashCode *key, void *value)
static void clear_msg(void *cls, enum GNUNET_GenericReturnValue result)
Continuation function from GNUNET_HELPER_send()
unsigned int GNUNET_TESTING_barrier_count_(struct GNUNET_TESTING_Interpreter *is)
void GNUNET_TESTING_barrier_iterate_(struct GNUNET_TESTING_Interpreter *is, GNUNET_CONTAINER_ShortmapIterator cb, void *cb_cls)

References add_barrier(), clear_msg(), GNUNET_assert, GNUNET_break, GNUNET_CONTAINER_DLL_insert, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_HELPER_send(), GNUNET_log, GNUNET_malloc, GNUNET_MESSAGE_TYPE_CMDS_HELPER_INIT, GNUNET_new, GNUNET_NO, GNUNET_TESTING_barrier_count_(), GNUNET_TESTING_barrier_iterate_(), msg, ns, TestingSystemCount::ns, TestingSystemCount::shandle, GNUNET_MessageHeader::size, SIZE_MAX, and GNUNET_MessageHeader::type.

Referenced by start_helper().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ start_helper()

static bool start_helper ( struct NetJailState ns,
unsigned int  script_num 
)
static

Function which start a single helper process.

Returns
true on success

Definition at line 448 of file testing_api_cmd_netjail_start_cmds_helper.c.

450{
451 const struct GNUNET_OS_ProjectData *pd
453 char *gnunet_cmds_helper
456 char *data_dir
459 char node_id[32];
460 char *script_name;
461 struct GNUNET_HELPER_Handle *helper;
462 struct HelperState *hs = GNUNET_new (struct HelperState);
463
464 GNUNET_asprintf (&script_name,
465 "%s%s",
466 data_dir,
468 GNUNET_snprintf (node_id,
469 sizeof (node_id),
470 "if%06x-%06x\n",
471 (unsigned int) getpid (),
472 script_num);
473 {
474 char *const script_argv[] = {
475 script_name,
476 node_id,
477 gnunet_cmds_helper,
478 node_id,
479 NULL
480 };
481 hs->ns = ns;
483 pd,
484 GNUNET_YES, /* with control pipe */
485 script_argv[0],
486 script_argv,
487 &helper_mst,
488 &exp_cb,
489 hs);
490 hs->helper = helper;
491 }
492 GNUNET_free (gnunet_cmds_helper);
493 if (NULL == helper)
494 {
496 "Starting helper failed. Is NULL.\n");
497 GNUNET_break (0);
498 GNUNET_free (hs);
499 return false;
500 }
501 GNUNET_array_append (ns->helpers,
502 ns->n_helpers,
503 hs);
505 helper);
506 GNUNET_free (data_dir);
507 GNUNET_free (script_name);
508 return send_start_messages (ns,
509 helper);
510}
struct GNUNET_HELPER_Handle * GNUNET_HELPER_start(const struct GNUNET_OS_ProjectData *pd, 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.
Definition: helper.c:460
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
int GNUNET_snprintf(char *buf, size_t size, const char *format,...) __attribute__((format(printf
Like snprintf, just aborts if the buffer is of insufficient size.
#define GNUNET_array_append(arr, len, element)
Append an element to an array (growing the array by one).
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_gnunet(void)
Return default project data used by 'libgnunetutil' for GNUnet.
char * GNUNET_OS_installation_get_path(const struct GNUNET_OS_ProjectData *pd, enum GNUNET_OS_InstallationPathKind dirkind)
Get the path to a specific GNUnet installation directory or, with GNUNET_OS_IPK_SELF_PREFIX,...
char * GNUNET_OS_get_libexec_binary_path(const struct GNUNET_OS_ProjectData *pd, const char *progname)
Given the name of a gnunet-helper, gnunet-service or gnunet-daemon binary, try to prefix it with the ...
@ GNUNET_OS_IPK_DATADIR
Return the directory where data is installed (share/gnunet/)
The handle to a helper process.
Definition: helper.c:77
Project-specific data used to help the OS subsystem find installation paths.
static enum GNUNET_GenericReturnValue helper_mst(void *cls, const struct GNUNET_MessageHeader *message)
Functions with this signature are called whenever a complete message is received by the tokenizer.
static void exp_cb(void *cls)
Callback called if there was an exception during execution of the helper.
static bool send_start_messages(struct NetJailState *ns, struct GNUNET_HELPER_Handle *helper)
void GNUNET_TESTING_add_netjail_helper_(struct GNUNET_TESTING_Interpreter *is, struct GNUNET_HELPER_Handle *helper)
Adding a helper handle to the interpreter.
#define HELPER_CMDS_BINARY
Definition: testing_cmds.h:32
#define NETJAIL_EXEC_SCRIPT
Definition: testing_cmds.h:34

References exp_cb(), GNUNET_array_append, GNUNET_asprintf(), GNUNET_break, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_HELPER_start(), GNUNET_log, GNUNET_new, GNUNET_OS_get_libexec_binary_path(), GNUNET_OS_installation_get_path(), GNUNET_OS_IPK_DATADIR, GNUNET_OS_project_data_gnunet(), GNUNET_snprintf(), GNUNET_TESTING_add_netjail_helper_(), GNUNET_YES, HelperState::helper, HELPER_CMDS_BINARY, helper_mst(), NETJAIL_EXEC_SCRIPT, ns, HelperState::ns, and send_start_messages().

Referenced by start_peer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_timeout()

static void do_timeout ( void *  cls)
static

Function run when the cmd terminates (good or bad) with timeout.

Parameters
clsthe interpreter state

Definition at line 519 of file testing_api_cmd_netjail_start_cmds_helper.c.

520{
521 struct NetJailState *ns = cls;
522
523 ns->timeout_task = NULL;
525 "Terminating cmd due to global timeout\n");
527}

References GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_TESTING_async_finish(), and ns.

Referenced by netjail_exec_run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ start_peer()

static int start_peer ( void *  cls,
const struct GNUNET_ShortHashCode key,
void *  value 
)
static

Definition at line 531 of file testing_api_cmd_netjail_start_cmds_helper.c.

534{
535 struct NetJailState *ns = cls;
536
537 if (! start_helper (ns, node_number))
538 {
539 return GNUNET_SYSERR;
540 }
541 node_number++;
542
544 "Peer helper %u started.\n",
546 return GNUNET_OK;
547}
@ GNUNET_SYSERR
@ GNUNET_ERROR_TYPE_DEBUG
static bool start_helper(struct NetJailState *ns, unsigned int script_num)
Function which start a single helper process.
unsigned int node_number
The network namespace number of a node.

References GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_OK, GNUNET_SYSERR, node_number, ns, and start_helper().

Referenced by netjail_exec_run(), start_carriers(), and start_subnets().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ start_subnets()

static int start_subnets ( void *  cls,
const struct GNUNET_ShortHashCode key,
void *  value 
)
static

Definition at line 551 of file testing_api_cmd_netjail_start_cmds_helper.c.

554{
555 struct NetJailState *ns = cls;
556 struct GNUNET_TESTING_NetjailSubnet *subnet = value;
557
558 node_number++;
560 "Starting subnet %u.\n",
563 &start_peer,
564 ns))
565 return GNUNET_SYSERR;
567 "Subnet started.\n");
568 return GNUNET_OK;
569}
static char * value
Value of the record to add/remove.
int GNUNET_CONTAINER_multishortmap_iterate(struct GNUNET_CONTAINER_MultiShortmap *map, GNUNET_CONTAINER_ShortmapIterator it, void *it_cls)
Iterate over all entries in the map.
struct GNUNET_CONTAINER_MultiShortmap * peers
Hash map containing peers.
static int start_peer(void *cls, const struct GNUNET_ShortHashCode *key, void *value)

References GNUNET_CONTAINER_multishortmap_iterate(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_OK, GNUNET_SYSERR, node_number, ns, GNUNET_TESTING_NetjailSubnet::peers, start_peer(), and value.

Referenced by start_carriers().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ start_carriers()

static int start_carriers ( void *  cls,
const struct GNUNET_ShortHashCode key,
void *  value 
)
static

Definition at line 573 of file testing_api_cmd_netjail_start_cmds_helper.c.

576{
577 struct NetJailState *ns = cls;
578 struct GNUNET_TESTING_NetjailCarrier *carrier = value;
579
580 node_number++;
582 "Starting carrier %u.\n",
585 &start_peer,
586 ns))
587 return GNUNET_SYSERR;
590 ns))
591 return GNUNET_SYSERR;
592
594 "Carrier started.\n");
595 return GNUNET_OK;
596}
struct GNUNET_CONTAINER_MultiShortmap * subnets
Hash map containing subnets.
struct GNUNET_CONTAINER_MultiShortmap * peers
Hash map containing peers.
static int start_subnets(void *cls, const struct GNUNET_ShortHashCode *key, void *value)

References GNUNET_CONTAINER_multishortmap_iterate(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_OK, GNUNET_SYSERR, node_number, ns, GNUNET_TESTING_NetjailCarrier::peers, start_peer(), start_subnets(), GNUNET_TESTING_NetjailCarrier::subnets, and value.

Referenced by netjail_exec_run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ netjail_exec_run()

static void netjail_exec_run ( void *  cls,
struct GNUNET_TESTING_Interpreter is 
)
static

This function starts a helper process for each node.

Parameters
clsclosure.
cmdCMD being run.
isinterpreter state.

Definition at line 607 of file testing_api_cmd_netjail_start_cmds_helper.c.

609{
610 struct NetJailState *ns = cls;
611 struct GNUNET_TESTING_NetjailTopology *topology;
612 bool failed = false;
613 const struct GNUNET_TESTING_Command *topo_cmd;
614
615 ns->is = is;
617 ns->topology_cmd_label);
618 if (NULL == topo_cmd)
620 if (GNUNET_OK !=
621 GNUNET_TESTING_get_trait_topology_string (topo_cmd,
622 &ns->topology_data))
624 topology
625 = GNUNET_TESTING_get_topo_from_string_ (ns->topology_data);
627 "Number of nodes: %u\n",
628 topology->total);
630 backbone_peers,
631 &start_peer,
632 ns))
633 failed = true;
635 (topology->carriers,
636 &
638 ns))
639
640 failed = true;
641
643 if (failed)
644 {
645 ns->failed = true;
647 "Failed to start helpers!\n");
649 }
650 else
651 ns->timeout_task
653 &do_timeout,
654 ns);
655}
static struct GNUNET_TESTING_Interpreter * is
const struct GNUNET_TESTING_Command * GNUNET_TESTING_interpreter_lookup_command(struct GNUNET_TESTING_Interpreter *is, const char *label)
Lookup command by label.
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.
Definition: scheduler.c:1277
A command to be run by the interpreter.
Toplogy of our netjail setup.
struct GNUNET_CONTAINER_MultiShortmap * carriers
Hash map containing the carriers.
unsigned int total
Total number of namespaces in the topology.
static void do_timeout(void *cls)
Function run when the cmd terminates (good or bad) with timeout.
static int start_carriers(void *cls, const struct GNUNET_ShortHashCode *key, void *value)
#define LOG(kind,...)
Generic logging shortcut.
void GNUNET_TESTING_free_topology(struct GNUNET_TESTING_NetjailTopology *topology)
Deallocate memory of the struct GNUNET_TESTING_NetjailTopology.
struct GNUNET_TESTING_NetjailTopology * GNUNET_TESTING_get_topo_from_string_(const char *input)
Parse the topology data.

References GNUNET_TESTING_NetjailTopology::carriers, do_timeout(), GNUNET_CONTAINER_multishortmap_iterate(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_OK, GNUNET_SCHEDULER_add_delayed(), GNUNET_SYSERR, GNUNET_TESTING_FAIL, GNUNET_TESTING_free_topology(), GNUNET_TESTING_get_topo_from_string_(), GNUNET_TESTING_interpreter_lookup_command(), is, LOG, ns, start_carriers(), start_peer(), and GNUNET_TESTING_NetjailTopology::total.

Referenced by GNUNET_TESTING_cmd_netjail_start_helpers().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ netjail_exec_cleanup()

static void netjail_exec_cleanup ( void *  cls)
static

Code to clean up resource this cmd used.

Parameters
clsclosure

Definition at line 664 of file testing_api_cmd_netjail_start_cmds_helper.c.

665{
666 struct NetJailState *ns = cls;
667
668 if (NULL != ns->timeout_task)
669 {
670 GNUNET_SCHEDULER_cancel (ns->timeout_task);
671 ns->timeout_task = NULL;
672 }
673 for (unsigned int i = 0; i<ns->n_helpers; i++)
674 {
675 if (GNUNET_NO == ns->helpers[i]->finished)
676 GNUNET_HELPER_stop (ns->helpers[i]->helper,
677 GNUNET_YES);
678 GNUNET_free (ns->helpers[i]);
679 }
680 GNUNET_free (ns);
681}

References GNUNET_free, GNUNET_HELPER_stop(), GNUNET_NO, GNUNET_SCHEDULER_cancel(), GNUNET_YES, and ns.

Referenced by GNUNET_TESTING_cmd_netjail_start_helpers().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ netjail_exec_traits()

static enum GNUNET_GenericReturnValue netjail_exec_traits ( void *  cls,
const void **  ret,
const char *  trait,
unsigned int  index 
)
static

This function prepares an array with traits.

Definition at line 688 of file testing_api_cmd_netjail_start_cmds_helper.c.

692{
693 struct NetJailState *ns = cls;
694 struct GNUNET_TESTING_Trait traits[] = {
696 };
697
698 (void) ns;
700 ret,
701 trait,
702 index);
703}
struct GNUNET_TESTING_Trait GNUNET_TESTING_trait_end(void)
"end" of traits array.
enum GNUNET_GenericReturnValue GNUNET_TESTING_get_trait(const struct GNUNET_TESTING_Trait *traits, const void **ret, const char *trait, unsigned int index)
Obtain value of a trait from a command.
A struct GNUNET_TESTING_Trait can be used to exchange data between cmds.
unsigned int index
Index number associated with the trait.
static enum GNUNET_GenericReturnValue traits(void *cls, const void **ret, const char *trait, unsigned int index)
This function prepares an array with traits.

References GNUNET_TESTING_get_trait(), GNUNET_TESTING_trait_end(), GNUNET_TESTING_Trait::index, ns, ret, and traits().

Referenced by GNUNET_TESTING_cmd_netjail_start_helpers().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_TESTING_cmd_netjail_start_helpers()

struct GNUNET_TESTING_Command GNUNET_TESTING_cmd_netjail_start_helpers ( const char *  label,
const char *  topology_cmd_label,
struct GNUNET_TIME_Relative  timeout 
)

Create command.

Parameters
labelName for the command.
topology_datatopology data
timeoutBefore this timeout is reached this cmd MUST finish.
Returns
command.

Definition at line 715 of file testing_api_cmd_netjail_start_cmds_helper.c.

719{
720 struct NetJailState *ns;
721
722 ns = GNUNET_new (struct NetJailState);
723 ns->topology_cmd_label = topology_cmd_label;
724 ns->timeout = timeout;
726 label,
730 &ns->ac);
731}
static struct GNUNET_TIME_Relative timeout
User defined timestamp for completing operations.
Definition: gnunet-arm.c:118
struct GNUNET_TESTING_Command GNUNET_TESTING_command_new_ac(void *cls, const char *label, GNUNET_TESTING_CommandRunRoutine run, GNUNET_TESTING_CommandCleanupRoutine cleanup, GNUNET_TESTING_CommandGetTraits traits, struct GNUNET_TESTING_AsyncContext *ac)
Create a new command that may be asynchronous.
const char * topology_cmd_label
Configuration file for the test topology.
static void netjail_exec_cleanup(void *cls)
Code to clean up resource this cmd used.
static void netjail_exec_run(void *cls, struct GNUNET_TESTING_Interpreter *is)
This function starts a helper process for each node.
static enum GNUNET_GenericReturnValue netjail_exec_traits(void *cls, const void **ret, const char *trait, unsigned int index)
This function prepares an array with traits.

References GNUNET_new, GNUNET_TESTING_command_new_ac(), netjail_exec_cleanup(), netjail_exec_run(), netjail_exec_traits(), ns, timeout, and NetJailState::topology_cmd_label.

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ node_number

unsigned int node_number

The network namespace number of a node.

Definition at line 166 of file testing_api_cmd_netjail_start_cmds_helper.c.

Referenced by start_carriers(), start_peer(), and start_subnets().