[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r27748 - gnunet/src/ats
From: |
gnunet |
Subject: |
[GNUnet-SVN] r27748 - gnunet/src/ats |
Date: |
Thu, 4 Jul 2013 17:28:00 +0200 |
Author: wachs
Date: 2013-07-04 17:27:59 +0200 (Thu, 04 Jul 2013)
New Revision: 27748
Modified:
gnunet/src/ats/gnunet-service-ats-solver_mlp.c
gnunet/src/ats/gnunet-service-ats-solver_mlp.h
gnunet/src/ats/gnunet-service-ats-solver_proportional.c
gnunet/src/ats/gnunet-service-ats-solver_proportional.h
gnunet/src/ats/gnunet-service-ats_addresses.c
gnunet/src/ats/gnunet-service-ats_addresses.h
gnunet/src/ats/gnunet-service-ats_normalization.c
gnunet/src/ats/gnunet-service-ats_normalization.h
gnunet/src/ats/test_ats_api.conf
Log:
major change to solver api: split _update function since it combined 3
different functionalities
proportional almost done, mlp to do
Modified: gnunet/src/ats/gnunet-service-ats-solver_mlp.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats-solver_mlp.c 2013-07-04 15:25:01 UTC
(rev 27747)
+++ gnunet/src/ats/gnunet-service-ats-solver_mlp.c 2013-07-04 15:27:59 UTC
(rev 27748)
@@ -1401,6 +1401,45 @@
mlp->mlp_prob_updated = GNUNET_YES;
}
+void
+GAS_mlp_address_property_changed (void *solver,
+
struct ATS_Address *address,
+
uint32_t type,
+
uint32_t abs_value,
+
double rel_value)
+{
+ GNUNET_break (0);
+}
+
+
+void
+GAS_mlp_address_session_changed (void *solver,
+
struct ATS_Address *address,
+
uint32_t cur_session,
+
uint32_t new_session)
+{
+ GNUNET_break (0);
+}
+
+void
+GAS_mlp_address_inuse_changed (void *solver,
+
struct ATS_Address *address,
+
uint32_t session,
+
int in_use)
+{
+ GNUNET_break (0);
+}
+
+
+void
+GAS_mlp_address_change_network (void *solver,
+
struct ATS_Address
*address,
+
uint32_t
current_network,
+
uint32_t new_network)
+{
+ GNUNET_break (0);
+}
+
/**
* Updates a single address in the MLP problem
*
@@ -1432,6 +1471,7 @@
struct ATS_Peer *p;
struct GAS_MLP_Handle *mlp = solver;
struct MLP_information *mlpi = address->solver_information;
+ int c1;
GNUNET_assert (NULL != solver);
GNUNET_assert (NULL != address);
@@ -1442,22 +1482,37 @@
LOG (GNUNET_ERROR_TYPE_ERROR, _("Updating address for peer `%s' not
added before\n"), GNUNET_i2s(&address->peer));
return;
}
- mlp_update_quality (mlp, mlp->addresses, address, prev_atsi,
prev_atsi_count);
+ if (address->session_id != prev_session)
+ {
+ /* Session changed */
+
+ }
+ if ((NULL != prev_atsi) && (0 != prev_atsi_count))
+ {
+ /* Properties changed */
+ for (c1 = 0; c1 < prev_atsi_count; c1++ )
+ {
+ LOG (GNUNET_ERROR_TYPE_DEBUG, "Updating `%s'\n",
+ GNUNET_ATS_print_property_type
(ntohl(prev_atsi[c1].type)));
+ //mlp->get_properties (mlp->get_properties_cls );
+ }
+ //mlp_update_quality (mlp, mlp->addresses, address, prev_atsi,
prev_atsi_count);
+ }
+
/* Is this peer included in the problem? */
if (NULL == (p = GNUNET_CONTAINER_multihashmap_get (mlp->requested_peers,
&address->peer.hashPubKey)))
{
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Updating address for peer `%s' without
address request \n", GNUNET_i2s(&address->peer));
+ LOG (GNUNET_ERROR_TYPE_DEBUG, "Updating address for peer `%s' without
address request \n",
+ GNUNET_i2s(&address->peer));
return;
}
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Updating address for peer `%s' with
address request \n", GNUNET_i2s(&address->peer));
-
- /* Problem size changed: new address for peer with pending request */
+ LOG (GNUNET_ERROR_TYPE_DEBUG, "Updating address for peer `%s' with
address request \n",
+ GNUNET_i2s(&address->peer));
mlp->mlp_prob_updated = GNUNET_YES;
if (GNUNET_YES == mlp->mlp_auto_solve)
GAS_mlp_solve_problem (solver);
- return;
}
/**
Modified: gnunet/src/ats/gnunet-service-ats-solver_mlp.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats-solver_mlp.h 2013-07-04 15:25:01 UTC
(rev 27747)
+++ gnunet/src/ats/gnunet-service-ats-solver_mlp.h 2013-07-04 15:27:59 UTC
(rev 27748)
@@ -415,35 +415,32 @@
struct ATS_Address *address,
uint32_t network);
-/**
- * Updates a single address in the MLP problem
- *
- * If the address did not exist before in the problem:
- * The MLP problem has to be recreated and the problem has to be resolved
- *
- * ATS performance information in address are already updated, delta + previous
- * values are included in atsi_prev (value GNUNET_ATS_VALUE_UNDEFINED if not
existing before)
- *
- * Otherwise the addresses' values can be updated and the existing base can
- * be reused
- *
- * @param solver the solver Handle
- * @param addresses the address hashmap containing all addresses
- * @param address the update address
- * @param prev_session the new session (if changed otherwise current)
- * @param prev_in_use the new address in use state (if changed otherwise
current)
- * @param prev_atsi ATS information updated + previous values,
GNUNET_ATS_VALUE_UNDEFINED if not existing before
- * @param prev_atsi_count number of atsi values updated
- */
void
-GAS_mlp_address_update (void *solver,
- struct ATS_Address *address,
- uint32_t prev_session,
- int prev_in_use,
- const struct GNUNET_ATS_Information *prev_atsi,
- uint32_t prev_atsi_count);
+GAS_mlp_address_property_changed (void *solver,
+
struct ATS_Address *address,
+
uint32_t type,
+
uint32_t abs_value,
+
double rel_value);
+void
+GAS_mlp_address_session_changed (void *solver,
+
struct ATS_Address *address,
+
uint32_t cur_session,
+
uint32_t new_session);
+
+void
+GAS_mlp_address_inuse_changed (void *solver,
+
struct ATS_Address *address,
+
uint32_t session,
+
int in_use);
+
+void
+GAS_proportional_address_change_network (void *solver,
+
struct ATS_Address
*address,
+
uint32_t
current_network,
+
uint32_t
new_network);
+
/**
* Deletes a single address in the MLP problem
*
Modified: gnunet/src/ats/gnunet-service-ats-solver_proportional.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats-solver_proportional.c 2013-07-04
15:25:01 UTC (rev 27747)
+++ gnunet/src/ats/gnunet-service-ats-solver_proportional.c 2013-07-04
15:27:59 UTC (rev 27748)
@@ -431,7 +431,6 @@
unsigned long long assigned_quota_out = 0;
struct AddressWrapper *cur;
-
if (GNUNET_YES == s->bulk_lock)
{
s->bulk_requests++;
@@ -556,18 +555,6 @@
}
-/**
- * Extract an ATS performance info from an address
- *
- * @param address the address
- * @param type the type to extract in HBO
- * @return the value in HBO or GNUNET_ATS_VALUE_UNDEFINED in HBO if value does
not exist
- */
-static int
-get_performance_info (struct ATS_Address *address, uint32_t type);
-
-
-
struct FindBestAddressCtx
{
struct GAS_PROPORTIONAL_Handle *s;
@@ -871,31 +858,6 @@
/**
- * Extract an ATS performance info from an address
- *
- * @param address the address
- * @param type the type to extract in HBO
- * @return the value in HBO or GNUNET_ATS_VALUE_UNDEFINED in HBO if value does
not exist
- */
-static int
-get_performance_info (struct ATS_Address *address, uint32_t type)
-{
- int c1;
- GNUNET_assert (NULL != address);
-
- if ((NULL == address->atsi) || (0 == address->atsi_count))
- return GNUNET_ATS_VALUE_UNDEFINED;
-
- for (c1 = 0; c1 < address->atsi_count; c1++)
- {
- if (ntohl(address->atsi[c1].type) == type)
- return ntohl(address->atsi[c1].value);
- }
- return GNUNET_ATS_VALUE_UNDEFINED;
-}
-
-
-/**
* Solver API functions
* ---------------------------
*/
@@ -1146,141 +1108,147 @@
struct ATS_Address *address,
uint32_t network);
-/**
- * Updates a single address in the solver and checks previous values
- *
- * @param solver the solver Handle
- * @param addresses the address hashmap containing all addresses
- * @param address the update address
- * @param session the previous session
- * @param in_use the previous address in use state
- * @param prev_ats previous ATS information
- * @param prev_atsi_count the previous atsi count
- */
+
void
-GAS_proportional_address_update (void *solver,
- struct ATS_Address *address,
- uint32_t session,
- int in_use,
- const struct GNUNET_ATS_Information *prev_ats,
- uint32_t prev_atsi_count)
+GAS_proportional_address_property_changed (void *solver,
+
struct ATS_Address *address,
+
uint32_t type,
+
uint32_t abs_value,
+
double rel_value)
{
+ struct GAS_PROPORTIONAL_Handle *s;
+ struct Network *n;
+
+ GNUNET_assert (NULL != solver);
+ GNUNET_assert (NULL != address);
+
+ s = (struct GAS_PROPORTIONAL_Handle *) solver;
+ n = (struct Network *) address->solver_information;
+
+ if (NULL == n)
+ {
+ GNUNET_break (0);
+ return;
+ }
+
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Property `%s' for peer `%s' address %p changed to %.2f %p %p
%p\n",
+ GNUNET_ATS_print_property_type (type),
+ GNUNET_i2s (&address->peer),
+ address,
+ rel_value, s, n, &distribute_bandwidth_in_network);
+ switch (type)
+ {
+ case GNUNET_ATS_UTILIZATION_UP:
+ case GNUNET_ATS_UTILIZATION_DOWN:
+ case GNUNET_ATS_QUALITY_NET_DELAY:
+ case GNUNET_ATS_QUALITY_NET_DISTANCE:
+ case GNUNET_ATS_COST_WAN:
+ case GNUNET_ATS_COST_LAN:
+ case GNUNET_ATS_COST_WLAN:
+
+ //FIXME distribute_bandwidth_in_network (s, n, GNUNET_NO);
+ break;
+ }
+}
+
+
+void
+GAS_proportional_address_session_changed (void *solver,
+
struct ATS_Address *address,
+
uint32_t cur_session,
+
uint32_t new_session)
+{
+ if (cur_session!= new_session)
+ {
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Session changed from %u to %u\n", cur_session, new_session);
+ }
+}
+
+void
+GAS_proportional_address_inuse_changed (void *solver,
+
struct ATS_Address *address,
+
int in_use)
+{
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Usage changed to %s\n",
+ (GNUNET_YES == in_use)
? "USED" : "UNUSED");
+}
+
+void
+GAS_proportional_address_change_network (void *solver,
+
struct ATS_Address
*address,
+
uint32_t
current_network,
+
uint32_t new_network)
+{
struct ATS_Address *new;
struct GAS_PROPORTIONAL_Handle *s = (struct GAS_PROPORTIONAL_Handle *)
solver;
- int i;
- uint32_t prev_value;
- uint32_t prev_type;
- uint32_t addr_net;
int save_active = GNUNET_NO;
struct Network *new_net = NULL;
- /* Check updates to performance information */
- for (i = 0; i < prev_atsi_count; i++)
+ if (current_network == new_network)
{
- prev_type = ntohl (prev_ats[i].type);
- prev_value = ntohl (prev_ats[i].value);
- switch (prev_type)
- {
- case GNUNET_ATS_UTILIZATION_UP:
- case GNUNET_ATS_UTILIZATION_DOWN:
- case GNUNET_ATS_QUALITY_NET_DELAY:
- case GNUNET_ATS_QUALITY_NET_DISTANCE:
- case GNUNET_ATS_COST_WAN:
- case GNUNET_ATS_COST_LAN:
- case GNUNET_ATS_COST_WLAN:
- /* No actions required here*/
- break;
- case GNUNET_ATS_NETWORK_TYPE:
+ GNUNET_break (0);
+ return;
+ }
- addr_net = get_performance_info (address, GNUNET_ATS_NETWORK_TYPE);
- if (GNUNET_ATS_VALUE_UNDEFINED == addr_net)
- {
- GNUNET_break (0);
- addr_net = GNUNET_ATS_NET_UNSPECIFIED;
- }
- if (addr_net != prev_value)
- {
- /* Network changed */
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Network type changed, moving %s address
from `%s' to `%s'\n",
- (GNUNET_YES == address->active) ? "active" : "inactive",
- GNUNET_ATS_print_network_type(prev_value),
- GNUNET_ATS_print_network_type(addr_net));
+ /* Network changed */
+ LOG (GNUNET_ERROR_TYPE_DEBUG, "Network type changed, moving %s address
from `%s' to `%s'\n",
+ (GNUNET_YES == address->active) ? "active" : "inactive",
+ GNUNET_ATS_print_network_type (current_network),
+ GNUNET_ATS_print_network_type (new_network));
- save_active = address->active;
- /* remove from old network */
- GAS_proportional_address_delete (solver, address, GNUNET_NO);
+ save_active = address->active;
+ /* remove from old network */
+ GAS_proportional_address_delete (solver, address, GNUNET_NO);
- /* set new network type */
- new_net = get_network (solver, addr_net);
- if (NULL == new_net)
- {
- /* Address changed to invalid network... */
- LOG (GNUNET_ERROR_TYPE_ERROR, _("Cannot find network of type `%u'
%s\n"),
- addr_net, GNUNET_ATS_print_network_type (addr_net));
- address->assigned_bw_in = GNUNET_BANDWIDTH_value_init (0);
- address->assigned_bw_out = GNUNET_BANDWIDTH_value_init (0);
- s->bw_changed (s->bw_changed_cls, address);
- return;
- }
- address->solver_information = new_net;
+ /* set new network type */
+ new_net = get_network (solver, new_network);
+ if (NULL == new_net)
+ {
+ /* Address changed to invalid network... */
+ LOG (GNUNET_ERROR_TYPE_ERROR, _("Cannot find network of type
`%u' %s\n"),
+ new_network, GNUNET_ATS_print_network_type
(new_network));
+ address->assigned_bw_in = GNUNET_BANDWIDTH_value_init (0);
+ address->assigned_bw_out = GNUNET_BANDWIDTH_value_init (0);
+ s->bw_changed (s->bw_changed_cls, address);
+ return;
+ }
+ address->solver_information = new_net;
- /* Add to new network and update*/
- GAS_proportional_address_add (solver, address, addr_net);
- if (GNUNET_YES == save_active)
- {
- /* check if bandwidth available in new network */
- if (GNUNET_YES == (is_bandwidth_available_in_network (new_net)))
- {
- /* Suggest updated address */
- address->active = GNUNET_YES;
- addresse_increment (s, new_net, GNUNET_NO, GNUNET_YES);
- distribute_bandwidth_in_network (solver, new_net, NULL);
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Not enough bandwidth in new
network, suggesting alternative address ..\n");
+ /* Add to new network and update*/
+ GAS_proportional_address_add (solver, address, new_network);
+ if (GNUNET_YES == save_active)
+ {
+ /* check if bandwidth available in new network */
+ if (GNUNET_YES == (is_bandwidth_available_in_network (new_net)))
+ {
+ /* Suggest updated address */
+ address->active = GNUNET_YES;
+ addresse_increment (s, new_net, GNUNET_NO,
GNUNET_YES);
+ distribute_bandwidth_in_network (solver,
new_net, NULL);
+ }
+ else
+ {
+ LOG (GNUNET_ERROR_TYPE_DEBUG, "Not enough bandwidth in
new network, suggesting alternative address ..\n");
- /* Set old address to zero bw */
- address->assigned_bw_in = GNUNET_BANDWIDTH_value_init (0);
- address->assigned_bw_out = GNUNET_BANDWIDTH_value_init (0);
- s->bw_changed (s->bw_changed_cls, address);
+ /* Set old address to zero bw */
+ address->assigned_bw_in = GNUNET_BANDWIDTH_value_init
(0);
+ address->assigned_bw_out = GNUNET_BANDWIDTH_value_init
(0);
+ s->bw_changed (s->bw_changed_cls, address);
- /* Find new address to suggest since no bandwidth in network*/
- new = (struct ATS_Address *)
GAS_proportional_get_preferred_address (s, &address->peer);
- if (NULL != new)
- {
- /* Have an alternative address to suggest */
- s->bw_changed (s->bw_changed_cls, new);
- }
- }
- }
- }
- break;
- case GNUNET_ATS_ARRAY_TERMINATOR:
- break;
- default:
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Received unsupported ATS type %u\n", prev_type);
- GNUNET_break (0);
- break;
-
- }
-
+ /* Find new address to suggest since no bandwidth in
network*/
+ new = (struct ATS_Address *)
GAS_proportional_get_preferred_address (s, &address->peer);
+ if (NULL != new)
+ {
+ /* Have an alternative address to
suggest */
+ s->bw_changed (s->bw_changed_cls, new);
+ }
+ }
}
- if (address->session_id != session)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session changed from %u to %u\n", session,
address->session_id);
- }
- if (address->used != in_use)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Usage changed from %u to %u\n", in_use, address->used);
- }
-
}
-
/**
* Add a new single address to a network
*
Modified: gnunet/src/ats/gnunet-service-ats-solver_proportional.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats-solver_proportional.h 2013-07-04
15:25:01 UTC (rev 27747)
+++ gnunet/src/ats/gnunet-service-ats-solver_proportional.h 2013-07-04
15:27:59 UTC (rev 27748)
@@ -114,27 +114,32 @@
struct ATS_Address
*address,
uint32_t network);
+void
+GAS_proportional_address_property_changed (void *solver,
+
struct ATS_Address *address,
+
uint32_t type,
+
uint32_t abs_value,
+
double rel_value);
-/**
- * Updates a single address in the solve
- *
- * @param solver the solver Handle
- * @param addresses the address hashmap containing all addresses
- * @param address the update address
- * @param session the new session (if changed otherwise current)
- * @param in_use the new address in use state (if changed otherwise current)
- * @param prev_ats the latest ATS information
- * @param prev_atsi_count the atsi count
- */
+
void
-GAS_proportional_address_update (void *solver,
- struct ATS_Address *address,
- uint32_t session,
- int in_use,
- const struct GNUNET_ATS_Information *atsi,
- uint32_t atsi_count);
+GAS_proportional_address_session_changed (void *solver,
+
struct ATS_Address *address,
+
uint32_t cur_session,
+
uint32_t new_session);
+void
+GAS_proportional_address_inuse_changed (void *solver,
+
struct ATS_Address *address,
+
uint32_t session,
+
int in_use);
+void
+GAS_proportional_address_change_network (void *solver,
+
struct ATS_Address
*address,
+
uint32_t
current_network,
+
uint32_t
new_network);
+
/**
* Remove an address from the solver
*
@@ -166,7 +171,7 @@
/**
* Stop notifying about address and bandwidth changes for this peer
*
- * @param solver the MLP handle
+ * @param solver the proportional handle
* @param addresses address hashmap
* @param peer the peer
*/
Modified: gnunet/src/ats/gnunet-service-ats_addresses.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses.c 2013-07-04 15:25:01 UTC
(rev 27747)
+++ gnunet/src/ats/gnunet-service-ats_addresses.c 2013-07-04 15:27:59 UTC
(rev 27748)
@@ -338,11 +338,15 @@
*/
GAS_solver_address_add s_add;
- /**
- * Update address in solver
- */
- GAS_solver_address_update s_update;
+ GAS_solver_address_property_changed s_address_update_property;
+
+ GAS_solver_address_session_changed s_address_update_session;
+
+ GAS_solver_address_inuse_changed s_address_update_inuse;
+
+ GAS_solver_address_network_changed s_address_update_network;
+
/**
* Get address from solver
*/
@@ -666,8 +670,7 @@
/**
- * Lookup an ATS address by the address properties and session or return an
- * equivalent address with a session == 0
+ * Find the exact address
*
* @param handle the address handle to use
* @param peer peer
@@ -681,14 +684,12 @@
*/
static struct ATS_Address *
-lookup_address (struct GAS_Addresses_Handle *handle,
+find_exact_address (struct GAS_Addresses_Handle *handle,
const struct GNUNET_PeerIdentity *peer,
const char *plugin_name,
const void *plugin_addr,
size_t plugin_addr_len,
- uint32_t session_id,
- const struct GNUNET_ATS_Information *atsi,
- uint32_t atsi_count)
+ uint32_t session_id)
{
struct ATS_Address *aa;
struct ATS_Address *ea;
@@ -702,13 +703,9 @@
ea = find_equivalent_address (handle, peer, aa);
free_address (aa);
if (ea == NULL)
- {
return NULL;
- }
else if (ea->session_id != session_id)
- {
return NULL;
- }
return ea;
}
@@ -754,16 +751,19 @@
void
GAS_addresses_add (struct GAS_Addresses_Handle *handle,
const struct GNUNET_PeerIdentity *peer,
- const char *plugin_name, const void *plugin_addr,
- size_t plugin_addr_len, uint32_t session_id,
+ const char *plugin_name,
+ const void *plugin_addr,
+ size_t plugin_addr_len,
+ uint32_t session_id,
const struct GNUNET_ATS_Information *atsi,
uint32_t atsi_count)
{
- struct ATS_Address *aa;
- struct ATS_Address *ea;
+ struct ATS_Address *new_address;
+ struct ATS_Address *existing_address;
struct GNUNET_ATS_Information *atsi_delta;
uint32_t atsi_delta_count;
uint32_t addr_net;
+ uint32_t previous_session;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -776,54 +776,55 @@
GNUNET_assert (NULL != handle->addresses);
- aa = create_address (peer, plugin_name, plugin_addr, plugin_addr_len,
+ new_address = create_address (peer, plugin_name, plugin_addr,
plugin_addr_len,
session_id);
atsi_delta = NULL;
- disassemble_ats_information (aa, atsi, atsi_count, &atsi_delta,
&atsi_delta_count);
+ disassemble_ats_information (new_address, atsi, atsi_count, &atsi_delta,
&atsi_delta_count);
GNUNET_free_non_null (atsi_delta);
- addr_net = get_performance_info (aa, GNUNET_ATS_NETWORK_TYPE);
+ addr_net = get_performance_info (new_address, GNUNET_ATS_NETWORK_TYPE);
if (GNUNET_ATS_VALUE_UNDEFINED == addr_net)
addr_net = GNUNET_ATS_NET_UNSPECIFIED;
/* Get existing address or address with session == 0 */
- ea = find_equivalent_address (handle, peer, aa);
- if (ea == NULL)
+ existing_address = find_equivalent_address (handle, peer, new_address);
+ if (existing_address == NULL)
{
- /* We have a new address */
+ /* Add a new address */
GNUNET_assert (GNUNET_OK ==
GNUNET_CONTAINER_multihashmap_put (handle->addresses,
- &peer->hashPubKey, aa,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Added new address for peer `%s'
session id %u, %p\n",
- GNUNET_i2s (peer), session_id, aa);
+ &peer->hashPubKey, new_address,
+ GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding new address for peer `%s'
session id %u, %p\n",
+ GNUNET_i2s (peer), session_id, new_address);
+
/* Tell solver about new address */
+ handle->s_add (handle->solver, new_address, addr_net);
+
handle->s_bulk_start (handle->solver);
- GAS_normalization_normalize_property (handle->addresses, aa, atsi,
atsi_count);
+ GAS_normalization_normalize_property (handle->addresses, new_address,
atsi, atsi_count);
handle->s_bulk_stop (handle->solver);
- handle->s_add (handle->solver, aa, addr_net);
+
/* Notify performance clients about new address */
- GAS_performance_notify_all_clients (&aa->peer,
- aa->plugin,
- aa->addr, aa->addr_len,
- aa->session_id,
- aa->atsi, aa->atsi_count,
- aa->assigned_bw_out,
- aa->assigned_bw_in);
+ GAS_performance_notify_all_clients (&new_address->peer,
+ new_address->plugin,
+ new_address->addr, new_address->addr_len,
+ new_address->session_id,
+ new_address->atsi, new_address->atsi_count,
+ new_address->assigned_bw_out,
+ new_address->assigned_bw_in);
return;
}
- GNUNET_free (aa->plugin);
- GNUNET_free_non_null (aa->atsi);
- GNUNET_free (aa);
- aa = NULL;
+ /* We have an existing address we can use, clean up new */
+ GNUNET_free (new_address->plugin);
+ GNUNET_free_non_null (new_address->atsi);
+ GNUNET_free (new_address);
+ new_address = NULL;
- if (ea->session_id != 0)
+ if (0 != existing_address->session_id)
{
- /* This address with the same session is already existing
- * Should not happen */
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Added already existing address for peer `%s' `%s' %p with new
session %u\n",
- GNUNET_i2s (peer), plugin_name, session_id);
+ /* Should not happen */
GNUNET_break (0);
return;
}
@@ -831,29 +832,33 @@
/* We have an address without an session, update this address */
atsi_delta = NULL;
atsi_delta_count = 0;
- if (GNUNET_YES == disassemble_ats_information (ea, atsi, atsi_count,
&atsi_delta, &atsi_delta_count))
+ if (GNUNET_YES == disassemble_ats_information (existing_address, atsi,
atsi_count, &atsi_delta, &atsi_delta_count))
{
- GAS_performance_notify_all_clients (&ea->peer,
- ea->plugin,
- ea->addr, ea->addr_len,
- ea->session_id,
- ea->atsi, ea->atsi_count,
- ea->assigned_bw_out,
- ea->assigned_bw_in);
+ /* Notify performance clients about properties */
+ GAS_performance_notify_all_clients (&existing_address->peer,
+ existing_address->plugin,
+ existing_address->addr,
existing_address->addr_len,
+ existing_address->session_id,
+ existing_address->atsi,
existing_address->atsi_count,
+ existing_address->assigned_bw_out,
+ existing_address->assigned_bw_in);
+
+ /* Notify solver about update with atsi information and session
*/
+ handle->s_bulk_start (handle->solver);
+ GAS_normalization_normalize_property (handle->addresses,
existing_address, atsi, atsi_count);
+ handle->s_bulk_stop (handle->solver);
}
-
- /* Notify solver about update with atsi information and session */
- handle->s_bulk_start (handle->solver);
- GAS_normalization_normalize_property (handle->addresses, ea, atsi,
atsi_count);
- handle->s_bulk_stop (handle->solver);
- handle->s_update (handle->solver, ea, session_id, ea->used, atsi_delta,
atsi_delta_count);
GNUNET_free_non_null (atsi_delta);
- /* Do the update */
- ea->session_id = session_id;
+ /* Notify solver about new session */
+ previous_session = existing_address->session_id;
+ existing_address->session_id = session_id;
+ handle->s_address_update_session (handle->solver, existing_address,
+ previous_session, session_id);
+
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Updated existing address for peer `%s' %p with new session %u\n",
- GNUNET_i2s (peer), ea, session_id);
+ GNUNET_i2s (peer), existing_address, session_id);
}
@@ -884,6 +889,7 @@
struct GNUNET_ATS_Information *atsi_delta;
uint32_t atsi_delta_count;
uint32_t prev_session;
+ int c1;
if (GNUNET_NO == handle->running)
return;
@@ -891,8 +897,8 @@
GNUNET_assert (NULL != handle->addresses);
/* Get existing address */
- aa = lookup_address (handle, peer, plugin_name, plugin_addr, plugin_addr_len,
- session_id, atsi, atsi_count);
+ aa = find_exact_address (handle, peer, plugin_name,
+
plugin_addr, plugin_addr_len, session_id);
if (aa == NULL)
{
/* GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Tried to update unknown address
for peer `%s' `%s' session id %u\n", */
@@ -914,28 +920,44 @@
GNUNET_i2s (peer), aa);
/* Update address */
+ if (session_id != aa->session_id)
+ {
+ /* Session changed */
+ prev_session = aa->session_id;
+ aa->session_id = session_id;
+ handle->s_address_update_session (handle->solver, aa, prev_session,
aa->session_id);
+ }
+
atsi_delta = NULL;
atsi_delta_count = 0;
if (GNUNET_YES == disassemble_ats_information (aa, atsi, atsi_count,
&atsi_delta, &atsi_delta_count))
{
- /* Notify performance clients about updated address */
- GAS_performance_notify_all_clients (&aa->peer,
- aa->plugin,
- aa->addr, aa->addr_len,
- aa->session_id,
- aa->atsi, aa->atsi_count,
- aa->assigned_bw_out,
- aa->assigned_bw_in);
- }
- prev_session = aa->session_id;
- aa->session_id = session_id;
+ /* ATS properties changed */
- handle->s_bulk_start (handle->solver);
- GAS_normalization_normalize_property (handle->addresses, aa, atsi,
atsi_count);
- handle->s_bulk_stop (handle->solver);
+ for (c1 = 0; c1 < atsi_delta_count; c1++)
+ {
+ if (GNUNET_ATS_NETWORK_TYPE == ntohl (atsi_delta[c1].type))
+ {
+ /* Network type changed */
+ handle->s_address_update_network (handle->solver, aa,
+ ntohl (atsi_delta[c1].value),
+ get_performance_info (aa,
GNUNET_ATS_NETWORK_TYPE));
+ }
+ }
- /* Tell solver about update */
- handle->s_update (handle->solver, aa, prev_session, aa->used, atsi_delta,
atsi_delta_count);
+ /* Notify performance clients about updated address */
+ GAS_performance_notify_all_clients (&aa->peer,
+ aa->plugin,
+ aa->addr, aa->addr_len,
+ aa->session_id,
+ aa->atsi, aa->atsi_count,
+ aa->assigned_bw_out,
+ aa->assigned_bw_in);
+
+ handle->s_bulk_start (handle->solver);
+ GAS_normalization_normalize_property (handle->addresses, aa,
atsi, atsi_count);
+ handle->s_bulk_stop (handle->solver);
+ }
GNUNET_free_non_null (atsi_delta);
}
@@ -986,7 +1008,7 @@
(0 == memcmp (des->addr, aa->addr, aa->addr_len)))
{
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Deleting full address for peer `%s' session %u %p\n",
GNUNET_i2s (&aa->peer), aa->session_id, aa);
@@ -1072,8 +1094,8 @@
return;
/* Get existing address */
- ea = lookup_address (handle, peer, plugin_name, plugin_addr, plugin_addr_len,
- session_id, NULL, 0);
+ ea = find_exact_address (handle, peer, plugin_name, plugin_addr,
+ plugin_addr_len, session_id);
if (ea == NULL)
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Tried to destroy unknown address
for peer `%s' `%s' session id %u\n",
@@ -1081,7 +1103,7 @@
return;
}
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Received `%s' for peer `%s' address %p session %u\n",
"ADDRESS DESTROY",
GNUNET_i2s (peer), ea, session_id);
@@ -1125,8 +1147,6 @@
int in_use)
{
struct ATS_Address *ea;
- int prev_inuse;
-
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Received `%s' for peer `%s'\n",
"ADDRESS IN USE",
@@ -1135,9 +1155,8 @@
if (GNUNET_NO == handle->running)
return GNUNET_SYSERR;
- ea = lookup_address (handle, peer, plugin_name,
- plugin_addr, plugin_addr_len,
- session_id, NULL, 0);
+ ea = find_exact_address (handle, peer, plugin_name,
+ plugin_addr, plugin_addr_len, session_id);
if (NULL == ea)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@@ -1160,11 +1179,8 @@
}
/* Tell solver about update */
- prev_inuse = ea->used;
ea->used = in_use;
- handle->s_update (handle->solver, ea, session_id, prev_inuse, NULL, 0);
-
-
+ handle->s_address_update_inuse (handle->solver, ea, ea->session_id,
ea->used);
return GNUNET_OK;
}
@@ -1340,25 +1356,30 @@
/**
* The relative value for a property changed
*
- * @param cls the address handle
+ * @param solver the address handle
* @param peer the peer
* @param type the ATS type
* @param prop_rel the new relative preference value
*/
static void
-normalized_property_changed_cb (void *cls,
-
const struct ATS_Address *peer,
+normalized_property_changed_cb (void *solver,
+
struct ATS_Address *address,
uint32_t type,
double prop_rel)
{
- GNUNET_assert (NULL != cls);
- //struct GAS_Addresses_Handle *handle = cls;
- /* Tell solver about update */
+ GNUNET_assert (NULL != solver);
+
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Normalized property %s for peer `%s' changed to %.3f \n",
GNUNET_ATS_print_property_type (type),
- GNUNET_i2s (&peer->peer),
+ GNUNET_i2s (&address->peer),
prop_rel);
+
+ GAS_proportional_address_property_changed (solver,
+
address,
+
type,
+
0,
+
prop_rel);
}
@@ -1654,7 +1675,9 @@
ah->ats_mode = MODE_MLP;
ah->s_init = &GAS_mlp_init;
ah->s_add = &GAS_mlp_address_add;
- ah->s_update = &GAS_mlp_address_update;
+ ah->s_address_update_property = &GAS_mlp_address_property_changed;
+ ah->s_address_update_session = &GAS_mlp_address_session_changed;
+ ah->s_address_update_inuse = &GAS_mlp_address_inuse_changed;
ah->s_get = &GAS_mlp_get_preferred_address;
ah->s_get_stop = &GAS_mlp_stop_get_preferred_address;
ah->s_pref = &GAS_mlp_address_change_preference;
@@ -1663,7 +1686,6 @@
ah->s_bulk_stop = &GAS_mlp_bulk_stop;
ah->s_done = &GAS_mlp_done;
#else
-
GNUNET_free (ah);
return NULL;
#endif
@@ -1673,7 +1695,10 @@
ah->ats_mode = MODE_SIMPLISTIC;
ah->s_init = &GAS_proportional_init;
ah->s_add = &GAS_proportional_address_add;
- ah->s_update = &GAS_proportional_address_update;
+ ah->s_address_update_property =
&GAS_proportional_address_property_changed;
+ ah->s_address_update_session = &GAS_proportional_address_session_changed;
+ ah->s_address_update_inuse = &GAS_proportional_address_inuse_changed;
+ ah->s_address_update_network = &GAS_proportional_address_change_network;
ah->s_get = &GAS_proportional_get_preferred_address;
ah->s_get_stop = &GAS_proportional_stop_get_preferred_address;
ah->s_pref = &GAS_proportional_address_change_preference;
@@ -1690,7 +1715,10 @@
GNUNET_assert (NULL != ah->s_init);
GNUNET_assert (NULL != ah->s_add);
- GNUNET_assert (NULL != ah->s_update);
+ GNUNET_assert (NULL != ah->s_address_update_inuse);
+ GNUNET_assert (NULL != ah->s_address_update_property);
+ GNUNET_assert (NULL != ah->s_address_update_session);
+ GNUNET_assert (NULL != ah->s_address_update_network);
GNUNET_assert (NULL != ah->s_get);
GNUNET_assert (NULL != ah->s_get_stop);
GNUNET_assert (NULL != ah->s_pref);
@@ -1710,7 +1738,7 @@
&get_property_cb, NULL);
if (NULL == ah->solver)
{
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to initialize solver!\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Failed to initialize solver!\n"));
GNUNET_free (ah);
return NULL;
}
Modified: gnunet/src/ats/gnunet-service-ats_addresses.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses.h 2013-07-04 15:25:01 UTC
(rev 27747)
+++ gnunet/src/ats/gnunet-service-ats_addresses.h 2013-07-04 15:27:59 UTC
(rev 27748)
@@ -464,27 +464,33 @@
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 ATS_Address *address,
- uint32_t prev_session,
- int in_use,
- const struct GNUNET_ATS_Information *prev_atsi,
- uint32_t prev_atsi_count);
+(*GAS_solver_address_property_changed) (void *solver,
+
struct ATS_Address *address,
+
uint32_t type,
+
uint32_t abs_value,
+
double rel_value);
+typedef void
+(*GAS_solver_address_session_changed) (void *solver,
+
struct
ATS_Address *address,
+
uint32_t cur_session,
+
uint32_t new_session);
+typedef void
+(*GAS_solver_address_inuse_changed) (void *solver,
+
struct ATS_Address
*address,
+
uint32_t session,
+
int in_use);
+
+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
*
Modified: gnunet/src/ats/gnunet-service-ats_normalization.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_normalization.c 2013-07-04 15:25:01 UTC
(rev 27747)
+++ gnunet/src/ats/gnunet-service-ats_normalization.c 2013-07-04 15:27:59 UTC
(rev 27748)
@@ -745,7 +745,7 @@
/**
- * Update and normalize a atsi performance information
+ * Update and normalize atsi performance information
*
* @param addresses hashmap containing all addresses
* @param address the address to update
Modified: gnunet/src/ats/gnunet-service-ats_normalization.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_normalization.h 2013-07-04 15:25:01 UTC
(rev 27747)
+++ gnunet/src/ats/gnunet-service-ats_normalization.h 2013-07-04 15:27:59 UTC
(rev 27748)
@@ -43,7 +43,7 @@
typedef void
(*GAS_Normalization_property_changed_cb) (void *cls,
-
const struct ATS_Address *peer,
+
struct ATS_Address *peer,
uint32_t type,
double prop_rel);
Modified: gnunet/src/ats/test_ats_api.conf
===================================================================
--- gnunet/src/ats/test_ats_api.conf 2013-07-04 15:25:01 UTC (rev 27747)
+++ gnunet/src/ats/test_ats_api.conf 2013-07-04 15:27:59 UTC (rev 27748)
@@ -21,6 +21,7 @@
# Enable MLP mode (default: NO)
MODE = SIMPLISTIC
+#MODE = MLP
# Network specific inbound/outbound quotas
# UNSPECIFIED
UNSPECIFIED_QUOTA_IN = 64 KiB
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r27748 - gnunet/src/ats,
gnunet <=