fixed
[oweals/gnunet.git] / src / core / core.h
1 /*
2      This file is part of GNUnet.
3      (C) 2009 Christian Grothoff (and other contributing authors)
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 2, 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., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20
21 /**
22  * @file core/core.h
23  * @brief common internal definitions for core service
24  * @author Christian Grothoff
25  */
26 #include "gnunet_crypto_lib.h"
27 #include "gnunet_time_lib.h"
28
29 /**
30  * General core debugging.
31  */
32 #define DEBUG_CORE GNUNET_YES
33
34 /**
35  * Debugging interaction core-clients.
36  */
37 #define DEBUG_CORE_CLIENT GNUNET_YES
38
39 /**
40  * Definition of bits in the InitMessage's options field that specify
41  * which events this client cares about.  Note that inbound messages
42  * for handlers that were specifically registered are always
43  * transmitted to the client.
44  */
45 #define GNUNET_CORE_OPTION_NOTHING             0
46 #define GNUNET_CORE_OPTION_SEND_CONNECT        1
47 #define GNUNET_CORE_OPTION_SEND_DISCONNECT     2
48 #define GNUNET_CORE_OPTION_SEND_FULL_INBOUND   4
49 #define GNUNET_CORE_OPTION_SEND_HDR_INBOUND    8
50 #define GNUNET_CORE_OPTION_SEND_FULL_OUTBOUND 16
51 #define GNUNET_CORE_OPTION_SEND_HDR_OUTBOUND  32
52
53
54 /**
55  * Message transmitted core clients to gnunet-service-core
56  * to start the interaction.  This header is followed by
57  * uint16_t type values specifying which messages this
58  * client is interested in.
59  */
60 struct InitMessage
61 {
62
63   /**
64    * Header with type GNUNET_MESSAGE_TYPE_CORE_INIT.
65    */
66   struct GNUNET_MessageHeader header;
67
68   /**
69    * Options, see GNUNET_CORE_OPTION_ values.
70    */
71   uint32_t options GNUNET_PACKED;
72
73 };
74
75
76 /**
77  * Message transmitted by the gnunet-service-core process
78  * to its clients in response to an INIT message.
79  */
80 struct InitReplyMessage
81 {
82
83   /**
84    * Header with type GNUNET_MESSAGE_TYPE_CORE_INIT_REPLY
85    */
86   struct GNUNET_MessageHeader header;
87
88   /**
89    * Always zero.
90    */
91   uint32_t reserved GNUNET_PACKED;
92
93   /**
94    * Public key of the local peer.
95    */
96   struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded publicKey;
97
98 };
99
100
101 /**
102  * Message sent by the service to clients to notify them
103  * about a peer connecting or disconnecting.
104  */
105 struct ConnectNotifyMessage
106 {
107   /**
108    * Header with type GNUNET_MESSAGE_TYPE_CORE_NOTIFY_CONNECT
109    * or GNUNET_MESSAGE_TYPE_CORE_NOTIFY_DISCONNECT.
110    */
111   struct GNUNET_MessageHeader header;
112
113   /**
114    * Always zero.
115    */
116   uint32_t reserved GNUNET_PACKED;
117
118   /**
119    * Identity of the connecting peer.
120    */
121   struct GNUNET_PeerIdentity peer;
122
123 };
124
125
126
127 /**
128  * Message sent by the service to clients to notify them about
129  * messages being received or transmitted.  This overall message is
130  * followed by the real message, or just the header of the real
131  * message (depending on the client's preferences).  The receiver can
132  * tell if he got the full message or only a partial message by
133  * looking at the size field in the header of NotifyTrafficMessage and
134  * checking it with the size field in the message that follows.
135  */
136 struct NotifyTrafficMessage
137 {
138   /**
139    * Header with type GNUNET_MESSAGE_TYPE_CORE_NOTIFY_INBOUND
140    * or GNUNET_MESSAGE_TYPE_CORE_NOTIFY_OUTBOUND.
141    */
142   struct GNUNET_MessageHeader header;
143
144   /**
145    * Always zero.
146    */
147   uint32_t reserved GNUNET_PACKED;
148
149   /**
150    * Identity of the receiver or sender.
151    */
152   struct GNUNET_PeerIdentity peer;
153
154 };
155
156
157 /**
158  * Message sent to the core asking for configuration
159  * information and possibly preference changes.
160  */
161 struct RequestInfoMessage
162 {
163   /**
164    * Header with type GNUNET_MESSAGE_TYPE_CORE_REQUEST_CONFIGURE
165    */
166   struct GNUNET_MessageHeader header;
167
168   /**
169    * Always zero.
170    */
171   uint32_t reserved GNUNET_PACKED;
172
173   /**
174    * Limit the number of bytes of outbound traffic to this
175    * peer to at most the specified amount (naturally, the
176    * amount is also limited by the receiving peer).
177    */
178   uint32_t limit_outbound_bpm GNUNET_PACKED;
179
180   /**
181    * Number of bytes of inbound traffic to reserve, can
182    * be negative (to unreserve).  NBO.
183    */
184   int32_t reserve_inbound GNUNET_PACKED;
185
186   /**
187    * Increment the current traffic preference for the given peer by
188    * the specified amont.  The traffic preference is used to determine
189    * the share of bandwidth this peer will typcially be assigned.
190    */
191   uint64_t preference_change GNUNET_PACKED;
192
193   /**
194    * Identity of the peer being configured.
195    */
196   struct GNUNET_PeerIdentity peer;
197
198 };
199
200
201 /**
202  * Response from the core to a "RequestInfoMessage"
203  * providing traffic status information for a peer.
204  */
205 struct ConfigurationInfoMessage
206 {
207   /**
208    * Header with type GNUNET_MESSAGE_TYPE_CORE_CONFIGURATION_INFO
209    */
210   struct GNUNET_MessageHeader header;
211
212   /**
213    * Amount of traffic (inbound number of bytes) that was reserved in
214    * response to the configuration change request.  Negative for
215    * "unreserved" bytes.
216    */
217   int32_t reserved_amount GNUNET_PACKED;
218
219   /**
220    * Available bandwidth in (in bytes per minute) for this peer.
221    * 0 if we have been disconnected.
222    */
223   uint32_t bpm_in GNUNET_PACKED;
224
225   /**
226    * Available bandwidth out (in bytes per minute) for this peer,
227    * 0 if we have been disconnected.
228    */
229   uint32_t bpm_out GNUNET_PACKED;
230
231   /**
232    * Latest transport latency estimate for the peer.
233    * FOREVER if we have been disconnected.
234    */
235   struct GNUNET_TIME_RelativeNBO latency;
236
237   /**
238    * Current traffic preference for the peer.
239    * 0 if we have been disconnected.
240    */
241   uint64_t preference;
242
243   /**
244    * Identity of the receiver or sender.
245    */
246   struct GNUNET_PeerIdentity peer;
247
248 };
249
250
251 /**
252  * Client asking core to transmit a particular message to
253  * a particular target.  
254  */
255 struct SendMessage
256 {
257   /**
258    * Header with type GNUNET_MESSAGE_TYPE_CORE_SEND
259    */
260   struct GNUNET_MessageHeader header;
261
262   /**
263    * How important is this message?
264    */
265   uint32_t priority GNUNET_PACKED;
266
267   /**
268    * By what time would the sender really like to see this
269    * message transmitted?
270    */
271   struct GNUNET_TIME_AbsoluteNBO deadline;
272
273   /**
274    * Identity of the receiver or sender.
275    */
276   struct GNUNET_PeerIdentity peer;
277
278 };
279
280
281 /* end of core.h */