GNUnet  0.11.x
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  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 
63  cps->is = is;
65  cps->start_peer_label);
67  &ah);
68 
70  cps->create_label);
72  &tl_system);
73 
74  cps->tl_system = tl_system;
75 
77  "cps->num: %u \n",
78  cps->num);
79 
81  cps->topology);
82 
83  for (pos_connection = cps->node_connections_head; NULL != pos_connection;
84  pos_connection = pos_connection->next)
85  {
86  con_num++;
87  num = GNUNET_TESTING_calculate_num (pos_connection, cps->topology);
88  for (pos_prefix = pos_connection->address_prefixes_head; NULL != pos_prefix;
89  pos_prefix =
90  pos_prefix->next)
91  {
92  addr = GNUNET_TESTING_get_address (pos_connection,
93  pos_prefix->address_prefix);
94  if (NULL != addr)
95  {
96  peer = GNUNET_TESTING_get_pub_key (num, tl_system);
98  "validating peer number %u with identity %s\n",
99  num,
100  GNUNET_i2s (peer));
103  *) ah,
104  peer,
105  nt,
106  addr);
107  GNUNET_free (peer);
108  GNUNET_free (addr);
109  }
110  }
111  }
112  cps->con_num = con_num;
113 }
114 
115 
120 static void *
122  const struct GNUNET_PeerIdentity *peer)
123 {
124  const struct GNUNET_TESTING_Command *cmd;
125  struct ConnectPeersState *cps;
126  struct GNUNET_PeerIdentity *peer_connection;
127  struct GNUNET_TESTING_NodeConnection *pos_connection;
128  unsigned int num;
129  unsigned int con_num;
130  void *ret = NULL;
131 
133  "connect-peers");
134  cps = cmd->cls;
135  con_num = cps->con_num_notified;
136  for (pos_connection = cps->node_connections_head; NULL != pos_connection;
137  pos_connection = pos_connection->next)
138  {
139  num = GNUNET_TESTING_calculate_num (pos_connection, cps->topology);
140  peer_connection = GNUNET_TESTING_get_pub_key (num, cps->tl_system);
141  if (0 == GNUNET_memcmp (peer,
142  peer_connection))
143  cps->con_num_notified++;
144  GNUNET_free (peer_connection);
145  }
146  if (cps->con_num == con_num)
148 
149  if (cps->con_num + cps->additional_connects == cps->con_num_notified
151  {
153  }
154  return ret;
155 }
156 
157 
162 static void
164 {
165  struct ConnectPeersState *cps = cls;
166 
167  GNUNET_free (cps);
168 }
169 
170 
176 connect_peers_traits (void *cls,
177  const void **ret,
178  const char *trait,
179  unsigned int index)
180 {
181  struct ConnectPeersState *cps = cls;
182  struct GNUNET_TESTING_Trait traits[] = {
185  };
186  return GNUNET_TESTING_get_trait (traits,
187  ret,
188  trait,
189  index);
190 }
191 
192 
206  const char *start_peer_label,
207  const char *create_label,
208  uint32_t num,
210  topology,
211  unsigned int additional_connects)
212 {
213  struct ConnectPeersState *cps;
214 
215  cps = GNUNET_new (struct ConnectPeersState);
217  cps->num = num;
218  cps->create_label = create_label;
219  cps->topology = topology;
222 
223  {
224  struct GNUNET_TESTING_Command cmd = {
225  .cls = cps,
226  .label = label,
227  .run = &connect_peers_run,
228  .ac = &cps->ac,
229  .cleanup = &connect_peers_cleanup,
230  .traits = &connect_peers_traits
231  };
232 
233  return cmd;
234  }
235 }
enum GNUNET_TESTBED_TopologyOption topology
The topology to generate.
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
static struct GNUNET_NT_InterfaceScanner * is
Network scanner to determine network types.
static struct GNUNET_NAT_AUTO_AutoHandle * ah
Handle to ongoing autoconfiguration.
static struct GNUNET_NAT_AUTO_Test * nt
Handle to a NAT test operation.
#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.
Definition: gnunet_common.h:92
char * GNUNET_TESTING_get_address(struct GNUNET_TESTING_NodeConnection *connection, char *prefix)
Get the address for a specific communicator from a connection.
Definition: testing.c:2295
struct GNUNET_TESTING_NodeConnection * GNUNET_TESTING_get_connections(unsigned int num, struct GNUNET_TESTING_NetjailTopology *topology)
Get the connections to other nodes for a specific node.
Definition: testing.c:2097
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 connction.
Definition: testing.c:2269
enum GNUNET_GenericReturnValue GNUNET_TESTING_get_trait_test_system(const struct GNUNET_TESTING_Command *cmd, const struct GNUNET_TESTING_System **ret)
void GNUNET_TESTING_async_finish(struct GNUNET_TESTING_AsyncContext *ac)
The asynchronous command of ac has finished.
struct GNUNET_PeerIdentity * GNUNET_TESTING_get_pub_key(unsigned int num, const struct GNUNET_TESTING_System *tl_system)
Retrieve the public key from the test system with the unique node id.
Definition: testing.c:2172
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...
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_DEBUG
#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:36
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.
const char * 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.
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:103
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)
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.