GNUnet  0.10.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__)

◆ 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 lenght of the addr

Definition at line 183 of file nat_auto_api_test.c.

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

Referenced by GNUNET_NAT_AUTO_test_start().

184 {
185  struct GNUNET_NAT_AUTO_Test *h = cls;
186  const struct sockaddr_in *sa;
187 
188  if (sizeof(struct sockaddr_in) != addrlen)
189  return;
190  sa = (const struct sockaddr_in *)addr;
191  if (h->data != sa->sin_port)
192  {
194  "Received connection reversal request for wrong port\n");
195  return; /* wrong port */
196  }
197  /* report success */
199 }
GNUNET_NAT_TestCallback report
Function to call with success report.
#define LOG(kind,...)
Handle to a NAT test.
void * report_cls
Closure for report.
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
uint16_t data
Data that should be transmitted or source-port.
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 209 of file nat_auto_api_test.c.

References data, GNUNET_NAT_AUTO_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_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().

210 {
211  struct GNUNET_NAT_AUTO_Test *tst = cls;
212  uint16_t data;
213  const struct GNUNET_SCHEDULER_TaskContext *tc;
214 
217  tst->lsock,
218  &do_udp_read,
219  tst);
220  if ((NULL != tc->write_ready) &&
222  (sizeof(data) ==
223  GNUNET_NETWORK_socket_recv(tst->lsock, &data, sizeof(data))))
224  {
225  if (data == tst->data)
227  else
229  "Received data mismatches expected value\n");
230  }
231  else
233  "Failed to receive data from inbound connection\n");
234 }
const struct GNUNET_SCHEDULER_TaskContext * GNUNET_SCHEDULER_get_task_context(void)
Obtain the reasoning why the current task was started.
Definition: scheduler.c:737
GNUNET_NAT_TestCallback report
Function to call with success report.
#define LOG(kind,...)
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:775
static struct GNUNET_SCHEDULER_TaskContext tc
Task context of the current task.
Definition: scheduler.c:410
static void do_udp_read(void *cls)
Activity on our incoming socket.
Handle to a NAT test.
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 ...
void * report_cls
Closure for report.
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 ...
struct GNUNET_SCHEDULER_Task * ltask
Identity of task for the listen socket (if any)
uint16_t data
Data that should be transmitted or source-port.
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
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:1467
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:1017
uint32_t data
The data value.
struct GNUNET_NETWORK_Handle * lsock
Handle to listen socket, or NULL.
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 244 of file nat_auto_api_test.c.

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().

245 {
246  struct NatActivity *na = cls;
247  struct GNUNET_NAT_AUTO_Test *tst;
248  uint16_t data;
249  const struct GNUNET_SCHEDULER_TaskContext *tc;
250 
252  na->rtask = NULL;
253  tst = na->h;
255  if ((NULL != tc->write_ready) &&
257  (sizeof(data) ==
258  GNUNET_NETWORK_socket_recv(na->sock, &data, sizeof(data))))
259  {
260  if (data == tst->data)
262  else
264  "Received data does not match expected value\n");
265  }
266  else
268  "Failed to receive data from inbound connection\n");
270  GNUNET_free(na);
271 }
#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:737
GNUNET_NAT_TestCallback report
Function to call with success report.
#define LOG(kind,...)
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:775
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:410
Handle to a NAT test.
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_head
Head of list of nat activities.
void * report_cls
Closure for report.
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 ...
struct GNUNET_SCHEDULER_Task * rtask
Task reading from the incoming connection.
Entry we keep for each incoming connection.
uint16_t data
Data that should be transmitted or source-port.
struct NatActivity * na_tail
Tail of list of nat activities.
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:1017
uint32_t data
The data value.
int GNUNET_NETWORK_socket_close(struct GNUNET_NETWORK_Handle *desc)
Close a socket.
Definition: network.c:548
#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_AUTO_Test

Definition at line 281 of file nat_auto_api_test.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_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().

282 {
283  struct GNUNET_NAT_AUTO_Test *tst = cls;
284  struct GNUNET_NETWORK_Handle *s;
285  struct NatActivity *wl;
286 
288  tst->lsock,
289  &do_accept,
290  tst);
291  s = GNUNET_NETWORK_socket_accept(tst->lsock, NULL, NULL);
292  if (NULL == s)
293  {
295  return; /* odd error */
296  }
298  "Got an inbound connection, waiting for data\n");
299  wl = GNUNET_new(struct NatActivity);
300  wl->sock = s;
301  wl->h = tst;
303  wl->sock,
304  &do_read,
305  wl);
307 }
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
#define LOG(kind,...)
struct GNUNET_NETWORK_Handle * sock
Socket of the incoming connection.
Handle to a NAT test.
struct NatActivity * na_head
Head 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:420
#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...
struct GNUNET_SCHEDULER_Task * ltask
Identity of task for the listen socket (if any)
static void do_read(void *cls)
Activity on our incoming socket.
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
static void do_accept(void *cls)
Activity on our listen socket.
struct NatActivity * na_tail
Tail of list of nat activities.
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:1467
struct GNUNET_NETWORK_Handle * lsock
Handle to listen socket, or NULL.
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 318 of file nat_auto_api_test.c.

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().

319 {
320  struct ClientActivity *ca = cls;
321  struct GNUNET_NAT_AUTO_Test *tst = ca->h;
322 
324  GNUNET_MQ_destroy(ca->mq);
325  GNUNET_free(ca);
326 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct ClientActivity * ca_tail
Tail of list of client activities.
struct GNUNET_MQ_Handle * mq
Socket of the incoming connection.
Handle to a NAT test.
struct ClientActivity * ca_head
Head of list of client activities.
struct GNUNET_NAT_Test * h
Handle to overall NAT test.
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:821
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,
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 342 of file nat_auto_api_test.c.

References _, GNUNET_NAT_AUTO_Test::ca_head, GNUNET_NAT_AUTO_Test::ca_tail, GNUNET_NAT_AUTO_Test::cfg, GNUNET_NAT_AUTO_TestMessage::data, GNUNET_NAT_AUTO_Test::data, GNUNET_NAT_AUTO_TestMessage::dport, GNUNET_NAT_AUTO_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_AUTO_TestMessage::is_tcp, LOG, ClientActivity::mq, mq_error_handler(), msg, and GNUNET_NAT_AUTO_Test::proto.

Referenced by GNUNET_NAT_AUTO_test_start().

348 {
349  struct GNUNET_NAT_AUTO_Test *h = cls;
350  struct ClientActivity *ca;
351  struct GNUNET_MQ_Envelope *env;
353  const struct sockaddr_in *sa;
354 
355  (void)app_ctx;
356  if (GNUNET_YES != add_remove)
357  return;
358  if (addrlen != sizeof(struct sockaddr_in))
359  {
361  "NAT test ignores IPv6 address `%s' returned from NAT library\n",
362  GNUNET_a2s(addr, addrlen));
363  return; /* ignore IPv6 here */
364  }
366  "Asking gnunet-nat-server to connect to `%s'\n",
367  GNUNET_a2s(addr, addrlen));
368 
369  ca = GNUNET_new(struct ClientActivity);
370  ca->h = h;
371  ca->mq = GNUNET_CLIENT_connect(h->cfg,
372  "gnunet-nat-server",
373  NULL,
375  ca);
376  if (NULL == ca->mq)
377  {
378  GNUNET_free(ca);
380  _("Failed to connect to `gnunet-nat-server'\n"));
381  return;
382  }
384  sa = (const struct sockaddr_in *)addr;
386  msg->dst_ipv4 = sa->sin_addr.s_addr;
387  msg->dport = sa->sin_port;
388  msg->data = h->data;
389  msg->is_tcp = htonl((uint32_t)(h->proto == IPPROTO_TCP));
390  GNUNET_MQ_send(ca->mq, env);
391 }
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
We got disconnected from the NAT server.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
#define LOG(kind,...)
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:900
struct ClientActivity * ca_tail
Tail of list of client activities.
struct GNUNET_MQ_Handle * mq
Socket of the incoming connection.
Handle to a NAT test.
#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:181
uint16_t data
Data that should be transmitted or source-port.
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)...
int32_t is_tcp
GNUNET_YES for TCP, GNUNET_NO for UDP.
Definition: nat-auto.h:63
struct ClientActivity * ca_head
Head of list of client activities.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
struct GNUNET_NAT_Test * h
Handle to overall NAT test.
uint32_t dst_ipv4
IPv4 target IP address.
Definition: nat-auto.h:48
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration used.
#define GNUNET_log(kind,...)
uint16_t dport
Port to use, 0 to send dummy ICMP response.
Definition: nat-auto.h:53
#define GNUNET_YES
Definition: gnunet_common.h:77
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:351
uint16_t data
Data to send OR advertised-port (in NBO) to use for dummy ICMP.
Definition: nat-auto.h:58
int proto
IPPROTO_TCP or IPPROTO_UDP.
Entry we keep for each connection to the gnunet-nat-service.
Request to test NAT traversal, sent to the gnunet-nat-server (not the service!).
Definition: nat-auto.h:39
#define GNUNET_free(ptr)
Wrapper around free.
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 402 of file nat_auto_api_test.c.

References nh, GNUNET_NAT_AUTO_Test::report, GNUNET_NAT_AUTO_Test::report_cls, GNUNET_NAT_AUTO_Test::status, and GNUNET_NAT_AUTO_Test::ttask.

Referenced by GNUNET_NAT_AUTO_test_start().

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