Merge remote-tracking branch 'origin/master' into identity_abe
[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
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 3, or (at your
8      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      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18      Boston, MA 02110-1301, USA.
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   /**
50    * Active requests are kept in a doubly-linked list of
51    * the respective target peer.
52    */
53   struct GSC_ClientActiveRequest *next;
54
55   /**
56    * Active requests are kept in a doubly-linked list of
57    * the respective target peer.
58    */
59   struct GSC_ClientActiveRequest *prev;
60
61   /**
62    * Handle to the client.
63    */
64   struct GSC_Client *client_handle;
65
66   /**
67    * Which peer is the message going to be for?
68    */
69   struct GNUNET_PeerIdentity target;
70
71   /**
72    * At what time did we first see this request?
73    */
74   struct GNUNET_TIME_Absolute received_time;
75
76   /**
77    * By what time would the client want to see this message out?
78    */
79   struct GNUNET_TIME_Absolute deadline;
80
81   /**
82    * How important is this request.
83    */
84   enum GNUNET_CORE_Priority priority;
85
86   /**
87    * Has this request been solicited yet?
88    */
89   int was_solicited;
90
91   /**
92    * How many bytes does the client intend to send?
93    */
94   uint16_t msize;
95
96   /**
97    * Unique request ID (in big endian).
98    */
99   uint16_t smr_id;
100
101 };
102
103
104 /**
105  * Tell a client that we are ready to receive the message.
106  *
107  * @param car request that is now ready; the responsibility
108  *        for the handle remains shared between CLIENTS
109  *        and SESSIONS after this call.
110  */
111 void
112 GSC_CLIENTS_solicit_request (struct GSC_ClientActiveRequest *car);
113
114
115 /**
116  * We will never be ready to transmit the given message in (disconnect
117  * or invalid request).  Frees resources associated with @a car.  We
118  * don't explicitly tell the client, he'll learn with the disconnect
119  * (or violated the protocol).
120  *
121  * @param car request that now permanently failed; the
122  *        responsibility for the handle is now returned
123  *        to CLIENTS (SESSIONS is done with it).
124  * @param drop_client #GNUNET_YES if the client violated the protocol
125  *        and we should thus drop the connection
126  */
127 void
128 GSC_CLIENTS_reject_request (struct GSC_ClientActiveRequest *car,
129                             int drop_client);
130
131
132 /**
133  * Notify a particular client about a change to existing connection to
134  * one of our neighbours (check if the client is interested).  Called
135  * from #GSC_SESSIONS_notify_client_about_sessions().
136  *
137  * @param client client to notify
138  * @param neighbour identity of the neighbour that changed status
139  * @param tmap_old previous type map for the neighbour, NULL for connect
140  * @param tmap_new updated type map for the neighbour, NULL for disconnect
141  */
142 void
143 GSC_CLIENTS_notify_client_about_neighbour (struct GSC_Client *client,
144                                            const struct GNUNET_PeerIdentity *neighbour,
145                                            const struct GSC_TypeMap *tmap_old,
146                                            const struct GSC_TypeMap *tmap_new);
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 tmap_old previous type map for the neighbour, NULL for connect
174  * @param tmap_new updated type map for the neighbour, NULL for disconnect
175  */
176 void
177 GSC_CLIENTS_notify_clients_about_neighbour (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