GNUnet  0.11.x
Macros | Functions
plugin_block_dht.c File Reference

block plugin for DHT internals (right now, find-peer requests only); other plugins should be used to store "useful" data in the DHT (see fs block plugin) More...

#include "platform.h"
#include "gnunet_constants.h"
#include "gnunet_hello_lib.h"
#include "gnunet_block_plugin.h"
#include "gnunet_block_group_lib.h"
Include dependency graph for plugin_block_dht.c:

Go to the source code of this file.

Macros

#define DEBUG_DHT   GNUNET_EXTRA_LOGGING
 
#define BLOOMFILTER_K   16
 Number of bits we set per entry in the bloomfilter. More...
 

Functions

static struct GNUNET_BLOCK_Groupblock_plugin_dht_create_group (void *cls, enum GNUNET_BLOCK_Type type, uint32_t nonce, const void *raw_data, size_t raw_data_size, va_list va)
 Create a new block group. More...
 
static enum GNUNET_BLOCK_EvaluationResult block_plugin_dht_evaluate (void *cls, struct GNUNET_BLOCK_Context *ctx, enum GNUNET_BLOCK_Type type, struct GNUNET_BLOCK_Group *group, enum GNUNET_BLOCK_EvaluationOptions eo, const struct GNUNET_HashCode *query, const void *xquery, size_t xquery_size, const void *reply_block, size_t reply_block_size)
 Function called to validate a reply or a request. More...
 
static int block_plugin_dht_get_key (void *cls, enum GNUNET_BLOCK_Type type, const void *block, size_t block_size, struct GNUNET_HashCode *key)
 Function called to obtain the key for a block. More...
 
void * libgnunet_plugin_block_dht_init (void *cls)
 Entry point for the plugin. More...
 
void * libgnunet_plugin_block_dht_done (void *cls)
 Exit point from the plugin. More...
 

Detailed Description

block plugin for DHT internals (right now, find-peer requests only); other plugins should be used to store "useful" data in the DHT (see fs block plugin)

Author
Christian Grothoff

Definition in file plugin_block_dht.c.

Macro Definition Documentation

◆ DEBUG_DHT

#define DEBUG_DHT   GNUNET_EXTRA_LOGGING

Definition at line 34 of file plugin_block_dht.c.

◆ BLOOMFILTER_K

#define BLOOMFILTER_K   16

Number of bits we set per entry in the bloomfilter.

Do not change!

Definition at line 40 of file plugin_block_dht.c.

Referenced by block_plugin_dht_create_group().

Function Documentation

◆ block_plugin_dht_create_group()

static struct GNUNET_BLOCK_Group* block_plugin_dht_create_group ( void *  cls,
enum GNUNET_BLOCK_Type  type,
uint32_t  nonce,
const void *  raw_data,
size_t  raw_data_size,
va_list  va 
)
static

Create a new block group.

Parameters
ctxblock context in which the block group is created
typetype of the block for which we are creating the group
noncerandom value used to seed the group creation
raw_dataoptional serialized prior state of the group, NULL if unavailable/fresh
raw_data_sizenumber of bytes in raw_data, 0 if unavailable/fresh
vavariable arguments specific to type
Returns
block group handle, NULL if block groups are not supported by this type of block (this is not an error)

Definition at line 56 of file plugin_block_dht.c.

References BLOOMFILTER_K, GNUNET_BLOCK_GROUP_bf_create(), GNUNET_BLOCK_GROUP_compute_bloomfilter_size(), and GNUNET_break.

Referenced by libgnunet_plugin_block_dht_init().

62 {
63  unsigned int bf_size;
64  const char *guard;
65 
66  guard = va_arg (va, const char *);
67  if (0 == strcmp (guard,
68  "seen-set-size"))
69  bf_size = GNUNET_BLOCK_GROUP_compute_bloomfilter_size (va_arg (va,
70  unsigned int),
72  else if (0 == strcmp (guard,
73  "filter-size"))
74  bf_size = va_arg (va, unsigned int);
75  else
76  {
77  GNUNET_break (0);
78  bf_size = 8;
79  }
80  GNUNET_break (NULL == va_arg (va, const char *));
81  return GNUNET_BLOCK_GROUP_bf_create (cls,
82  bf_size,
84  type,
85  nonce,
86  raw_data,
87  raw_data_size);
88 }
struct GNUNET_BLOCK_Group * GNUNET_BLOCK_GROUP_bf_create(void *cls, size_t bf_size, unsigned int bf_k, enum GNUNET_BLOCK_Type type, uint32_t nonce, const void *raw_data, size_t raw_data_size)
Create a new block group that filters duplicates using a Bloom filter.
Definition: bg_bf.c:174
size_t GNUNET_BLOCK_GROUP_compute_bloomfilter_size(unsigned int entry_count, unsigned int k)
How many bytes should a bloomfilter be if we have already seen entry_count responses? Sized so that do not have to re-size the filter too often (to keep it cheap).
Definition: bg_bf.c:250
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define BLOOMFILTER_K
Number of bits we set per entry in the bloomfilter.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
Here is the call graph for this function:
Here is the caller graph for this function:

◆ block_plugin_dht_evaluate()

static enum GNUNET_BLOCK_EvaluationResult block_plugin_dht_evaluate ( void *  cls,
struct GNUNET_BLOCK_Context ctx,
enum GNUNET_BLOCK_Type  type,
struct GNUNET_BLOCK_Group group,
enum GNUNET_BLOCK_EvaluationOptions  eo,
const struct GNUNET_HashCode query,
const void *  xquery,
size_t  xquery_size,
const void *  reply_block,
size_t  reply_block_size 
)
static

Function called to validate a reply or a request.

For request evaluation, simply pass "NULL" for the reply_block.

Parameters
clsclosure
ctxcontext
typeblock type
groupblock group to check against
eocontrol flags
queryoriginal query (hash)
xqueryextended query data (can be NULL, depending on type)
xquery_sizenumber of bytes in xquery
reply_blockresponse to validate
reply_block_sizenumber of bytes in reply_block
Returns
characterization of result

Definition at line 108 of file plugin_block_dht.c.

References GNUNET_BLOCK_EVALUATION_OK_DUPLICATE, GNUNET_BLOCK_EVALUATION_OK_MORE, GNUNET_BLOCK_EVALUATION_REQUEST_INVALID, GNUNET_BLOCK_EVALUATION_REQUEST_VALID, GNUNET_BLOCK_EVALUATION_RESULT_INVALID, GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED, GNUNET_BLOCK_GROUP_bf_test_and_set(), GNUNET_BLOCK_TYPE_DHT_HELLO, GNUNET_break_op, GNUNET_CRYPTO_hash(), GNUNET_HELLO_get_id(), GNUNET_OK, GNUNET_YES, msg, and GNUNET_MessageHeader::size.

Referenced by libgnunet_plugin_block_dht_init().

118 {
119  const struct GNUNET_HELLO_Message *hello;
120  struct GNUNET_PeerIdentity pid;
121  const struct GNUNET_MessageHeader *msg;
122  struct GNUNET_HashCode phash;
123 
126  if (0 != xquery_size)
127  {
128  GNUNET_break_op (0);
130  }
131  if (NULL == reply_block)
133  if (reply_block_size < sizeof(struct GNUNET_MessageHeader))
134  {
135  GNUNET_break_op (0);
137  }
138  msg = reply_block;
139  if (reply_block_size != ntohs (msg->size))
140  {
141  GNUNET_break_op (0);
143  }
144  hello = reply_block;
145  if (GNUNET_OK != GNUNET_HELLO_get_id (hello, &pid))
146  {
147  GNUNET_break_op (0);
149  }
151  sizeof(pid),
152  &phash);
153  if (GNUNET_YES ==
155  &phash))
158 }
Block does not match query (invalid result)
int GNUNET_HELLO_get_id(const struct GNUNET_HELLO_Message *hello, struct GNUNET_PeerIdentity *peer)
Get the peer identity from a HELLO message.
Definition: hello.c:671
A HELLO message is used to exchange information about transports with other peers.
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
Valid result, but suppressed because it is a duplicate.
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:48
Type of a block that contains a HELLO for a peer (for DHT and CADET find-peer operations).
A 512-bit hashcode.
Valid result, and there may be more.
Specified block type not supported by this plugin.
The identity of the host (wraps the signing key of the peer).
Query format does not match block type (invalid query).
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
Header for all communications.
#define GNUNET_YES
Definition: gnunet_common.h:77
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
int GNUNET_BLOCK_GROUP_bf_test_and_set(struct GNUNET_BLOCK_Group *bg, const struct GNUNET_HashCode *hc)
Test if hc is contained in the Bloom filter of bg.
Definition: bg_bf.c:214
Query is valid, no reply given.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ block_plugin_dht_get_key()

static int block_plugin_dht_get_key ( void *  cls,
enum GNUNET_BLOCK_Type  type,
const void *  block,
size_t  block_size,
struct GNUNET_HashCode key 
)
static

Function called to obtain the key for a block.

Parameters
clsclosure
typeblock type
blockblock to get the key for
block_sizenumber of bytes block
[out]keyset to the key (query) for the given block
Returns
GNUNET_OK on success, GNUNET_SYSERR if type not supported (or if extracting a key from a block of this type does not work)

Definition at line 173 of file plugin_block_dht.c.

References _, GNUNET_BLOCK_TYPE_DHT_HELLO, GNUNET_ERROR_TYPE_ERROR, GNUNET_HELLO_get_id(), GNUNET_log_from, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, msg, pid, and GNUNET_MessageHeader::size.

Referenced by libgnunet_plugin_block_dht_init().

178 {
179  const struct GNUNET_MessageHeader *msg;
180  const struct GNUNET_HELLO_Message *hello;
181  struct GNUNET_PeerIdentity *pid;
182 
184  return GNUNET_SYSERR;
185  if (block_size < sizeof(struct GNUNET_MessageHeader))
186  {
188  "block-dht",
189  _ ("Block not of type %u\n"),
191  return GNUNET_NO;
192  }
193  msg = block;
194  if (block_size != ntohs (msg->size))
195  {
197  "block-dht",
198  _ ("Size mismatch for block\n"),
200  return GNUNET_NO;
201  }
202  hello = block;
203  memset (key, 0, sizeof(*key));
204  pid = (struct GNUNET_PeerIdentity *) key;
205  if (GNUNET_OK != GNUNET_HELLO_get_id (hello, pid))
206  {
208  "block-dht",
209  _ ("Block of type %u is malformed\n"),
211  return GNUNET_NO;
212  }
213  return GNUNET_OK;
214 }
int GNUNET_HELLO_get_id(const struct GNUNET_HELLO_Message *hello, struct GNUNET_PeerIdentity *peer)
Get the peer identity from a HELLO message.
Definition: hello.c:671
A HELLO message is used to exchange information about transports with other peers.
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
Type of a block that contains a HELLO for a peer (for DHT and CADET find-peer operations).
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
The identity of the host (wraps the signing key of the peer).
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
Header for all communications.
#define GNUNET_log_from(kind, comp,...)
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ libgnunet_plugin_block_dht_init()

void* libgnunet_plugin_block_dht_init ( void *  cls)

Entry point for the plugin.

Definition at line 221 of file plugin_block_dht.c.

References block_plugin_dht_create_group(), block_plugin_dht_evaluate(), block_plugin_dht_get_key(), GNUNET_BLOCK_PluginFunctions::create_group, GNUNET_BLOCK_PluginFunctions::evaluate, GNUNET_BLOCK_PluginFunctions::get_key, GNUNET_BLOCK_TYPE_ANY, GNUNET_BLOCK_TYPE_DHT_HELLO, GNUNET_new, and GNUNET_BLOCK_PluginFunctions::types.

222 {
223  static enum GNUNET_BLOCK_Type types[] = {
225  GNUNET_BLOCK_TYPE_ANY /* end of list */
226  };
227  struct GNUNET_BLOCK_PluginFunctions *api;
228 
233  api->types = types;
234  return api;
235 }
enum GNUNET_BLOCK_Type * types
0-terminated array of block types supported by this plugin.
Any type of block, used as a wildcard when searching.
GNUNET_BLOCK_EvaluationFunction evaluate
Main function of a block plugin.
GNUNET_BLOCK_Type
Blocks in the datastore and the datacache must have a unique type.
Each plugin is required to return a pointer to a struct of this type as the return value from its ent...
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static struct GNUNET_BLOCK_Group * block_plugin_dht_create_group(void *cls, enum GNUNET_BLOCK_Type type, uint32_t nonce, const void *raw_data, size_t raw_data_size, va_list va)
Create a new block group.
Type of a block that contains a HELLO for a peer (for DHT and CADET find-peer operations).
GNUNET_BLOCK_GroupCreateFunction create_group
Create a block group to process a bunch of blocks in a shared context (i.e.
GNUNET_BLOCK_GetKeyFunction get_key
Obtain the key for a given block (if possible).
static int block_plugin_dht_get_key(void *cls, enum GNUNET_BLOCK_Type type, const void *block, size_t block_size, struct GNUNET_HashCode *key)
Function called to obtain the key for a block.
static enum GNUNET_BLOCK_EvaluationResult block_plugin_dht_evaluate(void *cls, struct GNUNET_BLOCK_Context *ctx, enum GNUNET_BLOCK_Type type, struct GNUNET_BLOCK_Group *group, enum GNUNET_BLOCK_EvaluationOptions eo, const struct GNUNET_HashCode *query, const void *xquery, size_t xquery_size, const void *reply_block, size_t reply_block_size)
Function called to validate a reply or a request.
Here is the call graph for this function:

◆ libgnunet_plugin_block_dht_done()

void* libgnunet_plugin_block_dht_done ( void *  cls)

Exit point from the plugin.

Definition at line 242 of file plugin_block_dht.c.

References GNUNET_BLOCK_PluginFunctions::cls, and GNUNET_free.

243 {
244  struct GNUNET_BLOCK_PluginFunctions *api = cls;
245 
246  GNUNET_free (api);
247  return NULL;
248 }
Each plugin is required to return a pointer to a struct of this type as the return value from its ent...
void * cls
Closure for all of the callbacks.
#define GNUNET_free(ptr)
Wrapper around free.