gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnunet] 06/08: - moved global netjail methods to its own header file. -


From: gnunet
Subject: [gnunet] 06/08: - moved global netjail methods to its own header file. - added configuration by string in test skript instead of config file. - moved netjail scripts to contrib/netjail and install them into the share/gnunet directory.
Date: Tue, 09 Nov 2021 19:45:17 +0100

This is an automated email from the git hooks/post-receive script.

t3sserakt pushed a commit to branch master
in repository gnunet.

commit 8cd4dadfb9ebd4db232fda79d5c4353eacb15690
Author: t3sserakt <t3ss@posteo.de>
AuthorDate: Tue Nov 9 17:38:47 2021 +0100

    - moved global netjail methods to its own header file.
    - added configuration by string in test skript instead of config file.
    - moved netjail scripts to contrib/netjail and install them into
    the share/gnunet directory.
---
 contrib/Makefile.am                                |  11 +
 contrib/netjail/netjail_core.sh                    | 260 ++++++++++++
 contrib/netjail/netjail_exec.sh                    |  14 +
 contrib/netjail/netjail_start.sh                   |  81 ++++
 contrib/netjail/netjail_stop.sh                    |  65 +++
 contrib/netjail/topo.sh                            | 113 +++++
 po/POTFILES.in                                     |   6 -
 src/dhtu/test_dhtu_ip.c                            |   2 +-
 src/dhtu/testing_dhtu_cmd_send.c                   |   1 +
 src/include/Makefile.am                            |   1 +
 src/include/gnunet_testing_netjail_lib.h           | 463 +++++++++++++++++++++
 src/include/gnunet_testing_ng_lib.h                |  60 ++-
 src/include/gnunet_testing_plugin.h                |   4 +-
 src/testing/Makefile.am                            |  40 --
 src/testing/gnunet-cmds-helper.c                   |  41 +-
 src/testing/test_testing_api_cmd_netjail.c         |  87 ----
 src/testing/test_testing_hello_world.c             |  68 ---
 src/testing/test_testing_plugin_testcmd.c          | 123 ------
 src/testing/test_testing_topology.c                |  44 --
 src/testing/testing.c                              |  99 +++--
 ...testing_api_cmd_block_until_all_peers_started.c | 107 -----
 .../testing_api_cmd_block_until_external_trigger.c |   1 +
 src/testing/testing_api_cmd_finish.c               |   2 +
 src/testing/testing_api_cmd_hello_world.c          | 126 ------
 src/testing/testing_api_cmd_hello_world_birth.c    | 161 -------
 src/testing/testing_api_cmd_local_test_finished.c  |   1 +
 src/testing/testing_api_cmd_local_test_prepared.c  |   1 +
 src/testing/testing_api_cmd_netjail_start.c        |  43 +-
 .../testing_api_cmd_netjail_start_testsystem.c     | 187 +++------
 src/testing/testing_api_cmd_netjail_stop.c         |  77 ++--
 .../testing_api_cmd_netjail_stop_testsystem.c      |  14 +-
 src/testing/testing_api_cmd_send_peer_ready.c      |   1 +
 src/testing/testing_api_cmd_system_create.c        |   1 +
 src/testing/testing_api_cmd_system_destroy.c       |   1 +
 src/transport/Makefile.am                          |   2 +
 src/transport/gnunet-communicator-udp.c            |  41 +-
 src/transport/gnunet-service-tng.c                 |  80 +++-
 .../test_transport_plugin_cmd_simple_send.c        |  17 +-
 .../test_transport_plugin_cmd_udp_backchannel.c    |  13 +-
 src/transport/test_transport_simple_send_string.sh |  16 +
 src/transport/test_transport_start_with_config.c   |  76 +++-
 .../transport_api_cmd_backchannel_check.c          |   1 +
 src/transport/transport_api_cmd_connecting_peers.c |   5 +
 src/transport/transport_api_cmd_send_simple.c      |   1 +
 src/transport/transport_api_cmd_send_simple_v3.c   | 194 ---------
 src/transport/transport_api_cmd_start_peer.c       |   5 +
 src/transport/transport_api_cmd_stop_peer.c        |   1 +
 47 files changed, 1535 insertions(+), 1223 deletions(-)

diff --git a/contrib/Makefile.am b/contrib/Makefile.am
index 464016ee8..44b0ff76d 100644
--- a/contrib/Makefile.am
+++ b/contrib/Makefile.am
@@ -24,6 +24,10 @@ dist_pkgdata_DATA = \
   branding/logo/gnunet-logo-big.png \
   branding/logo/gnunet-logo.pdf \
   testing_hostkeys.ecc \
+  netjail/netjail_core.sh \
+  netjail/netjail_start.sh \
+  netjail/netjail_stop.sh \
+  netjail/topo.sh \
   $(BUILDCOMMON_SHLIB_FILES)
 
 INITD_FILES = \
@@ -240,4 +244,11 @@ aclocaldir = $(datadir)/aclocal
 aclocal_DATA = \
   gnunet.m4
 
+install-data-hook:
+       chmod o+x $(pkgdatadir)/netjail_core.sh
+       chmod o+x $(pkgdatadir)/netjail_start.sh
+       chmod o+x $(pkgdatadir)/netjail_stop.sh
+       chmod o+x $(pkgdatadir)/netjail_exec.sh
+       chmod o+x $(pkgdatadir)/topo.sh
+
 ## EOF
diff --git a/contrib/netjail/netjail_core.sh b/contrib/netjail/netjail_core.sh
new file mode 100755
index 000000000..ed363cf35
--- /dev/null
+++ b/contrib/netjail/netjail_core.sh
@@ -0,0 +1,260 @@
+#!/bin/sh
+# 
+
+
+PREFIX=${PPID:?must run from a parent process}
+
+# running with `sudo` is required to be
+# able running the actual commands as the
+# original user.
+
+export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
+
+export RESULT=
+export NAMESPACE_NUM=0
+export INTERFACE_NUM=0
+
+netjail_next_namespace() {
+       local NUM=$NAMESPACE_NUM
+       NAMESPACE_NUM=$(($NAMESPACE_NUM + 1))
+       RESULT=$NUM
+}
+
+netjail_next_interface() {
+       local NUM=$INTERFACE_NUM
+       INTERFACE_NUM=$(($INTERFACE_NUM + 1))
+       RESULT=$NUM
+}
+
+netjail_opt() {
+       local OPT=$1
+       shift 1
+
+       INDEX=1
+
+       while [ $# -gt 0 ]; do
+               if [ "$1" = "$OPT" ]; then
+                       RESULT=$INDEX
+                       return
+               fi
+
+               INDEX=$(($INDEX + 1))
+               shift 1
+       done
+
+       RESULT=0
+}
+
+netjail_opts() {
+       local OPT=$1
+       local DEF=$2
+       shift 2
+       
+       while [ $# -gt 0 ]; do
+               if [ "$1" = "$OPT" ]; then
+                       printf "$2"
+                       return
+               fi
+
+               shift 1
+       done
+       
+       RESULT="$DEF"
+}
+
+netjail_check() {
+       local NODE_COUNT=$1
+       local FD_COUNT=$(($(ls /proc/self/fd | wc -w) - 4))
+
+       # quit if `$FD_COUNT < ($LOCAL_M * $GLOBAL_N * 2)`:
+       # the script also requires `sudo -C ($FD_COUNT + 4)`
+       # so you need 'Defaults closefrom_override' in the
+       # sudoers file.
+
+       if [ $FD_COUNT -lt $(($NODE_COUNT * 2)) ]; then
+               echo "File descriptors do not match requirements!" >&2
+               exit 1
+       fi
+}
+
+netjail_check_bin() {
+       local PROGRAM=$1
+       local MATCH=$(ls $(echo $PATH | tr ":" "\n") | grep "^$PROGRAM\$" | tr 
"\n" " " | awk '{ print $1 }')
+
+       # quit if the required binary $PROGRAM can not be
+       # found in the used $PATH.
+
+       if [ "$MATCH" != "$PROGRAM" ]; then
+               echo "Required binary not found: $PROGRAM" >&2
+               exit 1
+       fi
+}
+
+netjail_bridge() {
+       netjail_next_interface
+       local NUM=$RESULT
+       local BRIDGE=$(printf "%06x-%08x" $PREFIX $NUM)
+
+       ip link add $BRIDGE type bridge
+       ip link set dev $BRIDGE up
+       
+       RESULT=$BRIDGE
+}
+
+netjail_bridge_name() {
+       netjail_next_interface
+       local NUM=$RESULT
+       local BRIDGE=$(printf "%06x-%08x" $PREFIX $NUM)
+       
+       RESULT=$BRIDGE
+}
+
+netjail_bridge_clear() {
+       local BRIDGE=$1
+
+       ip link delete $BRIDGE
+}
+
+netjail_node() {
+       netjail_next_namespace
+       local NUM=$RESULT
+       local NODE=$(printf "%06x-%08x" $PREFIX $NUM)
+
+       ip netns add $NODE
+       
+       RESULT=$NODE
+}
+
+netjail_node_name() {
+       netjail_next_namespace
+       local NUM=$RESULT
+       local NODE=$(printf "%06x-%08x" $PREFIX $NUM)
+       
+       RESULT=$NODE
+}
+
+netjail_node_clear() {
+       local NODE=$1
+
+       ip netns delete $NODE
+}
+
+netjail_node_link_bridge() {
+       local NODE=$1
+       local BRIDGE=$2
+       local ADDRESS=$3
+       local MASK=$4
+       
+       netjail_next_interface
+       local NUM_IF=$RESULT
+       netjail_next_interface
+       local NUM_BR=$RESULT
+       
+       local LINK_IF=$(printf "%06x-%08x" $PREFIX $NUM_IF)
+       local LINK_BR=$(printf "%06x-%08x" $PREFIX $NUM_BR)
+
+       ip link add $LINK_IF type veth peer name $LINK_BR
+       ip link set $LINK_IF netns $NODE
+       ip link set $LINK_BR master $BRIDGE
+
+       ip -n $NODE addr add "$ADDRESS/$MASK" broadcast + dev $LINK_IF
+       ip -n $NODE link set $LINK_IF up
+       ip -n $NODE link set up dev lo
+
+       ip link set $LINK_BR up
+       
+       RESULT=$LINK_BR
+}
+
+netjail_node_link_bridge_name() {
+       
+       netjail_next_interface
+       netjail_next_interface
+       local NUM_BR=$RESULT
+       
+       local LINK_BR=$(printf "%06x-%08x" $PREFIX $NUM_BR)
+       
+       RESULT=$LINK_BR
+}
+
+netjail_node_unlink_bridge() {
+       local LINK_BR=$1
+
+       ip link delete $LINK_BR
+}
+
+netjail_node_add_nat() {
+       local NODE=$1
+       local ADDRESS=$2
+       local MASK=$3
+
+       ip netns exec $NODE iptables -t nat -A POSTROUTING -s "$ADDRESS/$MASK" 
-j MASQUERADE
+}
+
+netjail_node_add_default() {
+       local NODE=$1
+       local ADDRESS=$2
+
+       ip -n $NODE route add default via $ADDRESS
+}
+
+netjail_node_exec() {
+    JAILOR=${SUDO_USER:?must run in sudo}
+       local NODE=$1
+       local FD_IN=$2
+       local FD_OUT=$3
+       shift 3
+
+       ip netns exec $NODE sudo -u $JAILOR -- $@ 1>& $FD_OUT 0<& $FD_IN
+}
+
+netjail_node_exec_without_fds() {
+    JAILOR=${SUDO_USER:?must run in sudo}
+       NODE=$1
+       shift 1
+
+       ip netns exec $NODE sudo -u $JAILOR -- $@
+}
+
+netjail_node_exec_without_fds_and_sudo() {
+       NODE=$1
+       shift 1
+
+       ip netns exec $NODE $@
+}
+
+netjail_kill() {
+       local PID=$1
+       local MATCH=$(ps --pid $PID | awk "{ if ( \$1 == $PID ) { print \$1 } 
}" | wc -l)
+
+       if [ $MATCH -gt 0 ]; then
+               kill -n 19 $PID
+
+               for CHILD in $(ps -o pid,ppid -ax | awk "{ if ( \$2 == $PID ) { 
print \$1 } }"); do
+                       netjail_kill $CHILD
+               done
+
+               kill $PID
+       fi
+}
+
+netjail_killall() {
+       if [ $# -gt 0 ]; then
+               local PIDS=$1
+
+               for PID in $PIDS; do
+                       netjail_kill $PID
+               done
+       fi
+}
+
+netjail_waitall() {
+       if [ $# -gt 0 ]; then
+               local PIDS=$1
+
+               for PID in $PIDS; do
+                       wait $PID
+               done
+       fi
+}
+
diff --git a/contrib/netjail/netjail_exec.sh b/contrib/netjail/netjail_exec.sh
new file mode 100755
index 000000000..ab4aad5b8
--- /dev/null
+++ b/contrib/netjail/netjail_exec.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+. "$(dirname $0)/netjail_core.sh"
+
+set -eu
+set -x
+
+export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
+
+M=$1
+N=$2
+
+NODE=$6
+
+netjail_node_exec_without_fds_and_sudo $NODE $3 $4 $5 $1 $2 $7 $8
diff --git a/contrib/netjail/netjail_start.sh b/contrib/netjail/netjail_start.sh
new file mode 100755
index 000000000..997ad0a95
--- /dev/null
+++ b/contrib/netjail/netjail_start.sh
@@ -0,0 +1,81 @@
+#!/bin/bash
+. "$(dirname $0)/netjail_core.sh"
+. "$(dirname $0)/topo.sh"
+
+set -eu
+set -x
+
+export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
+
+filename=$1
+PREFIX=$2
+readfile=$3
+
+if [ $readfile -eq 0 ]
+then
+    read_topology_string "$filename"
+else
+    echo read file
+    read_topology $filename
+fi
+
+shift 2
+
+LOCAL_GROUP="192.168.15"
+GLOBAL_GROUP="92.68.150"
+KNOWN_GROUP="92.68.151"
+
+
+echo "Start [local: $LOCAL_GROUP.0/24, global: $GLOBAL_GROUP.0/16]"
+
+netjail_bridge
+NETWORK_NET=$RESULT
+
+for X in $(seq $KNOWN); do
+       netjail_node
+       KNOWN_NODES[$X]=$RESULT
+       netjail_node_link_bridge ${KNOWN_NODES[$X]} $NETWORK_NET 
"$KNOWN_GROUP.$X" 16
+       KNOWN_LINKS[$X]=$RESULT
+done
+
+declare -A NODES
+declare -A NODE_LINKS
+
+for N in $(seq $GLOBAL_N); do
+       netjail_node
+       ROUTERS[$N]=$RESULT
+       netjail_node_link_bridge ${ROUTERS[$N]} $NETWORK_NET "$GLOBAL_GROUP.$N" 
16
+       NETWORK_LINKS[$N]=$RESULT
+       netjail_bridge
+       ROUTER_NETS[$N]=$RESULT
+       
+       for M in $(seq $LOCAL_M); do
+               netjail_node
+               NODES[$N,$M]=$RESULT
+               netjail_node_link_bridge ${NODES[$N,$M]} ${ROUTER_NETS[$N]} 
"$LOCAL_GROUP.$M" 24
+               NODE_LINKS[$N,$M]=$RESULT
+       done
+
+       ROUTER_ADDR="$LOCAL_GROUP.$(($LOCAL_M+1))"
+       netjail_node_link_bridge ${ROUTERS[$N]} ${ROUTER_NETS[$N]} $ROUTER_ADDR 
24
+       ROUTER_LINKS[$N]=$RESULT
+       
+       netjail_node_add_nat ${ROUTERS[$N]} $ROUTER_ADDR 24
+       
+       for M in $(seq $LOCAL_M); do
+               netjail_node_add_default ${NODES[$N,$M]} $ROUTER_ADDR
+       done
+
+    # TODO Topology configuration must be enhanced to configure forwarding to 
more than one subnet node via different ports.
+    
+    if [ "1" == "${R_TCP[$N]}" ]
+    then
+        ip netns exec ${ROUTERS[$N]} iptables -t nat -A PREROUTING -p tcp -d 
$GLOBAL_GROUP.$N --dport 60002 -j DNAT --to $LOCAL_GROUP.1
+        ip netns exec ${ROUTERS[$N]} iptables -A FORWARD -d $LOCAL_GROUP.1  -m 
state --state NEW,RELATED,ESTABLISHED -j ACCEPT
+    fi
+    if [ "1" == "${R_UDP[$N]}" ]
+    then
+        ip netns exec ${ROUTERS[$N]} iptables -t nat -A PREROUTING -p udp -d 
$GLOBAL_GROUP.$N --dport 60002 -j DNAT --to $LOCAL_GROUP.1
+        ip netns exec ${ROUTERS[$N]} iptables -A FORWARD -d $LOCAL_GROUP.1  -m 
state --state NEW,RELATED,ESTABLISHED -j ACCEPT
+    fi
+done
diff --git a/contrib/netjail/netjail_stop.sh b/contrib/netjail/netjail_stop.sh
new file mode 100755
index 000000000..c8739dc94
--- /dev/null
+++ b/contrib/netjail/netjail_stop.sh
@@ -0,0 +1,65 @@
+#!/bin/bash
+. "$(dirname $0)/netjail_core.sh"
+. "$(dirname $0)/topo.sh"
+
+set -eu
+set -x
+
+export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
+
+filename=$1
+PREFIX=$2
+readfile=$3
+
+if [ $readfile -eq 0 ]
+then
+    read_topology_string $filename
+else
+    read_topology $filename
+fi
+
+declare -A NODES
+declare -A NODE_LINKS
+
+netjail_bridge_name
+NETWORK_NET=$RESULT
+
+for X in $(seq $KNOWN); do
+    netjail_node_name
+       KNOWN_NODES[$X]=$RESULT
+    netjail_node_link_bridge_name
+    KNOWN_LINKS[$X]=$RESULT
+    netjail_node_unlink_bridge ${KNOWN_LINKS[$X]}
+       netjail_node_clear ${KNOWN_NODES[$X]}
+done
+
+for N in $(seq $GLOBAL_N); do
+    netjail_node_name
+       ROUTERS[$N]=$RESULT
+    netjail_node_link_bridge_name
+    NETWORK_LINKS[$N]=$RESULT
+    netjail_bridge_name
+    ROUTER_NETS[$N]=$RESULT
+    netjail_node_link_bridge_name
+    ROUTER_LINKS[$N]=$RESULT
+
+    netjail_node_unlink_bridge ${ROUTER_LINKS[$N]}
+    
+       for M in $(seq $LOCAL_M); do
+        netjail_node_name
+               NODES[$N,$M]=$RESULT
+        netjail_node_link_bridge_name
+        NODE_LINKS[$N,$M]=$RESULT
+               netjail_node_unlink_bridge ${NODE_LINKS[$N,$M]}
+               netjail_node_clear ${NODES[$N,$M]}
+       done
+
+       
+       netjail_bridge_clear ${ROUTER_NETS[$N]}
+       netjail_node_unlink_bridge ${NETWORK_LINKS[$N]}
+       netjail_node_clear ${ROUTERS[$N]}
+done
+
+netjail_bridge_clear $NETWORK_NET
+
+echo "Done"
diff --git a/contrib/netjail/topo.sh b/contrib/netjail/topo.sh
new file mode 100755
index 000000000..9af017ff0
--- /dev/null
+++ b/contrib/netjail/topo.sh
@@ -0,0 +1,113 @@
+#!/bin/bash
+
+declare -A K_PLUGIN
+declare -A R_TCP
+declare -A R_UDP
+declare -A P_PLUGIN
+
+extract_attributes()
+{
+    line_key=$1
+    line=$2
+    
+    if [ "$line_key" = "P" ]
+    then
+       n=$(echo $line|cut -d \| -f 1|awk -F: '{print $2}')
+       echo $n
+       m=$(echo $line|cut -d \| -f 1|awk -F: '{print $3}')
+       echo $m
+    else
+       number=$(echo $line|cut -d \| -f 1| cut -c 2-|cut -d : -f 2 )
+       echo $number
+    fi
+
+    nf=$(echo $line|awk -F: '{print NF}')
+    for ((i=2;i<=$nf;i++))
+    do
+       entry=$(echo $line |awk -v i=$i -F\| '{print $i}')
+       key=$(echo $entry|cut -d { -f 2|cut -d } -f 1|cut -d : -f 1)
+       value=$(echo $entry|cut -d { -f 2|cut -d } -f 1|cut -d : -f 2)
+       if [ "$key" = "tcp_port" ]
+       then
+           echo tcp port: $value
+           R_TCP[$number]=$value
+       elif [ "$key" = "udp_port" ]
+       then
+           echo udp port: $value
+           R_UDP[$number]=$value
+       elif [ "$key" = "plugin" ]
+       then
+           echo plugin: $value
+           echo $line_key
+           if [ "$line_key" = "P" ]
+           then
+               P_PLUGIN[$n,$m]=$value
+               echo $n $m ${P_PLUGIN[$n,$m]}
+           elif [ "$line_key" = "K" ]
+           then
+               K_PLUGIN[$number]=$value
+           fi
+       fi
+    done
+}
+
+parse_line(){
+    line=$1
+    echo $line
+    key=$(cut -c -1 <<< $line)
+    if [ "$key" = "M" ]
+    then
+       LOCAL_M=$(cut -d : -f 2 <<< $line)
+       echo $LOCAL_M
+    elif [ "$key" = "N" ]
+    then
+       GLOBAL_N=$(cut -d : -f 2 <<< $line)
+       echo $GLOBAL_N
+    for ((i=1;i<=$GLOBAL_N;i++))
+    do
+        R_TCP[$i]=0
+        R_UDP[$i]=0
+    done    
+    elif [ "$key" = "X" ]
+    then
+       KNOWN=$(cut -d : -f 2 <<< $line)
+       echo $KNOWN
+    elif [ "$key" = "T" ]
+    then
+       PLUGIN=$(cut -d : -f 2 <<< $line)
+       echo $PLUGIN
+    elif [ "$key" = "K" ]
+    then
+       echo know node
+       extract_attributes $key $line
+    elif [ "$key" = "R" ]
+    then
+       echo router
+       extract_attributes $key $line
+    elif [ "$key" = "P" ]
+    then
+       echo node
+       extract_attributes $key $line
+    fi
+}
+
+read_topology_string(){
+    string=$1
+    IFS=' ' read -r -a array <<< $string
+    for element in "${array[@]}"
+    do
+        echo $element
+        parse_line $element
+    done
+}
+
+read_topology(){
+    local filename=$1
+    while read line; do
+        # reading each line
+        parse_line $line
+    done < $filename
+}
+
+
+
diff --git a/po/POTFILES.in b/po/POTFILES.in
index b0035e712..ef74c2472 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -423,17 +423,13 @@ src/testing/gnunet-testing.c
 src/testing/list-keys.c
 src/testing/testing.c
 src/testing/testing_api_cmd_batch.c
-src/testing/testing_api_cmd_block_until_all_peers_started.c
 src/testing/testing_api_cmd_block_until_external_trigger.c
 src/testing/testing_api_cmd_end.c
 src/testing/testing_api_cmd_finish.c
-src/testing/testing_api_cmd_hello_world.c
-src/testing/testing_api_cmd_hello_world_birth.c
 src/testing/testing_api_cmd_local_test_finished.c
 src/testing/testing_api_cmd_local_test_prepared.c
 src/testing/testing_api_cmd_netjail_start.c
 src/testing/testing_api_cmd_netjail_start_testsystem.c
-src/testing/testing_api_cmd_netjail_start_testsystem_new.c
 src/testing/testing_api_cmd_netjail_stop.c
 src/testing/testing_api_cmd_netjail_stop_testsystem.c
 src/testing/testing_api_cmd_send_peer_ready.c
@@ -443,7 +439,6 @@ src/testing/testing_api_loop.c
 src/testing/testing_api_trait_cmd.c
 src/testing/testing_api_trait_process.c
 src/testing/testing_api_traits.c
-src/testing/testing_json_vnet.c
 src/topology/friends.c
 src/topology/gnunet-daemon-topology.c
 src/transport/gnunet-communicator-tcp.c
@@ -498,7 +493,6 @@ src/transport/transport_api_blacklist.c
 src/transport/transport_api_cmd_backchannel_check.c
 src/transport/transport_api_cmd_connecting_peers.c
 src/transport/transport_api_cmd_send_simple.c
-src/transport/transport_api_cmd_send_simple_v3.c
 src/transport/transport_api_cmd_start_peer.c
 src/transport/transport_api_cmd_stop_peer.c
 src/transport/transport_api_core.c
diff --git a/src/dhtu/test_dhtu_ip.c b/src/dhtu/test_dhtu_ip.c
index c9528053f..7913cfc35 100644
--- a/src/dhtu/test_dhtu_ip.c
+++ b/src/dhtu/test_dhtu_ip.c
@@ -24,7 +24,7 @@
  * @author Christian Grothoff
  */
 #include "platform.h"
-#include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "gnunet_util_lib.h"
 
 #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 120)
diff --git a/src/dhtu/testing_dhtu_cmd_send.c b/src/dhtu/testing_dhtu_cmd_send.c
index e620e329e..fe8e1c18a 100644
--- a/src/dhtu/testing_dhtu_cmd_send.c
+++ b/src/dhtu/testing_dhtu_cmd_send.c
@@ -25,6 +25,7 @@
  */
 #include "platform.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 
 
 /**
diff --git a/src/include/Makefile.am b/src/include/Makefile.am
index 9c22b5977..e4b02b8ee 100644
--- a/src/include/Makefile.am
+++ b/src/include/Makefile.am
@@ -118,6 +118,7 @@ gnunetinclude_HEADERS = \
   gnunet_testing_lib.h \
   gnunet_testing_plugin.h \
   gnunet_testing_ng_lib.h \
+  gnunet_testing_netjail_lib.h \
   gnunet_time_lib.h \
   gnunet_transport_service.h \
   gnunet_transport_application_service.h \
diff --git a/src/include/gnunet_testing_netjail_lib.h 
b/src/include/gnunet_testing_netjail_lib.h
new file mode 100644
index 000000000..3a5e9f749
--- /dev/null
+++ b/src/include/gnunet_testing_netjail_lib.h
@@ -0,0 +1,463 @@
+/*
+      This file is part of GNUnet
+      Copyright (C) 2021 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 <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
+ */
+
+/**
+ * @brief API for writing an interpreter to test GNUnet components
+ * @author Christian Grothoff <christian@grothoff.org>
+ * @author Marcello Stanisci
+ * @author t3sserakt
+ */
+#ifndef GNUNET_TESTING_NG_LIB_H
+#define GNUNET_TESTING_NG_LIB_H
+
+#include "gnunet_util_lib.h"
+#include "gnunet_testing_plugin.h"
+#include "gnunet_testing_ng_lib.h"
+
+
+/**
+ * Router of a netjail subnet.
+ */
+struct GNUNET_TESTING_NetjailRouter
+{
+  /**
+   * Will tcp be forwarded?
+   */
+  unsigned int tcp_port;
+
+  /**
+   * Will udp be forwarded?
+   */
+  unsigned int udp_port;
+};
+
+
+/**
+ * Enum for the different types of nodes.
+ */
+enum GNUNET_TESTING_NODE_TYPE
+{
+  /**
+   * Node in a subnet.
+   */
+  GNUNET_TESTING_SUBNET_NODE,
+
+  /**
+   * Global known node.
+   */
+  GNUNET_TESTING_GLOBAL_NODE
+};
+
+/**
+ * Protocol address prefix für a connection between nodes.
+ */
+struct GNUNET_TESTING_AddressPrefix
+{
+  /**
+   * Pointer to the previous prefix in the DLL.
+   */
+  struct GNUNET_TESTING_AddressPrefix *prev;
+
+  /**
+   * Pointer to the next prefix in the DLL.
+   */
+  struct GNUNET_TESTING_AddressPrefix *next;
+
+  /**
+   * The address prefix.
+   */
+  char *address_prefix;
+};
+
+
+/**
+ * Node in a netjail topology.
+ */
+struct GNUNET_TESTING_NetjailNode;
+
+/**
+ * Connection to another node.
+ */
+struct GNUNET_TESTING_NodeConnection
+{
+  /**
+   * Pointer to the previous connection in the DLL.
+   */
+  struct GNUNET_TESTING_NodeConnection *prev;
+
+  /**
+   * Pointer to the next connection in the DLL.
+   */
+  struct GNUNET_TESTING_NodeConnection *next;
+
+  /**
+   * The number of the subnet of the node this connection points to. This is 0,
+   * if the node is a global known node.
+   */
+  unsigned int namespace_n;
+
+  /**
+   * The number of the node this connection points to.
+   */
+  unsigned int node_n;
+
+  /**
+   * The type of the node this connection points to.
+   */
+  enum GNUNET_TESTING_NODE_TYPE node_type;
+
+  /**
+   * The node which establish the connection
+   */
+  struct GNUNET_TESTING_NetjailNode *node;
+
+  /**
+   * Head of the DLL with the address prefixes for the protocolls this node is 
reachable.
+   */
+  struct GNUNET_TESTING_AddressPrefix *address_prefixes_head;
+
+  /**
+   * Tail of the DLL with the address prefixes for the protocolls this node is 
reachable.
+   */
+  struct GNUNET_TESTING_AddressPrefix *address_prefixes_tail;
+};
+
+/**
+ * Node in the netjail topology.
+ */
+struct GNUNET_TESTING_NetjailNode
+{
+  /**
+   * Plugin for the test case to be run on this node.
+   */
+  char *plugin;
+
+  /**
+   * Flag indicating if this node is a global known node.
+   */
+  unsigned int is_global;
+
+  /**
+   * The number of the subnet this node is running in.
+   */
+  unsigned int namespace_n;
+
+  /**
+   * The number of this node in the subnet.
+   */
+  unsigned int node_n;
+
+  /**
+   * Head of the DLL with the connections which shall be established to other 
nodes.
+   */
+  struct GNUNET_TESTING_NodeConnection *node_connections_head;
+
+  /**
+   * Tail of the DLL with the connections which shall be established to other 
nodes.
+   */
+  struct GNUNET_TESTING_NodeConnection *node_connections_tail;
+};
+
+
+/**
+ * Subnet in a topology.
+ */
+struct GNUNET_TESTING_NetjailNamespace
+{
+  /**
+   * The number of the subnet.
+   */
+  unsigned int namespace_n;
+
+  /**
+   * Router of the subnet.
+   */
+  struct GNUNET_TESTING_NetjailRouter *router;
+
+  /**
+   * Hash map containing the nodes in this subnet.
+   */
+  struct GNUNET_CONTAINER_MultiShortmap *nodes;
+};
+
+/**
+ * Toplogy of our netjail setup.
+ */
+struct GNUNET_TESTING_NetjailTopology
+{
+
+  /**
+   * Default plugin for the test case to be run on nodes.
+   */
+  char *plugin;
+
+  /**
+   * Number of subnets.
+   */
+  unsigned int namespaces_n;
+
+  /**
+   * Number of nodes per subnet.
+   */
+  unsigned int nodes_m;
+
+  /**
+   * Number of global known nodes.
+   */
+  unsigned int nodes_x;
+
+  /**
+   * Hash map containing the subnets (for natted nodes) of the topology.
+   */
+  struct GNUNET_CONTAINER_MultiShortmap *map_namespaces;
+
+  /**
+   * Hash map containing the global known nodes which are not natted.
+   */
+  struct GNUNET_CONTAINER_MultiShortmap *map_globals;
+};
+
+/**
+ * Getting the topology from file.
+ *
+ * @param filename The name of the topology file.
+ * @return The GNUNET_TESTING_NetjailTopology
+ */
+struct GNUNET_TESTING_NetjailTopology *
+GNUNET_TESTING_get_topo_from_file (const char *filename);
+
+
+/**
+ * Parse the topology data.
+ *
+ * @param data The topology data.
+ * @return The GNUNET_TESTING_NetjailTopology
+ */
+struct GNUNET_TESTING_NetjailTopology *
+GNUNET_TESTING_get_topo_from_string (char *data);
+
+
+/**
+ * Get the connections to other nodes for a specific node.
+ *
+ * @param num The specific node we want the connections for.
+ * @param topology The topology we get the connections from.
+ * @return The connections of the node.
+ */
+struct GNUNET_TESTING_NodeConnection *
+GNUNET_TESTING_get_connections (unsigned int num, struct
+                                GNUNET_TESTING_NetjailTopology *topology);
+
+
+/**
+ * Get the address for a specific communicator from a connection.
+ *
+ * @param connection The connection we like to have the address from.
+ * @param prefix The communicator protocol prefix.
+ * @return The address of the communicator.
+ */
+char *
+GNUNET_TESTING_get_address (struct GNUNET_TESTING_NodeConnection *connection,
+                            char *prefix);
+
+
+/**
+ * Deallocate memory of the struct GNUNET_TESTING_NetjailTopology.
+ *
+ * @param topology The GNUNET_TESTING_NetjailTopology to be deallocated.
+ */
+void
+GNUNET_TESTING_free_topology (struct GNUNET_TESTING_NetjailTopology *topology);
+
+
+/**
+ * Calculate the unique id identifying a node from a given connction.
+ *
+ * @param node_connection The connection we calculate the id from.
+ * @param topology The topology we get all needed information from.
+ * @return The unique id of the node from the connection.
+ */
+unsigned int
+GNUNET_TESTING_calculate_num (struct
+                              GNUNET_TESTING_NodeConnection *node_connection,
+                              struct GNUNET_TESTING_NetjailTopology *topology);
+
+
+/**
+ * Struct to hold information for callbacks.
+ *
+ */
+struct LocalPreparedState
+{
+  /**
+   * Context for our asynchronous completion.
+   */
+  struct GNUNET_TESTING_AsyncContext *ac;
+
+  /**
+   * Callback to write messages to the master loop.
+   *
+   */
+  TESTING_CMD_HELPER_write_cb write_message;
+};
+
+
+/**
+ * Create command.
+ *
+ * @param label name for command.
+ * @param topology_config Configuration file for the test topology.
+ * @return command.
+ */
+struct GNUNET_TESTING_Command
+GNUNET_TESTING_cmd_netjail_start (const char *label,
+                                  char *topology_config,
+                                  unsigned int *read_file);
+
+
+/**
+ * Create command.
+ *
+ * @param label Name for the command.
+ * @param topology The complete topology information.
+ * @return command.
+ */
+struct GNUNET_TESTING_Command
+GNUNET_TESTING_cmd_netjail_start_testing_system (
+  const char *label,
+  struct GNUNET_TESTING_NetjailTopology *topology);
+
+
+/**
+ * Create command.
+ *
+ * @param label name for command.
+ * @param topology_config Configuration file for the test topology.
+ * @return command.
+ */
+struct GNUNET_TESTING_Command
+GNUNET_TESTING_cmd_netjail_stop (const char *label,
+                                 char *topology_config,
+                                 unsigned int *read_file);
+
+
+/**
+ * Create command.
+ *
+ * @param label name for command.
+ * @param helper_start_label label of the cmd to start the test system.
+ * @param topology The complete topology information.
+ * @return command.
+ */
+struct GNUNET_TESTING_Command
+GNUNET_TESTING_cmd_stop_testing_system (
+  const char *label,
+  const char *helper_start_label,
+  struct GNUNET_TESTING_NetjailTopology *topology);
+
+
+/**
+ * Create a GNUNET_CMDS_LOCAL_FINISHED message.
+ *
+ * @param rv The result of the local test as GNUNET_GenericReturnValue.
+ * @return The GNUNET_CMDS_LOCAL_FINISHED message.
+*/
+struct GNUNET_MessageHeader *
+GNUNET_TESTING_send_local_test_finished_msg (enum GNUNET_GenericReturnValue 
rv);
+
+
+/**
+ * Function to get the trait with the async context.
+ *
+ * @param[out] ac GNUNET_TESTING_AsyncContext.
+ * @return #GNUNET_OK if no error occurred, #GNUNET_SYSERR otherwise.
+ */
+int
+GNUNET_TESTING_get_trait_async_context (
+  const struct GNUNET_TESTING_Command *cmd,
+  struct GNUNET_TESTING_AsyncContext **ac);
+
+
+/**
+ * Offer handles to testing cmd helper from trait
+ *
+ * @param cmd command to extract the message from.
+ * @param pt pointer to message.
+ * @return #GNUNET_OK on success.
+ */
+enum GNUNET_GenericReturnValue
+GNUNET_TESTING_get_trait_helper_handles (
+  const struct GNUNET_TESTING_Command *cmd,
+  struct GNUNET_HELPER_Handle ***helper);
+
+
+struct GNUNET_TESTING_Command
+GNUNET_TESTING_cmd_block_until_all_peers_started (
+  const char *label,
+  unsigned int *all_peers_started);
+
+
+struct GNUNET_TESTING_Command
+GNUNET_TESTING_cmd_block_until_external_trigger (
+  const char *label);
+
+struct GNUNET_TESTING_Command
+GNUNET_TESTING_cmd_send_peer_ready (const char *label,
+                                    TESTING_CMD_HELPER_write_cb write_message);
+
+
+/**
+ * Create command.
+ *
+ * @param label name for command.
+ * @param write_message Callback to write messages to the master loop.
+ * @return command.
+ */
+struct GNUNET_TESTING_Command
+GNUNET_TESTING_cmd_local_test_finished (
+  const char *label,
+  TESTING_CMD_HELPER_write_cb write_message);
+
+/**
+ * Create command.
+ *
+ * @param label name for command.
+ * @param write_message Callback to write messages to the master loop.
+ * @param all_local_tests_prepared Flag which will be set from outside.
+ * @return command.
+ */
+struct GNUNET_TESTING_Command
+GNUNET_TESTING_cmd_local_test_prepared (const char *label,
+                                        TESTING_CMD_HELPER_write_cb
+                                        write_message);
+
+/**
+ * Function to get the trait with the struct LocalPreparedState.
+ *
+ * @param[out] lfs struct LocalPreparedState.
+ * @return #GNUNET_OK if no error occurred, #GNUNET_SYSERR otherwise.
+ *
+ */
+enum GNUNET_GenericReturnValue
+GNUNET_TESTING_get_trait_local_prepared_state (
+  const struct GNUNET_TESTING_Command *cmd,
+  struct LocalPreparedState **lfs);
+
+#endif
diff --git a/src/include/gnunet_testing_ng_lib.h 
b/src/include/gnunet_testing_ng_lib.h
index 7ce73baef..2d040ac21 100644
--- a/src/include/gnunet_testing_ng_lib.h
+++ b/src/include/gnunet_testing_ng_lib.h
@@ -656,6 +656,16 @@ struct GNUNET_TESTING_NetjailTopology *
 GNUNET_TESTING_get_topo_from_file (const char *filename);
 
 
+/**
+ * Parse the topology data.
+ *
+ * @param data The topology data.
+ * @return The GNUNET_TESTING_NetjailTopology
+ */
+struct GNUNET_TESTING_NetjailTopology *
+GNUNET_TESTING_get_topo_from_string (char *data);
+
+
 /**
  * Get the connections to other nodes for a specific node.
  *
@@ -1073,28 +1083,6 @@ struct LocalPreparedState
   TESTING_CMD_HELPER_write_cb write_message;
 };
 
-/**
- * Create command.
- *
- * @param label name for command.
- * @param now when the command was started.
- * @return command.
- */
-struct GNUNET_TESTING_Command
-GNUNET_TESTING_cmd_hello_world_birth (const char *label,
-                                      struct GNUNET_TIME_Absolute *now);
-
-/**
- * Create command.
- *
- * @param label name for command.
- * @param message initial message.
- * @return command.
- */
-struct GNUNET_TESTING_Command
-GNUNET_TESTING_cmd_hello_world (const char *label,
-                                const char *birthLabel,
-                                char *message);
 
 /**
  * Offer data from trait
@@ -1135,20 +1123,25 @@ GNUNET_TESTING_cmd_system_destroy (const char *label,
  */
 struct GNUNET_TESTING_Command
 GNUNET_TESTING_cmd_netjail_start (const char *label,
-                                  char *topology_config);
+                                  char *topology_config,
+                                  unsigned int *read_file);
 
 
 /**
  * Create command.
  *
  * @param label Name for the command.
- * @param topology_config Configuration file for the test topology.
- * @param rv Pointer to the return value of the test.
+ * @param topology The complete topology information.
+ * @param read_file Flag indicating if the the name of the topology file is 
send to the helper, or a string with the topology data.
+ * @param topology_data If read_file is GNUNET_NO, topology_data holds the 
string with the topology.
  * @return command.
  */
 struct GNUNET_TESTING_Command
-GNUNET_TESTING_cmd_netjail_start_testing_system (const char *label,
-                                                 const char *topology_config);
+GNUNET_TESTING_cmd_netjail_start_testing_system (
+  const char *label,
+  struct GNUNET_TESTING_NetjailTopology *topology,
+  unsigned int *read_file,
+  char *topology_data);
 
 
 /**
@@ -1160,20 +1153,23 @@ GNUNET_TESTING_cmd_netjail_start_testing_system (const 
char *label,
  */
 struct GNUNET_TESTING_Command
 GNUNET_TESTING_cmd_netjail_stop (const char *label,
-                                 char *topology_config);
+                                 char *topology_config,
+                                 unsigned int *read_file);
 
 
 /**
  * Create command.
  *
  * @param label name for command.
- * @param topology_config Configuration file for the test topology.
+ * @param helper_start_label label of the cmd to start the test system.
+ * @param topology The complete topology information.
  * @return command.
  */
 struct GNUNET_TESTING_Command
-GNUNET_TESTING_cmd_stop_testing_system (const char *label,
-                                        const char *helper_start_label,
-                                        const char *topology_config);
+GNUNET_TESTING_cmd_stop_testing_system (
+  const char *label,
+  const char *helper_start_label,
+  struct GNUNET_TESTING_NetjailTopology *topology);
 
 
 /**
diff --git a/src/include/gnunet_testing_plugin.h 
b/src/include/gnunet_testing_plugin.h
index 4a6a9368e..b59d2cea1 100644
--- a/src/include/gnunet_testing_plugin.h
+++ b/src/include/gnunet_testing_plugin.h
@@ -46,7 +46,9 @@ typedef void
                                         char *node_ip,
                                         char *n,
                                         char *m,
-                                        char *local_m);
+                                        char *local_m,
+                                        char *topology_data,
+                                        unsigned int *read_file);
 
 
 typedef void
diff --git a/src/testing/Makefile.am b/src/testing/Makefile.am
index 3daa29e1e..a9a1b5a02 100644
--- a/src/testing/Makefile.am
+++ b/src/testing/Makefile.am
@@ -18,9 +18,6 @@ libexec_PROGRAMS = \
 
 plugindir = $(libdir)/gnunet
 
-plugin_LTLIBRARIES = \
-  libgnunet_test_testing_plugin_testcmd.la
-
 lib_LTLIBRARIES = \
   libgnunettesting.la
 
@@ -31,25 +28,12 @@ gnunet_cmds_helper_LDADD = $(XLIB) \
  libgnunettesting.la \
  $(LTLIBINTL) $(Z_LIBS)
 
-libgnunet_test_testing_plugin_testcmd_la_SOURCES = \
-  test_testing_plugin_testcmd.c
-libgnunet_test_testing_plugin_testcmd_la_LIBADD = \
-  $(top_builddir)/src/util/libgnunetutil.la \
-  $(top_builddir)/src/arm/libgnunetarm.la \
-  libgnunettesting.la \
-  $(top_builddir)/src/statistics/libgnunetstatistics.la \
-  $(LTLIBINTL)
-libgnunet_test_testing_plugin_testcmd_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-
-
 libgnunettesting_la_SOURCES = \
   testing_api_cmd_end.c \
   testing_api_cmd_finish.c \
   testing_api_cmd_local_test_finished.c \
   testing_api_cmd_local_test_prepared.c \
   testing_api_cmd_send_peer_ready.c \
-  testing_api_cmd_block_until_all_peers_started.c \
   testing_api_cmd_block_until_external_trigger.c \
   testing_api_cmd_netjail_start.c \
   testing_api_cmd_netjail_start_testsystem.c \
@@ -59,8 +43,6 @@ libgnunettesting_la_SOURCES = \
   testing_api_cmd_system_create.c \
   testing_api_cmd_system_destroy.c \
   testing_api_cmd_batch.c \
-  testing_api_cmd_hello_world.c \
-  testing_api_cmd_hello_world_birth.c \
   testing_api_loop.c \
   testing_api_trait_cmd.c \
   testing_api_trait_process.c \
@@ -94,8 +76,6 @@ list_keys_LDADD = \
 
 
 check_PROGRAMS = \
- test_testing_api_cmd_netjail \
- test_testing_hello_world \
  test_testing_portreservation \
  test_testing_servicestartup \
  test_testing_peerstartup \
@@ -105,32 +85,12 @@ check_PROGRAMS = \
 if ENABLE_TEST_RUN
 AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export 
PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH;unset XDG_DATA_HOME;unset 
XDG_CONFIG_HOME;
 TESTS = \
- test_testing_api_cmd_netjail \
- test_testing_hello_world \
  test_testing_portreservation \
  test_testing_peerstartup \
  test_testing_peerstartup2 \
  test_testing_servicestartup
 endif
 
-#test_testing_topology_SOURCES = \
-# test_testing_topology.c
-#test_testing_topology_LDADD = \
-# libgnunettesting.la \
-# $(top_builddir)/src/util/libgnunetutil.la
-
-test_testing_api_cmd_netjail_SOURCES = \
- test_testing_api_cmd_netjail.c
-test_testing_api_cmd_netjail_LDADD = \
- libgnunettesting.la \
- $(top_builddir)/src/util/libgnunetutil.la
-
-test_testing_hello_world_SOURCES = \
- test_testing_hello_world.c
-test_testing_hello_world_LDADD = \
- libgnunettesting.la \
- $(top_builddir)/src/util/libgnunetutil.la
-
 test_testing_portreservation_SOURCES = \
  test_testing_portreservation.c
 test_testing_portreservation_LDADD = \
diff --git a/src/testing/gnunet-cmds-helper.c b/src/testing/gnunet-cmds-helper.c
index 4aeccb115..f90cc3cc4 100644
--- a/src/testing/gnunet-cmds-helper.c
+++ b/src/testing/gnunet-cmds-helper.c
@@ -142,6 +142,16 @@ struct NodeIdentifier
    *
    */
   char *local_m;
+
+  /**
+   * Shall we read the topology from file, or from a string.
+   */
+  unsigned int *read_file;
+
+  /**
+   * String with topology data or name of topology file.
+   */
+  char *topology_data;
 };
 
 /**
@@ -402,7 +412,8 @@ tokenizer_cb (void *cls, const struct GNUNET_MessageHeader 
*message)
     strcat (node_ip, plugin->m);
 
     plugin->api->start_testcase (&write_message, router_ip, node_ip, plugin->m,
-                                 plugin->n, plugin->local_m);
+                                 plugin->n, plugin->local_m, ni->topology_data,
+                                 ni->read_file);
 
     GNUNET_free (binary);
 
@@ -559,6 +570,10 @@ main (int argc, char **argv)
   struct GNUNET_GETOPT_CommandLineOption options[] =
   { GNUNET_GETOPT_OPTION_END };
   int ret;
+  int i;
+  size_t topology_data_length = 0;
+  unsigned int read_file;
+  char cr[1] = "\n";
 
   GNUNET_log_setup ("gnunet-cmds-helper",
                     "DEBUG",
@@ -569,6 +584,30 @@ main (int argc, char **argv)
   ni->m = argv[3];
   ni->n = argv[4];
 
+  sscanf (argv[5], "%u", &read_file);
+
+  if (1 == read_file)
+    ni->topology_data = argv[6];
+  else
+  {
+    for (i = 6; i<argc; i++)
+      topology_data_length += strlen (argv[i]) + 1;
+    LOG (GNUNET_ERROR_TYPE_DEBUG,
+         "topo data length %lu\n",
+         topology_data_length);
+    ni->topology_data = GNUNET_malloc (topology_data_length);
+    for (i = 6; i<argc; i++)
+    {
+      strcat (ni->topology_data, argv[i]);
+      strcat (ni->topology_data, cr);
+    }
+  }
+  ni->read_file = &read_file;
+  ni->topology_data[topology_data_length - 1] = '\0';
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "topo data %s\n",
+       ni->topology_data);
+
   status = GNUNET_OK;
   if (NULL ==
       (sigpipe = GNUNET_DISK_pipe (GNUNET_DISK_PF_NONE)))
diff --git a/src/testing/test_testing_api_cmd_netjail.c 
b/src/testing/test_testing_api_cmd_netjail.c
deleted file mode 100644
index aeddfb7c9..000000000
--- a/src/testing/test_testing_api_cmd_netjail.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
-      This file is part of GNUnet
-      Copyright (C) 2021 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 <http://www.gnu.org/licenses/>.
-
-     SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file testing/test_testbed_api_cmd_netjail.c
- * @brief Test case executing a script in a network name space.
- * @author t3sserakt
- */
-#include "platform.h"
-#include "gnunet_testing_ng_lib.h"
-#include "gnunet_util_lib.h"
-
-
-/**
-  * Return value of the test.
-  *
-  */
-static unsigned int rv = 0;
-
-
-/**
- * Main function to run the test cases.
- *
- * @param cls not used.
- *
- */
-static void
-run (void *cls)
-{
-  struct GNUNET_TESTING_Command commands[] = {
-    GNUNET_TESTING_cmd_netjail_start ("netjail-start-1",
-                                      "2",
-                                      "2"),
-    GNUNET_TESTING_cmd_netjail_start_testing_system ("netjail-start-testbed-1",
-                                                     "2",
-                                                     "2",
-                                                     
"libgnunet_plugin_testcmd",
-                                                     &rv),
-    GNUNET_TESTING_cmd_stop_testing_system ("stop-testbed",
-                                            "netjail-start-testbed-1",
-                                            "2",
-                                            "2"),
-    GNUNET_TESTING_cmd_netjail_stop ("netjail-stop-1",
-                                     "2",
-                                     "2"),
-    GNUNET_TESTING_cmd_end ()
-  };
-
-  GNUNET_TESTING_run (NULL,
-                      commands,
-                      GNUNET_TIME_UNIT_FOREVER_REL);
-}
-
-
-int
-main (int argc,
-      char *const *argv)
-{
-  int rv = 0;
-
-  GNUNET_log_setup ("test-netjail",
-                    "DEBUG",
-                    NULL);
-  GNUNET_SCHEDULER_run (&run,
-                        NULL);
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Test finished!\n");
-  return rv;
-}
diff --git a/src/testing/test_testing_hello_world.c 
b/src/testing/test_testing_hello_world.c
deleted file mode 100644
index 6300e26a4..000000000
--- a/src/testing/test_testing_hello_world.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
-      This file is part of GNUnet
-      Copyright (C) 2021 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 <http://www.gnu.org/licenses/>.
-
-     SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file testing/test_testing_hello_world.c
- * @brief hello world test case
- * @author t3sserakt
- */
-#include "platform.h"
-#include "gnunet_testing_ng_lib.h"
-#include "gnunet_util_lib.h"
-
-/**
- * Main function to run the test cases.
- *
- * @param cls not used.
- *
- */
-static void
-run (void *cls)
-{
-  (void *) cls;
-  struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get ();
-
-  struct GNUNET_TESTING_Command commands[] = {
-    GNUNET_TESTING_cmd_hello_world_birth ("hello-world-birth-0",
-                                          &now),
-    GNUNET_TESTING_cmd_hello_world ("hello-world-0","hello-world-birth-0",""),
-    GNUNET_TESTING_cmd_end ()
-  };
-
-  GNUNET_TESTING_run (NULL,
-                      commands,
-                      GNUNET_TIME_UNIT_FOREVER_REL);
-}
-
-int
-main (int argc,
-      char *const *argv)
-{
-  int rv = 0;
-
-  GNUNET_log_setup ("test-hello-world",
-                    "DEBUG",
-                    NULL);
-
-  GNUNET_SCHEDULER_run (&run,
-                        NULL);
-
-  return rv;
-}
diff --git a/src/testing/test_testing_plugin_testcmd.c 
b/src/testing/test_testing_plugin_testcmd.c
deleted file mode 100644
index 32e2b38a7..000000000
--- a/src/testing/test_testing_plugin_testcmd.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
-     This file is part of GNUnet
-     Copyright (C) 2021 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 <http://www.gnu.org/licenses/>.
-
-     SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file testbed/plugin_testcmd.c
- * @brief a plugin to provide the API for running test cases.
- * @author t3sserakt
- *
- * // FIXME: too verbose, no logic to return final status, will segv!
- */
-#include "platform.h"
-#include "gnunet_testing_ng_lib.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_testing_ng_lib.h"
-
-/**
- * Generic logging shortcut
- */
-#define LOG(kind, ...) GNUNET_log (kind, __VA_ARGS__)
-
-
-// FIXME: bad global!
-unsigned int are_all_peers_started;
-
-
-static void
-all_peers_started ()
-{
-  are_all_peers_started = GNUNET_YES;
-  LOG (GNUNET_ERROR_TYPE_ERROR,
-       "setting are_all_peers_started: %d\n",
-       are_all_peers_started);
-}
-
-
-static void
-start_testcase (TESTING_CMD_HELPER_write_cb write_message,
-                char *router_ip,
-                char *node_ip,
-                char *n,
-                char *m,
-                char *local_m)
-{
-  struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get ();
-
-  LOG (GNUNET_ERROR_TYPE_ERROR,
-       "We got here 6!\n");
-
-  are_all_peers_started = GNUNET_NO;
-
-  struct GNUNET_TESTING_Command commands[] = {
-    GNUNET_TESTING_cmd_hello_world_birth ("hello-world-birth-0",
-                                          &now),
-    GNUNET_TESTING_cmd_hello_world ("hello-world-0","hello-world-birth-0",""),
-    GNUNET_TESTING_cmd_send_peer_ready ("send-peer-ready-1",
-                                        write_message),
-    GNUNET_TESTING_cmd_block_until_all_peers_started ("block-1",
-                                                      &are_all_peers_started),
-    GNUNET_TESTING_cmd_local_test_finished ("local-test-finished-1",
-                                            write_message)
-  };
-
-  GNUNET_TESTING_run (commands,
-                      GNUNET_TIME_UNIT_FOREVER_REL,
-                      NULL, /* FIXME: pass continuation! */
-                      NULL);
-  LOG (GNUNET_ERROR_TYPE_ERROR,
-       "We got here 7!\n");
-
-}
-
-
-/**
- * Entry point for the plugin.
- *
- * @param cls NULL
- * @return the exported block API
- */
-void *
-libgnunet_plugin_testcmd_init (void *cls)
-{
-  struct GNUNET_TESTING_PluginFunctions *api;
-
-  api = GNUNET_new (struct GNUNET_TESTING_PluginFunctions);
-  api->start_testcase = &start_testcase;
-  api->all_peers_started = &all_peers_started;
-  return api;
-}
-
-
-/**
- * Exit point from the plugin.
- *
- * @param cls the return value from #libgnunet_plugin_block_test_init
- * @return NULL
- */
-void *
-libgnunet_plugin_testcmd_done (void *cls)
-{
-  struct GNUNET_TESTING_PluginFunctions *api = cls;
-
-  GNUNET_free (api);
-  return NULL;
-}
-
-
-
diff --git a/src/testing/test_testing_topology.c 
b/src/testing/test_testing_topology.c
deleted file mode 100644
index cfc91e609..000000000
--- a/src/testing/test_testing_topology.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
-     This file is part of GNUnet
-     Copyright (C) 2021 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 <http://www.gnu.org/licenses/>.
-
-     SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file testbed/plugin_testcmd.c
- * @brief a plugin to provide the API for running test cases.
- * @author t3sserakt
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_testing_ng_lib.h"
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "testing-api", __VA_ARGS__)
-
-int
-main (int argc,
-      char *const *argv)
-{
-  GNUNET_log_setup ("test-topology",
-                    "DEBUG",
-                    NULL);
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Test\n");
-  GNUNET_TESTING_get_topo_from_file ("topo.conf");
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Test2\n");
-}
diff --git a/src/testing/testing.c b/src/testing/testing.c
index 02cedc744..4ccf93c6b 100644
--- a/src/testing/testing.c
+++ b/src/testing/testing.c
@@ -33,7 +33,7 @@
 #include "gnunet_util_lib.h"
 #include "gnunet_arm_service.h"
 #include "gnunet_testing_lib.h"
-#include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "testing_cmds.h"
 
 #define LOG(kind, ...) GNUNET_log_from (kind, "testing-api", __VA_ARGS__)
@@ -2102,6 +2102,7 @@ GNUNET_TESTING_get_connections (unsigned int num, struct
   struct GNUNET_HashCode hc;
   struct GNUNET_TESTING_NetjailNamespace *namespace;
   unsigned int namespace_n, node_m;
+  struct GNUNET_TESTING_NodeConnection *node_connections = NULL;
 
   LOG (GNUNET_ERROR_TYPE_DEBUG,
        "gaga 1\n");
@@ -2121,6 +2122,7 @@ GNUNET_TESTING_get_connections (unsigned int num, struct
             sizeof (*hkey));
     node = GNUNET_CONTAINER_multishortmap_get (topology->map_globals,
                                                hkey);
+    node_connections = node->node_connections_head;
   }
   else
   {
@@ -2147,10 +2149,11 @@ GNUNET_TESTING_get_connections (unsigned int num, struct
             sizeof (*hkey));
     node = GNUNET_CONTAINER_multishortmap_get (namespace->nodes,
                                                hkey);
+    node_connections = node->node_connections_head;
   }
 
   GNUNET_free (hkey);
-  return node->node_connections_head;
+  return node_connections;
 }
 
 
@@ -2355,16 +2358,14 @@ GNUNET_TESTING_send_local_test_finished_msg (enum 
GNUNET_GenericReturnValue rv)
 
 
 /**
- * Getting the topology from file.
+ * Parse the topology data.
  *
- * @param filename The name of the topology file.
+ * @param data The topology data.
  * @return The GNUNET_TESTING_NetjailTopology
  */
 struct GNUNET_TESTING_NetjailTopology *
-GNUNET_TESTING_get_topo_from_file (const char *filename)
+GNUNET_TESTING_get_topo_from_string (char *data)
 {
-  uint64_t fs;
-  char *data;
   char *token;
   char *key = NULL;
   unsigned int out;
@@ -2379,36 +2380,9 @@ GNUNET_TESTING_get_topo_from_file (const char *filename)
   struct GNUNET_ShortHashCode *hkey;
   struct GNUNET_HashCode hc;
 
-  if (GNUNET_YES != GNUNET_DISK_file_test (filename))
-  {
-    LOG (GNUNET_ERROR_TYPE_ERROR,
-         _ ("Topology file %s not found\n"),
-         filename);
-    return NULL;
-  }
-  if (GNUNET_OK !=
-      GNUNET_DISK_file_size (filename, &fs, GNUNET_YES, GNUNET_YES))
-  {
-    LOG (GNUNET_ERROR_TYPE_ERROR,
-         _ ("Topology file %s has no data\n"),
-         filename);
-    return NULL;
-  }
-  data = GNUNET_malloc (fs);
-  if (fs != GNUNET_DISK_fn_read (filename, data, fs))
-  {
-    LOG (GNUNET_ERROR_TYPE_ERROR,
-         _ ("Topology file %s cannot be read\n"),
-         filename);
-    GNUNET_free (data);
-    return NULL;
-  }
-
   LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "data: %s\n",
+       "data %s\n",
        data);
-
-  data[fs] = '\0';
   token = strtok_r (data, "\n", &rest);
   topo = GNUNET_new (struct GNUNET_TESTING_NetjailTopology);
   topo->map_namespaces =
@@ -2626,7 +2600,62 @@ GNUNET_TESTING_get_topo_from_file (const char *filename)
       node_connections (token, node);
     }
     token = strtok_r (NULL, "\n", &rest);
+    if (NULL != token)
+      LOG (GNUNET_ERROR_TYPE_ERROR,
+           "Next token %s\n",
+           token);
+  }
+
+  return topo;
+}
+
+
+/**
+ * Getting the topology from file.
+ *
+ * @param filename The name of the topology file.
+ * @return The GNUNET_TESTING_NetjailTopology
+ */
+struct GNUNET_TESTING_NetjailTopology *
+GNUNET_TESTING_get_topo_from_file (const char *filename)
+{
+  uint64_t fs;
+  char *data;
+  struct GNUNET_TESTING_NetjailTopology *topo;
+
+  if (GNUNET_YES != GNUNET_DISK_file_test (filename))
+  {
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+         _ ("Topology file %s not found\n"),
+         filename);
+    return NULL;
+  }
+  if (GNUNET_OK !=
+      GNUNET_DISK_file_size (filename, &fs, GNUNET_YES, GNUNET_YES))
+  {
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+         _ ("Topology file %s has no data\n"),
+         filename);
+    return NULL;
   }
+  data = GNUNET_malloc (fs);
+  if (fs != GNUNET_DISK_fn_read (filename, data, fs))
+  {
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+         _ ("Topology file %s cannot be read\n"),
+         filename);
+    GNUNET_free (data);
+    return NULL;
+  }
+
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "data: %s\n",
+       data);
+
+  data[fs] = '\0';
+
+  topo = GNUNET_TESTING_get_topo_from_string (data);
+
   GNUNET_free (data);
 
   return topo;
diff --git a/src/testing/testing_api_cmd_block_until_all_peers_started.c 
b/src/testing/testing_api_cmd_block_until_all_peers_started.c
deleted file mode 100644
index 763713e15..000000000
--- a/src/testing/testing_api_cmd_block_until_all_peers_started.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
-      This file is part of GNUnet
-      Copyright (C) 2021 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 <http://www.gnu.org/licenses/>.
-
-     SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file testing_api_cmd_block_until_all_peers_started.c
- * @brief cmd to block the interpreter loop until all peers started.
- * @author t3sserakt
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_testing_ng_lib.h"
-
-/**
- * Generic logging shortcut
- */
-#define LOG(kind, ...) GNUNET_log (kind, __VA_ARGS__)
-
-/**
- * Struct with information for callbacks.
- *
- */
-struct BlockState
-{
-  /**
-   * Context for our asynchronous completion.
-   */
-  struct GNUNET_TESTING_AsyncContext ac;
-
-  /**
-   * Flag to indicate if all peers have started.
-   *
-   */
-  unsigned int *all_peers_started;
-};
-
-
-/**
- * The cleanup function of this cmd frees resources the cmd allocated.
- *
- */
-static void
-block_until_all_peers_started_cleanup (void *cls)
-{
-  struct BlockState *bs = cls;
-
-  GNUNET_free (bs);
-}
-
-
-/**
- * This function does nothing but to start the cmd.
- *
- */
-static void
-block_until_all_peers_started_run (void *cls,
-                                   struct GNUNET_TESTING_Interpreter *is)
-{
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "block_until_all_peers_started_run!\n");
-}
-
-
-/**
- * Create command.
- *
- * @param label name for command.
- * @param all_peers_started Flag which will be set from outside.
- * @return command.
- */
-struct GNUNET_TESTING_Command
-GNUNET_TESTING_cmd_block_until_all_peers_started (const char *label,
-                                                  unsigned int *
-                                                  all_peers_started)
-{
-  struct BlockState *bs;
-
-  bs = GNUNET_new (struct BlockState);
-  bs->all_peers_started = all_peers_started;
-  {
-    struct GNUNET_TESTING_Command cmd = {
-      .cls = bs,
-      .label = label,
-      .run = &block_until_all_peers_started_run,
-      .ac = &bs->ac,
-      .cleanup = &block_until_all_peers_started_cleanup
-    };
-
-    return cmd;
-  }
-}
diff --git a/src/testing/testing_api_cmd_block_until_external_trigger.c 
b/src/testing/testing_api_cmd_block_until_external_trigger.c
index aeb9ffda3..7ff554280 100644
--- a/src/testing/testing_api_cmd_block_until_external_trigger.c
+++ b/src/testing/testing_api_cmd_block_until_external_trigger.c
@@ -26,6 +26,7 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 
 /**
  * Generic logging shortcut
diff --git a/src/testing/testing_api_cmd_finish.c 
b/src/testing/testing_api_cmd_finish.c
index 3ac0871a5..47199d3d6 100644
--- a/src/testing/testing_api_cmd_finish.c
+++ b/src/testing/testing_api_cmd_finish.c
@@ -25,6 +25,8 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
+
 
 /**
  * Struct to use for command-specific context information closure of a command 
waiting
diff --git a/src/testing/testing_api_cmd_hello_world.c 
b/src/testing/testing_api_cmd_hello_world.c
deleted file mode 100644
index 73dcd6dff..000000000
--- a/src/testing/testing_api_cmd_hello_world.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
-      This file is part of GNUnet
-      Copyright (C) 2021 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 <http://www.gnu.org/licenses/>.
-
-     SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file testing/testing_api_cmd_hello_world.c
- * @brief implementation of a hello world command.
- * @author t3sserakt
- */
-#include "platform.h"
-#include "gnunet_testing_ng_lib.h"
-
-struct HelloWorldState
-{
-  char *message;
-  const char *birthLabel;
-};
-
-
-/**
- *
- *
- * @param cls closure
- */
-static void
-hello_world_cleanup (void *cls)
-{
-  struct HelloWorldState *hs = cls;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-              "Cleaning up message %s\n",
-              hs->message);
-  GNUNET_free (hs);
-}
-
-
-/**
- *
- *
- * @param cls closure.
- * @param[out] ret result
- * @param trait name of the trait.
- * @param index index number of the object to offer.
- * @return #GNUNET_OK on success.
- */
-static enum GNUNET_GenericReturnValue
-hello_world_traits (void *cls,
-                    const void **ret,
-                    const char *trait,
-                    unsigned int index)
-{
-  return GNUNET_NO;
-}
-
-
-/**
-* Run the "hello world" CMD.
-*
-* @param cls closure.
-* @param is interpreter state.
-*/
-static void
-hello_world_run (void *cls,
-                 struct GNUNET_TESTING_Interpreter *is)
-{
-  struct HelloWorldState *hs = cls;
-  const struct GNUNET_TESTING_Command *birth_cmd;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-              "%s\n",
-              hs->message);
-  birth_cmd = GNUNET_TESTING_interpreter_lookup_command (is,
-                                                         hs->birthLabel);
-  GNUNET_TESTING_get_trait_what_am_i (birth_cmd,
-                                      &hs->message);
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-              "Now I am a %s\n",
-              hs->message);
-}
-
-
-/**
- * Create command.
- *
- * @param label name for command.
- * @param message initial message.
- * @return command.
- */
-struct GNUNET_TESTING_Command
-GNUNET_TESTING_cmd_hello_world (const char *label,
-                                const char *birthLabel,
-                                char *message)
-{
-  struct HelloWorldState *hs;
-
-  hs = GNUNET_new (struct HelloWorldState);
-  hs->message = "Hello World, I was nobody!";
-  hs->birthLabel = birthLabel;
-  {
-    struct GNUNET_TESTING_Command cmd = {
-      .cls = hs,
-      .label = label,
-      .run = &hello_world_run,
-      .cleanup = &hello_world_cleanup,
-      .traits = &hello_world_traits
-    };
-
-    return cmd;
-  }
-}
diff --git a/src/testing/testing_api_cmd_hello_world_birth.c 
b/src/testing/testing_api_cmd_hello_world_birth.c
deleted file mode 100644
index 8415b99f0..000000000
--- a/src/testing/testing_api_cmd_hello_world_birth.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
-      This file is part of GNUnet
-      Copyright (C) 2021 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 <http://www.gnu.org/licenses/>.
-
-     SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file testing/testing_api_cmd_hello_world.c
- * @brief implementation of a hello world command.
- * @author t3sserakt
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_testing_ng_lib.h"
-
-struct HelloWorldBirthState
-{
-  struct GNUNET_TIME_Absolute *date;
-  char *what_am_i;
-};
-
-/**
-*
-*
-* @param cls closure
-* @param cmd current CMD being cleaned up.
-*/
-static void
-hello_world_birth_cleanup (void *cls)
-{
-  struct HelloWorldBirthState *hbs = cls;
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-              "Finished birth of %s\n",
-              hbs->what_am_i);
-}
-
-
-/**
-*
-*
-* @param cls closure.
-* @param[out] ret result
-* @param trait name of the trait.
-* @param index index number of the object to offer.
-* @return #GNUNET_OK on success.
-*/
-static int
-hello_world_birth_traits (void *cls,
-                          const void **ret,
-                          const char *trait,
-                          unsigned int index)
-{
-  struct HelloWorldBirthState *hbs = cls;
-  const char *what_am_i = hbs->what_am_i;
-
-  struct GNUNET_TESTING_Trait traits[] = {
-    {
-      .index = 0,
-      .trait_name = "what_am_i",
-      .ptr = (const void *) what_am_i,
-    },
-    GNUNET_TESTING_trait_end ()
-  };
-
-  return GNUNET_TESTING_get_trait (traits,
-                                   ret,
-                                   trait,
-                                   index);
-}
-
-
-/**
-* Run the "hello world" CMD.
-*
-* @param cls closure.
-* @param cmd CMD being run.
-* @param is interpreter state.
-*/
-static void
-hello_world_birth_run (void *cls,
-                       struct GNUNET_TESTING_Interpreter *is)
-{
-  struct HelloWorldBirthState *hbs = cls;
-  struct GNUNET_TIME_Relative relative;
-
-  relative = GNUNET_TIME_absolute_get_difference (*hbs->date,
-                                                  GNUNET_TIME_absolute_get ());
-
-  if (0 == relative.rel_value_us % 10)
-  {
-    hbs->what_am_i = "creature!";
-  }
-  else if (0 == relative.rel_value_us % 2)
-  {
-    hbs->what_am_i = "girl!";
-  }
-  else
-  {
-    hbs->what_am_i = "boy!";
-  }
-}
-
-
-/**
- * Offer data from trait
- *
- * @param cmd command to extract the message from.
- * @param pt pointer to message.
- * @return #GNUNET_OK on success.
- */
-int
-GNUNET_TESTING_get_trait_what_am_i (const struct GNUNET_TESTING_Command *cmd,
-                                    char **what_am_i)
-{
-  return cmd->traits (cmd->cls,
-                      (const void **) what_am_i,
-                      "what_am_i",
-                      (unsigned int) 0);
-}
-
-
-/**
- * Create command.
- *
- * @param label name for command.
- * @param now when the command was started.
- * @return command.
- */
-struct GNUNET_TESTING_Command
-GNUNET_TESTING_cmd_hello_world_birth (const char *label,
-                                      struct GNUNET_TIME_Absolute *now)
-{
-  struct HelloWorldBirthState *hbs;
-
-  hbs = GNUNET_new (struct HelloWorldBirthState);
-  hbs->date = now;
-
-  struct GNUNET_TESTING_Command cmd = {
-    .cls = hbs,
-    .label = label,
-    .run = &hello_world_birth_run,
-    .cleanup = &hello_world_birth_cleanup,
-    .traits = &hello_world_birth_traits
-  };
-
-  return cmd;
-}
diff --git a/src/testing/testing_api_cmd_local_test_finished.c 
b/src/testing/testing_api_cmd_local_test_finished.c
index 8f8a8230c..709c6b62f 100644
--- a/src/testing/testing_api_cmd_local_test_finished.c
+++ b/src/testing/testing_api_cmd_local_test_finished.c
@@ -26,6 +26,7 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "testing_cmds.h"
 
 /**
diff --git a/src/testing/testing_api_cmd_local_test_prepared.c 
b/src/testing/testing_api_cmd_local_test_prepared.c
index 2554d6fec..9dc7dfa9a 100644
--- a/src/testing/testing_api_cmd_local_test_prepared.c
+++ b/src/testing/testing_api_cmd_local_test_prepared.c
@@ -26,6 +26,7 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "testing_cmds.h"
 
 /**
diff --git a/src/testing/testing_api_cmd_netjail_start.c 
b/src/testing/testing_api_cmd_netjail_start.c
index 35fb90f3c..2ff70c33e 100644
--- a/src/testing/testing_api_cmd_netjail_start.c
+++ b/src/testing/testing_api_cmd_netjail_start.c
@@ -26,8 +26,11 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 
-#define NETJAIL_START_SCRIPT "./../testing/netjail_start.sh"
+#define NETJAIL_START_SCRIPT "netjail_start.sh"
+
+#define LOG(kind, ...) GNUNET_log (kind, __VA_ARGS__)
 
 /**
  * Struct to hold information for callbacks.
@@ -53,6 +56,10 @@ struct NetJailState
    */
   char *topology_config;
 
+  /**
+   * Shall we read the topology from file, or from a string.
+   */
+  unsigned int *read_file;
 };
 
 
@@ -70,11 +77,15 @@ netjail_start_cleanup (void *cls)
 
   if (NULL != ns->cwh)
   {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Cancel child\n");
     GNUNET_wait_child_cancel (ns->cwh);
     ns->cwh = NULL;
   }
   if (NULL != ns->start_proc)
   {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Kill process\n");
     GNUNET_assert (0 ==
                    GNUNET_OS_process_kill (ns->start_proc,
                                            SIGKILL));
@@ -100,6 +111,7 @@ child_completed_callback (void *cls,
 
   GNUNET_OS_process_destroy (ns->start_proc);
   ns->start_proc = NULL;
+  ns->cwh = NULL;
   if (0 == exit_code)
   {
     GNUNET_TESTING_async_finish (&ns->ac);
@@ -127,20 +139,28 @@ netjail_start_run (void *cls,
   struct NetJailState *ns = cls;
   char pid[15];
   enum GNUNET_GenericReturnValue helper_check;
+  char *data_dir;
+  char *script_name;
+  char *read_file;
+
+  data_dir = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_DATADIR);
+  GNUNET_asprintf (&script_name, "%s%s", data_dir, NETJAIL_START_SCRIPT);
+  GNUNET_asprintf (&read_file, "%u", *(ns->read_file));
 
-  // FIXME: NETJAIL_START_SCRIPT like this is bad,
-  // use location from share/gnunet/ of installed
-  // binary in case libgnunettesting is used as a lib!
   helper_check = GNUNET_OS_check_helper_binary (
-    NETJAIL_START_SCRIPT,
+    script_name,
     GNUNET_YES,
     NULL);
 
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "script_name %s\n",
+       script_name);
+
   if (GNUNET_NO == helper_check)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 "No SUID for %s!\n",
-                NETJAIL_START_SCRIPT);
+                script_name);
     GNUNET_TESTING_interpreter_fail (is);
     return;
   }
@@ -148,7 +168,7 @@ netjail_start_run (void *cls,
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 "%s not found!\n",
-                NETJAIL_START_SCRIPT);
+                script_name);
     GNUNET_TESTING_interpreter_fail (is);
     return;
   }
@@ -159,9 +179,10 @@ netjail_start_run (void *cls,
                    getpid ());
   {
     char *const script_argv[] = {
-      NETJAIL_START_SCRIPT,
+      script_name,
       ns->topology_config,
       pid,
+      read_file,
       NULL
     };
 
@@ -170,7 +191,7 @@ netjail_start_run (void *cls,
                                      NULL,
                                      NULL,
                                      NULL,
-                                     NETJAIL_START_SCRIPT,
+                                     script_name,
                                      script_argv);
   }
   ns->cwh = GNUNET_wait_child (ns->start_proc,
@@ -189,12 +210,14 @@ netjail_start_run (void *cls,
  */
 struct GNUNET_TESTING_Command
 GNUNET_TESTING_cmd_netjail_start (const char *label,
-                                  char *topology_config)
+                                  char *topology_config,
+                                  unsigned int *read_file)
 {
   struct NetJailState *ns;
 
   ns = GNUNET_new (struct NetJailState);
   ns->topology_config = topology_config;
+  ns->read_file = read_file;
   {
     struct GNUNET_TESTING_Command cmd = {
       .cls = ns,
diff --git a/src/testing/testing_api_cmd_netjail_start_testsystem.c 
b/src/testing/testing_api_cmd_netjail_start_testsystem.c
index c3598d174..89c193de5 100644
--- a/src/testing/testing_api_cmd_netjail_start_testsystem.c
+++ b/src/testing/testing_api_cmd_netjail_start_testsystem.c
@@ -25,9 +25,10 @@
  */
 #include "platform.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "testing_cmds.h"
 
-#define NETJAIL_EXEC_SCRIPT "./../testing/netjail_exec.sh"
+#define NETJAIL_EXEC_SCRIPT "netjail_exec.sh"
 
 /**
  * Generic logging shortcut
@@ -82,18 +83,6 @@ struct NetJailState
    */
   struct GNUNET_TESTING_NetjailTopology *topology;
 
-  /**
-   * Head of the DLL which stores messages received by the helper.
-   *
-   */
-  struct HelperMessage *hp_messages_head;
-
-  /**
-   * Tail of the DLL which stores messages received by the helper.
-   *
-   */
-  struct HelperMessage *hp_messages_tail;
-
   /**
    * Array with handles of helper processes.
    */
@@ -123,27 +112,6 @@ struct NetJailState
    */
   unsigned int known;
 
-  /**
-   * The send handle for the helper
-   */
-  // struct GNUNET_HELPER_SendHandle **shandle;
-
-  /**
-   * Size of the array NetJailState#shandle.
-   *
-   */
-  // unsigned int n_shandle;
-
-  /**
-   * The messages send to the helper.
-   */
-  struct GNUNET_MessageHeader **msg;
-
-  /**
-   * Size of the array NetJailState#msg.
-   *
-   */
-  unsigned int n_msg;
 
   /**
    * Number of test environments started.
@@ -176,16 +144,14 @@ struct NetJailState
   char *plugin_name;
 
   /**
-   * HEAD of the DLL containing TestingSystemCount.
-   *
+   * Shall we read the topology from file, or from a string.
    */
-  struct TestingSystemCount *tbcs_head;
+  unsigned int *read_file;
 
   /**
-   * TAIL of the DLL containing TestingSystemCount.
-   *
+   * String with topology data or name of topology file.
    */
-  struct TestingSystemCount *tbcs_tail;
+  char *topology_data;
 };
 
 /**
@@ -207,13 +173,7 @@ struct TestingSystemCount
   /**
    * The send handle for the helper
    */
-  struct GNUNET_HELPER_SendHandle *shandle;// **shandle;
-
-  /**
-   * Size of the array NetJailState#shandle.
-   *
-   */
-  // unsigned int n_shandle;
+  struct GNUNET_HELPER_SendHandle *shandle;
 
   /**
    * The number of the test environment.
@@ -226,6 +186,11 @@ struct TestingSystemCount
    *
    */
   struct NetJailState *ns;
+
+  /**
+   * The messages send to the helper.
+   */
+  struct GNUNET_MessageHeader *msg;
 };
 
 /**
@@ -237,24 +202,7 @@ static void
 netjail_exec_cleanup (void *cls)
 {
   struct NetJailState *ns = cls;
-  struct HelperMessage *message_pos;
-  struct  TestingSystemCount *tbc_pos;
 
-  while (NULL != (message_pos = ns->hp_messages_head))
-  {
-    GNUNET_CONTAINER_DLL_remove (ns->hp_messages_head,
-                                 ns->hp_messages_tail,
-                                 message_pos);
-    GNUNET_free (message_pos);
-  }
-  while (NULL != (tbc_pos = ns->tbcs_head))
-  {
-    GNUNET_CONTAINER_DLL_remove (ns->tbcs_head,
-                                 ns->tbcs_tail,
-                                 tbc_pos);
-    GNUNET_free (tbc_pos);
-  }
-  GNUNET_TESTING_free_topology (ns->topology);
   GNUNET_free (ns);
 }
 
@@ -271,7 +219,6 @@ netjail_exec_traits (void *cls,
 {
   struct NetJailState *ns = cls;
   struct GNUNET_HELPER_Handle **helper = ns->helper;
-  struct HelperMessage *hp_messages_head = ns->hp_messages_head;
 
 
   struct GNUNET_TESTING_Trait traits[] = {
@@ -280,11 +227,6 @@ netjail_exec_traits (void *cls,
       .trait_name = "helper_handles",
       .ptr = (const void *) helper,
     },
-    {
-      .index = 1,
-      .trait_name = "hp_msgs_head",
-      .ptr = (const void *) hp_messages_head,
-    },
     GNUNET_TESTING_trait_end ()
   };
 
@@ -327,12 +269,12 @@ static void
 clear_msg (void *cls, int result)
 {
   struct TestingSystemCount *tbc = cls;
-  struct NetJailState *ns = tbc->ns;
 
-  GNUNET_assert (NULL != tbc->shandle);// [tbc->count - 1]);
-  tbc->shandle = NULL;// [tbc->count - 1] = NULL;
-  GNUNET_free (ns->msg[tbc->count - 1]);
-  ns->msg[tbc->count - 1] = NULL;
+  GNUNET_assert (NULL != tbc->shandle);
+  GNUNET_free (tbc->shandle);
+  tbc->shandle = NULL;
+  GNUNET_free (tbc->msg);
+  tbc->msg = NULL;
 }
 
 
@@ -361,7 +303,7 @@ send_message_to_locals (
 
   helper = ns->helper[tbc->count - 1];// - total_number];
 
-  GNUNET_array_append (ns->msg, ns->n_msg, header);
+
 
   struct GNUNET_HELPER_SendHandle *sh = GNUNET_HELPER_send (
     helper,
@@ -427,7 +369,7 @@ static int
 helper_mst (void *cls, const struct GNUNET_MessageHeader *message)
 {
   // struct TestingSystemCount *tbc = cls;
-  struct NetJailState *ns = cls;// tbc->ns;
+  struct NetJailState *ns = cls;
   struct HelperMessage *hp_msg;
   unsigned int total_number = ns->local_m * ns->global_n + ns->known;
   // uint16_t message_type = ntohs (message->type);
@@ -543,11 +485,8 @@ helper_mst (void *cls, const struct GNUNET_MessageHeader 
*message)
   }
   else
   {
-    hp_msg = GNUNET_new (struct HelperMessage);
-    hp_msg->bytes_msg = message->size;
-    memcpy (&hp_msg[1], message, message->size);
-    GNUNET_CONTAINER_DLL_insert (ns->hp_messages_head, ns->hp_messages_tail,
-                                 hp_msg);
+    // We received a message we can not handle.
+    GNUNET_assert (0);
   }
 
 
@@ -629,6 +568,7 @@ start_helper (struct NetJailState *ns,
   char *known_char;
   char *node_id;
   char *plugin;
+  char *read_file;
   pid_t pid;
   unsigned int script_num;
   struct GNUNET_ShortHashCode *hkey;
@@ -636,6 +576,9 @@ start_helper (struct NetJailState *ns,
   struct GNUNET_TESTING_NetjailTopology *topology = ns->topology;
   struct GNUNET_TESTING_NetjailNode *node;
   struct GNUNET_TESTING_NetjailNamespace *namespace;
+  char *data_dir;
+  char *script_name;
+  char *topology_data;
 
 
   if (0 == n)
@@ -652,47 +595,31 @@ start_helper (struct NetJailState *ns,
   GNUNET_asprintf (&node_id, "%06x-%08x\n",
                    pid,
                    script_num);
+  // GNUNET_asprintf (&topology_data, "'%s'", ns->topology_data);
+  GNUNET_asprintf (&read_file, "%u", *(ns->read_file));
 
-
-  char *const script_argv[] = {NETJAIL_EXEC_SCRIPT,
-                               m_char,
-                               n_char,
-                               GNUNET_OS_get_libexec_binary_path (
-                                 HELPER_CMDS_BINARY),
-                               global_n_char,
-                               local_m_char,
-                               node_id,
-                               NULL};
-
+  data_dir = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_DATADIR);
+  GNUNET_asprintf (&script_name, "%s%s", data_dir, NETJAIL_EXEC_SCRIPT);
   unsigned int helper_check = GNUNET_OS_check_helper_binary (
-    NETJAIL_EXEC_SCRIPT,
+    script_name,
     GNUNET_YES,
     NULL);
 
   tbc = GNUNET_new (struct TestingSystemCount);
   tbc->ns = ns;
-  if (0 == n)
-    tbc->count = m;
-  else
-    tbc->count = (n - 1) * ns->local_m + m + ns->known;
-
-  GNUNET_CONTAINER_DLL_insert (ns->tbcs_head,
-                               ns->tbcs_tail,
-                               tbc);
-
 
   if (GNUNET_NO == helper_check)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 "No SUID for %s!\n",
-                NETJAIL_EXEC_SCRIPT);
+                script_name);
     GNUNET_TESTING_interpreter_fail (ns->is);
   }
   else if (GNUNET_NO == helper_check)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 "%s not found!\n",
-                NETJAIL_EXEC_SCRIPT);
+                script_name);
     GNUNET_TESTING_interpreter_fail (ns->is);
   }
 
@@ -705,17 +632,29 @@ start_helper (struct NetJailState *ns,
        ns->local_m,
        ns->global_n,
        ns->known);
+  {
+    char *const script_argv[] = {script_name,
+                                 m_char,
+                                 n_char,
+                                 GNUNET_OS_get_libexec_binary_path (
+                                   HELPER_CMDS_BINARY),
+                                 global_n_char,
+                                 local_m_char,
+                                 node_id,
+                                 read_file,
+                                 ns->topology_data,
+                                 NULL};
+    helper = GNUNET_HELPER_start (
+      GNUNET_YES,
+      script_name,
+      script_argv,
+      &helper_mst,
+      &exp_cb,
+      ns);
+    GNUNET_array_append (ns->helper, ns->n_helper, helper);
+  }
 
-  GNUNET_array_append (ns->helper, ns->n_helper, GNUNET_HELPER_start (
-                         GNUNET_YES,
-                         NETJAIL_EXEC_SCRIPT,
-                         script_argv,
-                         &helper_mst,
-                         &exp_cb,
-                         ns));
-
-  helper = ns->helper[tbc->count - 1];
-
+  tbc->count = ns->n_helper;
   hkey = GNUNET_new (struct GNUNET_ShortHashCode);
 
   plugin = topology->plugin;
@@ -767,8 +706,6 @@ start_helper (struct NetJailState *ns,
 
   msg = create_helper_init_msg_ (plugin);
 
-  GNUNET_array_append (ns->msg, ns->n_msg, &msg->header);
-
   // GNUNET_array_append (tbc->shandle, tbc->n_shandle,
   tbc->shandle = GNUNET_HELPER_send (
     helper,
@@ -825,24 +762,28 @@ netjail_exec_run (void *cls,
  * Create command.
  *
  * @param label Name for the command.
- * @param topology_config Configuration file for the test topology.
+ * @param topology The complete topology information.
+ * @param read_file Flag indicating if the the name of the topology file is 
send to the helper, or a string with the topology data.
+ * @param topology_data If read_file is GNUNET_NO, topology_data holds the 
string with the topology.
  * @return command.
  */
 struct GNUNET_TESTING_Command
-GNUNET_TESTING_cmd_netjail_start_testing_system (const char *label,
-                                                 const char *topology_config)
+GNUNET_TESTING_cmd_netjail_start_testing_system (
+  const char *label,
+  struct GNUNET_TESTING_NetjailTopology *topology,
+  unsigned int *read_file,
+  char *topology_data)
 {
   struct NetJailState *ns;
 
-  struct GNUNET_TESTING_NetjailTopology *topology =
-    GNUNET_TESTING_get_topo_from_file (topology_config);
-
   ns = GNUNET_new (struct NetJailState);
   ns->local_m = topology->nodes_m;
   ns->global_n = topology->namespaces_n;
   ns->known = topology->nodes_x;
   ns->plugin_name = topology->plugin;
   ns->topology = topology;
+  ns->read_file = read_file;
+  ns->topology_data = topology_data;
 
   struct GNUNET_TESTING_Command cmd = {
     .cls = ns,
diff --git a/src/testing/testing_api_cmd_netjail_stop.c 
b/src/testing/testing_api_cmd_netjail_stop.c
index 5033272a3..e3bf7da62 100644
--- a/src/testing/testing_api_cmd_netjail_stop.c
+++ b/src/testing/testing_api_cmd_netjail_stop.c
@@ -26,12 +26,10 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 
 
-#define NETJAIL_STOP_SCRIPT "./../testing/netjail_stop.sh"
-
-// Child Wait handle
-static struct GNUNET_ChildWaitHandle *cwh;
+#define NETJAIL_STOP_SCRIPT "netjail_stop.sh"
 
 /**
  * Struct to hold information for callbacks.
@@ -44,6 +42,9 @@ struct NetJailState
    */
   struct GNUNET_TESTING_AsyncContext ac;
 
+  // Child Wait handle
+  struct GNUNET_ChildWaitHandle *cwh;
+
   /**
    * Configuration file for the test topology.
    */
@@ -54,6 +55,11 @@ struct NetJailState
    */
   struct GNUNET_OS_Process *stop_proc;
 
+  /**
+   * Shall we read the topology from file, or from a string.
+   */
+  unsigned int *read_file;
+
 };
 
 
@@ -66,10 +72,10 @@ netjail_stop_cleanup (void *cls)
 {
   struct NetJailState *ns = cls;
 
-  if (NULL != cwh)
+  if (NULL != ns->cwh)
   {
-    GNUNET_wait_child_cancel (cwh);
-    cwh = NULL;
+    GNUNET_wait_child_cancel (ns->cwh);
+    ns->cwh = NULL;
   }
   if (NULL != ns->stop_proc)
   {
@@ -95,7 +101,7 @@ child_completed_callback (void *cls,
 {
   struct NetJailState *ns = cls;
 
-  cwh = NULL; // WTF? globals!?!?!
+  ns->cwh = NULL;
   GNUNET_OS_process_destroy (ns->stop_proc);
   ns->stop_proc = NULL;
   if (0 == exit_code)
@@ -121,16 +127,16 @@ netjail_stop_run (void *cls,
 {
   struct NetJailState *ns = cls;
   char *pid;
+  char *data_dir;
+  char *script_name;
+  char *read_file;
 
-  GNUNET_asprintf (&pid,
-                   "%u",
-                   getpid ());
-  char *const script_argv[] = {NETJAIL_STOP_SCRIPT,
-                               ns->topology_config,
-                               pid,
-                               NULL};
+
+  data_dir = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_DATADIR);
+  GNUNET_asprintf (&script_name, "%s%s", data_dir, NETJAIL_STOP_SCRIPT);
+  GNUNET_asprintf (&read_file, "%u", *(ns->read_file));
   unsigned int helper_check = GNUNET_OS_check_helper_binary (
-    NETJAIL_STOP_SCRIPT,
+    script_name,
     GNUNET_YES,
     NULL);
 
@@ -138,39 +144,50 @@ netjail_stop_run (void *cls,
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 "No SUID for %s!\n",
-                NETJAIL_STOP_SCRIPT);
+                script_name);
     GNUNET_TESTING_interpreter_fail (is);
   }
   else if (GNUNET_NO == helper_check)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 "%s not found!\n",
-                NETJAIL_STOP_SCRIPT);
+                script_name);
     GNUNET_TESTING_interpreter_fail (is);
   }
 
-  ns->stop_proc = GNUNET_OS_start_process_vap (GNUNET_OS_INHERIT_STD_ERR,
-                                               NULL,
-                                               NULL,
-                                               NULL,
-                                               NETJAIL_STOP_SCRIPT,
-                                               script_argv);
-
-  cwh = GNUNET_wait_child (ns->stop_proc,
-                           &child_completed_callback,
-                           ns);
-  GNUNET_break (NULL != cwh);
+  GNUNET_asprintf (&pid,
+                   "%u",
+                   getpid ());
+  {
+    char *const script_argv[] = {script_name,
+                                 ns->topology_config,
+                                 pid,
+                                 read_file,
+                                 NULL};
+    ns->stop_proc = GNUNET_OS_start_process_vap (GNUNET_OS_INHERIT_STD_ERR,
+                                                 NULL,
+                                                 NULL,
+                                                 NULL,
+                                                 script_name,
+                                                 script_argv);
+  }
+  ns->cwh = GNUNET_wait_child (ns->stop_proc,
+                               &child_completed_callback,
+                               ns);
+  GNUNET_break (NULL != ns->cwh);
 }
 
 
 struct GNUNET_TESTING_Command
 GNUNET_TESTING_cmd_netjail_stop (const char *label,
-                                 char *topology_config)
+                                 char *topology_config,
+                                 unsigned int *read_file)
 {
   struct NetJailState *ns;
 
   ns = GNUNET_new (struct NetJailState);
   ns->topology_config = topology_config;
+  ns->read_file = read_file;
   {
     struct GNUNET_TESTING_Command cmd = {
       .cls = ns,
diff --git a/src/testing/testing_api_cmd_netjail_stop_testsystem.c 
b/src/testing/testing_api_cmd_netjail_stop_testsystem.c
index e37e955be..4b52878c4 100644
--- a/src/testing/testing_api_cmd_netjail_stop_testsystem.c
+++ b/src/testing/testing_api_cmd_netjail_stop_testsystem.c
@@ -25,6 +25,7 @@
  */
 #include "platform.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "testing_cmds.h"
 
 
@@ -70,7 +71,6 @@ stop_testing_system_cleanup (void *cls)
 {
   struct StopHelperState *shs = cls;
 
-  GNUNET_TESTING_free_topology (shs->topology);
   GNUNET_free (shs);
 }
 
@@ -124,19 +124,17 @@ stop_testing_system_run (void *cls,
  *
  * @param label name for command.
  * @param helper_start_label label of the cmd to start the test system.
- * @param topology_config Configuration file for the test topology.
+ * @param topology The complete topology information.
  * @return command.
  */
 struct GNUNET_TESTING_Command
-GNUNET_TESTING_cmd_stop_testing_system (const char *label,
-                                        const char *helper_start_label,
-                                        const char *topology_config)
+GNUNET_TESTING_cmd_stop_testing_system (
+  const char *label,
+  const char *helper_start_label,
+  struct GNUNET_TESTING_NetjailTopology *topology)
 {
   struct StopHelperState *shs;
 
-  struct GNUNET_TESTING_NetjailTopology *topology =
-    GNUNET_TESTING_get_topo_from_file (topology_config);
-
   shs = GNUNET_new (struct StopHelperState);
   shs->helper_start_label = helper_start_label;
   shs->local_m = topology->nodes_m;
diff --git a/src/testing/testing_api_cmd_send_peer_ready.c 
b/src/testing/testing_api_cmd_send_peer_ready.c
index 8eef1d8f1..5bbabce51 100644
--- a/src/testing/testing_api_cmd_send_peer_ready.c
+++ b/src/testing/testing_api_cmd_send_peer_ready.c
@@ -26,6 +26,7 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "testing_cmds.h"
 
 
diff --git a/src/testing/testing_api_cmd_system_create.c 
b/src/testing/testing_api_cmd_system_create.c
index 820adf1bd..275132684 100644
--- a/src/testing/testing_api_cmd_system_create.c
+++ b/src/testing/testing_api_cmd_system_create.c
@@ -26,6 +26,7 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "gnunet_testing_lib.h"
 
 /**
diff --git a/src/testing/testing_api_cmd_system_destroy.c 
b/src/testing/testing_api_cmd_system_destroy.c
index 338123d91..cdfc65d53 100644
--- a/src/testing/testing_api_cmd_system_destroy.c
+++ b/src/testing/testing_api_cmd_system_destroy.c
@@ -26,6 +26,7 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "gnunet_testing_lib.h"
 
 
diff --git a/src/transport/Makefile.am b/src/transport/Makefile.am
index d281c4ffb..5fe8229e7 100644
--- a/src/transport/Makefile.am
+++ b/src/transport/Makefile.am
@@ -738,7 +738,9 @@ endif
 endif
 
 check_SCRIPTS= \
+  test_transport_simple_send_string.sh \
   test_transport_simple_send.sh \
+  test_transport_simple_send_broadcast.sh \
   test_transport_udp_backchannel.sh
 
 test_transport_start_with_config_SOURCES = \
diff --git a/src/transport/gnunet-communicator-udp.c 
b/src/transport/gnunet-communicator-udp.c
index 659fd7d26..b7a3b4082 100644
--- a/src/transport/gnunet-communicator-udp.c
+++ b/src/transport/gnunet-communicator-udp.c
@@ -2262,6 +2262,7 @@ static void
 sock_read (void *cls)
 {
   struct sockaddr_storage sa;
+  struct sockaddr_in *addr_verify;
   socklen_t salen = sizeof(sa);
   char buf[UINT16_MAX];
   ssize_t rcvd;
@@ -2341,12 +2342,22 @@ sock_read (void *cls)
   {
     const struct UDPBroadcast *ub;
     struct UdpBroadcastSignature uhs;
+    struct GNUNET_PeerIdentity sender;
 
+    addr_verify = GNUNET_memdup (&sa, salen);
+    addr_verify->sin_port = 0;
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "received UDPBroadcast from %s\n",
+                GNUNET_a2s ((const struct sockaddr *) addr_verify, salen));
     ub = (const struct UDPBroadcast *) buf;
     uhs.purpose.purpose = htonl (GNUNET_SIGNATURE_COMMUNICATOR_UDP_BROADCAST);
     uhs.purpose.size = htonl (sizeof(uhs));
     uhs.sender = ub->sender;
-    GNUNET_CRYPTO_hash (&sa, salen, &uhs.h_address);
+    sender = ub->sender;
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "checking UDPBroadcastSignature for %s\n",
+                GNUNET_i2s (&sender));
+    GNUNET_CRYPTO_hash ((struct sockaddr *) addr_verify, salen, 
&uhs.h_address);
     if (GNUNET_OK ==
         GNUNET_CRYPTO_eddsa_verify 
(GNUNET_SIGNATURE_COMMUNICATOR_UDP_BROADCAST,
                                     &uhs,
@@ -2362,10 +2373,23 @@ sock_read (void *cls)
       /* use our own mechanism to determine network type */
       nt =
         GNUNET_NT_scanner_get_type (is, (const struct sockaddr *) &sa, salen);
-      GNUNET_TRANSPORT_application_validate (ah, &ub->sender, nt, addr_s);
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "validating address %s received from UDPBroadcast\n",
+                  GNUNET_i2s (&sender));
+      GNUNET_TRANSPORT_application_validate (ah, &sender, nt, addr_s);
       GNUNET_free (addr_s);
       return;
     }
+    else
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "VerifyingPeer %s is verifying UDPBroadcast\n",
+                  GNUNET_i2s (&my_identity));
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "Verifying UDPBroadcast from %s failed\n",
+                  GNUNET_i2s (&ub->sender));
+    }
+    GNUNET_free (addr_verify);
     /* continue with KX, mostly for statistics... */
   }
 
@@ -3477,7 +3501,7 @@ ifc_broadcast (void *cls)
   delay.rel_value_us =
     GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, delay.rel_value_us);
   bi->broadcast_task =
-    GNUNET_SCHEDULER_add_delayed (INTERFACE_SCAN_FREQUENCY, &ifc_broadcast, 
bi);
+    GNUNET_SCHEDULER_add_delayed (delay, &ifc_broadcast, bi);
 
   switch (bi->sa->sa_family)
   {
@@ -3494,6 +3518,12 @@ ifc_broadcast (void *cls)
                                             sizeof(int)))
         GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
                              "setsockopt");
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "creating UDPBroadcast from %s\n",
+                  GNUNET_i2s (&(bi->bcm.sender)));
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "sending UDPBroadcast to add %s\n",
+                  GNUNET_a2s (bi->ba, bi->salen));
       sent = GNUNET_NETWORK_socket_sendto (udp_sock,
                                            &bi->bcm,
                                            sizeof(bi->bcm),
@@ -3521,6 +3551,8 @@ ifc_broadcast (void *cls)
       dst.sin6_addr = bi->mcreq.ipv6mr_multiaddr;
       dst.sin6_scope_id = ((struct sockaddr_in6 *) bi->ba)->sin6_scope_id;
 
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "sending UDPBroadcast\n");
       sent = GNUNET_NETWORK_socket_sendto (udp_sock,
                                            &bi->bcm,
                                            sizeof(bi->bcm),
@@ -3608,6 +3640,9 @@ iface_proc (void *cls,
   ubs.purpose.purpose = htonl (GNUNET_SIGNATURE_COMMUNICATOR_UDP_BROADCAST);
   ubs.purpose.size = htonl (sizeof(ubs));
   ubs.sender = my_identity;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "creating UDPBroadcastSignature for %s\n",
+              GNUNET_a2s (addr, addrlen));
   GNUNET_CRYPTO_hash (addr, addrlen, &ubs.h_address);
   GNUNET_CRYPTO_eddsa_sign (my_private_key,
                             &ubs,
diff --git a/src/transport/gnunet-service-tng.c 
b/src/transport/gnunet-service-tng.c
index a90bef3b5..84199a75f 100644
--- a/src/transport/gnunet-service-tng.c
+++ b/src/transport/gnunet-service-tng.c
@@ -4738,15 +4738,17 @@ send_dv_to_neighbour (void *cls,
  * @return expected RTT for transmission, #GNUNET_TIME_UNIT_FOREVER_REL if 
sending failed
  */
 static struct GNUNET_TIME_Relative
-route_control_message_without_fc (const struct GNUNET_PeerIdentity *target,
+route_control_message_without_fc (struct VirtualLink *vl,
+// route_control_message_without_fc (const struct GNUNET_PeerIdentity *target,
                                   const struct GNUNET_MessageHeader *hdr,
                                   enum RouteMessageOptions options)
 {
-  struct VirtualLink *vl;
+  // struct VirtualLink *vl;
   struct Neighbour *n;
   struct DistanceVector *dv;
   struct GNUNET_TIME_Relative rtt1;
   struct GNUNET_TIME_Relative rtt2;
+  const struct GNUNET_PeerIdentity *target = &vl->target;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Trying to route message of type %u to %s without fc\n",
@@ -4754,7 +4756,7 @@ route_control_message_without_fc (const struct 
GNUNET_PeerIdentity *target,
               GNUNET_i2s (target));
 
   // TODO Do this elsewhere. vl should be given as parameter to method.
-  vl = lookup_virtual_link (target);
+  // vl = lookup_virtual_link (target);
   GNUNET_assert (NULL != vl);
   if (NULL == vl)
     return GNUNET_TIME_UNIT_FOREVER_REL;
@@ -4892,7 +4894,7 @@ consider_sending_fc (void *cls)
   fc.outbound_sent = GNUNET_htonll (vl->outbound_fc_window_size_used);
   fc.outbound_window_size = GNUNET_htonll (vl->outbound_fc_window_size);
   fc.sender_time = GNUNET_TIME_absolute_hton (monotime);
-  rtt = route_control_message_without_fc (&vl->target, &fc.header, RMO_NONE);
+  rtt = route_control_message_without_fc (vl, &fc.header, RMO_NONE);
   if (GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us == rtt.rel_value_us)
   {
     rtt = GNUNET_TIME_UNIT_SECONDS;
@@ -5086,6 +5088,8 @@ handle_communicator_backchannel (
   void *cls,
   const struct GNUNET_TRANSPORT_CommunicatorBackchannel *cb)
 {
+  struct Neighbour *n;
+  struct VirtualLink *vl;
   struct TransportClient *tc = cls;
   const struct GNUNET_MessageHeader *inbox =
     (const struct GNUNET_MessageHeader *) &cb[1];
@@ -5116,7 +5120,22 @@ handle_communicator_backchannel (
                 + isize],
           is,
           strlen (is) + 1);
-  route_control_message_without_fc (&cb->pid, &be->header, RMO_DV_ALLOWED);
+  // route_control_message_without_fc (&cb->pid, &be->header, RMO_DV_ALLOWED);
+  vl = lookup_virtual_link (&cb->pid);
+  if (NULL != vl)
+  {
+    route_control_message_without_fc (vl, &be->header, RMO_DV_ALLOWED);
+  }
+  else
+  {
+    /* Use route via neighbour */
+    n = lookup_neighbour (&cb->pid);
+    if (NULL != n)
+      route_via_neighbour (
+        n,
+        &be->header,
+        RMO_NONE);
+  }
   GNUNET_SERVICE_client_continue (tc->client);
 }
 
@@ -5540,6 +5559,8 @@ destroy_ack_cummulator (void *cls)
 static void
 transmit_cummulative_ack_cb (void *cls)
 {
+  struct Neighbour *n;
+  struct VirtualLink *vl;
   struct AcknowledgementCummulator *ac = cls;
   char buf[sizeof(struct TransportReliabilityAckMessage)
            + ac->ack_counter
@@ -5566,7 +5587,28 @@ transmit_cummulative_ack_cb (void *cls)
     ap[i].ack_delay = GNUNET_TIME_relative_hton (
       GNUNET_TIME_absolute_get_duration (ac->ack_uuids[i].receive_time));
   }
-  route_control_message_without_fc (&ac->target, &ack->header, RMO_DV_ALLOWED);
+  /*route_control_message_without_fc (
+    &ac->target,
+    &ack->header,
+    RMO_DV_ALLOWED);*/
+  vl = lookup_virtual_link (&ac->target);
+  if (NULL != vl)
+  {
+    route_control_message_without_fc (
+      vl,
+      &ack->header,
+      RMO_DV_ALLOWED);
+  }
+  else
+  {
+    /* Use route via neighbour */
+    n = lookup_neighbour (&ac->target);
+    if (NULL != n)
+      route_via_neighbour (
+        n,
+        &ack->header,
+        RMO_NONE);
+  }
   ac->num_acks = 0;
   ac->task = GNUNET_SCHEDULER_add_delayed (ACK_CUMMULATOR_TIMEOUT,
                                            &destroy_ack_cummulator,
@@ -6558,6 +6600,8 @@ forward_dv_learn (const struct GNUNET_PeerIdentity 
*next_hop,
                   const struct DVPathEntryP *hops,
                   struct GNUNET_TIME_Absolute in_time)
 {
+  struct Neighbour *n;
+  struct VirtualLink *vl;
   struct DVPathEntryP *dhops;
   char buf[sizeof(struct TransportDVLearnMessage)
            + (nhops + 1) * sizeof(struct DVPathEntryP)] GNUNET_ALIGN;
@@ -6598,9 +6642,26 @@ forward_dv_learn (const struct GNUNET_PeerIdentity 
*next_hop,
                               &dhp,
                               &dhops[nhops].hop_sig);
   }
-  route_control_message_without_fc (next_hop,
+  /*route_control_message_without_fc (next_hop,
                                     &fwd->header,
-                                    RMO_UNCONFIRMED_ALLOWED);
+                                    RMO_UNCONFIRMED_ALLOWED);*/
+  vl = lookup_virtual_link (next_hop);
+  if (NULL != vl)
+  {
+    route_control_message_without_fc (vl,
+                                      &fwd->header,
+                                      RMO_UNCONFIRMED_ALLOWED);
+  }
+  else
+  {
+    /* Use route via neighbour */
+    n = lookup_neighbour (next_hop);
+    if (NULL != n)
+      route_via_neighbour (
+        n,
+        &fwd->header,
+        RMO_UNCONFIRMED_ALLOWED);
+  }
 }
 
 
@@ -7937,7 +7998,8 @@ handle_validation_challenge (
   vl = lookup_virtual_link (&sender);
   if (NULL != vl)
   {
-    route_control_message_without_fc (&cmc->im.sender,
+    // route_control_message_without_fc (&cmc->im.sender,
+    route_control_message_without_fc (vl,
                                       &tvr.header,
                                       RMO_ANYTHING_GOES | RMO_REDUNDANT);
   }
diff --git a/src/transport/test_transport_plugin_cmd_simple_send.c 
b/src/transport/test_transport_plugin_cmd_simple_send.c
index c374fc2d0..2c987e601 100644
--- a/src/transport/test_transport_plugin_cmd_simple_send.c
+++ b/src/transport/test_transport_plugin_cmd_simple_send.c
@@ -25,6 +25,7 @@
  */
 #include "platform.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_transport_application_service.h"
 #include "transport-testing2.h"
@@ -213,7 +214,9 @@ start_testcase (TESTING_CMD_HELPER_write_cb write_message, 
char *router_ip,
                 char *node_ip,
                 char *m,
                 char *n,
-                char *local_m)
+                char *local_m,
+                char *topology_data,
+                unsigned int *read_file)
 {
 
   unsigned int n_int;
@@ -221,8 +224,16 @@ start_testcase (TESTING_CMD_HELPER_write_cb write_message, 
char *router_ip,
   unsigned int local_m_int;
   unsigned int num;
   struct TestState *ts = GNUNET_new (struct TestState);
-  struct GNUNET_TESTING_NetjailTopology *topology =
-    GNUNET_TESTING_get_topo_from_file (TOPOLOGY_CONFIG);
+  struct GNUNET_TESTING_NetjailTopology *topology;
+
+  if (GNUNET_YES == *read_file)
+  {
+    LOG (GNUNET_ERROR_TYPE_DEBUG,
+         "read from file\n");
+    topology = GNUNET_TESTING_get_topo_from_file (topology_data);
+  }
+  else
+    topology = GNUNET_TESTING_get_topo_from_string (topology_data);
 
   ts->topology = topology;
 
diff --git a/src/transport/test_transport_plugin_cmd_udp_backchannel.c 
b/src/transport/test_transport_plugin_cmd_udp_backchannel.c
index f3afbec48..db320844f 100644
--- a/src/transport/test_transport_plugin_cmd_udp_backchannel.c
+++ b/src/transport/test_transport_plugin_cmd_udp_backchannel.c
@@ -25,6 +25,7 @@
  */
 #include "platform.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_transport_application_service.h"
 #include "transport-testing2.h"
@@ -207,7 +208,9 @@ start_testcase (TESTING_CMD_HELPER_write_cb write_message, 
char *router_ip,
                 char *node_ip,
                 char *m,
                 char *n,
-                char *local_m)
+                char *local_m,
+                char *topology_data,
+                unsigned int *read_file)
 {
 
   unsigned int n_int;
@@ -216,8 +219,12 @@ start_testcase (TESTING_CMD_HELPER_write_cb write_message, 
char *router_ip,
   unsigned int num;
   struct TestState *ts = GNUNET_new (struct TestState);
 
-  struct GNUNET_TESTING_NetjailTopology *topology =
-    GNUNET_TESTING_get_topo_from_file (TOPOLOGY_CONFIG);
+  struct GNUNET_TESTING_NetjailTopology *topology;
+
+  if (GNUNET_YES == *read_file)
+    topology = GNUNET_TESTING_get_topo_from_file (topology_data);
+  else
+    topology = GNUNET_TESTING_get_topo_from_string (topology_data);
 
   ts->topology = topology;
 
diff --git a/src/transport/test_transport_simple_send_string.sh 
b/src/transport/test_transport_simple_send_string.sh
new file mode 100755
index 000000000..018ea55e8
--- /dev/null
+++ b/src/transport/test_transport_simple_send_string.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+string=$(cat << EOF
+M:2
+N:1
+X:0
+T:libgnunet_test_transport_plugin_cmd_simple_send
+P:1:1|{connect:{P:1:2:tcp}}
+P:1:2|{connect:{P:1:1:tcp}}
+EOF
+)
+if  [ "$(sysctl -n kernel.unprivileged_userns_clone)" == 1 ]; then
+    exec unshare -r -nmU bash -c "mount -t tmpfs --make-rshared tmpfs 
/run/netns; ./test_transport_start_with_config -s '$string'"
+else
+    echo -e "Error during test setup: The kernel parameter 
kernel.unprivileged_userns_clone has to be set to 1! One has to execute\n\n 
sysctl kernel.unprivileged_userns_clone=1\n"
+    exit 78
+fi
diff --git a/src/transport/test_transport_start_with_config.c 
b/src/transport/test_transport_start_with_config.c
index 932b0e583..7eb92d629 100644
--- a/src/transport/test_transport_start_with_config.c
+++ b/src/transport/test_transport_start_with_config.c
@@ -25,6 +25,7 @@
  */
 #include "platform.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "gnunet_util_lib.h"
 
 #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 120)
@@ -34,27 +35,86 @@ int
 main (int argc,
       char *const *argv)
 {
-  char *topology_config;
+  char *topology_data;
+  char *topology_data_script;
+  struct GNUNET_TESTING_NetjailTopology *topology;
+  unsigned int read_file = GNUNET_YES;
+  int ret;
+  char *rest = NULL;
+  char *token;
+  size_t single_line_len;
+  size_t data_len;
 
   GNUNET_log_setup ("test-netjail",
                     "DEBUG",
                     NULL);
 
-  topology_config = argv[1];
+  if (0 == strcmp ("-s", argv[1]))
+  {
+    data_len = strlen (argv[2]);
+    topology_data = GNUNET_malloc (data_len);
+    topology_data_script = GNUNET_malloc (data_len);
+    token = strtok_r (argv[2], "\n", &rest);
+    while (NULL != token)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "token1 %s\n",
+                  token);
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "token2 %s\n",
+                  token);
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "topology_data %s\n",
+                  topology_data);
+      strcat (topology_data_script, token);
+      strcat (topology_data_script, " ");
+      strcat (topology_data, token);
+      strcat (topology_data, "\n");
+      token = strtok_r (NULL, "\n", &rest);
+    }
+    single_line_len = strlen (topology_data);
+    topology_data_script [single_line_len - 1] = '\0';
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "read from string\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "topology_data %s\n",
+                topology_data);
+    read_file = GNUNET_NO;
+    topology = GNUNET_TESTING_get_topo_from_string (topology_data);
+  }
+  else
+  {
+    topology_data = argv[1];
+    topology_data_script = argv[1];
+    topology = GNUNET_TESTING_get_topo_from_file (topology_data);
+  }
 
   struct GNUNET_TESTING_Command commands[] = {
     GNUNET_TESTING_cmd_netjail_start ("netjail-start",
-                                      topology_config),
+                                      topology_data_script,
+                                      &read_file),
     GNUNET_TESTING_cmd_netjail_start_testing_system ("netjail-start-testbed",
-                                                     topology_config),
+                                                     topology,
+                                                     &read_file,
+                                                     topology_data_script),
     GNUNET_TESTING_cmd_stop_testing_system ("stop-testbed",
                                             "netjail-start-testbed",
-                                            topology_config),
+                                            topology),
     GNUNET_TESTING_cmd_netjail_stop ("netjail-stop",
-                                     topology_config),
+                                     topology_data_script,
+                                     &read_file),
     GNUNET_TESTING_cmd_end ()
   };
 
-  return GNUNET_TESTING_main (commands,
-                              TIMEOUT);
+  ret = GNUNET_TESTING_main (commands,
+                             TIMEOUT);
+
+  if (0 == strcmp ("-s", argv[1]))
+  {
+    GNUNET_free (topology_data_script);
+    GNUNET_free (topology_data);
+  }
+  GNUNET_TESTING_free_topology (topology);
+
+  return ret;
 }
diff --git a/src/transport/transport_api_cmd_backchannel_check.c 
b/src/transport/transport_api_cmd_backchannel_check.c
index 03b231347..529b4690b 100644
--- a/src/transport/transport_api_cmd_backchannel_check.c
+++ b/src/transport/transport_api_cmd_backchannel_check.c
@@ -27,6 +27,7 @@
 #include "gnunet_common.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "gnunet_transport_application_service.h"
 #include "gnunet_hello_lib.h"
 #include "gnunet_transport_service.h"
diff --git a/src/transport/transport_api_cmd_connecting_peers.c 
b/src/transport/transport_api_cmd_connecting_peers.c
index 2eb1b0914..b50b63c62 100644
--- a/src/transport/transport_api_cmd_connecting_peers.c
+++ b/src/transport/transport_api_cmd_connecting_peers.c
@@ -26,6 +26,7 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "gnunet_transport_application_service.h"
 #include "gnunet_hello_lib.h"
 #include "gnunet_transport_service.h"
@@ -91,6 +92,10 @@ connect_peers_run (void *cls,
       addr = GNUNET_TESTING_get_address (pos_connection,
                                          pos_prefix->address_prefix);
       peer = GNUNET_TESTING_get_pub_key (num, tl_system);
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "validating peer number %u with identity %s\n",
+                  num,
+                  GNUNET_i2s (peer));
       GNUNET_TRANSPORT_application_validate (ah,
                                              peer,
                                              nt,
diff --git a/src/transport/transport_api_cmd_send_simple.c 
b/src/transport/transport_api_cmd_send_simple.c
index 9c34c50d7..790139cce 100644
--- a/src/transport/transport_api_cmd_send_simple.c
+++ b/src/transport/transport_api_cmd_send_simple.c
@@ -26,6 +26,7 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "transport-testing2.h"
 #include "transport-testing-cmds.h"
 
diff --git a/src/transport/transport_api_cmd_send_simple_v3.c 
b/src/transport/transport_api_cmd_send_simple_v3.c
deleted file mode 100644
index a4ce2c4e9..000000000
--- a/src/transport/transport_api_cmd_send_simple_v3.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
-      This file is part of GNUnet
-      Copyright (C) 2021 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 <http://www.gnu.org/licenses/>.
-
-     SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file testing_api_cmd_start_peer.c
- * @brief cmd to start a peer.
- * @author t3sserakt
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_testing_ng_lib.h"
-#include "transport-testing2.h"
-#include "transport-testing-cmds.h"
-
-/**
- * Struct to hold information for callbacks.
- *
- */
-struct SendSimpleState
-{
-  /**
-   * Number globally identifying the node.
-   *
-   */
-  uint32_t num;
-
-  /**
-   * Label of the cmd to start a peer.
-   *
-   */
-  const char *start_peer_label;
-
-  /**
-   * Label of the cmd which started the test system.
-   *
-   */
-  const char *create_label;
-
-  /**
-   * The topology we get the connected nodes from.
-   */
-  struct GNUNET_TESTING_NetjailTopology *topology;
-};
-
-
-/**
- * Trait function of this cmd does nothing.
- *
- */
-static int
-send_simple_traits (void *cls,
-                    const void **ret,
-                    const char *trait,
-                    unsigned int index)
-{
-  return GNUNET_OK;
-}
-
-
-/**
- * The cleanup function of this cmd frees resources the cmd allocated.
- *
- */
-static void
-send_simple_cleanup (void *cls,
-                     const struct GNUNET_TESTING_Command *cmd)
-{
-  struct SendSimpleState *sss = cls;
-
-  GNUNET_free (sss);
-}
-
-
-/**
- * The run method of this cmd will send a simple message to the connected 
peers.
- *
- */
-static void
-send_simple_run (void *cls,
-                 const struct GNUNET_TESTING_Command *cmd,
-                 struct GNUNET_TESTING_Interpreter *is)
-{
-  struct SendSimpleState *sss = cls;
-  struct GNUNET_MQ_Envelope *env;
-  struct GNUNET_TRANSPORT_TESTING_TestMessage *test;
-  struct GNUNET_MQ_Handle *mq;
-  struct GNUNET_CONTAINER_MultiShortmap *connected_peers_map;
-  const struct GNUNET_TESTING_Command *peer1_cmd;
-  struct GNUNET_ShortHashCode *key = GNUNET_new (struct GNUNET_ShortHashCode);
-  struct GNUNET_HashCode hc;
-  struct GNUNET_TESTING_NodeConnection *node_connections_head;
-  struct GNUNET_PeerIdentity *peer;
-  struct GNUNET_CRYPTO_EddsaPublicKey public_key;
-  uint32_t num;
-  struct GNUNET_TESTING_NodeConnection *pos_connection;
-  const struct GNUNET_TESTING_Command *system_cmd;
-  struct GNUNET_TESTING_System *tl_system;
-
-  peer1_cmd = GNUNET_TESTING_interpreter_lookup_command 
(sss->start_peer_label);
-  GNUNET_TRANSPORT_get_trait_connected_peers_map (peer1_cmd,
-                                                  &connected_peers_map);
-
-  system_cmd = GNUNET_TESTING_interpreter_lookup_command (sss->create_label);
-  GNUNET_TESTING_get_trait_test_system (system_cmd,
-                                        &tl_system);
-
-  node_connections_head = GNUNET_TESTING_get_connections (sss->num,
-                                                          sss->topology);
-
-  for (int i = 0; i < 1; i++)
-  {
-    for (pos_connection = node_connections_head; NULL != pos_connection;
-         pos_connection = pos_connection->next)
-    {
-      num = GNUNET_TESTING_calculate_num (pos_connection, sss->topology);
-      peer = GNUNET_TESTING_get_pub_key (num, tl_system);
-      public_key = peer->public_key;
-      GNUNET_CRYPTO_hash (&public_key, sizeof(public_key), &hc);
-
-      memcpy (key,
-              &hc,
-              sizeof (*key));
-      mq = GNUNET_CONTAINER_multishortmap_get (connected_peers_map,
-                                               key);
-      env = GNUNET_MQ_msg_extra (test,
-                                 1000 - sizeof(*test),
-                                 GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE);
-      test->num = htonl (sss->num);
-      memset (&test[1],
-              sss->num,
-              1000 - sizeof(*test));
-      GNUNET_MQ_send (mq,
-                      env);
-    }
-  }
-
-  GNUNET_free (key);
-
-}
-
-
-/**
- * Create command.
- *
- * @param label name for command.
- * @param start_peer_label Label of the cmd to start a peer.
- * @param start_peer_label Label of the cmd which started the test system.
- * @param num Number globally identifying the node.
- * @param The topology for the test setup.
- * @return command.
- */
-struct GNUNET_TESTING_Command
-GNUNET_TRANSPORT_cmd_send_simple_v3 (const char *label,
-                                     const char *start_peer_label,
-                                     const char *create_label,
-                                     uint32_t num,
-                                     struct GNUNET_TESTING_NetjailTopology *
-                                     topology)
-{
-  struct SendSimpleState *sss;
-
-  sss = GNUNET_new (struct SendSimpleState);
-  sss->num = num;
-  sss->start_peer_label = start_peer_label;
-  sss->create_label = create_label;
-  sss->topology = topology;
-
-  struct GNUNET_TESTING_Command cmd = {
-    .cls = sss,
-    .label = label,
-    .run = &send_simple_run,
-    .cleanup = &send_simple_cleanup,
-    .traits = &send_simple_traits
-  };
-
-  return cmd;
-}
diff --git a/src/transport/transport_api_cmd_start_peer.c 
b/src/transport/transport_api_cmd_start_peer.c
index a026d48cc..60f416f85 100644
--- a/src/transport/transport_api_cmd_start_peer.c
+++ b/src/transport/transport_api_cmd_start_peer.c
@@ -26,6 +26,7 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "gnunet_peerstore_service.h"
 #include "gnunet_transport_core_service.h"
 #include "gnunet_transport_application_service.h"
@@ -172,6 +173,7 @@ start_peer_run (void *cls,
   char *tcp_communicator_unix_path;
   char *udp_communicator_unix_path;
   char *bindto;
+  char *bindto_udp;
 
   if (GNUNET_NO == GNUNET_DISK_file_test (sps->cfgname))
   {
@@ -207,6 +209,9 @@ start_peer_run (void *cls,
                    "%s:60002",
                    sps->node_ip);
 
+  GNUNET_asprintf (&bindto_udp,
+                   "2086");
+
   LOG (GNUNET_ERROR_TYPE_ERROR,
        "node_ip %s\n",
        bindto);
diff --git a/src/transport/transport_api_cmd_stop_peer.c 
b/src/transport/transport_api_cmd_stop_peer.c
index dcb982a65..97408b083 100644
--- a/src/transport/transport_api_cmd_stop_peer.c
+++ b/src/transport/transport_api_cmd_stop_peer.c
@@ -26,6 +26,7 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
 #include "gnunet_peerstore_service.h"
 #include "gnunet_transport_core_service.h"
 #include "gnunet_transport_application_service.h"

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]