glitch in the license text detected by hyazinthe, thank you!
[oweals/gnunet.git] / src / fs / gnunet-service-fs.h
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2009, 2010 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
16 /**
17  * @file fs/gnunet-service-fs.h
18  * @brief shared data structures of gnunet-service-fs.c
19  * @author Christian Grothoff
20  */
21 #ifndef GNUNET_SERVICE_FS_H
22 #define GNUNET_SERVICE_FS_H
23
24 #include "gnunet_util_lib.h"
25 #include "gnunet_statistics_service.h"
26 #include "gnunet_transport_service.h"
27 #include "gnunet_core_service.h"
28 #include "gnunet_block_lib.h"
29 #include "gnunet_ats_service.h"
30 #include "fs.h"
31
32
33 /**
34  * By which amount do we decrement the TTL for simple forwarding /
35  * indirection of the query; in milli-seconds.  Set somewhat in
36  * accordance to your network latency (above the time it'll take you
37  * to send a packet and get a reply).
38  */
39 #define TTL_DECREMENT 5000
40
41 /**
42  * At what frequency should our datastore load decrease
43  * automatically (since if we don't use it, clearly the
44  * load must be going down).
45  */
46 #define DATASTORE_LOAD_AUTODECLINE GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 250)
47
48 /**
49  * Only the (mandatory) query is included.
50  */
51 #define GET_MESSAGE_BIT_QUERY_ONLY 0
52
53 /**
54  * The peer identity of a peer waiting for the
55  * reply is included (used if the response
56  * should be transmitted to someone other than
57  * the sender of the GET).
58  */
59 #define GET_MESSAGE_BIT_RETURN_TO 1
60
61 /**
62  * The peer identity of a peer that had claimed to have the content
63  * previously is included (can be used if responder-anonymity is not
64  * desired; note that the precursor presumably lacked a direct
65  * connection to the specified peer; still, the receiver is in no way
66  * required to limit forwarding only to the specified peer, it should
67  * only prefer it somewhat if possible).
68  */
69 #define GET_MESSAGE_BIT_TRANSMIT_TO 4
70
71
72 GNUNET_NETWORK_STRUCT_BEGIN
73
74 /**
75  * Message sent between peers asking for FS-content.
76  */
77 struct GetMessage
78 {
79
80   /**
81    * Message type will be #GNUNET_MESSAGE_TYPE_FS_GET.
82    */
83   struct GNUNET_MessageHeader header;
84
85   /**
86    * Type of the query (block type).
87    */
88   uint32_t type GNUNET_PACKED;
89
90   /**
91    * How important is this request (network byte order)
92    */
93   uint32_t priority GNUNET_PACKED;
94
95   /**
96    * Relative time to live in MILLISECONDS (network byte order)
97    */
98   int32_t ttl GNUNET_PACKED;
99
100   /**
101    * The content hash should be mutated using this value
102    * before checking against the bloomfilter (used to
103    * get many different filters for the same hash codes).
104    * The number should be in big-endian format when used
105    * for mingling.
106    */
107   uint32_t filter_mutator GNUNET_PACKED;
108
109   /**
110    * Which of the optional hash codes are present at the end of the
111    * message?  See GET_MESSAGE_BIT_xx constants.  For each bit that is
112    * set, an additional `struct GNUNET_HashCode` with the respective content
113    * (in order of the bits) will be appended to the end of the GET
114    * message.
115    */
116   uint32_t hash_bitmap GNUNET_PACKED;
117
118   /**
119    * Hashcodes of the file(s) we're looking for.
120    * Details depend on the query type.
121    */
122   struct GNUNET_HashCode query;
123
124   /* this is followed by PeerIdentities as specified in the "hash_bitmap";
125    * after that, an optional bloomfilter (with bits set for replies
126    * that should be suppressed) can be present */
127 };
128
129
130 /**
131  * Message send by a peer that wants to be excluded
132  * from migration for a while.
133  */
134 struct MigrationStopMessage
135 {
136   /**
137    * Message type will be
138    * GNUNET_MESSAGE_TYPE_FS_MIGRATION_STOP.
139    */
140   struct GNUNET_MessageHeader header;
141
142   /**
143    * Always zero.
144    */
145   uint32_t reserved GNUNET_PACKED;
146
147   /**
148    * How long should the block last?
149    */
150   struct GNUNET_TIME_RelativeNBO duration;
151
152 };
153 GNUNET_NETWORK_STRUCT_END
154
155 /**
156  * A connected peer.
157  */
158 struct GSF_ConnectedPeer;
159
160 /**
161  * An active request.
162  */
163 struct GSF_PendingRequest;
164
165 /**
166  * A local client.
167  */
168 struct GSF_LocalClient;
169
170 /**
171  * Information kept per plan per request ('pe' module).
172  */
173 struct GSF_RequestPlan;
174
175 /**
176  * Bijection between request plans and pending requests.
177  */
178 struct GSF_PendingRequestPlanBijection;
179
180 /**
181  * Our connection to the datastore.
182  */
183 extern struct GNUNET_DATASTORE_Handle *GSF_dsh;
184
185 /**
186  * Our configuration.
187  */
188 extern const struct GNUNET_CONFIGURATION_Handle *GSF_cfg;
189
190 /**
191  * Handle for reporting statistics.
192  */
193 extern struct GNUNET_STATISTICS_Handle *GSF_stats;
194
195 /**
196  * Pointer to handle to the core service (points to NULL until we've
197  * connected to it).
198  */
199 extern struct GNUNET_CORE_Handle *GSF_core;
200
201 /**
202  * Handle for DHT operations.
203  */
204 extern struct GNUNET_DHT_Handle *GSF_dht;
205
206 /**
207  * How long do requests typically stay in the routing table?
208  */
209 extern struct GNUNET_LOAD_Value *GSF_rt_entry_lifetime;
210
211 /**
212  * Running average of the observed latency to other peers (round trip).
213  */
214 extern struct GNUNET_TIME_Relative GSF_avg_latency;
215
216 /**
217  * Handle to ATS service.
218  */
219 extern struct GNUNET_ATS_PerformanceHandle *GSF_ats;
220
221 /**
222  * Identity of this peer.
223  */
224 extern struct GNUNET_PeerIdentity GSF_my_id;
225
226 /**
227  * Typical priorities we're seeing from other peers right now.  Since
228  * most priorities will be zero, this value is the weighted average of
229  * non-zero priorities seen "recently".  In order to ensure that new
230  * values do not dramatically change the ratio, values are first
231  * "capped" to a reasonable range (+N of the current value) and then
232  * averaged into the existing value by a ratio of 1:N.  Hence
233  * receiving the largest possible priority can still only raise our
234  * "current_priorities" by at most 1.
235  */
236 extern double GSF_current_priorities;
237
238 /**
239  * How many query messages have we received 'recently' that
240  * have not yet been claimed as cover traffic?
241  */
242 extern unsigned int GSF_cover_query_count;
243
244 /**
245  * How many content messages have we received 'recently' that
246  * have not yet been claimed as cover traffic?
247  */
248 extern unsigned int GSF_cover_content_count;
249
250 /**
251  * Our block context.
252  */
253 extern struct GNUNET_BLOCK_Context *GSF_block_ctx;
254
255 /**
256  * Are we introducing randomized delays for better anonymity?
257  */
258 extern int GSF_enable_randomized_delays;
259
260 /**
261  * Size of the datastore queue we assume for common requests.
262  */
263 extern unsigned int GSF_datastore_queue_size;
264
265
266 /**
267  * Function to be called after we're done processing
268  * replies from the local lookup.  If the result status
269  * code indicates that there may be more replies, plan
270  * forwarding the request.
271  *
272  * @param cls closure (NULL)
273  * @param pr the pending request we were processing
274  * @param result final datastore lookup result
275  */
276 void
277 GSF_consider_forwarding (void *cls,
278                          struct GSF_PendingRequest *pr,
279                          enum GNUNET_BLOCK_EvaluationResult result);
280
281
282 /**
283  * Test if the DATABASE (GET) load on this peer is too high
284  * to even consider processing the query at
285  * all.
286  *
287  * @return #GNUNET_YES if the load is too high to do anything (load high)
288  *         #GNUNET_NO to process normally (load normal)
289  *         #GNUNET_SYSERR to process for free (load low)
290  */
291 int
292 GSF_test_get_load_too_high_ (uint32_t priority);
293
294
295 /**
296  * We've just now completed a datastore request.  Update our
297  * datastore load calculations.
298  *
299  * @param start time when the datastore request was issued
300  */
301 void
302 GSF_update_datastore_delay_ (struct GNUNET_TIME_Absolute start);
303
304
305 #endif
306 /* end of gnunet-service-fs.h */