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

blocks used for GNS records More...

#include "platform.h"
#include "gnunet_block_group_lib.h"
#include "gnunet_block_plugin.h"
#include "gnunet_namestore_service.h"
#include "gnunet_signatures.h"
Include dependency graph for plugin_block_gns.c:

Go to the source code of this file.

Macros

#define BLOOMFILTER_K   16
 Number of bits we set per entry in the bloomfilter. More...
 
#define GNS_BF_SIZE   8
 How big is the BF we use for GNS blocks? More...
 

Functions

static struct GNUNET_BLOCK_Groupblock_plugin_gns_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_gns_evaluate (void *cls, struct GNUNET_BLOCK_Context *ctx, enum GNUNET_BLOCK_Type type, struct GNUNET_BLOCK_Group *bg, 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_gns_get_key (void *cls, enum GNUNET_BLOCK_Type type, const void *reply_block, size_t reply_block_size, struct GNUNET_HashCode *key)
 Function called to obtain the key for a block. More...
 
void * libgnunet_plugin_block_gns_init (void *cls)
 Entry point for the plugin. More...
 
void * libgnunet_plugin_block_gns_done (void *cls)
 Exit point from the plugin. More...
 

Detailed Description

blocks used for GNS records

Author
Martin Schanzenbach
Christian Grothoff

Definition in file plugin_block_gns.c.

Macro Definition Documentation

◆ BLOOMFILTER_K

#define BLOOMFILTER_K   16

Number of bits we set per entry in the bloomfilter.

Do not change! -from fs

Definition at line 38 of file plugin_block_gns.c.

◆ GNS_BF_SIZE

#define GNS_BF_SIZE   8

How big is the BF we use for GNS blocks?

Definition at line 43 of file plugin_block_gns.c.

Function Documentation

◆ block_plugin_gns_create_group()

static struct GNUNET_BLOCK_Group* block_plugin_gns_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 59 of file plugin_block_gns.c.

65 {
66  unsigned int bf_size;
67  const char *guard;
68 
69  guard = va_arg (va, const char *);
70  if (0 == strcmp (guard,
71  "seen-set-size"))
72  bf_size = GNUNET_BLOCK_GROUP_compute_bloomfilter_size (va_arg (va, unsigned
73  int),
75  else if (0 == strcmp (guard,
76  "filter-size"))
77  bf_size = va_arg (va, unsigned int);
78  else
79  {
80  GNUNET_break (0);
81  bf_size = GNS_BF_SIZE;
82  }
83  GNUNET_break (NULL == va_arg (va, const char *));
84  return GNUNET_BLOCK_GROUP_bf_create (cls,
85  bf_size,
87  type,
88  nonce,
89  raw_data,
90  raw_data_size);
91 }
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?...
Definition: bg_bf.c:250
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
#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.
#define GNS_BF_SIZE
How big is the BF we use for GNS blocks?
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model

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

Referenced by libgnunet_plugin_block_gns_init().

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

◆ block_plugin_gns_evaluate()

static enum GNUNET_BLOCK_EvaluationResult block_plugin_gns_evaluate ( void *  cls,
struct GNUNET_BLOCK_Context ctx,
enum GNUNET_BLOCK_Type  type,
struct GNUNET_BLOCK_Group bg,
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. Note that it is assumed that the reply has already been matched to the key (and signatures checked) as it would be done with the "get_key" function.

Parameters
clsclosure
ctxblock context
typeblock type
bgblock group to use for evaluation
eocontrol flags
queryoriginal query (hash)
xqueryextrended 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 59 of file plugin_block_gns.c.

124 {
125  const struct GNUNET_GNSRECORD_Block *block;
126  struct GNUNET_HashCode h;
127  struct GNUNET_HashCode chash;
128 
131  if (NULL == reply_block)
132  {
133  if (0 != xquery_size)
134  {
135  GNUNET_break_op (0);
137  }
139  }
140 
141  /* this is a reply */
142  if (reply_block_size < sizeof(struct GNUNET_GNSRECORD_Block))
143  {
144  GNUNET_break_op (0);
146  }
147  block = reply_block;
148  if (GNUNET_GNSRECORD_block_get_size (block) > reply_block_size)
149  {
150  GNUNET_break_op (0);
152  }
154  &h);
155  if (0 != GNUNET_memcmp (&h, query))
156  {
157  GNUNET_break_op (0);
159  }
160  if (GNUNET_OK !=
162  {
163  GNUNET_break_op (0);
165  }
166  GNUNET_CRYPTO_hash (reply_block,
167  reply_block_size,
168  &chash);
169  if (GNUNET_YES ==
171  &chash))
174 }
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
@ GNUNET_OK
Definition: gnunet_common.h:95
@ GNUNET_YES
Definition: gnunet_common.h:97
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
@ GNUNET_BLOCK_EVALUATION_RESULT_INVALID
Block does not match query (invalid result)
@ GNUNET_BLOCK_EVALUATION_REQUEST_INVALID
Query format does not match block type (invalid query).
@ GNUNET_BLOCK_EVALUATION_OK_MORE
Valid result, and there may be more.
@ GNUNET_BLOCK_EVALUATION_OK_DUPLICATE
Valid result, but suppressed because it is a duplicate.
@ GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED
Specified block type not supported by this plugin.
@ GNUNET_BLOCK_EVALUATION_REQUEST_VALID
Query is valid, no reply given.
@ GNUNET_BLOCK_TYPE_GNS_NAMERECORD
Block for storing record data.
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_block_verify(const struct GNUNET_GNSRECORD_Block *block)
Check if a signature is valid.
size_t GNUNET_GNSRECORD_block_get_size(const struct GNUNET_GNSRECORD_Block *block)
Returns the length of this block in bytes.
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_query_from_block(const struct GNUNET_GNSRECORD_Block *block, struct GNUNET_HashCode *query)
Builds the query hash from a block.
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
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
A 512-bit hashcode.

Referenced by libgnunet_plugin_block_gns_init().

Here is the caller graph for this function:

◆ block_plugin_gns_get_key()

static int block_plugin_gns_get_key ( void *  cls,
enum GNUNET_BLOCK_Type  type,
const void *  reply_block,
size_t  reply_block_size,
struct GNUNET_HashCode key 
)
static

Function called to obtain the key for a block.

Parameters
clsclosure
typeblock type
reply_blockblock to get the key for
reply_block_sizenumber of bytes in reply_block
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 189 of file plugin_block_gns.c.

194 {
195  const struct GNUNET_GNSRECORD_Block *block;
196 
198  return GNUNET_SYSERR;
199  if (reply_block_size < sizeof(struct GNUNET_GNSRECORD_Block))
200  {
201  GNUNET_break_op (0);
203  }
204  block = reply_block;
206  key);
207  return GNUNET_OK;
208 }
struct GNUNET_HashCode key
The key used in the DHT.
@ GNUNET_SYSERR
Definition: gnunet_common.h:93

References GNUNET_BLOCK_EVALUATION_RESULT_INVALID, GNUNET_BLOCK_TYPE_GNS_NAMERECORD, GNUNET_break_op, GNUNET_GNSRECORD_query_from_block(), GNUNET_OK, GNUNET_SYSERR, key, and type.

Referenced by libgnunet_plugin_block_gns_init().

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

◆ libgnunet_plugin_block_gns_init()

void* libgnunet_plugin_block_gns_init ( void *  cls)

Entry point for the plugin.

Definition at line 215 of file plugin_block_gns.c.

216 {
217  static enum GNUNET_BLOCK_Type types[] = {
219  GNUNET_BLOCK_TYPE_ANY /* end of list */
220  };
221  struct GNUNET_BLOCK_PluginFunctions *api;
222 
227  api->types = types;
228  return api;
229 }
GNUNET_BLOCK_Type
Blocks in the datastore and the datacache must have a unique type.
@ GNUNET_BLOCK_TYPE_ANY
Any type of block, used as a wildcard when searching.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static int block_plugin_gns_get_key(void *cls, enum GNUNET_BLOCK_Type type, const void *reply_block, size_t reply_block_size, struct GNUNET_HashCode *key)
Function called to obtain the key for a block.
static enum GNUNET_BLOCK_EvaluationResult block_plugin_gns_evaluate(void *cls, struct GNUNET_BLOCK_Context *ctx, enum GNUNET_BLOCK_Type type, struct GNUNET_BLOCK_Group *bg, 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.
static struct GNUNET_BLOCK_Group * block_plugin_gns_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.
Each plugin is required to return a pointer to a struct of this type as the return value from its ent...
enum GNUNET_BLOCK_Type * types
0-terminated array of block types supported by this plugin.
GNUNET_BLOCK_GetKeyFunction get_key
Obtain the key for a given block (if possible).
GNUNET_BLOCK_GroupCreateFunction create_group
Create a block group to process a bunch of blocks in a shared context (i.e.
GNUNET_BLOCK_EvaluationFunction evaluate
Main function of a block plugin.

References block_plugin_gns_create_group(), block_plugin_gns_evaluate(), block_plugin_gns_get_key(), GNUNET_BLOCK_PluginFunctions::create_group, GNUNET_BLOCK_PluginFunctions::evaluate, GNUNET_BLOCK_PluginFunctions::get_key, GNUNET_BLOCK_TYPE_ANY, GNUNET_BLOCK_TYPE_GNS_NAMERECORD, GNUNET_new, and GNUNET_BLOCK_PluginFunctions::types.

Here is the call graph for this function:

◆ libgnunet_plugin_block_gns_done()

void* libgnunet_plugin_block_gns_done ( void *  cls)

Exit point from the plugin.

Definition at line 236 of file plugin_block_gns.c.

237 {
238  struct GNUNET_BLOCK_PluginFunctions *api = cls;
239 
240  GNUNET_free (api);
241  return NULL;
242 }
#define GNUNET_free(ptr)
Wrapper around free.
void * cls
Closure for all of the callbacks.

References GNUNET_BLOCK_PluginFunctions::cls, and GNUNET_free.