summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--po/POTFILES.in2
-rw-r--r--src/include/gnunet_testing_ng_lib.h92
-rw-r--r--src/testing/gnunet-cmds-helper.c23
-rwxr-xr-xsrc/testing/netjail_start_v2.sh13
-rw-r--r--src/testing/testing.c229
-rw-r--r--src/testing/testing_api_cmd_netjail_start_testsystem_v2.c16
-rw-r--r--src/transport/Makefile.am37
-rw-r--r--src/transport/test_transport_api2_tcp_node1.conf7
-rw-r--r--src/transport/test_transport_plugin_cmd_simple_send.c36
-rw-r--r--src/transport/test_transport_plugin_cmd_udp_backchannel_recv.c262
-rw-r--r--src/transport/test_transport_plugin_cmd_udp_backchannel_send.c262
-rw-r--r--src/transport/test_transport_start_with_config.c85
-rw-r--r--src/transport/transport-testing-cmds.h33
-rw-r--r--src/transport/transport_api_cmd_connecting_peers_v3.c508
-rw-r--r--src/transport/transport_api_cmd_start_peer_v3.c619
15 files changed, 1603 insertions, 621 deletions
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 042b1efc5..adea4bcf1 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -496,10 +496,12 @@ src/transport/transport_api_address_to_string.c
src/transport/transport_api_blacklist.c
src/transport/transport_api_cmd_connecting_peers.c
src/transport/transport_api_cmd_connecting_peers_v2.c
+src/transport/transport_api_cmd_connecting_peers_v3.c
src/transport/transport_api_cmd_send_simple.c
src/transport/transport_api_cmd_send_simple_v2.c
src/transport/transport_api_cmd_start_peer.c
src/transport/transport_api_cmd_start_peer_v2.c
+src/transport/transport_api_cmd_start_peer_v3.c
src/transport/transport_api_cmd_stop_peer.c
src/transport/transport_api_core.c
src/transport/transport_api_hello_get.c
diff --git a/src/include/gnunet_testing_ng_lib.h b/src/include/gnunet_testing_ng_lib.h
index 9ef42a3aa..31665f8f7 100644
--- a/src/include/gnunet_testing_ng_lib.h
+++ b/src/include/gnunet_testing_ng_lib.h
@@ -63,6 +63,88 @@ struct GNUNET_TESTING_NetjailRouter
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
+};
+
+struct GNUNET_TESTING_ADDRESS_PREFIX
+{
+ /**
+ * Pointer to the previous prefix in the DLL.
+ */
+ struct GNUNET_TESTING_ADDRESS_PREFIX *prev;
+
+ /**
+ * Pointer to the next prefix in the DLL.
+ */
+ struct GNUNET_TESTING_ADDRESS_PREFIX *next;
+
+ /**
+ * The address prefix.
+ */
+ char *address_prefix;
+};
+
+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_ADDRESS_PREFIX *address_prefixes_head;
+
+ /**
+ * Tail of the DLL with the address prefixes for the protocolls this node is reachable.
+ */
+ struct GNUNET_TESTING_ADDRESS_PREFIX *address_prefixes_tail;
+};
/**
* Node in the netjail topology.
@@ -88,6 +170,16 @@ struct GNUNET_TESTING_NetjailNode
* The number of this node in the namespace.
*/
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;
};
diff --git a/src/testing/gnunet-cmds-helper.c b/src/testing/gnunet-cmds-helper.c
index 8f9e77709..e50db0cf6 100644
--- a/src/testing/gnunet-cmds-helper.c
+++ b/src/testing/gnunet-cmds-helper.c
@@ -57,6 +57,8 @@ testing_api_cmd_block_until_all_peers_started.c */
#define NODE_BASE_IP "192.168.15."
+#define KNOWN_BASE_IP "92.68.151."
+
#define ROUTER_BASE_IP "92.68.150."
/**
@@ -343,6 +345,7 @@ tokenizer_cb (void *cls, const struct GNUNET_MessageHeader *message)
size_t msg_length;
char *router_ip;
char *node_ip;
+ unsigned int namespace_n;
msize = ntohs (message->size);
if (GNUNET_MESSAGE_TYPE_CMDS_HELPER_INIT == ntohs (message->type))
@@ -378,8 +381,24 @@ tokenizer_cb (void *cls, const struct GNUNET_MessageHeader *message)
strcpy (router_ip, ROUTER_BASE_IP);
strcat (router_ip, plugin->n);
- node_ip = GNUNET_malloc (strlen (NODE_BASE_IP) + strlen (plugin->m) + 1);
- strcat (node_ip, NODE_BASE_IP);
+ sscanf (plugin->n, "%u", &namespace_n);
+
+ if (0 == namespace_n)
+ {
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "known node n: %s\n",
+ plugin->n);
+ node_ip = GNUNET_malloc (strlen (KNOWN_BASE_IP) + strlen (plugin->m) + 1);
+ strcat (node_ip, KNOWN_BASE_IP);
+ }
+ else
+ {
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "subnet node n: %s\n",
+ plugin->n);
+ node_ip = GNUNET_malloc (strlen (NODE_BASE_IP) + strlen (plugin->m) + 1);
+ strcat (node_ip, NODE_BASE_IP);
+ }
strcat (node_ip, plugin->m);
plugin->api->start_testcase (&write_message, router_ip, node_ip, plugin->m,
diff --git a/src/testing/netjail_start_v2.sh b/src/testing/netjail_start_v2.sh
index cf1fe113a..dd1f2ad93 100755
--- a/src/testing/netjail_start_v2.sh
+++ b/src/testing/netjail_start_v2.sh
@@ -58,4 +58,17 @@ for N in $(seq $GLOBAL_N); do
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/src/testing/testing.c b/src/testing/testing.c
index fcde39901..a11d404a5 100644
--- a/src/testing/testing.c
+++ b/src/testing/testing.c
@@ -1789,7 +1789,7 @@ get_first_value (char *line)
token = strtok_r (copy, ":", &rest);
token = strtok_r (NULL, ":", &rest);
sscanf (token, "%u", &ret);
- free (copy);
+ GNUNET_free (copy);
return ret;
}
@@ -1809,7 +1809,7 @@ get_key (char *line)
token = strtok_r (copy, ":", &rest);
ret = malloc (2);
memcpy (ret, token, 2);
- free (copy);
+ GNUNET_free (copy);
return ret;
}
@@ -1828,13 +1828,13 @@ get_first_string_value (char *line)
memcpy (copy, line, slen);
token = strtok_r (copy, ":", &rest);
token = strtok_r (NULL, ":", &rest);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"first token %s\n",
token);
slen_token = strlen (token);
ret = malloc (slen_token + 1);
memcpy (ret, token, slen_token + 1);
- free (copy);
+ GNUNET_free (copy);
return ret;
}
@@ -1855,7 +1855,7 @@ get_second_value (char *line)
token = strtok_r (NULL, ":", &rest);
token = strtok_r (NULL, ":", &rest);
sscanf (token, "%u", &ret);
- free (copy);
+ GNUNET_free (copy);
return ret;
}
@@ -1883,11 +1883,129 @@ get_value (char *key, char *line)
slen_token = strlen (token2);
ret = malloc (slen_token + 1);
memcpy (ret, token2, slen_token + 1);
- free (copy);
+ GNUNET_free (copy);
return ret;
}
+static struct GNUNET_TESTING_NodeConnection *
+get_connect_value (char *line, struct GNUNET_TESTING_NetjailNode *node)
+{
+ struct GNUNET_TESTING_NodeConnection *node_connection;
+ char *copy;
+ size_t slen;
+ char *token;
+ char *token2;
+ unsigned int node_n;
+ unsigned int namespace_n;
+ char *rest = NULL;
+ char *rest2 = NULL;
+ struct GNUNET_TESTING_ADDRESS_PREFIX *prefix;
+
+ node_connection = GNUNET_new (struct GNUNET_TESTING_NodeConnection);
+ node_connection->node = node;
+
+ slen = strlen (line) + 1;
+ copy = malloc (slen);
+ memcpy (copy, line, slen);
+ token = strtok_r (copy, ":", &rest);
+ if (0 == strcmp ("{K", token))
+ {
+ node_connection->node_type = GNUNET_TESTING_GLOBAL_NODE;
+ token = strtok_r (NULL, ":", &rest);
+ sscanf (token, "%u", &node_n);
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "node_n %u\n",
+ node_n);
+ node_connection->node_n = node_n;
+ node_connection->namespace_n = 0;
+ }
+ else if (0 == strcmp ("{P", token))
+ {
+ node_connection->node_type = GNUNET_TESTING_SUBNET_NODE;
+ token = strtok_r (NULL, ":", &rest);
+ sscanf (token, "%u", &node_n);
+ node_connection->node_n = node_n;
+ token = strtok_r (NULL, ":", &rest);
+ sscanf (token, "%u", &namespace_n);
+ node_connection->namespace_n = namespace_n;
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "node_n %u namespace_n %u\n",
+ node_n,
+ namespace_n);
+ }
+ while (NULL != (token = strtok_r (NULL, ":", &rest)))
+ {
+ prefix = GNUNET_new (struct GNUNET_TESTING_ADDRESS_PREFIX);
+ token2 = strtok_r (token, "}", &rest2);
+ if (NULL != token2)
+ {
+ slen = strlen (token2) + 1;
+ prefix->address_prefix = malloc (slen);
+ memcpy (prefix->address_prefix, token2, slen);
+ }
+ else
+ {
+ slen = strlen (token) + 1;
+ prefix->address_prefix = malloc (slen);
+ memcpy (prefix->address_prefix, token, slen);
+ }
+
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "address_prefix %s\n",
+ prefix->address_prefix);
+
+ GNUNET_CONTAINER_DLL_insert (node_connection->address_prefixes_head,
+ node_connection->address_prefixes_tail,
+ prefix);
+ }
+
+ GNUNET_free (copy);
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "address_prefix %s\n",
+ prefix->address_prefix);
+
+ return node_connection;
+}
+
+
+static void
+node_connections (char *line, struct GNUNET_TESTING_NetjailNode *node)
+{
+ char *value, *value2;
+ char *temp;
+ char *copy;
+ size_t slen;
+ char *rest = NULL;
+ char *rest2 = NULL;
+ struct GNUNET_TESTING_NodeConnection *node_connection;
+
+
+ temp = strstr (line, "connect");
+ if (NULL != temp)
+ {
+ slen = strlen (temp) + 1;
+ copy = malloc (slen);
+ memcpy (copy, temp, slen);
+ strtok_r (copy, ":", &rest);
+ value = strtok_r (rest, "|", &rest2);
+
+ while (NULL != value)
+ {
+ node_connection = get_connect_value (value, node);
+ GNUNET_CONTAINER_DLL_insert (node->node_connections_head,
+ node->node_connections_tail,
+ node_connection);
+ value2 = strstr (value, "}}");
+ if (NULL != value2)
+ break;
+ value = strtok_r (NULL, "|", &rest2);
+
+ }
+ }
+}
+
+
/**
* Getting the topology from file.
*
@@ -1912,6 +2030,7 @@ GNUNET_TESTING_get_topo_from_file (const char *filename)
struct GNUNET_TESTING_NetjailNamespace *namespace;
struct GNUNET_ShortHashCode *hkey;
struct GNUNET_HashCode hc;
+
topo->map_namespaces =
GNUNET_CONTAINER_multishortmap_create (1,GNUNET_NO);
topo->map_globals =
@@ -1942,7 +2061,7 @@ GNUNET_TESTING_get_topo_from_file (const char *filename)
return NULL;
}
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"data: %s\n",
data);
@@ -1951,46 +2070,46 @@ GNUNET_TESTING_get_topo_from_file (const char *filename)
while (NULL != token)
{
key = get_key (token);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"In the loop with token: %s beginning with %s\n",
token,
key);
if (0 == strcmp (key, "M"))
{
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"Get first Value for M.\n");
out = get_first_value (token);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"M: %u\n",
out);
topo->nodes_m = out;
}
else if (0 == strcmp (key, "N"))
{
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"Get first Value for N.\n");
out = get_first_value (token);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"N: %u\n",
out);
topo->namespaces_n = out;
}
else if (0 == strcmp (key, "X"))
{
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"Get first Value for X.\n");
out = get_first_value (token);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"X: %u\n",
out);
topo->nodes_x = out;
}
else if (0 == strcmp (key, "T"))
{
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"Get first string value for T.\n");
value = get_first_string_value (token);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"value: %s\n",
value);
topo->plugin = value;
@@ -2000,10 +2119,10 @@ GNUNET_TESTING_get_topo_from_file (const char *filename)
hkey = GNUNET_new (struct GNUNET_ShortHashCode);
node = GNUNET_new (struct GNUNET_TESTING_NetjailNode);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"Get first Value for K.\n");
out = get_first_value (token);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"K: %u\n",
out);
node->node_n = out;
@@ -2012,20 +2131,24 @@ GNUNET_TESTING_get_topo_from_file (const char *filename)
&hc,
sizeof (*hkey));
node->is_global = GNUNET_YES;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Get value for key value on K.\n");
- value = get_value ("plugin", token);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "value: %s\n",
- value);
- if (0 == GNUNET_CONTAINER_multishortmap_contains (topo->map_globals,
- hkey))
+
+ if (GNUNET_YES == GNUNET_CONTAINER_multishortmap_contains (
+ topo->map_globals,
+ hkey))
GNUNET_break (0);
else
GNUNET_CONTAINER_multishortmap_put (topo->map_globals,
hkey,
node,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "Get value for key value on K.\n");
+ value = get_value ("plugin", token);
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "value: %s\n",
+ value);
+ node->plugin = value;
+ node_connections (token, node);
}
else if (0 == strcmp (key, "R"))
{
@@ -2033,10 +2156,10 @@ GNUNET_TESTING_get_topo_from_file (const char *filename)
router = GNUNET_new (struct GNUNET_TESTING_NetjailRouter);
node = GNUNET_new (struct GNUNET_TESTING_NetjailNode);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"Get first Value for R.\n");
out = get_first_value (token);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"R: %u\n",
out);
node->node_n = out;
@@ -2044,27 +2167,28 @@ GNUNET_TESTING_get_topo_from_file (const char *filename)
memcpy (hkey,
&hc,
sizeof (*hkey));
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"Get value for key tcp_port on R.\n");
value = get_value ("tcp_port", token);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"tcp_port: %s\n",
value);
ret = sscanf (value, "%u", &(router->tcp_port));
- GNUNET_break (0 == ret || 1 < router->tcp_port);
+ GNUNET_break (0 != ret && 1 >= router->tcp_port);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"Get value for key udp_port on R.\n");
value = get_value ("udp_port", token);
ret = sscanf (value, "%u", &(router->udp_port));
- GNUNET_break (0 == ret || 1 < router->udp_port);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ GNUNET_break (0 != ret && 1 >= router->udp_port);
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"udp_port: %s\n",
value);
- if (0 == GNUNET_CONTAINER_multishortmap_contains (topo->map_namespaces,
- hkey))
+ if (GNUNET_YES == GNUNET_CONTAINER_multishortmap_contains (
+ topo->map_namespaces,
+ hkey))
{
namespace = GNUNET_CONTAINER_multishortmap_get (topo->map_namespaces,
hkey);
@@ -2073,6 +2197,7 @@ GNUNET_TESTING_get_topo_from_file (const char *filename)
{
namespace = GNUNET_new (struct GNUNET_TESTING_NetjailNamespace);
namespace->namespace_n = out;
+ namespace->nodes = GNUNET_CONTAINER_multishortmap_create (1,GNUNET_NO);
GNUNET_CONTAINER_multishortmap_put (topo->map_namespaces,
hkey,
namespace,
@@ -2086,10 +2211,10 @@ GNUNET_TESTING_get_topo_from_file (const char *filename)
hkey = GNUNET_new (struct GNUNET_ShortHashCode);
node = GNUNET_new (struct GNUNET_TESTING_NetjailNode);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"Get first Value for P.\n");
out = get_first_value (token);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"P: %u\n",
out);
GNUNET_CRYPTO_hash (&out, sizeof(out), &hc);
@@ -2097,14 +2222,9 @@ GNUNET_TESTING_get_topo_from_file (const char *filename)
&hc,
sizeof (*hkey));
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Get value for key plugin on P.\n");
- value = get_value ("plugin", token);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "plugin: %s\n",
- value);
- if (0 == GNUNET_CONTAINER_multishortmap_contains (topo->map_namespaces,
- hkey))
+ if (GNUNET_YES == GNUNET_CONTAINER_multishortmap_contains (
+ topo->map_namespaces,
+ hkey))
{
namespace = GNUNET_CONTAINER_multishortmap_get (topo->map_namespaces,
hkey);
@@ -2112,24 +2232,26 @@ GNUNET_TESTING_get_topo_from_file (const char *filename)
else
{
namespace = GNUNET_new (struct GNUNET_TESTING_NetjailNamespace);
+ namespace->nodes = GNUNET_CONTAINER_multishortmap_create (1,GNUNET_NO);
namespace->namespace_n = out;
GNUNET_CONTAINER_multishortmap_put (topo->map_namespaces,
hkey,
namespace,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
}
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"Get second Value for P.\n");
out = get_second_value (token);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"P: %u\n",
out);
GNUNET_CRYPTO_hash (&out, sizeof(out), &hc);
memcpy (hkey,
&hc,
sizeof (*hkey));
- if (0 == GNUNET_CONTAINER_multishortmap_contains (namespace->nodes,
- hkey))
+ if (GNUNET_YES == GNUNET_CONTAINER_multishortmap_contains (
+ namespace->nodes,
+ hkey))
{
GNUNET_break (0);
}
@@ -2140,10 +2262,17 @@ GNUNET_TESTING_get_topo_from_file (const char *filename)
hkey,
node,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "Get value for key plugin on P.\n");
+ value = get_value ("plugin", token);
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "plugin: %s\n",
+ value);
node->plugin = value;
node->node_n = out;
node->namespace_n = namespace->namespace_n;
}
+ node_connections (token, node);
}
token = strtok_r (NULL, "\n", &rest);
}
diff --git a/src/testing/testing_api_cmd_netjail_start_testsystem_v2.c b/src/testing/testing_api_cmd_netjail_start_testsystem_v2.c
index e5d4221ec..ccb3f5ae8 100644
--- a/src/testing/testing_api_cmd_netjail_start_testsystem_v2.c
+++ b/src/testing/testing_api_cmd_netjail_start_testsystem_v2.c
@@ -422,8 +422,8 @@ start_helper (struct NetJailState *ns, struct
struct GNUNET_TESTING_NetjailNamespace *namespace;
- if (0 == m)
- script_num = n - 1;
+ if (0 == n)
+ script_num = m - 1;
else
script_num = n - 1 + (n - 1) * ns->local_m + m + ns->known;
pid = getpid ();
@@ -455,8 +455,8 @@ start_helper (struct NetJailState *ns, struct
tbc = GNUNET_new (struct TestingSystemCount);
tbc->ns = ns;
- if (0 == m)
- tbc->count = n;
+ if (0 == n)
+ tbc->count = m;
else
tbc->count = (n - 1) * ns->local_m + m + ns->known;
@@ -491,7 +491,7 @@ start_helper (struct NetJailState *ns, struct
hkey = GNUNET_new (struct GNUNET_ShortHashCode);
- plugin = ns->plugin_name;
+ plugin = topology->plugin;
if (0 == m)
{
@@ -505,7 +505,8 @@ start_helper (struct NetJailState *ns, struct
{
node = GNUNET_CONTAINER_multishortmap_get (topology->map_globals,
hkey);
- plugin = node->plugin;
+ if (NULL != node->plugin)
+ plugin = node->plugin;
}
}
@@ -529,7 +530,8 @@ start_helper (struct NetJailState *ns, struct
{
node = GNUNET_CONTAINER_multishortmap_get (namespace->nodes,
hkey);
- plugin = node->plugin;
+ if (NULL != node->plugin)
+ plugin = node->plugin;
}
}
diff --git a/src/transport/Makefile.am b/src/transport/Makefile.am
index 561ac5e60..c8290628f 100644
--- a/src/transport/Makefile.am
+++ b/src/transport/Makefile.am
@@ -162,8 +162,10 @@ libgnunettransporttesting_la_LDFLAGS = \
libgnunettransporttesting2_la_SOURCES = \
transport_api_cmd_connecting_peers.c \
transport_api_cmd_connecting_peers_v2.c \
+ transport_api_cmd_connecting_peers_v3.c \
transport_api_cmd_start_peer.c \
transport_api_cmd_start_peer_v2.c \
+ transport_api_cmd_start_peer_v3.c \
transport_api_cmd_stop_peer.c \
transport_api_cmd_send_simple.c \
transport_api_cmd_send_simple_v2.c \
@@ -394,7 +396,25 @@ plugin_LTLIBRARIES = \
$(WLAN_PLUGIN_LA) \
$(BT_PLUGIN_LA) \
libgnunet_test_transport_plugin_cmd_simple_send.la \
- libgnunet_test_transport_plugin_cmd_simple_send_v2.la
+ libgnunet_test_transport_plugin_cmd_simple_send_v2.la \
+ libgnunet_test_transport_plugin_cmd_udp_backchannel.la
+
+libgnunet_test_transport_plugin_cmd_udp_backchannel_la_SOURCES = \
+ test_transport_plugin_cmd_udp_backchannel.c
+libgnunet_test_transport_plugin_cmd_udp_backchannel_la_LIBADD = \
+ libgnunettransporttesting2.la \
+ libgnunettransportapplication.la \
+ libgnunettransportcore.la \
+ $(top_builddir)/src/testing/libgnunettesting.la \
+ $(top_builddir)/src/peerstore/libgnunetpeerstore.la \
+ $(top_builddir)/src/statistics/libgnunetstatistics.la \
+ $(top_builddir)/src/hello/libgnunethello.la \
+ $(top_builddir)/src/ats/libgnunetats.la \
+ $(top_builddir)/src/arm/libgnunetarm.la \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(LTLIBINTL)
+libgnunet_test_transport_plugin_cmd_simple_send_la_LDFLAGS = \
+ $(GN_PLUGIN_LDFLAGS)
libgnunet_test_transport_plugin_cmd_simple_send_la_SOURCES = \
test_transport_plugin_cmd_simple_send.c
@@ -578,6 +598,7 @@ if HAVE_TESTING
check_PROGRAMS = \
test_transport_simple_send \
test_transport_simple_send_v2 \
+ test_transport_start_with_config \
test_transport_address_switch_tcp \
test_transport_testing_startstop \
test_transport_testing_restart \
@@ -728,6 +749,7 @@ if HAVE_EXPERIMENTAL
TESTS += \
test_transport_simple_send \
test_transport_simple_send_v2 \
+ test_transport_start_with_config \
test_transport_address_switch_udp \
test_plugin_udp \
test_transport_api_udp \
@@ -747,7 +769,18 @@ endif
check_SCRIPTS= \
test_transport_simple_send.sh \
- test_transport_simple_send_v2.sh
+ test_transport_simple_send_v2.sh \
+ test_transport_udp_backchannel.sh
+
+test_transport_start_with_config_SOURCES = \
+ test_transport_start_with_config.c
+test_transport_start_with_config_LDADD = \
+ $(top_builddir)/src/testing/libgnunettesting.la \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(top_builddir)/src/testbed/libgnunettestbed.la \
+ $(top_builddir)/src/hello/libgnunethello.la \
+ libgnunettransportcore.la \
+ libgnunettransporttesting2.la
test_transport_simple_send_SOURCES = \
test_transport_simple_send.c
diff --git a/src/transport/test_transport_api2_tcp_node1.conf b/src/transport/test_transport_api2_tcp_node1.conf
index a867ea81a..11306fd6a 100644
--- a/src/transport/test_transport_api2_tcp_node1.conf
+++ b/src/transport/test_transport_api2_tcp_node1.conf
@@ -16,6 +16,13 @@ IMMEDIATE_START = YES
UNIXPATH = $GNUNET_RUNTIME_DIR/tcp-comm-p1.sock
#PREFIX = valgrind --log-file=/tmp/vg_cpeer1-%p
+[communicator-udp]
+BINARY = gnunet-communicator-udp
+BINDTO = 192.168.15.1:60002
+DISABLE_V6 = YES
+IMMEDIATE_START = YES
+UNIXPATH = $GNUNET_RUNTIME_DIR/udp-comm-p1.sock
+
[peerstore]
IMMEDIATE_START = YES
diff --git a/src/transport/test_transport_plugin_cmd_simple_send.c b/src/transport/test_transport_plugin_cmd_simple_send.c
index 35aa07ecd..07255a1a5 100644
--- a/src/transport/test_transport_plugin_cmd_simple_send.c
+++ b/src/transport/test_transport_plugin_cmd_simple_send.c
@@ -83,40 +83,11 @@ static void
handle_test (void *cls,
const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
{
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "message received\n");
message_received = GNUNET_YES;
}
/**
- * Function called to check a message of type GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE2
- * being received.
- *
- */
-static int
-check_test2 (void *cls,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- return GNUNET_OK;
-}
-
-
-/**
- * Function called to handle a message of type GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE2
- * being received.
- *
- */
-static void
-handle_test2 (void *cls,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "message received\n");
-}
-
-
-/**
* Callback to set the flag indicating all peers started. Will be called via the plugin api.
*
*/
@@ -124,9 +95,6 @@ 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);
}
@@ -176,10 +144,6 @@ start_testcase (TESTING_CMD_HELPER_write_cb write_message, char *router_ip,
GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE,
struct GNUNET_TRANSPORT_TESTING_TestMessage,
NULL),
- GNUNET_MQ_hd_var_size (test2,
- GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE2,
- struct GNUNET_TRANSPORT_TESTING_TestMessage,
- NULL),
GNUNET_MQ_handler_end ()
};
diff --git a/src/transport/test_transport_plugin_cmd_udp_backchannel_recv.c b/src/transport/test_transport_plugin_cmd_udp_backchannel_recv.c
deleted file mode 100644
index ce1245296..000000000
--- a/src/transport/test_transport_plugin_cmd_udp_backchannel_recv.c
+++ /dev/null
@@ -1,262 +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_cmd_simple_send.c
- * @brief a plugin to provide the API for running test cases.
- * @author t3sserakt
- */
-#include "platform.h"
-#include "gnunet_testing_ng_lib.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_transport_application_service.h"
-#include "transport-testing2.h"
-#include "transport-testing-cmds.h"
-
-/**
- * Generic logging shortcut
- */
-#define LOG(kind, ...) GNUNET_log (kind, __VA_ARGS__)
-
-#define BASE_DIR "testdir"
-
-#define TOPOLOGY_CONFIG "test_transport_simple_send_topo.conf"
-
-/**
- * The name for a specific test environment directory.
- *
- */
-char *testdir;
-
-/**
- * The name for the configuration file of the specific node.
- *
- */
-char *cfgname;
-
-/**
- * Flag indicating if all peers have been started.
- *
- */
-unsigned int are_all_peers_started;
-
-
-/**
- * Function called to check a message of type GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE being
- * received.
- *
- */
-static int
-check_test (void *cls,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- return GNUNET_OK;
-}
-
-
-/**
- * Function called to handle a message of type GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE
- * being received.
- *
- */
-static void
-handle_test (void *cls,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "message received\n");
-}
-
-
-/**
- * Function called to check a message of type GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE2
- * being received.
- *
- */
-static int
-check_test2 (void *cls,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- return GNUNET_OK;
-}
-
-
-/**
- * Function called to handle a message of type GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE2
- * being received.
- *
- */
-static void
-handle_test2 (void *cls,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "message received\n");
-}
-
-
-/**
- * Callback to set the flag indicating all peers started. Will be called via the plugin api.
- *
- */
-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);
-}
-
-
-/**
- * Function to start a local test case.
- *
- * @param write_message Callback to send a message to the master loop.
- * @param router_ip Global address of the network namespace.
- * @param node_ip Local address of a node i a network namespace.
- * @param m The number of the node in a network namespace.
- * @param n The number of the network namespace.
- * @param local_m The number of nodes in a network namespace.
- */
-static void
-start_testcase (TESTING_CMD_HELPER_write_cb write_message, char *router_ip,
- char *node_ip,
- char *m,
- char *n,
- char *local_m)
-{
-
- unsigned int n_int, m_int, local_m_int, num;
-
- struct GNUNET_TESTING_NetjailTopology *topology =
- GNUNET_TESTING_get_topo_from_file (TOPOLOGY_CONFIG);
-
- sscanf (m, "%u", &m_int);
- sscanf (n, "%u", &n_int);
- sscanf (local_m, "%u", &local_m_int);
-
-
- if (0 == m_int)
- num = n_int;
- else
- num = (n_int - 1) * local_m_int + m_int + topology->nodes_x;
-
- GNUNET_asprintf (&cfgname,
- "test_transport_api2_tcp_node1.conf");
-
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "plugin cfgname: %s\n",
- cfgname);
-
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "node ip: %s\n",
- node_ip);
-
- GNUNET_asprintf (&testdir,
- "%s%s%s",
- BASE_DIR,
- m,
- n);
-
- struct GNUNET_MQ_MessageHandler handlers[] = {
- GNUNET_MQ_hd_var_size (test,
- GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE,
- struct GNUNET_TRANSPORT_TESTING_TestMessage,
- NULL),
- GNUNET_MQ_hd_var_size (test2,
- GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE2,
- struct GNUNET_TRANSPORT_TESTING_TestMessage,
- NULL),
- GNUNET_MQ_handler_end ()
- };
-
- struct GNUNET_TESTING_Command commands[] = {
- GNUNET_TESTING_cmd_system_create ("system-create",
- testdir),
- GNUNET_TRANSPORT_cmd_start_peer_v2 ("start-peer",
- "system-create",
- num,
- node_ip,
- handlers,
- cfgname),
- GNUNET_TESTING_cmd_send_peer_ready ("send-peer-ready",
- write_message),
- GNUNET_TESTING_cmd_block_until_all_peers_started ("block",
- &are_all_peers_started),
- GNUNET_TRANSPORT_cmd_connect_peers_v2 ("connect-peers",
- "start-peer",
- "system-create",
- num),
- GNUNET_TRANSPORT_cmd_send_simple_v2 ("send-simple",
- "start-peer",
- num),
- GNUNET_TRANSPORT_cmd_stop_peer ("stop-peer",
- "start-peer"),
- GNUNET_TESTING_cmd_system_destroy ("system-destroy",
- "system-create"),
- GNUNET_TESTING_cmd_local_test_finished ("local-test-finished",
- write_message)
- };
-
- GNUNET_TESTING_run (NULL,
- commands,
- GNUNET_TIME_UNIT_FOREVER_REL);
-
-}
-
-
-/**
- * Entry point for the plugin.
- *
- * @param cls NULL
- * @return the exported block API
- */
-void *
-libgnunet_test_transport_plugin_cmd_simple_send_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_test_transport_plugin_block_test_init
- * @return NULL
- */
-void *
-libgnunet_test_transport_plugin_cmd_simple_send_done (void *cls)
-{
- struct GNUNET_TESTING_PluginFunctions *api = cls;
-
- GNUNET_free (api);
- GNUNET_free (testdir);
- GNUNET_free (cfgname);
- return NULL;
-}
-
-
-/* end of plugin_cmd_simple_send.c */
diff --git a/src/transport/test_transport_plugin_cmd_udp_backchannel_send.c b/src/transport/test_transport_plugin_cmd_udp_backchannel_send.c
deleted file mode 100644
index ce1245296..000000000
--- a/src/transport/test_transport_plugin_cmd_udp_backchannel_send.c
+++ /dev/null
@@ -1,262 +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_cmd_simple_send.c
- * @brief a plugin to provide the API for running test cases.
- * @author t3sserakt
- */
-#include "platform.h"
-#include "gnunet_testing_ng_lib.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_transport_application_service.h"
-#include "transport-testing2.h"
-#include "transport-testing-cmds.h"
-
-/**
- * Generic logging shortcut
- */
-#define LOG(kind, ...) GNUNET_log (kind, __VA_ARGS__)
-
-#define BASE_DIR "testdir"
-
-#define TOPOLOGY_CONFIG "test_transport_simple_send_topo.conf"
-
-/**
- * The name for a specific test environment directory.
- *
- */
-char *testdir;
-
-/**
- * The name for the configuration file of the specific node.
- *
- */
-char *cfgname;
-
-/**
- * Flag indicating if all peers have been started.
- *
- */
-unsigned int are_all_peers_started;
-
-
-/**
- * Function called to check a message of type GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE being
- * received.
- *
- */
-static int
-check_test (void *cls,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- return GNUNET_OK;
-}
-
-
-/**
- * Function called to handle a message of type GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE
- * being received.
- *
- */
-static void
-handle_test (void *cls,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "message received\n");
-}
-
-
-/**
- * Function called to check a message of type GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE2
- * being received.
- *
- */
-static int
-check_test2 (void *cls,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- return GNUNET_OK;
-}
-
-
-/**
- * Function called to handle a message of type GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE2
- * being received.
- *
- */
-static void
-handle_test2 (void *cls,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "message received\n");
-}
-
-
-/**
- * Callback to set the flag indicating all peers started. Will be called via the plugin api.
- *
- */
-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);
-}
-
-
-/**
- * Function to start a local test case.
- *
- * @param write_message Callback to send a message to the master loop.
- * @param router_ip Global address of the network namespace.
- * @param node_ip Local address of a node i a network namespace.
- * @param m The number of the node in a network namespace.
- * @param n The number of the network namespace.
- * @param local_m The number of nodes in a network namespace.
- */
-static void
-start_testcase (TESTING_CMD_HELPER_write_cb write_message, char *router_ip,
- char *node_ip,
- char *m,
- char *n,
- char *local_m)
-{
-
- unsigned int n_int, m_int, local_m_int, num;
-
- struct GNUNET_TESTING_NetjailTopology *topology =
- GNUNET_TESTING_get_topo_from_file (TOPOLOGY_CONFIG);
-
- sscanf (m, "%u", &m_int);
- sscanf (n, "%u", &n_int);
- sscanf (local_m, "%u", &local_m_int);
-
-
- if (0 == m_int)
- num = n_int;
- else
- num = (n_int - 1) * local_m_int + m_int + topology->nodes_x;
-
- GNUNET_asprintf (&cfgname,
- "test_transport_api2_tcp_node1.conf");
-
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "plugin cfgname: %s\n",
- cfgname);
-
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "node ip: %s\n",
- node_ip);
-
- GNUNET_asprintf (&testdir,
- "%s%s%s",
- BASE_DIR,
- m,
- n);
-
- struct GNUNET_MQ_MessageHandler handlers[] = {
- GNUNET_MQ_hd_var_size (test,
- GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE,
- struct GNUNET_TRANSPORT_TESTING_TestMessage,
- NULL),
- GNUNET_MQ_hd_var_size (test2,
- GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE2,
- struct GNUNET_TRANSPORT_TESTING_TestMessage,
- NULL),
- GNUNET_MQ_handler_end ()
- };
-
- struct GNUNET_TESTING_Command commands[] = {
- GNUNET_TESTING_cmd_system_create ("system-create",
- testdir),
- GNUNET_TRANSPORT_cmd_start_peer_v2 ("start-peer",
- "system-create",
- num,
- node_ip,
- handlers,
- cfgname),
- GNUNET_TESTING_cmd_send_peer_ready ("send-peer-ready",
- write_message),
- GNUNET_TESTING_cmd_block_until_all_peers_started ("block",
- &are_all_peers_started),
- GNUNET_TRANSPORT_cmd_connect_peers_v2 ("connect-peers",
- "start-peer",
- "system-create",
- num),
- GNUNET_TRANSPORT_cmd_send_simple_v2 ("send-simple",
- "start-peer",
- num),
- GNUNET_TRANSPORT_cmd_stop_peer ("stop-peer",
- "start-peer"),
- GNUNET_TESTING_cmd_system_destroy ("system-destroy",
- "system-create"),
- GNUNET_TESTING_cmd_local_test_finished ("local-test-finished",
- write_message)
- };
-
- GNUNET_TESTING_run (NULL,
- commands,
- GNUNET_TIME_UNIT_FOREVER_REL);
-
-}
-
-
-/**
- * Entry point for the plugin.
- *
- * @param cls NULL
- * @return the exported block API
- */
-void *
-libgnunet_test_transport_plugin_cmd_simple_send_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_test_transport_plugin_block_test_init
- * @return NULL
- */
-void *
-libgnunet_test_transport_plugin_cmd_simple_send_done (void *cls)
-{
- struct GNUNET_TESTING_PluginFunctions *api = cls;
-
- GNUNET_free (api);
- GNUNET_free (testdir);
- GNUNET_free (cfgname);
- return NULL;
-}
-
-
-/* end of plugin_cmd_simple_send.c */
diff --git a/src/transport/test_transport_start_with_config.c b/src/transport/test_transport_start_with_config.c
new file mode 100644
index 000000000..795c157d7
--- /dev/null
+++ b/src/transport/test_transport_start_with_config.c
@@ -0,0 +1,85 @@
+/*
+ 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 transport/test_transport_start_with_config.c
+ * @brief Test case executing a script which sends a test message between two peers.
+ * @author t3sserakt
+ */
+#include "platform.h"
+#include "gnunet_testing_ng_lib.h"
+#include "gnunet_util_lib.h"
+
+#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 120)
+
+/**
+ * Return value of the test.
+ *
+ */
+static unsigned int rv = 0;
+
+static char *topology_config;
+
+/**
+ * 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_v2 ("netjail-start",
+ topology_config),
+ GNUNET_TESTING_cmd_netjail_start_testing_system_v2 ("netjail-start-testbed",
+ topology_config,
+ &rv),
+ GNUNET_TESTING_cmd_stop_testing_system_v2 ("stop-testbed",
+ "netjail-start-testbed",
+ topology_config),
+ GNUNET_TESTING_cmd_netjail_stop_v2 ("netjail-stop",
+ topology_config),
+ GNUNET_TESTING_cmd_end ()
+ };
+
+ GNUNET_TESTING_run (NULL,
+ commands,
+ TIMEOUT);
+}
+
+
+int
+main (int argc,
+ char *const *argv)
+{
+ GNUNET_log_setup ("test-netjail",
+ "DEBUG",
+ NULL);
+
+ topology_config = argv[1];
+
+ GNUNET_SCHEDULER_run (&run,
+ NULL);
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Test finished!\n");
+ return rv;
+}
diff --git a/src/transport/transport-testing-cmds.h b/src/transport/transport-testing-cmds.h
index f9ebafade..ecdabd35f 100644
--- a/src/transport/transport-testing-cmds.h
+++ b/src/transport/transport-testing-cmds.h
@@ -211,6 +211,14 @@ GNUNET_TRANSPORT_cmd_start_peer_v2 (const char *label,
const char *cfgname);
struct GNUNET_TESTING_Command
+GNUNET_TRANSPORT_cmd_start_peer_v3 (const char *label,
+ const char *system_label,
+ uint32_t no,
+ char *node_ip,
+ struct GNUNET_MQ_MessageHandler *handlers,
+ const char *cfgname);
+
+struct GNUNET_TESTING_Command
GNUNET_TRANSPORT_cmd_start_peer (const char *label,
const char *system_label,
char *m,
@@ -237,6 +245,14 @@ GNUNET_TRANSPORT_cmd_connect_peers_v2 (const char *label,
uint32_t num);
struct GNUNET_TESTING_Command
+GNUNET_TRANSPORT_cmd_connect_peers_v3 (const char *label,
+ const char *start_peer_label,
+ const char *create_label,
+ uint32_t num,
+ struct GNUNET_TESTING_NetjailTopology *
+ topology);
+
+struct GNUNET_TESTING_Command
GNUNET_TRANSPORT_cmd_send_simple (const char *label,
char *m,
char *n,
@@ -281,6 +297,16 @@ GNUNET_TRANSPORT_get_trait_connected_peers_map_v2 (const struct
*
*
connected_peers_map);
+
+int
+GNUNET_TRANSPORT_get_trait_connected_peers_map_v3 (const struct
+ GNUNET_TESTING_Command
+ *cmd,
+ struct
+ GNUNET_CONTAINER_MultiShortmap
+ *
+ *
+ connected_peers_map);
int
GNUNET_TRANSPORT_get_trait_hello_size (const struct
GNUNET_TESTING_Command
@@ -308,5 +334,12 @@ GNUNET_TRANSPORT_get_trait_application_handle_v2 (const struct
GNUNET_TRANSPORT_ApplicationHandle
**ah);
+int
+GNUNET_TRANSPORT_get_trait_application_handle_v3 (const struct
+ GNUNET_TESTING_Command *cmd,
+ struct
+ GNUNET_TRANSPORT_ApplicationHandle
+ **ah);
+
#endif
/* end of transport_testing.h */
diff --git a/src/transport/transport_api_cmd_connecting_peers_v3.c b/src/transport/transport_api_cmd_connecting_peers_v3.c
new file mode 100644
index 000000000..e90781637
--- /dev/null
+++ b/src/transport/transport_api_cmd_connecting_peers_v3.c
@@ -0,0 +1,508 @@
+/*
+ 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 "gnunet_transport_application_service.h"
+#include "gnunet_hello_lib.h"
+#include "gnunet_transport_service.h"
+#include "transport-testing-cmds.h"
+
+/**
+ * Generic logging shortcut
+ */
+#define LOG(kind, ...) GNUNET_log (kind, __VA_ARGS__)
+
+#define CONNECT_ADDRESS_TEMPLATE_TCP "tcp-192.168.15.%u:60002"
+
+#define CONNECT_ADDRESS_TEMPLATE_UDP "udp-192.168.15.%u:60002"
+
+#define ROUTER_CONNECT_ADDRESS_TEMPLATE_TCP "tcp-92.68.150.%u:60002"
+
+#define ROUTER_CONNECT_ADDRESS_TEMPLATE_UDP "udp-92.68.150.%u:60002"
+
+#define GLOBAL_CONNECT_ADDRESS_TEMPLATE_TCP "tcp-92.68.151.%u:60002"
+
+#define GLOBAL_CONNECT_ADDRESS_TEMPLATE_UDP "udp-92.68.151.%u:60002"
+
+#define PREFIX_TCP "tcp"
+
+#define PREFIX_UDP "udp"
+
+/**
+ * Struct to store information needed in callbacks.
+ *
+ */
+struct ConnectPeersState
+{
+ /**
+ * The testing system of this node.
+ */
+ struct GNUNET_TESTING_System *tl_system;
+
+ // Label of the cmd which started the test system.
+ const char *create_label;
+
+ /**
+ * Number globally identifying the node.
+ *
+ */
+ uint32_t num;
+
+ /**
+ * Label of the cmd to start a peer.
+ *
+ */
+ const char *start_peer_label;
+
+ /**
+ * The peer identity of this peer.
+ *
+ */
+ struct GNUNET_PeerIdentity *id;
+
+ /**
+ * The topology of the test setup.
+ */
+ struct GNUNET_TESTING_NetjailTopology *topology;
+
+ /**
+ * Connections to other peers.
+ */
+ struct GNUNET_TESTING_NodeConnection *node_connections_head;
+
+ /**
+ * Number of connections.
+ */
+ unsigned int con_num;
+};
+
+
+static struct GNUNET_PeerIdentity *
+get_pub_key (unsigned int num, struct GNUNET_TESTING_System *tl_system)
+{
+ struct GNUNET_PeerIdentity *peer = GNUNET_new (struct GNUNET_PeerIdentity);
+ struct GNUNET_CRYPTO_EddsaPublicKey *pub_key = GNUNET_new (struct
+ GNUNET_CRYPTO_EddsaPublicKey);
+ struct GNUNET_CRYPTO_EddsaPrivateKey *priv_key = GNUNET_new (struct
+ GNUNET_CRYPTO_EddsaPrivateKey);
+
+ priv_key = GNUNET_TESTING_hostkey_get (tl_system,
+ num,
+ peer);
+
+ GNUNET_CRYPTO_eddsa_key_get_public (priv_key,
+ pub_key);
+ peer->public_key = *pub_key;
+ return peer;
+}
+
+
+static int
+log_nodes (void *cls, const struct GNUNET_ShortHashCode *id, void *value)
+{
+ struct GNUNET_TESTING_NetjailNode *node = value;
+ struct GNUNET_TESTING_NodeConnection *pos_connection;
+ struct GNUNET_TESTING_ADDRESS_PREFIX *pos_prefix;
+
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "plugin: %s space: %u node: %u global: %u\n",
+ node->plugin,
+ node->namespace_n,
+ node->node_n,
+ node->is_global);
+
+ for (pos_connection = node->node_connections_head; NULL != pos_connection;
+ pos_connection = pos_connection->next)
+ {
+
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "namespace_n: %u node_n: %u node_type: %u\n",
+ pos_connection->namespace_n,
+ pos_connection->node_n,
+ pos_connection->node_type);
+
+ for (pos_prefix = pos_connection->address_prefixes_head; NULL != pos_prefix;
+ pos_prefix =
+ pos_prefix->next)
+ {
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "prefix: %s\n",
+ pos_prefix->address_prefix);
+ }
+ }
+ return GNUNET_YES;
+}
+
+
+static int
+log_namespaces (void *cls, const struct GNUNET_ShortHashCode *id, void *value)
+{
+ struct GNUNET_TESTING_NetjailNamespace *namespace = value;
+ struct GNUNET_TESTING_NetjailRouter *router = namespace->router;
+
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "router_tcp: %u router_udp: %u spaces: %u\n",
+ router->tcp_port,
+ router->udp_port,
+ namespace->namespace_n);
+ GNUNET_CONTAINER_multishortmap_iterate (namespace->nodes, &log_nodes, NULL);
+ return GNUNET_YES;
+}
+
+
+static int
+log_topo (struct GNUNET_TESTING_NetjailTopology *topology)
+{
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "plugin: %s spaces: %u nodes: %u known: %u\n",
+ topology->plugin,
+ topology->namespaces_n,
+ topology->nodes_m,
+ topology->nodes_x);
+
+ GNUNET_CONTAINER_multishortmap_iterate (topology->map_namespaces,
+ log_namespaces, NULL);
+ GNUNET_CONTAINER_multishortmap_iterate (topology->map_globals, &log_nodes,
+ NULL);
+ return GNUNET_YES;
+}
+
+
+static struct GNUNET_TESTING_NodeConnection *
+get_connections (unsigned int num, struct
+ GNUNET_TESTING_NetjailTopology *topology)
+{
+ struct GNUNET_TESTING_NetjailNode *node;
+ struct GNUNET_ShortHashCode *hkey;
+ struct GNUNET_HashCode hc;
+ struct GNUNET_TESTING_NetjailNamespace *namespace;
+ unsigned int namespace_n, node_m;
+
+ log_topo (topology);
+
+ hkey = GNUNET_new (struct GNUNET_ShortHashCode);
+ if (topology->nodes_x >= num)
+ {
+
+ GNUNET_CRYPTO_hash (&num, sizeof(num), &hc);
+ memcpy (hkey,
+ &hc,
+ sizeof (*hkey));
+ node = GNUNET_CONTAINER_multishortmap_get (topology->map_globals,
+ hkey);
+ }
+ else
+ {
+ namespace_n = (unsigned int) floor ((num - topology->nodes_x)
+ / topology->nodes_m);
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "num: %u nodes_x: %u nodes_m: %u namespace_n: %u\n",
+ num,
+ topology->nodes_x,
+ topology->nodes_m,
+ namespace_n);
+ hkey = GNUNET_new (struct GNUNET_ShortHashCode);
+ GNUNET_CRYPTO_hash (&namespace_n, sizeof(namespace_n), &hc);
+ memcpy (hkey,
+ &hc,
+ sizeof (*hkey));
+ namespace = GNUNET_CONTAINER_multishortmap_get (topology->map_namespaces,
+ hkey);
+ node_m = num - topology->nodes_x - topology->nodes_m * (namespace_n - 1);
+ hkey = GNUNET_new (struct GNUNET_ShortHashCode);
+ GNUNET_CRYPTO_hash (&node_m, sizeof(node_m), &hc);
+ memcpy (hkey,
+ &hc,
+ sizeof (*hkey));
+ node = GNUNET_CONTAINER_multishortmap_get (namespace->nodes,
+ hkey);
+ }
+
+
+ return node->node_connections_head;
+}
+
+
+static unsigned int
+calculate_num (struct GNUNET_TESTING_NodeConnection *node_connection,
+ struct GNUNET_TESTING_NetjailTopology *topology)
+{
+ unsigned int n, m, num;
+
+ n = node_connection->namespace_n;
+ m = node_connection->node_n;
+
+ if (0 == n)
+ num = m;
+ else
+ num = (n - 1) * topology->nodes_m + m + topology->nodes_x;
+
+ return num;
+}
+
+static char *
+get_address (struct GNUNET_TESTING_NodeConnection *connection,
+ char *prefix)
+{
+ struct GNUNET_TESTING_NetjailNode *node;
+ char *addr;
+
+ node = connection->node;
+ if (connection->namespace_n == node->namespace_n)
+ {
+ if (0 == strcmp (PREFIX_TCP, prefix))
+ {
+
+ GNUNET_asprintf (&addr,
+ CONNECT_ADDRESS_TEMPLATE_TCP,
+ connection->node_n);
+ }
+ else if (0 == strcmp (PREFIX_UDP, prefix))
+ {
+ GNUNET_asprintf (&addr,
+ CONNECT_ADDRESS_TEMPLATE_UDP,
+ connection->node_n);
+ }
+ else
+ {
+ GNUNET_break (0);
+ }
+ }
+ else
+ {
+ if (0 == strcmp (PREFIX_TCP, prefix))
+ {
+
+ GNUNET_asprintf (&addr,
+ ROUTER_CONNECT_ADDRESS_TEMPLATE_TCP,
+ connection->namespace_n);
+ }
+ else if (0 == strcmp (PREFIX_UDP, prefix))
+ {
+ GNUNET_asprintf (&addr,
+ ROUTER_CONNECT_ADDRESS_TEMPLATE_UDP,
+ connection->namespace_n);
+ }
+ else
+ {
+ GNUNET_break (0);
+ }
+ }
+
+ return addr;
+}
+
+
+/**
+ * The run method of this cmd will connect to peers.
+ *
+ */
+static void
+connect_peers_run (void *cls,
+ const struct GNUNET_TESTING_Command *cmd,
+ struct GNUNET_TESTING_Interpreter *is)
+{
+ struct ConnectPeersState *cps = cls;
+ const struct GNUNET_TESTING_Command *system_cmd;
+ struct GNUNET_TESTING_System *tl_system;
+
+
+ const struct GNUNET_TESTING_Command *peer1_cmd;
+ struct GNUNET_TRANSPORT_ApplicationHandle *ah;
+ struct GNUNET_PeerIdentity *peer;
+ char *addr;
+ enum GNUNET_NetworkType nt = 0;
+ uint32_t num;
+ struct GNUNET_TESTING_NodeConnection *pos_connection;
+ struct GNUNET_TESTING_ADDRESS_PREFIX *pos_prefix;
+ unsigned int con_num = 0;
+
+ peer1_cmd = GNUNET_TESTING_interpreter_lookup_command (cps->start_peer_label);
+ GNUNET_TRANSPORT_get_trait_application_handle_v2 (peer1_cmd,
+ &ah);
+
+ system_cmd = GNUNET_TESTING_interpreter_lookup_command (cps->create_label);
+ GNUNET_TESTING_get_trait_test_system (system_cmd,
+ &tl_system);
+
+ cps->tl_system = tl_system;
+
+ cps->node_connections_head = get_connections (cps->num, cps->topology);
+
+ for (pos_connection = cps->node_connections_head; NULL != pos_connection;
+ pos_connection = pos_connection->next)
+ {
+ con_num++;
+ num = calculate_num (pos_connection, cps->topology);
+ for (pos_prefix = pos_connection->address_prefixes_head; NULL != pos_prefix;
+ pos_prefix =
+ pos_prefix->next)
+ {
+
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "prefix: %s\n",
+ pos_prefix->address_prefix);
+
+ addr = get_address (pos_connection, pos_prefix->address_prefix);
+
+ peer = get_pub_key (num, tl_system);
+
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "num: %u pub_key %s addr: %s\n",
+ num,
+ GNUNET_CRYPTO_eddsa_public_key_to_string (&(peer->public_key)),
+ addr);
+
+ cps->id = peer;
+
+ GNUNET_TRANSPORT_application_validate (ah,
+ peer,
+ nt,
+ addr);
+ }
+ }
+ cps->con_num = con_num;
+}
+
+
+/**
+ * The finish function of this cmd will check if the peers we are trying to
+ * connect to are in the connected peers map of the start peer cmd for this peer.
+ *
+ */
+static int
+connect_peers_finish (void *cls,
+ GNUNET_SCHEDULER_TaskCallback cont,
+ void *cont_cls)
+{
+ struct ConnectPeersState *cps = cls;
+ const struct GNUNET_TESTING_Command *peer1_cmd;
+ struct GNUNET_CONTAINER_MultiShortmap *connected_peers_map;
+ unsigned int ret;
+ struct GNUNET_ShortHashCode *key = GNUNET_new (struct GNUNET_ShortHashCode);
+ struct GNUNET_HashCode hc;
+ struct GNUNET_PeerIdentity *peer;
+ unsigned int con_num = 0;
+ struct GNUNET_TESTING_NodeConnection *pos_connection;
+ unsigned int num;
+
+ peer1_cmd = GNUNET_TESTING_interpreter_lookup_command (cps->start_peer_label);
+ GNUNET_TRANSPORT_get_trait_connected_peers_map_v2 (peer1_cmd,
+ &connected_peers_map);
+
+ for (pos_connection = cps->node_connections_head; NULL != pos_connection;
+ pos_connection = pos_connection->next)
+ {
+ num = calculate_num (pos_connection, cps->topology);
+ peer = get_pub_key (num, cps->tl_system);
+ GNUNET_CRYPTO_hash (&(peer->public_key), sizeof(peer->public_key), &hc);
+ memcpy (key,
+ &hc,
+ sizeof (*key));
+ if (GNUNET_YES == GNUNET_CONTAINER_multishortmap_contains (
+ connected_peers_map,
+ key))
+ con_num++;
+ }
+
+
+
+ if (cps->con_num == con_num)
+ {
+ cont (cont_cls);
+ ret = GNUNET_YES;
+ }
+
+ GNUNET_free (key);
+ return ret;
+}
+
+
+/**
+ * Trait function of this cmd does nothing.
+ *
+ */
+static int
+connect_peers_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
+connect_peers_cleanup (void *cls,
+ const struct GNUNET_TESTING_Command *cmd)
+{
+ struct ConnectPeersState *cps = cls;
+
+ GNUNET_free (cps->id);
+ GNUNET_free (cps);
+}
+
+
+/**
+ * Create command.
+ *
+ * @param label name for command.
+ * @param start_peer_label Label of the cmd to start a peer.
+ * @return command.
+ */
+struct GNUNET_TESTING_Command
+GNUNET_TRANSPORT_cmd_connect_peers_v3 (const char *label,
+ const char *start_peer_label,
+ const char *create_label,
+ uint32_t num,
+ struct GNUNET_TESTING_NetjailTopology *
+ topology)
+{
+ struct ConnectPeersState *cps;
+
+ cps = GNUNET_new (struct ConnectPeersState);
+ cps->start_peer_label = start_peer_label;
+ cps->num = num;
+ cps->create_label = create_label;
+ cps->topology = topology;
+
+
+ struct GNUNET_TESTING_Command cmd = {
+ .cls = cps,
+ .label = label,
+ .run = &connect_peers_run,
+ .finish = &connect_peers_finish,
+ .cleanup = &connect_peers_cleanup,
+ .traits = &connect_peers_traits
+ };
+
+ return cmd;
+}
diff --git a/src/transport/transport_api_cmd_start_peer_v3.c b/src/transport/transport_api_cmd_start_peer_v3.c
new file mode 100644
index 000000000..b5cefecc8
--- /dev/null
+++ b/src/transport/transport_api_cmd_start_peer_v3.c
@@ -0,0 +1,619 @@
+/*
+ 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 "gnunet_peerstore_service.h"
+#include "gnunet_transport_core_service.h"
+#include "gnunet_transport_application_service.h"
+#include "transport-testing-cmds.h"
+
+/**
+ * Generic logging shortcut
+ */
+#define LOG(kind, ...) GNUNET_log (kind, __VA_ARGS__)
+
+
+static void
+retrieve_hello (void *cls);
+
+
+/**
+ * Callback delivering the hello of this peer from peerstore.
+ *
+ */
+static void
+hello_iter_cb (void *cb_cls,
+ const struct GNUNET_PEERSTORE_Record *record,
+ const char *emsg)
+{
+ struct StartPeerState_v2 *sps = cb_cls;
+ if (NULL == record)
+ {
+ sps->pic = NULL;
+ sps->rh_task = GNUNET_SCHEDULER_add_now (retrieve_hello, sps);
+ return;
+ }
+ // Check record type et al?
+ sps->hello_size = record->value_size;
+ sps->hello = GNUNET_malloc (sps->hello_size);
+ memcpy (sps->hello, record->value, sps->hello_size);
+ sps->hello[sps->hello_size - 1] = '\0';
+
+ GNUNET_PEERSTORE_iterate_cancel (sps->pic);
+ sps->pic = NULL;
+ sps->finished = GNUNET_YES;
+}
+
+
+/**
+ * Function to start the retrieval task to retrieve the hello of this peer
+ * from the peerstore.
+ *
+ */
+static void
+retrieve_hello (void *cls)
+{
+ struct StartPeerState_v2 *sps = cls;
+ sps->rh_task = NULL;
+ sps->pic = GNUNET_PEERSTORE_iterate (sps->ph,
+ "transport",
+ &sps->id,
+ GNUNET_PEERSTORE_TRANSPORT_HELLO_KEY,
+ hello_iter_cb,
+ sps);
+
+}
+
+
+/**
+ * This function checks StartPeerState_v2#finished, which is set when the hello was retrieved.
+ *
+ */
+static int
+start_peer_finish (void *cls,
+ GNUNET_SCHEDULER_TaskCallback cont,
+ void *cont_cls)
+{
+ struct StartPeerState_v2 *sps = cls;
+
+ if (GNUNET_YES == sps->finished)
+ {
+ cont (cont_cls);
+ }
+
+ return sps->finished;
+}
+
+
+/**
+ * Disconnect callback for the connection to the core service.
+ *
+ */
+static void
+notify_disconnect (void *cls,
+ const struct GNUNET_PeerIdentity *peer,
+ void *handler_cls)
+{
+ struct StartPeerState_v2 *sps = cls;
+
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Peer %s disconnected from peer %u (`%s')\n",
+ GNUNET_i2s (peer),
+ sps->no,
+ GNUNET_i2s (&sps->id));
+
+}
+
+
+/**
+ * Connect callback for the connection to the core service.
+ *
+ */
+static void *
+notify_connect (void *cls,
+ const struct GNUNET_PeerIdentity *peer,
+ struct GNUNET_MQ_Handle *mq)
+{
+ struct StartPeerState_v2 *sps = cls;
+ struct GNUNET_ShortHashCode *key = GNUNET_new (struct GNUNET_ShortHashCode);
+ struct GNUNET_HashCode hc;
+ struct GNUNET_CRYPTO_EddsaPublicKey public_key = peer->public_key;
+
+ void *ret = NULL;
+
+
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Peer %s connected to peer %u (`%s')\n",
+ GNUNET_i2s (peer),
+ sps->no,
+ GNUNET_i2s (&sps->id));
+
+ GNUNET_CRYPTO_hash (&public_key, sizeof(public_key), &hc);
+
+
+ memcpy (key,
+ &hc,
+ sizeof (*key));
+ GNUNET_CONTAINER_multishortmap_put (sps->connected_peers_map,
+ key,
+ mq,
+ GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
+
+ GNUNET_free (key);
+ // TODO what does the handler function need?
+ return ret;
+}
+
+
+/**
+ * The run method of this cmd will start all services of a peer to test the transport service.
+ *
+ */
+static void
+start_peer_run (void *cls,
+ const struct GNUNET_TESTING_Command *cmd,
+ struct GNUNET_TESTING_Interpreter *is)
+{
+ struct StartPeerState_v2 *sps = cls;
+ char *emsg = NULL;
+ struct GNUNET_PeerIdentity dummy;
+ const struct GNUNET_TESTING_Command *system_cmd;
+ struct GNUNET_TESTING_System *tl_system;
+ char *home;
+ char *transport_unix_path;
+ char *tcp_communicator_unix_path;
+ char *udp_communicator_unix_path;
+ char *bindto;
+
+ if (GNUNET_NO == GNUNET_DISK_file_test (sps->cfgname))
+ {
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "File not found: `%s'\n",
+ sps->cfgname);
+ GNUNET_TESTING_interpreter_fail ();
+ return;
+ }
+
+
+ sps->cfg = GNUNET_CONFIGURATION_create ();
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_CONFIGURATION_load (sps->cfg, sps->cfgname));
+
+ GNUNET_asprintf (&home,
+ "$GNUNET_TMP/test-transport/api-tcp-p%u",
+ sps->no);
+
+ GNUNET_asprintf (&transport_unix_path,
+ "$GNUNET_RUNTIME_DIR/tng-p%u.sock",
+ sps->no);
+
+ GNUNET_asprintf (&tcp_communicator_unix_path,
+ "$GNUNET_RUNTIME_DIR/tcp-comm-p%u.sock",
+ sps->no);
+
+ GNUNET_asprintf (&udp_communicator_unix_path,
+ "$GNUNET_RUNTIME_DIR/tcp-comm-p%u.sock",
+ sps->no);
+
+ GNUNET_asprintf (&bindto,
+ "%s:60002",
+ sps->node_ip);
+
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "node_ip %s\n",
+ bindto);
+
+ GNUNET_CONFIGURATION_set_value_string (sps->cfg, "PATHS", "GNUNET_TEST_HOME",
+ home);
+ GNUNET_CONFIGURATION_set_value_string (sps->cfg, "transport", "UNIXPATH",
+ transport_unix_path);
+ GNUNET_CONFIGURATION_set_value_string (sps->cfg, "communicator-tcp",
+ "BINDTO",
+ bindto);
+ GNUNET_CONFIGURATION_set_value_string (sps->cfg, "communicator-udp",
+ "BINDTO",
+ bindto);
+ GNUNET_CONFIGURATION_set_value_string (sps->cfg, "communicator-tcp",
+ "UNIXPATH",
+ tcp_communicator_unix_path);
+ GNUNET_CONFIGURATION_set_value_string (sps->cfg, "communicator-udp",
+ "UNIXPATH",
+ udp_communicator_unix_path);
+
+ system_cmd = GNUNET_TESTING_interpreter_lookup_command (sps->system_label);
+ GNUNET_TESTING_get_trait_test_system (system_cmd,
+ &tl_system);
+
+ sps->tl_system = tl_system;
+
+ if (GNUNET_SYSERR ==
+ GNUNET_TESTING_configuration_create (tl_system,
+ sps->cfg))
+ {
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "Testing library failed to create unique configuration based on `%s'\n",
+ sps->cfgname);
+ GNUNET_CONFIGURATION_destroy (sps->cfg);
+ GNUNET_TESTING_interpreter_fail ();
+ return;
+ }
+
+ sps->peer = GNUNET_TESTING_peer_configure (sps->tl_system,
+ sps->cfg,
+ sps->no,
+ NULL,
+ &emsg);
+ if (NULL == sps->peer)
+ {
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "Testing library failed to create unique configuration based on `%s': `%s'\n",
+ sps->cfgname,
+ emsg);
+ GNUNET_free (emsg);
+ GNUNET_TESTING_interpreter_fail ();
+ return;
+ }
+
+ if (GNUNET_OK != GNUNET_TESTING_peer_start (sps->peer))
+ {
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "Testing library failed to create unique configuration based on `%s'\n",
+ sps->cfgname);
+ GNUNET_free (emsg);
+ GNUNET_TESTING_interpreter_fail ();
+ return;
+ }
+
+ memset (&dummy,
+ '\0',
+ sizeof(dummy));
+
+ GNUNET_TESTING_peer_get_identity (sps->peer,
+ &sps->id);
+
+ if (0 == memcmp (&dummy,
+ &sps->id,
+ sizeof(struct GNUNET_PeerIdentity)))
+ {
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "Testing library failed to obtain peer identity for peer %u\n",
+ sps->no);
+ GNUNET_free (emsg);
+ GNUNET_TESTING_interpreter_fail ();
+ return;
+ }
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Peer %u configured with identity `%s'\n",
+ sps->no,
+ GNUNET_i2s_full (&sps->id));
+
+ sps->th = GNUNET_TRANSPORT_core_connect (sps->cfg,
+ NULL,
+ sps->handlers,
+ sps,
+ &notify_connect,
+ &notify_disconnect);
+ if (NULL == sps->th)
+ {
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "Failed to connect to transport service for peer `%s': `%s'\n",
+ sps->cfgname,
+ emsg);
+ GNUNET_free (emsg);
+ GNUNET_TESTING_interpreter_fail ();
+ return;
+ }
+
+ sps->ph = GNUNET_PEERSTORE_connect (sps->cfg);
+ if (NULL == sps->th)
+ {
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "Failed to connect to peerstore service for peer `%s': `%s'\n",
+ sps->cfgname,
+ emsg);
+ GNUNET_free (emsg);
+ GNUNET_TESTING_interpreter_fail ();
+ return;
+ }
+
+ sps->ah = GNUNET_TRANSPORT_application_init (sps->cfg);
+ if (NULL == sps->ah)
+ {
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "Failed to initialize the TRANSPORT application suggestion client handle for peer `%s': `%s'\n",
+ sps->cfgname,
+ emsg);
+ GNUNET_free (emsg);
+ GNUNET_TESTING_interpreter_fail ();
+ return;
+ }
+ sps->rh_task = GNUNET_SCHEDULER_add_now (retrieve_hello, sps);
+}
+
+
+/**
+ * The cleanup function of this cmd frees resources the cmd allocated.
+ *
+ */
+static void
+start_peer_cleanup (void *cls,
+ const struct GNUNET_TESTING_Command *cmd)
+{
+ struct StartPeerState_v2 *sps = cls;
+
+ if (NULL != sps->handlers)
+ {
+ GNUNET_free (sps->handlers);
+ sps->handlers = NULL;
+ }
+ if (NULL != sps->cfg)
+ {
+ GNUNET_CONFIGURATION_destroy (sps->cfg);
+ sps->cfg = NULL;
+ }
+ GNUNET_free (sps->hello);
+ GNUNET_free (sps->connected_peers_map);
+ GNUNET_free (sps);
+}
+
+
+/**
+ * This function prepares an array with traits.
+ *
+ */
+static int
+start_peer_traits (void *cls,
+ const void **ret,
+ const char *trait,
+ unsigned int index)
+{
+ struct StartPeerState_v2 *sps = cls;
+ struct GNUNET_TRANSPORT_ApplicationHandle *ah = sps->ah;
+ struct GNUNET_PeerIdentity *id = &sps->id;
+ struct GNUNET_CONTAINER_MultiShortmap *connected_peers_map =
+ sps->connected_peers_map;
+ char *hello = sps->hello;
+ size_t hello_size = sps->hello_size;
+
+
+ struct GNUNET_TESTING_Trait traits[] = {
+ {
+ .index = 0,
+ .trait_name = "application_handle",
+ .ptr = (const void *) ah,
+ },
+ {
+ .index = 1,
+ .trait_name = "peer_id",
+ .ptr = (const void *) id,
+ },
+ {
+ .index = 2,
+ .trait_name = "connected_peers_map",
+ .ptr = (const void *) connected_peers_map,
+ },
+ {
+ .index = 3,
+ .trait_name = "hello",
+ .ptr = (const void *) hello,
+ },
+ {
+ .index = 4,
+ .trait_name = "hello_size",
+ .ptr = (const void *) hello_size,
+ },
+ {
+ .index = 5,
+ .trait_name = "state",
+ .ptr = (const void *) sps,
+ },
+ GNUNET_TESTING_trait_end ()
+ };
+
+ return GNUNET_TESTING_get_trait (traits,
+ ret,
+ trait,
+ index);
+}
+
+
+/**
+ * Function to get the trait with the struct StartPeerState_v2.
+ *
+ * @param[out] sps struct StartPeerState_v2.
+ * @return #GNUNET_OK if no error occurred, #GNUNET_SYSERR otherwise.
+ *
+ */
+int
+GNUNET_TRANSPORT_get_trait_state_v3 (const struct
+ GNUNET_TESTING_Command
+ *cmd,
+ struct StartPeerState_v2 **sps)
+{
+ return cmd->traits (cmd->cls,
+ (const void **) sps,
+ "state",
+ (unsigned int) 5);
+}
+
+
+/**
+ * Function to get the trait with the size of the hello.
+ *
+ * @param[out] hello_size size of hello.
+ * @return #GNUNET_OK if no error occurred, #GNUNET_SYSERR otherwise.
+ *
+ */
+int
+GNUNET_TRANSPORT_get_trait_hello_size_v3 (const struct
+ GNUNET_TESTING_Command
+ *cmd,
+ size_t **hello_size)
+{
+ return cmd->traits (cmd->cls,
+ (const void **) hello_size,
+ "hello_size",
+ (unsigned int) 4);
+}
+
+
+/**
+ * Function to get the trait with the hello.
+ *
+ * @param[out] hello The hello for the peer.
+ * @return #GNUNET_OK if no error occurred, #GNUNET_SYSERR otherwise.
+ *
+ */
+int
+GNUNET_TRANSPORT_get_trait_hello_v3 (const struct
+ GNUNET_TESTING_Command
+ *cmd,
+ char **hello)
+{
+ return cmd->traits (cmd->cls,
+ (const void **) hello,
+ "hello",
+ (unsigned int) 3);
+}
+
+
+/**
+ * Function to get the trait with the map of connected peers.
+ *
+ * @param[out] connected_peers_map The map with connected peers.
+ * @return #GNUNET_OK if no error occurred, #GNUNET_SYSERR otherwise.
+ *
+ */
+int
+GNUNET_TRANSPORT_get_trait_connected_peers_map_v3 (const struct
+ GNUNET_TESTING_Command
+ *cmd,
+ struct
+ GNUNET_CONTAINER_MultiShortmap
+ *
+ *
+ connected_peers_map)
+{
+ return cmd->traits (cmd->cls,
+ (const void **) connected_peers_map,
+ "connected_peers_map",
+ (unsigned int) 2);
+}
+
+
+/**
+ * Function to get the trait with the transport application handle.
+ *
+ * @param[out] ah The application handle.
+ * @return #GNUNET_OK if no error occurred, #GNUNET_SYSERR otherwise.
+ */
+int
+GNUNET_TRANSPORT_get_trait_application_handle_v3 (const struct
+ GNUNET_TESTING_Command *cmd,
+ struct
+ GNUNET_TRANSPORT_ApplicationHandle
+ **ah)
+{
+ return cmd->traits (cmd->cls,
+ (const void **) ah,
+ "application_handle",
+ (unsigned int) 0);
+}
+
+
+/**
+ * Function to get the trait with the peer id.
+ *
+ * @param[out] id The peer id.
+ * @return #GNUNET_OK if no error occurred, #GNUNET_SYSERR otherwise.
+ */
+int
+GNUNET_TRANSPORT_get_trait_peer_id_v3 (const struct
+ GNUNET_TESTING_Command *cmd,
+ struct GNUNET_PeerIdentity **id)
+{
+ return cmd->traits (cmd->cls,
+ (const void **) id,
+ "peer_id",
+ (unsigned int) 1);
+}
+
+
+/**
+ * Create command.
+ *
+ * @param label name for command.
+ * @param system_label Label of the cmd to setup a test environment.
+ * @param m The number of the local node of the actual network namespace.
+ * @param n The number of the actual namespace.
+ * @param local_m Number of local nodes in each namespace.
+ * @param handlers Handler for messages received by this peer.
+ * @param cfgname Configuration file name for this peer.
+ * @return command.
+ */
+struct GNUNET_TESTING_Command
+GNUNET_TRANSPORT_cmd_start_peer_v3 (const char *label,
+ const char *system_label,
+ uint32_t no,
+ char *node_ip,
+ struct GNUNET_MQ_MessageHandler *handlers,
+ const char *cfgname)
+{
+ struct StartPeerState_v2 *sps;
+ struct GNUNET_CONTAINER_MultiShortmap *connected_peers_map =
+ GNUNET_CONTAINER_multishortmap_create (1,GNUNET_NO);
+ unsigned int i;
+
+ sps = GNUNET_new (struct StartPeerState_v2);
+ sps->no = no;
+ sps->system_label = system_label;
+ sps->connected_peers_map = connected_peers_map;
+ sps->cfgname = cfgname;
+ sps->node_ip = node_ip;
+
+ if (NULL != handlers)
+ {
+ for (i = 0; NULL != handlers[i].cb; i++)
+ ;
+ sps->handlers = GNUNET_new_array (i + 1,
+ struct GNUNET_MQ_MessageHandler);
+ GNUNET_memcpy (sps->handlers,
+ handlers,
+ i * sizeof(struct GNUNET_MQ_MessageHandler));
+ }
+
+ struct GNUNET_TESTING_Command cmd = {
+ .cls = sps,
+ .label = label,
+ .run = &start_peer_run,
+ .finish = &start_peer_finish,
+ .cleanup = &start_peer_cleanup,
+ .traits = &start_peer_traits
+ };
+
+ return cmd;
+}