error handling
[oweals/gnunet.git] / src / core / gnunet-service-core.h
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2009, 2010, 2011 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 "core.h"
32 #include "gnunet-service-core_typemap.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  */
140 void
141 GSC_CLIENTS_notify_client_about_neighbour (
142   struct GSC_Client *client,
143   const struct GNUNET_PeerIdentity *neighbour,
144   const struct GSC_TypeMap *tmap_old,
145   const struct GSC_TypeMap *tmap_new);
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  */
175 void
176 GSC_CLIENTS_notify_clients_about_neighbour (
177   const struct GNUNET_PeerIdentity *neighbour,
178   const struct GSC_TypeMap *tmap_old,
179   const struct GSC_TypeMap *tmap_new);
180
181
182 /**
183  * Our configuration.
184  */
185 extern const struct GNUNET_CONFIGURATION_Handle *GSC_cfg;
186
187 /**
188  * For creating statistics.
189  */
190 extern struct GNUNET_STATISTICS_Handle *GSC_stats;
191
192 /**
193  * Our identity.
194  */
195 extern struct GNUNET_PeerIdentity GSC_my_identity;
196
197
198 #endif