*/
#include "platform.h"
#include "gnunet-service-ats_addresses.h"
-
+#include "gnunet-service-ats_scheduling.h"
struct ATS_Address
{
char * plugin;
struct GNUNET_TRANSPORT_ATS_Information * ats;
+
+ struct GNUNET_BANDWIDTH_Value32NBO bw_in;
+
+ struct GNUNET_BANDWIDTH_Value32NBO bw_out;
};
static void
merge_ats (struct ATS_Address * dest, struct ATS_Address * source)
{
+ /*
int c_src = 0;
int c_dest = 0;
struct GNUNET_TRANSPORT_ATS_Information * a_src = source->ats;
struct GNUNET_TRANSPORT_ATS_Information * a_dest = dest->ats;
+ int new_entries = dest->ats_count;
+
for (c_dest = 0; c_dest < dest->ats_count; c_dest ++)
{
for (c_src = 0; c_src < source->ats_count; c_src ++)
{
if (a_src[c_src].type == a_dest[c_dest].type)
- a_src[c_src].value = a_dest[c_dest].value;
+ new_entries--;
}
}
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Have %u new entries\n",
+ new_entries);
+*/
}
void
struct ATS_Address * old;
aa = GNUNET_malloc (sizeof (struct ATS_Address) +
- atsi_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information) +
- plugin_addr_len);
+ plugin_addr_len);
+ aa->ats = GNUNET_malloc(atsi_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information));
+
aa->peer = *peer;
aa->addr_len = plugin_addr_len;
aa->ats_count = atsi_count;
- aa->ats = (struct GNUNET_TRANSPORT_ATS_Information *) &aa[1];
- memcpy (&aa->ats, atsi, atsi_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information));
- aa->addr = &aa->ats[atsi_count];
+ memcpy (aa->ats, atsi, atsi_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information));
+ aa->addr = &aa[1];
memcpy (&aa->addr, plugin_addr, plugin_addr_len);
aa->plugin = GNUNET_strdup (plugin_name);
aa->session_client = session_client;
aa,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Added new address for peer `%s' \n",
- GNUNET_i2s (peer));
+ "Added new address for peer `%s' %X\n",
+ GNUNET_i2s (peer), aa);
}
else
{
merge_ats (old, aa);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Updated existing address for peer `%s' \n",
- GNUNET_i2s (peer));
+ "Updated existing address for peer `%s' %X \n",
+ GNUNET_i2s (peer), old);
+ GNUNET_free (aa->ats);
GNUNET_free (aa);
}
GNUNET_break (GNUNET_YES ==
GNUNET_CONTAINER_multihashmap_remove(addresses, &peer->hashPubKey, res));
GNUNET_free (res->plugin);
+ GNUNET_free_non_null (res->ats);
GNUNET_free (res);
}
void
GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer)
{
-
-
+ struct ATS_Address * aa = NULL;
+ aa = GNUNET_CONTAINER_multihashmap_get (addresses, &peer->hashPubKey);
+ if (aa != NULL)
+ GAS_scheduling_transmit_address_suggestion (peer, aa->plugin, aa->addr, aa->addr_len, aa->session_client, aa->session_id, aa->ats, aa->ats_count, aa->bw_out, aa->bw_in);
}
const GNUNET_HashCode * key,
void *value)
{
- struct ATS_Address * aa = cls;
+ struct ATS_Address * aa = value;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Freeing address for peer `%s' %X\n",
+ GNUNET_i2s (&aa->peer), aa);
GNUNET_free (aa);
return GNUNET_OK;
}
#include "gnunet_ats_service.h"
#include "ats.h"
-#define VERBOSE GNUNET_EXTRA_LOGGING
+#define VERBOSE GNUNET_YES
#define VERBOSE_ARM GNUNET_EXTRA_LOGGING
struct GNUNET_OS_Process * arm_proc;
+struct Address addr;
+struct PeerContext p;
+struct GNUNET_TRANSPORT_ATS_Information atsi[2];
+
static int ret;
struct Address
static void
end ()
{
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Shutting down\n");
if (die_task != GNUNET_SCHEDULER_NO_TASK)
{
GNUNET_SCHEDULER_cancel(die_task);
uint32_t ats_count)
{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "address_suggest_cb `%s'\n", GNUNET_i2s (peer));
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "ATS suggests address `%s'\n", GNUNET_i2s (peer));
+
+ GNUNET_assert (0 == memcmp (peer, &p.id, sizeof (struct GNUNET_PeerIdentity)));
+ GNUNET_assert (0 == strcmp (plugin_name, addr.plugin));
+ GNUNET_assert (plugin_addr_len == addr.addr_len);
+ GNUNET_assert (0 == memcmp (plugin_addr, addr.plugin, plugin_addr_len));
+ GNUNET_assert (addr.session == session);
+
+
+ /* TODO ats merge
+ GNUNET_assert (ats_count == 2);
+ GNUNET_assert (atsi[0].type == htons (1));
+ GNUNET_assert (atsi[0].type == htons (2));
+ GNUNET_assert (atsi[1].type == htons (2));
+ GNUNET_assert (atsi[1].type == htons (2));
+ */
+
+ ret = 0;
- end ();
+ GNUNET_SCHEDULER_add_now(&end, NULL);
}
void
const struct GNUNET_CONFIGURATION_Handle *cfg)
{
ret = GNUNET_SYSERR;
- struct Address addr;
- struct PeerContext p;
die_task = GNUNET_SCHEDULER_add_delayed(TIMEOUT, &end_badly, NULL);
start_arm (cfgfile);
GNUNET_ATS_address_update(ats, &p.id, addr.plugin, addr.addr, addr.addr_len, addr.session, NULL, 0);
+ atsi[0].type = htons (1);
+ atsi[0].type = htons (1);
+
+ GNUNET_ATS_address_update(ats, &p.id, addr.plugin, addr.addr, addr.addr_len, addr.session, atsi, 1);
+
+ atsi[0].type = htons (1);
+ atsi[0].type = htons (2);
+
+ atsi[1].type = htons (2);
+ atsi[1].type = htons (2);
+
+ GNUNET_ATS_address_update(ats, &p.id, addr.plugin, addr.addr, addr.addr_len, addr.session, atsi, 2);
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Requesting peer `%s'\n", GNUNET_i2s (&p.id));
GNUNET_ATS_suggest_address(ats, &p.id);
}