/usr/include/gnunet/gnunet_ats_plugin.h is in gnunet-dev 0.10.1-4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 | /*
This file is part of GNUnet
(C) 2009, 2010 Christian Grothoff (and other contributing authors)
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
by the Free Software Foundation; either version 3, or (at your
option) any later version.
GNUnet is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNUnet; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
/**
* @file include/gnunet_ats_plugin.h
* @brief API for the ATS solvers. This header
* specifies the struct that is given to the plugin's entry
* method and the other struct that must be returned.
* Note that the destructors of ATS plugins will
* be given the value returned by the constructor
* and is expected to return a NULL pointer.
* @author Christian Grothoff
*/
#ifndef PLUGIN_ATS_H
#define PLUGIN_ATS_H
#include "gnunet_ats_service.h"
#include "gnunet_statistics_service.h"
struct ATS_Address;
/*
* Solver API
* ----------
*/
/**
* Change the preference for a peer
*
* @param handle the solver handle
* @param client the client sending this request
* @param peer the peer id
* @param kind the preference kind to change
* @param score the new preference score
* @param pref_rel the normalized preference value for this kind over all clients
*/
typedef void
(*GAS_solver_address_change_preference) (void *solver,
const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind,
double pref_rel);
/**
* Give feedback about the current assignment
*
* @param handle the solver handle
* @param application the application sending this request
* @param peer the peer id
* @param scope the time interval for this feedback: [now - scope .. now]
* @param kind the preference kind for this feedback
* @param score the feedback score
*/
typedef void
(*GAS_solver_address_feedback_preference) (void *solver, void *application,
const struct GNUNET_PeerIdentity *peer,
const struct GNUNET_TIME_Relative scope,
enum GNUNET_ATS_PreferenceKind kind, double score);
/**
* Notify the solver about a bulk operation changing possibly a lot of values
* Solver will not resolve until all bulk operations are marked as done
*
* @param solver the solver
*/
typedef void
(*GAS_solver_bulk_start) (void *solver);
/**
* Mark a bulk operation as done
* Solver will resolve if values have changed
*
* @param solver the solver
*/
typedef void
(*GAS_solver_bulk_stop) (void *solver);
/**
* Add a single address within a network to the solver
*
* @param solver the solver Handle
* @param addresses the address hashmap containing all addresses
* @param address the address to add
* @param network network type of this address
*/
typedef void
(*GAS_solver_address_add) (void *solver, struct ATS_Address *address,
uint32_t network);
/**
* Delete an address or just the session from the solver
*
* @param solver the solver Handle
* @param addresses the address hashmap containing all addresses
* @param address the address to delete
* @param session_only remove address or just session
*/
typedef void
(*GAS_solver_address_delete) (void *solver, struct ATS_Address *address,
int session_only);
/**
* Transport properties for this address have changed
*
* @param solver solver handle
* @param address the address
* @param type the ATSI type in HBO
* @param abs_value the absolute value of the property
* @param rel_value the normalized value
*/
typedef void
(*GAS_solver_address_property_changed) (void *solver,
struct ATS_Address *address, uint32_t type, uint32_t abs_value,
double rel_value);
/**
* Transport session for this address has changed
*
* NOTE: values in addresses are already updated
*
* @param solver solver handle
* @param address the address
* @param cur_session the current session
* @param new_session the new session
*/
typedef void
(*GAS_solver_address_session_changed) (void *solver,
struct ATS_Address *address, uint32_t cur_session, uint32_t new_session);
/**
* Transport session for this address has changed
*
* NOTE: values in addresses are already updated
*
* @param solver solver handle
* @param address the address
* @param in_use usage state
*/
typedef void
(*GAS_solver_address_inuse_changed) (void *solver, struct ATS_Address *address,
int in_use);
/**
* Network scope for this address has changed
*
* NOTE: values in addresses are already updated
*
* @param solver solver handle
* @param address the address
* @param current_network the current network
* @param new_network the new network
*/
typedef void
(*GAS_solver_address_network_changed) (void *solver,
struct ATS_Address *address, uint32_t current_network, uint32_t new_network);
/**
* Get the prefered address for a peer from solver
*
* @param solver the solver to use
* @param addresses the address hashmap containing all addresses
* @param peer the peer
*/
typedef const struct ATS_Address *
(*GAS_solver_get_preferred_address) (void *solver,
const struct GNUNET_PeerIdentity *peer);
/**
* Stop getting the prefered address for a peer from solver
*
* @param solver the solver to use
* @param addresses the address hashmap containing all addresses
* @param peer the peer
*/
typedef void
(*GAS_solver_stop_get_preferred_address) (void *solver,
const struct GNUNET_PeerIdentity *peer);
/**
* Solver functions
*
* Each solver is required to set up this struct contained in the plugin
* environment struct in during startup
*/
struct GNUNET_ATS_SolverFunctions
{
/**
* Add a new address for a peer to the solver
*
* The address is already contained in the addresses hashmap!
*/
GAS_solver_address_add s_add;
/**
* Update the properties of an address in the solver
*/
GAS_solver_address_property_changed s_address_update_property;
/**
* Update the session of an address in the solver
*/
GAS_solver_address_session_changed s_address_update_session;
/**
* Notify the solver that in address is (not) actively used by transport
* to communicate with a remote peer
*/
GAS_solver_address_inuse_changed s_address_update_inuse;
/**
* Notify solver that the network an address is located in has changed
*/
GAS_solver_address_network_changed s_address_update_network;
/**
* Tell solver to notify ATS if the address to use changes for a specific
* peer using the bandwidth changed callback
*
* The solver must only notify about changes for peers with pending address
* requests!
*/
GAS_solver_get_preferred_address s_get;
/**
* Tell solver stop notifying ATS about changes for this peers
*
* The solver must only notify about changes for peers with pending address
* requests!
*/
GAS_solver_stop_get_preferred_address s_get_stop;
/**
* Delete an address in the solver
*
* The address is not contained in the address hashmap anymore!
*/
GAS_solver_address_delete s_del;
/**
* Change relative preference for quality in solver
*/
GAS_solver_address_change_preference s_pref;
/**
* Give feedback about the current assignment
*/
GAS_solver_address_feedback_preference s_feedback;
/**
* Start a bulk operation
*
* Used if many values have to be updated at the same time.
* When a bulk operation is pending the solver does not have to resolve
* the problem since more updates will follow anyway
*
* For each call to bulk_start, a call to bulk_stop is required!
*/
GAS_solver_bulk_start s_bulk_start;
/**
* Bulk operation done
*
* If no more bulk operations are pending, the solver can solve the problem
* with the updated values
*/
GAS_solver_bulk_stop s_bulk_stop;
};
/**
* Operation codes for solver information callback
*
* Order of calls is expected to be:
* GAS_OP_SOLVE_START
*
* GAS_OP_SOLVE_STOP
* GAS_OP_SOLVE_UPDATE_NOTIFICATION_START
* GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP
*
*/
enum GAS_Solver_Operation
{
/**
* A solution iteration has been started
*/
GAS_OP_SOLVE_START,
/**
* A solution iteration has been finished
*/
GAS_OP_SOLVE_STOP,
/**
* The setup of the problem as a preparation to solve it was started
*/
GAS_OP_SOLVE_SETUP_START,
/**
* The setup of the problem as a preparation to solve is finished
*/
GAS_OP_SOLVE_SETUP_STOP,
/**
* Solving of the LP problem was started
* MLP solver only
*/
GAS_OP_SOLVE_MLP_LP_START,
/**
* Solving of the LP problem is done
* MLP solver only
*/
GAS_OP_SOLVE_MLP_LP_STOP,
/**
* Solving of the MLP problem was started
* MLP solver only
*/
GAS_OP_SOLVE_MLP_MLP_START,
/**
* Solving of the MLP problem is done
* MLP solver only
*/
GAS_OP_SOLVE_MLP_MLP_STOP,
/**
* After the problem was finished, start notifications about changes
* to addresses
*/
GAS_OP_SOLVE_UPDATE_NOTIFICATION_START,
/**
* After the problem was finished, notifications about changes to addresses
* are done
*/
GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP
};
/**
* Status of a GAS_Solver_Operation operation
*/
enum GAS_Solver_Status
{
/**
* Success
*/
GAS_STAT_SUCCESS,
/**
* Failure
*/
GAS_STAT_FAIL
};
/**
* Status of the operation
*/
enum GAS_Solver_Additional_Information
{
/**
* No more specific information
*/
GAS_INFO_NONE,
/**
* A full solution process is performed
* Quite specific to the MLP solver
*/
GAS_INFO_FULL,
/**
* An existing solution was reused
* Quite specific to the MLP solver
*/
GAS_INFO_UPDATED,
/**
* The proportional solver had to recalculate for a single network
*/
GAS_INFO_PROP_SINGLE,
/**
* The proportional solver had to recalculate for all networks
*/
GAS_INFO_PROP_ALL
};
/**
* Callback to call with additional information
* Used for measurement
*
* @param cls the closure
* @param op the operation
* @param peer the peer id
* @param kind the preference kind to change
* @param score the new preference score
* @param pref_rel the normalized preference value for this kind over all clients
*/
typedef void
(*GAS_solver_information_callback) (void *cls, enum GAS_Solver_Operation op,
enum GAS_Solver_Status stat, enum GAS_Solver_Additional_Information);
/**
* Callback to call from solver when bandwidth for address has changed
*
* @param address the with changed bandwidth assigned
*/
typedef void
(*GAS_bandwidth_changed_cb) (void *cls, struct ATS_Address *address);
/**
* Callback to call from solver to obtain application preference values for a
* peer
*
* @param cls the cls
* @param id the peer id
* @return carry of double values containing the preferences with
* GNUNET_ATS_PreferenceCount elements
*/
typedef const double *
(*GAS_get_preferences) (void *cls, const struct GNUNET_PeerIdentity *id);
/**
* Callback to call from solver to obtain transport properties for an
* address
*
* @param cls the cls
* @param address the address
* @return carry of double values containing the preferences with
* GNUNET_ATS_PreferenceCount elements
*/
typedef const double *
(*GAS_get_properties) (void *cls, const struct ATS_Address *address);
/**
* The ATS service will pass a pointer to a struct
* of this type as the first and only argument to the
* entry point of each ATS solver.
*/
struct GNUNET_ATS_PluginEnvironment
{
/**
* Configuration handle to be used by the solver
*/
const struct GNUNET_CONFIGURATION_Handle *cfg;
/**
* Statistics handle to be used by the solver
*/
const struct GNUNET_STATISTICS_Handle *stats;
/**
* Hashmap containing all addresses available
*/
struct GNUNET_CONTAINER_MultiPeerMap *addresses;
/**
* ATS addresses callback to be notified about bandwidth assignment changes
*/
GAS_bandwidth_changed_cb bandwidth_changed_cb;
/**
* ATS addresses closure to be notified about bandwidth assignment changes
*/
void *bw_changed_cb_cls;
/**
* ATS addresses function to obtain preference values
*/
GAS_get_preferences get_preferences;
/**
* ATS addresses function closure to obtain preference values
*/
void *get_preference_cls;
/**
* ATS addresses function to obtain property values
*/
GAS_get_properties get_property;
/**
* ATS addresses function closure to obtain property values
*/
void *get_property_cls;
/**
* Callback for solver to call with status information,
* can be NULL
*/
GAS_solver_information_callback info_cb;
/**
* Closure for information callback,
* can be NULL
*/
void *info_cb_cls;
/**
* The ATS solver plugin functions to call
*/
struct GNUNET_ATS_SolverFunctions sf;
/**
* Available networks
*/
int networks[GNUNET_ATS_NetworkTypeCount];
/**
* Number of networks available
*/
int network_count;
/**
* Array of configured outbound quotas
* Order according to networks in network array
*/
unsigned long long out_quota[GNUNET_ATS_NetworkTypeCount];
/**
* Array of configured inbound quotas
* Order according to networks in network array
*/
unsigned long long in_quota[GNUNET_ATS_NetworkTypeCount];
};
#endif
|