GNUnet  0.11.x
Data Structures | Macros | Functions
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. More...
 
static void do_udp_read (void *cls)
 Activity on our incoming socket. More...
 
static void do_read (void *cls)
 Activity on our incoming socket. More...
 
static void do_accept (void *cls)
 Activity on our listen socket. More...
 
static void mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
 We got disconnected from the NAT server. More...
 
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. More...
 
static void do_fail (void *cls)
 Calls the report-callback reporting failure. More...
 
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. More...
 
void GNUNET_NAT_AUTO_test_stop (struct GNUNET_NAT_AUTO_Test *tst)
 Stop an active NAT test. More...
 

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.

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 }
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
@ GNUNET_ERROR_TYPE_DEBUG
@ GNUNET_NAT_ERROR_SUCCESS
Just the default.
#define LOG(kind,...)
Handle to a NAT test.

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,
221  &do_udp_read,
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 }
uint32_t data
The data value.
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:783
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:1024
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:1517
const struct GNUNET_SCHEDULER_TaskContext * GNUNET_SCHEDULER_get_task_context(void)
Obtain the reasoning why the current task was started.
Definition: scheduler.c:752
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
static void do_udp_read(void *cls)
Activity on our incoming socket.
static struct GNUNET_SCHEDULER_TaskContext tc
Task context of the current task.
Definition: scheduler.c:423
GNUNET_NAT_TestCallback report
Function to call with success report.
struct GNUNET_NETWORK_Handle * lsock
Handle to listen socket, or NULL.
uint16_t data
Data that should be transmitted or source-port.
void * report_cls
Closure for report.
struct GNUNET_SCHEDULER_Task * ltask
Identity of task for the listen socket (if any)
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 ...

References GNUNET_NAT_AUTO_Test::data, data, 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 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 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_free(ptr)
Wrapper around free.
int GNUNET_NETWORK_socket_close(struct GNUNET_NETWORK_Handle *desc)
Close a socket.
Definition: network.c:560
struct NatActivity * na_tail
Tail of list of nat activities.
struct NatActivity * na_head
Head of list of nat activities.
Entry we keep for each incoming connection.
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.

References GNUNET_NAT_AUTO_Test::data, 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 }
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
#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_INFO
#define GNUNET_new(type)
Allocate a struct or union of the given type.
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:430
static void do_read(void *cls)
Activity on our incoming socket.
static void do_accept(void *cls)
Activity on our listen socket.
handle to a socket
Definition: network.c:53

References 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 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 }
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:837
Entry we keep for each connection to the gnunet-nat-service.
struct GNUNET_MQ_Handle * mq
Socket of the incoming connection.
struct GNUNET_NAT_Test * h
Handle to overall NAT test.
struct ClientActivity * ca_head
Head of list of client activities.
struct ClientActivity * ca_tail
Tail of list of client activities.

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
app_ctx[in,out]location 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;
374  ca->mq = GNUNET_CLIENT_connect (h->cfg,
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 }
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
#define GNUNET_log(kind,...)
@ GNUNET_YES
Definition: gnunet_common.h:97
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:1064
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).
@ GNUNET_ERROR_TYPE_ERROR
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:355
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
#define GNUNET_MESSAGE_TYPE_NAT_TEST
Message to ask NAT server to perform traversal test.
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
We got disconnected from the NAT server.
#define _(String)
GNU gettext support macro.
Definition: platform.h:177
const struct GNUNET_CONFIGURATION_Handle * cfg
The configuration that we are using.
Definition: arm_api.c:112
Request to test NAT traversal, sent to the gnunet-nat-server (not the service!).
Definition: nat-auto.h:39

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 }
static struct GNUNET_NAT_Handle * nh
Handle to NAT operation.
Definition: gnunet-nat.c:80

References nh.

Referenced by GNUNET_NAT_AUTO_test_start().

Here is the caller graph for this function: