aboutsummaryrefslogtreecommitdiff
path: root/src/ats
diff options
context:
space:
mode:
Diffstat (limited to 'src/ats')
-rw-r--r--src/ats/gnunet-service-ats-solver_proportional.c120
-rw-r--r--src/ats/gnunet-service-ats_addresses.c2
2 files changed, 71 insertions, 51 deletions
diff --git a/src/ats/gnunet-service-ats-solver_proportional.c b/src/ats/gnunet-service-ats-solver_proportional.c
index f902ee994..24d359c71 100644
--- a/src/ats/gnunet-service-ats-solver_proportional.c
+++ b/src/ats/gnunet-service-ats-solver_proportional.c
@@ -229,6 +229,11 @@ struct GAS_PROPORTIONAL_Handle
229 const struct GNUNET_CONTAINER_MultiHashMap *addresses; 229 const struct GNUNET_CONTAINER_MultiHashMap *addresses;
230 230
231 /** 231 /**
232 * Pending address requests
233 */
234 struct GNUNET_CONTAINER_MultiHashMap *requests;
235
236 /**
232 * Bandwidth changed callback 237 * Bandwidth changed callback
233 */ 238 */
234 GAS_bandwidth_changed_cb bw_changed; 239 GAS_bandwidth_changed_cb bw_changed;
@@ -533,44 +538,44 @@ distribute_bandwidth_in_network (struct GAS_PROPORTIONAL_Handle *s,
533 538
534 } 539 }
535 LOG (GNUNET_ERROR_TYPE_DEBUG, 540 LOG (GNUNET_ERROR_TYPE_DEBUG,
536 "Total bandwidth assigned is (in/out): %llu /%llu\n", 541 "Total bandwidth assigned is (in/out): %llu /%llu\n",
537 quota_in_used, 542 quota_in_used,
538 quota_out_used); 543 quota_out_used);
539 if (quota_out_used > net->total_quota_out + 1) /* +1 is required due to rounding errors */ 544 if (quota_out_used > net->total_quota_out + 1) /* +1 is required due to rounding errors */
540 { 545 {
541 LOG (GNUNET_ERROR_TYPE_ERROR, 546 LOG (GNUNET_ERROR_TYPE_ERROR,
542 "Total outbound bandwidth assigned is larger than allowed (used/allowed) for %u active addresses: %llu / %llu\n", 547 "Total outbound bandwidth assigned is larger than allowed (used/allowed) for %u active addresses: %llu / %llu\n",
543 net->active_addresses, 548 net->active_addresses,
544 quota_out_used, 549 quota_out_used,
545 net->total_quota_out); 550 net->total_quota_out);
546 } 551 }
547 if (quota_in_used > net->total_quota_in + 1) /* +1 is required due to rounding errors */ 552 if (quota_in_used > net->total_quota_in + 1) /* +1 is required due to rounding errors */
548 { 553 {
549 LOG (GNUNET_ERROR_TYPE_ERROR, 554 LOG (GNUNET_ERROR_TYPE_ERROR,
550 "Total inbound bandwidth assigned is larger than allowed (used/allowed) for %u active addresses: %llu / %llu\n", 555 "Total inbound bandwidth assigned is larger than allowed (used/allowed) for %u active addresses: %llu / %llu\n",
551 net->active_addresses, 556 net->active_addresses,
552 quota_in_used, 557 quota_in_used,
553 net->total_quota_in); 558 net->total_quota_in);
554 } 559 }
555} 560}
556 561
557 562
558struct FindBestAddressCtx 563struct FindBestAddressCtx
559{ 564{
560 struct GAS_PROPORTIONAL_Handle *s; 565 struct GAS_PROPORTIONAL_Handle *s;
561 struct ATS_Address *best; 566 struct ATS_Address *best;
562}; 567};
563 568
564 569
565static int 570static int
566find_property_index (uint32_t type) 571find_property_index (uint32_t type)
567{ 572{
568 int existing_types[] = GNUNET_ATS_QualityProperties; 573 int existing_types[] = GNUNET_ATS_QualityProperties;
569 int c; 574 int c;
570 for (c = 0; c < GNUNET_ATS_QualityPropertiesCount; c++) 575 for (c = 0; c < GNUNET_ATS_QualityPropertiesCount; c++)
571 if (existing_types[c] == type) 576 if (existing_types[c] == type)
572 return c; 577 return c;
573 return GNUNET_SYSERR; 578 return GNUNET_SYSERR;
574} 579}
575 580
576/** 581/**
@@ -586,7 +591,7 @@ find_property_index (uint32_t type)
586static int 591static int
587find_best_address_it (void *cls, const struct GNUNET_HashCode * key, void *value) 592find_best_address_it (void *cls, const struct GNUNET_HashCode * key, void *value)
588{ 593{
589 struct FindBestAddressCtx *fba_ctx = (struct FindBestAddressCtx *) cls; 594 struct FindBestAddressCtx *fba_ctx = (struct FindBestAddressCtx *) cls;
590 struct ATS_Address *current = (struct ATS_Address *) value; 595 struct ATS_Address *current = (struct ATS_Address *) value;
591 struct GNUNET_TIME_Absolute now; 596 struct GNUNET_TIME_Absolute now;
592 struct Network *net = (struct Network *) current->solver_information; 597 struct Network *net = (struct Network *) current->solver_information;
@@ -695,11 +700,9 @@ find_best_address_it (void *cls, const struct GNUNET_HashCode * key, void *value
695static void 700static void
696distribute_bandwidth_in_all_networks (struct GAS_PROPORTIONAL_Handle *s) 701distribute_bandwidth_in_all_networks (struct GAS_PROPORTIONAL_Handle *s)
697{ 702{
698 int i; 703 int i;
699 704 for (i = 0; i < s->networks; i++)
700 for (i = 0; i < s->networks; i++) 705 distribute_bandwidth_in_network (s, &s->network_entries[i], NULL);
701 distribute_bandwidth_in_network (s, &s->network_entries[i], NULL);
702
703} 706}
704 707
705 708
@@ -932,6 +935,11 @@ GAS_proportional_get_preferred_address (void *solver,
932 GNUNET_assert (s != NULL); 935 GNUNET_assert (s != NULL);
933 GNUNET_assert (peer != NULL); 936 GNUNET_assert (peer != NULL);
934 937
938 /* Add to list of pending requests */
939 if (GNUNET_NO == GNUNET_CONTAINER_multihashmap_contains (s->requests, &peer->hashPubKey))
940 GNUNET_CONTAINER_multihashmap_put (s->requests, &peer->hashPubKey,
941 NULL, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
942
935 /* Get address with: stick to current address, lower distance, lower latency */ 943 /* Get address with: stick to current address, lower distance, lower latency */
936 fba_ctx.s = s; 944 fba_ctx.s = s;
937 fba_ctx.best = NULL; 945 fba_ctx.best = NULL;
@@ -940,11 +948,11 @@ GAS_proportional_get_preferred_address (void *solver,
940 &find_best_address_it, &fba_ctx); 948 &find_best_address_it, &fba_ctx);
941 if (NULL == fba_ctx.best) 949 if (NULL == fba_ctx.best)
942 { 950 {
943 LOG (GNUNET_ERROR_TYPE_DEBUG, "Cannot suggest address for peer `%s'\n", GNUNET_i2s (peer)); 951 LOG (GNUNET_ERROR_TYPE_INFO, "Cannot suggest address for peer `%s'\n", GNUNET_i2s (peer));
944 return NULL; 952 return NULL;
945 } 953 }
946 954
947 LOG (GNUNET_ERROR_TYPE_DEBUG, "Suggesting %s address %p for peer `%s'\n", 955 LOG (GNUNET_ERROR_TYPE_INFO, "Suggesting %s address %p for peer `%s'\n",
948 (GNUNET_NO == fba_ctx.best->active) ? "inactive" : "active", 956 (GNUNET_NO == fba_ctx.best->active) ? "inactive" : "active",
949 fba_ctx.best, GNUNET_i2s (peer)); 957 fba_ctx.best, GNUNET_i2s (peer));
950 net_cur = (struct Network *) fba_ctx.best->solver_information; 958 net_cur = (struct Network *) fba_ctx.best->solver_information;
@@ -976,7 +984,7 @@ GAS_proportional_get_preferred_address (void *solver,
976 prev->assigned_bw_out = BANDWIDTH_ZERO; /* no bandwidth assigned */ 984 prev->assigned_bw_out = BANDWIDTH_ZERO; /* no bandwidth assigned */
977 if (GNUNET_SYSERR == addresse_decrement (s, net_prev, GNUNET_NO, GNUNET_YES)) 985 if (GNUNET_SYSERR == addresse_decrement (s, net_prev, GNUNET_NO, GNUNET_YES))
978 GNUNET_break (0); 986 GNUNET_break (0);
979 distribute_bandwidth_in_network (s, net_prev, NULL); 987 distribute_bandwidth_in_network (s, net_prev, NULL);
980 } 988 }
981 989
982 if (GNUNET_NO == (is_bandwidth_available_in_network (fba_ctx.best->solver_information))) 990 if (GNUNET_NO == (is_bandwidth_available_in_network (fba_ctx.best->solver_information)))
@@ -987,7 +995,7 @@ GAS_proportional_get_preferred_address (void *solver,
987 995
988 fba_ctx.best->active = GNUNET_YES; 996 fba_ctx.best->active = GNUNET_YES;
989 addresse_increment (s, net_cur, GNUNET_NO, GNUNET_YES); 997 addresse_increment (s, net_cur, GNUNET_NO, GNUNET_YES);
990 distribute_bandwidth_in_network (s, net_cur, fba_ctx.best); 998 distribute_bandwidth_in_network (s, net_cur, NULL);
991 return fba_ctx.best; 999 return fba_ctx.best;
992} 1000}
993 1001
@@ -1005,19 +1013,23 @@ GAS_proportional_stop_get_preferred_address (void *solver,
1005 struct GAS_PROPORTIONAL_Handle *s = solver; 1013 struct GAS_PROPORTIONAL_Handle *s = solver;
1006 struct ATS_Address *cur; 1014 struct ATS_Address *cur;
1007 struct Network *cur_net; 1015 struct Network *cur_net;
1016
1017 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (s->requests, &peer->hashPubKey))
1018 GNUNET_CONTAINER_multihashmap_remove (s->requests, &peer->hashPubKey, NULL);
1019
1008 cur = get_active_address (s, (struct GNUNET_CONTAINER_MultiHashMap *) s->addresses, peer); 1020 cur = get_active_address (s, (struct GNUNET_CONTAINER_MultiHashMap *) s->addresses, peer);
1009 if (NULL != cur) 1021 if (NULL != cur)
1010 { 1022 {
1011 /* Disabling current address */ 1023 /* Disabling current address */
1012 cur_net = (struct Network *) cur->solver_information; 1024 cur_net = (struct Network *) cur->solver_information;
1013 cur->active = GNUNET_NO; /* No active any longer */ 1025 cur->active = GNUNET_NO; /* No active any longer */
1014 cur->assigned_bw_in = BANDWIDTH_ZERO; /* no bandwidth assigned */ 1026 cur->assigned_bw_in = BANDWIDTH_ZERO; /* no bandwidth assigned */
1015 cur->assigned_bw_out = BANDWIDTH_ZERO; /* no bandwidth assigned */ 1027 cur->assigned_bw_out = BANDWIDTH_ZERO; /* no bandwidth assigned */
1016 if (GNUNET_SYSERR == addresse_decrement (s, cur_net, GNUNET_NO, GNUNET_YES)) 1028 if (GNUNET_SYSERR == addresse_decrement (s, cur_net, GNUNET_NO, GNUNET_YES))
1017 GNUNET_break (0); 1029 GNUNET_break (0);
1018 distribute_bandwidth_in_network (s, cur_net, NULL); 1030 distribute_bandwidth_in_network (s, cur_net, NULL);
1019 } 1031 }
1020 return; 1032 return;
1021} 1033}
1022 1034
1023 1035
@@ -1162,10 +1174,10 @@ GAS_proportional_address_add (void *solver,
1162 */ 1174 */
1163void 1175void
1164GAS_proportional_address_property_changed (void *solver, 1176GAS_proportional_address_property_changed (void *solver,
1165 struct ATS_Address *address, 1177 struct ATS_Address *address,
1166 uint32_t type, 1178 uint32_t type,
1167 uint32_t abs_value, 1179 uint32_t abs_value,
1168 double rel_value) 1180 double rel_value)
1169{ 1181{
1170 struct GAS_PROPORTIONAL_Handle *s; 1182 struct GAS_PROPORTIONAL_Handle *s;
1171 struct Network *n; 1183 struct Network *n;
@@ -1214,9 +1226,9 @@ GAS_proportional_address_property_changed (void *solver,
1214 */ 1226 */
1215void 1227void
1216GAS_proportional_address_session_changed (void *solver, 1228GAS_proportional_address_session_changed (void *solver,
1217 struct ATS_Address *address, 1229struct ATS_Address *address,
1218 uint32_t cur_session, 1230uint32_t cur_session,
1219 uint32_t new_session) 1231uint32_t new_session)
1220{ 1232{
1221 if (cur_session!= new_session) 1233 if (cur_session!= new_session)
1222 { 1234 {
@@ -1237,8 +1249,8 @@ GAS_proportional_address_session_changed (void *solver,
1237 */ 1249 */
1238void 1250void
1239GAS_proportional_address_inuse_changed (void *solver, 1251GAS_proportional_address_inuse_changed (void *solver,
1240 struct ATS_Address *address, 1252struct ATS_Address *address,
1241 int in_use) 1253int in_use)
1242{ 1254{
1243 LOG (GNUNET_ERROR_TYPE_DEBUG, 1255 LOG (GNUNET_ERROR_TYPE_DEBUG,
1244 "Usage changed to %s\n", 1256 "Usage changed to %s\n",
@@ -1340,8 +1352,8 @@ GAS_proportional_address_change_network (void *solver,
1340 */ 1352 */
1341void 1353void
1342GAS_proportional_address_add (void *solver, 1354GAS_proportional_address_add (void *solver,
1343 struct ATS_Address *address, 1355 struct ATS_Address *address,
1344 uint32_t network) 1356 uint32_t network)
1345{ 1357{
1346 struct GAS_PROPORTIONAL_Handle *s = solver; 1358 struct GAS_PROPORTIONAL_Handle *s = solver;
1347 struct Network *net = NULL; 1359 struct Network *net = NULL;
@@ -1361,6 +1373,11 @@ GAS_proportional_address_add (void *solver,
1361 addresse_increment (s, net, GNUNET_YES, GNUNET_NO); 1373 addresse_increment (s, net, GNUNET_YES, GNUNET_NO);
1362 aw->addr->solver_information = net; 1374 aw->addr->solver_information = net;
1363 1375
1376 if ((GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains(s->requests, &address->peer.hashPubKey)) &&
1377 (NULL == get_active_address (s,
1378 (struct GNUNET_CONTAINER_MultiHashMap *) s->addresses, &address->peer)))
1379 GAS_proportional_get_preferred_address (s, &address->peer);
1380
1364 LOG (GNUNET_ERROR_TYPE_DEBUG, "After adding address now total %u and active %u addresses in network `%s'\n", 1381 LOG (GNUNET_ERROR_TYPE_DEBUG, "After adding address now total %u and active %u addresses in network `%s'\n",
1365 net->total_addresses, 1382 net->total_addresses,
1366 net->active_addresses, 1383 net->active_addresses,
@@ -1438,6 +1455,8 @@ GAS_proportional_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
1438 s->bulk_lock = GNUNET_NO; 1455 s->bulk_lock = GNUNET_NO;
1439 s->addresses = addresses; 1456 s->addresses = addresses;
1440 1457
1458 s->requests = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_YES);
1459
1441 for (c = 0; c < dest_length; c++) 1460 for (c = 0; c < dest_length; c++)
1442 { 1461 {
1443 cur = &s->network_entries[c]; 1462 cur = &s->network_entries[c];
@@ -1515,6 +1534,7 @@ GAS_proportional_done (void *solver)
1515 GNUNET_break (0); 1534 GNUNET_break (0);
1516 } 1535 }
1517 GNUNET_free (s->network_entries); 1536 GNUNET_free (s->network_entries);
1537 GNUNET_CONTAINER_multihashmap_destroy (s->requests);
1518 GNUNET_free (s); 1538 GNUNET_free (s);
1519} 1539}
1520 1540
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c
index 6897f858c..229af78bb 100644
--- a/src/ats/gnunet-service-ats_addresses.c
+++ b/src/ats/gnunet-service-ats_addresses.c
@@ -1332,7 +1332,7 @@ GAS_addresses_request_address (struct GAS_Addresses_Handle *handle,
1332 return; 1332 return;
1333 } 1333 }
1334 1334
1335 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 1335 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1336 "Suggesting address %p for peer `%s'\n", aa, GNUNET_i2s (peer)); 1336 "Suggesting address %p for peer `%s'\n", aa, GNUNET_i2s (peer));
1337 1337
1338 GAS_scheduling_transmit_address_suggestion (peer, 1338 GAS_scheduling_transmit_address_suggestion (peer,