GNUnet  0.11.x
transport-testing-send.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2016 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  */
25 #include "transport-testing.h"
26 
30 #define TIMEOUT_TRANSMIT GNUNET_TIME_relative_multiply ( \
31  GNUNET_TIME_UNIT_SECONDS, 30)
32 
33 
37 static void
38 find_cr (void *cls,
40 {
42 
43  if (GNUNET_NO == cx->connected)
44  return;
45  *cr = cx;
46 }
47 
48 
65 int
69  receiver,
70  uint16_t mtype,
71  uint16_t msize,
72  uint32_t num,
74  void *cont_cls)
75 {
77  struct GNUNET_MQ_Envelope *env;
79 
80  if (msize < sizeof(struct GNUNET_TRANSPORT_TESTING_TestMessage))
81  {
82  GNUNET_break (0);
83  return GNUNET_SYSERR;
84  }
85  cr = NULL;
87  receiver,
88  &find_cr,
89  &cr);
90  if (NULL == cr)
92  sender,
93  &find_cr,
94  &cr);
95  if (NULL == cr)
96  {
97  GNUNET_break (0);
98  return GNUNET_NO;
99  }
100  if (NULL == cr->mq)
101  {
102  GNUNET_break (0);
103  return GNUNET_NO;
104  }
105  {
106  char *receiver_s = GNUNET_strdup (GNUNET_i2s (&receiver->id));
107 
109  "Sending message from peer %u (`%s') -> peer %u (`%s') !\n",
110  sender->no,
111  GNUNET_i2s (&sender->id),
112  receiver->no,
113  receiver_s);
114  GNUNET_free (receiver_s);
115  }
116  env = GNUNET_MQ_msg_extra (test,
117  msize - sizeof(*test),
118  mtype);
119  test->num = htonl (num);
120  memset (&test[1],
121  num,
122  msize - sizeof(*test));
124  cont,
125  cont_cls);
126  GNUNET_MQ_send (cr->mq,
127  env);
128  return GNUNET_OK;
129 }
130 
131 
142 static void
144  uint16_t size,
146  void *cont_cls)
147 {
148  int ret;
149 
150  ccc->global_ret = GNUNET_SYSERR;
151  ret = GNUNET_TRANSPORT_TESTING_send (ccc->p[0],
152  ccc->p[1],
154  size,
155  ccc->send_num_gen++,
156  cont,
157  cont_cls);
158  GNUNET_assert (GNUNET_SYSERR != ret);
159  if (GNUNET_NO == ret)
160  {
161  GNUNET_break (0);
162  ccc->global_ret = GNUNET_SYSERR;
164  }
165 }
166 
167 
176 void
178 {
180  int done;
181  size_t msize;
182 
183  if (0 < sc->num_messages)
184  {
185  sc->num_messages--;
186  done = (0 == sc->num_messages);
187  }
188  else
189  {
190  done = 0; /* infinite loop */
191  }
192  msize = sizeof(struct GNUNET_TRANSPORT_TESTING_TestMessage);
193  if (NULL != sc->get_size_cb)
194  msize = sc->get_size_cb (sc->num_messages);
195  /* if this was the last message, call the continuation,
196  otherwise call this function again */
197  do_send (sc->ccc,
198  msize,
200  done ? sc->cont_cls : sc);
201 }
202 
203 
212 void
214 {
216  int done;
217  size_t msize;
218 
219  if (0 < sc->num_messages)
220  {
221  sc->num_messages--;
222  done = (0 == sc->num_messages);
223  }
224  else
225  {
226  done = 0; /* infinite loop */
227  }
228  msize = 2600;
229  if (NULL != sc->get_size_cb)
230  msize = sc->get_size_cb (sc->num_messages);
231  /* if this was the last message, call the continuation,
232  otherwise call this function again */
233  do_send (sc->ccc,
234  msize,
236  done ? sc->cont_cls : sc);
237 }
238 
239 
240 /* end of transport-testing-send.c */
Handle for a request to connect two peers.
static void done()
int global_ret
Result from the main function, set to GNUNET_OK on success.
struct GNUNET_TRANSPORT_TESTING_PeerContext ** p
Array with num_peers entries.
struct GNUNET_PeerIdentity id
Peer identity.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
Closure that must be passed to GNUNET_TRANSPORT_TESTING_connect_check.
Context for a single peer.
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
unsigned int no
An unique number to identify the peer.
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:526
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
void(* GNUNET_SCHEDULER_TaskCallback)(void *cls)
Signature of the main function of a task.
struct GNUNET_MQ_Handle * mq
Message queue for sending from p1 to p2.
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct...
Definition: gnunet_mq_lib.h:52
void GNUNET_TRANSPORT_TESTING_find_connecting_context(struct GNUNET_TRANSPORT_TESTING_PeerContext *p1, struct GNUNET_TRANSPORT_TESTING_PeerContext *p2, GNUNET_TRANSPORT_TESTING_ConnectContextCallback cb, void *cb_cls)
Find any connecting context matching the given pair of peers.
uint32_t num
Monotonically increasing counter throughout the test.
static void find_cr(void *cls, struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cx)
Return cx in cls.
void GNUNET_MQ_notify_sent(struct GNUNET_MQ_Envelope *ev, GNUNET_SCHEDULER_TaskCallback cb, void *cb_cls)
Call a callback once the envelope has been sent, that is, sending it can not be canceled anymore...
Definition: mq.c:774
unsigned int num_messages
Number of messages to be transmitted in a loop.
size_t(* get_size_cb)(unsigned int n)
Function that returns the desired message size.
int GNUNET_TRANSPORT_TESTING_send(struct GNUNET_TRANSPORT_TESTING_PeerContext *sender, struct GNUNET_TRANSPORT_TESTING_PeerContext *receiver, uint16_t mtype, uint16_t msize, uint32_t num, GNUNET_SCHEDULER_TaskCallback cont, void *cont_cls)
Send a test message of type mtype and size msize from peer sender to peer receiver.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
static unsigned int size
Size of the "table".
Definition: peer.c:67
int connected
GNUNET_YES if both p1_c and p2_c are GNUNET_YES.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static struct GNUNET_FS_SearchContext * sc
Definition: gnunet-search.c:37
GNUNET_SCHEDULER_TaskCallback cont
Function to call after all transmissions, can be NULL.
static void do_send(struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc, uint16_t size, GNUNET_SCHEDULER_TaskCallback cont, void *cont_cls)
Task that sends a test message from the first peer to the second peer.
#define GNUNET_log(kind,...)
struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext * ccc
Context for the transmission.
Type of the closure argument to pass to GNUNET_TRANSPORT_TESTING_simple_send() and GNUNET_TRANSPORT_T...
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:353
uint32_t send_num_gen
Generator for the num field in test messages.
void GNUNET_TRANSPORT_TESTING_large_send(void *cls)
Task that sends a large test message from the first peer to the second peer.
#define GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE
Message type used by GNUNET_TRANSPORT_TESTING_simple_send().
testing lib for transport service
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
void GNUNET_TRANSPORT_TESTING_simple_send(void *cls)
Task that sends a minimalistic test message from the first peer to the second peer.
#define GNUNET_free(ptr)
Wrapper around free.