X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Finclude%2Fgnunet_set_service.h;h=ac54153e16b8364c7701ab9d2edb450e8b37257b;hb=6e626937fd5133188d2bd06f280a1b889219eef2;hp=75dc6049e54d8fdea4093d031f666842875bd9de;hpb=219e64fe613c47eab4c143791128c2b453be3bf8;p=oweals%2Fgnunet.git diff --git a/src/include/gnunet_set_service.h b/src/include/gnunet_set_service.h index 75dc6049e..ac54153e1 100644 --- a/src/include/gnunet_set_service.h +++ b/src/include/gnunet_set_service.h @@ -1,21 +1,21 @@ /* This file is part of GNUnet - Copyright (C) 2013, 2014 Christian Grothoff (and other contributing authors) + Copyright (C) 2013, 2014 GNUnet e.V. - GNUnet is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 3, or (at your - option) any later version. + GNUnet is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, + or (at your option) any later version. GNUnet is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . - You should have received a copy of the GNU General Public License - along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. + SPDX-License-Identifier: AGPL3.0-or-later */ /** @@ -27,6 +27,9 @@ * * @defgroup set Set service * Two-peer set operations + * + * @see [Documentation](https://gnunet.org/set-subsystem) + * * @{ */ @@ -123,7 +126,7 @@ enum GNUNET_SET_Status /** * Element should be added to the result set - * of the remove peer, i.e. the remote peer is + * of the remote peer, i.e. the remote peer is * missing an element. * * Only applies to #GNUNET_SET_RESULT_SYMMETRIC @@ -150,6 +153,7 @@ enum GNUNET_SET_Status }; + /** * The way results are given to the client. */ @@ -178,7 +182,7 @@ enum GNUNET_SET_ResultMode GNUNET_SET_RESULT_REMOVED, /** - * Client gets only elements that have been removed from the set. + * Client gets only elements that have been added to the set. * * Only supported for set union. */ @@ -208,12 +212,65 @@ struct GNUNET_SET_Element }; +/** + * Possible options to pass to a set operation. + * + * Used as tag for struct #GNUNET_SET_Option. + */ +enum GNUNET_SET_OptionType +{ + /** + * List terminator. + */ + GNUNET_SET_OPTION_END=0, + /** + * Fail set operations when the other peer shows weird behavior + * that might by a Byzantine fault. + * + * For set union, 'v.num' is a lower bound on elements + * that the other peer must have in common with us. + */ + GNUNET_SET_OPTION_BYZANTINE=1, + /** + * Do not use the optimized set operation, but send full sets. + * Might trigger Byzantine fault detection. + */ + GNUNET_SET_OPTION_FORCE_FULL=2, + /** + * Only use optimized set operations, even though for this + * particular set operation they might be much slower. + * Might trigger Byzantine fault detection. + */ + GNUNET_SET_OPTION_FORCE_DELTA=4, +}; + + +/** + * Option for set operations. + */ +struct GNUNET_SET_Option +{ + /** + * Type of the option. + */ + enum GNUNET_SET_OptionType type; + + /** + * Value for the option, only used with some options. + */ + union { + uint64_t num; + } v; +}; + + /** * Continuation used for some of the set operations * * @param cls closure */ -typedef void (*GNUNET_SET_Continuation) (void *cls); +typedef void +(*GNUNET_SET_Continuation) (void *cls); /** @@ -222,11 +279,14 @@ typedef void (*GNUNET_SET_Continuation) (void *cls); * * @param cls closure * @param element a result element, only valid if status is #GNUNET_SET_STATUS_OK + * @param current_size current set size * @param status see `enum GNUNET_SET_Status` */ -typedef void (*GNUNET_SET_ResultIterator) (void *cls, - const struct GNUNET_SET_Element *element, - enum GNUNET_SET_Status status); +typedef void +(*GNUNET_SET_ResultIterator) (void *cls, + const struct GNUNET_SET_Element *element, + uint64_t current_size, + enum GNUNET_SET_Status status); /** * Iterator for set elements. @@ -236,8 +296,9 @@ typedef void (*GNUNET_SET_ResultIterator) (void *cls, * iterated over * @return #GNUNET_YES to continue iterating, #GNUNET_NO to stop. */ -typedef int (*GNUNET_SET_ElementIterator) (void *cls, - const struct GNUNET_SET_Element *element); +typedef int +(*GNUNET_SET_ElementIterator) (void *cls, + const struct GNUNET_SET_Element *element); /** @@ -361,6 +422,7 @@ GNUNET_SET_prepare (const struct GNUNET_PeerIdentity *other_peer, const struct GNUNET_HashCode *app_id, const struct GNUNET_MessageHeader *context_msg, enum GNUNET_SET_ResultMode result_mode, + struct GNUNET_SET_Option options[], GNUNET_SET_ResultIterator result_cb, void *result_cls); @@ -390,6 +452,8 @@ GNUNET_SET_listen (const struct GNUNET_CONFIGURATION_Handle *cfg, /** * Cancel the given listen operation. After calling cancel, the * listen callback for this listen handle will not be called again. + * Note that cancelling a listen operation will automatically reject + * all operations that have not yet been accepted. * * @param lh handle for the listen operation */ @@ -414,6 +478,7 @@ GNUNET_SET_listen_cancel (struct GNUNET_SET_ListenHandle *lh); struct GNUNET_SET_OperationHandle * GNUNET_SET_accept (struct GNUNET_SET_Request *request, enum GNUNET_SET_ResultMode result_mode, + struct GNUNET_SET_Option options[], GNUNET_SET_ResultIterator result_cb, void *result_cls); @@ -465,6 +530,7 @@ GNUNET_SET_iterate (struct GNUNET_SET_Handle *set, GNUNET_SET_ElementIterator iter, void *iter_cls); + /** * Stop iteration over all elements in the given set. Can only * be called before the iteration has "naturally" completed its @@ -475,6 +541,7 @@ GNUNET_SET_iterate (struct GNUNET_SET_Handle *set, void GNUNET_SET_iterate_cancel (struct GNUNET_SET_Handle *set); + /** * Create a copy of an element. The copy * must be GNUNET_free-d by the caller. @@ -485,6 +552,7 @@ GNUNET_SET_iterate_cancel (struct GNUNET_SET_Handle *set); struct GNUNET_SET_Element * GNUNET_SET_element_dup (const struct GNUNET_SET_Element *element); + /** * Hash a set element. * @@ -493,7 +561,8 @@ GNUNET_SET_element_dup (const struct GNUNET_SET_Element *element); * should be stored */ void -GNUNET_SET_element_hash (const struct GNUNET_SET_Element *element, struct GNUNET_HashCode *ret_hash); +GNUNET_SET_element_hash (const struct GNUNET_SET_Element *element, + struct GNUNET_HashCode *ret_hash); #if 0 /* keep Emacsens' auto-indent happy */