Merge branch 'master' of git+ssh://gnunet.org/gnunet
[oweals/gnunet.git] / src / include / gnunet_block_lib.h
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2010 GNUnet e.V.
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 3, or (at your
8      option) any later version.
9
10      GNUnet is distributed in the hope that it will be useful, but
11      WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18      Boston, MA 02110-1301, USA.
19 */
20
21 /**
22  * @author Christian Grothoff
23  *
24  * @file
25  * Library for data block manipulation
26  *
27  * @defgroup block  Block library
28  * Library for data block manipulation
29  * @{
30  */
31 #ifndef GNUNET_BLOCK_LIB_H
32 #define GNUNET_BLOCK_LIB_H
33
34 #include "gnunet_util_lib.h"
35 #ifdef __cplusplus
36 extern "C"
37 {
38 #if 0                           /* keep Emacsens' auto-indent happy */
39 }
40 #endif
41 #endif
42
43
44 /**
45  * Blocks in the datastore and the datacache must have a unique type.
46  */
47 enum GNUNET_BLOCK_Type
48 {
49   /**
50    * Any type of block, used as a wildcard when searching.  Should
51    * never be attached to a specific block.
52    */
53   GNUNET_BLOCK_TYPE_ANY = 0,
54
55   /**
56    * Data block (leaf) in the CHK tree.
57    */
58   GNUNET_BLOCK_TYPE_FS_DBLOCK = 1,
59
60   /**
61    * Inner block in the CHK tree.
62    */
63   GNUNET_BLOCK_TYPE_FS_IBLOCK = 2,
64
65   /**
66    * Legacy type, no longer in use.
67    */
68   GNUNET_BLOCK_TYPE_FS_KBLOCK = 3,
69
70   /**
71    * Legacy type, no longer in use.
72    */
73   GNUNET_BLOCK_TYPE_FS_SBLOCK = 4,
74
75   /**
76    * Legacy type, no longer in use.
77    */
78   GNUNET_BLOCK_TYPE_FS_NBLOCK = 5,
79
80   /**
81    * Type of a block representing a block to be encoded on demand from disk.
82    * Should never appear on the network directly.
83    */
84   GNUNET_BLOCK_TYPE_FS_ONDEMAND = 6,
85
86   /**
87    * Type of a block that contains a HELLO for a peer (for
88    * DHT and CADET find-peer operations).
89    */
90   GNUNET_BLOCK_TYPE_DHT_HELLO = 7,
91
92   /**
93    * Block for testing.
94    */
95   GNUNET_BLOCK_TYPE_TEST = 8,
96
97   /**
98    * Type of a block representing any type of search result
99    * (universal).  Implemented in the context of #2564, replaces
100    * SBLOCKS, KBLOCKS and NBLOCKS.
101    */
102   GNUNET_BLOCK_TYPE_FS_UBLOCK = 9,
103
104   /**
105    * Block for storing DNS exit service advertisements.
106    */
107   GNUNET_BLOCK_TYPE_DNS = 10,
108
109   /**
110    * Block for storing record data
111    */
112   GNUNET_BLOCK_TYPE_GNS_NAMERECORD = 11,
113
114   /**
115    * Block type for a revocation message by which a key is revoked.
116    */
117   GNUNET_BLOCK_TYPE_REVOCATION = 12,
118
119   /**
120    * Block to store a cadet regex state
121    */
122   GNUNET_BLOCK_TYPE_REGEX = 22,
123
124   /**
125    * Block to store a cadet regex accepting state
126    */
127   GNUNET_BLOCK_TYPE_REGEX_ACCEPT = 23,
128
129   /**
130    * Block for testing set/consensus.  If first byte of the block
131    * is non-zero, the block is considered invalid.
132    */
133   GNUNET_BLOCK_TYPE_SET_TEST = 24,
134
135   /**
136    * Block type for consensus elements.
137    * Contains either special marker elements or a nested block.
138    */
139   GNUNET_BLOCK_TYPE_CONSENSUS_ELEMENT = 25,
140 };
141
142
143 /**
144  * Flags that can be set to control the evaluation.
145  */
146 enum GNUNET_BLOCK_EvaluationOptions
147 {
148
149   /**
150    * Default behavior.
151    */
152   GNUNET_BLOCK_EO_NONE = 0,
153
154   /**
155    * The block is obtained from the local database, skip cryptographic
156    * checks.
157    */
158   GNUNET_BLOCK_EO_LOCAL_SKIP_CRYPTO = 1
159 };
160
161
162 /**
163  * Possible ways for how a block may relate to a query.
164  */
165 enum GNUNET_BLOCK_EvaluationResult
166 {
167   /**
168    * Valid result, and there may be more.
169    */
170   GNUNET_BLOCK_EVALUATION_OK_MORE = 0,
171
172   /**
173    * Last possible valid result.
174    */
175   GNUNET_BLOCK_EVALUATION_OK_LAST = 1,
176
177   /**
178    * Valid result, but suppressed because it is a duplicate.
179    */
180   GNUNET_BLOCK_EVALUATION_OK_DUPLICATE = 2,
181
182   /**
183    * Block does not match query (invalid result)
184    */
185   GNUNET_BLOCK_EVALUATION_RESULT_INVALID = 3,
186
187   /**
188    * Block does not match xquery (valid result, not relevant for the request)
189    */
190   GNUNET_BLOCK_EVALUATION_RESULT_IRRELEVANT = 4,
191
192   /**
193    * Query is valid, no reply given.
194    */
195   GNUNET_BLOCK_EVALUATION_REQUEST_VALID = 10,
196
197   /**
198    * Query format does not match block type (invalid query).  For
199    * example, xquery not given or xquery_size not appropriate for
200    * type.
201    */
202   GNUNET_BLOCK_EVALUATION_REQUEST_INVALID = 11,
203
204   /**
205    * Specified block type not supported by this plugin.
206    */
207   GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED = 20
208 };
209
210
211 /**
212  * Handle to an initialized block library.
213  */
214 struct GNUNET_BLOCK_Context;
215
216
217 /**
218  * Mingle hash with the mingle_number to produce different bits.
219  *
220  * @param in original hash code
221  * @param mingle_number number for hash permutation
222  * @param hc where to store the result.
223  */
224 void
225 GNUNET_BLOCK_mingle_hash (const struct GNUNET_HashCode *in,
226                           uint32_t mingle_number,
227                           struct GNUNET_HashCode *hc);
228
229
230 /**
231  * Create a block context.  Loads the block plugins.
232  *
233  * @param cfg configuration to use
234  * @return NULL on error
235  */
236 struct GNUNET_BLOCK_Context *
237 GNUNET_BLOCK_context_create (const struct GNUNET_CONFIGURATION_Handle *cfg);
238
239
240 /**
241  * Destroy the block context.
242  *
243  * @param ctx context to destroy
244  */
245 void
246 GNUNET_BLOCK_context_destroy (struct GNUNET_BLOCK_Context *ctx);
247
248
249 /**
250  * Handle for a group of elements that will be evaluated together.
251  * They must all be of the same type.  A block group allows the
252  * plugin to keep some state across individual evaluations.
253  */
254 struct GNUNET_BLOCK_Group;
255
256
257 /**
258  * Create a new block group.
259  *
260  * @param ctx block context in which the block group is created
261  * @param type type of the block for which we are creating the group
262  * @param nonce random value used to seed the group creation
263  * @param raw_data optional serialized prior state of the group, NULL if unavailable/fresh
264  * @param raw_data_size number of bytes in @a raw_data, 0 if unavailable/fresh
265  * @param ... type-specific additional data, can be empty
266  * @return block group handle, NULL if block groups are not supported
267  *         by this @a type of block (this is not an error)
268  */
269 struct GNUNET_BLOCK_Group *
270 GNUNET_BLOCK_group_create (struct GNUNET_BLOCK_Context *ctx,
271                            enum GNUNET_BLOCK_Type type,
272                            uint32_t nonce,
273                            const void *raw_data,
274                            size_t raw_data_size,
275                            ...);
276
277
278 /**
279  * Serialize state of a block group.
280  *
281  * @param bg group to serialize
282  * @param[out] nonce set to the nonce of the @a bg
283  * @param[out] raw_data set to the serialized state
284  * @param[out] raw_data_size set to the number of bytes in @a raw_data
285  * @return #GNUNET_OK on success, #GNUNET_NO if serialization is not
286  *         supported, #GNUNET_SYSERR on error
287  */
288 int
289 GNUNET_BLOCK_group_serialize (struct GNUNET_BLOCK_Group *bg,
290                               uint32_t *nonce,
291                               void **raw_data,
292                               size_t *raw_data_size);
293
294
295 /**
296  * Destroy resources used by a block group.
297  *
298  * @param bg group to destroy, NULL is allowed
299  */
300 void
301 GNUNET_BLOCK_group_destroy (struct GNUNET_BLOCK_Group *bg);
302
303
304 /**
305  * Function called to validate a reply or a request.  For
306  * request evaluation, simply pass "NULL" for the @a reply_block.
307  * Note that it is assumed that the reply has already been
308  * matched to the key (and signatures checked) as it would
309  * be done with the #GNUNET_BLOCK_get_key() function.
310  *
311  * @param ctx block contxt
312  * @param type block type
313  * @param group block group to use for evaluation
314  * @param eo evaluation options to control evaluation
315  * @param query original query (hash)
316  * @param xquery extrended query data (can be NULL, depending on type)
317  * @param xquery_size number of bytes in @a xquery
318  * @param reply_block response to validate
319  * @param reply_block_size number of bytes in @a reply_block
320  * @return characterization of result
321  */
322 enum GNUNET_BLOCK_EvaluationResult
323 GNUNET_BLOCK_evaluate (struct GNUNET_BLOCK_Context *ctx,
324                        enum GNUNET_BLOCK_Type type,
325                        struct GNUNET_BLOCK_Group *group,
326                        enum GNUNET_BLOCK_EvaluationOptions eo,
327                        const struct GNUNET_HashCode *query,
328                        const void *xquery,
329                        size_t xquery_size,
330                        const void *reply_block,
331                        size_t reply_block_size);
332
333
334 /**
335  * Function called to obtain the key for a block.
336  *
337  * @param ctx block context
338  * @param type block type
339  * @param block block to get the key for
340  * @param block_size number of bytes in @a block
341  * @param key set to the key (query) for the given block
342  * @return #GNUNET_YES on success,
343  *         #GNUNET_NO if the block is malformed
344  *         #GNUNET_SYSERR if type not supported
345  *         (or if extracting a key from a block of this type does not work)
346  */
347 int
348 GNUNET_BLOCK_get_key (struct GNUNET_BLOCK_Context *ctx,
349                       enum GNUNET_BLOCK_Type type,
350                       const void *block,
351                       size_t block_size,
352                       struct GNUNET_HashCode *key);
353
354
355 /**
356  * Update block group to filter out the given results.  Note that the
357  * use of a hash for seen results implies that the caller magically
358  * knows how the specific block engine hashes for filtering
359  * duplicates, so this API may not always apply.
360  *
361  * @param bf_mutator mutation value to use
362  * @param seen_results results already seen
363  * @param seen_results_count number of entries in @a seen_results
364  * @return #GNUNET_SYSERR if not supported, #GNUNET_OK on success
365  */
366 int
367 GNUNET_BLOCK_group_set_seen (struct GNUNET_BLOCK_Group *bg,
368                              const struct GNUNET_HashCode *seen_results,
369                              unsigned int seen_results_count);
370
371
372 /**
373  * Try merging two block groups.  Afterwards, @a bg1 should remain
374  * valid and contain the rules from both @a bg1 and @bg2, and
375  * @a bg2 should be destroyed (as part of this call).  The latter
376  * should happen even if merging is not supported.
377  *
378  * @param[in,out] bg1 first group to merge, is updated
379  * @param bg2 second group to merge, is destroyed
380  * @return #GNUNET_OK on success,
381  *         #GNUNET_NO if merge failed due to different nonce
382  *         #GNUNET_SYSERR if merging is not supported
383  */
384 int
385 GNUNET_BLOCK_group_merge (struct GNUNET_BLOCK_Group *bg1,
386                           struct GNUNET_BLOCK_Group *bg2);
387
388
389 #if 0                           /* keep Emacsens' auto-indent happy */
390 {
391 #endif
392 #ifdef __cplusplus
393 }
394 #endif
395
396 /* ifndef GNUNET_BLOCK_LIB_H */
397 #endif
398
399 /** @} */  /* end of group */
400
401 /* end of gnunet_block_lib.h */