glitch in the license text detected by hyazinthe, thank you!
[oweals/gnunet.git] / src / include / gnunet_block_group_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 creating block groups (to be used by block plugins)
21  *
22  * @defgroup block  Block group library
23  * Library for data group management
24  * @{
25  */
26 #ifndef GNUNET_BLOCK_GROUP_LIB_H
27 #define GNUNET_BLOCK_GROUP_LIB_H
28
29 #include "gnunet_util_lib.h"
30 #include "gnunet_block_lib.h"
31
32 #ifdef __cplusplus
33 extern "C"
34 {
35 #if 0                           /* keep Emacsens' auto-indent happy */
36 }
37 #endif
38 #endif
39
40
41 /**
42  * How many bytes should a bloomfilter be if we have already seen
43  * entry_count responses?  Sized so that do not have to
44  * re-size the filter too often (to keep it cheap).
45  *
46  * Since other peers will also add entries but not resize the filter,
47  * we should generally pick a slightly larger size than what the
48  * strict math would suggest.
49  *
50  * @param entry_count expected number of entries in the Bloom filter
51  * @param k number of bits set per entry
52  * @return must be a power of two and smaller or equal to 2^15.
53  */
54 size_t
55 GNUNET_BLOCK_GROUP_compute_bloomfilter_size (unsigned int entry_count,
56                                              unsigned int k);
57
58
59 /**
60  * Create a new block group that filters duplicates using a Bloom filter.
61  *
62  * @param ctx block context in which the block group is created
63  * @param bf_size size of the Bloom filter
64  * @param bf_k K-value for the Bloom filter
65  * @param type block type
66  * @param nonce random value used to seed the group creation
67  * @param raw_data optional serialized prior state of the group, NULL if unavailable/fresh
68  * @param raw_data_size number of bytes in @a raw_data, 0 if unavailable/fresh
69  * @return block group handle, NULL if block groups are not supported
70  *         by this @a type of block (this is not an error)
71  */
72 struct GNUNET_BLOCK_Group *
73 GNUNET_BLOCK_GROUP_bf_create (void *cls,
74                               size_t bf_size,
75                               unsigned int bf_k,
76                               enum GNUNET_BLOCK_Type type,
77                               uint32_t nonce,
78                               const void *raw_data,
79                               size_t raw_data_size);
80
81
82 /**
83  * Test if @a hc is contained in the Bloom filter of @a bg.  If so,
84  * return #GNUNET_YES.  If not, add @a hc to the Bloom filter and
85  * return #GNUNET_NO.
86  *
87  * @param bg block group to use for testing
88  * @param hc hash of element to evaluate
89  * @return #GNUNET_YES if @a hc is (likely) a duplicate
90  *         #GNUNET_NO if @a hc was definitively not in @bg (but now is)
91  */
92 int
93 GNUNET_BLOCK_GROUP_bf_test_and_set (struct GNUNET_BLOCK_Group *bg,
94                                     const struct GNUNET_HashCode *hc);
95
96
97 #if 0                           /* keep Emacsens' auto-indent happy */
98 {
99 #endif
100 #ifdef __cplusplus
101 }
102 #endif
103
104 /* ifndef GNUNET_BLOCK_GROUP_LIB_H */
105 #endif
106
107 /** @} */  /* end of group */
108
109 /* end of gnunet_block_group_lib.h */