/* * This file is part of GNUnet * Copyright (C) 2013 GNUnet e.V. * * 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 * 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 . SPDX-License-Identifier: AGPL3.0-or-later */ /** * @file psycstore/psycstore.h * @brief Common type definitions for the PSYCstore service and API. * @author Gabor X Toth */ #ifndef GNUNET_PSYCSTORE_H #define GNUNET_PSYCSTORE_H #include GNUNET_NETWORK_STRUCT_BEGIN /** * Answer from service to client about last operation. */ struct OperationResult { /** * Type: GNUNET_MESSAGE_TYPE_PSYCSTORE_RESULT_CODE */ struct GNUNET_MessageHeader header; uint32_t reserved GNUNET_PACKED; /** * Operation ID. */ uint64_t op_id GNUNET_PACKED; /**lowed by * Status code for the operation. */ uint64_t result_code GNUNET_PACKED; /* followed by 0-terminated error message (on error) */ }; /** * Answer from service to client about master counters. * * @see GNUNET_PSYCSTORE_counters_get() */ struct CountersResult { /** * Type: GNUNET_MESSAGE_TYPE_PSYCSTORE_RESULT_COUNTERS */ struct GNUNET_MessageHeader header; /** * Status code for the operation: * #GNUNET_OK: success, counter values are returned. * #GNUNET_NO: no message has been sent to the channel yet. * #GNUNET_SYSERR: an error occurred. */ uint32_t result_code GNUNET_PACKED; /** * Operation ID. */ uint64_t op_id GNUNET_PACKED; uint64_t max_fragment_id GNUNET_PACKED; uint64_t max_message_id GNUNET_PACKED; uint64_t max_group_generation GNUNET_PACKED; uint64_t max_state_message_id GNUNET_PACKED; }; /** * Answer from service to client containing a message fragment. */ struct FragmentResult { /** * Type: GNUNET_MESSAGE_TYPE_PSYCSTORE_RESULT_CODE */ struct GNUNET_MessageHeader header; uint32_t psycstore_flags GNUNET_PACKED; /** * Operation ID. */ uint64_t op_id GNUNET_PACKED; /* Followed by GNUNET_MULTICAST_MessageHeader */ }; /** * Answer from service to client containing a state variable. */ struct StateResult { /** * Type: GNUNET_MESSAGE_TYPE_PSYCSTORE_RESULT_CODE */ struct GNUNET_MessageHeader header; uint16_t name_size GNUNET_PACKED; uint16_t reserved GNUNET_PACKED; /** * Operation ID. */ uint64_t op_id GNUNET_PACKED; /* Followed by name and value */ }; /** * Generic operation request. */ struct OperationRequest { struct GNUNET_MessageHeader header; uint32_t reserved GNUNET_PACKED; /** * Operation ID. */ uint64_t op_id GNUNET_PACKED; struct GNUNET_CRYPTO_EddsaPublicKey channel_key; }; /** * @see GNUNET_PSYCSTORE_membership_store() */ struct MembershipStoreRequest { /** * Type: GNUNET_MESSAGE_TYPE_PSYCSTORE_MEMBERSHIP_STORE */ struct GNUNET_MessageHeader header; uint32_t reserved GNUNET_PACKED; /** * Operation ID. */ uint64_t op_id GNUNET_PACKED; /** * Channel's public key. */ struct GNUNET_CRYPTO_EddsaPublicKey channel_key; /** * Slave's public key. */ struct GNUNET_CRYPTO_EcdsaPublicKey slave_key; uint64_t announced_at GNUNET_PACKED; uint64_t effective_since GNUNET_PACKED; uint64_t group_generation GNUNET_PACKED; uint8_t did_join; }; /** * @see GNUNET_PSYCSTORE_membership_test() */ struct MembershipTestRequest { /** * Type: GNUNET_MESSAGE_TYPE_PSYCSTORE_MEMBERSHIP_TEST */ struct GNUNET_MessageHeader header; uint32_t reserved GNUNET_PACKED; /** * Operation ID. */ uint64_t op_id GNUNET_PACKED; /** * Channel's public key. */ struct GNUNET_CRYPTO_EddsaPublicKey channel_key; /** * Slave's public key. */ struct GNUNET_CRYPTO_EcdsaPublicKey slave_key; uint64_t message_id GNUNET_PACKED; uint64_t group_generation GNUNET_PACKED; }; /** * @see GNUNET_PSYCSTORE_fragment_store() */ struct FragmentStoreRequest { /** * Type: GNUNET_MESSAGE_TYPE_PSYCSTORE_FRAGMENT_STORE */ struct GNUNET_MessageHeader header; /** * enum GNUNET_PSYCSTORE_MessageFlags */ uint32_t psycstore_flags GNUNET_PACKED; /** * Channel's public key. */ struct GNUNET_CRYPTO_EddsaPublicKey channel_key; /** * Operation ID. */ uint64_t op_id; /* Followed by fragment */ }; /** * @see GNUNET_PSYCSTORE_fragment_get() */ struct FragmentGetRequest { /** * Type: GNUNET_MESSAGE_TYPE_PSYCSTORE_FRAGMENT_GET */ struct GNUNET_MessageHeader header; uint32_t reserved GNUNET_PACKED; /** * Operation ID. */ uint64_t op_id GNUNET_PACKED; /** * Channel's public key. */ struct GNUNET_CRYPTO_EddsaPublicKey channel_key; /** * Slave's public key. */ struct GNUNET_CRYPTO_EcdsaPublicKey slave_key; /** * First fragment ID to request. */ uint64_t first_fragment_id GNUNET_PACKED; /** * Last fragment ID to request. */ uint64_t last_fragment_id GNUNET_PACKED; /** * Maximum number of fragments to retrieve. */ uint64_t fragment_limit GNUNET_PACKED; /** * Do membership test with @a slave_key before returning fragment? * #GNUNET_YES or #GNUNET_NO */ uint8_t do_membership_test; }; /** * @see GNUNET_PSYCSTORE_message_get() */ struct MessageGetRequest { /** * Type: GNUNET_MESSAGE_TYPE_PSYCSTORE_MESSAGE_GET */ struct GNUNET_MessageHeader header; uint32_t reserved GNUNET_PACKED; /** * Operation ID. */ uint64_t op_id GNUNET_PACKED; /** * Channel's public key. */ struct GNUNET_CRYPTO_EddsaPublicKey channel_key; /** * Slave's public key. */ struct GNUNET_CRYPTO_EcdsaPublicKey slave_key; /** * First message ID to request. */ uint64_t first_message_id GNUNET_PACKED; /** * Last message ID to request. */ uint64_t last_message_id GNUNET_PACKED; /** * Maximum number of messages to retrieve. */ uint64_t message_limit GNUNET_PACKED; /** * Maximum number of fragments to retrieve. */ uint64_t fragment_limit GNUNET_PACKED; /** * Do membership test with @a slave_key before returning fragment? * #GNUNET_YES or #GNUNET_NO */ uint8_t do_membership_test; /* Followed by method_prefix */ }; /** * @see GNUNET_PSYCSTORE_message_get_fragment() */ struct MessageGetFragmentRequest { /** * Type: GNUNET_MESSAGE_TYPE_PSYCSTORE_MESSAGE_FRAGMENT_GET */ struct GNUNET_MessageHeader header; uint32_t reserved GNUNET_PACKED; /** * Operation ID. */ uint64_t op_id GNUNET_PACKED; /** * Channel's public key. */ struct GNUNET_CRYPTO_EddsaPublicKey channel_key; /** * Slave's public key. */ struct GNUNET_CRYPTO_EcdsaPublicKey slave_key; /** * Requested message ID. */ uint64_t message_id GNUNET_PACKED; /** * Requested fragment offset. */ uint64_t fragment_offset GNUNET_PACKED; /** * Do membership test with @a slave_key before returning fragment? * #GNUNET_YES or #GNUNET_NO */ uint8_t do_membership_test; }; /** * @see GNUNET_PSYCSTORE_state_hash_update() */ struct StateHashUpdateRequest { /** * Type: GNUNET_MESSAGE_TYPE_PSYCSTORE_STATE_HASH_UPDATE */ struct GNUNET_MessageHeader header; uint32_t reserved GNUNET_PACKED; /** * Operation ID. */ uint64_t op_id GNUNET_PACKED; /** * Channel's public key. */ struct GNUNET_CRYPTO_EddsaPublicKey channel_key; struct GNUNET_HashCode hash; }; enum StateOpFlags { STATE_OP_FIRST = 1 << 0, STATE_OP_LAST = 1 << 1 }; /** * @see GNUNET_PSYCSTORE_state_modify() */ struct StateModifyRequest { /** * Type: GNUNET_MESSAGE_TYPE_PSYCSTORE_STATE_MODIFY */ struct GNUNET_MessageHeader header; /** * Operation ID. */ uint64_t op_id GNUNET_PACKED; /** * ID of the message to apply the state changes in. */ uint64_t message_id GNUNET_PACKED; /** * State delta of the message with ID @a message_id. */ uint64_t state_delta GNUNET_PACKED; /** * Channel's public key. */ struct GNUNET_CRYPTO_EddsaPublicKey channel_key; }; /** * @see GNUNET_PSYCSTORE_state_sync() */ struct StateSyncRequest { /** * Type: GNUNET_MESSAGE_TYPE_PSYCSTORE_STATE_SYNC */ struct GNUNET_MessageHeader header; /** * Size of name, including NUL terminator. */ uint16_t name_size GNUNET_PACKED; /** * OR'd StateOpFlags */ uint8_t flags; uint8_t reserved; /** * Operation ID. */ uint64_t op_id GNUNET_PACKED; /** * ID of the message that contains the state_hash PSYC header variable. */ uint64_t state_hash_message_id GNUNET_PACKED; /** * ID of the last stateful message before @a state_hash_message_id. */ uint64_t max_state_message_id GNUNET_PACKED; /** * Channel's public key. */ struct GNUNET_CRYPTO_EddsaPublicKey channel_key; /* Followed by NUL-terminated name, then the value. */ }; GNUNET_NETWORK_STRUCT_END #endif