X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fset%2Fset.h;h=258e2bff9de2c69abf40c03fddab46aeef18743e;hb=2d92ec0f27dbefef916e94f5d272a2ff72091c54;hp=ec83904484f5c93bf94c005e7d1741393b6138f6;hpb=a9e630d6cbc7f777f157a034b9ebf0c26c93fa68;p=oweals%2Fgnunet.git diff --git a/src/set/set.h b/src/set/set.h index ec8390448..258e2bff9 100644 --- a/src/set/set.h +++ b/src/set/set.h @@ -1,10 +1,10 @@ /* This file is part of GNUnet. - (C) 2012, 2013 Christian Grothoff (and other contributing authors) + Copyright (C) 2012-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 2, or (at your + by the Free Software Foundation; either version 3, or (at your option) any later version. GNUnet is distributed in the hope that it will be useful, but @@ -14,50 +14,57 @@ 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., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ - /** - * @author Florian Dold * @file set/set.h * @brief messages used for the set api + * @author Florian Dold + * @author Christian Grothoff */ #ifndef SET_H #define SET_H #include "platform.h" #include "gnunet_common.h" - -#define GNUNET_SET_ACK_WINDOW 10 - +#include "gnunet_set_service.h" GNUNET_NETWORK_STRUCT_BEGIN +/** + * Message sent by the client to the service to ask starting + * a new set to perform operations with. Includes the desired + * set operation type. + */ struct GNUNET_SET_CreateMessage { /** - * Type: GNUNET_MESSAGE_TYPE_SET_CREATE + * Type: #GNUNET_MESSAGE_TYPE_SET_CREATE */ struct GNUNET_MessageHeader header; /** - * Operation type, values of enum GNUNET_SET_OperationType + * Operation type, values of `enum GNUNET_SET_OperationType` */ - // FIXME: use 32_t for 'enum'. - uint16_t operation GNUNET_PACKED; + uint32_t operation GNUNET_PACKED; }; +/** + * Message sent by the client to the service to start listening for + * incoming requests to perform a certain type of set operation for a + * certain type of application. + */ struct GNUNET_SET_ListenMessage { /** - * Type: GNUNET_MESSAGE_TYPE_SET_LISTEN + * Type: #GNUNET_MESSAGE_TYPE_SET_LISTEN */ struct GNUNET_MessageHeader header; /** - * Operation type, values of enum GNUNET_SET_OperationType + * Operation type, values of `enum GNUNET_SET_OperationType` */ uint32_t operation GNUNET_PACKED; @@ -69,41 +76,87 @@ struct GNUNET_SET_ListenMessage }; -struct GNUNET_SET_AcceptRejectMessage +/** + * Message sent by a listening client to the service to accept + * performing the operation with the other peer. + */ +struct GNUNET_SET_AcceptMessage { /** - * Type: GNUNET_MESSAGE_TYPE_SET_ACCEPT or - * GNUNET_MESSAGE_TYPE_SET_REJECT + * Type: #GNUNET_MESSAGE_TYPE_SET_ACCEPT */ struct GNUNET_MessageHeader header; /** - * ID of the incoming request we want to accept / reject. + * ID of the incoming request we want to accept. */ uint32_t accept_reject_id GNUNET_PACKED; /** - * Request ID to identify responses, - * must be 0 if we don't accept the request. + * Request ID to identify responses. */ uint32_t request_id GNUNET_PACKED; + + /** + * How should results be sent to us? + * See `enum GNUNET_SET_ResultMode`. + */ + uint32_t result_mode GNUNET_PACKED; + + /** + * Always use delta operation instead of sending full sets, + * even it it's less efficient. + */ + uint8_t force_delta; + + /** + * Always send full sets, even if delta operations would + * be more efficient. + */ + uint8_t force_full; + + /** + * #GNUNET_YES to fail operations where Byzantine faults + * are suspected + */ + uint8_t byzantine; + + /** + * Lower bound for the set size, used only when + * byzantine mode is enabled. + */ + uint8_t byzantine_lower_bound; }; /** - * A request for an operation with another client. + * Message sent by a listening client to the service to reject + * performing the operation with the other peer. */ -struct GNUNET_SET_RequestMessage +struct GNUNET_SET_RejectMessage { /** - * Type: GNUNET_MESSAGE_TYPE_SET_Request. + * Type: #GNUNET_MESSAGE_TYPE_SET_REJECT */ struct GNUNET_MessageHeader header; /** - * Identity of the requesting peer. + * ID of the incoming request we want to reject. */ - struct GNUNET_PeerIdentity peer_id; + uint32_t accept_reject_id GNUNET_PACKED; + +}; + + +/** + * A request for an operation with another client. + */ +struct GNUNET_SET_RequestMessage +{ + /** + * Type: #GNUNET_MESSAGE_TYPE_SET_REQUEST. + */ + struct GNUNET_MessageHeader header; /** * ID of the to identify the request when accepting or @@ -111,21 +164,33 @@ struct GNUNET_SET_RequestMessage */ uint32_t accept_id GNUNET_PACKED; - /* rest: nested context message */ + /** + * Identity of the requesting peer. + */ + struct GNUNET_PeerIdentity peer_id; + + /* rest: context message, that is, application-specific + message to convince listener to pick up */ }; +/** + * Message sent by client to service to initiate a set operation as a + * client (not as listener). A set (which determines the operation + * type) must already exist in association with this client. + */ struct GNUNET_SET_EvaluateMessage { /** - * Type: GNUNET_MESSAGE_TYPE_SET_EVALUATE + * Type: #GNUNET_MESSAGE_TYPE_SET_EVALUATE */ struct GNUNET_MessageHeader header; /** - * id of our evaluate, chosen by the client + * How should results be sent to us? + * See `enum GNUNET_SET_ResultMode`. */ - uint32_t request_id GNUNET_PACKED; + uint32_t result_mode GNUNET_PACKED; /** * Peer to evaluate the operation with @@ -138,39 +203,71 @@ struct GNUNET_SET_EvaluateMessage struct GNUNET_HashCode app_id; /** - * Salt to use for the operation + * Id of our set to evaluate, chosen implicitly by the client when it + * calls #GNUNET_SET_commit(). */ - uint16_t salt GNUNET_PACKED; + uint32_t request_id GNUNET_PACKED; /** - * Padding + * Always use delta operation instead of sending full sets, + * even it it's less efficient. */ - uint16_t reserved GNUNET_PACKED; + uint8_t force_delta; + + /** + * Always send full sets, even if delta operations would + * be more efficient. + */ + uint8_t force_full; + + /** + * #GNUNET_YES to fail operations where Byzantine faults + * are suspected + */ + uint8_t byzantine; - /* rest: inner message */ + /** + * Lower bound for the set size, used only when + * byzantine mode is enabled. + */ + uint8_t byzantine_lower_bound; + + /* rest: context message, that is, application-specific + message to convince listener to pick up */ }; +/** + * Message sent by the service to the client to indicate an + * element that is removed (set intersection) or added + * (set union) or part of the final result, depending on + * options specified for the operation. + */ struct GNUNET_SET_ResultMessage { /** - * Type: GNUNET_MESSAGE_TYPE_SET_RESULT + * Type: #GNUNET_MESSAGE_TYPE_SET_RESULT */ struct GNUNET_MessageHeader header; + /** + * Current set size. + */ + uint64_t current_size; + /** * id the result belongs to */ uint32_t request_id GNUNET_PACKED; /** - * Was the evaluation successful? + * Was the evaluation successful? Contains + * an `enum GNUNET_SET_Status` in NBO. */ uint16_t result_status GNUNET_PACKED; /** - * Type of the element attachted to the message, - * if any. + * Type of the element attachted to the message, if any. */ uint16_t element_type GNUNET_PACKED; @@ -178,16 +275,26 @@ struct GNUNET_SET_ResultMessage }; +/** + * Message sent by client to the service to add or remove + * an element to/from the set. + */ struct GNUNET_SET_ElementMessage { /** - * Type: GNUNET_MESSAGE_TYPE_SET_ADD or - * GNUNET_MESSAGE_TYPE_SET_REMOVE + * Type: #GNUNET_MESSAGE_TYPE_SET_ADD or + * #GNUNET_MESSAGE_TYPE_SET_REMOVE */ struct GNUNET_MessageHeader header; + /** + * Type of the element to add or remove. + */ uint16_t element_type GNUNET_PACKED; + /** + * For alignment, always zero. + */ uint16_t reserved GNUNET_PACKED; /* rest: the actual element */ @@ -201,7 +308,7 @@ struct GNUNET_SET_ElementMessage struct GNUNET_SET_CancelMessage { /** - * Type: GNUNET_MESSAGE_TYPE_SET_CANCEL + * Type: #GNUNET_MESSAGE_TYPE_SET_CANCEL */ struct GNUNET_MessageHeader header; @@ -211,13 +318,24 @@ struct GNUNET_SET_CancelMessage uint32_t request_id GNUNET_PACKED; }; + +/** + * Set element transmitted by service to client in response to a set + * iteration request. + */ struct GNUNET_SET_IterResponseMessage { /** - * Type: GNUNET_MESSAGE_TYPE_SET_ITER_RESPONSE + * Type: #GNUNET_MESSAGE_TYPE_SET_ITER_ELEMENT */ struct GNUNET_MessageHeader header; + /** + * To which set iteration does this reponse belong to? First + * iteration (per client) has counter zero. Wraps around. + */ + uint16_t iteration_id GNUNET_PACKED; + /** * Type of the element attachted to the message, * if any. @@ -227,6 +345,58 @@ struct GNUNET_SET_IterResponseMessage /* rest: element */ }; + +/** + * Client acknowledges receiving element in iteration. + */ +struct GNUNET_SET_IterAckMessage +{ + /** + * Type: #GNUNET_MESSAGE_TYPE_SET_ITER_ACK + */ + struct GNUNET_MessageHeader header; + + /** + * Non-zero if the service should continue sending elements. + */ + uint32_t send_more; +}; + + +/** + * Server responds to a lazy copy request. + */ +struct GNUNET_SET_CopyLazyResponseMessage +{ + /** + * Type: #GNUNET_MESSAGE_TYPE_SET_COPY_LAZY_RESPONSE + */ + struct GNUNET_MessageHeader header; + + /** + * Temporary name for the copied set. + */ + uint32_t cookie; +}; + + +/** + * Client connects to a lazily copied set. + */ +struct GNUNET_SET_CopyLazyConnectMessage +{ + /** + * Type: #GNUNET_MESSAGE_TYPE_SET_COPY_LAZY_CONNECT + */ + struct GNUNET_MessageHeader header; + + /** + * Temporary name for the copied set. + */ + uint32_t cookie; +}; + + GNUNET_NETWORK_STRUCT_END #endif