GNUnet 0.21.1
gnunet-service-nat-auto.c File Reference

NAT autoconfiguration service. More...

#include "platform.h"
#include <math.h>
#include "gnunet_util_lib.h"
#include "gnunet_protocols.h"
#include "gnunet_signatures.h"
#include "gnunet_nat_service.h"
#include "gnunet_statistics_service.h"
#include "gnunet_resolver_service.h"
#include "nat-auto.h"
#include <gcrypt.h>
Include dependency graph for gnunet-service-nat-auto.c:

Go to the source code of this file.

Data Structures

struct  ClientHandle
 Struct containing information about a client, handle to connect to it, and any pending messages that need to be sent to it. More...
 
struct  AutoconfigContext
 Context for autoconfiguration operations. More...
 

Macros

#define AUTOCONFIG_TIMEOUT
 How long do we wait until we forcefully terminate autoconfiguration? More...
 

Functions

static int check_autoconfig_request (void *cls, const struct GNUNET_NAT_AUTO_AutoconfigRequestMessage *message)
 Check validity of #GNUNET_MESSAGE_TYPE_NAT_REQUEST_AUTO_CFG message from client. More...
 
static void terminate_ac_activities (struct AutoconfigContext *ac)
 Stop all pending activities with respect to the ac. More...
 
static void conclude_autoconfig_request (void *cls)
 Finish handling the autoconfiguration request and send the response to the client. More...
 
static void check_autoconfig_finished (struct AutoconfigContext *ac)
 Check if all autoconfiguration operations have concluded, and if they have, send the result back to the client. More...
 
static void update_enable_upnpc_option (struct AutoconfigContext *ac)
 Update ENABLE_UPNPC configuration option. More...
 
static void handle_autoconfig_request (void *cls, const struct GNUNET_NAT_AUTO_AutoconfigRequestMessage *message)
 Handler for #GNUNET_MESSAGE_TYPE_NAT_REQUEST_AUTO_CFG message from client. More...
 
static void shutdown_task (void *cls)
 Task run during shutdown. More...
 
static void run (void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *service)
 Setup NAT service. More...
 
static void * client_connect_cb (void *cls, struct GNUNET_SERVICE_Client *c, struct GNUNET_MQ_Handle *mq)
 Callback called when a client connects to the service. More...
 
static void client_disconnect_cb (void *cls, struct GNUNET_SERVICE_Client *c, void *internal_cls)
 Callback called when a client disconnected from the service. More...
 
 GNUNET_SERVICE_MAIN ("nat-auto", GNUNET_SERVICE_OPTION_NONE, &run, &client_connect_cb, &client_disconnect_cb, NULL, GNUNET_MQ_hd_var_size(autoconfig_request, GNUNET_MESSAGE_TYPE_NAT_AUTO_REQUEST_CFG, struct GNUNET_NAT_AUTO_AutoconfigRequestMessage, NULL), GNUNET_MQ_handler_end())
 Define "main" method using service macro. More...
 

Variables

static struct ClientHandlech_head
 Head of client DLL. More...
 
static struct ClientHandlech_tail
 Tail of client DLL. More...
 
static struct AutoconfigContextac_head
 DLL of our autoconfiguration operations. More...
 
static struct AutoconfigContextac_tail
 DLL of our autoconfiguration operations. More...
 
static const struct GNUNET_CONFIGURATION_Handlecfg
 Handle to our current configuration. More...
 
static struct GNUNET_STATISTICS_Handlestats
 Handle to the statistics service. More...
 

Detailed Description

NAT autoconfiguration service.

Author
Christian Grothoff

TODO:

  • merge client handle and autoconfig context
  • implement "more" autoconfig:
    • re-work gnunet-nat-server & integrate!
    • integrate "legacy" code
    • test manually punched NAT (how?)

Definition in file gnunet-service-nat-auto.c.

Macro Definition Documentation

◆ AUTOCONFIG_TIMEOUT

#define AUTOCONFIG_TIMEOUT
Value:
#define GNUNET_TIME_UNIT_SECONDS
One second.
struct GNUNET_TIME_Relative GNUNET_TIME_relative_multiply(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Multiply relative time by a given factor.
Definition: time.c:484

How long do we wait until we forcefully terminate autoconfiguration?

Definition at line 48 of file gnunet-service-nat-auto.c.

Function Documentation

◆ check_autoconfig_request()

static int check_autoconfig_request ( void *  cls,
const struct GNUNET_NAT_AUTO_AutoconfigRequestMessage message 
)
static

Check validity of #GNUNET_MESSAGE_TYPE_NAT_REQUEST_AUTO_CFG message from client.

Parameters
clsclient who sent the message
messagethe message received
Returns
GNUNET_OK if message is well-formed

Definition at line 173 of file gnunet-service-nat-auto.c.

176{
177 return GNUNET_OK; /* checked later */
178}
@ GNUNET_OK

References GNUNET_OK.

◆ terminate_ac_activities()

static void terminate_ac_activities ( struct AutoconfigContext ac)
static

Stop all pending activities with respect to the ac.

Parameters
acautoconfiguration to terminate activities for

Definition at line 187 of file gnunet-service-nat-auto.c.

188{
189 if (NULL != ac->timeout_task)
190 {
192 ac->timeout_task = NULL;
193 }
194}
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:981
struct GNUNET_SCHEDULER_Task * timeout_task
Timeout task to force termination.

References GNUNET_SCHEDULER_cancel(), and AutoconfigContext::timeout_task.

Referenced by conclude_autoconfig_request(), and shutdown_task().

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

◆ conclude_autoconfig_request()

static void conclude_autoconfig_request ( void *  cls)
static

Finish handling the autoconfiguration request and send the response to the client.

Parameters
clsthe struct AutoconfigContext to conclude

Definition at line 204 of file gnunet-service-nat-auto.c.

205{
206 struct AutoconfigContext *ac = cls;
207 struct ClientHandle *ch = ac->ch;
209 struct GNUNET_MQ_Envelope *env;
210 size_t c_size;
211 char *buf;
212 struct GNUNET_CONFIGURATION_Handle *diff;
213
214 ac->timeout_task = NULL;
216
217 /* Send back response */
219 ac->c);
221 &c_size);
224 c_size,
226 arm->status_code = htonl ((uint32_t) ac->status_code);
227 arm->type = htonl ((uint32_t) ac->type);
228 GNUNET_memcpy (&arm[1],
229 buf,
230 c_size);
231 GNUNET_free (buf);
233 env);
234
235 /* clean up */
239 ac_tail,
240 ac);
241 GNUNET_free (ac);
243}
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static struct GNUNET_CADET_Channel * ch
Channel handle.
Definition: gnunet-cadet.c:117
static struct AutoconfigContext * ac_tail
DLL of our autoconfiguration operations.
static struct AutoconfigContext * ac_head
DLL of our autoconfiguration operations.
static void terminate_ac_activities(struct AutoconfigContext *ac)
Stop all pending activities with respect to the ac.
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
char * GNUNET_CONFIGURATION_serialize(const struct GNUNET_CONFIGURATION_Handle *cfg, size_t *size)
Serializes the given configuration.
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_get_diff(const struct GNUNET_CONFIGURATION_Handle *cfg_default, const struct GNUNET_CONFIGURATION_Handle *cfg_new)
Compute configuration with only entries that have been changed.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_free(ptr)
Wrapper around free.
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:304
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct.
Definition: gnunet_mq_lib.h:63
#define GNUNET_MESSAGE_TYPE_NAT_AUTO_CFG_RESULT
Message from NAT service with the autoconfiguration result.
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2408
Context for autoconfiguration operations.
struct GNUNET_CONFIGURATION_Handle * c
Configuration we are creating.
enum GNUNET_NAT_Type type
NAT type to return to the client.
struct GNUNET_CONFIGURATION_Handle * orig
Original configuration (for diffing).
enum GNUNET_NAT_StatusCode status_code
Status code to return to the client.
struct ClientHandle * ch
Which client asked the question.
Struct containing information about a client, handle to connect to it, and any pending messages that ...
struct GNUNET_MQ_Handle * mq
Message Queue for the channel (which we are implementing).
Definition: cadet.h:142
Service responding with proposed configuration.
Definition: nat-auto.h:85
int32_t type
An enum GNUNET_NAT_Type in NBO.
Definition: nat-auto.h:99
int32_t status_code
An enum GNUNET_NAT_StatusCode in NBO.
Definition: nat-auto.h:94

References ac_head, ac_tail, AutoconfigContext::c, ch, AutoconfigContext::ch, env, GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_get_diff(), GNUNET_CONFIGURATION_serialize(), GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_NAT_AUTO_CFG_RESULT, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_SERVICE_client_continue(), GNUNET_CADET_Channel::mq, AutoconfigContext::orig, AutoconfigContext::status_code, GNUNET_NAT_AUTO_AutoconfigResultMessage::status_code, terminate_ac_activities(), AutoconfigContext::timeout_task, AutoconfigContext::type, and GNUNET_NAT_AUTO_AutoconfigResultMessage::type.

Referenced by check_autoconfig_finished(), and handle_autoconfig_request().

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

◆ check_autoconfig_finished()

static void check_autoconfig_finished ( struct AutoconfigContext ac)
static

Check if all autoconfiguration operations have concluded, and if they have, send the result back to the client.

Parameters
acautoconfiguation context to check

Definition at line 253 of file gnunet-service-nat-auto.c.

254{
256 ac->timeout_task
258 ac);
259}
static void conclude_autoconfig_request(void *cls)
Finish handling the autoconfiguration request and send the response to the client.
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:1305

References conclude_autoconfig_request(), GNUNET_SCHEDULER_add_now(), GNUNET_SCHEDULER_cancel(), and AutoconfigContext::timeout_task.

Referenced by handle_autoconfig_request().

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

◆ update_enable_upnpc_option()

static void update_enable_upnpc_option ( struct AutoconfigContext ac)
static

Update ENABLE_UPNPC configuration option.

Parameters
acautoconfiguration to update

Definition at line 268 of file gnunet-service-nat-auto.c.

269{
270 switch (ac->enable_upnpc)
271 {
272 case GNUNET_YES:
274 "NAT",
275 "ENABLE_UPNP",
276 "YES");
277 break;
278
279 case GNUNET_NO:
281 "NAT",
282 "ENABLE_UPNP",
283 "NO");
284 break;
285
286 case GNUNET_SYSERR:
287 /* We are unsure, do not change option */
288 break;
289 }
290}
void GNUNET_CONFIGURATION_set_value_string(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
Set a configuration value that should be a string.
@ GNUNET_YES
@ GNUNET_NO
@ GNUNET_SYSERR
int enable_upnpc
GNUNET_YES if upnpc should be used, GNUNET_NO if upnpc should not be used, GNUNET_SYSERR if we should...

References AutoconfigContext::c, AutoconfigContext::enable_upnpc, GNUNET_CONFIGURATION_set_value_string(), GNUNET_NO, GNUNET_SYSERR, and GNUNET_YES.

Referenced by handle_autoconfig_request().

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

◆ handle_autoconfig_request()

static void handle_autoconfig_request ( void *  cls,
const struct GNUNET_NAT_AUTO_AutoconfigRequestMessage message 
)
static

Handler for #GNUNET_MESSAGE_TYPE_NAT_REQUEST_AUTO_CFG message from client.

Parameters
clsclient who sent the message
messagethe message received

Definition at line 301 of file gnunet-service-nat-auto.c.

304{
305 struct ClientHandle *ch = cls;
306 size_t left = ntohs (message->header.size) - sizeof(*message);
307 struct AutoconfigContext *ac;
308
309 ac = GNUNET_new (struct AutoconfigContext);
311 ac->ch = ch;
313 if (GNUNET_OK !=
315 (const char *) &message[1],
316 left,
317 NULL))
318 {
319 GNUNET_break (0);
322 GNUNET_free (ac);
323 return;
324 }
326 "Received REQUEST_AUTO_CONFIG message from client\n");
327
329 ac_tail,
330 ac);
331 ac->orig
333 ac->timeout_task
336 ac);
337 ac->enable_upnpc = GNUNET_SYSERR; /* undecided */
338
339 /* Probe for upnpc */
340 if (GNUNET_SYSERR ==
342 GNUNET_NO,
343 NULL))
344 {
346 _ ("UPnP client `upnpc` command not found, disabling UPnP\n"));
348 }
349 else
350 {
351 /* We might at some point be behind NAT, try upnpc */
353 }
355
356 /* Finally, check if we are already done */
358}
static void update_enable_upnpc_option(struct AutoconfigContext *ac)
Update ENABLE_UPNPC configuration option.
#define AUTOCONFIG_TIMEOUT
How long do we wait until we forcefully terminate autoconfiguration?
static void check_autoconfig_finished(struct AutoconfigContext *ac)
Check if all autoconfiguration operations have concluded, and if they have, send the result back to t...
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_dup(const struct GNUNET_CONFIGURATION_Handle *cfg)
Duplicate an existing configuration object.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_deserialize(struct GNUNET_CONFIGURATION_Handle *cfg, const char *mem, size_t size, const char *source_filename)
De-serializes configuration.
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create(void)
Create a new configuration object.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
#define GNUNET_log(kind,...)
#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
@ GNUNET_ERROR_TYPE_INFO
#define GNUNET_new(type)
Allocate a struct or union of the given type.
@ GNUNET_NAT_ERROR_SUCCESS
Just the default.
enum GNUNET_GenericReturnValue GNUNET_OS_check_helper_binary(const char *binary, bool check_suid, const char *params)
Check whether an executable exists and possibly if the suid bit is set on the file.
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:1278
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition: service.c:2489
#define _(String)
GNU gettext support macro.
Definition: platform.h:178
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
struct GNUNET_MessageHeader header
Header with type #GNUNET_MESSAGE_TYPE_NAT_REQUEST_AUTO_CFG.
Definition: nat-auto.h:75

References _, ac_head, ac_tail, AUTOCONFIG_TIMEOUT, AutoconfigContext::c, ch, AutoconfigContext::ch, check_autoconfig_finished(), conclude_autoconfig_request(), AutoconfigContext::enable_upnpc, GNUNET_break, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_deserialize(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_dup(), GNUNET_CONTAINER_DLL_insert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_INFO, GNUNET_free, GNUNET_log, GNUNET_NAT_ERROR_SUCCESS, GNUNET_new, GNUNET_NO, GNUNET_OK, GNUNET_OS_check_helper_binary(), GNUNET_SCHEDULER_add_delayed(), GNUNET_SERVICE_client_drop(), GNUNET_SYSERR, GNUNET_YES, GNUNET_NAT_AUTO_AutoconfigRequestMessage::header, AutoconfigContext::orig, GNUNET_MessageHeader::size, AutoconfigContext::status_code, AutoconfigContext::timeout_task, and update_enable_upnpc_option().

Here is the call graph for this function:

◆ shutdown_task()

static void shutdown_task ( void *  cls)
static

Task run during shutdown.

Parameters
clsunused

Definition at line 367 of file gnunet-service-nat-auto.c.

368{
369 struct AutoconfigContext *ac;
370
371 while (NULL != (ac = ac_head))
372 {
374 ac_tail,
375 ac);
377 GNUNET_free (ac);
378 }
379 if (NULL != stats)
380 {
382 GNUNET_NO);
383 stats = NULL;
384 }
385}
static struct GNUNET_STATISTICS_Handle * stats
Handle to the statistics service.
void GNUNET_STATISTICS_destroy(struct GNUNET_STATISTICS_Handle *h, int sync_first)
Destroy a handle (free all state associated with it).

References ac_head, ac_tail, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_NO, GNUNET_STATISTICS_destroy(), stats, and terminate_ac_activities().

Referenced by run().

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

◆ run()

static void run ( void *  cls,
const struct GNUNET_CONFIGURATION_Handle c,
struct GNUNET_SERVICE_Handle service 
)
static

Setup NAT service.

Parameters
clsclosure
cconfiguration to use
servicethe initialized service

Definition at line 396 of file gnunet-service-nat-auto.c.

399{
400 cfg = c;
402 NULL);
403 stats = GNUNET_STATISTICS_create ("nat-auto",
404 cfg);
405}
static const struct GNUNET_CONFIGURATION_Handle * cfg
Handle to our current configuration.
static void shutdown_task(void *cls)
Task run during shutdown.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received,...
Definition: scheduler.c:1340
struct GNUNET_STATISTICS_Handle * GNUNET_STATISTICS_create(const char *subsystem, const struct GNUNET_CONFIGURATION_Handle *cfg)
Get handle for the statistics service.

References AutoconfigContext::c, cfg, GNUNET_SCHEDULER_add_shutdown(), GNUNET_STATISTICS_create(), shutdown_task(), and stats.

Here is the call graph for this function:

◆ client_connect_cb()

static void * client_connect_cb ( void *  cls,
struct GNUNET_SERVICE_Client c,
struct GNUNET_MQ_Handle mq 
)
static

Callback called when a client connects to the service.

Parameters
clsclosure for the service
cthe new client that connected to the service
mqthe message queue used to send messages to the client
Returns
a struct ClientHandle

Definition at line 417 of file gnunet-service-nat-auto.c.

420{
421 struct ClientHandle *ch;
422
423 ch = GNUNET_new (struct ClientHandle);
424 ch->mq = mq;
425 ch->client = c;
427 ch_tail,
428 ch);
429 return ch;
430}
struct GNUNET_MQ_Handle * mq
Definition: 003.c:5
static struct ClientHandle * ch_head
Head of client DLL.
static struct ClientHandle * ch_tail
Tail of client DLL.

References ch, ch_head, ch_tail, GNUNET_CONTAINER_DLL_insert, GNUNET_new, mq, and GNUNET_CADET_Channel::mq.

◆ client_disconnect_cb()

static void client_disconnect_cb ( void *  cls,
struct GNUNET_SERVICE_Client c,
void *  internal_cls 
)
static

Callback called when a client disconnected from the service.

Parameters
clsclosure for the service
cthe client that disconnected
internal_clsa struct ClientHandle *

Definition at line 441 of file gnunet-service-nat-auto.c.

444{
445 struct ClientHandle *ch = internal_cls;
446
448 ch_tail,
449 ch);
450 GNUNET_free (ch);
451}

References ch, ch_head, ch_tail, GNUNET_CONTAINER_DLL_remove, and GNUNET_free.

◆ GNUNET_SERVICE_MAIN()

GNUNET_SERVICE_MAIN ( "nat-auto"  ,
GNUNET_SERVICE_OPTION_NONE  ,
run,
client_connect_cb,
client_disconnect_cb,
NULL  ,
GNUNET_MQ_hd_var_size(autoconfig_request, GNUNET_MESSAGE_TYPE_NAT_AUTO_REQUEST_CFG, struct GNUNET_NAT_AUTO_AutoconfigRequestMessage, NULL)  ,
GNUNET_MQ_handler_end()   
)

Define "main" method using service macro.

Variable Documentation

◆ ch_head

struct ClientHandle* ch_head
static

Head of client DLL.

Definition at line 136 of file gnunet-service-nat-auto.c.

Referenced by client_connect_cb(), and client_disconnect_cb().

◆ ch_tail

struct ClientHandle* ch_tail
static

Tail of client DLL.

Definition at line 141 of file gnunet-service-nat-auto.c.

Referenced by client_connect_cb(), and client_disconnect_cb().

◆ ac_head

struct AutoconfigContext* ac_head
static

DLL of our autoconfiguration operations.

Definition at line 146 of file gnunet-service-nat-auto.c.

Referenced by conclude_autoconfig_request(), handle_autoconfig_request(), and shutdown_task().

◆ ac_tail

struct AutoconfigContext* ac_tail
static

DLL of our autoconfiguration operations.

Definition at line 151 of file gnunet-service-nat-auto.c.

Referenced by conclude_autoconfig_request(), handle_autoconfig_request(), and shutdown_task().

◆ cfg

const struct GNUNET_CONFIGURATION_Handle* cfg
static

Handle to our current configuration.

Definition at line 156 of file gnunet-service-nat-auto.c.

Referenced by run().

◆ stats

struct GNUNET_STATISTICS_Handle* stats
static

Handle to the statistics service.

Definition at line 161 of file gnunet-service-nat-auto.c.

Referenced by run(), and shutdown_task().