GNUnet  0.11.x
Data Structures | Macros | Typedefs | Enumerations | Functions
DHT service

Distributed Hash Table. More...

Data Structures

struct  GNUNET_DHT_HopSignature
 Message signed by a peer when doing path tracking. More...
 
struct  GNUNET_DHT_PathElement
 A (signed) path tracking a block's flow through the DHT is represented by an array of path elements, each consisting of a peer on the path and a signature by which the peer affirms its routing decision. More...
 

Macros

#define GNUNET_DHT_DEFAULT_REPUBLISH_FREQUENCY
 Default republication frequency for stored data in the DHT. More...
 
#define GNUNET_DHT_MAXIMUM_REPLICATION_LEVEL   16
 Maximum allowed replication level for all requests. More...
 

Typedefs

typedef void(* GNUNET_DHT_GetIterator) (void *cls, struct GNUNET_TIME_Absolute exp, const struct GNUNET_HashCode *key, const struct GNUNET_DHT_PathElement *get_path, unsigned int get_path_length, const struct GNUNET_DHT_PathElement *put_path, unsigned int put_path_length, enum GNUNET_BLOCK_Type type, size_t size, const void *data)
 Iterator called on each result obtained for a DHT operation that expects a reply. More...
 
typedef void(* GNUNET_DHT_MonitorGetCB) (void *cls, enum GNUNET_DHT_RouteOption options, enum GNUNET_BLOCK_Type type, uint32_t hop_count, uint32_t desired_replication_level, unsigned int path_length, const struct GNUNET_DHT_PathElement *path, const struct GNUNET_HashCode *key)
 Callback called on each GET request going through the DHT. More...
 
typedef void(* GNUNET_DHT_MonitorGetRespCB) (void *cls, enum GNUNET_BLOCK_Type type, const struct GNUNET_DHT_PathElement *get_path, unsigned int get_path_length, const struct GNUNET_DHT_PathElement *put_path, unsigned int put_path_length, struct GNUNET_TIME_Absolute exp, const struct GNUNET_HashCode *key, const void *data, size_t size)
 Callback called on each GET reply going through the DHT. More...
 
typedef void(* GNUNET_DHT_MonitorPutCB) (void *cls, enum GNUNET_DHT_RouteOption options, enum GNUNET_BLOCK_Type type, uint32_t hop_count, uint32_t desired_replication_level, unsigned int path_length, const struct GNUNET_DHT_PathElement *path, struct GNUNET_TIME_Absolute exp, const struct GNUNET_HashCode *key, const void *data, size_t size)
 Callback called on each PUT request going through the DHT. More...
 

Enumerations

enum  GNUNET_DHT_RouteOption {
  GNUNET_DHT_RO_NONE = 0 , GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE = 1 , GNUNET_DHT_RO_RECORD_ROUTE = 2 , GNUNET_DHT_RO_FIND_PEER = 4 ,
  GNUNET_DHT_RO_LAST_HOP = 65535
}
 Options for routing. More...
 

Functions

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 *handle)
 Stop monitoring. More...
 
char * GNUNET_DHT_pp2s (const struct GNUNET_DHT_PathElement *path, unsigned int path_len)
 Convert a peer path to a human-readable string. More...
 
unsigned int GNUNET_DHT_verify_path (const struct GNUNET_HashCode *key, const void *data, size_t data_size, struct GNUNET_TIME_Absolute exp_time, const struct GNUNET_DHT_PathElement *put_path, unsigned int put_path_len, const struct GNUNET_DHT_PathElement *get_path, unsigned int get_path_len, const struct GNUNET_PeerIdentity *me)
 Verify signatures on a path consisting of put_path and get_path in reverse order (starting at the last element of the get_path). More...
 

Detailed Description

Distributed Hash Table.

See also
Documentation

Macro Definition Documentation

◆ GNUNET_DHT_DEFAULT_REPUBLISH_FREQUENCY

#define GNUNET_DHT_DEFAULT_REPUBLISH_FREQUENCY
Value:
#define GNUNET_TIME_UNIT_MINUTES
One minute.
struct GNUNET_TIME_Relative GNUNET_TIME_relative_multiply(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Multiply relative time by a given factor.
Definition: time.c:453

Default republication frequency for stored data in the DHT.

Definition at line 54 of file gnunet_dht_service.h.

◆ GNUNET_DHT_MAXIMUM_REPLICATION_LEVEL

#define GNUNET_DHT_MAXIMUM_REPLICATION_LEVEL   16

Maximum allowed replication level for all requests.

Definition at line 61 of file gnunet_dht_service.h.

Typedef Documentation

◆ GNUNET_DHT_GetIterator

typedef void(* GNUNET_DHT_GetIterator) (void *cls, struct GNUNET_TIME_Absolute exp, const struct GNUNET_HashCode *key, const struct GNUNET_DHT_PathElement *get_path, unsigned int get_path_length, const struct GNUNET_DHT_PathElement *put_path, unsigned int put_path_length, enum GNUNET_BLOCK_Type type, size_t size, const void *data)

Iterator called on each result obtained for a DHT operation that expects a reply.

Parameters
clsclosure
expwhen will this value expire
keykey of the result
get_pathpeers on reply path (or NULL if not recorded) [0] = datastore's first neighbor, [length - 1] = local peer
get_path_lengthnumber of entries in get_path
put_pathpeers on the PUT path (or NULL if not recorded) [0] = origin, [length - 1] = datastore
put_path_lengthnumber of entries in put_path, note that the last signature will be all zeros as we did not forward and thus did not sign!
typetype of the result
sizenumber of bytes in data
datapointer to the result data

Definition at line 282 of file gnunet_dht_service.h.

◆ GNUNET_DHT_MonitorGetCB

typedef void(* GNUNET_DHT_MonitorGetCB) (void *cls, enum GNUNET_DHT_RouteOption options, enum GNUNET_BLOCK_Type type, uint32_t hop_count, uint32_t desired_replication_level, unsigned int path_length, const struct GNUNET_DHT_PathElement *path, const struct GNUNET_HashCode *key)

Callback called on each GET request going through the DHT.

Parameters
clsClosure.
optionsOptions, for instance RecordRoute, DemultiplexEverywhere.
typeThe type of data in the request.
hop_countHop count so far.
path_lengthnumber of entries in path (or 0 if not recorded).
pathpeers on the GET path (or NULL if not recorded). note that the last signature will be all zeros as we did not forward and thus did not sign!
desired_replication_levelDesired replication level.
keyKey of the requested data.

Definition at line 368 of file gnunet_dht_service.h.

◆ GNUNET_DHT_MonitorGetRespCB

typedef void(* GNUNET_DHT_MonitorGetRespCB) (void *cls, enum GNUNET_BLOCK_Type type, const struct GNUNET_DHT_PathElement *get_path, unsigned int get_path_length, const struct GNUNET_DHT_PathElement *put_path, unsigned int put_path_length, struct GNUNET_TIME_Absolute exp, const struct GNUNET_HashCode *key, const void *data, size_t size)

Callback called on each GET reply going through the DHT.

Parameters
clsClosure.
typeThe type of data in the result.
get_pathPeers on GET path (or NULL if not recorded). note that the last signature will be all zeros as we did not forward and thus did not sign!
get_path_lengthnumber of entries in get_path.
put_pathpeers on the PUT path (or NULL if not recorded).
put_path_lengthnumber of entries in get_path.
expExpiration time of the data.
keyKey of the data.
dataPointer to the result data.
sizeNumber of bytes in data.

Definition at line 395 of file gnunet_dht_service.h.

◆ GNUNET_DHT_MonitorPutCB

typedef void(* GNUNET_DHT_MonitorPutCB) (void *cls, enum GNUNET_DHT_RouteOption options, enum GNUNET_BLOCK_Type type, uint32_t hop_count, uint32_t desired_replication_level, unsigned int path_length, const struct GNUNET_DHT_PathElement *path, struct GNUNET_TIME_Absolute exp, const struct GNUNET_HashCode *key, const void *data, size_t size)

Callback called on each PUT request going through the DHT.

Parameters
clsClosure.
optionsOptions, for instance RecordRoute, DemultiplexEverywhere.
typeThe type of data in the request.
hop_countHop count so far.
path_lengthnumber of entries in path (or 0 if not recorded).
pathpeers on the PUT path (or NULL if not recorded). note that the last signature will be all zeros as we did not forward and thus did not sign!
desired_replication_levelDesired replication level.
expExpiration time of the data.
keyKey under which data is to be stored.
dataPointer to the data carried.
sizeNumber of bytes in data.

Definition at line 425 of file gnunet_dht_service.h.

Enumeration Type Documentation

◆ GNUNET_DHT_RouteOption

Options for routing.

Enumerator
GNUNET_DHT_RO_NONE 

Default.

Do nothing special.

GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE 

Each peer along the way should process the request (otherwise only peers locally closest to the key when the random walk is over should look at it).

GNUNET_DHT_RO_RECORD_ROUTE 

We should keep track of the route that the message took in the P2P network.

GNUNET_DHT_RO_FIND_PEER 

This is a 'FIND-PEER' request, so approximate results are fine.

GNUNET_DHT_RO_LAST_HOP 

Flag given to monitors if this was the last hop for a GET/PUT.

This is only used for internal processing.

Definition at line 83 of file gnunet_dht_service.h.

84 {
89 
96 
102 
107 
112  GNUNET_DHT_RO_LAST_HOP = 65535
113 };
@ GNUNET_DHT_RO_NONE
Default.
@ GNUNET_DHT_RO_RECORD_ROUTE
We should keep track of the route that the message took in the P2P network.
@ GNUNET_DHT_RO_LAST_HOP
Flag given to monitors if this was the last hop for a GET/PUT.
@ GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE
Each peer along the way should process the request (otherwise only peers locally closest to the key w...
@ GNUNET_DHT_RO_FIND_PEER
This is a 'FIND-PEER' request, so approximate results are fine.

Function Documentation

◆ GNUNET_DHT_connect()

struct GNUNET_DHT_Handle* GNUNET_DHT_connect ( const struct GNUNET_CONFIGURATION_Handle cfg,
unsigned int  ht_len 
)

Initialize the connection with the DHT service.

Parameters
cfgconfiguration to use
ht_lensize of the internal hash table to use for processing multiple GET/FIND requests in parallel
Returns
NULL on error

Definition at line 883 of file dht_api.c.

885 {
886  struct GNUNET_DHT_Handle *handle;
887 
889  handle->cfg = cfg;
890  handle->uid_gen
892  UINT64_MAX);
893  handle->active_requests
895  GNUNET_YES);
896  if (GNUNET_NO == try_connect (handle))
897  {
899  return NULL;
900  }
901  return handle;
902 }
static enum GNUNET_GenericReturnValue try_connect(struct GNUNET_DHT_Handle *h)
Try to (re)connect to the DHT service.
Definition: dht_api.c:843
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
Definition: gnunet-abd.c:36
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
@ GNUNET_YES
Definition: gnunet_common.h:97
@ GNUNET_NO
Definition: gnunet_common.h:94
uint64_t GNUNET_CRYPTO_random_u64(enum GNUNET_CRYPTO_Quality mode, uint64_t max)
Random on unsigned 64-bit values.
@ GNUNET_CRYPTO_QUALITY_WEAK
No good quality of the operation is needed (i.e., random numbers can be pseudo-random).
void GNUNET_DHT_disconnect(struct GNUNET_DHT_Handle *handle)
Shutdown connection with the DHT service.
Definition: dht_api.c:906
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
Connection to the DHT service.
Definition: dht_api.c:203
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration to use.
Definition: dns_api.c:66

References cfg, GNUNET_DNS_Handle::cfg, GNUNET_CONTAINER_multihashmap_create(), GNUNET_CRYPTO_QUALITY_WEAK, GNUNET_CRYPTO_random_u64(), GNUNET_DHT_disconnect(), GNUNET_new, GNUNET_NO, GNUNET_YES, handle, and try_connect().

Referenced by advertise_dns_exit(), dht_ca(), dht_connect(), dht_connect_adapter(), GCD_init(), and run().

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

◆ GNUNET_DHT_disconnect()

void GNUNET_DHT_disconnect ( struct GNUNET_DHT_Handle handle)

Shutdown connection with the DHT service.

Parameters
handleconnection to shut down

Definition at line 906 of file dht_api.c.

907 {
908  struct GNUNET_DHT_PutHandle *ph;
909 
910  GNUNET_assert (0 ==
911  GNUNET_CONTAINER_multihashmap_size (handle->active_requests));
912  while (NULL != (ph = handle->put_head))
913  {
914  if (NULL != ph->cont)
915  ph->cont (ph->cont_cls);
917  }
918  if (NULL != handle->mq)
919  {
921  handle->mq = NULL;
922  }
923  if (NULL != handle->reconnect_task)
924  {
926  handle->reconnect_task = NULL;
927  }
930 }
static struct GNUNET_ATS_PerformanceHandle * ph
ATS performance handle used.
Definition: gnunet-ats.c:116
void GNUNET_DHT_put_cancel(struct GNUNET_DHT_PutHandle *ph)
Cancels a DHT PUT operation.
Definition: dht_api.c:992
unsigned int GNUNET_CONTAINER_multihashmap_size(const struct GNUNET_CONTAINER_MultiHashMap *map)
Get the number of key-value pairs in the map.
void GNUNET_CONTAINER_multihashmap_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:839
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:972
Handle to a PUT request.
Definition: dht_api.c:45
struct GNUNET_SCHEDULER_Task * reconnect_task
Task to reconnect to the service.
Definition: dns_api.c:81
struct GNUNET_MQ_Handle * mq
Connection to DNS service, or NULL.
Definition: dns_api.c:61

References GNUNET_assert, GNUNET_CONTAINER_multihashmap_destroy(), GNUNET_CONTAINER_multihashmap_size(), GNUNET_DHT_put_cancel(), GNUNET_free, GNUNET_MQ_destroy(), GNUNET_SCHEDULER_cancel(), handle, GNUNET_DNS_Handle::mq, ph, and GNUNET_DNS_Handle::reconnect_task.

Referenced by cleanup(), cleanup_task(), dht_da(), dht_disconnect(), dht_disconnect_adapter(), GCD_shutdown(), GNUNET_DHT_connect(), and shutdown_task().

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

◆ GNUNET_DHT_put()

struct GNUNET_DHT_PutHandle* GNUNET_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.

Parameters
handlehandle to DHT service
keythe key to store under
desired_replication_levelestimate of how many nearest peers this request should reach
optionsrouting options for this message
typetype of the value
sizenumber of bytes in data; must be less than 64k
datathe data to store
expdesired expiration time for the value
contcontinuation to call when done (transmitting request to service) You must not call GNUNET_DHT_disconnect in this continuation
cont_clsclosure for cont
Returns
handle to cancel the "PUT" operation, NULL on error (size too big)

Definition at line 934 of file dht_api.c.

944 {
945  struct GNUNET_MQ_Envelope *env;
946  struct GNUNET_DHT_ClientPutMessage *put_msg;
947  size_t msize;
948  struct GNUNET_DHT_PutHandle *ph;
949 
950  msize = sizeof(struct GNUNET_DHT_ClientPutMessage) + size;
951  if ((msize >= GNUNET_MAX_MESSAGE_SIZE) ||
953  {
954  GNUNET_break (0);
955  return NULL;
956  }
957  if (NULL == handle->mq)
958  return NULL;
960  "Sending PUT for %s to DHT via %p\n",
961  GNUNET_h2s (key),
962  handle);
964  ph->dht_handle = handle;
965  ph->cont = cont;
966  ph->cont_cls = cont_cls;
968  handle->put_tail,
969  ph);
970  env = GNUNET_MQ_msg_extra (put_msg,
971  size,
975  ph);
976  ph->env = env;
977  put_msg->type = htonl ((uint32_t) type);
978  put_msg->options = htonl ((uint32_t) options);
980  put_msg->expiration = GNUNET_TIME_absolute_hton (exp);
981  put_msg->key = *key;
982  GNUNET_memcpy (&put_msg[1],
983  data,
984  size);
986  env);
987  return ph;
988 }
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static void handle_put_cont(void *cls)
Process a MQ PUT transmission notification.
Definition: dht_api.c:821
#define LOG(kind,...)
Definition: dht_api.c:38
struct GNUNET_HashCode key
The key used in the DHT.
uint32_t data
The data value.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_MAX_MESSAGE_SIZE
Largest supported message (to be precise, one byte more than the largest possible message,...
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_DEBUG
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:355
#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
void GNUNET_MQ_notify_sent(struct GNUNET_MQ_Envelope *ev, GNUNET_SCHEDULER_TaskCallback cb, void *cb_cls)
Call a callback once the envelope has been sent, that is, sending it can not be canceled anymore.
Definition: mq.c:789
#define GNUNET_MESSAGE_TYPE_DHT_CLIENT_PUT
Client wants to store item in DHT.
struct GNUNET_TIME_AbsoluteNBO GNUNET_TIME_absolute_hton(struct GNUNET_TIME_Absolute a)
Convert absolute time to network byte order.
Definition: time.c:607
static unsigned int size
Size of the "table".
Definition: peer.c:67
Message to insert data into the DHT, sent from clients to DHT service.
Definition: dht.h:190
struct GNUNET_HashCode key
The key to store the value under.
Definition: dht.h:219
uint32_t type
The type of data to insert.
Definition: dht.h:199
uint32_t options
Message options, actually an 'enum GNUNET_DHT_RouteOption' value.
Definition: dht.h:204
uint32_t desired_replication_level
Replication level for this message.
Definition: dht.h:209
struct GNUNET_TIME_AbsoluteNBO expiration
How long should this data persist?
Definition: dht.h:214
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model

References data, GNUNET_DHT_ClientPutMessage::desired_replication_level, env, GNUNET_DHT_ClientPutMessage::expiration, GNUNET_break, GNUNET_CONTAINER_DLL_insert_tail, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_MAX_MESSAGE_SIZE, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_DHT_CLIENT_PUT, GNUNET_MQ_msg_extra, GNUNET_MQ_notify_sent(), GNUNET_MQ_send(), GNUNET_new, GNUNET_TIME_absolute_hton(), handle, handle_put_cont(), GNUNET_DHT_ClientPutMessage::key, key, LOG, GNUNET_DNS_Handle::mq, options, GNUNET_DHT_ClientPutMessage::options, ph, size, GNUNET_DHT_ClientPutMessage::type, and type.

Referenced by announce_id(), delayed_put(), do_dht_put(), perform_dht_put(), process_dht_put_content(), regex_iterator(), and run().

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

◆ GNUNET_DHT_put_cancel()

void GNUNET_DHT_put_cancel ( struct GNUNET_DHT_PutHandle ph)

Cancels a DHT PUT operation.

Note that the PUT request may still go out over the network (we can't stop that); However, if the PUT has not yet been sent to the service, cancelling the PUT will stop this from happening (but there is no way for the user of this API to tell if that is the case). The only use for this API is to prevent a later call to 'cont' from GNUNET_DHT_put (e.g. because the system is shutting down).

Parameters
phput operation to cancel ('cont' will no longer be called)

Definition at line 992 of file dht_api.c.

993 {
994  struct GNUNET_DHT_Handle *handle = ph->dht_handle;
995 
996  if (NULL != ph->env)
998  NULL,
999  NULL);
1001  handle->put_tail,
1002  ph);
1003  GNUNET_free (ph);
1004 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.

References GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_MQ_notify_sent(), handle, and ph.

Referenced by cleanup(), do_dht_put(), do_disconnect(), do_shutdown(), GNUNET_DHT_disconnect(), GSF_put_done_(), handle_monitor_event(), handle_put_cont(), put_gns_record(), and shutdown_task().

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

◆ GNUNET_DHT_get_start()

struct GNUNET_DHT_GetHandle* GNUNET_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.

See also GNUNET_BLOCK_evaluate.

Parameters
handlehandle to the DHT service
typeexpected type of the response object
keythe key to look up
desired_replication_levelestimate of how many nearest peers this request should reach
optionsrouting options for this message
xqueryextended query data (can be NULL, depending on type)
xquery_sizenumber of bytes in xquery
iterfunction to call on each result
iter_clsclosure for iter
Returns
handle to stop the async get

Definition at line 1008 of file dht_api.c.

1017 {
1018  struct GNUNET_DHT_GetHandle *gh;
1019  size_t msize;
1020 
1021  msize = sizeof(struct GNUNET_DHT_ClientGetMessage) + xquery_size;
1022  if ((msize >= GNUNET_MAX_MESSAGE_SIZE) ||
1023  (xquery_size >= GNUNET_MAX_MESSAGE_SIZE))
1024  {
1025  GNUNET_break (0);
1026  return NULL;
1027  }
1029  "Sending query for %s to DHT %p\n",
1030  GNUNET_h2s (key),
1031  handle);
1032  gh = GNUNET_malloc (sizeof(struct GNUNET_DHT_GetHandle)
1033  + xquery_size);
1034  gh->iter = iter;
1035  gh->iter_cls = iter_cls;
1036  gh->dht_handle = handle;
1037  gh->key = *key;
1038  gh->unique_id = ++handle->uid_gen;
1039  gh->xquery_size = xquery_size;
1040  gh->desired_replication_level = desired_replication_level;
1041  gh->type = type;
1042  gh->options = options;
1043  GNUNET_memcpy (&gh[1],
1044  xquery,
1045  xquery_size);
1046  GNUNET_CONTAINER_multihashmap_put (handle->active_requests,
1047  &gh->key,
1048  gh,
1050  if (NULL != handle->mq)
1051  send_get (gh);
1052  return gh;
1053 }
static void send_get(struct GNUNET_DHT_GetHandle *gh)
Send GET message for a get_handle to DHT.
Definition: dht_api.c:274
static struct GNUNET_TRANSPORT_HelloGetHandle * gh
Pending GNUNET_TRANSPORT_hello_get() operation.
int GNUNET_CONTAINER_multihashmap_put(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE
Allow multiple values with the same key.
#define GNUNET_malloc(size)
Wrapper around malloc.
DHT GET message sent from clients to service.
Definition: dht.h:72
uint32_t desired_replication_level
Replication level for this message.
Definition: dht.h:86
Handle to a GET request.
Definition: dht_api.c:81

References GNUNET_DHT_ClientGetMessage::desired_replication_level, gh, GNUNET_break, GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_malloc, GNUNET_MAX_MESSAGE_SIZE, GNUNET_memcpy, handle, key, LOG, GNUNET_DNS_Handle::mq, options, send_get(), and type.

Referenced by delayed_get(), GCD_search(), GSF_dht_lookup_(), regex_find_path(), REGEX_INTERNAL_search(), regex_next_edge(), run(), and start_dht_request().

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

◆ GNUNET_DHT_get_filter_known_results()

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.

Parameters
get_handleget operation for which results should be filtered
num_resultsnumber of results to be blocked that are provided in this call (size of the results array)
resultsarray of hash codes over the data of the results to be blocked

Definition at line 1057 of file dht_api.c.

1060 {
1061  unsigned int needed;
1062  unsigned int had;
1063 
1065  needed = had + num_results;
1066  if (needed > get_handle->seen_results_size)
1069  needed);
1071  results,
1072  num_results * sizeof(struct GNUNET_HashCode));
1073  get_handle->seen_results_end += num_results;
1074  if (NULL != get_handle->dht_handle->mq)
1076  had);
1077 }
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:306
static struct GNUNET_DHT_GetHandle * get_handle
Handle for the get request.
static unsigned int results
Definition: gnunet-search.c:52
#define GNUNET_array_grow(arr, size, tsize)
Grow a well-typed (!) array.
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:143
struct GNUNET_HashCode * seen_results
Array of hash codes over the results that we have already seen.
Definition: dht_api.c:101
struct GNUNET_DHT_Handle * dht_handle
Main handle to this DHT api.
Definition: dht_api.c:95
unsigned int seen_results_size
Size of the seen_results array.
Definition: dht_api.c:137
struct GNUNET_MQ_Handle * mq
Connection to DHT service.
Definition: dht_api.c:212
A 512-bit hashcode.

References GNUNET_DHT_GetHandle::dht_handle, get_handle, GNUNET_array_grow, GNUNET_memcpy, GNUNET_DHT_Handle::mq, results, GNUNET_DHT_GetHandle::seen_results, GNUNET_DHT_GetHandle::seen_results_end, GNUNET_DHT_GetHandle::seen_results_size, and send_get_known_results().

Referenced by GSF_dht_lookup_(), and GSF_pending_request_update_().

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

◆ GNUNET_DHT_get_stop()

void GNUNET_DHT_get_stop ( struct GNUNET_DHT_GetHandle get_handle)

Stop async DHT-get.

Frees associated resources.

Parameters
get_handleGET operation to stop.

Definition at line 1081 of file dht_api.c.

1082 {
1084 
1086  "Sending STOP for %s to DHT via %p\n",
1088  handle);
1089  if (NULL != handle->mq)
1090  {
1091  struct GNUNET_MQ_Envelope *env;
1092  struct GNUNET_DHT_ClientGetStopMessage *stop_msg;
1093 
1094  env = GNUNET_MQ_msg (stop_msg,
1096  stop_msg->reserved = htonl (0);
1097  stop_msg->unique_id = get_handle->unique_id;
1098  stop_msg->key = get_handle->key;
1100  env);
1101  }
1103  GNUNET_CONTAINER_multihashmap_remove (handle->active_requests,
1104  &get_handle->key,
1105  get_handle));
1108  0);
1110 }
int GNUNET_CONTAINER_multihashmap_remove(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, const void *value)
Remove the given key-value pair from the map.
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
#define GNUNET_MESSAGE_TYPE_DHT_CLIENT_GET_STOP
Client wants to stop search in DHT.
Message which indicates the DHT should cancel outstanding requests and discard any state.
Definition: dht.h:44
uint64_t unique_id
Unique ID identifying this request.
Definition: dht.h:58
struct GNUNET_HashCode key
Key of this request.
Definition: dht.h:63
uint32_t reserved
Always zero.
Definition: dht.h:53
struct GNUNET_HashCode key
Key that this get request is for.
Definition: dht_api.c:106
uint64_t unique_id
Unique identifier for this request (for key collisions).
Definition: dht_api.c:111

References GNUNET_DHT_GetHandle::dht_handle, env, get_handle, GNUNET_array_grow, GNUNET_assert, GNUNET_CONTAINER_multihashmap_remove(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_h2s(), GNUNET_MESSAGE_TYPE_DHT_CLIENT_GET_STOP, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_YES, handle, GNUNET_DHT_ClientGetStopMessage::key, GNUNET_DHT_GetHandle::key, LOG, GNUNET_DNS_Handle::mq, GNUNET_DHT_ClientGetStopMessage::reserved, GNUNET_DHT_GetHandle::seen_results, GNUNET_DHT_GetHandle::seen_results_end, GNUNET_DHT_ClientGetStopMessage::unique_id, and GNUNET_DHT_GetHandle::unique_id.

Referenced by cancel_get(), clean_request(), cleanup(), cleanup_task(), do_shutdown(), GCD_search_stop(), get_iter(), get_result_iterator(), GNS_resolver_lookup_cancel(), GSF_dht_lookup_(), GSF_pending_request_cancel_(), handle_dht_response(), and regex_cancel_dht_get().

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

◆ GNUNET_DHT_monitor_start()

struct GNUNET_DHT_MonitorHandle* GNUNET_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.

Parameters
handleHandle to the DHT service.
typeType of blocks that are of interest.
keyKey of data of interest, NULL for all.
get_cbCallback to process monitored get messages.
get_resp_cbCallback to process monitored get response messages.
put_cbCallback to process monitored put messages.
cb_clsClosure for callbacks
Returns
Handle to stop monitoring.

Definition at line 1114 of file dht_api.c.

1121 {
1122  struct GNUNET_DHT_MonitorHandle *mh;
1123 
1125  mh->get_cb = get_cb;
1126  mh->get_resp_cb = get_resp_cb;
1127  mh->put_cb = put_cb;
1128  mh->cb_cls = cb_cls;
1129  mh->type = type;
1130  mh->dht_handle = handle;
1131  if (NULL != key)
1132  {
1133  mh->key = GNUNET_new (struct GNUNET_HashCode);
1134  *mh->key = *key;
1135  }
1136  GNUNET_CONTAINER_DLL_insert (handle->monitor_head,
1137  handle->monitor_tail,
1138  mh);
1139  if (NULL != handle->mq)
1141  return mh;
1142 }
static void send_monitor_start(struct GNUNET_DHT_MonitorHandle *mh)
Send GNUNET_MESSAGE_TYPE_DHT_MONITOR_START message.
Definition: dht_api.c:372
static struct GNUNET_CADET_Handle * mh
Cadet handle.
Definition: gnunet-cadet.c:92
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
static int put_cb(void *cls, const struct GNUNET_HashCode *key, void *value)
Function called during PUT to detect if an equivalent block already exists.
static int get_cb(void *cls, const struct GNUNET_HashCode *key, void *value)
Function called during GET to find matching blocks.
Handle to a monitoring request.
Definition: dht_api.c:151
GNUNET_DHT_MonitorGetRespCB get_resp_cb
Callback for each received message of type get response.
Definition: dht_api.c:185
void * cb_cls
Closure for get_cb, put_cb and get_resp_cb.
Definition: dht_api.c:195

References GNUNET_DHT_MonitorHandle::cb_cls, get_cb(), GNUNET_DHT_MonitorHandle::get_resp_cb, GNUNET_CONTAINER_DLL_insert, GNUNET_new, handle, key, mh, GNUNET_DNS_Handle::mq, put_cb(), send_monitor_start(), and type.

Referenced by run().

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

◆ GNUNET_DHT_monitor_stop()

void GNUNET_DHT_monitor_stop ( struct GNUNET_DHT_MonitorHandle handle)

Stop monitoring.

On return handle will no longer be valid, caller must not use it anymore.

Parameters
handleThe handle to the monitor request returned by GNUNET_DHT_monitor_start().

Definition at line 1146 of file dht_api.c.

1147 {
1148  struct GNUNET_DHT_Handle *handle = mh->dht_handle;
1150  struct GNUNET_MQ_Envelope *env;
1151 
1152  GNUNET_CONTAINER_DLL_remove (handle->monitor_head,
1153  handle->monitor_tail,
1154  mh);
1155  env = GNUNET_MQ_msg (m,
1157  m->type = htonl (mh->type);
1158  m->get = htons (NULL != mh->get_cb);
1159  m->get_resp = htons (NULL != mh->get_resp_cb);
1160  m->put = htons (NULL != mh->put_cb);
1161  if (NULL != mh->key)
1162  {
1163  m->filter_key = htons (1);
1164  m->key = *mh->key;
1165  }
1167  env);
1168  GNUNET_free (mh->key);
1169  GNUNET_free (mh);
1170 }
static struct GNUNET_ARM_MonitorHandle * m
Monitor connection with ARM.
Definition: gnunet-arm.c:104
#define GNUNET_MESSAGE_TYPE_DHT_MONITOR_STOP
Stop information about transiting messages.
Message to request monitoring messages, clients -> DHT service.
Definition: dht.h:281

References env, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_MESSAGE_TYPE_DHT_MONITOR_STOP, GNUNET_MQ_msg, GNUNET_MQ_send(), handle, m, mh, and GNUNET_DNS_Handle::mq.

Referenced by cleanup_task().

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

◆ GNUNET_DHT_pp2s()

char* GNUNET_DHT_pp2s ( const struct GNUNET_DHT_PathElement path,
unsigned int  path_len 
)

Convert a peer path to a human-readable string.

Parameters
patharray of path elements to convert to a string
path_lenlength of the path array
Returns
string representing the array of pids

Definition at line 1174 of file dht_api.c.

1176 {
1177  char *buf;
1178  size_t off;
1179  size_t plen = path_len * 5 + 1;
1180 
1181  GNUNET_assert (path_len < UINT32_MAX / 5);
1182  off = 0;
1183  buf = GNUNET_malloc (plen);
1184  for (unsigned int i = 0; i < path_len; i++)
1185  {
1186  off += GNUNET_snprintf (&buf[off],
1187  plen - off,
1188  "%s%s",
1189  GNUNET_i2s (&path[i].pred),
1190  (i == path_len - 1) ? "" : "-");
1191  }
1192  return buf;
1193 }
static char buf[2048]
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
int GNUNET_snprintf(char *buf, size_t size, const char *format,...) __attribute__((format(printf
Like snprintf, just aborts if the buffer is of insufficient size.

References buf, GNUNET_assert, GNUNET_i2s(), GNUNET_malloc, and GNUNET_snprintf().

Here is the call graph for this function:

◆ GNUNET_DHT_verify_path()

unsigned int GNUNET_DHT_verify_path ( const struct GNUNET_HashCode key,
const void *  data,
size_t  data_size,
struct GNUNET_TIME_Absolute  exp_time,
const struct GNUNET_DHT_PathElement put_path,
unsigned int  put_path_len,
const struct GNUNET_DHT_PathElement get_path,
unsigned int  get_path_len,
const struct GNUNET_PeerIdentity me 
)

Verify signatures on a path consisting of put_path and get_path in reverse order (starting at the last element of the get_path).

Note that the last signature on the path is never verified as that is the slot where our peer (me) would need to sign.

Parameters
keykey of the data (not necessarily the query hash)
datapayload (the block)
data_sizenumber of bytes in data
exp_timeexpiration time of data
get_patharray of path elements to verify
get_path_lenlength of the get_path array
put_patharray of path elements to verify
put_path_lenlength of the put_path array
meour own peer identity (needed to verify the last element)
Returns
0 on success, otherwise the index of the last path element that succeeded with verification; get_path_len + put_path_len - 1 if no signature was valid

Definition at line 1197 of file dht_api.c.

1206 {
1207  struct GNUNET_DHT_HopSignature hs = {
1209  .purpose.size = htonl (sizeof (hs)),
1210  .expiration_time = GNUNET_TIME_absolute_hton (exp_time),
1211  .key = *key,
1212  };
1213  unsigned int i;
1214 
1215  if (0 == get_path_len + put_path_len)
1216  return 0;
1218  "Verifying signatures with GPL: %u PPL: %u!\n",
1219  get_path_len,
1220  put_path_len);
1221  i = put_path_len + get_path_len - 1;
1223  data_size,
1224  &hs.h_data);
1225  while (i > 0)
1226  {
1227  hs.pred = (i - 1 >= put_path_len)
1228  ? get_path[i - put_path_len - 1].pred
1229  : put_path[i - 1].pred;
1230  if (i + 1 == get_path_len + put_path_len)
1231  hs.succ = *me;
1232  else
1233  hs.succ = (i + 1 >= put_path_len)
1234  ? get_path[i + 1 - put_path_len].pred
1235  : put_path[i + 1].pred;
1236  if (GNUNET_OK !=
1239  &hs,
1240  (i - 1 >= put_path_len)
1241  ? &get_path[i - put_path_len - 1].sig
1242  : &put_path[i - 1].sig,
1243  (i >= put_path_len)
1244  ? &get_path[i - put_path_len].pred.public_key
1245  : &put_path[i].pred.public_key))
1246  return i;
1247  i--;
1248  }
1249  return i;
1250 }
static size_t data_size
Number of bytes in data.
Definition: gnunet-abd.c:187
static GNUNET_NETWORK_STRUCT_END struct GNUNET_PeerIdentity me
Our own peer identity.
#define GNUNET_log(kind,...)
@ GNUNET_OK
Definition: gnunet_common.h:95
#define GNUNET_SIGNATURE_PURPOSE_DHT_HOP
Signature by which a peer affirms that it forwarded a message in the DHT.
#define GNUNET_CRYPTO_eddsa_verify(purp, ps, sig, pub)
Verify EdDSA signature.
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:41
@ GNUNET_ERROR_TYPE_INFO
uint32_t purpose
What does this signature vouch for? This must contain a GNUNET_SIGNATURE_PURPOSE_XXX constant (from g...
Message signed by a peer when doing path tracking.
struct GNUNET_HashCode h_data
Hash over the payload of the block.
struct GNUNET_CRYPTO_EccSignaturePurpose purpose
Must be GNUNET_SIGNATURE_PURPOSE_DHT_HOP.
struct GNUNET_PeerIdentity pred
Previous hop the message was received from.
struct GNUNET_PeerIdentity succ
Next hop the message was forwarded to.
struct GNUNET_CRYPTO_EddsaSignature sig
Signature affirming the hop of type GNUNET_SIGNATURE_PURPOSE_DHT_HOP.
struct GNUNET_CRYPTO_EddsaPublicKey public_key

References data, data_size, GNUNET_CRYPTO_eddsa_verify, GNUNET_CRYPTO_hash(), GNUNET_ERROR_TYPE_INFO, GNUNET_log, GNUNET_OK, GNUNET_SIGNATURE_PURPOSE_DHT_HOP, GNUNET_TIME_absolute_hton(), GNUNET_DHT_HopSignature::h_data, key, me, GNUNET_DHT_HopSignature::pred, GNUNET_DHT_PathElement::pred, GNUNET_PeerIdentity::public_key, GNUNET_CRYPTO_EccSignaturePurpose::purpose, GNUNET_DHT_HopSignature::purpose, GNUNET_DHT_PathElement::sig, and GNUNET_DHT_HopSignature::succ.

Referenced by GDS_NEIGHBOURS_handle_reply(), and handle_dht_p2p_put().

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