GNUnet 0.21.2
transport_api_cmd_connecting_peers.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet
3 Copyright (C) 2021 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20
26#include "platform.h"
27#include "gnunet_util_lib.h"
28#include "gnunet_testing_lib.h"
29#include "gnunet_testbed_lib.h"
30#include "gnunet_transport_testing_ng_lib.h"
33
37#define LOG(kind, ...) GNUNET_log (kind, __VA_ARGS__)
38
43static void
46{
47 struct ConnectPeersState *cps = cls;
48 const struct GNUNET_TESTING_Command *system_cmd;
49 const struct GNUNET_TESTBED_System *tl_system;
50
51
52 const struct GNUNET_TESTING_Command *peer1_cmd;
54 struct GNUNET_PeerIdentity *peer;
55 char *addr;
56 char *addr_and_port;
57 enum GNUNET_NetworkType nt = 0;
58 uint32_t num;
59 struct GNUNET_TESTING_NodeConnection *pos_connection;
60 struct GNUNET_TESTING_AddressPrefix *pos_prefix;
61 unsigned int con_num = 0;
62 const enum GNUNET_GenericReturnValue *broadcast;
63
64 cps->is = is;
66 cps->start_peer_label);
67 if (GNUNET_YES == cps->wait_for_connect)
68 {
70 "Wait for connect.\n");
72 &ah);
73 }
74 else
75 {
77 "Not waiting for connect.\n");
79 &ah);
80 }
81
83 &broadcast);
84
86 cps->create_label);
87 GNUNET_TESTBED_get_trait_test_system (system_cmd,
88 &tl_system);
89
90 cps->tl_system = tl_system;
91
93 "cps->num: %u \n",
94 cps->num);
95
97 cps->topology);
98
99 for (pos_connection = cps->node_connections_head; NULL != pos_connection;
100 pos_connection = pos_connection->next)
101 {
102 con_num++;
103 num = GNUNET_TESTING_calculate_num (pos_connection, cps->topology);
104 for (pos_prefix = pos_connection->address_prefixes_head; NULL != pos_prefix;
105 pos_prefix =
106 pos_prefix->next)
107 {
108 addr = GNUNET_TESTING_get_address (pos_connection,
109 pos_prefix->address_prefix);
110 if (NULL != addr)
111 {
112 char *natted_p = strstr (pos_prefix->address_prefix, "_");
113
115 "0 validating peer number %s %s %s\n",
116 natted_p,
117 pos_prefix->address_prefix,
118 addr);
119 if (0 == GNUNET_memcmp (pos_prefix->address_prefix, "udp"))
121 "validating memcmp\n");
122 if (GNUNET_YES == *broadcast)
124 "validating broadcast\n");
125 if ((0 == GNUNET_memcmp (pos_prefix->address_prefix, "udp")) &&
126 (GNUNET_YES == *broadcast) )
127 GNUNET_asprintf (&addr_and_port,
128 "%s:2086",
129 addr);
130 else if (NULL == natted_p)
131 GNUNET_asprintf (&addr_and_port,
132 "%s:60002",
133 addr);
134 else if (NULL != natted_p)
135 {
136 char *prefix;
137 char *rest;
138 char *address;
139
140 prefix = strtok (addr, "_");
141 rest = strtok (NULL, "_");
142 strtok (rest, "-");
143 address = strtok (NULL, "-");
144
145 GNUNET_asprintf (&addr_and_port,
146 "%s-%s:0",
147 prefix,
148 address);
149
150 }
151 peer = GNUNET_TESTING_get_peer (num, tl_system);
153 "validating peer number %u with identity %s and address %s %u %s and handle %p\n",
154 num,
155 GNUNET_i2s (peer),
156 addr_and_port,
157 *broadcast,
158 pos_prefix->address_prefix,
159 ah);
162 *) ah,
163 peer,
164 nt,
165 addr_and_port);
166 GNUNET_free (peer);
167 GNUNET_free (addr);
168 GNUNET_free (addr_and_port);
169 }
170 }
171 }
172 cps->con_num = con_num;
173}
174
175
180static void *
182 const struct GNUNET_PeerIdentity *peer)
183{
184 const struct GNUNET_TESTING_Command *cmd;
185 struct ConnectPeersState *cps;
186 struct GNUNET_PeerIdentity *peer_connection;
187 unsigned int num;
188 unsigned int con_num;
189 void *ret = NULL;
190
191 cmd = GNUNET_TESTING_interpreter_lookup_command_all (is,
192 "connect-peers");
193 cps = cmd->cls; // WTF? Never go directly into cls of another command! FIXME!
194 con_num = cps->con_num_notified;
195 for (struct GNUNET_TESTING_NodeConnection *pos_connection =
197 NULL != pos_connection;
198 pos_connection = pos_connection->next)
199 {
200 num = GNUNET_TESTING_calculate_num (pos_connection,
201 cps->topology);
202 peer_connection = GNUNET_TESTING_get_peer (num,
203 cps->tl_system);
204 if (0 == GNUNET_memcmp (peer,
205 peer_connection))
206 cps->con_num_notified++;
207 GNUNET_free (peer_connection);
208 }
209 if (cps->con_num_notified == con_num)
211
213 "con_num: %u add: %u num_notified: %u add_notified: %u peer: %s\n",
214 cps->con_num,
216 cps->con_num_notified,
218 GNUNET_i2s (peer));
219 if ((cps->con_num == cps->con_num_notified) &&
221 {
223 }
224 return ret;
225}
226
227
232static void
234{
235 struct ConnectPeersState *cps = cls;
236
237 GNUNET_free (cps);
238}
239
240
247 const void **ret,
248 const char *trait,
249 unsigned int index)
250{
251 struct ConnectPeersState *cps = cls;
252 struct GNUNET_TESTING_Trait traits[] = {
253 GNUNET_TRANSPORT_TESTING_make_trait_connect_peer_state ((const void *) cps),
255 };
257 ret,
258 trait,
259 index);
260}
261
262
265 const char *start_peer_label,
266 const char *create_label,
267 uint32_t num,
269 topology,
270 unsigned int additional_connects,
271 unsigned int wait_for_connect)
272{
273 struct ConnectPeersState *cps;
274 unsigned int node_additional_connects;
275
276 node_additional_connects = GNUNET_TESTING_get_additional_connects (num,
277 topology);
278
280 "global: %u and local: %u additional_connects\n",
282 node_additional_connects);
283
284 if (0 != node_additional_connects)
285 additional_connects = node_additional_connects;
286
287 cps = GNUNET_new (struct ConnectPeersState);
289 cps->num = num;
291 cps->topology = topology;
295
296 // FIXME: wrap with cmd_make_unblocking!
299 label,
303 &cps->ac);
304 else
305 return GNUNET_TESTING_command_new (cps,
306 label,
310}
311
312
313// FIXME: likely not ideally placed here, move to its own file
315 GNUNET_TRANSPORT_TESTING)
static int ret
Final status code.
Definition: gnunet-arm.c:94
static struct GNUNET_TESTING_Interpreter * is
static int prefix
If printing the value of PREFIX has been requested.
Definition: gnunet-config.c:66
static char * address
GNS address for this phone.
static struct GNUNET_NAT_AUTO_AutoHandle * ah
Handle to ongoing autoconfiguration.
static struct GNUNET_NAT_AUTO_Test * nt
Handle to a NAT test operation.
struct GNUNET_TESTING_Command GNUNET_TESTING_command_new_ac(void *cls, const char *label, GNUNET_TESTING_CommandRunRoutine run, GNUNET_TESTING_CommandCleanupRoutine cleanup, GNUNET_TESTING_CommandGetTraits traits, struct GNUNET_TESTING_AsyncContext *ac)
Create a new command that may be asynchronous.
void GNUNET_TESTING_async_finish(struct GNUNET_TESTING_AsyncContext *ac)
The asynchronous command of ac has finished.
#define GNUNET_TESTING_MAKE_IMPL_SIMPLE_TRAIT(prefix, name, type)
Create C implementation for a trait with name name for statically allocated data of type type.
const struct GNUNET_TESTING_Command * GNUNET_TESTING_interpreter_lookup_command(struct GNUNET_TESTING_Interpreter *is, const char *label)
Lookup command by label.
#define GNUNET_TESTING_command_new(cls, label, run, cleanup, traits)
Create a new command.
struct GNUNET_TESTING_Trait GNUNET_TESTING_trait_end(void)
"end" of traits array.
enum GNUNET_GenericReturnValue GNUNET_TESTING_get_trait(const struct GNUNET_TESTING_Trait *traits, const void **ret, const char *trait, unsigned int index)
Obtain value of a trait from a command.
#define GNUNET_TRANSPORT_TESTING_SIMPLE_TRAITS(op, prefix)
Call op on all simple traits.
enum GNUNET_GenericReturnValue GNUNET_TRANSPORT_TESTING_get_trait_broadcast(const struct GNUNET_TESTING_Command *cmd, const enum GNUNET_GenericReturnValue **ret)
struct GNUNET_PeerIdentity * GNUNET_TESTING_get_peer(unsigned int num, const struct GNUNET_TESTING_System *tl_system)
Retrieve peer identity from the test system with the unique node id.
enum GNUNET_GenericReturnValue GNUNET_TRANSPORT_TESTING_get_trait_application_handle(const struct GNUNET_TESTING_Command *cmd, const struct GNUNET_TRANSPORT_ApplicationHandle **ret)
Bandwidth allocation API for applications to interact with.
void GNUNET_TRANSPORT_application_validate(struct GNUNET_TRANSPORT_ApplicationHandle *ch, const struct GNUNET_PeerIdentity *peer, enum GNUNET_NetworkType nt, const char *addr)
An application (or a communicator) has received a HELLO (or other address data of another peer) and w...
#define GNUNET_log(kind,...)
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
GNUNET_GenericReturnValue
Named constants for return values.
@ GNUNET_YES
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_DEBUG
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
GNUNET_NetworkType
Types of networks (with separate quotas) we support.
Definition: gnunet_nt_lib.h:44
Struct to store information needed in callbacks.
struct GNUNET_TESTING_AsyncContext ac
Context for our asynchronous completion.
unsigned int con_num
Number of connections.
uint32_t num
Number globally identifying the node.
unsigned int additional_connects_notified
Number of additional connects this cmd will wait for not triggered by this cmd we already have a noti...
GNUNET_TESTING_notify_connect_cb notify_connect
struct GNUNET_TESTING_Interpreter * is
struct GNUNET_TESTING_NodeConnection * node_connections_head
Connections to other peers.
struct GNUNET_TESTING_NetjailTopology * topology
The topology of the test setup.
unsigned int wait_for_connect
Flag indicating, whether the command is waiting for peers to connect that are configured to connect.
unsigned int con_num_notified
Number of connections we already have a notification for.
const struct GNUNET_TESTBED_System * tl_system
The testing system of this node.
const char * start_peer_label
Label of the cmd to start a peer.
unsigned int additional_connects
Number of additional connects this cmd will wait for not triggered by this cmd.
The identity of the host (wraps the signing key of the peer).
Handle for a system on which GNUnet peers are executed; a system is used for reserving unique paths a...
Definition: testbed.c:54
Protocol address prefix für a connection between nodes.
struct GNUNET_TESTING_AddressPrefix * next
Pointer to the next prefix in the DLL.
char * address_prefix
The address prefix.
A command to be run by the interpreter.
struct GNUNET_TESTING_CommandLabel label
Label for the command.
void * cls
Closure for all commands with command-specific context information.
Global state of the interpreter, used by a command to access information about other commands.
Toplogy of our netjail setup.
unsigned int additional_connects
Additional connects we do expect, beside the connects which are configured in the topology.
Connection to another node.
struct GNUNET_TESTING_NodeConnection * next
Pointer to the next connection in the DLL.
struct GNUNET_TESTING_AddressPrefix * address_prefixes_head
Head of the DLL with the address prefixes for the protocols this node is reachable.
A struct GNUNET_TESTING_Trait can be used to exchange data between cmds.
unsigned int index
Index number associated with the trait.
Handle to the TRANSPORT subsystem for application management.
static enum GNUNET_GenericReturnValue traits(void *cls, const void **ret, const char *trait, unsigned int index)
This function prepares an array with traits.
unsigned int GNUNET_TESTING_get_additional_connects(unsigned int num, struct GNUNET_TESTING_NetjailTopology *topology)
Get the number of unintentional additional connections the node waits for.
struct GNUNET_TESTING_NodeConnection * GNUNET_TESTING_get_connections(unsigned int num, const struct GNUNET_TESTING_NetjailTopology *topology)
Get the connections to other nodes for a specific node.
unsigned int GNUNET_TESTING_calculate_num(struct GNUNET_TESTING_NodeConnection *node_connection, struct GNUNET_TESTING_NetjailTopology *topology)
Deallocate memory of the struct GNUNET_TESTING_NetjailTopology.
char * GNUNET_TESTING_get_address(struct GNUNET_TESTING_NodeConnection *connection, const char *prefix)
Get the address for a specific communicator from a connection.
static void connect_peers_run(void *cls, struct GNUNET_TESTING_Interpreter *is)
The run method of this cmd will connect to peers.
struct GNUNET_TESTING_Command GNUNET_TRANSPORT_cmd_connect_peers(const char *label, const char *start_peer_label, const char *create_label, uint32_t num, struct GNUNET_TESTING_NetjailTopology *topology, unsigned int additional_connects, unsigned int wait_for_connect)
Create command.
static void * notify_connect(struct GNUNET_TESTING_Interpreter *is, const struct GNUNET_PeerIdentity *peer)
Callback from start peer cmd for signaling a peer got connected.
#define LOG(kind,...)
Generic logging shortcut.
static void connect_peers_cleanup(void *cls)
The cleanup function of this cmd frees resources the cmd allocated.
enum GNUNET_GenericReturnValue connect_peers_traits(void *cls, const void **ret, const char *trait, unsigned int index)
This function prepares an array with traits.