GNUnet debian-0.24.3-29-g453fda2cf
 
Loading...
Searching...
No Matches
nat_auto_api_test.c File Reference
#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_nat_service.h"
#include "gnunet_nat_auto_service.h"
#include "nat-auto.h"
Include dependency graph for nat_auto_api_test.c:

Go to the source code of this file.

Data Structures

struct  NatActivity
 Entry we keep for each incoming connection. More...
 
struct  ClientActivity
 Entry we keep for each connection to the gnunet-nat-service. More...
 
struct  GNUNET_NAT_AUTO_Test
 Handle to a NAT test. More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from (kind, "nat-auto", __VA_ARGS__)
 
#define NAT_SERVER_TIMEOUT    GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
 

Functions

static void reversal_cb (void *cls, const struct sockaddr *addr, socklen_t addrlen)
 Function called from GNUNET_NAT_register whenever someone asks us to do connection reversal.
 
static void do_udp_read (void *cls)
 Activity on our incoming socket.
 
static void do_read (void *cls)
 Activity on our incoming socket.
 
static void do_accept (void *cls)
 Activity on our listen socket.
 
static void mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
 We got disconnected from the NAT server.
 
static void addr_cb (void *cls, void **app_ctx, int add_remove, enum GNUNET_NAT_AddressClass ac, const struct sockaddr *addr, socklen_t addrlen)
 Address-callback, used to send message to gnunet-nat-server.
 
static void do_fail (void *cls)
 Calls the report-callback reporting failure.
 
struct GNUNET_NAT_AUTO_TestGNUNET_NAT_AUTO_test_start (const struct GNUNET_CONFIGURATION_Handle *cfg, uint8_t proto, const char *section_name, GNUNET_NAT_TestCallback report, void *report_cls)
 Start testing if NAT traversal works using the given configuration.
 
void GNUNET_NAT_AUTO_test_stop (struct GNUNET_NAT_AUTO_Test *tst)
 Stop an active NAT test.
 

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from (kind, "nat-auto", __VA_ARGS__)

Definition at line 31 of file nat_auto_api_test.c.

◆ NAT_SERVER_TIMEOUT

#define NAT_SERVER_TIMEOUT    GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)

Definition at line 33 of file nat_auto_api_test.c.

39{
43 struct NatActivity *next;
44
48 struct NatActivity *prev;
49
53 struct GNUNET_NETWORK_Handle *sock;
54
58 struct GNUNET_NAT_AUTO_Test *h;
59
64};
65
66
70struct ClientActivity
71{
75 struct ClientActivity *next;
76
80 struct ClientActivity *prev;
81
85 struct GNUNET_MQ_Handle *mq;
86
90 struct GNUNET_NAT_AUTO_Test *h;
91};
92
93
98{
102 const struct GNUNET_CONFIGURATION_Handle *cfg;
103
108
112 void *report_cls;
113
117 struct GNUNET_NAT_Handle *nat;
118
123
127 struct NatActivity *na_head;
128
132 struct NatActivity *na_tail;
133
137 struct ClientActivity *ca_head;
138
142 struct ClientActivity *ca_tail;
143
148
153
157 char *section_name;
158
162 int proto;
163
167 uint16_t data;
168
173};
174
175
184static void
185reversal_cb (void *cls, const struct sockaddr *addr, socklen_t addrlen)
186{
187 struct GNUNET_NAT_AUTO_Test *h = cls;
188 const struct sockaddr_in *sa;
189
190 if (sizeof(struct sockaddr_in) != addrlen)
191 return;
192 sa = (const struct sockaddr_in *) addr;
193 if (h->data != sa->sin_port)
194 {
196 "Received connection reversal request for wrong port\n");
197 return; /* wrong port */
198 }
199 /* report success */
200 h->report (h->report_cls, GNUNET_NAT_ERROR_SUCCESS);
201}
202
203
210static void
211do_udp_read (void *cls)
212{
213 struct GNUNET_NAT_AUTO_Test *tst = cls;
214 uint16_t data;
215 const struct GNUNET_SCHEDULER_TaskContext *tc;
216
219 tst->lsock,
221 tst);
222 if ((NULL != tc->write_ready) &&
224 (sizeof(data) ==
225 GNUNET_NETWORK_socket_recv (tst->lsock, &data, sizeof(data))))
226 {
227 if (data == tst->data)
229 else
231 "Received data mismatches expected value\n");
232 }
233 else
235 "Failed to receive data from inbound connection\n");
236}
237
238
245static void
246do_read (void *cls)
247{
248 struct NatActivity *na = cls;
249 struct GNUNET_NAT_AUTO_Test *tst;
250 uint16_t data;
251 const struct GNUNET_SCHEDULER_TaskContext *tc;
252
254 na->rtask = NULL;
255 tst = na->h;
257 if ((NULL != tc->write_ready) &&
259 (sizeof(data) ==
260 GNUNET_NETWORK_socket_recv (na->sock, &data, sizeof(data))))
261 {
262 if (data == tst->data)
264 else
266 "Received data does not match expected value\n");
267 }
268 else
270 "Failed to receive data from inbound connection\n");
272 GNUNET_free (na);
273}
274
275
282static void
283do_accept (void *cls)
284{
285 struct GNUNET_NAT_AUTO_Test *tst = cls;
286 struct GNUNET_NETWORK_Handle *s;
287 struct NatActivity *wl;
288
290 tst->lsock,
291 &do_accept,
292 tst);
293 s = GNUNET_NETWORK_socket_accept (tst->lsock, NULL, NULL);
294 if (NULL == s)
295 {
297 return; /* odd error */
298 }
300 "Got an inbound connection, waiting for data\n");
301 wl = GNUNET_new (struct NatActivity);
302 wl->sock = s;
303 wl->h = tst;
305 wl->sock,
306 &do_read,
307 wl);
309}
310
311
319static void
320mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
321{
322 struct ClientActivity *ca = cls;
323 struct GNUNET_NAT_AUTO_Test *tst = ca->h;
324
326 GNUNET_MQ_destroy (ca->mq);
327 GNUNET_free (ca);
328}
329
330
343static void
344addr_cb (void *cls,
345 void **app_ctx,
346 int add_remove,
348 const struct sockaddr *addr,
349 socklen_t addrlen)
350{
351 struct GNUNET_NAT_AUTO_Test *h = cls;
352 struct ClientActivity *ca;
353 struct GNUNET_MQ_Envelope *env;
355 const struct sockaddr_in *sa;
356
357 (void) app_ctx;
358 if (GNUNET_YES != add_remove)
359 return;
360 if (addrlen != sizeof(struct sockaddr_in))
361 {
363 "NAT test ignores IPv6 address `%s' returned from NAT library\n",
364 GNUNET_a2s (addr, addrlen));
365 return; /* ignore IPv6 here */
366 }
368 "Asking gnunet-nat-server to connect to `%s'\n",
369 GNUNET_a2s (addr, addrlen));
370
371 ca = GNUNET_new (struct ClientActivity);
372 ca->h = h;
374 "gnunet-nat-server",
375 NULL,
377 ca);
378 if (NULL == ca->mq)
379 {
380 GNUNET_free (ca);
382 _ ("Failed to connect to `gnunet-nat-server'\n"));
383 return;
384 }
385 GNUNET_CONTAINER_DLL_insert (h->ca_head, h->ca_tail, ca);
386 sa = (const struct sockaddr_in *) addr;
388 msg->dst_ipv4 = sa->sin_addr.s_addr;
389 msg->dport = sa->sin_port;
390 msg->data = h->data;
391 msg->is_tcp = htonl ((uint32_t) (h->proto == IPPROTO_TCP));
392 GNUNET_MQ_send (ca->mq, env);
393}
394
395
403static void
404do_fail (void *cls)
405{
406 struct GNUNET_NAT_AUTO_Test *nh = cls;
407
408 nh->ttask = NULL;
409 nh->report (nh->report_cls, nh->status);
410}
411
412
426 uint8_t proto,
427 const char *section_name,
429 void *report_cls)
430{
431 struct GNUNET_NAT_AUTO_Test *nh;
432 unsigned long long bnd_port;
433 struct sockaddr_in sa;
434 const struct sockaddr *addrs[] = { (const struct sockaddr *) &sa };
435 const socklen_t addrlens[] = { sizeof(sa) };
436
439 "PORT",
440 &bnd_port)) ||
441 (bnd_port > 65535))
442 {
444 _ ("Failed to find valid PORT in section `%s'\n"),
446 return NULL;
447 }
448
449 memset (&sa, 0, sizeof(sa));
450 sa.sin_family = AF_INET;
451 sa.sin_port = htons ((uint16_t) bnd_port);
452#if HAVE_SOCKADDR_IN_SIN_LEN
453 sa.sin_len = sizeof(sa);
454#endif
455
457 nh->cfg = cfg;
458 nh->proto = proto;
459 nh->section_name = GNUNET_strdup (section_name);
460 nh->report = report;
461 nh->report_cls = report_cls;
463 if (0 == bnd_port)
464 {
465 nh->nat = GNUNET_NAT_register (cfg,
467 proto,
468 0,
469 NULL,
470 NULL,
471 &addr_cb,
473 nh);
474 }
475 else
476 {
477 nh->lsock =
479 (IPPROTO_UDP == proto) ? SOCK_DGRAM
480 : SOCK_STREAM,
481 proto);
482 if ((NULL == nh->lsock) ||
484 (const struct sockaddr *) &sa,
485 sizeof(sa))))
486 {
488 _ ("Failed to create socket bound to `%s' for NAT test: %s\n"),
489 GNUNET_a2s ((const struct sockaddr *) &sa, sizeof(sa)),
490 strerror (errno));
491 if (NULL != nh->lsock)
492 {
494 nh->lsock = NULL;
495 }
498 return nh;
499 }
500 if (IPPROTO_TCP == proto)
501 {
504 nh->lsock,
505 &do_accept,
506 nh);
507 }
508 else
509 {
511 nh->lsock,
513 nh);
514 }
516 "NAT test listens on port %llu (%s)\n",
517 bnd_port,
518 (IPPROTO_TCP == proto) ? "tcp" : "udp");
519 nh->nat = GNUNET_NAT_register (cfg,
521 proto,
522 1,
523 addrs,
524 addrlens,
525 &addr_cb,
526 NULL,
527 nh);
528 if (NULL == nh->nat)
529 {
531 _ ("NAT test failed to start NAT library\n"));
532 if (NULL != nh->ltask)
533 {
535 nh->ltask = NULL;
536 }
537 if (NULL != nh->lsock)
538 {
540 nh->lsock = NULL;
541 }
544 return nh;
545 }
546 }
547 return nh;
548}
549
550
556void
558{
559 struct NatActivity *pos;
560 struct ClientActivity *cpos;
561
562 LOG (GNUNET_ERROR_TYPE_DEBUG, "Stopping NAT test\n");
563 while (NULL != (cpos = tst->ca_head))
564 {
566 GNUNET_MQ_destroy (cpos->mq);
567 GNUNET_free (cpos);
568 }
569 while (NULL != (pos = tst->na_head))
570 {
574 GNUNET_free (pos);
575 }
576 if (NULL != tst->ttask)
577 {
579 tst->ttask = NULL;
580 }
581 if (NULL != tst->ltask)
582 {
584 tst->ltask = NULL;
585 }
586 if (NULL != tst->lsock)
587 {
589 tst->lsock = NULL;
590 }
591 if (NULL != tst->nat)
592 {
594 tst->nat = NULL;
595 }
597 GNUNET_free (tst);
598}
599
600
601/* end of nat_auto_api_test.c */
struct GNUNET_MessageHeader * msg
Definition 005.c:2
struct GNUNET_MQ_Envelope * env
Definition 005.c:1
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition gnunet-arm.c:98
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition gnunet-arm.c:108
static char * data
The data to insert into the dht.
static char * section_name
Adapter we are supposed to test.
static uint8_t proto
Protocol to use.
static struct GNUNET_NAT_Handle * nh
Handle to NAT operation.
Definition gnunet-nat.c:80
static struct GNUNET_SCHEDULER_Task * rtask
Task for reading STUN packets.
Definition gnunet-nat.c:90
struct GNUNET_MQ_Handle * GNUNET_CLIENT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *service_name, const struct GNUNET_MQ_MessageHandler *handlers, GNUNET_MQ_ErrorHandler error_handler, void *error_handler_cls)
Create a message queue to connect to a GNUnet service.
Definition client.c:1060
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_number(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *number)
Get a configuration value that should be a number.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
#define GNUNET_log(kind,...)
@ GNUNET_OK
@ GNUNET_YES
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
const char * GNUNET_a2s(const struct sockaddr *addr, socklen_t addrlen)
Convert a "struct sockaddr*" (IPv4 or IPv6 address) to a string (for printing debug messages).
#define GNUNET_log_strerror(level, cmd)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_DEBUG
@ GNUNET_ERROR_TYPE_INFO
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
GNUNET_MQ_Error
Error codes for the queue.
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:305
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition mq.c:700
void GNUNET_NAT_AUTO_test_stop(struct GNUNET_NAT_AUTO_Test *tst)
Stop an active NAT test.
GNUNET_NAT_StatusCode
Error Types for the NAT subsystem (which can then later be converted/resolved to a string)
struct GNUNET_NAT_Handle * GNUNET_NAT_register(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *config_section, uint8_t proto, unsigned int num_addrs, const struct sockaddr **addrs, const socklen_t *addrlens, GNUNET_NAT_AddressCallback address_callback, GNUNET_NAT_ReversalCallback reversal_callback, void *callback_cls)
Attempt to enable port redirection and detect public IP address contacting UPnP or NAT-PMP routers on...
Definition nat_api.c:366
void GNUNET_NAT_unregister(struct GNUNET_NAT_Handle *nh)
Stop port redirection and public IP address detection for the given handle.
Definition nat_api.c:703
void(* GNUNET_NAT_TestCallback)(void *cls, enum GNUNET_NAT_StatusCode result)
Function called to report success or failure for NAT configuration test.
struct GNUNET_NAT_AUTO_Test * GNUNET_NAT_AUTO_test_start(const struct GNUNET_CONFIGURATION_Handle *cfg, uint8_t proto, const char *section_name, GNUNET_NAT_TestCallback report, void *report_cls)
Start testing if NAT traversal works using the given configuration.
GNUNET_NAT_AddressClass
Some addresses contain sensitive information or are not suitable for global distribution.
@ GNUNET_NAT_ERROR_SUCCESS
Just the default.
@ GNUNET_NAT_ERROR_INTERNAL_NETWORK_ERROR
Failure in network subsystem, check permissions.
@ GNUNET_NAT_ERROR_NAT_REGISTER_FAILED
NAT test failed to initiate.
struct GNUNET_NETWORK_Handle * GNUNET_NETWORK_socket_accept(const struct GNUNET_NETWORK_Handle *desc, struct sockaddr *address, socklen_t *address_len)
Accept a new connection on a socket.
Definition network.c:392
enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_close(struct GNUNET_NETWORK_Handle *desc)
Close a socket.
Definition network.c:508
ssize_t GNUNET_NETWORK_socket_recv(const struct GNUNET_NETWORK_Handle *desc, void *buffer, size_t length)
Read data from a connected socket (always non-blocking).
Definition network.c:717
struct GNUNET_NETWORK_Handle * GNUNET_NETWORK_socket_create(int domain, int type, int protocol)
Create a new socket.
Definition network.c:833
enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_bind(struct GNUNET_NETWORK_Handle *desc, const struct sockaddr *address, socklen_t address_len)
Bind a socket to a particular address.
Definition network.c:439
enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_listen(const struct GNUNET_NETWORK_Handle *desc, int backlog)
Listen on a socket.
Definition network.c:652
int GNUNET_NETWORK_fdset_isset(const struct GNUNET_NETWORK_FDSet *fds, const struct GNUNET_NETWORK_Handle *desc)
Check whether a socket is part of the fd set.
Definition network.c:950
#define GNUNET_MESSAGE_TYPE_NAT_TEST
Message to ask NAT server to perform traversal test.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_read_net(struct GNUNET_TIME_Relative delay, struct GNUNET_NETWORK_Handle *rfd, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay or when the specified file descriptor is ready f...
Definition scheduler.c:1511
const struct GNUNET_SCHEDULER_TaskContext * GNUNET_SCHEDULER_get_task_context(void)
Obtain the reasoning why the current task was started.
Definition scheduler.c:758
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition scheduler.c:980
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition scheduler.c:1304
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
static void do_read(void *cls)
Activity on our incoming socket.
static void reversal_cb(void *cls, const struct sockaddr *addr, socklen_t addrlen)
Function called from GNUNET_NAT_register whenever someone asks us to do connection reversal.
static void do_fail(void *cls)
Calls the report-callback reporting failure.
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
We got disconnected from the NAT server.
static void do_accept(void *cls)
Activity on our listen socket.
static void do_udp_read(void *cls)
Activity on our incoming socket.
#define LOG(kind,...)
static void addr_cb(void *cls, void **app_ctx, int add_remove, enum GNUNET_NAT_AddressClass ac, const struct sockaddr *addr, socklen_t addrlen)
Address-callback, used to send message to gnunet-nat-server.
#define _(String)
GNU gettext support macro.
Definition platform.h:179
static struct GNUNET_SCHEDULER_TaskContext tc
Task context of the current task.
Definition scheduler.c:431
Entry we keep for each connection to the gnunet-nat-service.
struct GNUNET_MQ_Handle * mq
Socket of the incoming connection.
struct ClientActivity * next
This is a doubly-linked list.
struct GNUNET_NAT_Test * h
Handle to overall NAT test.
struct ClientActivity * prev
This is a doubly-linked list.
const struct GNUNET_CONFIGURATION_Handle * cfg
The configuration that we are using.
Definition arm_api.c:112
Handle to a message queue.
Definition mq.c:87
Request to test NAT traversal, sent to the gnunet-nat-server (not the service!).
Definition nat-auto.h:39
Handle to a NAT test.
char * section_name
Section name of plugin to test.
int proto
IPPROTO_TCP or IPPROTO_UDP.
GNUNET_NAT_TestCallback report
Function to call with success report.
struct NatActivity * na_tail
Tail of list of nat activities.
struct GNUNET_NAT_Handle * nat
Handle to NAT traversal in use.
struct GNUNET_NETWORK_Handle * lsock
Handle to listen socket, or NULL.
uint16_t data
Data that should be transmitted or source-port.
struct NatActivity * na_head
Head of list of nat activities.
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration used.
void * report_cls
Closure for report.
struct GNUNET_SCHEDULER_Task * ttask
Task identifier for the timeout (if any)
struct ClientActivity * ca_head
Head of list of client activities.
struct ClientActivity * ca_tail
Tail of list of client activities.
enum GNUNET_NAT_StatusCode status
Status code to be reported to the timeout/status call.
struct GNUNET_SCHEDULER_Task * ltask
Identity of task for the listen socket (if any)
Handle for active NAT registrations.
Definition nat_api.c:72
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we use.
Definition nat_api.c:76
handle to a socket
Definition network.c:53
Context information passed to each scheduler task.
const struct GNUNET_NETWORK_FDSet * read_ready
Set of file descriptors ready for reading; note that additional bits may be set that were not in the ...
const struct GNUNET_NETWORK_FDSet * write_ready
Set of file descriptors ready for writing; note that additional bits may be set that were not in the ...
Entry in list of pending tasks.
Definition scheduler.c:136
Entry we keep for each incoming connection.
struct NatActivity * prev
This is a doubly-linked list.
struct GNUNET_SCHEDULER_Task * rtask
Task reading from the incoming connection.
struct GNUNET_NAT_Test * h
Handle of the master context.
struct GNUNET_NETWORK_Handle * sock
Socket of the incoming connection.
struct NatActivity * next
This is a doubly-linked list.

Function Documentation

◆ reversal_cb()

static void reversal_cb ( void *  cls,
const struct sockaddr *  addr,
socklen_t  addrlen 
)
static

Function called from GNUNET_NAT_register whenever someone asks us to do connection reversal.

Parameters
clsclosure, our struct GNUNET_NAT_Handle
addrpublic IP address of the other peer
addrlenactual length of the addr

Definition at line 186 of file nat_auto_api_test.c.

187{
188 struct GNUNET_NAT_AUTO_Test *h = cls;
189 const struct sockaddr_in *sa;
190
191 if (sizeof(struct sockaddr_in) != addrlen)
192 return;
193 sa = (const struct sockaddr_in *) addr;
194 if (h->data != sa->sin_port)
195 {
197 "Received connection reversal request for wrong port\n");
198 return; /* wrong port */
199 }
200 /* report success */
201 h->report (h->report_cls, GNUNET_NAT_ERROR_SUCCESS);
202}

References GNUNET_ERROR_TYPE_DEBUG, GNUNET_NAT_ERROR_SUCCESS, h, and LOG.

Referenced by GNUNET_NAT_AUTO_test_start().

Here is the caller graph for this function:

◆ do_udp_read()

static void do_udp_read ( void *  cls)
static

Activity on our incoming socket.

Read data from the incoming connection.

Parameters
clsthe struct GNUNET_NAT_AUTO_Test

Definition at line 212 of file nat_auto_api_test.c.

213{
214 struct GNUNET_NAT_AUTO_Test *tst = cls;
215 uint16_t data;
216 const struct GNUNET_SCHEDULER_TaskContext *tc;
217
220 tst->lsock,
222 tst);
223 if ((NULL != tc->write_ready) &&
225 (sizeof(data) ==
226 GNUNET_NETWORK_socket_recv (tst->lsock, &data, sizeof(data))))
227 {
228 if (data == tst->data)
230 else
232 "Received data mismatches expected value\n");
233 }
234 else
236 "Failed to receive data from inbound connection\n");
237}

References data, GNUNET_NAT_AUTO_Test::data, do_udp_read(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_NAT_ERROR_SUCCESS, GNUNET_NETWORK_fdset_isset(), GNUNET_NETWORK_socket_recv(), GNUNET_SCHEDULER_add_read_net(), GNUNET_SCHEDULER_get_task_context(), GNUNET_TIME_UNIT_FOREVER_REL, LOG, GNUNET_NAT_AUTO_Test::lsock, GNUNET_NAT_AUTO_Test::ltask, GNUNET_SCHEDULER_TaskContext::read_ready, GNUNET_NAT_AUTO_Test::report, GNUNET_NAT_AUTO_Test::report_cls, tc, and GNUNET_SCHEDULER_TaskContext::write_ready.

Referenced by do_udp_read(), and GNUNET_NAT_AUTO_test_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_read()

static void do_read ( void *  cls)
static

Activity on our incoming socket.

Read data from the incoming connection.

Parameters
clsthe struct NatActivity

Definition at line 247 of file nat_auto_api_test.c.

248{
249 struct NatActivity *na = cls;
250 struct GNUNET_NAT_AUTO_Test *tst;
251 uint16_t data;
252 const struct GNUNET_SCHEDULER_TaskContext *tc;
253
255 na->rtask = NULL;
256 tst = na->h;
258 if ((NULL != tc->write_ready) &&
260 (sizeof(data) ==
261 GNUNET_NETWORK_socket_recv (na->sock, &data, sizeof(data))))
262 {
263 if (data == tst->data)
265 else
267 "Received data does not match expected value\n");
268 }
269 else
271 "Failed to receive data from inbound connection\n");
273 GNUNET_free (na);
274}

References data, GNUNET_NAT_AUTO_Test::data, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_NAT_ERROR_SUCCESS, GNUNET_NETWORK_fdset_isset(), GNUNET_NETWORK_socket_close(), GNUNET_NETWORK_socket_recv(), GNUNET_SCHEDULER_get_task_context(), NatActivity::h, LOG, GNUNET_NAT_AUTO_Test::na_head, GNUNET_NAT_AUTO_Test::na_tail, GNUNET_SCHEDULER_TaskContext::read_ready, GNUNET_NAT_AUTO_Test::report, GNUNET_NAT_AUTO_Test::report_cls, NatActivity::rtask, NatActivity::sock, tc, and GNUNET_SCHEDULER_TaskContext::write_ready.

Referenced by do_accept().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_accept()

static void do_accept ( void *  cls)
static

Activity on our listen socket.

Accept the incoming connection.

Parameters
clsthe struct GNUNET_NAT_AUTO_Test

Definition at line 284 of file nat_auto_api_test.c.

285{
286 struct GNUNET_NAT_AUTO_Test *tst = cls;
287 struct GNUNET_NETWORK_Handle *s;
288 struct NatActivity *wl;
289
291 tst->lsock,
292 &do_accept,
293 tst);
294 s = GNUNET_NETWORK_socket_accept (tst->lsock, NULL, NULL);
295 if (NULL == s)
296 {
298 return; /* odd error */
299 }
301 "Got an inbound connection, waiting for data\n");
302 wl = GNUNET_new (struct NatActivity);
303 wl->sock = s;
304 wl->h = tst;
306 wl->sock,
307 &do_read,
308 wl);
310}

References do_accept(), do_read(), GNUNET_CONTAINER_DLL_insert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_INFO, GNUNET_log_strerror, GNUNET_NETWORK_socket_accept(), GNUNET_new, GNUNET_SCHEDULER_add_read_net(), GNUNET_TIME_UNIT_FOREVER_REL, NatActivity::h, LOG, GNUNET_NAT_AUTO_Test::lsock, GNUNET_NAT_AUTO_Test::ltask, GNUNET_NAT_AUTO_Test::na_head, GNUNET_NAT_AUTO_Test::na_tail, NatActivity::rtask, and NatActivity::sock.

Referenced by do_accept(), and GNUNET_NAT_AUTO_test_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ mq_error_handler()

static void mq_error_handler ( void *  cls,
enum GNUNET_MQ_Error  error 
)
static

We got disconnected from the NAT server.

Stop waiting for a reply.

Parameters
clsthe struct ClientActivity
errorerror code

Definition at line 321 of file nat_auto_api_test.c.

322{
323 struct ClientActivity *ca = cls;
324 struct GNUNET_NAT_AUTO_Test *tst = ca->h;
325
327 GNUNET_MQ_destroy (ca->mq);
328 GNUNET_free (ca);
329}

References GNUNET_NAT_AUTO_Test::ca_head, GNUNET_NAT_AUTO_Test::ca_tail, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_MQ_destroy(), ClientActivity::h, and ClientActivity::mq.

Referenced by addr_cb().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ addr_cb()

static void addr_cb ( void *  cls,
void **  app_ctx,
int  add_remove,
enum GNUNET_NAT_AddressClass  ac,
const struct sockaddr *  addr,
socklen_t  addrlen 
)
static

Address-callback, used to send message to gnunet-nat-server.

Parameters
clsclosure
[in,out]app_ctxlocation where the app can store stuff on add and retrieve it on remove
add_removeGNUNET_YES to mean the new public IP address, GNUNET_NO to mean the previous (now invalid) one
acaddress class the address belongs to
addreither the previous or the new public IP address
addrlenactual length of the addr

Definition at line 345 of file nat_auto_api_test.c.

351{
352 struct GNUNET_NAT_AUTO_Test *h = cls;
353 struct ClientActivity *ca;
354 struct GNUNET_MQ_Envelope *env;
356 const struct sockaddr_in *sa;
357
358 (void) app_ctx;
359 if (GNUNET_YES != add_remove)
360 return;
361 if (addrlen != sizeof(struct sockaddr_in))
362 {
364 "NAT test ignores IPv6 address `%s' returned from NAT library\n",
365 GNUNET_a2s (addr, addrlen));
366 return; /* ignore IPv6 here */
367 }
369 "Asking gnunet-nat-server to connect to `%s'\n",
370 GNUNET_a2s (addr, addrlen));
371
372 ca = GNUNET_new (struct ClientActivity);
373 ca->h = h;
375 "gnunet-nat-server",
376 NULL,
378 ca);
379 if (NULL == ca->mq)
380 {
381 GNUNET_free (ca);
383 _ ("Failed to connect to `gnunet-nat-server'\n"));
384 return;
385 }
386 GNUNET_CONTAINER_DLL_insert (h->ca_head, h->ca_tail, ca);
387 sa = (const struct sockaddr_in *) addr;
389 msg->dst_ipv4 = sa->sin_addr.s_addr;
390 msg->dport = sa->sin_port;
391 msg->data = h->data;
392 msg->is_tcp = htonl ((uint32_t) (h->proto == IPPROTO_TCP));
393 GNUNET_MQ_send (ca->mq, env);
394}

References _, GNUNET_ARM_Handle::cfg, env, GNUNET_a2s(), GNUNET_CLIENT_connect(), GNUNET_CONTAINER_DLL_insert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_free, GNUNET_log, GNUNET_MESSAGE_TYPE_NAT_TEST, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_new, GNUNET_YES, h, ClientActivity::h, LOG, ClientActivity::mq, mq_error_handler(), and msg.

Referenced by GNUNET_NAT_AUTO_test_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_fail()

static void do_fail ( void *  cls)
static

Calls the report-callback reporting failure.

Destroys the nat handle after the callback has been processed.

Parameters
clshandle to the timed out NAT test

Definition at line 405 of file nat_auto_api_test.c.

406{
407 struct GNUNET_NAT_AUTO_Test *nh = cls;
408
409 nh->ttask = NULL;
410 nh->report (nh->report_cls, nh->status);
411}

References nh.

Referenced by GNUNET_NAT_AUTO_test_start().

Here is the caller graph for this function: