gnunet-service-core.h (5780B)
1 /* 2 This file is part of GNUnet. 3 Copyright (C) 2009, 2010, 2011, 2026 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 * @file core/gnunet-service-core.h 23 * @brief Globals for gnunet-service-core 24 * @author Christian Grothoff 25 */ 26 #ifndef GNUNET_SERVICE_CORE_H 27 #define GNUNET_SERVICE_CORE_H 28 29 #include "gnunet_statistics_service.h" 30 #include "gnunet_core_service.h" 31 #include "gnunet_pils_service.h" 32 #include "core.h" 33 34 35 /** 36 * Opaque handle to a client. 37 */ 38 struct GSC_Client; 39 40 41 /** 42 * Record kept for each request for transmission issued by a 43 * client that is still pending. (This struct is used by 44 * both the 'CLIENTS' and 'SESSIONS' subsystems.) 45 */ 46 struct GSC_ClientActiveRequest 47 { 48 /** 49 * Active requests are kept in a doubly-linked list of 50 * the respective target peer. 51 */ 52 struct GSC_ClientActiveRequest *next; 53 54 /** 55 * Active requests are kept in a doubly-linked list of 56 * the respective target peer. 57 */ 58 struct GSC_ClientActiveRequest *prev; 59 60 /** 61 * Handle to the client. 62 */ 63 struct GSC_Client *client_handle; 64 65 /** 66 * Which peer is the message going to be for? 67 */ 68 struct GNUNET_PeerIdentity target; 69 70 /** 71 * At what time did we first see this request? 72 */ 73 struct GNUNET_TIME_Absolute received_time; 74 75 /** 76 * By what time would the client want to see this message out? 77 */ 78 struct GNUNET_TIME_Absolute deadline; 79 80 /** 81 * How important is this request. 82 */ 83 enum GNUNET_MQ_PriorityPreferences priority; 84 85 /** 86 * Has this request been solicited yet? 87 */ 88 int was_solicited; 89 90 /** 91 * How many bytes does the client intend to send? 92 */ 93 uint16_t msize; 94 95 /** 96 * Unique request ID (in big endian). 97 */ 98 uint16_t smr_id; 99 }; 100 101 102 /** 103 * Tell a client that we are ready to receive the message. 104 * 105 * @param car request that is now ready; the responsibility 106 * for the handle remains shared between CLIENTS 107 * and SESSIONS after this call. 108 */ 109 void 110 GSC_CLIENTS_solicit_request (struct GSC_ClientActiveRequest *car); 111 112 113 /** 114 * We will never be ready to transmit the given message in (disconnect 115 * or invalid request). Frees resources associated with @a car. We 116 * don't explicitly tell the client, it'll learn with the disconnect 117 * (or violated the protocol). 118 * 119 * @param car request that now permanently failed; the 120 * responsibility for the handle is now returned 121 * to CLIENTS (SESSIONS is done with it). 122 * @param drop_client #GNUNET_YES if the client violated the protocol 123 * and we should thus drop the connection 124 */ 125 void 126 GSC_CLIENTS_reject_request (struct GSC_ClientActiveRequest *car, 127 int drop_client); 128 129 130 /** 131 * Notify a particular client about a change to existing connection to 132 * one of our neighbours (check if the client is interested). Called 133 * from #GSC_SESSIONS_notify_client_about_sessions(). 134 * 135 * @param client client to notify 136 * @param neighbour identity of the neighbour that changed status 137 * @param class the class of the neighbour that changed status 138 * @param is_connect #GNUNET_YES if the session to @a neighbour was 139 * established, #GNUNET_NO if it went away 140 */ 141 void 142 GSC_CLIENTS_notify_client_about_neighbour ( 143 struct GSC_Client *client, 144 const struct GNUNET_PeerIdentity *neighbour, 145 enum GNUNET_CORE_PeerClass class, 146 enum GNUNET_GenericReturnValue is_connect); 147 148 149 /** 150 * Deliver P2P message to interested clients. Caller must have checked 151 * that the sending peer actually lists the given message type as one 152 * of its types. 153 * 154 * @param sender peer who sent us the message 155 * @param msg the message 156 * @param msize number of bytes to transmit 157 * @param options options for checking which clients should 158 * receive the message 159 */ 160 void 161 GSC_CLIENTS_deliver_message (const struct GNUNET_PeerIdentity *sender, 162 const struct GNUNET_MessageHeader *msg, 163 uint16_t msize, 164 uint32_t options); 165 166 167 /** 168 * Notify all clients about a change to existing session. 169 * Called from SESSIONS whenever there is a change in sessions 170 * or types processed by the respective peer. 171 * 172 * @param neighbour identity of the neighbour that changed status 173 * @param class the class of the neighbour that changed status 174 * @param is_connect #GNUNET_YES if the session to @a neighbour was 175 * established, #GNUNET_NO if it went away 176 */ 177 void 178 GSC_CLIENTS_notify_clients_about_neighbour ( 179 const struct GNUNET_PeerIdentity *neighbour, 180 enum GNUNET_CORE_PeerClass class, 181 enum GNUNET_GenericReturnValue is_connect); 182 183 184 /** 185 * This function is called from GSC_KX_init() once it got its peer id from 186 * pils. 187 * @param cls closure to the callback 188 */ 189 void 190 GSC_complete_initialization_cb (void); 191 192 193 /** 194 * Our configuration. 195 */ 196 extern const struct GNUNET_CONFIGURATION_Handle *GSC_cfg; 197 198 /** 199 * For creating statistics. 200 */ 201 extern struct GNUNET_STATISTICS_Handle *GSC_stats; 202 203 /** 204 * Our Pils service. 205 */ 206 extern struct GNUNET_PILS_Handle *GSC_pils; 207 208 /** 209 * Our peer class 210 */ 211 static enum GNUNET_CORE_PeerClass GSC_peer_class; 212 213 214 #endif