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

849 {
851  GNUNET_MQ_hd_var_size (monitor_get,
854  h),
855  GNUNET_MQ_hd_var_size (monitor_get_resp,
858  h),
859  GNUNET_MQ_hd_var_size (monitor_put,
862  h),
863  GNUNET_MQ_hd_var_size (client_result,
866  h),
868  };
869  if (NULL != h->mq)
870  return GNUNET_OK;
871  h->mq = GNUNET_CLIENT_connect (h->cfg,
872  "dht",
873  handlers,
875  h);
876  if (NULL == h->mq)
877  {
879  "Failed to connect to the DHT service!\n");
880  return GNUNET_NO;
881  }
882  return GNUNET_YES;
883 }
#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:901
#define GNUNET_NO
Definition: gnunet_common.h:81
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
Message to monitor put requests going through peer, DHT service -> clients.
Definition: dht.h:234
#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:211
#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:481
#define GNUNET_YES
Definition: gnunet_common.h:80
Message to monitor get requests going through peer, DHT service -> clients.
Definition: dht.h:330
Message to monitor get results going through peer, DHT service -> clients.
Definition: dht.h:375
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
struct GNUNET_MQ_Handle * mq
Connection to DHT service.
Definition: dht_api.c:216
Reply to a GET send from the service to a client.
Definition: dht.h: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:

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

281 {
282  struct GNUNET_DHT_Handle *h = gh->dht_handle;
283  struct GNUNET_MQ_Envelope *env;
284  struct GNUNET_DHT_ClientGetMessage *get_msg;
285 
286  env = GNUNET_MQ_msg_extra (get_msg,
287  gh->xquery_size,
289  get_msg->options = htonl ((uint32_t) gh->options);
291  get_msg->type = htonl (gh->type);
292  get_msg->key = gh->key;
293  get_msg->unique_id = gh->unique_id;
294  GNUNET_memcpy (&get_msg[1],
295  &gh[1],
296  gh->xquery_size);
297  GNUNET_MQ_send (h->mq,
298  env);
299 }
struct GNUNET_HashCode key
The key to search for.
Definition: dht.h:98
uint64_t unique_id
Unique ID identifying this request, if 0 then the client will not expect a response.
Definition: dht.h:104
enum GNUNET_BLOCK_Type type
Type of the block we are looking for.
Definition: dht_api.c:127
uint32_t desired_replication_level
Desired replication level.
Definition: dht_api.c:122
struct GNUNET_DHT_Handle * dht_handle
Main handle to this DHT api.
Definition: dht_api.c:96
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
Connection to the DHT service.
Definition: dht_api.c:205
uint32_t options
Message options, actually an 'enum GNUNET_DHT_RouteOption' value.
Definition: dht.h:82
#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
#define GNUNET_memcpy(dst, src, n)
uint32_t type
The type for the data for the GET request; actually an 'enum GNUNET_BLOCK_Type'.
Definition: dht.h:93
size_t xquery_size
Size of the extended query, allocated at the end of this struct.
Definition: dht_api.c:117
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
DHT GET message sent from clients to service.
Definition: dht.h:72
enum GNUNET_DHT_RouteOption options
Routing options.
Definition: dht_api.c:132
#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:107
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:353
uint32_t desired_replication_level
Replication level for this message.
Definition: dht.h:87
uint64_t unique_id
Unique identifier for this request (for key collisions).
Definition: dht_api.c:112
struct GNUNET_MQ_Handle * mq
Connection to DHT service.
Definition: dht_api.c:216
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 312 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().

314 {
315  struct GNUNET_DHT_Handle *h = gh->dht_handle;
316  struct GNUNET_MQ_Envelope *env;
318  unsigned int delta;
319  unsigned int max;
320  unsigned int transmission_offset;
321 
322  max = (GNUNET_MAX_MESSAGE_SIZE - sizeof (*msg))
323  / sizeof (struct GNUNET_HashCode);
324  transmission_offset = transmission_offset_start;
325  while (transmission_offset < gh->seen_results_end)
326  {
327  delta = gh->seen_results_end - transmission_offset;
328  if (delta > max)
329  delta = max;
330  env = GNUNET_MQ_msg_extra (msg,
331  delta * sizeof (struct GNUNET_HashCode),
333  msg->key = gh->key;
334  msg->unique_id = gh->unique_id;
335  GNUNET_memcpy (&msg[1],
336  &gh->seen_results[transmission_offset],
337  sizeof (struct GNUNET_HashCode) * delta);
338  GNUNET_MQ_send (h->mq,
339  env);
340  transmission_offset += delta;
341  }
342 }
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:115
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:144
struct GNUNET_DHT_Handle * dht_handle
Main handle to this DHT api.
Definition: dht_api.c:96
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
Connection to the DHT service.
Definition: dht_api.c:205
#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
#define GNUNET_memcpy(dst, src, n)
uint64_t unique_id
Unique ID identifying this request.
Definition: dht.h:136
#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:102
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:107
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:353
uint64_t unique_id
Unique identifier for this request (for key collisions).
Definition: dht_api.c:112
struct GNUNET_MQ_Handle * mq
Connection to DHT service.
Definition: dht_api.c:216
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:131
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 355 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().

358 {
359  struct GNUNET_DHT_Handle *handle = cls;
360  struct GNUNET_DHT_GetHandle *gh = value;
361 
363  "Retransmitting request related to %s to DHT %p\n",
364  GNUNET_h2s (key),
365  handle);
366  send_get (gh);
367  send_get_known_results (gh, 0);
368  return GNUNET_YES;
369 }
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:205
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:312
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:80
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:280
#define GNUNET_YES
Definition: gnunet_common.h:80
#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 378 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().

379 {
380  struct GNUNET_DHT_Handle *h = mh->dht_handle;
381  struct GNUNET_MQ_Envelope *env;
383 
384  env = GNUNET_MQ_msg (m,
386  m->type = htonl (mh->type);
387  m->get = htons (NULL != mh->get_cb);
388  m->get_resp = htons (NULL != mh->get_resp_cb);
389  m->put = htons (NULL != mh->put_cb);
390  if (NULL != mh->key)
391  {
392  m->filter_key = htons(1);
393  m->key = *mh->key;
394  }
395  GNUNET_MQ_send (h->mq,
396  env);
397 }
uint32_t type
The type of data desired, GNUNET_BLOCK_TYPE_ANY for all.
Definition: dht.h:298
GNUNET_DHT_MonitorGetRespCB get_resp_cb
Callback for each received message of type get response.
Definition: dht_api.c:187
#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:308
#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:192
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
Connection to the DHT service.
Definition: dht_api.c:205
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:318
int16_t put
Flag whether to notify about PUT messages.
Definition: dht.h:313
Message to request monitoring messages, clients -> DHT service.
Definition: dht.h:287
GNUNET_DHT_MonitorGetCB get_cb
Callback for each received message of type get.
Definition: dht_api.c:182
struct GNUNET_HashCode * key
Key being looked for, NULL == all.
Definition: dht_api.c:177
struct GNUNET_DHT_Handle * dht_handle
Main handle to this DHT api.
Definition: dht_api.c:167
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
int16_t get
Flag whether to notify about GET messages.
Definition: dht.h:303
struct GNUNET_HashCode key
The key to filter messages by.
Definition: dht.h:323
enum GNUNET_BLOCK_Type type
Type of block looked for.
Definition: dht_api.c:172
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:353
struct GNUNET_MQ_Handle * mq
Connection to DHT service.
Definition: dht_api.c:216
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 406 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().

407 {
408  struct GNUNET_DHT_Handle *h = cls;
410 
412  "Reconnecting with DHT %p\n",
413  h);
415  h->reconnect_task = NULL;
416  if (GNUNET_YES != try_connect (h))
417  {
419  "DHT reconnect failed!\n");
420  h->reconnect_task
422  &try_reconnect,
423  h);
424  return;
425  }
428  h);
429  for (mh = h->monitor_head; NULL != mh; mh = mh->next)
430  send_monitor_start (mh);
431 }
struct GNUNET_DHT_MonitorHandle * next
DLL.
Definition: dht_api.c:157
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:242
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:205
struct GNUNET_SCHEDULER_Task * reconnect_task
Task for trying to reconnect.
Definition: dht_api.c:247
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:1246
static int try_connect(struct GNUNET_DHT_Handle *h)
Try to (re)connect to the DHT service.
Definition: dht_api.c:848
struct GNUNET_DHT_MonitorHandle * monitor_head
Head of linked list of messages we would like to monitor.
Definition: dht_api.c:221
#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:378
struct GNUNET_TIME_Relative retry_time
How quickly should we retry? Used for exponential back-off on connect-errors.
Definition: dht_api.c:253
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:355
#define GNUNET_YES
Definition: gnunet_common.h:80
static void try_reconnect(void *cls)
Try reconnecting to the dht service.
Definition: dht_api.c:406
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:152
#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 440 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().

441 {
442  struct GNUNET_DHT_PutHandle *ph;
444  void *cont_cls;
445 
446  if (NULL == h->mq)
447  return;
448  GNUNET_MQ_destroy (h->mq);
449  h->mq = NULL;
451  "Disconnecting from DHT service, will try to reconnect in %s\n",
453  GNUNET_YES));
454  /* notify client about all PUTs that (may) have failed due to disconnect */
455  while (NULL != (ph = h->put_head))
456  {
457  cont = ph->cont;
458  cont_cls = ph->cont_cls;
459  ph->env = NULL;
461  if (NULL != cont)
462  cont (cont_cls);
463  }
464  GNUNET_assert (NULL == h->reconnect_task);
465  h->reconnect_task
467  &try_reconnect,
468  h);
469 }
void GNUNET_DHT_put_cancel(struct GNUNET_DHT_PutHandle *ph)
Cancels a DHT PUT operation.
Definition: dht_api.c:1040
struct GNUNET_MQ_Envelope * env
Envelope from the PUT operation.
Definition: dht_api.c:73
#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:247
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:1246
GNUNET_SCHEDULER_TaskCallback cont
Continuation to call when done.
Definition: dht_api.c:58
void * cont_cls
Closure for cont.
Definition: dht_api.c:68
struct GNUNET_DHT_PutHandle * put_head
Head of active PUT requests.
Definition: dht_api.c:231
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:727
struct GNUNET_TIME_Relative retry_time
How quickly should we retry? Used for exponential back-off on connect-errors.
Definition: dht_api.c:253
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:824
#define GNUNET_YES
Definition: gnunet_common.h:80
static void try_reconnect(void *cls)
Try reconnecting to the dht service.
Definition: dht_api.c:406
struct GNUNET_MQ_Handle * mq
Connection to DHT service.
Definition: dht_api.c:216
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 481 of file dht_api.c.

References do_disconnect(), and h.

Referenced by try_connect().

483 {
484  struct GNUNET_DHT_Handle *h = cls;
485 
486  do_disconnect (h);
487 }
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
Connection to the DHT service.
Definition: dht_api.c:205
static void do_disconnect(struct GNUNET_DHT_Handle *h)
Try reconnecting to the DHT service.
Definition: dht_api.c:440
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 499 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.

501 {
502  uint32_t plen = ntohl (msg->get_path_length);
503  uint16_t msize = ntohs (msg->header.size) - sizeof (*msg);
504 
505  if ( (plen > UINT16_MAX) ||
506  (plen * sizeof (struct GNUNET_PeerIdentity) != msize) )
507  {
508  GNUNET_break (0);
509  return GNUNET_SYSERR;
510  }
511  return GNUNET_OK;
512 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
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:79
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:361
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:335

◆ 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 522 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.

524 {
525  struct GNUNET_DHT_Handle *handle = cls;
527 
528  for (mh = handle->monitor_head; NULL != mh; mh = mh->next)
529  {
530  if (NULL == mh->get_cb)
531  continue;
532  if ( ( (GNUNET_BLOCK_TYPE_ANY == mh->type) ||
533  (mh->type == ntohl (msg->type)) ) &&
534  ( (NULL == mh->key) ||
535  (0 == memcmp (mh->key,
536  &msg->key,
537  sizeof (struct GNUNET_HashCode))) ) )
538  mh->get_cb (mh->cb_cls,
539  ntohl (msg->options),
540  (enum GNUNET_BLOCK_Type) ntohl(msg->type),
541  ntohl (msg->hop_count),
542  ntohl (msg->desired_replication_level),
543  ntohl (msg->get_path_length),
544  (struct GNUNET_PeerIdentity *) &msg[1],
545  &msg->key);
546  }
547 }
struct GNUNET_DHT_MonitorHandle * next
DLL.
Definition: dht_api.c:157
uint32_t options
Message options, actually an &#39;enum GNUNET_DHT_RouteOption&#39; value.
Definition: dht.h:340
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:205
GNUNET_DHT_MonitorGetCB get_cb
Callback for each received message of type get.
Definition: dht_api.c:182
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
struct GNUNET_HashCode * key
Key being looked for, NULL == all.
Definition: dht_api.c:177
struct GNUNET_HashCode key
The key to store the value under.
Definition: dht.h:366
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:221
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:361
uint32_t desired_replication_level
Replication level for this message.
Definition: dht.h:355
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:345
enum GNUNET_BLOCK_Type type
Type of block looked for.
Definition: dht_api.c:172
uint32_t hop_count
Hop count.
Definition: dht.h:350
Handle to a monitoring request.
Definition: dht_api.c:152
void * cb_cls
Closure for get_cb, put_cb and get_resp_cb.
Definition: dht_api.c:197

◆ 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 559 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.

561 {
562  size_t msize = ntohs (msg->header.size) - sizeof (*msg);
563  uint32_t getl = ntohl (msg->get_path_length);
564  uint32_t putl = ntohl (msg->put_path_length);
565 
566  if ( (getl + putl < getl) ||
567  ( (msize / sizeof (struct GNUNET_PeerIdentity)) < getl + putl) )
568  {
569  GNUNET_break (0);
570  return GNUNET_SYSERR;
571  }
572  return GNUNET_OK;
573 }
uint32_t get_path_length
Length of the GET path that follows (if tracked).
Definition: dht.h:395
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_DHT_P2P_RESULT.
Definition: dht.h:380
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
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:390
#define GNUNET_SYSERR
Definition: gnunet_common.h:79
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 583 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.

585 {
586  struct GNUNET_DHT_Handle *handle = cls;
587  size_t msize = ntohs (msg->header.size) - sizeof (*msg);
588  const struct GNUNET_PeerIdentity *path;
589  uint32_t getl = ntohl (msg->get_path_length);
590  uint32_t putl = ntohl (msg->put_path_length);
592 
593  path = (const struct GNUNET_PeerIdentity *) &msg[1];
594  for (mh = handle->monitor_head; NULL != mh; mh = mh->next)
595  {
596  if (NULL == mh->get_resp_cb)
597  continue;
598  if ( ( (GNUNET_BLOCK_TYPE_ANY == mh->type) ||
599  (mh->type == ntohl(msg->type)) ) &&
600  ( (NULL == mh->key) ||
601  (0 == memcmp (mh->key,
602  &msg->key,
603  sizeof (struct GNUNET_HashCode))) ) )
604  mh->get_resp_cb (mh->cb_cls,
605  (enum GNUNET_BLOCK_Type) ntohl (msg->type),
606  path,
607  getl,
608  &path[getl],
609  putl,
611  &msg->key,
612  (const void *) &path[getl + putl],
613  msize - sizeof (struct GNUNET_PeerIdentity) * (putl + getl));
614  }
615 }
struct GNUNET_DHT_MonitorHandle * next
DLL.
Definition: dht_api.c:157
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition: time.c:670
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:395
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:405
GNUNET_DHT_MonitorGetRespCB get_resp_cb
Callback for each received message of type get response.
Definition: dht_api.c:187
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_DHT_P2P_RESULT.
Definition: dht.h:380
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:205
uint32_t put_path_length
Length of the PUT path that follows (if tracked).
Definition: dht.h:390
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
struct GNUNET_HashCode * key
Key being looked for, NULL == all.
Definition: dht_api.c:177
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:221
The identity of the host (wraps the signing key of the peer).
uint32_t type
Content type.
Definition: dht.h:385
enum GNUNET_BLOCK_Type type
Type of block looked for.
Definition: dht_api.c:172
struct GNUNET_TIME_AbsoluteNBO expiration_time
When does the content expire?
Definition: dht.h:400
Handle to a monitoring request.
Definition: dht_api.c:152
void * cb_cls
Closure for get_cb, put_cb and get_resp_cb.
Definition: dht_api.c:197
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 627 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.

629 {
630  size_t msize;
631  uint32_t putl;
632 
633  msize = ntohs (msg->header.size) - sizeof (*msg);
634  putl = ntohl (msg->put_path_length);
635  if ((msize / sizeof (struct GNUNET_PeerIdentity)) < putl)
636  {
637  GNUNET_break (0);
638  return GNUNET_SYSERR;
639  }
640  return GNUNET_OK;
641 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
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:79
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:265
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:239

◆ 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 651 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.

653 {
654  struct GNUNET_DHT_Handle *handle = cls;
655  size_t msize = ntohs (msg->header.size) - sizeof (*msg);
656  uint32_t putl = ntohl (msg->put_path_length);
657  const struct GNUNET_PeerIdentity *path;
659 
660  path = (const struct GNUNET_PeerIdentity *) &msg[1];
661  for (mh = handle->monitor_head; NULL != mh; mh = mh->next)
662  {
663  if (NULL == mh->put_cb)
664  continue;
665  if ( ( (GNUNET_BLOCK_TYPE_ANY == mh->type) ||
666  (mh->type == ntohl(msg->type)) ) &&
667  ( (NULL == mh->key) ||
668  (0 == memcmp (mh->key,
669  &msg->key,
670  sizeof (struct GNUNET_HashCode))) ) )
671  mh->put_cb (mh->cb_cls,
672  ntohl (msg->options),
673  (enum GNUNET_BLOCK_Type) ntohl(msg->type),
674  ntohl (msg->hop_count),
675  ntohl (msg->desired_replication_level),
676  putl,
677  path,
679  &msg->key,
680  (const void *) &path[putl],
681  msize - sizeof (struct GNUNET_PeerIdentity) * putl);
682  }
683 }
struct GNUNET_DHT_MonitorHandle * next
DLL.
Definition: dht_api.c:157
uint32_t hop_count
Hop count so far.
Definition: dht.h:254
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition: time.c:670
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:259
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:249
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:192
Connection to the DHT service.
Definition: dht_api.c:205
struct GNUNET_TIME_AbsoluteNBO expiration_time
How long should this data persist?
Definition: dht.h:270
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
struct GNUNET_HashCode * key
Key being looked for, NULL == all.
Definition: dht_api.c:177
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:221
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:265
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:172
uint32_t options
Message options, actually an &#39;enum GNUNET_DHT_RouteOption&#39; value.
Definition: dht.h:244
Handle to a monitoring request.
Definition: dht_api.c:152
struct GNUNET_HashCode key
The key to store the value under.
Definition: dht.h:275
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_DHT_MONITOR_PUT.
Definition: dht.h:239
void * cb_cls
Closure for get_cb, put_cb and get_resp_cb.
Definition: dht_api.c:197
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 695 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.

697 {
698  size_t msize = ntohs (msg->header.size) - sizeof (*msg);
699  uint32_t put_path_length = ntohl (msg->put_path_length);
700  uint32_t get_path_length = ntohl (msg->get_path_length);
701  size_t meta_length;
702 
703  meta_length =
704  sizeof (struct GNUNET_PeerIdentity) * (get_path_length + put_path_length);
705  if ( (msize < meta_length) ||
706  (get_path_length >
707  GNUNET_MAX_MESSAGE_SIZE / sizeof (struct GNUNET_PeerIdentity)) ||
708  (put_path_length >
709  GNUNET_MAX_MESSAGE_SIZE / sizeof (struct GNUNET_PeerIdentity)) )
710  {
711  GNUNET_break (0);
712  return GNUNET_SYSERR;
713  }
714  return GNUNET_OK;
715 }
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:163
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
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:152
#define GNUNET_SYSERR
Definition: gnunet_common.h:79
#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:169

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

730 {
731  const struct GNUNET_DHT_ClientResultMessage *crm = cls;
733  size_t msize = ntohs (crm->header.size) - sizeof (*crm);
734  uint32_t put_path_length = ntohl (crm->put_path_length);
735  uint32_t get_path_length = ntohl (crm->get_path_length);
736  const struct GNUNET_PeerIdentity *put_path;
737  const struct GNUNET_PeerIdentity *get_path;
738  struct GNUNET_HashCode hc;
739  size_t data_length;
740  size_t meta_length;
741  const void *data;
742 
743  if (crm->unique_id != get_handle->unique_id)
744  {
745  /* UID mismatch */
747  "Ignoring reply for %s: UID mismatch: %llu/%llu\n",
748  GNUNET_h2s (key),
749  crm->unique_id,
750  get_handle->unique_id);
751  return GNUNET_YES;
752  }
753  /* FIXME: might want to check that type matches */
754  meta_length =
755  sizeof (struct GNUNET_PeerIdentity) * (get_path_length + put_path_length);
756  data_length = msize - meta_length;
757  put_path = (const struct GNUNET_PeerIdentity *) &crm[1];
758  get_path = &put_path[put_path_length];
759  {
760  char *pp;
761  char *gp;
762 
763  gp = GNUNET_STRINGS_pp2s (get_path,
764  get_path_length);
765  pp = GNUNET_STRINGS_pp2s (put_path,
766  put_path_length);
768  "Giving %u byte reply for %s to application (GP: %s, PP: %s)\n",
769  (unsigned int) data_length,
770  GNUNET_h2s (key),
771  gp,
772  pp);
773  GNUNET_free (gp);
774  GNUNET_free (pp);
775  }
776  data = &get_path[get_path_length];
777  /* remember that we've seen this result */
778  GNUNET_CRYPTO_hash (data,
779  data_length,
780  &hc);
781  if (get_handle->seen_results_size == get_handle->seen_results_end)
782  GNUNET_array_grow (get_handle->seen_results,
783  get_handle->seen_results_size,
784  get_handle->seen_results_size * 2 + 1);
785  get_handle->seen_results[get_handle->seen_results_end++] = hc;
786  /* no need to block it explicitly, service already knows about it! */
787  get_handle->iter (get_handle->iter_cls,
789  key,
790  get_path,
791  get_path_length,
792  put_path,
793  put_path_length,
794  ntohl (crm->type),
795  data_length,
796  data);
797  return GNUNET_YES;
798 }
uint64_t unique_id
Unique ID of the matching GET request.
Definition: dht.h:174
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition: time.c:670
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:163
unsigned int seen_results_size
Size of the seen_results array.
Definition: dht_api.c:138
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:144
GNUNET_DHT_GetIterator iter
Iterator to call on data receipt.
Definition: dht_api.c:86
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:91
#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:99
struct GNUNET_TIME_AbsoluteNBO expiration
When does this entry expire?
Definition: dht.h:179
uint32_t type
The type for the data.
Definition: dht.h:157
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:102
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_DHT_CLIENT_RESULT.
Definition: dht.h:152
Handle to a GET request.
Definition: dht_api.c:80
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:169
#define GNUNET_YES
Definition: gnunet_common.h:80
uint32_t data
The data value.
uint64_t unique_id
Unique identifier for this request (for key collisions).
Definition: dht_api.c:112
Reply to a GET send from the service to a client.
Definition: dht.h:147
#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 808 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().

810 {
811  struct GNUNET_DHT_Handle *handle = cls;
812 
814  &msg->key,
816  (void *) msg);
817 }
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:242
Connection to the DHT service.
Definition: dht_api.c:205
struct GNUNET_HashCode key
The key that was searched for.
Definition: dht.h:184
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:727
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 826 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().

827 {
828  struct GNUNET_DHT_PutHandle *ph = cls;
830  void *cont_cls;
831 
832  cont = ph->cont;
833  cont_cls = ph->cont_cls;
834  ph->env = NULL;
836  if (NULL != cont)
837  cont (cont_cls);
838 }
void GNUNET_DHT_put_cancel(struct GNUNET_DHT_PutHandle *ph)
Cancels a DHT PUT operation.
Definition: dht_api.c:1040
struct GNUNET_MQ_Envelope * env
Envelope from the PUT operation.
Definition: dht_api.c:73
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:58
void * cont_cls
Closure for cont.
Definition: dht_api.c:68
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: