GNUnet 0.27.0
 
Loading...
Searching...
No Matches
gnunet-service-nat_helper.h File Reference

runs the gnunet-helper-nat-server More...

#include "platform.h"
#include "gnunet_util_lib.h"
Include dependency graph for gnunet-service-nat_helper.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Typedefs

typedef void(* GN_ReversalCallback) (void *cls, const struct sockaddr_in *ra)
 Function called whenever we get a connection reversal request from another peer.
 

Functions

struct HelperContextGN_start_gnunet_nat_server_ (const struct in_addr *internal_address, GN_ReversalCallback cb, void *cb_cls, const struct GNUNET_CONFIGURATION_Handle *cfg)
 Start the gnunet-helper-nat-server and process incoming requests.
 
void GN_stop_gnunet_nat_server_ (struct HelperContext *h)
 Start the gnunet-helper-nat-server and process incoming requests.
 
int GN_request_connection_reversal (const struct in_addr *internal_address, uint16_t internal_port, const struct in_addr *remote_v4, const struct GNUNET_CONFIGURATION_Handle *cfg)
 We want to connect to a peer that is behind NAT.
 

Detailed Description

runs the gnunet-helper-nat-server

Author
Milan Bouchet-Valat
Christian Grothoff

Definition in file gnunet-service-nat_helper.h.

Typedef Documentation

◆ GN_ReversalCallback

typedef void(* GN_ReversalCallback) (void *cls, const struct sockaddr_in *ra)

Function called whenever we get a connection reversal request from another peer.

Parameters
clsclosure
raIP address of the peer who wants us to connect to it

Definition at line 44 of file gnunet-service-nat_helper.h.

Function Documentation

◆ GN_start_gnunet_nat_server_()

struct HelperContext * GN_start_gnunet_nat_server_ ( const struct in_addr *  internal_address,
GN_ReversalCallback  cb,
void *  cb_cls,
const struct GNUNET_CONFIGURATION_Handle cfg 
)

Start the gnunet-helper-nat-server and process incoming requests.

Parameters
internal_address
cbfunction to call if we receive a request
cb_clsclosure for cb
cfghandle to the GNUnet configuration
Returns
NULL on error

Definition at line 290 of file gnunet-service-nat_helper.c.

294{
295 struct HelperContext *h;
296
297 h = GNUNET_new (struct HelperContext);
298 h->cb = cb;
299 h->cb_cls = cb_cls;
300 h->internal_address = *internal_address;
301 h->cfg = cfg;
303 if (NULL == h->server_stdout)
304 {
306 return NULL;
307 }
308 return h;
309}
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
void GN_stop_gnunet_nat_server_(struct HelperContext *h)
Start the gnunet-helper-nat-server and process incoming requests.
static void restart_nat_server(void *cls)
Task that restarts the gnunet-helper-nat-server process after a crash after a certain delay.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
const struct GNUNET_CONFIGURATION_Handle * cfg
The configuration that we are using.
Definition arm_api.c:112
Information we keep per NAT helper process.
struct in_addr internal_address
IP address we pass to the NAT helper.
GN_ReversalCallback cb
Function to call if we receive a reversal request.
void * cb_cls
Closure for cb.

References HelperContext::cb, HelperContext::cb_cls, cfg, GNUNET_ARM_Handle::cfg, GN_stop_gnunet_nat_server_(), GNUNET_new, h, HelperContext::internal_address, and restart_nat_server().

Referenced by run_scan().

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

◆ GN_stop_gnunet_nat_server_()

void GN_stop_gnunet_nat_server_ ( struct HelperContext h)

Start the gnunet-helper-nat-server and process incoming requests.

Parameters
hhelper context to stop

Definition at line 319 of file gnunet-service-nat_helper.c.

320{
321 if (NULL != h->server_read_task)
322 {
323 GNUNET_SCHEDULER_cancel (h->server_read_task);
324 h->server_read_task = NULL;
325 }
326 if (NULL != h->server_proc)
327 {
328 if (GNUNET_OK !=
329 GNUNET_process_kill (h->server_proc,
332 "kill");
334 GNUNET_process_wait (h->server_proc,
335 true,
336 NULL,
337 NULL));
338 GNUNET_process_destroy (h->server_proc);
339 h->server_proc = NULL;
340 GNUNET_DISK_pipe_close (h->server_stdout);
341 h->server_stdout = NULL;
342 h->server_stdout_handle = NULL;
343 }
344 if (NULL != h->server_stdout)
345 {
346 GNUNET_DISK_pipe_close (h->server_stdout);
347 h->server_stdout = NULL;
348 h->server_stdout_handle = NULL;
349 }
350 GNUNET_free (h);
351}
enum GNUNET_GenericReturnValue GNUNET_DISK_pipe_close(struct GNUNET_DISK_PipeHandle *p)
Closes an interprocess channel.
Definition disk.c:1671
@ GNUNET_OK
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#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_WARNING
#define GNUNET_free(ptr)
Wrapper around free.
enum GNUNET_GenericReturnValue GNUNET_process_wait(struct GNUNET_Process *proc, bool blocking, enum GNUNET_OS_ProcessStatusType *type, unsigned long *code)
Wait for a process to terminate.
void GNUNET_process_destroy(struct GNUNET_Process *proc)
Cleans up process structure contents (OS-dependent) and deallocates it.
Definition os_process.c:363
enum GNUNET_GenericReturnValue GNUNET_process_kill(struct GNUNET_Process *proc, int sig)
Sends a signal to the process.
Definition os_process.c:307
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition scheduler.c:986
#define GNUNET_TERM_SIG
The termination signal.
Definition platform.h:235

References GNUNET_assert, GNUNET_DISK_pipe_close(), GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log_strerror, GNUNET_OK, GNUNET_process_destroy(), GNUNET_process_kill(), GNUNET_process_wait(), GNUNET_SCHEDULER_cancel(), GNUNET_TERM_SIG, and h.

Referenced by free_lal(), and GN_start_gnunet_nat_server_().

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

◆ GN_request_connection_reversal()

int GN_request_connection_reversal ( const struct in_addr *  internal_address,
uint16_t  internal_port,
const struct in_addr *  remote_v4,
const struct GNUNET_CONFIGURATION_Handle cfg 
)

We want to connect to a peer that is behind NAT.

Run the gnunet-helper-nat-client to send dummy ICMP responses to cause that peer to connect to us (connection reversal).

Parameters
internal_addressout internal address to use
internal_portinternal port to use
remote_v4the address of the peer (IPv4-only)
cfghandle to the GNUnet configuration
Returns
GNUNET_SYSERR on error, GNUNET_OK otherwise

Run the gnunet-helper-nat-client to send dummy ICMP responses to cause that peer to connect to us (connection reversal).

Parameters
internal_addressout internal address to use
internal_portport to use
remote_v4the address of the peer (IPv4-only)
cfghandle to the GNUnet configuration
Returns
GNUNET_SYSERR on error, GNUNET_OK otherwise

Definition at line 367 of file gnunet-service-nat_helper.c.

371{
372 char intv4[INET_ADDRSTRLEN];
373 char remv4[INET_ADDRSTRLEN];
374 char port_as_string[6];
375 struct GNUNET_Process *proc;
376 char *binary;
377
378 if (NULL == inet_ntop (AF_INET,
379 internal_address,
380 intv4,
381 INET_ADDRSTRLEN))
382 {
384 "inet_ntop");
385 return GNUNET_SYSERR;
386 }
387 if (NULL == inet_ntop (AF_INET,
388 remote_v4,
389 remv4,
390 INET_ADDRSTRLEN))
391 {
393 "inet_ntop");
394 return GNUNET_SYSERR;
395 }
396 GNUNET_snprintf (port_as_string,
397 sizeof(port_as_string),
398 "%d",
399 internal_port);
401 "Running gnunet-helper-nat-client %s %s %u\n",
402 intv4,
403 remv4,
404 internal_port);
406 cfg,
407 "gnunet-helper-nat-client");
409 if (GNUNET_OK !=
411 proc,
412 binary,
413 "gnunet-helper-nat-client",
414 intv4,
415 remv4,
416 port_as_string,
417 NULL))
418 {
420 GNUNET_free (binary);
421 return GNUNET_SYSERR;
422 }
423 GNUNET_free (binary);
424 /* we know that the gnunet-helper-nat-client will terminate virtually
425 * instantly */
428 true,
429 NULL,
430 NULL));
432 return GNUNET_OK;
433}
#define GNUNET_log(kind,...)
@ GNUNET_SYSERR
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_DEBUG
int GNUNET_snprintf(char *buf, size_t size, const char *format,...) __attribute__((format(printf
Like snprintf, just aborts if the buffer is of insufficient size.
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_gnunet(void)
Return default project data used by 'libgnunetutil' for GNUnet.
enum GNUNET_GenericReturnValue GNUNET_process_run_command_va(struct GNUNET_Process *p, const char *filename,...)
Set the command and start a process.
Definition os_process.c:903
char * GNUNET_OS_get_suid_binary_path(const struct GNUNET_OS_ProjectData *pd, const struct GNUNET_CONFIGURATION_Handle *cfg, const char *progname)
Given the name of a helper, service or daemon binary construct the full path to the binary using the ...
struct GNUNET_Process * GNUNET_process_create(enum GNUNET_OS_InheritStdioFlags std_inheritance)
Create a process handle.
Definition os_process.c:462
@ GNUNET_OS_INHERIT_STD_NONE
No standard streams should be inherited.

References cfg, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log, GNUNET_log_strerror, GNUNET_OK, GNUNET_OS_get_suid_binary_path(), GNUNET_OS_INHERIT_STD_NONE, GNUNET_OS_project_data_gnunet(), GNUNET_process_create(), GNUNET_process_destroy(), GNUNET_process_run_command_va(), GNUNET_process_wait(), GNUNET_snprintf(), and GNUNET_SYSERR.

Referenced by handle_request_connection_reversal().

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