252188c627a5cb57ae5d2fef710c2bfdfcebc717
[oweals/gnunet.git] / src / include / gnunet_rps_service.h
1 /*
2       This file is part of GNUnet
3       Copyright (C)
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
19 /**
20  * @author Julius Bünger
21  *
22  * @file
23  * API to the rps service
24  *
25  * @defgroup rps  RPS service
26  * Random Peer Sampling
27  * @{
28  */
29 #ifndef GNUNET_RPS_SERVICE_H
30 #define GNUNET_RPS_SERVICE_H
31
32 #ifdef __cplusplus
33 extern "C"
34 {
35 #if 0                           /* keep Emacsens' auto-indent happy */
36 }
37 #endif
38 #endif
39
40 /**
41  * Version of the rps API.
42  */
43 #define GNUNET_RPS_VERSION 0x00000000
44
45 /**
46  * Handle for the random peer sampling service
47  */
48 struct GNUNET_RPS_Handle;
49
50 /**
51  * Handle for one request to the rps service
52  */
53 struct GNUNET_RPS_Request_Handle;
54
55 /**
56  * Callback called when requested random peers are available.
57  *
58  * @param cls the closure given with the request
59  * @param num_peers the number of peers returned
60  * @param peers array with num_peers PeerIDs
61  */
62 typedef void (* GNUNET_RPS_NotifyReadyCB) (void *cls,
63     uint64_t num_peers,
64     const struct GNUNET_PeerIdentity *peers);
65
66 /**
67  * Callback called when view was updated
68  *
69  * @param num_peers the number of peers returned
70  * @param peers array with num_peers PeerIDs
71  */
72 typedef void (* GNUNET_RPS_ViewUpdateCB) (void *cls,
73     uint64_t num_peers,
74     const struct GNUNET_PeerIdentity *peers);
75
76 /**
77  * Callback called when a peer from the biased stream was received
78  *
79  * @param peer The received peer
80  */
81 typedef void (* GNUNET_RPS_StreamInputCB) (void *cls,
82     const struct GNUNET_PeerIdentity *peer);
83
84 /**
85  * Connect to the rps service
86  *
87  * @param cfg configuration to use
88  * @return handle to the rps service
89  */
90   struct GNUNET_RPS_Handle *
91 GNUNET_RPS_connect (const struct GNUNET_CONFIGURATION_Handle *cfg);
92
93 /**
94  * Request n random peers.
95  *
96  * This does exacly the same as GNUNET_RPS_request_peers_single_call
97  * but needs a GNUNET_RPS_Handle.
98  * This exists only for other parts of GNUnet that expect having to
99  * (dis)connect from/to a service.
100  *
101  * @param h handle to the rps service
102  * @param n number of random peers to return
103  * @param ready_cb the callback to be called when the peers are available
104  * @param cls a closure that will be given to the callback
105  * @return handle to this request
106  */
107   struct GNUNET_RPS_Request_Handle *
108 GNUNET_RPS_request_peers (struct GNUNET_RPS_Handle *h, uint32_t n,
109                           GNUNET_RPS_NotifyReadyCB ready_cb,
110                           void *cls);
111
112 /**
113  * Seed rps service with peerIDs.
114  *
115  * @param h handle to the rps service
116  * @param n number of peers to seed
117  * @param ids the ids of the peers seeded
118  */
119   void
120 GNUNET_RPS_seed_ids (struct GNUNET_RPS_Handle *h, uint32_t n,
121                      const struct GNUNET_PeerIdentity * ids);
122
123 /**
124  * Cancle an issued request.
125  *
126  * @param rh handle of the pending request to be canceled
127  */
128   void
129 GNUNET_RPS_request_cancel (struct GNUNET_RPS_Request_Handle *rh);
130
131
132 #ifdef ENABLE_MALICIOUS
133 /**
134  * Turn RPS service to act malicious.
135  *
136  * @param h handle to the rps service
137  * @param type which type of malicious peer to turn to.
138  *             0 Don't act malicious at all
139  *             1 Try to maximise representation
140  *             2 Try to partition the network
141  *               (isolate one peer from the rest)
142  * @param n number of @a ids
143  * @param ids the ids of the malicious peers
144  *            if @type is 2 the last id is the id of the
145  *            peer to be isolated from the rest
146  */
147   void
148 GNUNET_RPS_act_malicious (struct GNUNET_RPS_Handle *h,
149                           uint32_t type,
150                           uint32_t num_peers,
151                           const struct GNUNET_PeerIdentity *ids,
152                           const struct GNUNET_PeerIdentity *target_peer);
153 #endif /* ENABLE_MALICIOUS */
154
155 /* Get internals for debugging/profiling purposes */
156
157 /**
158  * Request updates of view
159  *
160  * @param rps_handle handle to the rps service
161  * @param num_req_peers number of peers we want to receive
162  *        (0 for infinite updates)
163  * @param cls a closure that will be given to the callback
164  * @param ready_cb the callback called when the peers are available
165  */
166 void
167 GNUNET_RPS_view_request (struct GNUNET_RPS_Handle *rps_handle,
168                          uint32_t num_updates,
169                          GNUNET_RPS_ViewUpdateCB view_update_cb,
170                          void *cls);
171
172
173 /**
174  * Request biased stream of peers that are being put into the sampler
175  *
176  * @param rps_handle handle to the rps service
177  * @param num_req_peers number of peers we want to receive
178  *        (0 for infinite updates)
179  * @param cls a closure that will be given to the callback
180  * @param ready_cb the callback called when the peers are available
181  */
182 void
183 GNUNET_RPS_stream_request (struct GNUNET_RPS_Handle *rps_handle,
184                            uint32_t num_updates,
185                            GNUNET_RPS_StreamInputCB stream_input_cb,
186                            void *cls);
187
188
189 /**
190  * Disconnect from the rps service
191  *
192  * @param h the handle to the rps service
193  */
194   void
195 GNUNET_RPS_disconnect (struct GNUNET_RPS_Handle *h);
196
197
198 #if 0                           /* keep Emacsens' auto-indent happy */
199 {
200 #endif
201 #ifdef __cplusplus
202 }
203 #endif
204
205 #endif
206
207 /** @} */  /* end of group */