GNUnet  0.10.x
Data Structures | Macros | Functions
gnunet-nat-auto_legacy.c File Reference
#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_nat_lib.h"
#include "nat.h"
Include dependency graph for gnunet-nat-auto_legacy.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_Test
 Handle to a NAT test. More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from (kind, "nat", __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, int add_remove, const struct sockaddr *addr, socklen_t addrlen)
 Address-callback, used to send message to gnunet-nat-server. More...
 
static void do_timeout (void *cls)
 Timeout task for a nat test. More...
 
struct GNUNET_NAT_TestGNUNET_NAT_test_start (const struct GNUNET_CONFIGURATION_Handle *cfg, int is_tcp, uint16_t bnd_port, uint16_t adv_port, struct GNUNET_TIME_Relative timeout, GNUNET_NAT_TestCallback report, void *report_cls)
 Start testing if NAT traversal works using the given configuration (IPv4-only). More...
 
void GNUNET_NAT_test_stop (struct GNUNET_NAT_Test *tst)
 Stop an active NAT test. More...
 

Macro Definition Documentation

◆ LOG

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

◆ NAT_SERVER_TIMEOUT

#define NAT_SERVER_TIMEOUT   GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)

Definition at line 33 of file gnunet-nat-auto_legacy.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 lenght of the addr

Definition at line 187 of file gnunet-nat-auto_legacy.c.

References GNUNET_NAT_Test::data, GNUNET_ERROR_TYPE_DEBUG, GNUNET_NAT_ERROR_SUCCESS, NatActivity::h, LOG, GNUNET_NAT_Test::report, and GNUNET_NAT_Test::report_cls.

Referenced by GNUNET_NAT_test_start().

190 {
191  struct GNUNET_NAT_Test *h = cls;
192  const struct sockaddr_in *sa;
193 
194  if (sizeof (struct sockaddr_in) != addrlen)
195  return;
196  sa = (const struct sockaddr_in *) addr;
197  if (h->data != sa->sin_port)
198  {
200  "Received connection reversal request for wrong port\n");
201  return; /* wrong port */
202  }
203  /* report success */
204  h->report (h->report_cls,
206 }
uint16_t data
Data that should be transmitted or source-port.
void * report_cls
Closure for report.
GNUNET_NAT_TestCallback report
Function to call with success report.
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
#define LOG(kind,...)
Handle to a NAT test.
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_Test

Definition at line 216 of file gnunet-nat-auto_legacy.c.

References data, GNUNET_NAT_Test::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_Test::lsock, GNUNET_NAT_Test::ltask, GNUNET_SCHEDULER_TaskContext::read_ready, GNUNET_NAT_Test::report, GNUNET_NAT_Test::report_cls, tc, and GNUNET_SCHEDULER_TaskContext::write_ready.

Referenced by GNUNET_NAT_test_start().

217 {
218  struct GNUNET_NAT_Test *tst = cls;
219  uint16_t data;
220  const struct GNUNET_SCHEDULER_TaskContext *tc;
221 
223  tst->ltask =
225  tst->lsock,
226  &do_udp_read,
227  tst);
228  if ((NULL != tc->write_ready) &&
230  tst->lsock)) &&
231  (sizeof (data) ==
233  &data,
234  sizeof (data))))
235  {
236  if (data == tst->data)
237  tst->report (tst->report_cls,
239  else
241  "Received data mismatches expected value\n");
242  }
243  else
245  "Failed to receive data from inbound connection\n");
246 }
const struct GNUNET_SCHEDULER_TaskContext * GNUNET_SCHEDULER_get_task_context(void)
Obtain the reasoning why the current task was started.
Definition: scheduler.c:746
uint16_t data
Data that should be transmitted or source-port.
Context information passed to each scheduler task.
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:894
static struct GNUNET_SCHEDULER_TaskContext tc
Task context of the current task.
Definition: scheduler.c:417
void * report_cls
Closure for report.
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 ...
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 ...
GNUNET_NAT_TestCallback report
Function to call with success report.
#define LOG(kind,...)
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
static void do_udp_read(void *cls)
Activity on our incoming socket.
Handle to a NAT test.
struct GNUNET_SCHEDULER_Task * ltask
Identity of task for the listen socket (if any)
struct GNUNET_NETWORK_Handle * lsock
Handle to listen socket, or NULL.
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:1478
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:1181
uint32_t data
The data value.
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 256 of file gnunet-nat-auto_legacy.c.

References data, GNUNET_NAT_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_Test::na_head, GNUNET_NAT_Test::na_tail, GNUNET_SCHEDULER_TaskContext::read_ready, GNUNET_NAT_Test::report, GNUNET_NAT_Test::report_cls, NatActivity::rtask, NatActivity::sock, tc, and GNUNET_SCHEDULER_TaskContext::write_ready.

Referenced by do_accept().

257 {
258  struct NatActivity *na = cls;
259  struct GNUNET_NAT_Test *tst;
260  uint16_t data;
261  const struct GNUNET_SCHEDULER_TaskContext *tc;
262 
264  na->rtask = NULL;
265  tst = na->h;
267  tst->na_tail,
268  na);
269  if ((NULL != tc->write_ready) &&
271  na->sock)) &&
272  (sizeof (data) ==
274  &data,
275  sizeof (data))))
276  {
277  if (data == tst->data)
278  tst->report (tst->report_cls,
280  else
282  "Received data does not match expected value\n");
283  }
284  else
286  "Failed to receive data from inbound connection\n");
288  GNUNET_free (na);
289 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
const struct GNUNET_SCHEDULER_TaskContext * GNUNET_SCHEDULER_get_task_context(void)
Obtain the reasoning why the current task was started.
Definition: scheduler.c:746
uint16_t data
Data that should be transmitted or source-port.
Context information passed to each scheduler task.
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:894
struct GNUNET_NETWORK_Handle * sock
Socket of the incoming connection.
static struct GNUNET_SCHEDULER_TaskContext tc
Task context of the current task.
Definition: scheduler.c:417
void * report_cls
Closure for report.
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 ...
struct NatActivity * na_tail
Tail of list of nat activities.
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 ...
GNUNET_NAT_TestCallback report
Function to call with success report.
struct GNUNET_SCHEDULER_Task * rtask
Task reading from the incoming connection.
Entry we keep for each incoming connection.
#define LOG(kind,...)
struct NatActivity * na_head
Head of list of nat activities.
Handle to a NAT test.
struct GNUNET_NAT_Test * h
Handle of the master context.
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:1181
uint32_t data
The data value.
int GNUNET_NETWORK_socket_close(struct GNUNET_NETWORK_Handle *desc)
Close a socket.
Definition: network.c:604
#define GNUNET_free(ptr)
Wrapper around free.
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_Test

Definition at line 299 of file gnunet-nat-auto_legacy.c.

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_Test::lsock, GNUNET_NAT_Test::ltask, GNUNET_NAT_Test::na_head, GNUNET_NAT_Test::na_tail, NatActivity::rtask, and NatActivity::sock.

Referenced by GNUNET_NAT_test_start().

300 {
301  struct GNUNET_NAT_Test *tst = cls;
302  struct GNUNET_NETWORK_Handle *s;
303  struct NatActivity *wl;
304 
306  tst->lsock,
307  &do_accept,
308  tst);
310  NULL,
311  NULL);
312  if (NULL == s)
313  {
315  "accept");
316  return; /* odd error */
317  }
319  "Got an inbound connection, waiting for data\n");
320  wl = GNUNET_new (struct NatActivity);
321  wl->sock = s;
322  wl->h = tst;
323  wl->rtask =
325  wl->sock,
326  &do_read,
327  wl);
329  tst->na_tail,
330  wl);
331 }
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
struct GNUNET_NETWORK_Handle * sock
Socket of the incoming connection.
static void do_read(void *cls)
Activity on our incoming socket.
struct NatActivity * na_tail
Tail of list of nat activities.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
struct GNUNET_SCHEDULER_Task * rtask
Task reading from the incoming connection.
Entry we keep for each incoming connection.
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:468
#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...
#define LOG(kind,...)
struct NatActivity * na_head
Head of list of nat activities.
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
static void do_accept(void *cls)
Activity on our listen socket.
Handle to a NAT test.
struct GNUNET_SCHEDULER_Task * ltask
Identity of task for the listen socket (if any)
struct GNUNET_NETWORK_Handle * lsock
Handle to listen socket, or NULL.
handle to a socket
Definition: network.c:46
struct GNUNET_NAT_Test * h
Handle of the master context.
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:1478
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 342 of file gnunet-nat-auto_legacy.c.

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

Referenced by addr_cb().

344 {
345  struct ClientActivity *ca = cls;
346  struct GNUNET_NAT_Test *tst = ca->h;
347 
349  tst->ca_tail,
350  ca);
351  GNUNET_MQ_destroy (ca->mq);
352  GNUNET_free (ca);
353 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct GNUNET_MQ_Handle * mq
Socket of the incoming connection.
struct ClientActivity * ca_tail
Tail of list of client activities.
struct ClientActivity * ca_head
Head of list of client activities.
struct GNUNET_NAT_Test * h
Handle to overall NAT test.
Handle to a NAT test.
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:824
Entry we keep for each connection to the gnunet-nat-service.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ addr_cb()

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

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

Parameters
clsclosure
add_removeGNUNET_YES to mean the new public IP address, GNUNET_NO to mean the previous (now invalid) one
addreither the previous or the new public IP address
addrlenactual length of the addr

Definition at line 366 of file gnunet-nat-auto_legacy.c.

References _, GNUNET_NAT_Test::ca_head, GNUNET_NAT_Test::ca_tail, GNUNET_NAT_Test::cfg, GNUNET_NAT_TestMessage::data, GNUNET_NAT_Test::data, GNUNET_NAT_TestMessage::dport, GNUNET_NAT_TestMessage::dst_ipv4, 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, NatActivity::h, ClientActivity::h, GNUNET_NAT_TestMessage::is_tcp, GNUNET_NAT_Test::is_tcp, LOG, ClientActivity::mq, mq_error_handler(), and msg.

Referenced by GNUNET_NAT_test_start().

370 {
371  struct GNUNET_NAT_Test *h = cls;
372  struct ClientActivity *ca;
373  struct GNUNET_MQ_Envelope *env;
374  struct GNUNET_NAT_TestMessage *msg;
375  const struct sockaddr_in *sa;
376 
377  if (GNUNET_YES != add_remove)
378  return;
379  if (addrlen != sizeof (struct sockaddr_in))
380  {
382  "NAT test ignores IPv6 address `%s' returned from NAT library\n",
383  GNUNET_a2s (addr,
384  addrlen));
385  return; /* ignore IPv6 here */
386  }
388  "Asking gnunet-nat-server to connect to `%s'\n",
389  GNUNET_a2s (addr,
390  addrlen));
391 
392  ca = GNUNET_new (struct ClientActivity);
393  ca->h = h;
394  ca->mq = GNUNET_CLIENT_connect (h->cfg,
395  "gnunet-nat-server",
396  NULL,
398  ca);
399  if (NULL == ca->mq)
400  {
401  GNUNET_free (ca);
403  _("Failed to connect to `gnunet-nat-server'\n"));
404  return;
405  }
407  h->ca_tail,
408  ca);
409  sa = (const struct sockaddr_in *) addr;
410  env = GNUNET_MQ_msg (msg,
412  msg->dst_ipv4 = sa->sin_addr.s_addr;
413  msg->dport = sa->sin_port;
414  msg->data = h->data;
415  msg->is_tcp = htonl ((uint32_t) h->is_tcp);
416  GNUNET_MQ_send (ca->mq,
417  env);
418 }
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration used.
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
uint32_t dst_ipv4
IPv4 target IP address.
Definition: nat.h:49
uint16_t data
Data that should be transmitted or source-port.
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:901
struct GNUNET_MQ_Handle * mq
Socket of the incoming connection.
int32_t is_tcp
GNUNET_YES for TCP, GNUNET_NO for UDP.
Definition: nat.h:64
#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.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
#define _(String)
GNU gettext support macro.
Definition: platform.h:208
uint16_t dport
Port to use, 0 to send dummy ICMP response.
Definition: nat.h:54
struct ClientActivity * ca_tail
Tail of list of client activities.
struct ClientActivity * ca_head
Head of list of client activities.
#define LOG(kind,...)
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)...
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
We got disconnected from the NAT server.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
struct GNUNET_NAT_Test * h
Handle to overall NAT test.
Handle to a NAT test.
Request to test NAT traversal, sent to the gnunet-nat-server (not the service!).
Definition: nat.h:39
#define GNUNET_log(kind,...)
#define GNUNET_YES
Definition: gnunet_common.h:80
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
Entry we keep for each connection to the gnunet-nat-service.
int is_tcp
GNUNET_YES if we're testing TCP
#define GNUNET_free(ptr)
Wrapper around free.
uint16_t data
Data to send OR advertised-port (in NBO) to use for dummy ICMP.
Definition: nat.h:59
Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_timeout()

static void do_timeout ( void *  cls)
static

Timeout task for a nat test.

Calls the report-callback with a timeout return value

Destroys the nat handle after the callback has been processed.

Parameters
clshandle to the timed out NAT test

Definition at line 430 of file gnunet-nat-auto_legacy.c.

References GNUNET_NAT_ERROR_SUCCESS, GNUNET_NAT_ERROR_TIMEOUT, nh, GNUNET_NAT_Test::report, GNUNET_NAT_Test::report_cls, GNUNET_NAT_Test::status, and GNUNET_NAT_Test::ttask.

Referenced by GNUNET_NAT_test_start().

431 {
432  struct GNUNET_NAT_Test *nh = cls;
433 
434  nh->ttask = NULL;
435  nh->report (nh->report_cls,
438  : nh->status);
439 }
void * report_cls
Closure for report.
GNUNET_NAT_TestCallback report
Function to call with success report.
static struct GNUNET_NAT_Handle * nh
Handle to NAT operation.
Definition: gnunet-nat.c:80
struct GNUNET_SCHEDULER_Task * ttask
Task identifier for the timeout (if any)
Handle to a NAT test.
enum GNUNET_NAT_StatusCode status
Status code to be reported to the timeout/status call.
Here is the caller graph for this function:

◆ GNUNET_NAT_test_start()

struct GNUNET_NAT_Test* GNUNET_NAT_test_start ( const struct GNUNET_CONFIGURATION_Handle cfg,
int  is_tcp,
uint16_t  bnd_port,
uint16_t  adv_port,
struct GNUNET_TIME_Relative  timeout,
GNUNET_NAT_TestCallback  report,
void *  report_cls 
)

Start testing if NAT traversal works using the given configuration (IPv4-only).

ALL failures are reported directly to the report callback

Parameters
cfgconfiguration for the NAT traversal
is_tcpGNUNET_YES to test TCP, GNUNET_NO to test UDP
bnd_portport to bind to, 0 for connection reversal
adv_portexternally advertised port to use
timeoutdelay after which the test should be aborted
reportfunction to call with the result of the test
report_clsclosure for report
Returns
handle to cancel NAT test or NULL. The error is always indicated via the report callback

Definition at line 458 of file gnunet-nat-auto_legacy.c.

References _, addr_cb(), GNUNET_NAT_Test::adv_port, cfg, GNUNET_NAT_Test::cfg, GNUNET_NAT_Test::data, do_accept(), do_timeout(), do_udp_read(), GNUNET_a2s(), GNUNET_break, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_log, GNUNET_NAT_ERROR_INTERNAL_NETWORK_ERROR, GNUNET_NAT_ERROR_NAT_REGISTER_FAILED, GNUNET_NAT_ERROR_SUCCESS, GNUNET_NAT_register(), GNUNET_NETWORK_socket_bind(), GNUNET_NETWORK_socket_close(), GNUNET_NETWORK_socket_create(), GNUNET_NETWORK_socket_listen(), GNUNET_new, GNUNET_OK, GNUNET_SCHEDULER_add_delayed(), GNUNET_SCHEDULER_add_now(), GNUNET_SCHEDULER_add_read_net(), GNUNET_SCHEDULER_cancel(), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, GNUNET_NAT_Test::is_tcp, LOG, GNUNET_NAT_Test::lsock, GNUNET_NAT_Test::ltask, GNUNET_NAT_Test::nat, nh, GNUNET_NAT_Test::report, GNUNET_NAT_Test::report_cls, reversal_cb(), GNUNET_NAT_Test::status, STRERROR, and GNUNET_NAT_Test::ttask.

Referenced by reversal_test().

465 {
466  struct GNUNET_NAT_Test *nh;
467  struct sockaddr_in sa;
468  const struct sockaddr *addrs[] = {
469  (const struct sockaddr *) &sa
470  };
471  const socklen_t addrlens[] = {
472  sizeof (sa)
473  };
474 
475  memset (&sa, 0, sizeof (sa));
476  sa.sin_family = AF_INET;
477  sa.sin_port = htons (bnd_port);
478 #if HAVE_SOCKADDR_IN_SIN_LEN
479  sa.sin_len = sizeof (sa);
480 #endif
481 
482  nh = GNUNET_new (struct GNUNET_NAT_Test);
483  nh->cfg = cfg;
484  nh->is_tcp = is_tcp;
485  nh->data = bnd_port;
486  nh->adv_port = adv_port;
487  nh->report = report;
488  nh->report_cls = report_cls;
490  if (0 == bnd_port)
491  {
492  nh->nat
493  = GNUNET_NAT_register (cfg,
494  is_tcp,
495  0,
496  0,
497  NULL,
498  NULL,
499  &addr_cb,
500  &reversal_cb,
501  nh,
502  NULL);
503  }
504  else
505  {
506  nh->lsock =
508  (is_tcp ==
509  GNUNET_YES) ? SOCK_STREAM : SOCK_DGRAM,
510  0);
511  if ((nh->lsock == NULL) ||
512  (GNUNET_OK !=
514  (const struct sockaddr *) &sa,
515  sizeof (sa))))
516  {
518  _("Failed to create listen socket bound to `%s' for NAT test: %s\n"),
519  GNUNET_a2s ((const struct sockaddr *) &sa,
520  sizeof (sa)),
521  STRERROR (errno));
522  if (NULL != nh->lsock)
523  {
525  nh->lsock = NULL;
526  }
529  nh);
530  return nh;
531  }
532  if (GNUNET_YES == is_tcp)
533  {
536  5));
537  nh->ltask =
539  nh->lsock,
540  &do_accept,
541  nh);
542  }
543  else
544  {
545  nh->ltask =
547  nh->lsock,
548  &do_udp_read,
549  nh);
550  }
552  "NAT test listens on port %u (%s)\n",
553  bnd_port,
554  (GNUNET_YES == is_tcp) ? "tcp" : "udp");
555  nh->nat = GNUNET_NAT_register (cfg,
556  is_tcp,
557  adv_port,
558  1,
559  addrs,
560  addrlens,
561  &addr_cb,
562  NULL,
563  nh,
564  NULL);
565  if (NULL == nh->nat)
566  {
568  _("NAT test failed to start NAT library\n"));
569  if (NULL != nh->ltask)
570  {
572  nh->ltask = NULL;
573  }
574  if (NULL != nh->lsock)
575  {
577  nh->lsock = NULL;
578  }
581  nh);
582  return nh;
583  }
584  }
585  nh->ttask = GNUNET_SCHEDULER_add_delayed (timeout,
586  &do_timeout,
587  nh);
588  return nh;
589 }
int GNUNET_NETWORK_socket_listen(const struct GNUNET_NETWORK_Handle *desc, int backlog)
Listen on a socket.
Definition: network.c:796
NAT test failed to initiate.
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration used.
uint16_t data
Data that should be transmitted or source-port.
#define STRERROR(i)
Definition: plibc.h:676
int 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:522
void * report_cls
Closure for report.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_new(type)
Allocate a struct or union of the given type.
GNUNET_NAT_TestCallback report
Function to call with success report.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_NAT_Handle * nat
Handle to NAT traversal in use.
#define _(String)
GNU gettext support macro.
Definition: platform.h:208
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1246
uint16_t adv_port
Advertised port to the other peer.
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:1273
#define LOG(kind,...)
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
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)...
static void do_udp_read(void *cls)
Activity on our incoming socket.
static struct GNUNET_NAT_Handle * nh
Handle to NAT operation.
Definition: gnunet-nat.c:80
Failure in network subsystem, check permissions.
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:104
static void do_accept(void *cls)
Activity on our listen socket.
static void addr_cb(void *cls, int add_remove, const struct sockaddr *addr, socklen_t addrlen)
Address-callback, used to send message to gnunet-nat-server.
struct GNUNET_SCHEDULER_Task * ttask
Task identifier for the timeout (if any)
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:378
Handle to a NAT test.
static void do_timeout(void *cls)
Timeout task for a nat test.
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...
struct GNUNET_SCHEDULER_Task * ltask
Identity of task for the listen socket (if any)
#define GNUNET_log(kind,...)
struct GNUNET_NETWORK_Handle * lsock
Handle to listen socket, or NULL.
enum GNUNET_NAT_StatusCode status
Status code to be reported to the timeout/status call.
#define GNUNET_YES
Definition: gnunet_common.h:80
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:1478
int is_tcp
GNUNET_YES if we're testing TCP
int GNUNET_NETWORK_socket_close(struct GNUNET_NETWORK_Handle *desc)
Close a socket.
Definition: network.c:604
struct GNUNET_NETWORK_Handle * GNUNET_NETWORK_socket_create(int domain, int type, int protocol)
Create a new socket.
Definition: network.c:1037
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:965
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_NAT_test_stop()

void GNUNET_NAT_test_stop ( struct GNUNET_NAT_Test tst)

Stop an active NAT test.

Parameters
tsttest to stop.

Definition at line 598 of file gnunet-nat-auto_legacy.c.

References GNUNET_NAT_Test::ca_head, GNUNET_NAT_Test::ca_tail, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_MQ_destroy(), GNUNET_NAT_unregister(), GNUNET_NETWORK_socket_close(), GNUNET_SCHEDULER_cancel(), LOG, GNUNET_NAT_Test::lsock, GNUNET_NAT_Test::ltask, ClientActivity::mq, GNUNET_NAT_Test::na_head, GNUNET_NAT_Test::na_tail, GNUNET_NAT_Test::nat, NatActivity::rtask, NatActivity::sock, and GNUNET_NAT_Test::ttask.

Referenced by GNUNET_NAT_autoconfig_cancel(), and result_callback().

599 {
600  struct NatActivity *pos;
601  struct ClientActivity *cpos;
602 
604  "Stopping NAT test\n");
605  while (NULL != (cpos = tst->ca_head))
606  {
608  tst->ca_tail,
609  cpos);
610  GNUNET_MQ_destroy (cpos->mq);
611  GNUNET_free (cpos);
612  }
613  while (NULL != (pos = tst->na_head))
614  {
616  tst->na_tail,
617  pos);
620  GNUNET_free (pos);
621  }
622  if (NULL != tst->ttask)
623  {
625  tst->ttask = NULL;
626  }
627  if (NULL != tst->ltask)
628  {
630  tst->ltask = NULL;
631  }
632  if (NULL != tst->lsock)
633  {
635  tst->lsock = NULL;
636  }
637  if (NULL != tst->nat)
638  {
639  GNUNET_NAT_unregister (tst->nat);
640  tst->nat = NULL;
641  }
642  GNUNET_free (tst);
643 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct GNUNET_MQ_Handle * mq
Socket of the incoming connection.
struct GNUNET_NETWORK_Handle * sock
Socket of the incoming connection.
struct NatActivity * na_tail
Tail of list of nat activities.
struct GNUNET_NAT_Handle * nat
Handle to NAT traversal in use.
struct GNUNET_SCHEDULER_Task * rtask
Task reading from the incoming connection.
Entry we keep for each incoming connection.
struct ClientActivity * ca_tail
Tail of list of client activities.
struct ClientActivity * ca_head
Head of list of client activities.
#define LOG(kind,...)
struct NatActivity * na_head
Head of list of nat activities.
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:690
struct GNUNET_SCHEDULER_Task * ttask
Task identifier for the timeout (if any)
struct GNUNET_SCHEDULER_Task * ltask
Identity of task for the listen socket (if any)
struct GNUNET_NETWORK_Handle * lsock
Handle to listen socket, or NULL.
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:824
Entry we keep for each connection to the gnunet-nat-service.
int GNUNET_NETWORK_socket_close(struct GNUNET_NETWORK_Handle *desc)
Close a socket.
Definition: network.c:604
#define GNUNET_free(ptr)
Wrapper around free.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:965
Here is the call graph for this function:
Here is the caller graph for this function: