GNUnet  0.19.3
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  struct GNUNET_TESTING_NodeConnection *pos_connection;
176  unsigned int num;
177  unsigned int con_num;
178  void *ret = NULL;
179 
181  "connect-peers");
182  cps = cmd->cls;
183  con_num = cps->con_num_notified;
184  for (pos_connection = cps->node_connections_head; NULL != pos_connection;
185  pos_connection = pos_connection->next)
186  {
187  num = GNUNET_TESTING_calculate_num (pos_connection, cps->topology);
188  peer_connection = GNUNET_TESTING_get_peer (num, cps->tl_system);
189  if (0 == GNUNET_memcmp (peer,
190  peer_connection))
191  cps->con_num_notified++;
192  GNUNET_free (peer_connection);
193  }
194  if (cps->con_num_notified == con_num)
196 
198  "con_num: %u add: %u num_notified: %u add_notified: %u peer: %s\n",
199  cps->con_num,
200  cps->additional_connects,
201  cps->con_num_notified,
203  GNUNET_i2s (peer));
204  if ((cps->con_num == cps->con_num_notified) &&
206  {
208  }
209  return ret;
210 }
211 
212 
217 static void
219 {
220  struct ConnectPeersState *cps = cls;
221 
222  GNUNET_free (cps);
223 }
224 
225 
231 connect_peers_traits (void *cls,
232  const void **ret,
233  const char *trait,
234  unsigned int index)
235 {
236  struct ConnectPeersState *cps = cls;
237  struct GNUNET_TESTING_Trait traits[] = {
240  };
241  return GNUNET_TESTING_get_trait (traits,
242  ret,
243  trait,
244  index);
245 }
246 
247 
250  const char *start_peer_label,
251  const char *create_label,
252  uint32_t num,
254  topology,
255  unsigned int additional_connects)
256 {
257  struct ConnectPeersState *cps;
258  unsigned int node_additional_connects;
259 
260  node_additional_connects = GNUNET_TESTING_get_additional_connects (num,
261  topology);
262 
264  "global: %u and local: %u additional_connects\n",
266  node_additional_connects);
267 
268  if (0 != node_additional_connects)
269  additional_connects = node_additional_connects;
270 
271  cps = GNUNET_new (struct ConnectPeersState);
273  cps->num = num;
274  cps->create_label = create_label;
275  cps->topology = topology;
278 
279  return GNUNET_TESTING_command_new (cps,
280  label,
284  &cps->ac);
285 }
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:2476
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:2282
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:2391
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:2417
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:2306
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.
#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
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...
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.