diff options
Diffstat (limited to 'src/ats')
-rw-r--r-- | src/ats/gnunet-service-ats-solver_proportional.c | 120 | ||||
-rw-r--r-- | src/ats/gnunet-service-ats_addresses.c | 2 |
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 | ||
558 | struct FindBestAddressCtx | 563 | struct 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 | ||
565 | static int | 570 | static int |
566 | find_property_index (uint32_t type) | 571 | find_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) | |||
586 | static int | 591 | static int |
587 | find_best_address_it (void *cls, const struct GNUNET_HashCode * key, void *value) | 592 | find_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 | |||
695 | static void | 700 | static void |
696 | distribute_bandwidth_in_all_networks (struct GAS_PROPORTIONAL_Handle *s) | 701 | distribute_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 | */ |
1163 | void | 1175 | void |
1164 | GAS_proportional_address_property_changed (void *solver, | 1176 | GAS_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 | */ |
1215 | void | 1227 | void |
1216 | GAS_proportional_address_session_changed (void *solver, | 1228 | GAS_proportional_address_session_changed (void *solver, |
1217 | struct ATS_Address *address, | 1229 | struct ATS_Address *address, |
1218 | uint32_t cur_session, | 1230 | uint32_t cur_session, |
1219 | uint32_t new_session) | 1231 | uint32_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 | */ |
1238 | void | 1250 | void |
1239 | GAS_proportional_address_inuse_changed (void *solver, | 1251 | GAS_proportional_address_inuse_changed (void *solver, |
1240 | struct ATS_Address *address, | 1252 | struct ATS_Address *address, |
1241 | int in_use) | 1253 | int 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 | */ |
1341 | void | 1353 | void |
1342 | GAS_proportional_address_add (void *solver, | 1354 | GAS_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, |