res ++;
break;
case GNUNET_ATS_QUALITY_NET_DISTANCE:
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Old ATS type %u %u\n", dest->atsp_distance, ntohl (src[i].type));
dest->atsp_distance = ntohl (src[i].value);
res ++;
break;
memcpy (&aa[1], plugin_addr, plugin_addr_len);
aa->plugin = GNUNET_strdup (plugin_name);
aa->session_id = session_id;
+ aa->active = GNUNET_NO;
+ aa->solver_information = NULL;
+ aa->assigned_bw_in = GNUNET_BANDWIDTH_value_init(0);
+ aa->assigned_bw_out = GNUNET_BANDWIDTH_value_init(0);
return aa;
}
plugin_addr, plugin_addr_len,
session_id);
- aa->mlp_information = NULL;
-
/* Get existing address or address with session == 0 */
old = find_address (peer, aa);
free_address (aa);
plugin_name,
plugin_addr, plugin_addr_len,
session_id);
- aa->mlp_information = NULL;
if (atsi_count != (ats_res = disassemble_ats_information(atsi, atsi_count, aa)))
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
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);
- /* Tell solver about update */
+ /* Tell solver about new address */
handle->s_add (handle->solver, handle->addresses, aa);
return;
}
+ GNUNET_free (aa->plugin);
+ GNUNET_free (aa);
if (old->session_id != 0)
{
"While updating address: had %u ATS elements to add, could only add %u\n",
atsi_count, ats_res);
}
- GNUNET_free (aa->plugin);
- GNUNET_free (aa);
- handle->s_add (handle->solver, handle->addresses, old);
+
+ handle->s_update (handle->solver, handle->addresses, old);
}
const struct GNUNET_ATS_Information *atsi,
uint32_t atsi_count)
{
- struct ATS_Address *old;
+ struct ATS_Address *aa;
uint32_t ats_res;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received `%s' for peer `%s'\n",
- "ADDRESS UPDATE",
- GNUNET_i2s (peer));
-
if (GNUNET_NO == handle->running)
return;
GNUNET_assert (NULL != handle->addresses);
/* Get existing address */
- old = lookup_address (peer, plugin_name, plugin_addr, plugin_addr_len,
+ aa = lookup_address (peer, plugin_name, plugin_addr, plugin_addr_len,
session_id, atsi, atsi_count);
- if (old == NULL)
+ if (aa == NULL)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Tried to update unknown address for peer `%s' `%s' session id %u\n",
GNUNET_i2s (peer), plugin_name, session_id);
return;
}
- if (atsi_count != (ats_res = disassemble_ats_information (atsi, atsi_count, old)))
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Received `%s' for peer `%s' address \n",
+ "ADDRESS UPDATE",
+ GNUNET_i2s (peer), aa);
+
+ if (atsi_count != (ats_res = disassemble_ats_information (atsi, atsi_count, aa)))
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"While adding address: had %u ATS elements to add, could only add %u\n",
atsi_count, ats_res);
}
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Updated %u ATS elements for address %p\n",
+ ats_res, aa);
/* Tell solver about update */
- handle->s_update (handle->solver, handle->addresses, old);
+ handle->s_update (handle->solver, handle->addresses, aa);
}
"Address %p ready for suggestion, block interval now %llu \n",
aa, aa->block_interval);
-
GNUNET_free (ats);
}
}
+static void
+bandwidth_changed_cb (struct ATS_Address *address)
+{
+ struct GAS_Addresses_Suggestion_Requests *cur;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Bandwidth assignment changed for peer %s \n", GNUNET_i2s(&address->peer));
+ struct GNUNET_ATS_Information *ats;
+ unsigned int ats_count;
+
+ cur = handle->r_head;
+ while (NULL != cur)
+ {
+ if (0 == memcmp (&address->peer, &cur->id, sizeof (cur->id)))
+ break; /* we have an address request pending*/
+ cur = cur->next;
+ }
+ if (NULL == cur)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Nobody is interested in peer `%s' :(\n",GNUNET_i2s (&address->peer));
+ return;
+ }
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Sending bandwidth update for peer `%s'\n",GNUNET_i2s (&address->peer));
+
+ ats_count = assemble_ats_information (address, &ats);
+ GAS_scheduling_transmit_address_suggestion (&address->peer,
+ address->plugin,
+ address->addr, address->addr_len,
+ address->session_id,
+ ats, ats_count,
+ address->assigned_bw_out,
+ address->assigned_bw_in);
+ GNUNET_free (ats);
+}
+
/**
* Initialize address subsystem.
quota_count = load_quotas(cfg, quotas_in, quotas_out, GNUNET_ATS_NetworkTypeCount);
- ah->solver = ah->s_init (cfg, stats, quotas, quotas_in, quotas_out, quota_count);
+ ah->solver = ah->s_init (cfg, stats, quotas, quotas_in, quotas_out, quota_count, &bandwidth_changed_cb);
if (NULL == ah->solver)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to initialize solver!\n");
GNUNET_CONTAINER_DLL_remove (handle->r_head, handle->r_tail, cur);
GNUNET_free (cur);
}
-
+ handle->s_done (handle->solver);
GNUNET_free (handle);
/* Stop configured solution method */