28 #include "gnunet_nat_lib.h" 31 #define LOG(kind, ...) GNUNET_log_from (kind, "nat", __VA_ARGS__) 33 #define NAT_SERVER_TIMEOUT \ 34 GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) 186 reversal_cb (
void *cls,
const struct sockaddr *addr, socklen_t addrlen)
189 const struct sockaddr_in *sa;
191 if (
sizeof(
struct sockaddr_in) != addrlen)
193 sa = (
const struct sockaddr_in *) addr;
194 if (h->
data != sa->sin_port)
197 "Received connection reversal request for wrong port\n");
228 if (data == tst->
data)
232 "Received data mismatches expected value\n");
236 "Failed to receive data from inbound connection\n");
263 if (data == tst->
data)
267 "Received data does not match expected value\n");
271 "Failed to receive data from inbound connection\n");
301 "Got an inbound connection, waiting for data\n");
344 const struct sockaddr *addr,
351 const struct sockaddr_in *sa;
355 if (addrlen !=
sizeof(
struct sockaddr_in))
358 "NAT test ignores IPv6 address `%s' returned from NAT library\n",
363 "Asking gnunet-nat-server to connect to `%s'\n",
377 _ (
"Failed to connect to `gnunet-nat-server'\n"));
381 sa = (
const struct sockaddr_in *) addr;
383 msg->
dst_ipv4 = sa->sin_addr.s_addr;
384 msg->
dport = sa->sin_port;
437 struct sockaddr_in sa;
438 const struct sockaddr *addrs[] = { (
const struct sockaddr *) &sa };
439 const socklen_t addrlens[] = {
sizeof(sa) };
441 memset (&sa, 0,
sizeof(sa));
442 sa.sin_family = AF_INET;
443 sa.sin_port = htons (bnd_port);
444 #if HAVE_SOCKADDR_IN_SIN_LEN 445 sa.sin_len =
sizeof(sa);
476 if ((nh->
lsock == NULL) ||
478 (
const struct sockaddr *) &sa,
483 _ (
"Failed to create listen socket bound to `%s' for NAT test: %s\n"),
484 GNUNET_a2s ((
const struct sockaddr *) &sa,
sizeof(sa)),
486 if (NULL != nh->
lsock)
511 "NAT test listens on port %u (%s)\n",
527 _ (
"NAT test failed to start NAT library\n"));
528 if (NULL != nh->
ltask)
533 if (NULL != nh->
lsock)
560 while (NULL != (cpos = tst->
ca_head))
566 while (NULL != (pos = tst->
na_head))
573 if (NULL != tst->
ttask)
578 if (NULL != tst->
ltask)
583 if (NULL != tst->
lsock)
588 if (NULL != tst->
nat)
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
int GNUNET_NETWORK_socket_listen(const struct GNUNET_NETWORK_Handle *desc, int backlog)
Listen on a socket.
NAT test failed to initiate.
const struct GNUNET_SCHEDULER_TaskContext * GNUNET_SCHEDULER_get_task_context(void)
Obtain the reasoning why the current task was started.
Handle for active NAT registrations.
struct ClientActivity * prev
This is a doubly-linked list.
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration used.
struct GNUNET_MessageHeader * msg
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
#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.
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.
Context information passed to each scheduler task.
GNUNET_MQ_Error
Error codes for the queue.
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).
struct GNUNET_MQ_Handle * mq
Socket of the incoming connection.
struct GNUNET_NETWORK_Handle * sock
Socket of the incoming connection.
int32_t is_tcp
GNUNET_YES for TCP, GNUNET_NO for UDP.
static struct GNUNET_SCHEDULER_TaskContext tc
Task context of the current task.
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.
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 ...
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
#define GNUNET_MESSAGE_TYPE_NAT_TEST
Message to ask NAT server to perform traversal test.
static void do_read(void *cls)
Activity on our incoming socket.
void(* GNUNET_NAT_TestCallback)(void *cls, enum GNUNET_NAT_StatusCode result)
Function called to report success or failure for NAT configuration test.
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 ...
#define GNUNET_new(type)
Allocate a struct or union of the given type.
struct ClientActivity * next
This is a doubly-linked list.
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.
struct GNUNET_SCHEDULER_Task * rtask
Task reading from the incoming connection.
uint16_t dport
Port to use, 0 to send dummy ICMP response.
Entry we keep for each incoming connection.
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).
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.
#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 * 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.
static struct GNUNET_TIME_Relative timeout
Desired timeout for the lookup (default is no timeout).
uint16_t adv_port
Advertised port to the other peer.
struct ClientActivity * ca_tail
Tail of list of client activities.
struct ClientActivity * ca_head
Head of list of client activities.
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.
GNUNET_NAT_StatusCode
Error Types for the NAT subsystem (which can then later be converted/resolved to a string) ...
uint16_t status
See PRISM_STATUS_*-constants.
struct NatActivity * na_head
Head of list of nat activities.
#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.
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
We got disconnected from the NAT server.
Failure in network subsystem, check permissions.
void GNUNET_NAT_unregister(struct GNUNET_NAT_Handle *nh)
Stop port redirection and public IP address detection for the given handle.
static void do_accept(void *cls)
Activity on our listen socket.
void GNUNET_NAT_test_stop(struct GNUNET_NAT_Test *tst)
Stop an active NAT test.
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...
struct GNUNET_MQ_Envelope * env
struct GNUNET_NAT_Test * h
Handle to overall NAT test.
Request to test NAT traversal, sent to the gnunet-nat-server (not the service!).
Handle to a message queue.
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)
Messages for interaction with gnunet-nat-server and gnunet-nat-service.
#define GNUNET_log(kind,...)
Entry in list of pending tasks.
struct GNUNET_NETWORK_Handle * lsock
Handle to listen socket, or NULL.
struct NatActivity * prev
This is a doubly-linked list.
struct GNUNET_NAT_Test * h
Handle of the master context.
enum GNUNET_NAT_StatusCode status
Status code to be reported to the timeout/status call.
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
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...
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Entry we keep for each connection to the gnunet-nat-service.
struct NatActivity * next
This is a doubly-linked list.
int is_tcp
GNUNET_YES if we're testing TCP
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.
uint32_t data
The data value.
int GNUNET_NETWORK_socket_close(struct GNUNET_NETWORK_Handle *desc)
Close a socket.
#define GNUNET_free(ptr)
Wrapper around free.
Time for relative time used by GNUnet, in microseconds.
uint16_t data
Data to send OR advertised-port (in NBO) to use for dummy ICMP.
struct GNUNET_NETWORK_Handle * GNUNET_NETWORK_socket_create(int domain, int type, int protocol)
Create a new socket.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.