GNUnet  0.20.0
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_ng_lib.h"
31 #include "gnunet_hello_lib.h"
33 #include "transport-testing-cmds.h"
34 
38 #define LOG(kind, ...) GNUNET_log (kind, __VA_ARGS__)
39 
44 static void
45 connect_peers_run (void *cls,
47 {
48  struct ConnectPeersState *cps = cls;
49  const struct GNUNET_TESTING_Command *system_cmd;
50  const struct GNUNET_TESTING_System *tl_system;
51 
52 
53  const struct GNUNET_TESTING_Command *peer1_cmd;
55  struct GNUNET_PeerIdentity *peer;
56  char *addr;
57  char *addr_and_port;
58  enum GNUNET_NetworkType nt = 0;
59  uint32_t num;
60  struct GNUNET_TESTING_NodeConnection *pos_connection;
61  struct GNUNET_TESTING_AddressPrefix *pos_prefix;
62  unsigned int con_num = 0;
63  const enum GNUNET_GenericReturnValue *broadcast;
64 
65  cps->is = is;
67  cps->start_peer_label);
69  &ah);
71  &broadcast);
72 
74  cps->create_label);
76  &tl_system);
77 
78  cps->tl_system = tl_system;
79 
81  "cps->num: %u \n",
82  cps->num);
83 
85  cps->topology);
86 
87  for (pos_connection = cps->node_connections_head; NULL != pos_connection;
88  pos_connection = pos_connection->next)
89  {
90  con_num++;
91  num = GNUNET_TESTING_calculate_num (pos_connection, cps->topology);
92  for (pos_prefix = pos_connection->address_prefixes_head; NULL != pos_prefix;
93  pos_prefix =
94  pos_prefix->next)
95  {
96  addr = GNUNET_TESTING_get_address (pos_connection,
97  pos_prefix->address_prefix);
98  if (NULL != addr)
99  {
100  char *natted_p = strstr (pos_prefix->address_prefix, "_");
101 
103  "0 validating peer number %s %s %s\n",
104  natted_p,
105  pos_prefix->address_prefix,
106  addr);
107  if (0 == GNUNET_memcmp (pos_prefix->address_prefix, "udp"))
109  "validating memcmp\n");
110  if (GNUNET_YES == *broadcast)
112  "validating broadcast\n");
113  if ((0 == GNUNET_memcmp (pos_prefix->address_prefix, "udp")) &&
114  (GNUNET_YES == *broadcast) )
115  GNUNET_asprintf (&addr_and_port,
116  "%s:2086",
117  addr);
118  else if (NULL == natted_p)
119  GNUNET_asprintf (&addr_and_port,
120  "%s:60002",
121  addr);
122  else if (NULL != natted_p)
123  {
124  char *prefix;
125  char *rest;
126  char *rest2;
127  char *address;
128 
129  prefix = strtok (addr, "_");
130  rest = strtok (NULL, "_");
131  rest2 = strtok (rest, "-");
132  address = strtok (NULL, "-");
133 
134  GNUNET_asprintf (&addr_and_port,
135  "%s-%s:0",
136  prefix,
137  address);
138 
139  }
140  peer = GNUNET_TESTING_get_peer (num, tl_system);
142  "validating peer number %u with identity %s and address %s %u %s\n",
143  num,
144  GNUNET_i2s (peer),
145  addr_and_port,
146  *broadcast,
147  pos_prefix->address_prefix);
150  *) ah,
151  peer,
152  nt,
153  addr_and_port);
154  GNUNET_free (peer);
155  GNUNET_free (addr);
156  GNUNET_free (addr_and_port);
157  }
158  }
159  }
160  cps->con_num = con_num;
161 }
162 
163 
168 static void *
170  const struct GNUNET_PeerIdentity *peer)
171 {
172  const struct GNUNET_TESTING_Command *cmd;
173  struct ConnectPeersState *cps;
174  struct GNUNET_PeerIdentity *peer_connection;
175  unsigned int num;
176  unsigned int con_num;
177  void *ret = NULL;
178 
180  "connect-peers");
181  cps = cmd->cls; // WTF? Never go directly into cls of another command! FIXME!
182  con_num = cps->con_num_notified;
183  for (struct GNUNET_TESTING_NodeConnection *pos_connection =
185  NULL != pos_connection;
186  pos_connection = pos_connection->next)
187  {
188  num = GNUNET_TESTING_calculate_num (pos_connection,
189  cps->topology);
190  peer_connection = GNUNET_TESTING_get_peer (num,
191  cps->tl_system);
192  if (0 == GNUNET_memcmp (peer,
193  peer_connection))
194  cps->con_num_notified++;
195  GNUNET_free (peer_connection);
196  }
197  if (cps->con_num_notified == con_num)
199 
201  "con_num: %u add: %u num_notified: %u add_notified: %u peer: %s\n",
202  cps->con_num,
203  cps->additional_connects,
204  cps->con_num_notified,
206  GNUNET_i2s (peer));
207  if ((cps->con_num == cps->con_num_notified) &&
209  {
211  }
212  return ret;
213 }
214 
215 
220 static void
222 {
223  struct ConnectPeersState *cps = cls;
224 
225  GNUNET_free (cps);
226 }
227 
228 
234 connect_peers_traits (void *cls,
235  const void **ret,
236  const char *trait,
237  unsigned int index)
238 {
239  struct ConnectPeersState *cps = cls;
240  struct GNUNET_TESTING_Trait traits[] = {
243  };
244  return GNUNET_TESTING_get_trait (traits,
245  ret,
246  trait,
247  index);
248 }
249 
250 
253  const char *start_peer_label,
254  const char *create_label,
255  uint32_t num,
257  topology,
258  unsigned int additional_connects)
259 {
260  struct ConnectPeersState *cps;
261  unsigned int node_additional_connects;
262 
263  node_additional_connects = GNUNET_TESTING_get_additional_connects (num,
264  topology);
265 
267  "global: %u and local: %u additional_connects\n",
269  node_additional_connects);
270 
271  if (0 != node_additional_connects)
272  additional_connects = node_additional_connects;
273 
274  cps = GNUNET_new (struct ConnectPeersState);
276  cps->num = num;
277  cps->create_label = create_label;
278  cps->topology = topology;
281 
282  return GNUNET_TESTING_command_new (cps,
283  label,
287  &cps->ac);
288 }
enum GNUNET_TESTBED_TopologyOption topology
The topology to generate.
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
struct GNUNET_TESTING_Interpreter * is
static int prefix
If printing the value of PREFIX has been requested.
Definition: gnunet-config.c:59
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.
Helper library for handling HELLOs.
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.
Definition: testing.c:2447
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.
Definition: testing.c:2251
unsigned int GNUNET_TESTING_calculate_num(struct GNUNET_TESTING_NodeConnection *node_connection, struct GNUNET_TESTING_NetjailTopology *topology)
Calculate the unique id identifying a node from a given connection.
Definition: testing.c:2361
char * GNUNET_TESTING_get_address(struct GNUNET_TESTING_NodeConnection *connection, const char *prefix)
Get the address for a specific communicator from a connection.
Definition: testing.c:2387
enum GNUNET_GenericReturnValue GNUNET_TESTING_get_trait_test_system(const struct GNUNET_TESTING_Command *cmd, const struct GNUNET_TESTING_System **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.
Definition: testing.c:2276
void GNUNET_TESTING_async_finish(struct GNUNET_TESTING_AsyncContext *ac)
The asynchronous command of ac has finished.
struct GNUNET_TESTING_Command GNUNET_TESTING_command_new(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.
const struct GNUNET_TESTING_Command * GNUNET_TESTING_interpreter_lookup_command_all(struct GNUNET_TESTING_Interpreter *is, const char *label)
Lookup command by label.
struct GNUNET_TESTING_Trait GNUNET_TESTING_trait_end(void)
"end" trait.
const struct GNUNET_TESTING_Command * GNUNET_TESTING_interpreter_lookup_command(struct GNUNET_TESTING_Interpreter *is, const char *label)
Lookup command by label.
enum GNUNET_GenericReturnValue GNUNET_TESTING_get_trait(const struct GNUNET_TESTING_Trait *traits, const void **ret, const char *trait, unsigned int index)
Extract a trait.
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:39
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...
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.
const struct GNUNET_TESTING_System * tl_system
The testing system of this node.
unsigned int con_num_notified
Number of connections we already have a notification for.
GNUNET_TRANSPORT_notify_connect_cb notify_connect
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).
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.
char label[127+1]
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.
unsigned int additional_connects
Additional connects we do expect, beside the connects which are configured in the topology.
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 protocolls this node is reachable.
Handle for a system on which GNUnet peers are executed; a system is used for reserving unique paths a...
Definition: testing.c:122
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.
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.
enum GNUNET_GenericReturnValue GNUNET_TRANSPORT_get_trait_application_handle(const struct GNUNET_TESTING_Command *cmd, const struct GNUNET_TRANSPORT_ApplicationHandle **ret)
struct GNUNET_TESTING_Trait GNUNET_TRANSPORT_make_trait_connect_peer_state(const struct ConnectPeersState *value)
enum GNUNET_GenericReturnValue GNUNET_TRANSPORT_get_trait_broadcast(const struct GNUNET_TESTING_Command *cmd, const enum GNUNET_GenericReturnValue **ret)
static void connect_peers_run(void *cls, struct GNUNET_TESTING_Interpreter *is)
The run method of this cmd will connect to peers.
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.
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)
Create command.