GNUnet  0.11.x
Data Structures | Macros | Functions
namecache_api.c File Reference

API to access the NAMECACHE service. More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_crypto_lib.h"
#include "gnunet_constants.h"
#include "gnunet_dnsparser_lib.h"
#include "gnunet_gnsrecord_lib.h"
#include "gnunet_signatures.h"
#include "gnunet_namecache_service.h"
#include "namecache.h"
Include dependency graph for namecache_api.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_NAMECACHE_QueueEntry
 An QueueEntry used to store information for a pending NAMECACHE record operation. More...
 
struct  GNUNET_NAMECACHE_Handle
 Connection to the NAMECACHE service. More...
 

Macros

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

Functions

static void force_reconnect (struct GNUNET_NAMECACHE_Handle *h)
 Disconnect from service and then reconnect. More...
 
static struct GNUNET_NAMECACHE_QueueEntryfind_qe (struct GNUNET_NAMECACHE_Handle *h, uint32_t rid)
 Find queue entry for the given rid. More...
 
static int check_lookup_block_response (void *cls, const struct LookupBlockResponseMessage *msg)
 Handle an incoming message of type GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK_RESPONSE. More...
 
static void handle_lookup_block_response (void *cls, const struct LookupBlockResponseMessage *msg)
 Handle an incoming message of type GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK_RESPONSE. More...
 
static void handle_block_cache_response (void *cls, const struct BlockCacheResponseMessage *msg)
 Handle an incoming message of type GNUNET_MESSAGE_TYPE_NAMECACHE_BLOCK_CACHE_RESPONSE. 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 void reconnect (struct GNUNET_NAMECACHE_Handle *h)
 Reconnect to namecache service. More...
 
static void reconnect_task (void *cls)
 Re-establish the connection to the service. More...
 
static uint32_t get_op_id (struct GNUNET_NAMECACHE_Handle *h)
 Get a fresh operation id to distinguish between namecache requests. More...
 
struct GNUNET_NAMECACHE_HandleGNUNET_NAMECACHE_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
 Initialize the connection with the NAMECACHE service. More...
 
void GNUNET_NAMECACHE_disconnect (struct GNUNET_NAMECACHE_Handle *h)
 Disconnect from the namecache service (and free associated resources). More...
 
struct GNUNET_NAMECACHE_QueueEntryGNUNET_NAMECACHE_block_cache (struct GNUNET_NAMECACHE_Handle *h, const struct GNUNET_GNSRECORD_Block *block, GNUNET_NAMECACHE_ContinuationWithStatus cont, void *cont_cls)
 Store an item in the namecache. More...
 
struct GNUNET_NAMECACHE_QueueEntryGNUNET_NAMECACHE_lookup_block (struct GNUNET_NAMECACHE_Handle *h, const struct GNUNET_HashCode *derived_hash, GNUNET_NAMECACHE_BlockProcessor proc, void *proc_cls)
 Get a result for a particular key from the namecache. More...
 
void GNUNET_NAMECACHE_cancel (struct GNUNET_NAMECACHE_QueueEntry *qe)
 Cancel a namecache operation. More...
 

Detailed Description

API to access the NAMECACHE service.

Author
Martin Schanzenbach
Matthias Wachs
Christian Grothoff

Definition in file namecache_api.c.

Macro Definition Documentation

◆ LOG

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

Function Documentation

◆ force_reconnect()

static void force_reconnect ( struct GNUNET_NAMECACHE_Handle h)
static

Disconnect from service and then reconnect.

Parameters
hour handle

Definition at line 358 of file namecache_api.c.

References _, GNUNET_NAMECACHE_QueueEntry::cont, GNUNET_NAMECACHE_QueueEntry::cont_cls, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_MQ_destroy(), GNUNET_NO, GNUNET_SCHEDULER_add_delayed(), GNUNET_SYSERR, GNUNET_TIME_STD_BACKOFF, GNUNET_NAMECACHE_Handle::mq, GNUNET_NAMECACHE_Handle::op_head, GNUNET_NAMECACHE_Handle::op_tail, qe, GNUNET_NAMECACHE_Handle::reconnect, GNUNET_NAMECACHE_Handle::reconnect_delay, GNUNET_NAMECACHE_Handle::reconnect_task, and reconnect_task().

Referenced by handle_lookup_block_response(), and mq_error_handler().

359 {
361 
362  h->reconnect = GNUNET_NO;
363  GNUNET_MQ_destroy (h->mq);
364  h->mq = NULL;
365  while (NULL != (qe = h->op_head))
366  {
368  h->op_tail,
369  qe);
370  if (NULL != qe->cont)
371  qe->cont (qe->cont_cls,
373  _ ("Error communicating with namecache service"));
374  GNUNET_free (qe);
375  }
377  "Reconnecting to namecache\n");
381  h);
382 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct GNUNET_TIME_Relative reconnect_delay
Delay introduced before we reconnect.
static struct GNUNET_DATASTORE_QueueEntry * qe
Current operation.
struct GNUNET_NAMECACHE_QueueEntry * op_tail
Tail of pending namecache queue entries.
struct GNUNET_SCHEDULER_Task * reconnect_task
Reconnect task.
#define _(String)
GNU gettext support macro.
Definition: platform.h:178
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:1269
void * cont_cls
Closure for cont.
Definition: namecache_api.c:72
struct GNUNET_MQ_Handle * mq
Message queue to service.
int reconnect
Should we reconnect to service due to some serious error?
#define GNUNET_TIME_STD_BACKOFF(r)
Perform our standard exponential back-off calculation, starting at 1 ms and then going by a factor of...
struct GNUNET_NAMECACHE_QueueEntry * op_head
Head of pending namecache queue entries.
#define GNUNET_log(kind,...)
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:837
An QueueEntry used to store information for a pending NAMECACHE record operation. ...
Definition: namecache_api.c:47
#define GNUNET_free(ptr)
Wrapper around free.
GNUNET_NAMECACHE_ContinuationWithStatus cont
Continuation to call.
Definition: namecache_api.c:67
static void reconnect_task(void *cls)
Re-establish the connection to the service.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_qe()

static struct GNUNET_NAMECACHE_QueueEntry* find_qe ( struct GNUNET_NAMECACHE_Handle h,
uint32_t  rid 
)
static

Find queue entry for the given rid.

Parameters
hhandle to search
ridrequest ID to look for
Returns
NULL if not found, otherwise the queue entry (removed from the queue)

Definition at line 160 of file namecache_api.c.

References GNUNET_CONTAINER_DLL_remove, GNUNET_NAMECACHE_QueueEntry::next, GNUNET_NAMECACHE_Handle::op_head, GNUNET_NAMECACHE_QueueEntry::op_id, GNUNET_NAMECACHE_Handle::op_tail, and qe.

Referenced by handle_block_cache_response(), and handle_lookup_block_response().

162 {
164 
165  for (qe = h->op_head; qe != NULL; qe = qe->next)
166  {
167  if (qe->op_id == rid)
168  {
170  h->op_tail,
171  qe);
172  return qe;
173  }
174  }
175  return NULL;
176 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
static struct GNUNET_DATASTORE_QueueEntry * qe
Current operation.
uint32_t op_id
The operation id this zone iteration operation has.
Definition: namecache_api.c:87
struct GNUNET_NAMECACHE_QueueEntry * next
Kept in a DLL.
Definition: namecache_api.c:52
struct GNUNET_NAMECACHE_QueueEntry * op_tail
Tail of pending namecache queue entries.
struct GNUNET_NAMECACHE_QueueEntry * op_head
Head of pending namecache queue entries.
An QueueEntry used to store information for a pending NAMECACHE record operation. ...
Definition: namecache_api.c:47
Here is the caller graph for this function:

◆ check_lookup_block_response()

static int check_lookup_block_response ( void *  cls,
const struct LookupBlockResponseMessage msg 
)
static

Handle an incoming message of type GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK_RESPONSE.

Parameters
clsthe struct GNUNET_NAMECACHE_Handle
msgthe message we received

Definition at line 187 of file namecache_api.c.

References GNUNET_OK.

189 {
190  /* any length will do, format validation is in handler */
191  return GNUNET_OK;
192 }

◆ handle_lookup_block_response()

static void handle_lookup_block_response ( void *  cls,
const struct LookupBlockResponseMessage msg 
)
static

Handle an incoming message of type GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK_RESPONSE.

Parameters
clsthe struct GNUNET_NAMECACHE_Handle
msgthe message we received

Definition at line 203 of file namecache_api.c.

References GNUNET_TIME_Absolute::abs_value_us, GNUNET_NAMECACHE_QueueEntry::block_proc, GNUNET_NAMECACHE_QueueEntry::block_proc_cls, buf, LookupBlockResponseMessage::expire, find_qe(), force_reconnect(), LookupBlockResponseMessage::gns_header, GNUNET_ALIGN, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_GNSRECORD_block_verify(), GNUNET_memcpy, GNUNET_OK, GNUNET_TIME_absolute_ntoh(), h, GNUNET_NAMECACHE_Header::header, LOG, qe, GNUNET_NAMECACHE_Header::r_id, size, and GNUNET_MessageHeader::size.

205 {
206  struct GNUNET_NAMECACHE_Handle *h = cls;
207  size_t size;
209 
211  "Received LOOKUP_BLOCK_RESPONSE\n");
212  qe = find_qe (h,
213  ntohl (msg->gns_header.r_id));
214  if (NULL == qe)
215  return;
217  {
218  /* no match found */
219  if (NULL != qe->block_proc)
220  qe->block_proc (qe->block_proc_cls,
221  NULL);
222  GNUNET_free (qe);
223  return;
224  }
225  size = ntohs (msg->gns_header.header.size)
226  - sizeof(struct LookupBlockResponseMessage);
227  {
228  char buf[size] GNUNET_ALIGN;
229  struct GNUNET_GNSRECORD_Block *block;
230 
231  block = (struct GNUNET_GNSRECORD_Block *) buf;
232  GNUNET_memcpy (block,
233  &msg[1],
234  size);
235  if (GNUNET_OK !=
237  {
238  GNUNET_break (0);
239  if (NULL != qe->block_proc)
240  qe->block_proc (qe->block_proc_cls,
241  NULL);
242  force_reconnect (h);
243  }
244  else
245  {
246  if (NULL != qe->block_proc)
247  qe->block_proc (qe->block_proc_cls,
248  block);
249  }
250  }
251  GNUNET_free (qe);
252 }
static struct GNUNET_DATASTORE_QueueEntry * qe
Current operation.
Lookup response.
Definition: namecache.h:75
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition: time.c:542
struct GNUNET_MessageHeader header
header.type will be GNUNET_MESSAGE_TYPE_NAMECACHE_* header.size will be message size ...
Definition: namecache.h:46
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
static struct GNUNET_NAMECACHE_QueueEntry * find_qe(struct GNUNET_NAMECACHE_Handle *h, uint32_t rid)
Find queue entry for the given rid.
uint64_t abs_value_us
The actual value.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
static char buf[2048]
void * block_proc_cls
Closure for block_proc.
Definition: namecache_api.c:82
GNUNET_NAMECACHE_BlockProcessor block_proc
Function to call with the blocks we get back; or NULL.
Definition: namecache_api.c:77
struct GNUNET_NAMECACHE_Header gns_header
Type will be GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK_RESPONSE.
Definition: namecache.h:80
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_block_verify(const struct GNUNET_GNSRECORD_Block *block)
Check if a signature is valid.
static unsigned int size
Size of the "table".
Definition: peer.c:67
#define GNUNET_ALIGN
gcc-ism to force alignment; we use this to align char-arrays that may then be cast to 'struct's...
uint32_t r_id
Request ID in NBO.
Definition: namecache.h:51
Connection to the NAMECACHE service.
Definition: namecache_api.c:94
#define LOG(kind,...)
Definition: namecache_api.c:40
struct GNUNET_TIME_AbsoluteNBO expire
Expiration time.
Definition: namecache.h:85
An QueueEntry used to store information for a pending NAMECACHE record operation. ...
Definition: namecache_api.c:47
static void force_reconnect(struct GNUNET_NAMECACHE_Handle *h)
Disconnect from service and then reconnect.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:

◆ handle_block_cache_response()

static void handle_block_cache_response ( void *  cls,
const struct BlockCacheResponseMessage msg 
)
static

Handle an incoming message of type GNUNET_MESSAGE_TYPE_NAMECACHE_BLOCK_CACHE_RESPONSE.

Parameters
clsthe struct GNUNET_NAMECACHE_Handle
msgthe message we received
sizethe message size
Returns
GNUNET_OK on success, GNUNET_SYSERR on error and we did NOT notify the client

Definition at line 265 of file namecache_api.c.

References _, GNUNET_NAMECACHE_QueueEntry::cont, GNUNET_NAMECACHE_QueueEntry::cont_cls, find_qe(), BlockCacheResponseMessage::gns_header, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_OK, h, LOG, BlockCacheResponseMessage::op_result, qe, GNUNET_NAMECACHE_Header::r_id, and res.

267 {
268  struct GNUNET_NAMECACHE_Handle *h = cls;
270  int res;
271 
273  "Received BLOCK_CACHE_RESPONSE\n");
274  qe = find_qe (h,
275  ntohl (msg->gns_header.r_id));
276  if (NULL == qe)
277  return;
278  res = ntohl (msg->op_result);
279  /* TODO: add actual error message from namecache to response... */
280  if (NULL != qe->cont)
281  qe->cont (qe->cont_cls,
282  res,
283  (GNUNET_OK == res)
284  ? NULL
285  : _ ("Namecache failed to cache block"));
286  GNUNET_free (qe);
287 }
static struct GNUNET_DATASTORE_QueueEntry * qe
Current operation.
static struct GNUNET_NAMECACHE_QueueEntry * find_qe(struct GNUNET_NAMECACHE_Handle *h, uint32_t rid)
Find queue entry for the given rid.
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
#define _(String)
GNU gettext support macro.
Definition: platform.h:178
void * cont_cls
Closure for cont.
Definition: namecache_api.c:72
static int res
struct GNUNET_NAMECACHE_Header gns_header
Type will be GNUNET_MESSAGE_TYPE_NAMECACHE_BLOCK_CACHE_RESPONSE.
Definition: namecache.h:138
uint32_t r_id
Request ID in NBO.
Definition: namecache.h:51
Connection to the NAMECACHE service.
Definition: namecache_api.c:94
#define LOG(kind,...)
Definition: namecache_api.c:40
An QueueEntry used to store information for a pending NAMECACHE record operation. ...
Definition: namecache_api.c:47
int32_t op_result
GNUNET_OK on success, GNUNET_SYSERR error
Definition: namecache.h:143
#define GNUNET_free(ptr)
Wrapper around free.
GNUNET_NAMECACHE_ContinuationWithStatus cont
Continuation to call.
Definition: namecache_api.c:67
Here is the call 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_NAMECACHE_Handle *
errorerror code

Definition at line 299 of file namecache_api.c.

References force_reconnect(), and h.

Referenced by reconnect().

301 {
302  struct GNUNET_NAMECACHE_Handle *h = cls;
303 
304  force_reconnect (h);
305 }
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
Connection to the NAMECACHE service.
Definition: namecache_api.c:94
static void force_reconnect(struct GNUNET_NAMECACHE_Handle *h)
Disconnect from service and then reconnect.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ reconnect()

static void reconnect ( struct GNUNET_NAMECACHE_Handle h)
static

Reconnect to namecache service.

Parameters
hthe handle to the NAMECACHE service

Definition at line 314 of file namecache_api.c.

References GNUNET_NAMECACHE_Handle::cfg, GNUNET_assert, GNUNET_CLIENT_connect(), GNUNET_MESSAGE_TYPE_NAMECACHE_BLOCK_CACHE_RESPONSE, GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK_RESPONSE, GNUNET_MQ_handler_end, GNUNET_MQ_hd_fixed_size, GNUNET_MQ_hd_var_size, GNUNET_NAMECACHE_Handle::mq, and mq_error_handler().

Referenced by GNUNET_NAMECACHE_connect(), and reconnect_task().

315 {
317  GNUNET_MQ_hd_var_size (lookup_block_response,
320  h),
321  GNUNET_MQ_hd_fixed_size (block_cache_response,
324  h),
326  };
327 
328  GNUNET_assert (NULL == h->mq);
329  h->mq = GNUNET_CLIENT_connect (h->cfg,
330  "namecache",
331  handlers,
333  h);
334 }
#define GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK_RESPONSE
Service to client: result of block lookup.
#define GNUNET_MESSAGE_TYPE_NAMECACHE_BLOCK_CACHE_RESPONSE
Service to client: result of block cache request.
Lookup response.
Definition: namecache.h:75
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:1063
Response to a request to cache a block.
Definition: namecache.h:133
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
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...
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration to use.
Definition: namecache_api.c:99
Message handler for a specific message type.
struct GNUNET_MQ_Handle * mq
Message queue to service.
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ reconnect_task()

static void reconnect_task ( void *  cls)
static

Re-establish the connection to the service.

Parameters
clshandle to use to re-connect.

Definition at line 343 of file namecache_api.c.

References h, reconnect(), and GNUNET_NAMECACHE_Handle::reconnect_task.

Referenced by force_reconnect().

344 {
345  struct GNUNET_NAMECACHE_Handle *h = cls;
346 
347  h->reconnect_task = NULL;
348  reconnect (h);
349 }
struct GNUNET_SCHEDULER_Task * reconnect_task
Reconnect task.
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
static void reconnect(struct GNUNET_NAMECACHE_Handle *h)
Reconnect to namecache service.
Connection to the NAMECACHE service.
Definition: namecache_api.c:94
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_op_id()

static uint32_t get_op_id ( struct GNUNET_NAMECACHE_Handle h)
static

Get a fresh operation id to distinguish between namecache requests.

Parameters
hthe namecache handle
Returns
next operation id to use

Definition at line 392 of file namecache_api.c.

References GNUNET_NAMECACHE_Handle::last_op_id_used.

Referenced by GNUNET_NAMECACHE_block_cache(), and GNUNET_NAMECACHE_lookup_block().

393 {
394  return h->last_op_id_used++;
395 }
uint32_t last_op_id_used
The last operation id used for a NAMECACHE operation.
Here is the caller graph for this function: