gnunet-service-core.h (5750B)
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 tmap_old previous type map for the neighbour, NULL for connect 138 * @param tmap_new updated type map for the neighbour, NULL for disconnect 139 * @param class the class of the neighbour that changed status 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 147 148 /** 149 * Deliver P2P message to interested clients. Caller must have checked 150 * that the sending peer actually lists the given message type as one 151 * of its types. 152 * 153 * @param sender peer who sent us the message 154 * @param msg the message 155 * @param msize number of bytes to transmit 156 * @param options options for checking which clients should 157 * receive the message 158 */ 159 void 160 GSC_CLIENTS_deliver_message (const struct GNUNET_PeerIdentity *sender, 161 const struct GNUNET_MessageHeader *msg, 162 uint16_t msize, 163 uint32_t options); 164 165 166 /** 167 * Notify all clients about a change to existing session. 168 * Called from SESSIONS whenever there is a change in sessions 169 * or types processed by the respective peer. 170 * 171 * @param neighbour identity of the neighbour that changed status 172 * @param tmap_old previous type map for the neighbour, NULL for connect 173 * @param tmap_new updated type map for the neighbour, NULL for disconnect 174 * @param class the class of the neighbour that changed status 175 */ 176 void 177 GSC_CLIENTS_notify_clients_about_neighbour ( 178 const struct GNUNET_PeerIdentity *neighbour, 179 enum GNUNET_CORE_PeerClass class); 180 181 182 /** 183 * This function is called from GSC_KX_init() once it got its peer id from 184 * pils. 185 * @param cls closure to the callback 186 */ 187 void 188 GSC_complete_initialization_cb (void); 189 190 191 /** 192 * Our configuration. 193 */ 194 extern const struct GNUNET_CONFIGURATION_Handle *GSC_cfg; 195 196 /** 197 * For creating statistics. 198 */ 199 extern struct GNUNET_STATISTICS_Handle *GSC_stats; 200 201 /** 202 * Our Pils service. 203 */ 204 extern struct GNUNET_PILS_Handle *GSC_pils; 205 206 /** 207 * Our peer class 208 */ 209 static enum GNUNET_CORE_PeerClass GSC_peer_class; 210 211 212 #endif