static int stat_cb(void *cls, const char *subsystem, const char *name, uint64_t value, int is_persistent) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, "ATS statistics: `%s' `%s' %llu\n", subsystem,name, value); GNUNET_ATS_suggest_address (sched_ats, &p.id, NULL, NULL); return GNUNET_OK; }
static void run (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg, struct GNUNET_TESTING_Peer *peer) { die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &end_badly, NULL); /* Connect to ATS scheduling */ sched_ats = GNUNET_ATS_scheduling_init (cfg, &address_suggest_cb, NULL); if (sched_ats == NULL) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Could not connect to ATS scheduling!\n"); ret = 1; end (); return; } /* Set up peer */ if (GNUNET_SYSERR == GNUNET_CRYPTO_hash_from_string(PEERID0, &p.id.hashPubKey)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Could not setup peer!\n"); ret = GNUNET_SYSERR; end (); return; } GNUNET_assert (0 == strcmp (PEERID0, GNUNET_i2s_full (&p.id))); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created peer `%s'\n", GNUNET_i2s_full(&p.id)); /* Prepare ATS Information */ test_ats_info[0].type = htonl (GNUNET_ATS_NETWORK_TYPE); test_ats_info[0].value = htonl(GNUNET_ATS_NET_WAN); test_ats_info[1].type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE); test_ats_info[1].value = htonl(1); test_ats_info[1].type = htonl (GNUNET_ATS_QUALITY_NET_DELAY); test_ats_info[1].value = htonl(10); test_ats_count = 2; /* Adding address without session */ test_session = &test_addr; create_test_address (&test_addr, "test", &test_addr, "test", strlen ("test") + 1); test_hello_address.peer = p.id; test_hello_address.transport_name = test_addr.plugin; test_hello_address.address = test_addr.addr; test_hello_address.address_length = test_addr.addr_len; GNUNET_ATS_address_add (sched_ats, &test_hello_address, test_session, test_ats_info, test_ats_count); /* Request address */ GNUNET_ATS_suggest_address (sched_ats, &p.id); }
static void address_suggest_cb (void *cls, const struct GNUNET_HELLO_Address *address, struct Session *session, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in, const struct GNUNET_ATS_Information *atsi, uint32_t ats_count) { static int stage = 0; if (0 == stage) { GNUNET_ATS_suggest_address_cancel (sched_ats, &p.id); if (GNUNET_OK == compare_addresses(address, session, &test_hello_address, test_session)) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stage 0: Callback for correct address `%s'\n", GNUNET_i2s (&address->peer)); ret = 0; } else { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Stage 0: Callback with incorrect address `%s'\n", GNUNET_i2s (&address->peer)); ret = 1; GNUNET_SCHEDULER_add_now (&end, NULL); return; } if (GNUNET_OK != compare_ats(atsi, ats_count, test_ats_info, test_ats_count)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Stage 0: Callback with incorrect ats info \n"); ret = 1; GNUNET_SCHEDULER_add_now (&end, NULL); return; } /* Update address */ /* Prepare ATS Information */ test_ats_info[0].type = htonl (GNUNET_ATS_NETWORK_TYPE); test_ats_info[0].value = htonl(GNUNET_ATS_NET_WAN); test_ats_info[1].type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE); test_ats_info[1].value = htonl(3); test_ats_info[1].type = htonl (GNUNET_ATS_QUALITY_NET_DELAY); test_ats_info[1].value = htonl(30); test_ats_count = 2; GNUNET_ATS_address_update (sched_ats, &test_hello_address, test_session, test_ats_info, test_ats_count); /* Request address */ GNUNET_ATS_suggest_address (sched_ats, &p.id); stage ++; } else if (1 == stage) { GNUNET_ATS_suggest_address_cancel (sched_ats, &p.id); if (GNUNET_OK == compare_addresses(address, session, &test_hello_address, test_session)) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stage 1: Callback with correct address `%s'\n", GNUNET_i2s (&address->peer)); ret = 0; } else { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Stage 1: Callback with incorrect address `%s'\n", GNUNET_i2s (&address->peer)); ret = 1; } if (GNUNET_OK != compare_ats(atsi, ats_count, test_ats_info, test_ats_count)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Stage 1: Callback with incorrect ats info \n"); ret = 1; GNUNET_SCHEDULER_add_now (&end, NULL); return; } GNUNET_SCHEDULER_add_now (&end, NULL); } }
static void run (void *cls, const struct GNUNET_CONFIGURATION_Handle *mycfg, struct GNUNET_TESTING_Peer *peer) { ret = 1; cfg = (struct GNUNET_CONFIGURATION_Handle *) mycfg; die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &end_badly, NULL); /* set up peer 0 */ GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_WEAK, &p[0].id.hashPubKey); p0_addresses[0].plugin = "test"; p0_addresses[0].session = NULL; p0_addresses[0].addr = GNUNET_strdup ("test_p0_a0"); p0_addresses[0].addr_len = strlen (p0_addresses[0].addr) + 1; p0_ha[0].address = p0_addresses[0].addr; p0_ha[0].address_length = p0_addresses[0].addr_len; p0_ha[0].peer = p[0].id; p0_ha[0].transport_name = p0_addresses[0].plugin; p0_addresses[1].plugin = "test"; p0_addresses[1].session = NULL; p0_addresses[1].addr = GNUNET_strdup ("test_p0_a1"); p0_addresses[1].addr_len = strlen(p0_addresses[1].addr) + 1; p0_ha[1].address = p0_addresses[1].addr; p0_ha[1].address_length = p0_addresses[1].addr_len; p0_ha[1].peer = p[0].id; p0_ha[1].transport_name = p0_addresses[1].plugin; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created peer 0: `%s'\n", GNUNET_i2s (&p[0].id)); GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_WEAK, &p[1].id.hashPubKey); p1_addresses[0].plugin = "test"; p1_addresses[0].session = NULL; p1_addresses[0].addr = GNUNET_strdup ("test_p1_a0"); p1_addresses[0].addr_len = strlen(p1_addresses[0].addr) + 1; p1_ha[0].address = p1_addresses[0].addr; p1_ha[0].address_length = p1_addresses[0].addr_len; p1_ha[0].peer = p[1].id; p1_ha[0].transport_name = p1_addresses[0].plugin; p1_addresses[1].plugin = "test"; p1_addresses[1].session = NULL; p1_addresses[1].addr = GNUNET_strdup ("test_p1_a1"); p1_addresses[1].addr_len = strlen(p1_addresses[1].addr) + 1; p1_ha[1].address = p1_addresses[1].addr; p1_ha[1].address_length = p1_addresses[1].addr_len; p1_ha[1].peer = p[1].id; p1_ha[1].transport_name = p1_addresses[1].plugin; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created peer 1: `%s'\n", GNUNET_i2s (&p[1].id)); /* Add addresses */ atsh = GNUNET_ATS_scheduling_init (cfg, &address_suggest_cb, NULL); if (atsh == NULL) { ret = GNUNET_SYSERR; end (); return; } GNUNET_ATS_address_add (atsh, &p0_ha[0], NULL, NULL, 0); GNUNET_ATS_address_add (atsh, &p0_ha[1], NULL, NULL, 0); GNUNET_ATS_address_add (atsh, &p1_ha[0], NULL, NULL, 0); GNUNET_ATS_address_add (atsh, &p1_ha[1], NULL, NULL, 0); GNUNET_ATS_suggest_address (atsh, &p[0].id); GNUNET_ATS_suggest_address (atsh, &p[1].id); }
static void sleep_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { GNUNET_ATS_suggest_address (sched_ats, &p[0].id); }
static void address_suggest_cb (void *cls, const struct GNUNET_HELLO_Address *address, struct Session *session, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in, const struct GNUNET_ATS_Information *atsi, uint32_t ats_count) { static int stage = 0; unsigned int bw_in = ntohl(bandwidth_in.value__); unsigned int bw_out = ntohl(bandwidth_out.value__); if (0 == stage) { if (GNUNET_OK == compare_addresses (address, session, &test_hello_address[0], test_session[0])) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stage %u: Callback with correct address `%s'\n", stage, GNUNET_i2s (&address->peer)); ret = 0; } else { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stage %u: Callback with invalid address `%s'\n", stage, GNUNET_i2s (&address->peer)); ret = 1; } if (GNUNET_OK != compare_ats(atsi, ats_count, test_ats_info, test_ats_count)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Stage %u: Callback with incorrect ats info \n", stage); ret = 1; } if (bw_in > wan_quota_in) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Suggested WAN inbound quota %u bigger than allowed quota %llu \n", bw_in, wan_quota_in); ret = 1; } else GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Suggested WAN inbound quota %u, allowed quota %llu \n", bw_in, wan_quota_in); if (bw_out > wan_quota_out) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Suggested WAN outbound quota %u bigger than allowed quota %llu \n", bw_out, wan_quota_out); ret = 1; } else GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Suggested WAN outbound quota %u, allowed quota %llu \n", bw_out, wan_quota_out); if (1 == ret) { GNUNET_ATS_suggest_address_cancel (sched_ats, &p[0].id); GNUNET_SCHEDULER_add_now (&end, NULL); return; } stage ++; GNUNET_ATS_suggest_address_cancel (sched_ats, &p[0].id); GNUNET_ATS_suggest_address (sched_ats, &p[1].id); return; } if (1 == stage) { if (GNUNET_OK == compare_addresses (address, session, &test_hello_address[1], test_session[1])) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stage %u: Callback with correct address `%s'\n", stage, GNUNET_i2s (&address->peer)); ret = 0; } else { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stage %u: Callback with invalid address `%s'\n", stage, GNUNET_i2s (&address->peer)); ret = 1; } if (GNUNET_OK != compare_ats(atsi, ats_count, test_ats_info, test_ats_count)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Stage %u: Callback with incorrect ats info \n", stage); ret = 1; } if (bw_in > wan_quota_in) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Suggested WAN inbound quota %u bigger than allowed quota %llu \n", bw_in, wan_quota_in); ret = 1; } else GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Suggested WAN inbound quota %u, allowed quota %llu \n", bw_in, wan_quota_in); if (bw_out > wan_quota_out) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Suggested WAN outbound quota %u bigger than allowed quota %llu \n", bw_out, wan_quota_out); ret = 1; } else GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Suggested WAN outbound quota %u, allowed quota %llu \n", bw_out, wan_quota_out); if (1 == ret) { GNUNET_ATS_suggest_address_cancel (sched_ats, &p[0].id); GNUNET_SCHEDULER_add_now (&end, NULL); return; } stage ++; GNUNET_ATS_suggest_address_cancel (sched_ats, &p[1].id); GNUNET_SCHEDULER_add_now (&end, NULL); return; } }