X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fats%2Fgnunet-service-ats_addresses.h;h=7ed609eaf392e83ea1fdaf220f72aa70451ef143;hb=acac80b2c2b5cf432e903350a0dc6bbaa5ee877c;hp=5e713883b70124670092ceb0ab49c3efb25bf62c;hpb=4c385751ebc2918e91726ed3871bbf38d06271de;p=oweals%2Fgnunet.git diff --git a/src/ats/gnunet-service-ats_addresses.h b/src/ats/gnunet-service-ats_addresses.h index 5e713883b..7ed609eaf 100644 --- a/src/ats/gnunet-service-ats_addresses.h +++ b/src/ats/gnunet-service-ats_addresses.h @@ -1,22 +1,22 @@ /* - This file is part of GNUnet. - (C) 2011 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. -*/ + This file is part of GNUnet. + (C) 2011-2014 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 ats/gnunet-service-ats_addresses.h @@ -29,6 +29,7 @@ #include "gnunet_util_lib.h" #include "gnunet_ats_service.h" +#include "gnunet-service-ats.h" #include "gnunet_statistics_service.h" #include "ats.h" @@ -115,7 +116,7 @@ * it as a value_number. If no configuration value is found it will assign * GNUNET_ATS_DefaultBandwidth. The most important step is to load the * configured solver using configuration "[ats]:MODE". Current solvers are - * MODE_SIMPLISTIC, MODE_MLP. Interaction is done using a solver API + * MODE_PROPORTIONAL, MODE_MLP. Interaction is done using a solver API * * 1.4 Solver API * @@ -224,13 +225,67 @@ */ +/** + * Available ressource assignment modes + */ +enum ATS_Mode +{ + /* + * proportional mode: + * + * Assign each peer an equal amount of bandwidth (bw) + * + * bw_per_peer = bw_total / #active addresses + */ + MODE_PROPORTIONAL, + + /* + * MLP mode: + * + * Solve ressource assignment as an optimization problem + * Uses an mixed integer programming solver + */ + MODE_MLP, + + /* + * Reinforcement Learning mode: + * + * Solve resource assignment using a learning agent + */ + MODE_RIL +}; + /* * How long will address suggestions blocked after a suggestion */ #define ATS_BLOCKING_DELTA GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 100) -struct GAS_Addresses_Handle; +/** + * Information provided by ATS normalization + */ +struct GAS_NormalizationInfo +{ + /** + * Next index to use in averaging queue + */ + unsigned int avg_queue_index; + + /** + * Averaging queue + */ + uint32_t atsi_abs[GAS_normalization_queue_length]; + + /** + * Averaged ATSI values from queue + */ + uint32_t avg; + + /** + * Normalized values from queue to a range of values [1.0...2.0] + */ + double norm; +}; /** * Address with additional information @@ -257,6 +312,11 @@ struct ATS_Address */ uint32_t session_id; + /** + * FIXME + */ + uint32_t local_address_info; + /** * Address */ @@ -287,32 +347,6 @@ struct ATS_Address */ uint32_t atsi_count; -#if 0 - /* CHECK USAGE */ - struct GNUNET_TIME_Relative atsp_latency; - - /* CHECK USAGE */ - struct GNUNET_BANDWIDTH_Value32NBO atsp_utilization_in; - - /* CHECK USAGE */ - struct GNUNET_BANDWIDTH_Value32NBO atsp_utilization_out; - - - /* CHECK USAGE */ - uint32_t atsp_distance; - - /* CHECK USAGE */ - uint32_t atsp_cost_wan; - - /* CHECK USAGE */ - uint32_t atsp_cost_lan; - - /* CHECK USAGE */ - uint32_t atsp_cost_wlan; - - /* CHECK USAGE */ - uint32_t atsp_network_type; -#endif /** * Inbound bandwidth assigned by solver in NBO */ @@ -333,6 +367,16 @@ struct ATS_Address */ struct GNUNET_TIME_Absolute blocked_until; + /** + * Time when address had last activity (update, in uses) + */ + struct GNUNET_TIME_Absolute t_last_activity; + + /** + * Time when address was added + */ + struct GNUNET_TIME_Absolute t_added; + /** * Is this the active address for this peer? */ @@ -342,158 +386,19 @@ struct ATS_Address * Is this the address for this peer in use? */ int used; -}; - - -/** - * 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); - -/* - * Solver API - * ---------- - */ - -/** - * Init the simplistic problem solving component - * - * Quotas: - * network[i] contains the network type as type GNUNET_ATS_NetworkType[i] - * out_quota[i] contains outbound quota for network type i - * in_quota[i] contains inbound quota for network type i - * - * Example - * network = {GNUNET_ATS_NET_UNSPECIFIED, GNUNET_ATS_NET_LOOPBACK, GNUNET_ATS_NET_LAN, GNUNET_ATS_NET_WAN, GNUNET_ATS_NET_WLAN} - * network[2] == GNUNET_ATS_NET_LAN - * out_quota[2] == 65353 - * in_quota[2] == 65353 - * - * @param cfg configuration handle - * @param stats the GNUNET_STATISTICS handle - * @param network array of GNUNET_ATS_NetworkType with length dest_length - * @param out_quota array of outbound quotas - * @param in_quota array of outbound quota - * @param bw_changed_cb callback to call when assigned changes - * @return handle for the solver on success, NULL on fail - */ -typedef void * - (*GAS_solver_init) (const struct GNUNET_CONFIGURATION_Handle *cfg, - const struct GNUNET_STATISTICS_Handle *stats, - int *network, - unsigned long long *out_quota, - unsigned long long *in_quota, - int dest_length, - GAS_bandwidth_changed_cb bw_changed_cb, - void *bw_changed_cb_cls); - - -/** - * 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, - struct GNUNET_CONTAINER_MultiHashMap *addresses, - const struct GNUNET_PeerIdentity *peer, - enum GNUNET_ATS_PreferenceKind kind, - double pref_rel); - -/** - * 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 GNUNET_CONTAINER_MultiHashMap *addresses, - 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 GNUNET_CONTAINER_MultiHashMap *addresses, - struct ATS_Address *address, - int session_only); - -/** - * Notify the solver about an update for an address - * - * @param solver the solver to use - * @param addresses the address hashmap containing all addresses - * @param address the address - * @param session the previous session - * @param in_use previous address used state: yes or no - * @param atsi ats previous performance information - * @param atsi_count previous number of ats performance information - * - */ -typedef void -(*GAS_solver_address_update) (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, - struct ATS_Address *address, - uint32_t prev_session, - int in_use, - const struct GNUNET_ATS_Information *prev_atsi, - uint32_t prev_atsi_count); - - -/** - * 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, - struct GNUNET_CONTAINER_MultiHashMap *addresses, - const struct GNUNET_PeerIdentity *peer); + /** + * Normalized ATS performance information for this address + * Each entry can be accessed using the GNUNET_ATS_QualityProperties avg_queue_index + */ + struct GAS_NormalizationInfo atsin[GNUNET_ATS_QualityPropertiesCount]; +}; -/** - * 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, - struct GNUNET_CONTAINER_MultiHashMap *addresses, - const struct GNUNET_PeerIdentity *peer); /** - * Shutdown solver - * - * @param solver the solver to shutdown + * Handle for ATS address component */ - -typedef void - (*GAS_solver_done) (void *solver); - +struct GAS_Addresses_Handle; /** * Initialize address subsystem. The addresses subsystem manages the addresses @@ -527,9 +432,10 @@ GAS_addresses_done (struct GAS_Addresses_Handle *handle); * @param plugin_name transport plugin name * @param plugin_addr plugin address * @param plugin_addr_len length of the plugin address + * @param local_address_info the local address for the address * @param session_id session id, can be 0 * @param atsi performance information for this address - * @param atsi_count number of performance information contained + * @param atsi_count number of performance information contained in @a atsi */ void GAS_addresses_add (struct GAS_Addresses_Handle *handle, @@ -537,6 +443,7 @@ GAS_addresses_add (struct GAS_Addresses_Handle *handle, const char *plugin_name, const void *plugin_addr, size_t plugin_addr_len, + uint32_t local_address_info, uint32_t session_id, const struct GNUNET_ATS_Information *atsi, uint32_t atsi_count); @@ -544,22 +451,23 @@ GAS_addresses_add (struct GAS_Addresses_Handle *handle, /** * Notification about active use of an address. - * in_use == GNUNET_YES: + * in_use == #GNUNET_YES: * This address is used to maintain an active connection with a peer. - * in_use == GNUNET_NO: + * in_use == #GNUNET_NO: * This address is no longer used to maintain an active connection with a peer. * - * Note: can only be called with in_use == GNUNET_NO if called with GNUNET_YES + * Note: can only be called with in_use == #GNUNET_NO if called with #GNUNET_YES * before * * @param handle the address handle to use * @param peer peer * @param plugin_name transport plugin name * @param plugin_addr plugin address - * @param plugin_addr_len length of the plugin address + * @param plugin_addr_len length of the plugin address in @a plugin_addr + * @param local_address_info the local address for the address * @param session_id session id, can be 0 - * @param in_use GNUNET_YES if GNUNET_NO - * @return GNUNET_SYSERR on failure (address unknown ...) + * @param in_use #GNUNET_YES if #GNUNET_NO FIXME + * @return #GNUNET_SYSERR on failure (address unknown ...) */ int GAS_addresses_in_use (struct GAS_Addresses_Handle *handle, @@ -567,6 +475,7 @@ GAS_addresses_in_use (struct GAS_Addresses_Handle *handle, const char *plugin_name, const void *plugin_addr, size_t plugin_addr_len, + uint32_t local_address_info, uint32_t session_id, int in_use); @@ -582,9 +491,10 @@ GAS_addresses_in_use (struct GAS_Addresses_Handle *handle, * @param plugin_name transport plugin name * @param plugin_addr plugin address * @param plugin_addr_len length of the plugin address + * @param local_address_info the local address for the address * @param session_id session id, can be 0 * @param atsi performance information for this address - * @param atsi_count number of performance information contained + * @param atsi_count number of performance information contained in @a atsi */ void GAS_addresses_update (struct GAS_Addresses_Handle *handle, @@ -592,6 +502,7 @@ GAS_addresses_update (struct GAS_Addresses_Handle *handle, const char *plugin_name, const void *plugin_addr, size_t plugin_addr_len, + uint32_t local_address_info, uint32_t session_id, const struct GNUNET_ATS_Information *atsi, uint32_t atsi_count); @@ -604,8 +515,9 @@ GAS_addresses_update (struct GAS_Addresses_Handle *handle, * @param peer peer * @param plugin_name transport plugin name * @param plugin_addr plugin address - * @param plugin_addr_len length of the plugin address + * @param plugin_addr_len length of the plugin address in @a plugin_addr * @param session_id session id, can be 0 + * @param local_address_info the local address for the address */ void GAS_addresses_destroy (struct GAS_Addresses_Handle *handle, @@ -613,6 +525,7 @@ GAS_addresses_destroy (struct GAS_Addresses_Handle *handle, const char *plugin_name, const void *plugin_addr, size_t plugin_addr_len, + uint32_t local_address_info, uint32_t session_id); @@ -635,6 +548,7 @@ void GAS_addresses_request_address (struct GAS_Addresses_Handle *handle, const struct GNUNET_PeerIdentity *peer); + /** * Cancel address suggestions for a peer * @@ -660,6 +574,17 @@ GAS_addresses_handle_backoff_reset (struct GAS_Addresses_Handle *handle, const struct GNUNET_PeerIdentity *peer); +/** + * A performance client disconnected + * + * @param handle address handle + * @param client the client + */ +void +GAS_addresses_preference_client_disconnect (struct GAS_Addresses_Handle *handle, + void *client); + + /** * Change the preference for a peer * @@ -670,7 +595,7 @@ GAS_addresses_handle_backoff_reset (struct GAS_Addresses_Handle *handle, * @param score_abs the new preference score */ void -GAS_addresses_change_preference (struct GAS_Addresses_Handle *handle, +GAS_addresses_preference_change (struct GAS_Addresses_Handle *handle, void *client, const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind, @@ -678,13 +603,41 @@ GAS_addresses_change_preference (struct GAS_Addresses_Handle *handle, /** - * Iterator for GAS_addresses_iterate_peers + * Application feedback on how good preference requirements are fulfilled + * for a specific preference in the given time scope [now - scope .. now] + * + * An application notifies ATS if (and only if) it has feedback information + * for a specific property. This value is valid until the feedback score is + * updated by the application. + * + * If the application has no feedback for this preference kind the application + * will not explicitly call. + * + * @param handle the address handle + * @param application the application sending this request + * @param peer the peer id + * @param scope the time interval this valid for: [now - scope .. now] + * @param kind the preference kind this feedback is intended for + * @param score_abs the new preference score + */ +void +GAS_addresses_preference_feedback (struct GAS_Addresses_Handle *handle, + void *application, + const struct GNUNET_PeerIdentity *peer, + const struct GNUNET_TIME_Relative scope, + enum GNUNET_ATS_PreferenceKind kind, + float score_abs); + + +/** + * Iterator for #GAS_addresses_iterate_peers() * * @param p_it_cls closure * @param id the peer id */ -typedef void (*GNUNET_ATS_Peer_Iterator) (void *p_it_cls, - const struct GNUNET_PeerIdentity *id); +typedef void +(*GNUNET_ATS_Peer_Iterator) (void *p_it_cls, + const struct GNUNET_PeerIdentity *id); /** @@ -692,7 +645,7 @@ typedef void (*GNUNET_ATS_Peer_Iterator) (void *p_it_cls, * * @param handle the address handle to use * @param p_it the iterator to call for every peer - * @param p_it_cls the closure for the iterator + * @param p_it_cls the closure for @a p_it */ void GAS_addresses_iterate_peers (struct GAS_Addresses_Handle *handle, @@ -701,29 +654,30 @@ GAS_addresses_iterate_peers (struct GAS_Addresses_Handle *handle, /** - * Iterator for GAS_addresses_get_peer_info + * Iterator for #GAS_addresses_get_peer_info() * * @param p_it_cls closure closure * @param id the peer id * @param plugin_name plugin name * @param plugin_addr address - * @param plugin_addr_len address length + * @param plugin_addr_len length of @a plugin_addr * @param address_active is address actively used * @param atsi ats performance information - * @param atsi_count number of ats performance elements + * @param atsi_count number of ats performance elements in @a atsi * @param bandwidth_out current outbound bandwidth assigned to address * @param bandwidth_in current inbound bandwidth assigned to address */ -typedef void (*GNUNET_ATS_PeerInfo_Iterator) (void *p_it_cls, - const struct GNUNET_PeerIdentity *id, - const char *plugin_name, - const void *plugin_addr, - size_t plugin_addr_len, - const int address_active, - const struct GNUNET_ATS_Information *atsi, - uint32_t atsi_count, - struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, - struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in); +typedef void +(*GNUNET_ATS_PeerInfo_Iterator) (void *p_it_cls, + const struct GNUNET_PeerIdentity *id, + const char *plugin_name, + const void *plugin_addr, + size_t plugin_addr_len, + const int address_active, + const struct GNUNET_ATS_Information *atsi, + uint32_t atsi_count, + struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, + struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in); /** @@ -732,7 +686,7 @@ typedef void (*GNUNET_ATS_PeerInfo_Iterator) (void *p_it_cls, * @param handle the address handle to use * @param peer the respective peer * @param pi_it the iterator to call for every peer - * @param pi_it_cls the closure for the iterator + * @param pi_it_cls the closure for @a pi_it */ void GAS_addresses_get_peer_info (struct GAS_Addresses_Handle *handle,