X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fats%2Fgnunet-service-ats_addresses.c;h=aff7cede1056f855aa4dea075632a03b1ae8d7cb;hb=07cfe12a0266c84fe0679e0e8908f4d8d9fa3caf;hp=6ed625bf427809704e5b36cde558150bc7d1b8c7;hpb=d043dd0e4ca407081eaa1b9072b37b1d9e715813;p=oweals%2Fgnunet.git diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c index 6ed625bf4..aff7cede1 100644 --- a/src/ats/gnunet-service-ats_addresses.c +++ b/src/ats/gnunet-service-ats_addresses.c @@ -66,6 +66,8 @@ static unsigned int active_addr_count; static int ats_mode; +static int running; + static void send_bw_notification (struct ATS_Address *aa) @@ -339,6 +341,11 @@ GAS_addresses_update (const struct GNUNET_PeerIdentity *peer, struct ATS_Address *old; uint32_t i; + if (GNUNET_NO == running) + return; + + GNUNET_assert (NULL != addresses); + aa = create_address (peer, plugin_name, plugin_addr, plugin_addr_len, @@ -510,6 +517,9 @@ GAS_addresses_destroy (const struct GNUNET_PeerIdentity *peer, { struct ATS_Address *aa; + if (GNUNET_NO == running) + return; + GNUNET_break (0 < strlen (plugin_name)); aa = create_address (peer, plugin_name, plugin_addr, plugin_addr_len, session_id); @@ -566,7 +576,7 @@ find_address_it (void *cls, const GNUNET_HashCode * key, void *value) } -void +int GAS_addresses_in_use (const struct GNUNET_PeerIdentity *peer, const char *plugin_name, const void *plugin_addr, size_t plugin_addr_len, uint32_t session_id, int in_use) @@ -580,19 +590,34 @@ GAS_addresses_in_use (const struct GNUNET_PeerIdentity *peer, struct ATS_Address *aa; struct ATS_Address *old; + if (GNUNET_NO == running) + return GNUNET_SYSERR; - aa = create_address(peer, plugin_name, plugin_addr, plugin_addr_len, session_id); + aa = create_address (peer, plugin_name, plugin_addr, plugin_addr_len, session_id); old = find_exact_address (peer, aa); free_address (aa); - GNUNET_assert (old != NULL); - GNUNET_assert (old->used != in_use); + if (NULL == old) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + if (old->used == in_use) + { + GNUNET_break (0); + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Address in use called multiple times for peer `%s': %s -> %s \n", + GNUNET_i2s (peer), + (GNUNET_NO == old->used) ? "NO" : "YES", + (GNUNET_NO == in_use) ? "NO" : "YES"); + return GNUNET_SYSERR; + } old->used = in_use; - #if HAVE_LIBGLPK if (ats_mode == MLP) GAS_mlp_address_update (mlp, addresses, old); #endif + return GNUNET_OK; } @@ -677,6 +702,9 @@ void request_address_simple (const struct GNUNET_PeerIdentity *peer) void GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer) { + if (GNUNET_NO == running) + return; + if (ats_mode == SIMPLE) { request_address_simple (peer); @@ -695,6 +723,8 @@ GAS_addresses_change_preference (const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind, float score) { + if (GNUNET_NO == running) + return; #if HAVE_LIBGLPK if (ats_mode == MLP) GAS_mlp_address_change_preference (mlp, peer, kind, score); @@ -718,6 +748,11 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg, char *quota_wan_in_str; char *quota_wan_out_str; + running = GNUNET_NO; + + addresses = GNUNET_CONTAINER_multihashmap_create (128); + GNUNET_assert (NULL != addresses); + if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string(cfg, "ats", "WAN_QUOTA_IN", "a_wan_in_str)) { if (0 == strcmp(quota_wan_in_str, "unlimited") || @@ -746,9 +781,8 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg, wan_quota_out = (UINT32_MAX) /10; } - mode = GNUNET_CONFIGURATION_get_value_yesno (cfg, "ats", "MLP"); - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "MLP mode %u", mode); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "MLP mode %u", mode); switch (mode) { /* MLP = YES */ @@ -788,7 +822,7 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg, break; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "ATS started with %s mode\n", (SIMPLE == ats_mode) ? "SIMPLE" : "MLP"); - addresses = GNUNET_CONTAINER_multihashmap_create (128); + running = GNUNET_YES; } @@ -813,6 +847,9 @@ free_address_it (void *cls, const GNUNET_HashCode * key, void *value) void GAS_addresses_destroy_all () { + if (GNUNET_NO == running) + return; + if (addresses != NULL) GNUNET_CONTAINER_multihashmap_iterate (addresses, &free_address_it, NULL); GNUNET_assert (active_addr_count == 0); @@ -825,6 +862,7 @@ GAS_addresses_destroy_all () void GAS_addresses_done () { + running = GNUNET_NO; GAS_addresses_destroy_all (); GNUNET_CONTAINER_multihashmap_destroy (addresses); addresses = NULL;