gnunet-android

GNUnet for Android
Log | Files | Refs | README

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 */