gnunet_ats_service.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709
  1. /*
  2. This file is part of GNUnet.
  3. Copyright (C) 2010-2015 Christian Grothoff (and other contributing authors)
  4. GNUnet is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published
  6. by the Free Software Foundation; either version 3, or (at your
  7. option) any later version.
  8. GNUnet is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with GNUnet; see the file COPYING. If not, write to the
  14. Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  15. Boston, MA 02111-1307, USA.
  16. */
  17. /**
  18. * @file include/gnunet_ats_service.h
  19. * @brief automatic transport selection and outbound bandwidth determination
  20. * @author Christian Grothoff
  21. * @author Matthias Wachs
  22. */
  23. #ifndef GNUNET_ATS_SERVICE_H
  24. #define GNUNET_ATS_SERVICE_H
  25. #include "gnunet_constants.h"
  26. #include "gnunet_util_lib.h"
  27. #include "gnunet_hello_lib.h"
  28. /**
  29. * Types of networks (with separate quotas) we support.
  30. */
  31. enum GNUNET_ATS_Network_Type
  32. {
  33. /**
  34. * Category of last resort.
  35. */
  36. GNUNET_ATS_NET_UNSPECIFIED = 0,
  37. /**
  38. * Loopback (same host).
  39. */
  40. GNUNET_ATS_NET_LOOPBACK = 1,
  41. /**
  42. * Local area network.
  43. */
  44. GNUNET_ATS_NET_LAN = 2,
  45. /**
  46. * Wide area network (i.e. Internet)
  47. */
  48. GNUNET_ATS_NET_WAN = 3,
  49. /**
  50. * Wireless LAN (i.e. 802.11abgn)
  51. */
  52. GNUNET_ATS_NET_WLAN = 4,
  53. /**
  54. * Bluetooth LAN
  55. */
  56. GNUNET_ATS_NET_BT = 5
  57. /**
  58. * Number of network types supported by ATS
  59. */
  60. #define GNUNET_ATS_NetworkTypeCount 6
  61. };
  62. /**
  63. * Default bandwidth assigned to a network : 64 KB/s
  64. */
  65. #define GNUNET_ATS_DefaultBandwidth 65536
  66. /**
  67. * Undefined value for an `enum GNUNET_ATS_Property`
  68. */
  69. #define GNUNET_ATS_VALUE_UNDEFINED UINT32_MAX
  70. /**
  71. * String representation for GNUNET_ATS_VALUE_UNDEFINED
  72. */
  73. #define GNUNET_ATS_VALUE_UNDEFINED_STR "undefined"
  74. /**
  75. * Maximum bandwidth assigned to a network : 4095 MB/s
  76. */
  77. #define GNUNET_ATS_MaxBandwidth UINT32_MAX
  78. /**
  79. * Textual equivalent for GNUNET_ATS_MaxBandwidth
  80. */
  81. #define GNUNET_ATS_MaxBandwidthString "unlimited"
  82. /**
  83. * ATS performance characteristics for an address.
  84. */
  85. struct GNUNET_ATS_Properties
  86. {
  87. /**
  88. * Actual traffic on this connection from this peer to the other peer.
  89. * Includes transport overhead.
  90. *
  91. * Unit: [bytes/second]
  92. */
  93. uint32_t utilization_out;
  94. /**
  95. * Actual traffic on this connection from the other peer to this peer.
  96. * Includes transport overhead.
  97. *
  98. * Unit: [bytes/second]
  99. */
  100. uint32_t utilization_in;
  101. /**
  102. * Which network scope does the respective address belong to?
  103. * This property does not change.
  104. */
  105. enum GNUNET_ATS_Network_Type scope;
  106. /**
  107. * Distance on network layer (required for distance-vector routing)
  108. * in hops. Zero for direct connections (i.e. plain TCP/UDP).
  109. */
  110. unsigned int distance;
  111. /**
  112. * Delay. Time between when the time packet is sent and the packet
  113. * arrives. FOREVER if we did not measure yet.
  114. */
  115. struct GNUNET_TIME_Relative delay;
  116. };
  117. /**
  118. * ATS performance characteristics for an address in
  119. * network byte order (for IPC).
  120. */
  121. struct GNUNET_ATS_PropertiesNBO
  122. {
  123. /**
  124. * Actual traffic on this connection from this peer to the other peer.
  125. * Includes transport overhead.
  126. *
  127. * Unit: [bytes/second]
  128. */
  129. uint32_t utilization_out GNUNET_PACKED;
  130. /**
  131. * Actual traffic on this connection from the other peer to this peer.
  132. * Includes transport overhead.
  133. *
  134. * Unit: [bytes/second]
  135. */
  136. uint32_t utilization_in GNUNET_PACKED;
  137. /**
  138. * Which network scope does the respective address belong to?
  139. * This property does not change.
  140. */
  141. uint32_t scope GNUNET_PACKED;
  142. /**
  143. * Distance on network layer (required for distance-vector routing)
  144. * in hops. Zero for direct connections (i.e. plain TCP/UDP).
  145. */
  146. uint32_t distance GNUNET_PACKED;
  147. /**
  148. * Delay. Time between when the time packet is sent and the packet
  149. * arrives. FOREVER if we did not measure yet.
  150. */
  151. struct GNUNET_TIME_RelativeNBO delay;
  152. };
  153. /* ********************* LAN Characterization library ************************ */
  154. /* Note: these functions do not really communicate with the ATS service */
  155. /**
  156. * Convert ATS properties from host to network byte order.
  157. *
  158. * @param nbo[OUT] value written
  159. * @param hbo value read
  160. */
  161. void
  162. GNUNET_ATS_properties_hton (struct GNUNET_ATS_PropertiesNBO *nbo,
  163. const struct GNUNET_ATS_Properties *hbo);
  164. /**
  165. * Convert ATS properties from network to host byte order.
  166. *
  167. * @param hbo[OUT] value written
  168. * @param nbo value read
  169. */
  170. void
  171. GNUNET_ATS_properties_ntoh (struct GNUNET_ATS_Properties *hbo,
  172. const struct GNUNET_ATS_PropertiesNBO *nbo);
  173. /**
  174. * Convert a `enum GNUNET_ATS_Network_Type` to a string
  175. *
  176. * @param net the network type
  177. * @return a string or NULL if invalid
  178. */
  179. const char *
  180. GNUNET_ATS_print_network_type (enum GNUNET_ATS_Network_Type net);
  181. /**
  182. * Handle for the LAN Characterization library.
  183. */
  184. struct GNUNET_ATS_InterfaceScanner;
  185. /**
  186. * Returns where the address is located: loopback, LAN or WAN.
  187. *
  188. * @param is handle from #GNUNET_ATS_interface_scanner_init()
  189. * @param addr address
  190. * @param addrlen address length
  191. * @return type of the network the address belongs to
  192. */
  193. enum GNUNET_ATS_Network_Type
  194. GNUNET_ATS_scanner_address_get_type (struct GNUNET_ATS_InterfaceScanner *is,
  195. const struct sockaddr *addr,
  196. socklen_t addrlen);
  197. /**
  198. * Initialize the ATS address characterization client handle.
  199. *
  200. * @return scanner handle, NULL on error
  201. */
  202. struct GNUNET_ATS_InterfaceScanner *
  203. GNUNET_ATS_scanner_init (void);
  204. /**
  205. * Terminate interface scanner.
  206. *
  207. * @param is scanner we are done with
  208. */
  209. void
  210. GNUNET_ATS_scanner_done (struct GNUNET_ATS_InterfaceScanner *is);
  211. /* ********************Connection Suggestion API ***************************** */
  212. /**
  213. * Handle to the ATS subsystem for making suggestions about
  214. * connections the peer would like to have.
  215. */
  216. struct GNUNET_ATS_ConnectivityHandle;
  217. /**
  218. * Handle for address suggestion requests.
  219. */
  220. struct GNUNET_ATS_ConnectivitySuggestHandle;
  221. /**
  222. * Initialize the ATS connectivity suggestion client handle.
  223. *
  224. * @param cfg configuration to use
  225. * @return ats connectivity handle, NULL on error
  226. */
  227. struct GNUNET_ATS_ConnectivityHandle *
  228. GNUNET_ATS_connectivity_init (const struct GNUNET_CONFIGURATION_Handle *cfg);
  229. /**
  230. * Shutdown ATS connectivity suggestion client.
  231. *
  232. * @param ch handle to destroy
  233. */
  234. void
  235. GNUNET_ATS_connectivity_done (struct GNUNET_ATS_ConnectivityHandle *ch);
  236. /**
  237. * We would like to establish a new connection with a peer. ATS
  238. * should suggest a good address to begin with.
  239. *
  240. * @param ch handle
  241. * @param peer identity of the peer we need an address for
  242. * TODO: add argument to allow client to express 'strength's of request
  243. * @return suggestion handle, NULL if request is already pending
  244. */
  245. struct GNUNET_ATS_ConnectivitySuggestHandle *
  246. GNUNET_ATS_connectivity_suggest (struct GNUNET_ATS_ConnectivityHandle *ch,
  247. const struct GNUNET_PeerIdentity *peer);
  248. /**
  249. * We no longer care about being connected to a peer.
  250. *
  251. * @param sh handle
  252. */
  253. void
  254. GNUNET_ATS_connectivity_suggest_cancel (struct GNUNET_ATS_ConnectivitySuggestHandle *sh);
  255. /* ******************************** Scheduling API ***************************** */
  256. /**
  257. * Handle to the ATS subsystem for bandwidth/transport scheduling information.
  258. */
  259. struct GNUNET_ATS_SchedulingHandle;
  260. /**
  261. * Opaque session handle, defined by plugins. Contents not known to ATS.
  262. * FIXME: This violates our naming conventions.
  263. */
  264. struct Session;
  265. /**
  266. * Signature of a function called by ATS with the current bandwidth
  267. * and address preferences as determined by ATS.
  268. *
  269. * @param cls closure
  270. * @param peer for which we suggest an address, NULL if ATS connection died
  271. * @param address suggested address (including peer identity of the peer),
  272. * may be NULL to signal disconnect from peer
  273. * @param session session to use, NULL to establish a new outgoing session
  274. * @param bandwidth_out assigned outbound bandwidth for the connection,
  275. * 0 to signal disconnect
  276. * @param bandwidth_in assigned inbound bandwidth for the connection,
  277. * 0 to signal disconnect
  278. */
  279. typedef void
  280. (*GNUNET_ATS_AddressSuggestionCallback) (void *cls,
  281. const struct GNUNET_PeerIdentity *peer,
  282. const struct GNUNET_HELLO_Address *address,
  283. struct Session *session,
  284. struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
  285. struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in);
  286. /**
  287. * Initialize the ATS scheduling subsystem.
  288. *
  289. * @param cfg configuration to use
  290. * @param suggest_cb notification to call whenever the suggestation changed
  291. * @param suggest_cb_cls closure for @a suggest_cb
  292. * @return ats context
  293. */
  294. struct GNUNET_ATS_SchedulingHandle *
  295. GNUNET_ATS_scheduling_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
  296. GNUNET_ATS_AddressSuggestionCallback suggest_cb,
  297. void *suggest_cb_cls);
  298. /**
  299. * Client is done with ATS scheduling, release resources.
  300. *
  301. * @param sh handle to release
  302. */
  303. void
  304. GNUNET_ATS_scheduling_done (struct GNUNET_ATS_SchedulingHandle *sh);
  305. /**
  306. * Test if a address and a session is known to ATS.
  307. *
  308. * @param sh the scheduling handle
  309. * @param address the address
  310. * @param session the session
  311. * @return #GNUNET_YES or #GNUNET_NO
  312. */
  313. int
  314. GNUNET_ATS_session_known (struct GNUNET_ATS_SchedulingHandle *sh,
  315. const struct GNUNET_HELLO_Address *address,
  316. struct Session *session);
  317. /**
  318. * Handle used within ATS to track an address.
  319. */
  320. struct GNUNET_ATS_AddressRecord;
  321. /**
  322. * We have a new address ATS should know. Addresses have to be added with this
  323. * function before they can be: updated, set in use and destroyed
  324. *
  325. * @param sh handle
  326. * @param address the address
  327. * @param session session handle (if available, i.e. for incoming connections)
  328. * @param prop performance data for the address
  329. * @return handle to the address representation inside ATS, NULL
  330. * on error (i.e. ATS knows this exact address already, or
  331. * address is invalid)
  332. */
  333. struct GNUNET_ATS_AddressRecord *
  334. GNUNET_ATS_address_add (struct GNUNET_ATS_SchedulingHandle *sh,
  335. const struct GNUNET_HELLO_Address *address,
  336. struct Session *session,
  337. const struct GNUNET_ATS_Properties *prop);
  338. /**
  339. * An address was used to initiate a session.
  340. *
  341. * @param ar address record to update information for
  342. * @param session session handle
  343. */
  344. void
  345. GNUNET_ATS_address_add_session (struct GNUNET_ATS_AddressRecord *ar,
  346. struct Session *session);
  347. /**
  348. * A session was destroyed, disassociate it from the
  349. * given address record. If this was an incoming
  350. * addess, destroy the address as well.
  351. *
  352. * @param ar address record to update information for
  353. * @param session session handle
  354. * @return #GNUNET_YES if the @a ar was destroyed because
  355. * it was an incoming address,
  356. * #GNUNET_NO if the @ar was kept because we can
  357. * use it still to establish a new session
  358. */
  359. int
  360. GNUNET_ATS_address_del_session (struct GNUNET_ATS_AddressRecord *ar,
  361. struct Session *session);
  362. /**
  363. * We have updated performance statistics for a given address. Note
  364. * that this function can be called for addresses that are currently
  365. * in use as well as addresses that are valid but not actively in use.
  366. * Furthermore, the peer may not even be connected to us right now (@a
  367. * session value of NULL used to signal disconnect, or somehow we
  368. * otherwise got updated on @a ats information). Based on the
  369. * information provided, ATS may update bandwidth assignments and
  370. * suggest to switch addresses.
  371. *
  372. * @param ar address record to update information for
  373. * @param prop performance data for the address
  374. */
  375. void
  376. GNUNET_ATS_address_update (struct GNUNET_ATS_AddressRecord *ar,
  377. const struct GNUNET_ATS_Properties *prop);
  378. /**
  379. * An address got destroyed, stop using it as a valid address.
  380. *
  381. * @param ar address record to destroy, it's validation has
  382. * expired and ATS may no longer use it
  383. */
  384. void
  385. GNUNET_ATS_address_destroy (struct GNUNET_ATS_AddressRecord *ar);
  386. /* ******************************** Performance API ***************************** */
  387. /**
  388. * ATS Handle to obtain and/or modify performance information.
  389. */
  390. struct GNUNET_ATS_PerformanceHandle;
  391. /**
  392. * Signature of a function that is called with QoS information about an address.
  393. *
  394. * @param cls closure
  395. * @param address the address, NULL if ATS service was disconnected
  396. * @param address_active #GNUNET_YES if this address is actively used
  397. * to maintain a connection to a peer;
  398. * #GNUNET_NO if the address is not actively used;
  399. * #GNUNET_SYSERR if this address is no longer available for ATS
  400. * @param bandwidth_out assigned outbound bandwidth for the connection
  401. * @param bandwidth_in assigned inbound bandwidth for the connection
  402. * @param prop performance data for the address
  403. */
  404. typedef void
  405. (*GNUNET_ATS_AddressInformationCallback) (void *cls,
  406. const struct GNUNET_HELLO_Address *address,
  407. int address_active,
  408. struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
  409. struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
  410. const struct GNUNET_ATS_Properties *prop);
  411. /**
  412. * Handle for an address listing operation
  413. */
  414. struct GNUNET_ATS_AddressListHandle;
  415. /**
  416. * Get handle to access performance API of the ATS subsystem.
  417. *
  418. * @param cfg configuration to use
  419. * @param addr_info_cb callback called when performance characteristics for
  420. * an address change
  421. * @param addr_info_cb_cls closure for @a addr_info_cb
  422. * @return ats performance context
  423. */
  424. struct GNUNET_ATS_PerformanceHandle *
  425. GNUNET_ATS_performance_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
  426. GNUNET_ATS_AddressInformationCallback addr_info_cb,
  427. void *addr_info_cb_cls);
  428. /**
  429. * Get information about addresses known to the ATS subsystem.
  430. *
  431. * @param handle the performance handle to use
  432. * @param peer peer idm can be NULL for all peers
  433. * @param all #GNUNET_YES to get information about all addresses or #GNUNET_NO to
  434. * get only address currently used
  435. * @param infocb callback to call with the addresses,
  436. * will callback with address == NULL when done
  437. * @param infocb_cls closure for @a infocb
  438. * @return ats performance context
  439. */
  440. struct GNUNET_ATS_AddressListHandle *
  441. GNUNET_ATS_performance_list_addresses (struct GNUNET_ATS_PerformanceHandle *handle,
  442. const struct GNUNET_PeerIdentity *peer,
  443. int all,
  444. GNUNET_ATS_AddressInformationCallback infocb,
  445. void *infocb_cls);
  446. /**
  447. * Cancel a pending address listing operation
  448. *
  449. * @param handle the `struct GNUNET_ATS_AddressListHandle` handle to cancel
  450. */
  451. void
  452. GNUNET_ATS_performance_list_addresses_cancel (struct GNUNET_ATS_AddressListHandle *handle);
  453. /**
  454. * Client is done using the ATS performance subsystem, release resources.
  455. *
  456. * @param ph handle
  457. */
  458. void
  459. GNUNET_ATS_performance_done (struct GNUNET_ATS_PerformanceHandle *ph);
  460. /**
  461. * Function called with reservation result.
  462. *
  463. * @param cls closure
  464. * @param peer identifies the peer
  465. * @param amount set to the amount that was actually reserved or unreserved;
  466. * either the full requested amount or zero (no partial reservations)
  467. * @param res_delay if the reservation could not be satisfied (amount was 0), how
  468. * long should the client wait until re-trying?
  469. */
  470. typedef void
  471. (*GNUNET_ATS_ReservationCallback) (void *cls,
  472. const struct GNUNET_PeerIdentity *peer,
  473. int32_t amount,
  474. struct GNUNET_TIME_Relative res_delay);
  475. /**
  476. * Context that can be used to cancel a peer information request.
  477. */
  478. struct GNUNET_ATS_ReservationContext;
  479. /**
  480. * Reserve inbound bandwidth from the given peer. ATS will look at
  481. * the current amount of traffic we receive from the peer and ensure
  482. * that the peer could add 'amount' of data to its stream.
  483. *
  484. * @param ph performance handle
  485. * @param peer identifies the peer
  486. * @param amount reserve N bytes for receiving, negative
  487. * amounts can be used to undo a (recent) reservation;
  488. * @param rcb function to call with the resulting reservation information
  489. * @param rcb_cls closure for @a rcb
  490. * @return NULL on error
  491. * @deprecated will be replaced soon
  492. */
  493. struct GNUNET_ATS_ReservationContext *
  494. GNUNET_ATS_reserve_bandwidth (struct GNUNET_ATS_PerformanceHandle *ph,
  495. const struct GNUNET_PeerIdentity *peer,
  496. int32_t amount,
  497. GNUNET_ATS_ReservationCallback rcb,
  498. void *rcb_cls);
  499. /**
  500. * Cancel request for reserving bandwidth.
  501. *
  502. * @param rc context returned by the original GNUNET_ATS_reserve_bandwidth call
  503. */
  504. void
  505. GNUNET_ATS_reserve_bandwidth_cancel (struct GNUNET_ATS_ReservationContext *rc);
  506. /**
  507. * ATS preference types as array initializer
  508. */
  509. #define GNUNET_ATS_PreferenceType {GNUNET_ATS_PREFERENCE_END, GNUNET_ATS_PREFERENCE_BANDWIDTH, GNUNET_ATS_PREFERENCE_LATENCY}
  510. /**
  511. * ATS preference types as string array initializer
  512. */
  513. #define GNUNET_ATS_PreferenceTypeString {"BANDWIDTH", "LATENCY", "END" }
  514. /**
  515. * Enum defining all known preference categories.
  516. */
  517. enum GNUNET_ATS_PreferenceKind
  518. {
  519. /**
  520. * Change the peer's bandwidth value (value per byte of bandwidth in
  521. * the goal function) to the given amount. The argument is followed
  522. * by a double value giving the desired value (can be negative).
  523. * Preference changes are forgotten if peers disconnect.
  524. */
  525. GNUNET_ATS_PREFERENCE_BANDWIDTH = 0,
  526. /**
  527. * Change the peer's latency value to the given amount. The
  528. * argument is followed by a double value giving the desired value
  529. * (can be negative). The absolute score in the goal function is
  530. * the inverse of the latency in microseconds (minimum: 1
  531. * microsecond) multiplied by the latency preferences.
  532. */
  533. GNUNET_ATS_PREFERENCE_LATENCY = 1,
  534. /**
  535. * End of preference list.
  536. */
  537. GNUNET_ATS_PREFERENCE_END = 2
  538. };
  539. /**
  540. * Convert a GNUNET_ATS_PreferenceType to a string
  541. *
  542. * @param type the preference type
  543. * @return a string or NULL if invalid
  544. */
  545. const char *
  546. GNUNET_ATS_print_preference_type (enum GNUNET_ATS_PreferenceKind type);
  547. /**
  548. * Change preferences for the given peer. Preference changes are forgotten if peers
  549. * disconnect.
  550. *
  551. * @param ph performance handle @param peer identifies the peer
  552. * @param ... #GNUNET_ATS_PREFERENCE_END-terminated specification of the
  553. * desired changes
  554. */
  555. void
  556. GNUNET_ATS_performance_change_preference (struct GNUNET_ATS_PerformanceHandle *ph,
  557. const struct GNUNET_PeerIdentity *peer,
  558. ...);
  559. /**
  560. * Application feedback on how good preference requirements are fulfilled
  561. * for the preferences included in the given time scope [now - scope .. now]
  562. *
  563. * An application notifies ATS if (and only if) it has feedback information
  564. * for specific properties. This values are valid until the feedback scores are
  565. * updated by the application.
  566. *
  567. * If the application has no feedback for this preference kind the application
  568. * will not explicitly call for this property and will not include it in this
  569. * function call.
  570. *
  571. * @param ph performance handle
  572. * @param scope the time interval this valid for: [now - scope .. now]
  573. * @param peer identifies the peer
  574. * @param ... #GNUNET_ATS_PREFERENCE_END-terminated specification of the desired changes
  575. */
  576. void
  577. GNUNET_ATS_performance_give_feedback (struct GNUNET_ATS_PerformanceHandle *ph,
  578. const struct GNUNET_PeerIdentity *peer,
  579. const struct GNUNET_TIME_Relative scope,
  580. ...);
  581. #endif
  582. /* end of file gnunet-service-transport_ats.h */