ats service address management More...
#include "gnunet_util_lib.h"
#include "gnunet_ats_service.h"
#include "gnunet-service-ats.h"
#include "ats.h"
Go to the source code of this file.
Data Structures | |
struct | GAS_NormalizationInfo |
Information provided by ATS normalization. More... | |
struct | ATS_Address |
Address with additional information. More... | |
Macros | |
#define | ATS_BLOCKING_DELTA |
NOTE: Do not change this documentation. More... | |
Typedefs | |
typedef void(* | GNUNET_ATS_PeerInfo_Iterator) (void *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_Properties *prop, enum GNUNET_HELLO_AddressInfo local_address_info, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) |
Iterator for GAS_addresses_get_peer_info() More... | |
Functions | |
void | GAS_addresses_init (void) |
Initialize address subsystem. More... | |
void | GAS_addresses_done (void) |
Shutdown address subsystem. More... | |
void | GAS_addresses_add (const struct GNUNET_PeerIdentity *peer, 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_Properties *prop) |
Add a new address for a peer. More... | |
void | GAS_addresses_update (const struct GNUNET_PeerIdentity *peer, uint32_t session_id, const struct GNUNET_ATS_Properties *prop) |
Update an address with new performance information for a peer. More... | |
void | GAS_addresses_destroy (const struct GNUNET_PeerIdentity *peer, uint32_t session_id) |
Remove an address for a peer. More... | |
void | GAS_addresses_destroy_all (void) |
Remove all addresses. More... | |
void | GAS_addresses_get_peer_info (const struct GNUNET_PeerIdentity *peer, GNUNET_ATS_PeerInfo_Iterator pi_it, void *pi_it_cls) |
Return information all peers currently known to ATS. More... | |
void | GAS_handle_request_address_list (struct GNUNET_SERVICE_Client *client, const struct AddressListRequestMessage *alrm) |
Handle 'address list request' messages from clients. More... | |
Variables | |
struct GNUNET_CONTAINER_MultiPeerMap * | GSA_addresses |
A multipeermap mapping peer identities to struct ATS_Address . More... | |
ats service address management
Definition in file gnunet-service-ats_addresses.h.
#define ATS_BLOCKING_DELTA |
NOTE: Do not change this documentation.
This documentation is based on gnunet.org:/vcs/fsnsg/ats-paper.git/tech-doku/ats-tech-guide.tex use build_txt.sh to generate plaintext output
1 ATS addresses : ATS address management
This ATS addresses ("addresses") component manages the addresses known to ATS service and suggests addresses to transport service when it is interested in address suggestion for a peer. ATS addresses also instantiates the bandwidth assignment mechanism (solver), notifies it about changes to addresses and forwards changes to bandwidth assignments to transport, depending if transport is interested in this change.
1.1 Input data
1.1.1 Addresses
Addresses are added by specifying peer ID, plugin, address, address length and session, if available. ATS information can be specified if available.
1.1.2 Networks
ATS specifies a fix set of networks an address can belong to. For each network an inbound and outbound quota will be specified. The available networks and additional helper variables are defined in gnunet_ats_service.h. At the moment 5 networks are defined:
The total number of networks defined is stored in GNUNET_NT_COUNT GNUNET_ATS_NetworkType can be used array initializer for an int array, while GNUNET_ATS_NetworkType is an initializer for a char array containing a string description of all networks
1.1.3 Quotas
An inbound and outbound quota for each of the networks mentioned in 1.1.2 is loaded from ats configuration during initialization. This quota defines to total amount of inbound and outbound traffic allowed for a specific network. The configuration values used are in section ats:
You can specify quotas by setting the
to a:
unlimited is defined as GNUNET_ATS_MaxBandwidthString and equivalent to the value GNUNET_ATS_MaxBandwidth Important predefined values for quotas are:
Details of loading quotas and default values will be described on
1.1.4 Preference values
1.2 Data structures used
Addresse uses struct ATS_Address for each address. The structs are stored in a linked list and provides a pointer void *solver_information for the solver to store address specific information. It provides the int values active which is set to GNUNET_YES if the address is select for transport use and used, representing that transport service is actively using this address. Address information are stored in peer, addr, addr_len, plugin.
1.3 Initialization
During initialization a hashmap to store addresses is created. The quotas for all networks defined for ATS are loaded from configuration. For each network first the logic will check if the string GNUNET_ATS_MaxBandwidthString is configured, if not it will try to convert the configured value as a fancy size and if this fails it will try to use 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_PROPORTIONAL, MODE_MLP. Interaction is done using a solver API
1.4 Solver API
Solver functions:
Callbacks: addresses provides a bandwidth_changed_cb callback to the solver which is called when bandwidth assigned to peer has changed
1.5 Shutdown
During shutdown all addresses are freed and the solver told to shutdown
1.6 Addresses and sessions
Addresses consist of the address itself and a numerical session. When a new address without a session is added it has no session, so it gets session 0 assigned. When an address with a session is added and an address object with session 0 is found, this object is updated with the session otherwise a new address object with this session assigned is created.
1.6.1 Terminology
Addresses a1,a2 with session s1, s2 are "exact" if: (a1 == a2)&&(s1 == s2) Addresses a1,a2 with session s1, s2 are "equivalent" if: (a1 == a2)&&((s1 == s2)||(s1 == 0)||(s2 == 0)
1.7 Address management
Transport service notifies ATS about changes to the addresses known to it.
1.7.1 Adding an address
When transport learns a new address it tells ATS and ATS is telling addresses about it using GAS_address_add. If not known to addresses it creates a new address object and calls solver's s_add. ATS information are deserialized and solver is notified about the session and ATS information using s_update.
1.7.2 Updating an address
Addresses does an lookup up for the existing address with the given session. If disassembles included ATS information and notifies the solver using s_update about the update.
1.7.3 Deleting an address
Addresses does an lookup for the exact address and session and if removes this address. If session != 0 the session is set to 0 and the address is kept. If session == 0, the addresses is removed.
1.7.4 Requesting an address suggestion
The address client issues a request address message to be notified about address suggestions for a specific peer. Addresses asks the solver with s_get. If no address is available, it will not send a response, otherwise it will respond with the chosen address.
1.7.5 Address suggestions
Addresses will notify the client automatically on any bandwidth_changed_cb by the solver if a address suggestion request is pending. If no address is available it will not respond at all If the client is not interested anymore, it has to cancel the address suggestion request.
1.7.6 Suggestions blocks and reset
After suggesting an address it is blocked for ATS_BLOCKING_DELTA sec. to prevent the client from being thrashed. If the client requires immediately it can reset this block using GAS_addresses_handle_backoff_reset.
1.7.7 Address lifecycle
1.8 Bandwidth assignment
The addresses are used to perform resource allocation operations. ATS addresses takes care of instantiating the solver configured and notifies the respective solver about address changes and receives changes to the bandwidth assignment from the solver. The current bandwidth assignment is sent to transport. The specific solvers will be described in the specific section.
1.9 Changing peer preferences
The bandwidth assigned to a peer can be influenced by setting a preference for a peer. The preference will be given to to the solver with s_pref which has to take care of the preference value
Definition at line 224 of file gnunet-service-ats_addresses.h.
typedef void(* GNUNET_ATS_PeerInfo_Iterator) (void *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_Properties *prop, enum GNUNET_HELLO_AddressInfo local_address_info, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) |
Iterator for GAS_addresses_get_peer_info()
cls | closure |
id | the peer id |
plugin_name | plugin name |
plugin_addr | address |
plugin_addr_len | length of plugin_addr |
address_active | is address actively used |
atsi | ats performance information |
local_address_info | flags for the address |
bandwidth_out | current outbound bandwidth assigned to address |
bandwidth_in | current inbound bandwidth assigned to address |
Definition at line 448 of file gnunet-service-ats_addresses.h.
void GAS_addresses_init | ( | void | ) |
Initialize address subsystem.
The addresses subsystem manages the addresses known and current performance information.
The addresses subsystem manages the addresses known and current performance information. It has a solver component responsible for the resource allocation. It tells the solver about changes and receives updates when the solver changes the resource allocation.
Definition at line 337 of file gnunet-service-ats_addresses.c.
References GNUNET_CONTAINER_multipeermap_create(), GNUNET_NO, GSA_addresses, and update_addresses_stat().
Referenced by run().
void GAS_addresses_done | ( | void | ) |
Shutdown address subsystem.
Definition at line 391 of file gnunet-service-ats_addresses.c.
References GAS_addresses_destroy_all(), GAS_plugin_solver_lock(), GAS_plugin_solver_unlock(), GNUNET_CONTAINER_multipeermap_destroy(), GNUNET_ERROR_TYPE_INFO, GNUNET_log, and GSA_addresses.
Referenced by cleanup_task(), and run().
void GAS_addresses_add | ( | const struct GNUNET_PeerIdentity * | peer, |
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_Properties * | prop | ||
) |
Add a new address for a peer.
peer | peer |
plugin_name | transport plugin name |
plugin_addr | plugin address |
plugin_addr_len | length of the plugin_addr |
local_address_info | the local address for the address |
session_id | session id, can never be 0. |
prop | performance information for this address |
Definition at line 200 of file gnunet-service-ats_addresses.c.
References ATS_Address::active, ATS_Address::addr, ATS_Address::addr_len, ATS_Address::assigned_bw_in, ATS_Address::assigned_bw_out, create_address(), find_exact_address(), GAS_normalization_update_property(), GAS_performance_notify_all_clients(), GAS_plugin_new_address(), GAS_plugin_solver_lock(), GAS_plugin_solver_unlock(), GNUNET_assert, GNUNET_BANDWIDTH_value_init(), GNUNET_break, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE, GNUNET_CONTAINER_multipeermap_put(), GNUNET_ERROR_TYPE_INFO, GNUNET_i2s(), GNUNET_log, GNUNET_NT_UNSPECIFIED, GNUNET_OK, GNUNET_TIME_absolute_get(), GSA_addresses, ATS_Address::local_address_info, ATS_Address::peer, peer, ATS_Address::plugin, plugin_name, ATS_Address::properties, GNUNET_ATS_Properties::scope, session_id, ATS_Address::t_added, ATS_Address::t_last_activity, and update_addresses_stat().
Referenced by GAS_handle_address_add().
void GAS_addresses_update | ( | const struct GNUNET_PeerIdentity * | peer, |
uint32_t | session_id, | ||
const struct GNUNET_ATS_Properties * | prop | ||
) |
Update an address with new performance information for a peer.
peer | peer |
session_id | session id, can never be 0 |
prop | performance information for this address |
Definition at line 258 of file gnunet-service-ats_addresses.c.
References ATS_Address::active, ATS_Address::addr, ATS_Address::addr_len, ATS_Address::assigned_bw_in, ATS_Address::assigned_bw_out, find_exact_address(), GAS_normalization_update_property(), GAS_performance_notify_all_clients(), GNUNET_BANDWIDTH_value_init(), GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, GNUNET_NT_UNSPECIFIED, GNUNET_TIME_absolute_get(), ATS_Address::local_address_info, ATS_Address::peer, peer, ATS_Address::plugin, ATS_Address::properties, GNUNET_ATS_Properties::scope, session_id, ATS_Address::solver_information, and ATS_Address::t_last_activity.
Referenced by GAS_handle_address_update().
void GAS_addresses_destroy | ( | const struct GNUNET_PeerIdentity * | peer, |
uint32_t | session_id | ||
) |
Remove an address for a peer.
peer | peer |
session_id | session id, can never be 0 |
Definition at line 309 of file gnunet-service-ats_addresses.c.
References find_exact_address(), free_address(), GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, peer, and session_id.
Referenced by GAS_handle_address_destroyed().
void GAS_addresses_destroy_all | ( | void | ) |
Remove all addresses.
Definition at line 370 of file gnunet-service-ats_addresses.c.
References destroy_all_address_it(), GAS_plugin_solver_lock(), GAS_plugin_solver_unlock(), GNUNET_CONTAINER_multipeermap_iterate(), GNUNET_CONTAINER_multipeermap_size(), GNUNET_ERROR_TYPE_INFO, GNUNET_log, and GSA_addresses.
Referenced by GAS_addresses_done(), and GAS_scheduling_remove_client().
void GAS_addresses_get_peer_info | ( | const struct GNUNET_PeerIdentity * | peer, |
GNUNET_ATS_PeerInfo_Iterator | pi_it, | ||
void * | pi_it_cls | ||
) |
Return information all peers currently known to ATS.
peer | the respective peer, NULL for 'all' peers |
pi_it | the iterator to call for every peer |
pi_it_cls | the closure for pi_it |
Definition at line 451 of file gnunet-service-ats_addresses.c.
References GNUNET_BANDWIDTH_ZERO, GNUNET_break, GNUNET_CONTAINER_multipeermap_get_multiple(), GNUNET_CONTAINER_multipeermap_iterate(), GNUNET_CONTAINER_multipeermap_size(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_HELLO_ADDRESS_INFO_NONE, GNUNET_i2s(), GNUNET_log, GNUNET_NO, GSA_addresses, PeerInfoIteratorContext::it, PeerInfoIteratorContext::it_cls, peer, and peerinfo_it().
Referenced by GAS_handle_request_address_list(), and GAS_performance_add_client().
void GAS_handle_request_address_list | ( | struct GNUNET_SERVICE_Client * | client, |
const struct AddressListRequestMessage * | alrm | ||
) |
Handle 'address list request' messages from clients.
client | client that sent the request |
alrm | the request message |
Definition at line 644 of file gnunet-service-ats_addresses.c.
References ai, AddressListRequestMessage::all, GAS_addresses_get_peer_info(), GNUNET_BANDWIDTH_ZERO, GNUNET_ERROR_TYPE_DEBUG, GNUNET_HELLO_ADDRESS_INFO_NONE, GNUNET_is_zero, GNUNET_log, GNUNET_NO, GNUNET_YES, AddressListRequestMessage::id, AddressListRequestMessage::peer, req_addr_peerinfo_it(), and transmit_req_addr().
Referenced by handle_request_address_list().
|
extern |
A multipeermap mapping peer identities to struct ATS_Address
.
A multipeermap mapping peer identities to struct ATS_Address
.
Definition at line 37 of file gnunet-service-ats_addresses.c.
Referenced by find_exact_address(), free_address(), GAS_addresses_add(), GAS_addresses_destroy_all(), GAS_addresses_done(), GAS_addresses_get_peer_info(), GAS_addresses_init(), GAS_normalization_update_property(), GAS_plugin_init(), handle_feedback(), and update_addresses_stat().