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