2 This file is part of GNUnet
3 Copyright (C) 2009-2015 GNUnet e.V.
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.
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.
17 * @author Christian Grothoff
20 * API for the ATS solvers.
22 * @defgroup ats-plugin ATS service plugin API
23 * Plugin API for the ATS service.
25 * Specifies the struct that is given to the plugin's entry method and the other
26 * struct that must be returned. Note that the destructors of ATS plugins will
27 * be given the value returned by the constructor and is expected to return a
35 #include "gnunet_ats_service.h"
36 #include "gnunet_statistics_service.h"
39 * Representation of an address the plugin can choose from.
44 * Change the preference for a peer
46 * @param handle the solver handle
47 * @param client the client sending this request
48 * @param peer the peer id
49 * @param kind the preference kind to change
50 * @param score the new preference score
51 * @param pref_rel the normalized preference value for this kind over all clients
54 (*GAS_solver_address_change_preference) (void *solver,
55 const struct GNUNET_PeerIdentity *peer,
56 enum GNUNET_ATS_PreferenceKind kind,
61 * Give feedback about the current assignment
63 * @param handle the solver handle
64 * @param application the application sending this request
65 * @param peer the peer id
66 * @param scope the time interval for this feedback: [now - scope .. now]
67 * @param kind the preference kind for this feedback
68 * @param score the feedback score
71 (*GAS_solver_address_feedback_preference) (void *solver,
72 struct GNUNET_SERVICE_Client *application,
73 const struct GNUNET_PeerIdentity *peer,
74 const struct GNUNET_TIME_Relative scope,
75 enum GNUNET_ATS_PreferenceKind kind,
79 * Notify the solver about a bulk operation changing possibly a lot of values
80 * Solver will not resolve until all bulk operations are marked as done
82 * @param solver the solver
85 (*GAS_solver_bulk_start) (void *solver);
89 * Mark a bulk operation as done
90 * Solver will resolve if values have changed
92 * @param solver the solver
95 (*GAS_solver_bulk_stop) (void *solver);
99 * Add a single address within a network to the solver
101 * @param solver the solver Handle
102 * @param address the address to add
103 * @param network network type of this address
106 (*GAS_solver_address_add) (void *solver,
107 struct ATS_Address *address,
112 * Delete an address or just the session from the solver
114 * @param solver the solver Handle
115 * @param address the address to delete
118 (*GAS_solver_address_delete) (void *solver,
119 struct ATS_Address *address);
123 * Transport properties for this address have changed
125 * @param solver solver handle
126 * @param address the address
129 (*GAS_solver_address_property_changed) (void *solver,
130 struct ATS_Address *address);
134 * Get the prefered address for a peer from solver
136 * @param solver the solver to use
137 * @param peer the peer
140 (*GAS_solver_get_preferred_address) (void *solver,
141 const struct GNUNET_PeerIdentity *peer);
145 * Stop getting the prefered address for a peer from solver
147 * @param solver the solver to use
148 * @param peer the peer
151 (*GAS_solver_stop_get_preferred_address) (void *solver,
152 const struct GNUNET_PeerIdentity *peer);
158 * Each solver is required to set up and return an instance
159 * of this struct during initialization.
161 struct GNUNET_ATS_SolverFunctions
165 * Closure to pass to all solver functions in this struct.
170 * Add a new address for a peer to the solver
172 * The address is already contained in the addresses hashmap!
174 GAS_solver_address_add s_add;
177 * Update the properties of an address in the solver
179 GAS_solver_address_property_changed s_address_update_property;
182 * Tell solver to notify ATS if the address to use changes for a specific
183 * peer using the bandwidth changed callback
185 * The solver must only notify about changes for peers with pending address
188 GAS_solver_get_preferred_address s_get;
191 * Tell solver stop notifying ATS about changes for this peers
193 * The solver must only notify about changes for peers with pending address
196 GAS_solver_stop_get_preferred_address s_get_stop;
199 * Delete an address in the solver
201 * The address is not contained in the address hashmap anymore!
203 GAS_solver_address_delete s_del;
206 * Change relative preference for quality in solver
208 GAS_solver_address_change_preference s_pref;
211 * Give feedback about the current assignment
213 GAS_solver_address_feedback_preference s_feedback;
216 * Start a bulk operation
218 * Used if many values have to be updated at the same time.
219 * When a bulk operation is pending the solver does not have to resolve
220 * the problem since more updates will follow anyway
222 * For each call to bulk_start, a call to bulk_stop is required!
224 GAS_solver_bulk_start s_bulk_start;
227 * Bulk operation done
229 * If no more bulk operations are pending, the solver can solve the problem
230 * with the updated values
232 GAS_solver_bulk_stop s_bulk_stop;
237 * Operation codes for solver information callback
239 * Order of calls is expected to be:
240 * #GAS_OP_SOLVE_START
242 * #GAS_OP_SOLVE_UPDATE_NOTIFICATION_START
243 * #GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP
246 enum GAS_Solver_Operation
249 * A solution iteration has been started
254 * A solution iteration has been finished
259 * The setup of the problem as a preparation to solve it was started
261 GAS_OP_SOLVE_SETUP_START,
264 * The setup of the problem as a preparation to solve is finished
266 GAS_OP_SOLVE_SETUP_STOP,
269 * Solving of the LP problem was started
272 GAS_OP_SOLVE_MLP_LP_START,
275 * Solving of the LP problem is done
278 GAS_OP_SOLVE_MLP_LP_STOP,
281 * Solving of the MLP problem was started
284 GAS_OP_SOLVE_MLP_MLP_START,
287 * Solving of the MLP problem is done
290 GAS_OP_SOLVE_MLP_MLP_STOP,
293 * After the problem was finished, start notifications about changes
296 GAS_OP_SOLVE_UPDATE_NOTIFICATION_START,
299 * After the problem was finished, notifications about changes to addresses
302 GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP
307 * Status of a GAS_Solver_Operation operation
309 enum GAS_Solver_Status
324 * Status of the operation
326 enum GAS_Solver_Additional_Information
329 * No more specific information
334 * A full solution process is performed
335 * Quite specific to the MLP solver
340 * An existing solution was reused
341 * Quite specific to the MLP solver
346 * The proportional solver had to recalculate for a single network
348 GAS_INFO_PROP_SINGLE,
351 * The proportional solver had to recalculate for all networks
358 * Callback to call with additional information
359 * Used for measurement
361 * @param cls the closure
362 * @param op the operation
365 (*GAS_solver_information_callback) (void *cls,
366 enum GAS_Solver_Operation op,
367 enum GAS_Solver_Status stat,
368 enum GAS_Solver_Additional_Information);
372 * Callback to call from solver when bandwidth for address has changed
374 * @param address the with changed bandwidth assigned
377 (*GAS_bandwidth_changed_cb) (void *cls,
378 struct ATS_Address *address);
382 * Callback to call from solver to obtain application preference
386 * @param id the peer id
387 * @return carry of double values containing the preferences with
388 * GNUNET_ATS_PreferenceCount elements
390 typedef const double *
391 (*GAS_get_preferences) (void *cls,
392 const struct GNUNET_PeerIdentity *id);
396 * Callback to call from solver to obtain application connectivity
397 * preferences for a peer.
400 * @param id the peer id
401 * @return 0 if connectivity is not desired, non-null if address
402 * suggestions are requested
405 (*GAS_get_connectivity) (void *cls,
406 const struct GNUNET_PeerIdentity *id);
410 * The ATS plugin will pass a pointer to a struct
411 * of this type as to the initialization function
412 * of the ATS plugins.
414 struct GNUNET_ATS_PluginEnvironment
417 * Configuration handle to be used by the solver
419 const struct GNUNET_CONFIGURATION_Handle *cfg;
422 * Statistics handle to be used by the solver
424 struct GNUNET_STATISTICS_Handle *stats;
427 * Closure to pass to all callbacks in this struct.
432 * Hashmap containing all addresses available
434 struct GNUNET_CONTAINER_MultiPeerMap *addresses;
437 * ATS addresses callback to be notified about bandwidth assignment changes
439 GAS_bandwidth_changed_cb bandwidth_changed_cb;
442 * ATS addresses function to obtain preference values
444 GAS_get_preferences get_preferences;
447 * ATS addresses function to obtain preference values
449 GAS_get_connectivity get_connectivity;
452 * Callback for solver to call with status information,
455 GAS_solver_information_callback info_cb;
458 * Number of networks available, size of the @e out_quota
459 * and @e in_quota arrays.
461 unsigned int network_count;
464 * Array of configured outbound quotas
465 * Order according to networks in network array
467 unsigned long long out_quota[GNUNET_ATS_NetworkTypeCount];
470 * Array of configured inbound quotas
471 * Order according to networks in network array
473 unsigned long long in_quota[GNUNET_ATS_NetworkTypeCount];
478 /** @} */ /* end of group */