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