GNUnet  0.10.x
Data Structures | Macros | Functions
dht_api.c File Reference

library to access the DHT service More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_constants.h"
#include "gnunet_arm_service.h"
#include "gnunet_hello_lib.h"
#include "gnunet_protocols.h"
#include "gnunet_dht_service.h"
#include "dht.h"
Include dependency graph for dht_api.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_DHT_PutHandle
 Handle to a PUT request. More...
 
struct  GNUNET_DHT_GetHandle
 Handle to a GET request. More...
 
struct  GNUNET_DHT_MonitorHandle
 Handle to a monitoring request. More...
 
struct  GNUNET_DHT_Handle
 Connection to the DHT service. More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from(kind, "dht-api", __VA_ARGS__)
 

Functions

static int try_connect (struct GNUNET_DHT_Handle *h)
 Try to (re)connect to the DHT service. More...
 
static void send_get (struct GNUNET_DHT_GetHandle *gh)
 Send GET message for a get_handle to DHT. More...
 
static void send_get_known_results (struct GNUNET_DHT_GetHandle *gh, unsigned int transmission_offset_start)
 Send GET message(s) for indicating which results are already known for a get_handle to DHT. More...
 
static int add_get_request_to_pending (void *cls, const struct GNUNET_HashCode *key, void *value)
 Add the GET request corresponding to the given route handle to the pending queue (if it is not already in there). More...
 
static void send_monitor_start (struct GNUNET_DHT_MonitorHandle *mh)
 Send GNUNET_MESSAGE_TYPE_DHT_MONITOR_START message. More...
 
static void try_reconnect (void *cls)
 Try reconnecting to the dht service. More...
 
static void do_disconnect (struct GNUNET_DHT_Handle *h)
 Try reconnecting to the DHT service. More...
 
static void mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
 Generic error handler, called with the appropriate error code and the same closure specified at the creation of the message queue. More...
 
static int check_monitor_get (void *cls, const struct GNUNET_DHT_MonitorGetMessage *msg)
 Verify integrity of a get monitor message from the service. More...
 
static void handle_monitor_get (void *cls, const struct GNUNET_DHT_MonitorGetMessage *msg)
 Process a get monitor message from the service. More...
 
static int check_monitor_get_resp (void *cls, const struct GNUNET_DHT_MonitorGetRespMessage *msg)
 Validate a get response monitor message from the service. More...
 
static void handle_monitor_get_resp (void *cls, const struct GNUNET_DHT_MonitorGetRespMessage *msg)
 Process a get response monitor message from the service. More...
 
static int check_monitor_put (void *cls, const struct GNUNET_DHT_MonitorPutMessage *msg)
 Check validity of a put monitor message from the service. More...
 
static void handle_monitor_put (void *cls, const struct GNUNET_DHT_MonitorPutMessage *msg)
 Process a put monitor message from the service. More...
 
static int check_client_result (void *cls, const struct GNUNET_DHT_ClientResultMessage *msg)
 Verify that client result message received from the service is well-formed. More...
 
static int process_client_result (void *cls, const struct GNUNET_HashCode *key, void *value)
 Process a given reply that might match the given request. More...
 
static void handle_client_result (void *cls, const struct GNUNET_DHT_ClientResultMessage *msg)
 Process a client result message received from the service. More...
 
static void handle_put_cont (void *cls)
 Process a MQ PUT transmission notification. More...
 
struct GNUNET_DHT_HandleGNUNET_DHT_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, unsigned int ht_len)
 Initialize the connection with the DHT service. More...
 
void GNUNET_DHT_disconnect (struct GNUNET_DHT_Handle *handle)
 Shutdown connection with the DHT service. More...
 
struct GNUNET_DHT_PutHandleGNUNET_DHT_put (struct GNUNET_DHT_Handle *handle, const struct GNUNET_HashCode *key, uint32_t desired_replication_level, enum GNUNET_DHT_RouteOption options, enum GNUNET_BLOCK_Type type, size_t size, const void *data, struct GNUNET_TIME_Absolute exp, GNUNET_SCHEDULER_TaskCallback cont, void *cont_cls)
 Perform a PUT operation storing data in the DHT. More...
 
void GNUNET_DHT_put_cancel (struct GNUNET_DHT_PutHandle *ph)
 Cancels a DHT PUT operation. More...
 
struct GNUNET_DHT_GetHandleGNUNET_DHT_get_start (struct GNUNET_DHT_Handle *handle, enum GNUNET_BLOCK_Type type, const struct GNUNET_HashCode *key, uint32_t desired_replication_level, enum GNUNET_DHT_RouteOption options, const void *xquery, size_t xquery_size, GNUNET_DHT_GetIterator iter, void *iter_cls)
 Perform an asynchronous GET operation on the DHT identified. More...
 
void GNUNET_DHT_get_filter_known_results (struct GNUNET_DHT_GetHandle *get_handle, unsigned int num_results, const struct GNUNET_HashCode *results)
 Tell the DHT not to return any of the following known results to this client. More...
 
void GNUNET_DHT_get_stop (struct GNUNET_DHT_GetHandle *get_handle)
 Stop async DHT-get. More...
 
struct GNUNET_DHT_MonitorHandleGNUNET_DHT_monitor_start (struct GNUNET_DHT_Handle *handle, enum GNUNET_BLOCK_Type type, const struct GNUNET_HashCode *key, GNUNET_DHT_MonitorGetCB get_cb, GNUNET_DHT_MonitorGetRespCB get_resp_cb, GNUNET_DHT_MonitorPutCB put_cb, void *cb_cls)
 Start monitoring the local DHT service. More...
 
void GNUNET_DHT_monitor_stop (struct GNUNET_DHT_MonitorHandle *mh)
 Stop monitoring. More...
 

Detailed Description

library to access the DHT service

Author
Christian Grothoff
Nathan Evans

Definition in file dht_api.c.

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from(kind, "dht-api", __VA_ARGS__)

Function Documentation

◆ try_connect()

static int try_connect ( struct GNUNET_DHT_Handle h)
static

Try to (re)connect to the DHT service.

Parameters
hDHT handle to reconnect
Returns
GNUNET_YES on success, GNUNET_NO on failure.

Definition at line 837 of file dht_api.c.

References GNUNET_DHT_Handle::cfg, GNUNET_CLIENT_connect(), GNUNET_ERROR_TYPE_WARNING, GNUNET_MESSAGE_TYPE_DHT_CLIENT_RESULT, GNUNET_MESSAGE_TYPE_DHT_MONITOR_GET, GNUNET_MESSAGE_TYPE_DHT_MONITOR_GET_RESP, GNUNET_MESSAGE_TYPE_DHT_MONITOR_PUT, GNUNET_MQ_handler_end, GNUNET_MQ_hd_var_size, GNUNET_NO, GNUNET_OK, GNUNET_YES, LOG, GNUNET_DHT_Handle::mq, and mq_error_handler().

Referenced by GNUNET_DHT_connect(), and try_reconnect().

838 {
840  GNUNET_MQ_hd_var_size(monitor_get,
843  h),
844  GNUNET_MQ_hd_var_size(monitor_get_resp,
847  h),
848  GNUNET_MQ_hd_var_size(monitor_put,
851  h),
852  GNUNET_MQ_hd_var_size(client_result,
855  h),
857  };
858 
859  if (NULL != h->mq)
860  return GNUNET_OK;
861  h->mq = GNUNET_CLIENT_connect(h->cfg,
862  "dht",
863  handlers,
865  h);
866  if (NULL == h->mq)
867  {
869  "Failed to connect to the DHT service!\n");
870  return GNUNET_NO;
871  }
872  return GNUNET_YES;
873 }
#define GNUNET_MESSAGE_TYPE_DHT_CLIENT_RESULT
Service returns result to client.
#define GNUNET_MESSAGE_TYPE_DHT_MONITOR_PUT
Receive information about transiting PUTs.
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
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
Message to monitor put requests going through peer, DHT service -> clients.
Definition: dht.h:224
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
Message handler for a specific message type.
#define GNUNET_MESSAGE_TYPE_DHT_MONITOR_GET
Receive information about transiting GETs.
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration to use.
Definition: dht_api.c:202
#define GNUNET_MESSAGE_TYPE_DHT_MONITOR_GET_RESP
Receive information about transiting GET responses.
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
Generic error handler, called with the appropriate error code and the same closure specified at the c...
Definition: dht_api.c:470
#define GNUNET_YES
Definition: gnunet_common.h:77
Message to monitor get requests going through peer, DHT service -> clients.
Definition: dht.h:317
Message to monitor get results going through peer, DHT service -> clients.
Definition: dht.h:360
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
struct GNUNET_MQ_Handle * mq
Connection to DHT service.
Definition: dht_api.c:207
Reply to a GET send from the service to a client.
Definition: dht.h:141
#define LOG(kind,...)
Definition: dht_api.c:37
Here is the call graph for this function:
Here is the caller graph for this function:

◆ send_get()

static void send_get ( struct GNUNET_DHT_GetHandle gh)
static

Send GET message for a get_handle to DHT.

Parameters
ghGET to generate messages for.

Definition at line 269 of file dht_api.c.

References GNUNET_DHT_ClientGetMessage::desired_replication_level, GNUNET_DHT_GetHandle::desired_replication_level, GNUNET_DHT_GetHandle::dht_handle, GNUNET_DHT_PutHandle::env, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_DHT_CLIENT_GET, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), h, GNUNET_DHT_ClientGetMessage::key, GNUNET_DHT_GetHandle::key, GNUNET_DHT_Handle::mq, GNUNET_DHT_ClientGetMessage::options, GNUNET_DHT_GetHandle::options, GNUNET_DHT_ClientGetMessage::type, GNUNET_DHT_GetHandle::type, GNUNET_DHT_ClientGetMessage::unique_id, GNUNET_DHT_GetHandle::unique_id, and GNUNET_DHT_GetHandle::xquery_size.

Referenced by add_get_request_to_pending(), and GNUNET_DHT_get_start().

270 {
271  struct GNUNET_DHT_Handle *h = gh->dht_handle;
272  struct GNUNET_MQ_Envelope *env;
273  struct GNUNET_DHT_ClientGetMessage *get_msg;
274 
275  env = GNUNET_MQ_msg_extra(get_msg,
276  gh->xquery_size,
278  get_msg->options = htonl((uint32_t)gh->options);
280  get_msg->type = htonl(gh->type);
281  get_msg->key = gh->key;
282  get_msg->unique_id = gh->unique_id;
283  GNUNET_memcpy(&get_msg[1],
284  &gh[1],
285  gh->xquery_size);
286  GNUNET_MQ_send(h->mq,
287  env);
288 }
struct GNUNET_HashCode key
The key to search for.
Definition: dht.h:95
uint64_t unique_id
Unique ID identifying this request, if 0 then the client will not expect a response.
Definition: dht.h:101
enum GNUNET_BLOCK_Type type
Type of the block we are looking for.
Definition: dht_api.c:123
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
uint32_t desired_replication_level
Desired replication level.
Definition: dht_api.c:118
struct GNUNET_DHT_Handle * dht_handle
Main handle to this DHT api.
Definition: dht_api.c:92
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
Connection to the DHT service.
Definition: dht_api.c:198
uint32_t options
Message options, actually an 'enum GNUNET_DHT_RouteOption' value.
Definition: dht.h:79
#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:52
uint32_t type
The type for the data for the GET request; actually an 'enum GNUNET_BLOCK_Type'.
Definition: dht.h:90
size_t xquery_size
Size of the extended query, allocated at the end of this struct.
Definition: dht_api.c:113
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
DHT GET message sent from clients to service.
Definition: dht.h:70
enum GNUNET_DHT_RouteOption options
Routing options.
Definition: dht_api.c:128
#define GNUNET_MESSAGE_TYPE_DHT_CLIENT_GET
Client wants to lookup item in DHT.
struct GNUNET_HashCode key
Key that this get request is for.
Definition: dht_api.c:103
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
uint32_t desired_replication_level
Replication level for this message.
Definition: dht.h:84
uint64_t unique_id
Unique identifier for this request (for key collisions).
Definition: dht_api.c:108
struct GNUNET_MQ_Handle * mq
Connection to DHT service.
Definition: dht_api.c:207
Here is the call graph for this function:
Here is the caller graph for this function:

◆ send_get_known_results()

static void send_get_known_results ( struct GNUNET_DHT_GetHandle gh,
unsigned int  transmission_offset_start 
)
static

Send GET message(s) for indicating which results are already known for a get_handle to DHT.

Complex as we need to send the list of known results, which means we may need mulitple messages to block known results from the result set.

Parameters
ghGET to generate messages for
transmission_offset_startat which offset should we start?

Definition at line 301 of file dht_api.c.

References delta, GNUNET_DHT_GetHandle::dht_handle, GNUNET_DHT_PutHandle::env, GNUNET_MAX_MESSAGE_SIZE, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_DHT_CLIENT_GET_RESULTS_KNOWN, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), h, GNUNET_DHT_GetHandle::key, GNUNET_DHT_ClientGetResultSeenMessage::key, GNUNET_DHT_Handle::mq, msg, GNUNET_DHT_GetHandle::seen_results, GNUNET_DHT_GetHandle::seen_results_end, GNUNET_DHT_GetHandle::unique_id, and GNUNET_DHT_ClientGetResultSeenMessage::unique_id.

Referenced by add_get_request_to_pending(), and GNUNET_DHT_get_filter_known_results().

303 {
304  struct GNUNET_DHT_Handle *h = gh->dht_handle;
305  struct GNUNET_MQ_Envelope *env;
307  unsigned int delta;
308  unsigned int max;
309  unsigned int transmission_offset;
310 
311  max = (GNUNET_MAX_MESSAGE_SIZE - sizeof(*msg))
312  / sizeof(struct GNUNET_HashCode);
313  transmission_offset = transmission_offset_start;
314  while (transmission_offset < gh->seen_results_end)
315  {
316  delta = gh->seen_results_end - transmission_offset;
317  if (delta > max)
318  delta = max;
319  env = GNUNET_MQ_msg_extra(msg,
320  delta * sizeof(struct GNUNET_HashCode),
322  msg->key = gh->key;
323  msg->unique_id = gh->unique_id;
324  GNUNET_memcpy(&msg[1],
325  &gh->seen_results[transmission_offset],
326  sizeof(struct GNUNET_HashCode) * delta);
327  GNUNET_MQ_send(h->mq,
328  env);
329  transmission_offset += delta;
330  }
331 }
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
static struct GNUNET_TIME_Relative delta
Definition: speedup.c:35
DHT GET RESULTS KNOWN message sent from clients to service.
Definition: dht.h:111
unsigned int seen_results_end
Offset into the seen_results array marking the end of the positions that are actually used...
Definition: dht_api.c:140
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
struct GNUNET_DHT_Handle * dht_handle
Main handle to this DHT api.
Definition: dht_api.c:92
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
Connection to the DHT service.
Definition: dht_api.c:198
#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:52
uint64_t unique_id
Unique ID identifying this request.
Definition: dht.h:131
#define GNUNET_MESSAGE_TYPE_DHT_CLIENT_GET_RESULTS_KNOWN
Certain results are already known to the client, filter those.
A 512-bit hashcode.
struct GNUNET_HashCode * seen_results
Array of hash codes over the results that we have already seen.
Definition: dht_api.c:98
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
#define GNUNET_MAX_MESSAGE_SIZE
Largest supported message (to be precise, one byte more than the largest possible message...
struct GNUNET_HashCode key
Key that this get request is for.
Definition: dht_api.c:103
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
uint64_t unique_id
Unique identifier for this request (for key collisions).
Definition: dht_api.c:108
struct GNUNET_MQ_Handle * mq
Connection to DHT service.
Definition: dht_api.c:207
struct GNUNET_HashCode key
The key we are searching for (to make it easy to find the corresponding GET inside the service)...
Definition: dht.h:126
Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_get_request_to_pending()

static int add_get_request_to_pending ( void *  cls,
const struct GNUNET_HashCode key,
void *  value 
)
static

Add the GET request corresponding to the given route handle to the pending queue (if it is not already in there).

Parameters
clsthe struct GNUNET_DHT_Handle *
keykey for the request (not used)
valuethe struct GNUNET_DHT_GetHandle *
Returns
GNUNET_YES (always)

Definition at line 344 of file dht_api.c.

References gh, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_YES, handle, LOG, send_get(), send_get_known_results(), and value.

Referenced by try_reconnect().

347 {
348  struct GNUNET_DHT_Handle *handle = cls;
349  struct GNUNET_DHT_GetHandle *gh = value;
350 
352  "Retransmitting request related to %s to DHT %p\n",
353  GNUNET_h2s(key),
354  handle);
355  send_get(gh);
356  send_get_known_results(gh, 0);
357  return GNUNET_YES;
358 }
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
Connection to the DHT service.
Definition: dht_api.c:198
static void send_get_known_results(struct GNUNET_DHT_GetHandle *gh, unsigned int transmission_offset_start)
Send GET message(s) for indicating which results are already known for a get_handle to DHT...
Definition: dht_api.c:301
static char * value
Value of the record to add/remove.
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
Handle to a GET request.
Definition: dht_api.c:78
static struct GNUNET_TRANSPORT_HelloGetHandle * gh
Pending GNUNET_TRANSPORT_hello_get() operation.
static void send_get(struct GNUNET_DHT_GetHandle *gh)
Send GET message for a get_handle to DHT.
Definition: dht_api.c:269
#define GNUNET_YES
Definition: gnunet_common.h:77
#define LOG(kind,...)
Definition: dht_api.c:37
Here is the call graph for this function:
Here is the caller graph for this function:

◆ send_monitor_start()

static void send_monitor_start ( struct GNUNET_DHT_MonitorHandle mh)
static

Send GNUNET_MESSAGE_TYPE_DHT_MONITOR_START message.

Parameters
mhmonitor handle to generate start message for

Definition at line 367 of file dht_api.c.

References GNUNET_DHT_MonitorHandle::dht_handle, GNUNET_DHT_PutHandle::env, GNUNET_DHT_MonitorStartStopMessage::filter_key, GNUNET_DHT_MonitorStartStopMessage::get, GNUNET_DHT_MonitorHandle::get_cb, GNUNET_DHT_MonitorStartStopMessage::get_resp, GNUNET_DHT_MonitorHandle::get_resp_cb, GNUNET_MESSAGE_TYPE_DHT_MONITOR_START, GNUNET_MQ_msg, GNUNET_MQ_send(), h, GNUNET_DHT_MonitorHandle::key, GNUNET_DHT_MonitorStartStopMessage::key, m, GNUNET_DHT_Handle::mq, GNUNET_DHT_MonitorStartStopMessage::put, GNUNET_DHT_MonitorHandle::put_cb, GNUNET_DHT_MonitorHandle::type, and GNUNET_DHT_MonitorStartStopMessage::type.

Referenced by GNUNET_DHT_monitor_start(), and try_reconnect().

368 {
369  struct GNUNET_DHT_Handle *h = mh->dht_handle;
370  struct GNUNET_MQ_Envelope *env;
372 
373  env = GNUNET_MQ_msg(m,
375  m->type = htonl(mh->type);
376  m->get = htons(NULL != mh->get_cb);
377  m->get_resp = htons(NULL != mh->get_resp_cb);
378  m->put = htons(NULL != mh->put_cb);
379  if (NULL != mh->key)
380  {
381  m->filter_key = htons(1);
382  m->key = *mh->key;
383  }
384  GNUNET_MQ_send(h->mq,
385  env);
386 }
uint32_t type
The type of data desired, GNUNET_BLOCK_TYPE_ANY for all.
Definition: dht.h:285
GNUNET_DHT_MonitorGetRespCB get_resp_cb
Callback for each received message of type get response.
Definition: dht_api.c:181
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
int16_t get_resp
Flag whether to notify about GET_REPONSE messages.
Definition: dht.h:295
#define GNUNET_MESSAGE_TYPE_DHT_MONITOR_START
Request information about transiting messages.
GNUNET_DHT_MonitorPutCB put_cb
Callback for each received message of type put.
Definition: dht_api.c:186
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
Connection to the DHT service.
Definition: dht_api.c:198
static struct GNUNET_ARM_MonitorHandle * m
Monitor connection with ARM.
Definition: gnunet-arm.c:99
int16_t filter_key
Flag whether to use the provided key to filter messages.
Definition: dht.h:305
int16_t put
Flag whether to notify about PUT messages.
Definition: dht.h:300
Message to request monitoring messages, clients -> DHT service.
Definition: dht.h:275
GNUNET_DHT_MonitorGetCB get_cb
Callback for each received message of type get.
Definition: dht_api.c:176
struct GNUNET_HashCode * key
Key being looked for, NULL == all.
Definition: dht_api.c:171
struct GNUNET_DHT_Handle * dht_handle
Main handle to this DHT api.
Definition: dht_api.c:161
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
int16_t get
Flag whether to notify about GET messages.
Definition: dht.h:290
struct GNUNET_HashCode key
The key to filter messages by.
Definition: dht.h:310
enum GNUNET_BLOCK_Type type
Type of block looked for.
Definition: dht_api.c:166
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
struct GNUNET_MQ_Handle * mq
Connection to DHT service.
Definition: dht_api.c:207
Here is the call graph for this function:
Here is the caller graph for this function:

◆ try_reconnect()

static void try_reconnect ( void *  cls)
static

Try reconnecting to the dht service.

Parameters
clsa struct GNUNET_DHT_Handle

Definition at line 395 of file dht_api.c.

References GNUNET_DHT_Handle::active_requests, add_get_request_to_pending(), GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_SCHEDULER_add_delayed(), GNUNET_TIME_STD_BACKOFF, GNUNET_YES, h, LOG, mh, GNUNET_DHT_Handle::monitor_head, GNUNET_DHT_MonitorHandle::next, GNUNET_DHT_Handle::reconnect_task, GNUNET_DHT_Handle::retry_time, send_monitor_start(), and try_connect().

Referenced by do_disconnect().

396 {
397  struct GNUNET_DHT_Handle *h = cls;
399 
401  "Reconnecting with DHT %p\n",
402  h);
404  h->reconnect_task = NULL;
405  if (GNUNET_YES != try_connect(h))
406  {
408  "DHT reconnect failed!\n");
409  h->reconnect_task
411  &try_reconnect,
412  h);
413  return;
414  }
417  h);
418  for (mh = h->monitor_head; NULL != mh; mh = mh->next)
419  send_monitor_start(mh);
420 }
struct GNUNET_DHT_MonitorHandle * next
DLL.
Definition: dht_api.c:151
struct GNUNET_CONTAINER_MultiHashMap * active_requests
Hash map containing the current outstanding unique GET requests (values are of type struct GNUNET_DHT...
Definition: dht_api.c:233
static struct GNUNET_CADET_Handle * mh
Cadet handle.
Definition: gnunet-cadet.c:92
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
Connection to the DHT service.
Definition: dht_api.c:198
struct GNUNET_SCHEDULER_Task * reconnect_task
Task for trying to reconnect.
Definition: dht_api.c:238
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:1237
static int try_connect(struct GNUNET_DHT_Handle *h)
Try to (re)connect to the DHT service.
Definition: dht_api.c:837
struct GNUNET_DHT_MonitorHandle * monitor_head
Head of linked list of messages we would like to monitor.
Definition: dht_api.c:212
#define GNUNET_TIME_STD_BACKOFF(r)
Perform our standard exponential back-off calculation, starting at 1 ms and then going by a factor of...
static void send_monitor_start(struct GNUNET_DHT_MonitorHandle *mh)
Send GNUNET_MESSAGE_TYPE_DHT_MONITOR_START message.
Definition: dht_api.c:367
struct GNUNET_TIME_Relative retry_time
How quickly should we retry? Used for exponential back-off on connect-errors.
Definition: dht_api.c:244
static int add_get_request_to_pending(void *cls, const struct GNUNET_HashCode *key, void *value)
Add the GET request corresponding to the given route handle to the pending queue (if it is not alread...
Definition: dht_api.c:344
#define GNUNET_YES
Definition: gnunet_common.h:77
static void try_reconnect(void *cls)
Try reconnecting to the dht service.
Definition: dht_api.c:395
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MulitHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map.
Handle to a monitoring request.
Definition: dht_api.c:147
#define LOG(kind,...)
Definition: dht_api.c:37
Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_disconnect()

static void do_disconnect ( struct GNUNET_DHT_Handle h)
static

Try reconnecting to the DHT service.

Parameters
hhandle to dht to (possibly) disconnect and reconnect

Definition at line 429 of file dht_api.c.

References GNUNET_DHT_PutHandle::cont, GNUNET_DHT_PutHandle::cont_cls, GNUNET_DHT_PutHandle::env, GNUNET_assert, GNUNET_DHT_put_cancel(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_MQ_destroy(), GNUNET_SCHEDULER_add_delayed(), GNUNET_STRINGS_relative_time_to_string(), GNUNET_YES, GNUNET_DHT_Handle::mq, ph, GNUNET_DHT_Handle::put_head, GNUNET_DHT_Handle::reconnect_task, GNUNET_DHT_Handle::retry_time, and try_reconnect().

Referenced by mq_error_handler().

430 {
431  struct GNUNET_DHT_PutHandle *ph;
433  void *cont_cls;
434 
435  if (NULL == h->mq)
436  return;
437  GNUNET_MQ_destroy(h->mq);
438  h->mq = NULL;
440  "Disconnecting from DHT service, will try to reconnect in %s\n",
442  GNUNET_YES));
443  /* notify client about all PUTs that (may) have failed due to disconnect */
444  while (NULL != (ph = h->put_head))
445  {
446  cont = ph->cont;
447  cont_cls = ph->cont_cls;
448  ph->env = NULL;
450  if (NULL != cont)
451  cont(cont_cls);
452  }
453  GNUNET_assert(NULL == h->reconnect_task);
454  h->reconnect_task
456  &try_reconnect,
457  h);
458 }
void GNUNET_DHT_put_cancel(struct GNUNET_DHT_PutHandle *ph)
Cancels a DHT PUT operation.
Definition: dht_api.c:1030
struct GNUNET_MQ_Envelope * env
Envelope from the PUT operation.
Definition: dht_api.c:72
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
static struct GNUNET_ATS_PerformanceHandle * ph
ATS performance handle used.
Definition: gnunet-ats.c:116
void(* GNUNET_SCHEDULER_TaskCallback)(void *cls)
Signature of the main function of a task.
struct GNUNET_SCHEDULER_Task * reconnect_task
Task for trying to reconnect.
Definition: dht_api.c:238
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:1237
GNUNET_SCHEDULER_TaskCallback cont
Continuation to call when done.
Definition: dht_api.c:57
void * cont_cls
Closure for cont.
Definition: dht_api.c:67
struct GNUNET_DHT_PutHandle * put_head
Head of active PUT requests.
Definition: dht_api.c:222
const char * GNUNET_STRINGS_relative_time_to_string(struct GNUNET_TIME_Relative delta, int do_round)
Give relative time in human-readable fancy format.
Definition: strings.c:686
struct GNUNET_TIME_Relative retry_time
How quickly should we retry? Used for exponential back-off on connect-errors.
Definition: dht_api.c:244
Handle to a PUT request.
Definition: dht_api.c:43
#define GNUNET_log(kind,...)
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:821
#define GNUNET_YES
Definition: gnunet_common.h:77
static void try_reconnect(void *cls)
Try reconnecting to the dht service.
Definition: dht_api.c:395
struct GNUNET_MQ_Handle * mq
Connection to DHT service.
Definition: dht_api.c:207
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

Generic error handler, called with the appropriate error code and the same closure specified at the creation of the message queue.

Not every message queue implementation supports an error handler.

Parameters
clsclosure with the struct GNUNET_DHT_Handle *
errorerror code

Definition at line 470 of file dht_api.c.

References do_disconnect(), and h.

Referenced by try_connect().

472 {
473  struct GNUNET_DHT_Handle *h = cls;
474 
475  do_disconnect(h);
476 }
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
Connection to the DHT service.
Definition: dht_api.c:198
static void do_disconnect(struct GNUNET_DHT_Handle *h)
Try reconnecting to the DHT service.
Definition: dht_api.c:429
Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_monitor_get()

static int check_monitor_get ( void *  cls,
const struct GNUNET_DHT_MonitorGetMessage msg 
)
static

Verify integrity of a get monitor message from the service.

Parameters
clsThe DHT handle.
msgMonitor get message from the service.
Returns
GNUNET_OK if everything went fine, GNUNET_SYSERR if the message is malformed.

Definition at line 488 of file dht_api.c.

References GNUNET_DHT_MonitorGetMessage::get_path_length, GNUNET_break, GNUNET_OK, GNUNET_SYSERR, GNUNET_DHT_MonitorGetMessage::header, and GNUNET_MessageHeader::size.

490 {
491  uint32_t plen = ntohl(msg->get_path_length);
492  uint16_t msize = ntohs(msg->header.size) - sizeof(*msg);
493 
494  if ((plen > UINT16_MAX) ||
495  (plen * sizeof(struct GNUNET_PeerIdentity) != msize))
496  {
497  GNUNET_break(0);
498  return GNUNET_SYSERR;
499  }
500  return GNUNET_OK;
501 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
uint32_t get_path_length
Number of peers recorded in the outgoing path from source to the storage location of this message...
Definition: dht.h:347
The identity of the host (wraps the signing key of the peer).
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_DHT_MONITOR_GET.
Definition: dht.h:321

◆ handle_monitor_get()

static void handle_monitor_get ( void *  cls,
const struct GNUNET_DHT_MonitorGetMessage msg 
)
static

Process a get monitor message from the service.

Parameters
clsThe DHT handle.
msgMonitor get message from the service.

Definition at line 511 of file dht_api.c.

References GNUNET_DHT_MonitorHandle::cb_cls, GNUNET_DHT_MonitorGetMessage::desired_replication_level, GNUNET_DHT_MonitorHandle::get_cb, GNUNET_DHT_MonitorGetMessage::get_path_length, GNUNET_BLOCK_TYPE_ANY, handle, GNUNET_DHT_MonitorGetMessage::hop_count, GNUNET_DHT_MonitorHandle::key, GNUNET_DHT_MonitorGetMessage::key, mh, GNUNET_DHT_Handle::monitor_head, GNUNET_DHT_MonitorHandle::next, GNUNET_DHT_MonitorGetMessage::options, GNUNET_DHT_MonitorHandle::type, and GNUNET_DHT_MonitorGetMessage::type.

513 {
514  struct GNUNET_DHT_Handle *handle = cls;
516 
517  for (mh = handle->monitor_head; NULL != mh; mh = mh->next)
518  {
519  if (NULL == mh->get_cb)
520  continue;
521  if (((GNUNET_BLOCK_TYPE_ANY == mh->type) ||
522  (mh->type == ntohl(msg->type))) &&
523  ((NULL == mh->key) ||
524  (0 == memcmp(mh->key,
525  &msg->key,
526  sizeof(struct GNUNET_HashCode)))))
527  mh->get_cb(mh->cb_cls,
528  ntohl(msg->options),
529  (enum GNUNET_BLOCK_Type)ntohl(msg->type),
530  ntohl(msg->hop_count),
531  ntohl(msg->desired_replication_level),
532  ntohl(msg->get_path_length),
533  (struct GNUNET_PeerIdentity *)&msg[1],
534  &msg->key);
535  }
536 }
struct GNUNET_DHT_MonitorHandle * next
DLL.
Definition: dht_api.c:151
uint32_t options
Message options, actually an &#39;enum GNUNET_DHT_RouteOption&#39; value.
Definition: dht.h:326
Any type of block, used as a wildcard when searching.
GNUNET_BLOCK_Type
Blocks in the datastore and the datacache must have a unique type.
static struct GNUNET_CADET_Handle * mh
Cadet handle.
Definition: gnunet-cadet.c:92
Connection to the DHT service.
Definition: dht_api.c:198
GNUNET_DHT_MonitorGetCB get_cb
Callback for each received message of type get.
Definition: dht_api.c:176
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
struct GNUNET_HashCode * key
Key being looked for, NULL == all.
Definition: dht_api.c:171
struct GNUNET_HashCode key
The key to store the value under.
Definition: dht.h:352
A 512-bit hashcode.
struct GNUNET_DHT_MonitorHandle * monitor_head
Head of linked list of messages we would like to monitor.
Definition: dht_api.c:212
uint32_t get_path_length
Number of peers recorded in the outgoing path from source to the storage location of this message...
Definition: dht.h:347
uint32_t desired_replication_level
Replication level for this message.
Definition: dht.h:341
The identity of the host (wraps the signing key of the peer).
uint32_t type
The type of data in the request.
Definition: dht.h:331
enum GNUNET_BLOCK_Type type
Type of block looked for.
Definition: dht_api.c:166
uint32_t hop_count
Hop count.
Definition: dht.h:336
Handle to a monitoring request.
Definition: dht_api.c:147
void * cb_cls
Closure for get_cb, put_cb and get_resp_cb.
Definition: dht_api.c:191

◆ check_monitor_get_resp()

static int check_monitor_get_resp ( void *  cls,
const struct GNUNET_DHT_MonitorGetRespMessage msg 
)
static

Validate a get response monitor message from the service.

Parameters
clsThe DHT handle.
msgmonitor get response message from the service
Returns
GNUNET_OK if everything went fine, GNUNET_SYSERR if the message is malformed.

Definition at line 548 of file dht_api.c.

References GNUNET_DHT_MonitorGetRespMessage::get_path_length, GNUNET_break, GNUNET_OK, GNUNET_SYSERR, GNUNET_DHT_MonitorGetRespMessage::header, GNUNET_DHT_MonitorGetRespMessage::put_path_length, and GNUNET_MessageHeader::size.

550 {
551  size_t msize = ntohs(msg->header.size) - sizeof(*msg);
552  uint32_t getl = ntohl(msg->get_path_length);
553  uint32_t putl = ntohl(msg->put_path_length);
554 
555  if ((getl + putl < getl) ||
556  ((msize / sizeof(struct GNUNET_PeerIdentity)) < getl + putl))
557  {
558  GNUNET_break(0);
559  return GNUNET_SYSERR;
560  }
561  return GNUNET_OK;
562 }
uint32_t get_path_length
Length of the GET path that follows (if tracked).
Definition: dht.h:379
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_DHT_P2P_RESULT.
Definition: dht.h:364
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
uint32_t put_path_length
Length of the PUT path that follows (if tracked).
Definition: dht.h:374
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
The identity of the host (wraps the signing key of the peer).

◆ handle_monitor_get_resp()

static void handle_monitor_get_resp ( void *  cls,
const struct GNUNET_DHT_MonitorGetRespMessage msg 
)
static

Process a get response monitor message from the service.

Parameters
clsThe DHT handle.
msgmonitor get response message from the service

Definition at line 572 of file dht_api.c.

References GNUNET_DHT_MonitorHandle::cb_cls, GNUNET_DHT_MonitorGetRespMessage::expiration_time, GNUNET_DHT_MonitorGetRespMessage::get_path_length, GNUNET_DHT_MonitorHandle::get_resp_cb, GNUNET_BLOCK_TYPE_ANY, GNUNET_TIME_absolute_ntoh(), handle, GNUNET_DHT_MonitorGetRespMessage::header, GNUNET_DHT_MonitorHandle::key, GNUNET_DHT_MonitorGetRespMessage::key, mh, GNUNET_DHT_Handle::monitor_head, GNUNET_DHT_MonitorHandle::next, GNUNET_DHT_MonitorGetRespMessage::put_path_length, GNUNET_MessageHeader::size, GNUNET_DHT_MonitorHandle::type, and GNUNET_DHT_MonitorGetRespMessage::type.

574 {
575  struct GNUNET_DHT_Handle *handle = cls;
576  size_t msize = ntohs(msg->header.size) - sizeof(*msg);
577  const struct GNUNET_PeerIdentity *path;
578  uint32_t getl = ntohl(msg->get_path_length);
579  uint32_t putl = ntohl(msg->put_path_length);
581 
582  path = (const struct GNUNET_PeerIdentity *)&msg[1];
583  for (mh = handle->monitor_head; NULL != mh; mh = mh->next)
584  {
585  if (NULL == mh->get_resp_cb)
586  continue;
587  if (((GNUNET_BLOCK_TYPE_ANY == mh->type) ||
588  (mh->type == ntohl(msg->type))) &&
589  ((NULL == mh->key) ||
590  (0 == memcmp(mh->key,
591  &msg->key,
592  sizeof(struct GNUNET_HashCode)))))
593  mh->get_resp_cb(mh->cb_cls,
594  (enum GNUNET_BLOCK_Type)ntohl(msg->type),
595  path,
596  getl,
597  &path[getl],
598  putl,
600  &msg->key,
601  (const void *)&path[getl + putl],
602  msize - sizeof(struct GNUNET_PeerIdentity) * (putl + getl));
603  }
604 }
struct GNUNET_DHT_MonitorHandle * next
DLL.
Definition: dht_api.c:151
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition: time.c:671
Any type of block, used as a wildcard when searching.
uint32_t get_path_length
Length of the GET path that follows (if tracked).
Definition: dht.h:379
GNUNET_BLOCK_Type
Blocks in the datastore and the datacache must have a unique type.
static struct GNUNET_CADET_Handle * mh
Cadet handle.
Definition: gnunet-cadet.c:92
struct GNUNET_HashCode key
The key of the corresponding GET request.
Definition: dht.h:389
GNUNET_DHT_MonitorGetRespCB get_resp_cb
Callback for each received message of type get response.
Definition: dht_api.c:181
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_DHT_P2P_RESULT.
Definition: dht.h:364
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
Connection to the DHT service.
Definition: dht_api.c:198
uint32_t put_path_length
Length of the PUT path that follows (if tracked).
Definition: dht.h:374
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
struct GNUNET_HashCode * key
Key being looked for, NULL == all.
Definition: dht_api.c:171
A 512-bit hashcode.
struct GNUNET_DHT_MonitorHandle * monitor_head
Head of linked list of messages we would like to monitor.
Definition: dht_api.c:212
The identity of the host (wraps the signing key of the peer).
uint32_t type
Content type.
Definition: dht.h:369
enum GNUNET_BLOCK_Type type
Type of block looked for.
Definition: dht_api.c:166
struct GNUNET_TIME_AbsoluteNBO expiration_time
When does the content expire?
Definition: dht.h:384
Handle to a monitoring request.
Definition: dht_api.c:147
void * cb_cls
Closure for get_cb, put_cb and get_resp_cb.
Definition: dht_api.c:191
Here is the call graph for this function:

◆ check_monitor_put()

static int check_monitor_put ( void *  cls,
const struct GNUNET_DHT_MonitorPutMessage msg 
)
static

Check validity of a put monitor message from the service.

Parameters
clsThe DHT handle.
msgMonitor put message from the service.
Returns
GNUNET_OK if everything went fine, GNUNET_SYSERR if the message is malformed.

Definition at line 616 of file dht_api.c.

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, GNUNET_DHT_MonitorPutMessage::header, GNUNET_DHT_MonitorPutMessage::put_path_length, and GNUNET_MessageHeader::size.

618 {
619  size_t msize;
620  uint32_t putl;
621 
622  msize = ntohs(msg->header.size) - sizeof(*msg);
623  putl = ntohl(msg->put_path_length);
624  if ((msize / sizeof(struct GNUNET_PeerIdentity)) < putl)
625  {
626  GNUNET_break(0);
627  return GNUNET_SYSERR;
628  }
629  return GNUNET_OK;
630 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
uint32_t put_path_length
Number of peers recorded in the outgoing path from source to the storage location of this message...
Definition: dht.h:254
The identity of the host (wraps the signing key of the peer).
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_DHT_MONITOR_PUT.
Definition: dht.h:228

◆ handle_monitor_put()

static void handle_monitor_put ( void *  cls,
const struct GNUNET_DHT_MonitorPutMessage msg 
)
static

Process a put monitor message from the service.

Parameters
clsThe DHT handle.
msgMonitor put message from the service.

Definition at line 640 of file dht_api.c.

References GNUNET_DHT_MonitorHandle::cb_cls, GNUNET_DHT_MonitorPutMessage::desired_replication_level, GNUNET_DHT_MonitorPutMessage::expiration_time, GNUNET_BLOCK_TYPE_ANY, GNUNET_TIME_absolute_ntoh(), handle, GNUNET_DHT_MonitorPutMessage::header, GNUNET_DHT_MonitorPutMessage::hop_count, GNUNET_DHT_MonitorHandle::key, GNUNET_DHT_MonitorPutMessage::key, mh, GNUNET_DHT_Handle::monitor_head, GNUNET_DHT_MonitorHandle::next, GNUNET_DHT_MonitorPutMessage::options, GNUNET_DHT_MonitorHandle::put_cb, GNUNET_DHT_MonitorPutMessage::put_path_length, GNUNET_MessageHeader::size, GNUNET_DHT_MonitorHandle::type, and GNUNET_DHT_MonitorPutMessage::type.

642 {
643  struct GNUNET_DHT_Handle *handle = cls;
644  size_t msize = ntohs(msg->header.size) - sizeof(*msg);
645  uint32_t putl = ntohl(msg->put_path_length);
646  const struct GNUNET_PeerIdentity *path;
648 
649  path = (const struct GNUNET_PeerIdentity *)&msg[1];
650  for (mh = handle->monitor_head; NULL != mh; mh = mh->next)
651  {
652  if (NULL == mh->put_cb)
653  continue;
654  if (((GNUNET_BLOCK_TYPE_ANY == mh->type) ||
655  (mh->type == ntohl(msg->type))) &&
656  ((NULL == mh->key) ||
657  (0 == memcmp(mh->key,
658  &msg->key,
659  sizeof(struct GNUNET_HashCode)))))
660  mh->put_cb(mh->cb_cls,
661  ntohl(msg->options),
662  (enum GNUNET_BLOCK_Type)ntohl(msg->type),
663  ntohl(msg->hop_count),
664  ntohl(msg->desired_replication_level),
665  putl,
666  path,
668  &msg->key,
669  (const void *)&path[putl],
670  msize - sizeof(struct GNUNET_PeerIdentity) * putl);
671  }
672 }
struct GNUNET_DHT_MonitorHandle * next
DLL.
Definition: dht_api.c:151
uint32_t hop_count
Hop count so far.
Definition: dht.h:243
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition: time.c:671
Any type of block, used as a wildcard when searching.
GNUNET_BLOCK_Type
Blocks in the datastore and the datacache must have a unique type.
uint32_t desired_replication_level
Replication level for this message.
Definition: dht.h:248
static struct GNUNET_CADET_Handle * mh
Cadet handle.
Definition: gnunet-cadet.c:92
uint32_t type
The type of data in the request.
Definition: dht.h:238
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
GNUNET_DHT_MonitorPutCB put_cb
Callback for each received message of type put.
Definition: dht_api.c:186
Connection to the DHT service.
Definition: dht_api.c:198
struct GNUNET_TIME_AbsoluteNBO expiration_time
How long should this data persist?
Definition: dht.h:259
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
struct GNUNET_HashCode * key
Key being looked for, NULL == all.
Definition: dht_api.c:171
A 512-bit hashcode.
struct GNUNET_DHT_MonitorHandle * monitor_head
Head of linked list of messages we would like to monitor.
Definition: dht_api.c:212
uint32_t put_path_length
Number of peers recorded in the outgoing path from source to the storage location of this message...
Definition: dht.h:254
The identity of the host (wraps the signing key of the peer).
enum GNUNET_BLOCK_Type type
Type of block looked for.
Definition: dht_api.c:166
uint32_t options
Message options, actually an &#39;enum GNUNET_DHT_RouteOption&#39; value.
Definition: dht.h:233
Handle to a monitoring request.
Definition: dht_api.c:147
struct GNUNET_HashCode key
The key to store the value under.
Definition: dht.h:264
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_DHT_MONITOR_PUT.
Definition: dht.h:228
void * cb_cls
Closure for get_cb, put_cb and get_resp_cb.
Definition: dht_api.c:191
Here is the call graph for this function:

◆ check_client_result()

static int check_client_result ( void *  cls,
const struct GNUNET_DHT_ClientResultMessage msg 
)
static

Verify that client result message received from the service is well-formed.

Parameters
clsThe DHT handle.
msgMonitor put message from the service.
Returns
GNUNET_OK if everything went fine, GNUNET_SYSERR if the message is malformed.

Definition at line 684 of file dht_api.c.

References GNUNET_DHT_ClientResultMessage::get_path_length, GNUNET_break, GNUNET_MAX_MESSAGE_SIZE, GNUNET_OK, GNUNET_SYSERR, GNUNET_DHT_ClientResultMessage::header, GNUNET_DHT_ClientResultMessage::put_path_length, and GNUNET_MessageHeader::size.

686 {
687  size_t msize = ntohs(msg->header.size) - sizeof(*msg);
688  uint32_t put_path_length = ntohl(msg->put_path_length);
689  uint32_t get_path_length = ntohl(msg->get_path_length);
690  size_t meta_length;
691 
692  meta_length =
693  sizeof(struct GNUNET_PeerIdentity) * (get_path_length + put_path_length);
694  if ((msize < meta_length) ||
695  (get_path_length >
696  GNUNET_MAX_MESSAGE_SIZE / sizeof(struct GNUNET_PeerIdentity)) ||
697  (put_path_length >
699  {
700  GNUNET_break(0);
701  return GNUNET_SYSERR;
702  }
703  return GNUNET_OK;
704 }
uint32_t put_path_length
Number of peers recorded in the outgoing path from source to the storgage location of this message...
Definition: dht.h:156
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_DHT_CLIENT_RESULT.
Definition: dht.h:145
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
#define GNUNET_MAX_MESSAGE_SIZE
Largest supported message (to be precise, one byte more than the largest possible message...
The identity of the host (wraps the signing key of the peer).
uint32_t get_path_length
The number of peer identities recorded from the storage location to this peer.
Definition: dht.h:162

◆ process_client_result()

static int process_client_result ( void *  cls,
const struct GNUNET_HashCode key,
void *  value 
)
static

Process a given reply that might match the given request.

Parameters
clsthe struct GNUNET_DHT_ClientResultMessage
keyquery of the request
valuethe struct GNUNET_DHT_GetHandle of a request matching the same key
Returns
GNUNET_YES to continue to iterate over all results

Definition at line 716 of file dht_api.c.

References data, GNUNET_DHT_ClientResultMessage::expiration, get_handle, GNUNET_DHT_ClientResultMessage::get_path_length, GNUNET_array_grow, GNUNET_CRYPTO_hash(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_h2s(), GNUNET_STRINGS_pp2s(), GNUNET_TIME_absolute_ntoh(), GNUNET_YES, GNUNET_DHT_ClientResultMessage::header, GNUNET_DHT_GetHandle::iter, GNUNET_DHT_GetHandle::iter_cls, LOG, GNUNET_DHT_ClientResultMessage::put_path_length, GNUNET_DHT_GetHandle::seen_results, GNUNET_DHT_GetHandle::seen_results_end, GNUNET_DHT_GetHandle::seen_results_size, GNUNET_MessageHeader::size, GNUNET_DHT_ClientResultMessage::type, GNUNET_DHT_GetHandle::unique_id, GNUNET_DHT_ClientResultMessage::unique_id, and value.

Referenced by handle_client_result().

719 {
720  const struct GNUNET_DHT_ClientResultMessage *crm = cls;
722  size_t msize = ntohs(crm->header.size) - sizeof(*crm);
723  uint32_t put_path_length = ntohl(crm->put_path_length);
724  uint32_t get_path_length = ntohl(crm->get_path_length);
725  const struct GNUNET_PeerIdentity *put_path;
726  const struct GNUNET_PeerIdentity *get_path;
727  struct GNUNET_HashCode hc;
728  size_t data_length;
729  size_t meta_length;
730  const void *data;
731 
732  if (crm->unique_id != get_handle->unique_id)
733  {
734  /* UID mismatch */
736  "Ignoring reply for %s: UID mismatch: %llu/%llu\n",
737  GNUNET_h2s(key),
738  crm->unique_id,
739  get_handle->unique_id);
740  return GNUNET_YES;
741  }
742  /* FIXME: might want to check that type matches */
743  meta_length =
744  sizeof(struct GNUNET_PeerIdentity) * (get_path_length + put_path_length);
745  data_length = msize - meta_length;
746  put_path = (const struct GNUNET_PeerIdentity *)&crm[1];
747  get_path = &put_path[put_path_length];
748  {
749  char *pp;
750  char *gp;
751 
752  gp = GNUNET_STRINGS_pp2s(get_path,
753  get_path_length);
754  pp = GNUNET_STRINGS_pp2s(put_path,
755  put_path_length);
757  "Giving %u byte reply for %s to application (GP: %s, PP: %s)\n",
758  (unsigned int)data_length,
759  GNUNET_h2s(key),
760  gp,
761  pp);
762  GNUNET_free(gp);
763  GNUNET_free(pp);
764  }
765  data = &get_path[get_path_length];
766  /* remember that we've seen this result */
767  GNUNET_CRYPTO_hash(data,
768  data_length,
769  &hc);
770  if (get_handle->seen_results_size == get_handle->seen_results_end)
771  GNUNET_array_grow(get_handle->seen_results,
772  get_handle->seen_results_size,
773  get_handle->seen_results_size * 2 + 1);
774  get_handle->seen_results[get_handle->seen_results_end++] = hc;
775  /* no need to block it explicitly, service already knows about it! */
776  get_handle->iter(get_handle->iter_cls,
778  key,
779  get_path,
780  get_path_length,
781  put_path,
782  put_path_length,
783  ntohl(crm->type),
784  data_length,
785  data);
786  return GNUNET_YES;
787 }
uint64_t unique_id
Unique ID of the matching GET request.
Definition: dht.h:167
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition: time.c:671
uint32_t put_path_length
Number of peers recorded in the outgoing path from source to the storgage location of this message...
Definition: dht.h:156
unsigned int seen_results_size
Size of the seen_results array.
Definition: dht_api.c:134
unsigned int seen_results_end
Offset into the seen_results array marking the end of the positions that are actually used...
Definition: dht_api.c:140
GNUNET_DHT_GetIterator iter
Iterator to call on data receipt.
Definition: dht_api.c:82
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
static struct GNUNET_DHT_GetHandle * get_handle
Handle for the get request.
void * iter_cls
Closure for iter.
Definition: dht_api.c:87
#define GNUNET_array_grow(arr, size, tsize)
Grow a well-typed (!) array.
static char * value
Value of the record to add/remove.
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:44
char * GNUNET_STRINGS_pp2s(const struct GNUNET_PeerIdentity *pids, unsigned int num_pids)
Convert a peer path to a human-readable string.
Definition: strings.c:100
struct GNUNET_TIME_AbsoluteNBO expiration
When does this entry expire?
Definition: dht.h:172
uint32_t type
The type for the data.
Definition: dht.h:150
A 512-bit hashcode.
struct GNUNET_HashCode * seen_results
Array of hash codes over the results that we have already seen.
Definition: dht_api.c:98
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_DHT_CLIENT_RESULT.
Definition: dht.h:145
Handle to a GET request.
Definition: dht_api.c:78
The identity of the host (wraps the signing key of the peer).
uint32_t get_path_length
The number of peer identities recorded from the storage location to this peer.
Definition: dht.h:162
#define GNUNET_YES
Definition: gnunet_common.h:77
uint32_t data
The data value.
uint64_t unique_id
Unique identifier for this request (for key collisions).
Definition: dht_api.c:108
Reply to a GET send from the service to a client.
Definition: dht.h:141
#define GNUNET_free(ptr)
Wrapper around free.
#define LOG(kind,...)
Definition: dht_api.c:37
Here is the call graph for this function:
Here is the caller graph for this function:

◆ handle_client_result()

static void handle_client_result ( void *  cls,
const struct GNUNET_DHT_ClientResultMessage msg 
)
static

Process a client result message received from the service.

Parameters
clsThe DHT handle.
msgMonitor put message from the service.

Definition at line 797 of file dht_api.c.

References GNUNET_DHT_Handle::active_requests, GNUNET_CONTAINER_multihashmap_get_multiple(), handle, GNUNET_DHT_ClientResultMessage::key, and process_client_result().

799 {
800  struct GNUNET_DHT_Handle *handle = cls;
801 
803  &msg->key,
805  (void *)msg);
806 }
struct GNUNET_CONTAINER_MultiHashMap * active_requests
Hash map containing the current outstanding unique GET requests (values are of type struct GNUNET_DHT...
Definition: dht_api.c:233
Connection to the DHT service.
Definition: dht_api.c:198
struct GNUNET_HashCode key
The key that was searched for.
Definition: dht.h:177
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
int GNUNET_CONTAINER_multihashmap_get_multiple(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, GNUNET_CONTAINER_MulitHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map that match a particular key.
static int process_client_result(void *cls, const struct GNUNET_HashCode *key, void *value)
Process a given reply that might match the given request.
Definition: dht_api.c:716
Here is the call graph for this function:

◆ handle_put_cont()

static void handle_put_cont ( void *  cls)
static

Process a MQ PUT transmission notification.

Parameters
clsThe DHT handle.

Definition at line 815 of file dht_api.c.

References GNUNET_DHT_PutHandle::cont, GNUNET_DHT_PutHandle::cont_cls, GNUNET_DHT_PutHandle::env, GNUNET_DHT_put_cancel(), and ph.

Referenced by GNUNET_DHT_put().

816 {
817  struct GNUNET_DHT_PutHandle *ph = cls;
819  void *cont_cls;
820 
821  cont = ph->cont;
822  cont_cls = ph->cont_cls;
823  ph->env = NULL;
825  if (NULL != cont)
826  cont(cont_cls);
827 }
void GNUNET_DHT_put_cancel(struct GNUNET_DHT_PutHandle *ph)
Cancels a DHT PUT operation.
Definition: dht_api.c:1030
struct GNUNET_MQ_Envelope * env
Envelope from the PUT operation.
Definition: dht_api.c:72
static struct GNUNET_ATS_PerformanceHandle * ph
ATS performance handle used.
Definition: gnunet-ats.c:116
void(* GNUNET_SCHEDULER_TaskCallback)(void *cls)
Signature of the main function of a task.
GNUNET_SCHEDULER_TaskCallback cont
Continuation to call when done.
Definition: dht_api.c:57
void * cont_cls
Closure for cont.
Definition: dht_api.c:67
Handle to a PUT request.
Definition: dht_api.c:43
Here is the call graph for this function:
Here is the caller graph for this function: