diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2013-07-03 13:40:31 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2013-07-03 13:40:31 +0000 |
commit | 8042ec745551791cdd06aa6f7aec4a766fe0ded3 (patch) | |
tree | ca113611a8ca17e9fede53f6eaff4d7814591a68 /src/ats | |
parent | bfa3b153493bc4d15f0be2d3dfa0b77e45065a61 (diff) | |
download | gnunet-8042ec745551791cdd06aa6f7aec4a766fe0ded3.tar.gz gnunet-8042ec745551791cdd06aa6f7aec4a766fe0ded3.zip |
changing solver api: remove address hashmap from functions and pass instead with init
Diffstat (limited to 'src/ats')
-rw-r--r-- | src/ats/gnunet-service-ats-solver_mlp.c | 70 | ||||
-rw-r--r-- | src/ats/gnunet-service-ats-solver_mlp.h | 40 | ||||
-rw-r--r-- | src/ats/gnunet-service-ats-solver_proportional.c | 157 | ||||
-rw-r--r-- | src/ats/gnunet-service-ats-solver_proportional.h | 13 | ||||
-rw-r--r-- | src/ats/gnunet-service-ats_addresses.c | 32 | ||||
-rw-r--r-- | src/ats/gnunet-service-ats_addresses.h | 22 | ||||
-rw-r--r-- | src/ats/gnunet-service-ats_normalization.c | 1 | ||||
-rw-r--r-- | src/ats/perf_ats_mlp.c | 29 | ||||
-rw-r--r-- | src/ats/test_ats_api.conf | 2 | ||||
-rw-r--r-- | src/ats/test_ats_mlp.c | 31 | ||||
-rw-r--r-- | src/ats/test_ats_mlp_update.c | 26 |
11 files changed, 244 insertions, 179 deletions
diff --git a/src/ats/gnunet-service-ats-solver_mlp.c b/src/ats/gnunet-service-ats-solver_mlp.c index 32e360688..4b7548750 100644 --- a/src/ats/gnunet-service-ats-solver_mlp.c +++ b/src/ats/gnunet-service-ats-solver_mlp.c | |||
@@ -401,7 +401,7 @@ mlp_create_problem_count_addresses_it (void *cls, const struct GNUNET_HashCode * | |||
401 | 401 | ||
402 | static int mlp_create_problem_count_addresses ( | 402 | static int mlp_create_problem_count_addresses ( |
403 | struct GNUNET_CONTAINER_MultiHashMap * peers, | 403 | struct GNUNET_CONTAINER_MultiHashMap * peers, |
404 | struct GNUNET_CONTAINER_MultiHashMap * addresses) | 404 | const struct GNUNET_CONTAINER_MultiHashMap * addresses) |
405 | { | 405 | { |
406 | struct CountContext cctx; | 406 | struct CountContext cctx; |
407 | cctx.peers = peers; | 407 | cctx.peers = peers; |
@@ -716,7 +716,7 @@ mlp_create_problem_add_invariant_columns (struct GAS_MLP_Handle *mlp, struct MLP | |||
716 | * @return GNUNET_OK or GNUNET_SYSERR | 716 | * @return GNUNET_OK or GNUNET_SYSERR |
717 | */ | 717 | */ |
718 | static int | 718 | static int |
719 | mlp_create_problem (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHashMap * addresses) | 719 | mlp_create_problem (struct GAS_MLP_Handle *mlp) |
720 | { | 720 | { |
721 | struct MLP_Problem *p = &mlp->p; | 721 | struct MLP_Problem *p = &mlp->p; |
722 | int res = GNUNET_OK; | 722 | int res = GNUNET_OK; |
@@ -731,7 +731,7 @@ mlp_create_problem (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHas | |||
731 | p->prob = glp_create_prob (); | 731 | p->prob = glp_create_prob (); |
732 | GNUNET_assert (NULL != p->prob); | 732 | GNUNET_assert (NULL != p->prob); |
733 | p->num_peers = GNUNET_CONTAINER_multihashmap_size (mlp->peers); | 733 | p->num_peers = GNUNET_CONTAINER_multihashmap_size (mlp->peers); |
734 | p->num_addresses = mlp_create_problem_count_addresses (mlp->peers, addresses); | 734 | p->num_addresses = mlp_create_problem_count_addresses (mlp->peers, mlp->addresses); |
735 | 735 | ||
736 | /* Create problem matrix: 10 * #addresses + #q * #addresses + #q, + #peer + 2 + 1 */ | 736 | /* Create problem matrix: 10 * #addresses + #q * #addresses + #q, + #peer + 2 + 1 */ |
737 | p->num_elements = (10 * p->num_addresses + mlp->pv.m_q * p->num_addresses + mlp->pv.m_q + p->num_peers + 2 + 1); | 737 | p->num_elements = (10 * p->num_addresses + mlp->pv.m_q * p->num_addresses + mlp->pv.m_q + p->num_peers + 2 + 1); |
@@ -766,7 +766,7 @@ mlp_create_problem (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHas | |||
766 | mlp_create_problem_add_invariant_rows (mlp, p); | 766 | mlp_create_problem_add_invariant_rows (mlp, p); |
767 | 767 | ||
768 | /* Adding address dependent columns constraint rows */ | 768 | /* Adding address dependent columns constraint rows */ |
769 | GNUNET_CONTAINER_multihashmap_iterate (addresses, &mlp_create_problem_add_address_information, mlp); | 769 | GNUNET_CONTAINER_multihashmap_iterate (mlp->addresses, &mlp_create_problem_add_address_information, mlp); |
770 | 770 | ||
771 | /* Load the matrix */ | 771 | /* Load the matrix */ |
772 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Loading matrix\n"); | 772 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Loading matrix\n"); |
@@ -935,11 +935,10 @@ mlp_propagate_results (void *cls, const struct GNUNET_HashCode *key, void *value | |||
935 | * Solves the MLP problem | 935 | * Solves the MLP problem |
936 | * | 936 | * |
937 | * @param solver the MLP Handle | 937 | * @param solver the MLP Handle |
938 | * @param addresses the address hashmap | ||
939 | * @return GNUNET_OK if could be solved, GNUNET_SYSERR on failure | 938 | * @return GNUNET_OK if could be solved, GNUNET_SYSERR on failure |
940 | */ | 939 | */ |
941 | int | 940 | int |
942 | GAS_mlp_solve_problem (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addresses) | 941 | GAS_mlp_solve_problem (void *solver) |
943 | { | 942 | { |
944 | struct GAS_MLP_Handle *mlp = solver; | 943 | struct GAS_MLP_Handle *mlp = solver; |
945 | char *filename; | 944 | char *filename; |
@@ -964,13 +963,12 @@ GAS_mlp_solve_problem (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addr | |||
964 | LOG (GNUNET_ERROR_TYPE_DEBUG, "No changes to problem\n"); | 963 | LOG (GNUNET_ERROR_TYPE_DEBUG, "No changes to problem\n"); |
965 | return GNUNET_OK; | 964 | return GNUNET_OK; |
966 | } | 965 | } |
967 | mlp->addresses = addresses; | ||
968 | if (GNUNET_YES == mlp->mlp_prob_changed) | 966 | if (GNUNET_YES == mlp->mlp_prob_changed) |
969 | { | 967 | { |
970 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Problem size changed, rebuilding\n"); | 968 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Problem size changed, rebuilding\n"); |
971 | mlp_delete_problem (mlp); | 969 | mlp_delete_problem (mlp); |
972 | start_build = GNUNET_TIME_absolute_get(); | 970 | start_build = GNUNET_TIME_absolute_get(); |
973 | if (GNUNET_SYSERR == mlp_create_problem (mlp, addresses)) | 971 | if (GNUNET_SYSERR == mlp_create_problem (mlp)) |
974 | return GNUNET_SYSERR; | 972 | return GNUNET_SYSERR; |
975 | duration_build = GNUNET_TIME_absolute_get_duration (start_build); | 973 | duration_build = GNUNET_TIME_absolute_get_duration (start_build); |
976 | mlp->control_param_lp.presolve = GLP_YES; | 974 | mlp->control_param_lp.presolve = GLP_YES; |
@@ -1015,7 +1013,7 @@ GAS_mlp_solve_problem (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addr | |||
1015 | 1013 | ||
1016 | /* Propagate result*/ | 1014 | /* Propagate result*/ |
1017 | if ((GNUNET_OK == res_lp) && (GNUNET_OK == res_mip)) | 1015 | if ((GNUNET_OK == res_lp) && (GNUNET_OK == res_mip)) |
1018 | GNUNET_CONTAINER_multihashmap_iterate (addresses, &mlp_propagate_results, mlp); | 1016 | GNUNET_CONTAINER_multihashmap_iterate (mlp->addresses, &mlp_propagate_results, mlp); |
1019 | 1017 | ||
1020 | struct GNUNET_TIME_Absolute time = GNUNET_TIME_absolute_get(); | 1018 | struct GNUNET_TIME_Absolute time = GNUNET_TIME_absolute_get(); |
1021 | if (GNUNET_YES == mlp->write_mip_mps) | 1019 | if (GNUNET_YES == mlp->write_mip_mps) |
@@ -1053,7 +1051,6 @@ GAS_mlp_solve_problem (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addr | |||
1053 | */ | 1051 | */ |
1054 | void | 1052 | void |
1055 | GAS_mlp_address_add (void *solver, | 1053 | GAS_mlp_address_add (void *solver, |
1056 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
1057 | struct ATS_Address *address, | 1054 | struct ATS_Address *address, |
1058 | uint32_t network) | 1055 | uint32_t network) |
1059 | { | 1056 | { |
@@ -1064,10 +1061,8 @@ GAS_mlp_address_add (void *solver, | |||
1064 | int c2; | 1061 | int c2; |
1065 | 1062 | ||
1066 | GNUNET_assert (NULL != solver); | 1063 | GNUNET_assert (NULL != solver); |
1067 | GNUNET_assert (NULL != addresses); | ||
1068 | GNUNET_assert (NULL != address); | 1064 | GNUNET_assert (NULL != address); |
1069 | 1065 | ||
1070 | mlp->addresses = addresses; | ||
1071 | if (NULL == address->solver_information) | 1066 | if (NULL == address->solver_information) |
1072 | { | 1067 | { |
1073 | address->solver_information = GNUNET_malloc (sizeof (struct MLP_information)); | 1068 | address->solver_information = GNUNET_malloc (sizeof (struct MLP_information)); |
@@ -1093,13 +1088,13 @@ GAS_mlp_address_add (void *solver, | |||
1093 | /* Problem size changed: new address for peer with pending request */ | 1088 | /* Problem size changed: new address for peer with pending request */ |
1094 | mlp->mlp_prob_changed = GNUNET_YES; | 1089 | mlp->mlp_prob_changed = GNUNET_YES; |
1095 | if (GNUNET_YES == mlp->mlp_auto_solve) | 1090 | if (GNUNET_YES == mlp->mlp_auto_solve) |
1096 | GAS_mlp_solve_problem (solver, addresses); | 1091 | GAS_mlp_solve_problem (solver); |
1097 | } | 1092 | } |
1098 | 1093 | ||
1099 | 1094 | ||
1100 | static void | 1095 | static void |
1101 | mlp_update_quality (struct GAS_MLP_Handle *mlp, | 1096 | mlp_update_quality (struct GAS_MLP_Handle *mlp, |
1102 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | 1097 | const struct GNUNET_CONTAINER_MultiHashMap *addresses, |
1103 | struct ATS_Address * address, | 1098 | struct ATS_Address * address, |
1104 | const struct GNUNET_ATS_Information *ats_prev, uint32_t ats_prev_count) | 1099 | const struct GNUNET_ATS_Information *ats_prev, uint32_t ats_prev_count) |
1105 | { | 1100 | { |
@@ -1272,7 +1267,7 @@ mlp_update_quality (struct GAS_MLP_Handle *mlp, | |||
1272 | if ((GNUNET_YES == mlp->mlp_prob_changed) && | 1267 | if ((GNUNET_YES == mlp->mlp_prob_changed) && |
1273 | (GNUNET_YES == mlp->mlp_auto_solve)) | 1268 | (GNUNET_YES == mlp->mlp_auto_solve)) |
1274 | { | 1269 | { |
1275 | GAS_mlp_solve_problem (mlp, addresses); | 1270 | GAS_mlp_solve_problem (mlp); |
1276 | return; | 1271 | return; |
1277 | } | 1272 | } |
1278 | 1273 | ||
@@ -1328,7 +1323,6 @@ mlp_update_quality (struct GAS_MLP_Handle *mlp, | |||
1328 | */ | 1323 | */ |
1329 | void | 1324 | void |
1330 | GAS_mlp_address_update (void *solver, | 1325 | GAS_mlp_address_update (void *solver, |
1331 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
1332 | struct ATS_Address *address, | 1326 | struct ATS_Address *address, |
1333 | uint32_t prev_session, | 1327 | uint32_t prev_session, |
1334 | int prev_in_use, | 1328 | int prev_in_use, |
@@ -1340,17 +1334,15 @@ GAS_mlp_address_update (void *solver, | |||
1340 | struct MLP_information *mlpi = address->solver_information; | 1334 | struct MLP_information *mlpi = address->solver_information; |
1341 | 1335 | ||
1342 | GNUNET_assert (NULL != solver); | 1336 | GNUNET_assert (NULL != solver); |
1343 | GNUNET_assert (NULL != addresses); | ||
1344 | GNUNET_assert (NULL != address); | 1337 | GNUNET_assert (NULL != address); |
1345 | GNUNET_assert ((NULL != prev_atsi) || (0 == prev_atsi_count)); | 1338 | GNUNET_assert ((NULL != prev_atsi) || (0 == prev_atsi_count)); |
1346 | 1339 | ||
1347 | mlp->addresses = addresses; | ||
1348 | if (NULL == mlpi) | 1340 | if (NULL == mlpi) |
1349 | { | 1341 | { |
1350 | LOG (GNUNET_ERROR_TYPE_ERROR, _("Updating address for peer `%s' not added before\n"), GNUNET_i2s(&address->peer)); | 1342 | LOG (GNUNET_ERROR_TYPE_ERROR, _("Updating address for peer `%s' not added before\n"), GNUNET_i2s(&address->peer)); |
1351 | return; | 1343 | return; |
1352 | } | 1344 | } |
1353 | mlp_update_quality (mlp, addresses, address, prev_atsi, prev_atsi_count); | 1345 | mlp_update_quality (mlp, mlp->addresses, address, prev_atsi, prev_atsi_count); |
1354 | 1346 | ||
1355 | /* Is this peer included in the problem? */ | 1347 | /* Is this peer included in the problem? */ |
1356 | if (NULL == (p = GNUNET_CONTAINER_multihashmap_get (mlp->peers, &address->peer.hashPubKey))) | 1348 | if (NULL == (p = GNUNET_CONTAINER_multihashmap_get (mlp->peers, &address->peer.hashPubKey))) |
@@ -1364,7 +1356,7 @@ GAS_mlp_address_update (void *solver, | |||
1364 | mlp->mlp_prob_updated = GNUNET_YES; | 1356 | mlp->mlp_prob_updated = GNUNET_YES; |
1365 | 1357 | ||
1366 | if (GNUNET_YES == mlp->mlp_auto_solve) | 1358 | if (GNUNET_YES == mlp->mlp_auto_solve) |
1367 | GAS_mlp_solve_problem (solver, addresses); | 1359 | GAS_mlp_solve_problem (solver); |
1368 | return; | 1360 | return; |
1369 | } | 1361 | } |
1370 | 1362 | ||
@@ -1381,7 +1373,6 @@ GAS_mlp_address_update (void *solver, | |||
1381 | */ | 1373 | */ |
1382 | void | 1374 | void |
1383 | GAS_mlp_address_delete (void *solver, | 1375 | GAS_mlp_address_delete (void *solver, |
1384 | struct GNUNET_CONTAINER_MultiHashMap * addresses, | ||
1385 | struct ATS_Address *address, | 1376 | struct ATS_Address *address, |
1386 | int session_only) | 1377 | int session_only) |
1387 | { | 1378 | { |
@@ -1389,12 +1380,10 @@ GAS_mlp_address_delete (void *solver, | |||
1389 | struct GAS_MLP_Handle *mlp = solver; | 1380 | struct GAS_MLP_Handle *mlp = solver; |
1390 | struct MLP_information *mlpi; | 1381 | struct MLP_information *mlpi; |
1391 | 1382 | ||
1392 | GNUNET_assert (NULL != solver); | 1383 | GNUNET_assert (NULL != solver);; |
1393 | GNUNET_assert (NULL != addresses); | ||
1394 | GNUNET_assert (NULL != address); | 1384 | GNUNET_assert (NULL != address); |
1395 | 1385 | ||
1396 | mlpi = address->solver_information; | 1386 | mlpi = address->solver_information; |
1397 | mlp->addresses = addresses; | ||
1398 | if (NULL != mlpi) | 1387 | if (NULL != mlpi) |
1399 | { | 1388 | { |
1400 | GNUNET_free (mlpi); | 1389 | GNUNET_free (mlpi); |
@@ -1412,7 +1401,7 @@ GAS_mlp_address_delete (void *solver, | |||
1412 | /* Problem size changed: new address for peer with pending request */ | 1401 | /* Problem size changed: new address for peer with pending request */ |
1413 | mlp->mlp_prob_changed = GNUNET_YES; | 1402 | mlp->mlp_prob_changed = GNUNET_YES; |
1414 | if (GNUNET_YES == mlp->mlp_auto_solve) | 1403 | if (GNUNET_YES == mlp->mlp_auto_solve) |
1415 | GAS_mlp_solve_problem (solver, addresses); | 1404 | GAS_mlp_solve_problem (solver); |
1416 | return; | 1405 | return; |
1417 | } | 1406 | } |
1418 | 1407 | ||
@@ -1475,7 +1464,6 @@ static double get_peer_pref_value (struct GAS_MLP_Handle *mlp, const struct GNUN | |||
1475 | */ | 1464 | */ |
1476 | const struct ATS_Address * | 1465 | const struct ATS_Address * |
1477 | GAS_mlp_get_preferred_address (void *solver, | 1466 | GAS_mlp_get_preferred_address (void *solver, |
1478 | struct GNUNET_CONTAINER_MultiHashMap * addresses, | ||
1479 | const struct GNUNET_PeerIdentity *peer) | 1467 | const struct GNUNET_PeerIdentity *peer) |
1480 | { | 1468 | { |
1481 | struct GAS_MLP_Handle *mlp = solver; | 1469 | struct GAS_MLP_Handle *mlp = solver; |
@@ -1483,12 +1471,11 @@ GAS_mlp_get_preferred_address (void *solver, | |||
1483 | struct ATS_Address *res = NULL; | 1471 | struct ATS_Address *res = NULL; |
1484 | 1472 | ||
1485 | GNUNET_assert (NULL != solver); | 1473 | GNUNET_assert (NULL != solver); |
1486 | GNUNET_assert (NULL != addresses); | ||
1487 | GNUNET_assert (NULL != peer); | 1474 | GNUNET_assert (NULL != peer); |
1488 | 1475 | ||
1489 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Getting preferred address for `%s'\n", | 1476 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Getting preferred address for `%s'\n", |
1490 | GNUNET_i2s (peer)); | 1477 | GNUNET_i2s (peer)); |
1491 | mlp->addresses = addresses; | 1478 | |
1492 | /* Is this peer included in the problem? */ | 1479 | /* Is this peer included in the problem? */ |
1493 | if (NULL == (p = GNUNET_CONTAINER_multihashmap_get (mlp->peers, &peer->hashPubKey))) | 1480 | if (NULL == (p = GNUNET_CONTAINER_multihashmap_get (mlp->peers, &peer->hashPubKey))) |
1494 | { | 1481 | { |
@@ -1504,10 +1491,10 @@ GAS_mlp_get_preferred_address (void *solver, | |||
1504 | mlp->mlp_prob_changed = GNUNET_YES; | 1491 | mlp->mlp_prob_changed = GNUNET_YES; |
1505 | } | 1492 | } |
1506 | if (GNUNET_YES == mlp->mlp_auto_solve) | 1493 | if (GNUNET_YES == mlp->mlp_auto_solve) |
1507 | GAS_mlp_solve_problem (mlp, addresses); | 1494 | GAS_mlp_solve_problem (mlp); |
1508 | 1495 | ||
1509 | /* Get prefered address */ | 1496 | /* Get prefered address */ |
1510 | GNUNET_CONTAINER_multihashmap_get_multiple (addresses, &peer->hashPubKey, | 1497 | GNUNET_CONTAINER_multihashmap_get_multiple (mlp->addresses, &peer->hashPubKey, |
1511 | mlp_get_preferred_address_it, res); | 1498 | mlp_get_preferred_address_it, res); |
1512 | 1499 | ||
1513 | return res; | 1500 | return res; |
@@ -1547,7 +1534,7 @@ GAS_mlp_bulk_stop (void *solver) | |||
1547 | 1534 | ||
1548 | if (0 < s->bulk_request) | 1535 | if (0 < s->bulk_request) |
1549 | { | 1536 | { |
1550 | GAS_mlp_solve_problem (solver, s->addresses); | 1537 | GAS_mlp_solve_problem (solver); |
1551 | s->bulk_request= 0; | 1538 | s->bulk_request= 0; |
1552 | } | 1539 | } |
1553 | } | 1540 | } |
@@ -1563,14 +1550,12 @@ GAS_mlp_bulk_stop (void *solver) | |||
1563 | */ | 1550 | */ |
1564 | void | 1551 | void |
1565 | GAS_mlp_stop_get_preferred_address (void *solver, | 1552 | GAS_mlp_stop_get_preferred_address (void *solver, |
1566 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
1567 | const struct GNUNET_PeerIdentity *peer) | 1553 | const struct GNUNET_PeerIdentity *peer) |
1568 | { | 1554 | { |
1569 | struct GAS_MLP_Handle *mlp = solver; | 1555 | struct GAS_MLP_Handle *mlp = solver; |
1570 | struct ATS_Peer *p = NULL; | 1556 | struct ATS_Peer *p = NULL; |
1571 | 1557 | ||
1572 | GNUNET_assert (NULL != solver); | 1558 | GNUNET_assert (NULL != solver); |
1573 | GNUNET_assert (NULL != addresses); | ||
1574 | GNUNET_assert (NULL != peer); | 1559 | GNUNET_assert (NULL != peer); |
1575 | 1560 | ||
1576 | if (NULL != (p = GNUNET_CONTAINER_multihashmap_get (mlp->peers, &peer->hashPubKey))) | 1561 | if (NULL != (p = GNUNET_CONTAINER_multihashmap_get (mlp->peers, &peer->hashPubKey))) |
@@ -1592,7 +1577,6 @@ GAS_mlp_stop_get_preferred_address (void *solver, | |||
1592 | */ | 1577 | */ |
1593 | void | 1578 | void |
1594 | GAS_mlp_address_change_preference (void *solver, | 1579 | GAS_mlp_address_change_preference (void *solver, |
1595 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
1596 | const struct GNUNET_PeerIdentity *peer, | 1580 | const struct GNUNET_PeerIdentity *peer, |
1597 | enum GNUNET_ATS_PreferenceKind kind, | 1581 | enum GNUNET_ATS_PreferenceKind kind, |
1598 | double pref_rel) | 1582 | double pref_rel) |
@@ -1604,7 +1588,6 @@ GAS_mlp_address_change_preference (void *solver, | |||
1604 | GNUNET_i2s(peer)); | 1588 | GNUNET_i2s(peer)); |
1605 | 1589 | ||
1606 | GNUNET_STATISTICS_update (mlp->stats,"# LP address preference changes", 1, GNUNET_NO); | 1590 | GNUNET_STATISTICS_update (mlp->stats,"# LP address preference changes", 1, GNUNET_NO); |
1607 | mlp->addresses = addresses; | ||
1608 | /* Update the constraints with changed preferences */ | 1591 | /* Update the constraints with changed preferences */ |
1609 | 1592 | ||
1610 | /* Update quality constraint c7 */ | 1593 | /* Update quality constraint c7 */ |
@@ -1621,7 +1604,7 @@ GAS_mlp_address_change_preference (void *solver, | |||
1621 | /* Problem size changed: new address for peer with pending request */ | 1604 | /* Problem size changed: new address for peer with pending request */ |
1622 | mlp->mlp_prob_updated = GNUNET_YES; | 1605 | mlp->mlp_prob_updated = GNUNET_YES; |
1623 | if (GNUNET_YES == mlp->mlp_auto_solve) | 1606 | if (GNUNET_YES == mlp->mlp_auto_solve) |
1624 | GAS_mlp_solve_problem (solver, addresses); | 1607 | GAS_mlp_solve_problem (solver); |
1625 | return; | 1608 | return; |
1626 | } | 1609 | } |
1627 | 1610 | ||
@@ -1683,6 +1666,7 @@ GAS_mlp_done (void *solver) | |||
1683 | void * | 1666 | void * |
1684 | GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, | 1667 | GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, |
1685 | const struct GNUNET_STATISTICS_Handle *stats, | 1668 | const struct GNUNET_STATISTICS_Handle *stats, |
1669 | const struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
1686 | int *network, | 1670 | int *network, |
1687 | unsigned long long *out_dest, | 1671 | unsigned long long *out_dest, |
1688 | unsigned long long *in_dest, | 1672 | unsigned long long *in_dest, |
@@ -1690,7 +1674,9 @@ GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
1690 | GAS_bandwidth_changed_cb bw_changed_cb, | 1674 | GAS_bandwidth_changed_cb bw_changed_cb, |
1691 | void *bw_changed_cb_cls, | 1675 | void *bw_changed_cb_cls, |
1692 | GAS_get_preferences get_preference, | 1676 | GAS_get_preferences get_preference, |
1693 | void *get_preference_cls) | 1677 | void *get_preference_cls, |
1678 | GAS_get_properties get_properties, | ||
1679 | void *get_properties_cls) | ||
1694 | { | 1680 | { |
1695 | struct GAS_MLP_Handle * mlp = GNUNET_malloc (sizeof (struct GAS_MLP_Handle)); | 1681 | struct GAS_MLP_Handle * mlp = GNUNET_malloc (sizeof (struct GAS_MLP_Handle)); |
1696 | 1682 | ||
@@ -1707,6 +1693,13 @@ GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
1707 | struct GNUNET_TIME_Relative max_duration; | 1693 | struct GNUNET_TIME_Relative max_duration; |
1708 | long long unsigned int max_iterations; | 1694 | long long unsigned int max_iterations; |
1709 | 1695 | ||
1696 | GNUNET_assert (NULL != cfg); | ||
1697 | GNUNET_assert (NULL != stats); | ||
1698 | GNUNET_assert (NULL != addresses); | ||
1699 | GNUNET_assert (NULL != bw_changed_cb); | ||
1700 | GNUNET_assert (NULL != get_preference); | ||
1701 | GNUNET_assert (NULL != get_properties); | ||
1702 | |||
1710 | /* Init GLPK environment */ | 1703 | /* Init GLPK environment */ |
1711 | int res = glp_init_env(); | 1704 | int res = glp_init_env(); |
1712 | switch (res) { | 1705 | switch (res) { |
@@ -1892,10 +1885,13 @@ GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
1892 | 1885 | ||
1893 | /* Assign options to handle */ | 1886 | /* Assign options to handle */ |
1894 | mlp->stats = (struct GNUNET_STATISTICS_Handle *) stats; | 1887 | mlp->stats = (struct GNUNET_STATISTICS_Handle *) stats; |
1888 | mlp->addresses = addresses; | ||
1895 | mlp->bw_changed_cb = bw_changed_cb; | 1889 | mlp->bw_changed_cb = bw_changed_cb; |
1896 | mlp->bw_changed_cb_cls = bw_changed_cb_cls; | 1890 | mlp->bw_changed_cb_cls = bw_changed_cb_cls; |
1897 | mlp->get_preferences = get_preference; | 1891 | mlp->get_preferences = get_preference; |
1898 | mlp->get_preferences_cls = get_preference_cls; | 1892 | mlp->get_preferences_cls = get_preference_cls; |
1893 | mlp->get_properties = get_properties; | ||
1894 | mlp->get_properties_cls = get_properties_cls; | ||
1899 | /* Setting MLP Input variables */ | 1895 | /* Setting MLP Input variables */ |
1900 | mlp->pv.co_D = D; | 1896 | mlp->pv.co_D = D; |
1901 | mlp->pv.co_R = R; | 1897 | mlp->pv.co_R = R; |
diff --git a/src/ats/gnunet-service-ats-solver_mlp.h b/src/ats/gnunet-service-ats-solver_mlp.h index da149eeef..607b2d365 100644 --- a/src/ats/gnunet-service-ats-solver_mlp.h +++ b/src/ats/gnunet-service-ats-solver_mlp.h | |||
@@ -90,12 +90,6 @@ struct ATS_Peer | |||
90 | 90 | ||
91 | /* Legacy preference value */ | 91 | /* Legacy preference value */ |
92 | double f; | 92 | double f; |
93 | |||
94 | #if 0 | ||
95 | /* Array of quality preferences */ | ||
96 | double f_q[GNUNET_ATS_QualityPropertiesCount]; | ||
97 | |||
98 | #endif | ||
99 | }; | 93 | }; |
100 | 94 | ||
101 | 95 | ||
@@ -223,7 +217,7 @@ struct GAS_MLP_Handle | |||
223 | /** | 217 | /** |
224 | * Address hashmap for lookups | 218 | * Address hashmap for lookups |
225 | */ | 219 | */ |
226 | struct GNUNET_CONTAINER_MultiHashMap *addresses; | 220 | const struct GNUNET_CONTAINER_MultiHashMap *addresses; |
227 | 221 | ||
228 | /** | 222 | /** |
229 | * Addresses' bandwidth changed callback | 223 | * Addresses' bandwidth changed callback |
@@ -235,10 +229,28 @@ struct GAS_MLP_Handle | |||
235 | */ | 229 | */ |
236 | void *bw_changed_cb_cls; | 230 | void *bw_changed_cb_cls; |
237 | 231 | ||
232 | |||
233 | |||
234 | /** | ||
235 | * ATS function to get preferences | ||
236 | */ | ||
238 | GAS_get_preferences get_preferences; | 237 | GAS_get_preferences get_preferences; |
239 | 238 | ||
239 | /** | ||
240 | * Closure for ATS function to get preferences | ||
241 | */ | ||
240 | void *get_preferences_cls; | 242 | void *get_preferences_cls; |
241 | 243 | ||
244 | /** | ||
245 | * ATS function to get properties | ||
246 | */ | ||
247 | GAS_get_properties get_properties; | ||
248 | |||
249 | /** | ||
250 | * Closure for ATS function to get properties | ||
251 | */ | ||
252 | void *get_properties_cls; | ||
253 | |||
242 | struct MLP_Problem p; | 254 | struct MLP_Problem p; |
243 | 255 | ||
244 | struct MLP_Variables pv; | 256 | struct MLP_Variables pv; |
@@ -353,11 +365,10 @@ struct MLP_information | |||
353 | * Solves the MLP problem | 365 | * Solves the MLP problem |
354 | * | 366 | * |
355 | * @param solver the MLP Handle | 367 | * @param solver the MLP Handle |
356 | * @param addresses the address hashmap | ||
357 | * @return GNUNET_OK if could be solved, GNUNET_SYSERR on failure | 368 | * @return GNUNET_OK if could be solved, GNUNET_SYSERR on failure |
358 | */ | 369 | */ |
359 | int | 370 | int |
360 | GAS_mlp_solve_problem (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addresses); | 371 | GAS_mlp_solve_problem (void *solver); |
361 | 372 | ||
362 | 373 | ||
363 | /** | 374 | /** |
@@ -378,6 +389,7 @@ GAS_mlp_solve_problem (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addr | |||
378 | void * | 389 | void * |
379 | GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, | 390 | GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, |
380 | const struct GNUNET_STATISTICS_Handle *stats, | 391 | const struct GNUNET_STATISTICS_Handle *stats, |
392 | const struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
381 | int *network, | 393 | int *network, |
382 | unsigned long long *out_dest, | 394 | unsigned long long *out_dest, |
383 | unsigned long long *in_dest, | 395 | unsigned long long *in_dest, |
@@ -385,7 +397,9 @@ GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
385 | GAS_bandwidth_changed_cb bw_changed_cb, | 397 | GAS_bandwidth_changed_cb bw_changed_cb, |
386 | void *bw_changed_cb_cls, | 398 | void *bw_changed_cb_cls, |
387 | GAS_get_preferences get_preference, | 399 | GAS_get_preferences get_preference, |
388 | void *get_preference_cls); | 400 | void *get_preference_cls, |
401 | GAS_get_properties get_properties, | ||
402 | void *get_properties_cls); | ||
389 | 403 | ||
390 | 404 | ||
391 | /** | 405 | /** |
@@ -398,7 +412,6 @@ GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
398 | */ | 412 | */ |
399 | void | 413 | void |
400 | GAS_mlp_address_add (void *solver, | 414 | GAS_mlp_address_add (void *solver, |
401 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
402 | struct ATS_Address *address, | 415 | struct ATS_Address *address, |
403 | uint32_t network); | 416 | uint32_t network); |
404 | 417 | ||
@@ -424,7 +437,6 @@ GAS_mlp_address_add (void *solver, | |||
424 | */ | 437 | */ |
425 | void | 438 | void |
426 | GAS_mlp_address_update (void *solver, | 439 | GAS_mlp_address_update (void *solver, |
427 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
428 | struct ATS_Address *address, | 440 | struct ATS_Address *address, |
429 | uint32_t prev_session, | 441 | uint32_t prev_session, |
430 | int prev_in_use, | 442 | int prev_in_use, |
@@ -445,7 +457,6 @@ GAS_mlp_address_update (void *solver, | |||
445 | */ | 457 | */ |
446 | void | 458 | void |
447 | GAS_mlp_address_delete (void *solver, | 459 | GAS_mlp_address_delete (void *solver, |
448 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
449 | struct ATS_Address *address, | 460 | struct ATS_Address *address, |
450 | int session_only); | 461 | int session_only); |
451 | 462 | ||
@@ -461,7 +472,6 @@ GAS_mlp_address_delete (void *solver, | |||
461 | */ | 472 | */ |
462 | void | 473 | void |
463 | GAS_mlp_address_change_preference (void *solver, | 474 | GAS_mlp_address_change_preference (void *solver, |
464 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
465 | const struct GNUNET_PeerIdentity *peer, | 475 | const struct GNUNET_PeerIdentity *peer, |
466 | enum GNUNET_ATS_PreferenceKind kind, | 476 | enum GNUNET_ATS_PreferenceKind kind, |
467 | double pref_rel); | 477 | double pref_rel); |
@@ -493,7 +503,6 @@ GAS_mlp_bulk_stop (void *solver); | |||
493 | */ | 503 | */ |
494 | const struct ATS_Address * | 504 | const struct ATS_Address * |
495 | GAS_mlp_get_preferred_address (void *solver, | 505 | GAS_mlp_get_preferred_address (void *solver, |
496 | struct GNUNET_CONTAINER_MultiHashMap * addresses, | ||
497 | const struct GNUNET_PeerIdentity *peer); | 506 | const struct GNUNET_PeerIdentity *peer); |
498 | 507 | ||
499 | 508 | ||
@@ -507,7 +516,6 @@ GAS_mlp_get_preferred_address (void *solver, | |||
507 | 516 | ||
508 | void | 517 | void |
509 | GAS_mlp_stop_get_preferred_address (void *solver, | 518 | GAS_mlp_stop_get_preferred_address (void *solver, |
510 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
511 | const struct GNUNET_PeerIdentity *peer); | 519 | const struct GNUNET_PeerIdentity *peer); |
512 | 520 | ||
513 | 521 | ||
diff --git a/src/ats/gnunet-service-ats-solver_proportional.c b/src/ats/gnunet-service-ats-solver_proportional.c index ddd15eb1d..331896f15 100644 --- a/src/ats/gnunet-service-ats-solver_proportional.c +++ b/src/ats/gnunet-service-ats-solver_proportional.c | |||
@@ -224,6 +224,11 @@ struct GAS_PROPORTIONAL_Handle | |||
224 | struct GNUNET_STATISTICS_Handle *stats; | 224 | struct GNUNET_STATISTICS_Handle *stats; |
225 | 225 | ||
226 | /** | 226 | /** |
227 | * Hashmap containing all valid addresses | ||
228 | */ | ||
229 | const struct GNUNET_CONTAINER_MultiHashMap *addresses; | ||
230 | |||
231 | /** | ||
227 | * Bandwidth changed callback | 232 | * Bandwidth changed callback |
228 | */ | 233 | */ |
229 | GAS_bandwidth_changed_cb bw_changed; | 234 | GAS_bandwidth_changed_cb bw_changed; |
@@ -244,6 +249,16 @@ struct GAS_PROPORTIONAL_Handle | |||
244 | void *get_preferences_cls; | 249 | void *get_preferences_cls; |
245 | 250 | ||
246 | /** | 251 | /** |
252 | * ATS function to get properties | ||
253 | */ | ||
254 | GAS_get_properties get_properties; | ||
255 | |||
256 | /** | ||
257 | * Closure for ATS function to get properties | ||
258 | */ | ||
259 | void *get_properties_cls; | ||
260 | |||
261 | /** | ||
247 | * Bulk lock | 262 | * Bulk lock |
248 | */ | 263 | */ |
249 | int bulk_lock; | 264 | int bulk_lock; |
@@ -551,6 +566,15 @@ distribute_bandwidth_in_network (struct GAS_PROPORTIONAL_Handle *s, | |||
551 | static int | 566 | static int |
552 | get_performance_info (struct ATS_Address *address, uint32_t type); | 567 | get_performance_info (struct ATS_Address *address, uint32_t type); |
553 | 568 | ||
569 | |||
570 | |||
571 | struct FindBestAddressCtx | ||
572 | { | ||
573 | struct GAS_PROPORTIONAL_Handle *s; | ||
574 | struct ATS_Address *best; | ||
575 | }; | ||
576 | |||
577 | |||
554 | /** | 578 | /** |
555 | * Find a "good" address to use for a peer by iterating over the addresses for this peer. | 579 | * Find a "good" address to use for a peer by iterating over the addresses for this peer. |
556 | * If we already have an existing address, we stick to it. | 580 | * If we already have an existing address, we stick to it. |
@@ -564,15 +588,12 @@ get_performance_info (struct ATS_Address *address, uint32_t type); | |||
564 | static int | 588 | static int |
565 | find_best_address_it (void *cls, const struct GNUNET_HashCode * key, void *value) | 589 | find_best_address_it (void *cls, const struct GNUNET_HashCode * key, void *value) |
566 | { | 590 | { |
567 | struct ATS_Address **previous_p = cls; | 591 | struct FindBestAddressCtx *fba_ctx = (struct FindBestAddressCtx *) cls; |
568 | struct ATS_Address *current = (struct ATS_Address *) value; | 592 | struct ATS_Address *current = (struct ATS_Address *) value; |
569 | struct ATS_Address *previous = *previous_p; | ||
570 | struct GNUNET_TIME_Absolute now; | 593 | struct GNUNET_TIME_Absolute now; |
571 | struct Network *net = (struct Network *) current->solver_information; | 594 | struct Network *net = (struct Network *) current->solver_information; |
572 | uint32_t p_distance_cur; | 595 | const double *norm_prop_cur; |
573 | uint32_t p_distance_prev; | 596 | const double *norm_prop_prev; |
574 | uint32_t p_delay_cur; | ||
575 | uint32_t p_delay_prev; | ||
576 | 597 | ||
577 | now = GNUNET_TIME_absolute_get(); | 598 | now = GNUNET_TIME_absolute_get(); |
578 | 599 | ||
@@ -585,61 +606,57 @@ find_best_address_it (void *cls, const struct GNUNET_HashCode * key, void *value | |||
585 | GNUNET_TIME_absolute_get_difference(now, current->blocked_until).rel_value); | 606 | GNUNET_TIME_absolute_get_difference(now, current->blocked_until).rel_value); |
586 | return GNUNET_OK; | 607 | return GNUNET_OK; |
587 | } | 608 | } |
588 | |||
589 | if (GNUNET_NO == is_bandwidth_available_in_network (net)) | 609 | if (GNUNET_NO == is_bandwidth_available_in_network (net)) |
590 | return GNUNET_OK; /* There's no bandwidth available in this network */ | 610 | return GNUNET_OK; /* There's no bandwidth available in this network */ |
591 | 611 | if (NULL != fba_ctx->best) | |
592 | if (NULL != previous) | ||
593 | { | 612 | { |
594 | GNUNET_assert (NULL != previous->plugin); | 613 | GNUNET_assert (NULL != fba_ctx->best->plugin); |
595 | GNUNET_assert (NULL != current->plugin); | 614 | GNUNET_assert (NULL != current->plugin); |
596 | if (0 == strcmp (previous->plugin, current->plugin)) | 615 | if (0 == strcmp (fba_ctx->best->plugin, current->plugin)) |
597 | { | 616 | { |
598 | if ((0 != previous->addr_len) && | 617 | if ((0 != fba_ctx->best->addr_len) && |
599 | (0 == current->addr_len)) | 618 | (0 == current->addr_len)) |
600 | { | 619 | { |
601 | /* saved address was an outbound address, but we have an inbound address */ | 620 | /* saved address was an outbound address, but we have an inbound address */ |
602 | *previous_p = current; | 621 | fba_ctx->best = current; |
603 | return GNUNET_OK; | 622 | return GNUNET_OK; |
604 | } | 623 | } |
605 | if (0 == previous->addr_len) | 624 | if (0 == fba_ctx->best->addr_len) |
606 | { | 625 | { |
607 | /* saved address was an inbound address, so do not overwrite */ | 626 | /* saved address was an inbound address, so do not overwrite */ |
608 | return GNUNET_OK; | 627 | return GNUNET_OK; |
609 | } | 628 | } |
610 | } | 629 | } |
611 | } | 630 | } |
612 | 631 | if (NULL == fba_ctx->best) | |
613 | if (NULL == previous) | ||
614 | { | 632 | { |
615 | *previous_p = current; | 633 | fba_ctx->best = current; |
616 | return GNUNET_OK; | 634 | return GNUNET_OK; |
617 | } | 635 | } |
618 | if ((ntohl (previous->assigned_bw_in.value__) == 0) && | 636 | if ((ntohl (fba_ctx->best->assigned_bw_in.value__) == 0) && |
619 | (ntohl (current->assigned_bw_in.value__) > 0)) | 637 | (ntohl (current->assigned_bw_in.value__) > 0)) |
620 | { | 638 | { |
621 | /* stick to existing connection */ | 639 | /* stick to existing connection */ |
622 | *previous_p = current; | 640 | fba_ctx->best = current; |
623 | return GNUNET_OK; | 641 | return GNUNET_OK; |
624 | } | 642 | } |
625 | 643 | ||
626 | p_distance_prev = get_performance_info (previous, GNUNET_ATS_QUALITY_NET_DISTANCE); | 644 | norm_prop_cur = fba_ctx->s->get_properties (fba_ctx->s->get_properties_cls, |
627 | p_distance_cur = get_performance_info (current, GNUNET_ATS_QUALITY_NET_DISTANCE); | 645 | (const struct ATS_Address *) current); |
628 | if ((p_distance_prev != GNUNET_ATS_VALUE_UNDEFINED) && (p_distance_cur != GNUNET_ATS_VALUE_UNDEFINED) && | 646 | GNUNET_break (0); |
629 | (p_distance_prev > p_distance_cur)) | 647 | norm_prop_prev = fba_ctx->s->get_properties (fba_ctx->s->get_properties_cls, |
648 | (const struct ATS_Address *) fba_ctx->best); | ||
649 | |||
650 | if (norm_prop_cur[1] < norm_prop_prev[1]) | ||
630 | { | 651 | { |
631 | /* user shorter distance */ | 652 | /* user shorter distance */ |
632 | *previous_p = current; | 653 | fba_ctx->best = current; |
633 | return GNUNET_OK; | 654 | return GNUNET_OK; |
634 | } | 655 | } |
635 | 656 | if (norm_prop_cur[0] < norm_prop_prev[0]) | |
636 | p_delay_prev = get_performance_info (previous, GNUNET_ATS_QUALITY_NET_DELAY); | ||
637 | p_delay_cur = get_performance_info (current, GNUNET_ATS_QUALITY_NET_DELAY); | ||
638 | if ((p_delay_prev != GNUNET_ATS_VALUE_UNDEFINED) && (p_delay_cur != GNUNET_ATS_VALUE_UNDEFINED) && | ||
639 | (p_delay_prev > p_delay_cur)) | ||
640 | { | 657 | { |
641 | /* user lower latency */ | 658 | /* user shorter distance */ |
642 | *previous_p = current; | 659 | fba_ctx->best = current; |
643 | return GNUNET_OK; | 660 | return GNUNET_OK; |
644 | } | 661 | } |
645 | 662 | ||
@@ -857,14 +874,12 @@ get_performance_info (struct ATS_Address *address, uint32_t type) | |||
857 | * Changes the preferences for a peer in the problem | 874 | * Changes the preferences for a peer in the problem |
858 | * | 875 | * |
859 | * @param solver the solver handle | 876 | * @param solver the solver handle |
860 | * @param addresses the address hashmap | ||
861 | * @param peer the peer to change the preference for | 877 | * @param peer the peer to change the preference for |
862 | * @param kind the kind to change the preference | 878 | * @param kind the kind to change the preference |
863 | * @param pref_rel the normalized preference value for this kind over all clients | 879 | * @param pref_rel the normalized preference value for this kind over all clients |
864 | */ | 880 | */ |
865 | void | 881 | void |
866 | GAS_proportional_address_change_preference (void *solver, | 882 | GAS_proportional_address_change_preference (void *solver, |
867 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
868 | const struct GNUNET_PeerIdentity *peer, | 883 | const struct GNUNET_PeerIdentity *peer, |
869 | enum GNUNET_ATS_PreferenceKind kind, | 884 | enum GNUNET_ATS_PreferenceKind kind, |
870 | double pref_rel) | 885 | double pref_rel) |
@@ -876,6 +891,7 @@ GAS_proportional_address_change_preference (void *solver, | |||
876 | distribute_bandwidth_in_all_networks (s); | 891 | distribute_bandwidth_in_all_networks (s); |
877 | } | 892 | } |
878 | 893 | ||
894 | |||
879 | /** | 895 | /** |
880 | * Get the preferred address for a specific peer | 896 | * Get the preferred address for a specific peer |
881 | * | 897 | * |
@@ -885,41 +901,44 @@ GAS_proportional_address_change_preference (void *solver, | |||
885 | */ | 901 | */ |
886 | const struct ATS_Address * | 902 | const struct ATS_Address * |
887 | GAS_proportional_get_preferred_address (void *solver, | 903 | GAS_proportional_get_preferred_address (void *solver, |
888 | struct GNUNET_CONTAINER_MultiHashMap * addresses, | ||
889 | const struct GNUNET_PeerIdentity *peer) | 904 | const struct GNUNET_PeerIdentity *peer) |
890 | { | 905 | { |
891 | struct GAS_PROPORTIONAL_Handle *s = solver; | 906 | struct GAS_PROPORTIONAL_Handle *s = solver; |
892 | struct Network *net_prev; | 907 | struct Network *net_prev; |
893 | struct Network *net_cur; | 908 | struct Network *net_cur; |
894 | struct ATS_Address *cur; | ||
895 | struct ATS_Address *prev; | 909 | struct ATS_Address *prev; |
910 | struct FindBestAddressCtx fba_ctx; | ||
896 | 911 | ||
897 | GNUNET_assert (s != NULL); | 912 | GNUNET_assert (s != NULL); |
898 | cur = NULL; | 913 | GNUNET_assert (peer != NULL); |
914 | |||
899 | /* Get address with: stick to current address, lower distance, lower latency */ | 915 | /* Get address with: stick to current address, lower distance, lower latency */ |
900 | GNUNET_CONTAINER_multihashmap_get_multiple (addresses, &peer->hashPubKey, | 916 | fba_ctx.s = s; |
901 | &find_best_address_it, &cur); | 917 | fba_ctx.best = NULL; |
902 | if (NULL == cur) | 918 | GNUNET_break (0); |
919 | GNUNET_CONTAINER_multihashmap_get_multiple (s->addresses, &peer->hashPubKey, | ||
920 | &find_best_address_it, &fba_ctx); | ||
921 | if (NULL == fba_ctx.best) | ||
903 | { | 922 | { |
904 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Cannot suggest address for peer `%s'\n", GNUNET_i2s (peer)); | 923 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Cannot suggest address for peer `%s'\n", GNUNET_i2s (peer)); |
905 | return NULL; | 924 | return NULL; |
906 | } | 925 | } |
907 | 926 | ||
908 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Suggesting %s address %p for peer `%s'\n", | 927 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Suggesting %s address %p for peer `%s'\n", |
909 | (GNUNET_NO == cur->active) ? "inactive" : "active", | 928 | (GNUNET_NO == fba_ctx.best->active) ? "inactive" : "active", |
910 | cur, GNUNET_i2s (peer)); | 929 | fba_ctx.best, GNUNET_i2s (peer)); |
911 | net_cur = (struct Network *) cur->solver_information; | 930 | net_cur = (struct Network *) fba_ctx.best->solver_information; |
912 | if (NULL == cur) | 931 | if (NULL == fba_ctx.best) |
913 | { | 932 | { |
914 | LOG (GNUNET_ERROR_TYPE_ERROR, "Trying to suggesting unknown address peer `%s'\n", | 933 | LOG (GNUNET_ERROR_TYPE_ERROR, "Trying to suggesting unknown address peer `%s'\n", |
915 | GNUNET_i2s (peer)); | 934 | GNUNET_i2s (peer)); |
916 | GNUNET_break (0); | 935 | GNUNET_break (0); |
917 | return NULL; | 936 | return NULL; |
918 | } | 937 | } |
919 | if (GNUNET_YES == cur->active) | 938 | if (GNUNET_YES == fba_ctx.best->active) |
920 | { | 939 | { |
921 | /* This address was selected previously, so no need to update quotas */ | 940 | /* This address was selected previously, so no need to update quotas */ |
922 | return cur; | 941 | return fba_ctx.best; |
923 | } | 942 | } |
924 | 943 | ||
925 | /* This address was not active, so we have to: | 944 | /* This address was not active, so we have to: |
@@ -929,7 +948,7 @@ GAS_proportional_get_preferred_address (void *solver, | |||
929 | * - update quota for this address network | 948 | * - update quota for this address network |
930 | */ | 949 | */ |
931 | 950 | ||
932 | prev = get_active_address (s, addresses, peer); | 951 | prev = get_active_address (s, (struct GNUNET_CONTAINER_MultiHashMap *) s->addresses, peer); |
933 | if (NULL != prev) | 952 | if (NULL != prev) |
934 | { | 953 | { |
935 | net_prev = (struct Network *) prev->solver_information; | 954 | net_prev = (struct Network *) prev->solver_information; |
@@ -942,16 +961,16 @@ GAS_proportional_get_preferred_address (void *solver, | |||
942 | distribute_bandwidth_in_network (s, net_prev, NULL); | 961 | distribute_bandwidth_in_network (s, net_prev, NULL); |
943 | } | 962 | } |
944 | 963 | ||
945 | if (GNUNET_NO == (is_bandwidth_available_in_network (cur->solver_information))) | 964 | if (GNUNET_NO == (is_bandwidth_available_in_network (fba_ctx.best->solver_information))) |
946 | { | 965 | { |
947 | GNUNET_break (0); /* This should never happen*/ | 966 | GNUNET_break (0); /* This should never happen*/ |
948 | return NULL; | 967 | return NULL; |
949 | } | 968 | } |
950 | 969 | ||
951 | cur->active = GNUNET_YES; | 970 | fba_ctx.best->active = GNUNET_YES; |
952 | addresse_increment(s, net_cur, GNUNET_NO, GNUNET_YES); | 971 | addresse_increment(s, net_cur, GNUNET_NO, GNUNET_YES); |
953 | distribute_bandwidth_in_network (s, net_cur, cur); | 972 | distribute_bandwidth_in_network (s, net_cur, fba_ctx.best); |
954 | return cur; | 973 | return fba_ctx.best; |
955 | } | 974 | } |
956 | 975 | ||
957 | 976 | ||
@@ -964,7 +983,6 @@ GAS_proportional_get_preferred_address (void *solver, | |||
964 | */ | 983 | */ |
965 | void | 984 | void |
966 | GAS_proportional_stop_get_preferred_address (void *solver, | 985 | GAS_proportional_stop_get_preferred_address (void *solver, |
967 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
968 | const struct GNUNET_PeerIdentity *peer) | 986 | const struct GNUNET_PeerIdentity *peer) |
969 | { | 987 | { |
970 | return; | 988 | return; |
@@ -981,8 +999,8 @@ GAS_proportional_stop_get_preferred_address (void *solver, | |||
981 | */ | 999 | */ |
982 | void | 1000 | void |
983 | GAS_proportional_address_delete (void *solver, | 1001 | GAS_proportional_address_delete (void *solver, |
984 | struct GNUNET_CONTAINER_MultiHashMap * addresses, | 1002 | struct ATS_Address *address, |
985 | struct ATS_Address *address, int session_only) | 1003 | int session_only) |
986 | { | 1004 | { |
987 | struct GAS_PROPORTIONAL_Handle *s = solver; | 1005 | struct GAS_PROPORTIONAL_Handle *s = solver; |
988 | struct Network *net; | 1006 | struct Network *net; |
@@ -1090,15 +1108,13 @@ GAS_proportional_bulk_stop (void *solver) | |||
1090 | * Add a new single address to a network | 1108 | * Add a new single address to a network |
1091 | * | 1109 | * |
1092 | * @param solver the solver Handle | 1110 | * @param solver the solver Handle |
1093 | * @param addresses the address hashmap containing all addresses | ||
1094 | * @param address the address to add | 1111 | * @param address the address to add |
1095 | * @param network network type of this address | 1112 | * @param network network type of this address |
1096 | */ | 1113 | */ |
1097 | void | 1114 | void |
1098 | GAS_proportional_address_add (void *solver, | 1115 | GAS_proportional_address_add (void *solver, |
1099 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | 1116 | struct ATS_Address *address, |
1100 | struct ATS_Address *address, | 1117 | uint32_t network); |
1101 | uint32_t network); | ||
1102 | 1118 | ||
1103 | /** | 1119 | /** |
1104 | * Updates a single address in the solver and checks previous values | 1120 | * Updates a single address in the solver and checks previous values |
@@ -1113,7 +1129,6 @@ GAS_proportional_address_add (void *solver, | |||
1113 | */ | 1129 | */ |
1114 | void | 1130 | void |
1115 | GAS_proportional_address_update (void *solver, | 1131 | GAS_proportional_address_update (void *solver, |
1116 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
1117 | struct ATS_Address *address, | 1132 | struct ATS_Address *address, |
1118 | uint32_t session, | 1133 | uint32_t session, |
1119 | int in_use, | 1134 | int in_use, |
@@ -1163,7 +1178,7 @@ GAS_proportional_address_update (void *solver, | |||
1163 | 1178 | ||
1164 | save_active = address->active; | 1179 | save_active = address->active; |
1165 | /* remove from old network */ | 1180 | /* remove from old network */ |
1166 | GAS_proportional_address_delete (solver, addresses, address, GNUNET_NO); | 1181 | GAS_proportional_address_delete (solver, address, GNUNET_NO); |
1167 | 1182 | ||
1168 | /* set new network type */ | 1183 | /* set new network type */ |
1169 | new_net = get_network (solver, addr_net); | 1184 | new_net = get_network (solver, addr_net); |
@@ -1180,7 +1195,7 @@ GAS_proportional_address_update (void *solver, | |||
1180 | address->solver_information = new_net; | 1195 | address->solver_information = new_net; |
1181 | 1196 | ||
1182 | /* Add to new network and update*/ | 1197 | /* Add to new network and update*/ |
1183 | GAS_proportional_address_add (solver, addresses, address, addr_net); | 1198 | GAS_proportional_address_add (solver, address, addr_net); |
1184 | if (GNUNET_YES == save_active) | 1199 | if (GNUNET_YES == save_active) |
1185 | { | 1200 | { |
1186 | /* check if bandwidth available in new network */ | 1201 | /* check if bandwidth available in new network */ |
@@ -1201,7 +1216,7 @@ GAS_proportional_address_update (void *solver, | |||
1201 | s->bw_changed (s->bw_changed_cls, address); | 1216 | s->bw_changed (s->bw_changed_cls, address); |
1202 | 1217 | ||
1203 | /* Find new address to suggest since no bandwidth in network*/ | 1218 | /* Find new address to suggest since no bandwidth in network*/ |
1204 | new = (struct ATS_Address *) GAS_proportional_get_preferred_address (s, addresses, &address->peer); | 1219 | new = (struct ATS_Address *) GAS_proportional_get_preferred_address (s, &address->peer); |
1205 | if (NULL != new) | 1220 | if (NULL != new) |
1206 | { | 1221 | { |
1207 | /* Have an alternative address to suggest */ | 1222 | /* Have an alternative address to suggest */ |
@@ -1248,9 +1263,8 @@ GAS_proportional_address_update (void *solver, | |||
1248 | */ | 1263 | */ |
1249 | void | 1264 | void |
1250 | GAS_proportional_address_add (void *solver, | 1265 | GAS_proportional_address_add (void *solver, |
1251 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | 1266 | struct ATS_Address *address, |
1252 | struct ATS_Address *address, | 1267 | uint32_t network) |
1253 | uint32_t network) | ||
1254 | { | 1268 | { |
1255 | struct GAS_PROPORTIONAL_Handle *s = solver; | 1269 | struct GAS_PROPORTIONAL_Handle *s = solver; |
1256 | struct Network *net = NULL; | 1270 | struct Network *net = NULL; |
@@ -1293,6 +1307,7 @@ GAS_proportional_address_add (void *solver, | |||
1293 | * | 1307 | * |
1294 | * @param cfg configuration handle | 1308 | * @param cfg configuration handle |
1295 | * @param stats the GNUNET_STATISTICS handle | 1309 | * @param stats the GNUNET_STATISTICS handle |
1310 | * @param addresses hashmap containing all addresses | ||
1296 | * @param network array of GNUNET_ATS_NetworkType with length dest_length | 1311 | * @param network array of GNUNET_ATS_NetworkType with length dest_length |
1297 | * @param out_quota array of outbound quotas | 1312 | * @param out_quota array of outbound quotas |
1298 | * @param in_quota array of outbound quota | 1313 | * @param in_quota array of outbound quota |
@@ -1306,6 +1321,7 @@ GAS_proportional_address_add (void *solver, | |||
1306 | void * | 1321 | void * |
1307 | GAS_proportional_init (const struct GNUNET_CONFIGURATION_Handle *cfg, | 1322 | GAS_proportional_init (const struct GNUNET_CONFIGURATION_Handle *cfg, |
1308 | const struct GNUNET_STATISTICS_Handle *stats, | 1323 | const struct GNUNET_STATISTICS_Handle *stats, |
1324 | const struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
1309 | int *network, | 1325 | int *network, |
1310 | unsigned long long *out_quota, | 1326 | unsigned long long *out_quota, |
1311 | unsigned long long *in_quota, | 1327 | unsigned long long *in_quota, |
@@ -1313,24 +1329,35 @@ GAS_proportional_init (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
1313 | GAS_bandwidth_changed_cb bw_changed_cb, | 1329 | GAS_bandwidth_changed_cb bw_changed_cb, |
1314 | void *bw_changed_cb_cls, | 1330 | void *bw_changed_cb_cls, |
1315 | GAS_get_preferences get_preference, | 1331 | GAS_get_preferences get_preference, |
1316 | void *get_preference_cls) | 1332 | void *get_preference_cls, |
1333 | GAS_get_properties get_properties, | ||
1334 | void *get_properties_cls) | ||
1317 | { | 1335 | { |
1318 | int c; | 1336 | int c; |
1319 | struct GAS_PROPORTIONAL_Handle *s = GNUNET_malloc (sizeof (struct GAS_PROPORTIONAL_Handle)); | 1337 | struct GAS_PROPORTIONAL_Handle *s = GNUNET_malloc (sizeof (struct GAS_PROPORTIONAL_Handle)); |
1320 | struct Network * cur; | 1338 | struct Network * cur; |
1321 | char * net_str[GNUNET_ATS_NetworkTypeCount] = GNUNET_ATS_NetworkTypeString; | 1339 | char * net_str[GNUNET_ATS_NetworkTypeCount] = GNUNET_ATS_NetworkTypeString; |
1322 | 1340 | ||
1341 | GNUNET_assert (NULL != cfg); | ||
1342 | GNUNET_assert (NULL != stats); | ||
1343 | GNUNET_assert (NULL != network); | ||
1344 | GNUNET_assert (NULL != bw_changed_cb); | ||
1345 | GNUNET_assert (NULL != get_preference); | ||
1346 | GNUNET_assert (NULL != get_properties); | ||
1323 | 1347 | ||
1324 | s->stats = (struct GNUNET_STATISTICS_Handle *) stats; | 1348 | s->stats = (struct GNUNET_STATISTICS_Handle *) stats; |
1325 | s->bw_changed = bw_changed_cb; | 1349 | s->bw_changed = bw_changed_cb; |
1326 | s->bw_changed_cls = bw_changed_cb_cls; | 1350 | s->bw_changed_cls = bw_changed_cb_cls; |
1327 | s->get_preferences = get_preference; | 1351 | s->get_preferences = get_preference; |
1328 | s->get_preferences_cls = get_preference_cls; | 1352 | s->get_preferences_cls = get_preference_cls; |
1353 | s->get_properties = get_properties; | ||
1354 | s->get_properties_cls = get_properties_cls; | ||
1329 | s->networks = dest_length; | 1355 | s->networks = dest_length; |
1330 | s->network_entries = GNUNET_malloc (dest_length * sizeof (struct Network)); | 1356 | s->network_entries = GNUNET_malloc (dest_length * sizeof (struct Network)); |
1331 | s->active_addresses = 0; | 1357 | s->active_addresses = 0; |
1332 | s->total_addresses = 0; | 1358 | s->total_addresses = 0; |
1333 | s->bulk_lock = GNUNET_NO; | 1359 | s->bulk_lock = GNUNET_NO; |
1360 | s->addresses = addresses; | ||
1334 | 1361 | ||
1335 | for (c = 0; c < dest_length; c++) | 1362 | for (c = 0; c < dest_length; c++) |
1336 | { | 1363 | { |
diff --git a/src/ats/gnunet-service-ats-solver_proportional.h b/src/ats/gnunet-service-ats-solver_proportional.h index 2cef8c922..9a185b21a 100644 --- a/src/ats/gnunet-service-ats-solver_proportional.h +++ b/src/ats/gnunet-service-ats-solver_proportional.h | |||
@@ -45,7 +45,6 @@ | |||
45 | */ | 45 | */ |
46 | void | 46 | void |
47 | GAS_proportional_address_change_preference (void *solver, | 47 | GAS_proportional_address_change_preference (void *solver, |
48 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
49 | const struct GNUNET_PeerIdentity *peer, | 48 | const struct GNUNET_PeerIdentity *peer, |
50 | enum GNUNET_ATS_PreferenceKind kind, | 49 | enum GNUNET_ATS_PreferenceKind kind, |
51 | double pref_rel); | 50 | double pref_rel); |
@@ -68,6 +67,7 @@ GAS_proportional_address_change_preference (void *solver, | |||
68 | * @param cfg configuration handle | 67 | * @param cfg configuration handle |
69 | * @param stats the GNUNET_STATISTICS handle | 68 | * @param stats the GNUNET_STATISTICS handle |
70 | * @param network array of GNUNET_ATS_NetworkType with length dest_length | 69 | * @param network array of GNUNET_ATS_NetworkType with length dest_length |
70 | * @param addresses hashmap containing all addresses | ||
71 | * @param out_quota array of outbound quotas | 71 | * @param out_quota array of outbound quotas |
72 | * @param in_quota array of outbound quota | 72 | * @param in_quota array of outbound quota |
73 | * @param dest_length array length for quota arrays | 73 | * @param dest_length array length for quota arrays |
@@ -80,6 +80,7 @@ GAS_proportional_address_change_preference (void *solver, | |||
80 | void * | 80 | void * |
81 | GAS_proportional_init (const struct GNUNET_CONFIGURATION_Handle *cfg, | 81 | GAS_proportional_init (const struct GNUNET_CONFIGURATION_Handle *cfg, |
82 | const struct GNUNET_STATISTICS_Handle *stats, | 82 | const struct GNUNET_STATISTICS_Handle *stats, |
83 | const struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
83 | int *network, | 84 | int *network, |
84 | unsigned long long *out_quota, | 85 | unsigned long long *out_quota, |
85 | unsigned long long *in_quota, | 86 | unsigned long long *in_quota, |
@@ -87,8 +88,9 @@ GAS_proportional_init (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
87 | GAS_bandwidth_changed_cb bw_changed_cb, | 88 | GAS_bandwidth_changed_cb bw_changed_cb, |
88 | void *bw_changed_cb_cls, | 89 | void *bw_changed_cb_cls, |
89 | GAS_get_preferences get_preference, | 90 | GAS_get_preferences get_preference, |
90 | void *get_preference_cls); | 91 | void *get_preference_cls, |
91 | 92 | GAS_get_properties get_properties, | |
93 | void *get_properties_cls); | ||
92 | 94 | ||
93 | /** | 95 | /** |
94 | * Shutdown the proportional problem solver | 96 | * Shutdown the proportional problem solver |
@@ -109,7 +111,6 @@ GAS_proportional_done (void * solver); | |||
109 | */ | 111 | */ |
110 | void | 112 | void |
111 | GAS_proportional_address_add (void *solver, | 113 | GAS_proportional_address_add (void *solver, |
112 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
113 | struct ATS_Address *address, | 114 | struct ATS_Address *address, |
114 | uint32_t network); | 115 | uint32_t network); |
115 | 116 | ||
@@ -127,7 +128,6 @@ GAS_proportional_address_add (void *solver, | |||
127 | */ | 128 | */ |
128 | void | 129 | void |
129 | GAS_proportional_address_update (void *solver, | 130 | GAS_proportional_address_update (void *solver, |
130 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
131 | struct ATS_Address *address, | 131 | struct ATS_Address *address, |
132 | uint32_t session, | 132 | uint32_t session, |
133 | int in_use, | 133 | int in_use, |
@@ -145,7 +145,6 @@ GAS_proportional_address_update (void *solver, | |||
145 | */ | 145 | */ |
146 | void | 146 | void |
147 | GAS_proportional_address_delete (void *solver, | 147 | GAS_proportional_address_delete (void *solver, |
148 | struct GNUNET_CONTAINER_MultiHashMap * addresses, | ||
149 | struct ATS_Address *address, int session_only); | 148 | struct ATS_Address *address, int session_only); |
150 | 149 | ||
151 | 150 | ||
@@ -173,7 +172,6 @@ GAS_proportional_bulk_stop (void *solver); | |||
173 | */ | 172 | */ |
174 | void | 173 | void |
175 | GAS_proportional_stop_get_preferred_address (void *solver, | 174 | GAS_proportional_stop_get_preferred_address (void *solver, |
176 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
177 | const struct GNUNET_PeerIdentity *peer); | 175 | const struct GNUNET_PeerIdentity *peer); |
178 | 176 | ||
179 | 177 | ||
@@ -186,7 +184,6 @@ GAS_proportional_stop_get_preferred_address (void *solver, | |||
186 | */ | 184 | */ |
187 | const struct ATS_Address * | 185 | const struct ATS_Address * |
188 | GAS_proportional_get_preferred_address (void *solver, | 186 | GAS_proportional_get_preferred_address (void *solver, |
189 | struct GNUNET_CONTAINER_MultiHashMap * addresses, | ||
190 | const struct GNUNET_PeerIdentity *peer); | 187 | const struct GNUNET_PeerIdentity *peer); |
191 | 188 | ||
192 | /* end of gnunet-service-ats-solver_proportional.c */ | 189 | /* end of gnunet-service-ats-solver_proportional.c */ |
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c index 317cfa07c..21c6443c1 100644 --- a/src/ats/gnunet-service-ats_addresses.c +++ b/src/ats/gnunet-service-ats_addresses.c | |||
@@ -822,7 +822,7 @@ GAS_addresses_add (struct GAS_Addresses_Handle *handle, | |||
822 | handle->s_bulk_start (handle->solver); | 822 | handle->s_bulk_start (handle->solver); |
823 | GAS_normalization_normalize_property (handle->addresses, aa, atsi, atsi_count); | 823 | GAS_normalization_normalize_property (handle->addresses, aa, atsi, atsi_count); |
824 | handle->s_bulk_stop (handle->solver); | 824 | handle->s_bulk_stop (handle->solver); |
825 | handle->s_add (handle->solver, handle->addresses, aa, addr_net); | 825 | handle->s_add (handle->solver, aa, addr_net); |
826 | /* Notify performance clients about new address */ | 826 | /* Notify performance clients about new address */ |
827 | GAS_performance_notify_all_clients (&aa->peer, | 827 | GAS_performance_notify_all_clients (&aa->peer, |
828 | aa->plugin, | 828 | aa->plugin, |
@@ -868,7 +868,7 @@ GAS_addresses_add (struct GAS_Addresses_Handle *handle, | |||
868 | handle->s_bulk_start (handle->solver); | 868 | handle->s_bulk_start (handle->solver); |
869 | GAS_normalization_normalize_property (handle->addresses, ea, atsi, atsi_count); | 869 | GAS_normalization_normalize_property (handle->addresses, ea, atsi, atsi_count); |
870 | handle->s_bulk_stop (handle->solver); | 870 | handle->s_bulk_stop (handle->solver); |
871 | handle->s_update (handle->solver, handle->addresses, ea, session_id, ea->used, atsi_delta, atsi_delta_count); | 871 | handle->s_update (handle->solver, ea, session_id, ea->used, atsi_delta, atsi_delta_count); |
872 | GNUNET_free_non_null (atsi_delta); | 872 | GNUNET_free_non_null (atsi_delta); |
873 | 873 | ||
874 | /* Do the update */ | 874 | /* Do the update */ |
@@ -957,7 +957,7 @@ GAS_addresses_update (struct GAS_Addresses_Handle *handle, | |||
957 | handle->s_bulk_stop (handle->solver); | 957 | handle->s_bulk_stop (handle->solver); |
958 | 958 | ||
959 | /* Tell solver about update */ | 959 | /* Tell solver about update */ |
960 | handle->s_update (handle->solver, handle->addresses, aa, prev_session, aa->used, atsi_delta, atsi_delta_count); | 960 | handle->s_update (handle->solver, aa, prev_session, aa->used, atsi_delta, atsi_delta_count); |
961 | GNUNET_free_non_null (atsi_delta); | 961 | GNUNET_free_non_null (atsi_delta); |
962 | } | 962 | } |
963 | 963 | ||
@@ -1013,7 +1013,7 @@ destroy_by_session_id (void *cls, const struct GNUNET_HashCode * key, void *valu | |||
1013 | GNUNET_i2s (&aa->peer), aa->session_id, aa); | 1013 | GNUNET_i2s (&aa->peer), aa->session_id, aa); |
1014 | 1014 | ||
1015 | /* Notify solver about deletion */ | 1015 | /* Notify solver about deletion */ |
1016 | handle->s_del (handle->solver, handle->addresses, aa, GNUNET_NO); | 1016 | handle->s_del (handle->solver, aa, GNUNET_NO); |
1017 | destroy_address (handle, aa); | 1017 | destroy_address (handle, aa); |
1018 | dc->result = GNUNET_NO; | 1018 | dc->result = GNUNET_NO; |
1019 | return GNUNET_OK; /* Continue iteration */ | 1019 | return GNUNET_OK; /* Continue iteration */ |
@@ -1043,7 +1043,7 @@ destroy_by_session_id (void *cls, const struct GNUNET_HashCode * key, void *valu | |||
1043 | GNUNET_i2s (&aa->peer), aa->plugin, aa->session_id); | 1043 | GNUNET_i2s (&aa->peer), aa->plugin, aa->session_id); |
1044 | 1044 | ||
1045 | /* Notify solver about deletion */ | 1045 | /* Notify solver about deletion */ |
1046 | handle->s_del (handle->solver, handle->addresses, aa, GNUNET_NO); | 1046 | handle->s_del (handle->solver, aa, GNUNET_NO); |
1047 | destroy_address (handle, aa); | 1047 | destroy_address (handle, aa); |
1048 | dc->result = GNUNET_NO; | 1048 | dc->result = GNUNET_NO; |
1049 | return GNUNET_OK; /* Continue iteration */ | 1049 | return GNUNET_OK; /* Continue iteration */ |
@@ -1055,7 +1055,7 @@ destroy_by_session_id (void *cls, const struct GNUNET_HashCode * key, void *valu | |||
1055 | "Deleting session for peer `%s': `%s' %u\n", | 1055 | "Deleting session for peer `%s': `%s' %u\n", |
1056 | GNUNET_i2s (&aa->peer), aa->plugin, aa->session_id); | 1056 | GNUNET_i2s (&aa->peer), aa->plugin, aa->session_id); |
1057 | /* Notify solver to delete session */ | 1057 | /* Notify solver to delete session */ |
1058 | handle->s_del (handle->solver, handle->addresses, aa, GNUNET_YES); | 1058 | handle->s_del (handle->solver, aa, GNUNET_YES); |
1059 | aa->session_id = 0; | 1059 | aa->session_id = 0; |
1060 | return GNUNET_OK; | 1060 | return GNUNET_OK; |
1061 | } | 1061 | } |
@@ -1180,7 +1180,7 @@ GAS_addresses_in_use (struct GAS_Addresses_Handle *handle, | |||
1180 | /* Tell solver about update */ | 1180 | /* Tell solver about update */ |
1181 | prev_inuse = ea->used; | 1181 | prev_inuse = ea->used; |
1182 | ea->used = in_use; | 1182 | ea->used = in_use; |
1183 | handle->s_update (handle->solver, handle->addresses, ea, session_id, prev_inuse, NULL, 0); | 1183 | handle->s_update (handle->solver, ea, session_id, prev_inuse, NULL, 0); |
1184 | 1184 | ||
1185 | 1185 | ||
1186 | return GNUNET_OK; | 1186 | return GNUNET_OK; |
@@ -1215,7 +1215,7 @@ GAS_addresses_request_address_cancel (struct GAS_Addresses_Handle *handle, | |||
1215 | "No address requests pending for peer `%s', cannot remove!\n", GNUNET_i2s (peer)); | 1215 | "No address requests pending for peer `%s', cannot remove!\n", GNUNET_i2s (peer)); |
1216 | return; | 1216 | return; |
1217 | } | 1217 | } |
1218 | handle->s_get_stop (handle->solver, handle->addresses, peer); | 1218 | handle->s_get_stop (handle->solver, peer); |
1219 | GAS_addresses_handle_backoff_reset (handle, peer); | 1219 | GAS_addresses_handle_backoff_reset (handle, peer); |
1220 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 1220 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
1221 | "Removed request pending for peer `%s\n", GNUNET_i2s (peer)); | 1221 | "Removed request pending for peer `%s\n", GNUNET_i2s (peer)); |
@@ -1258,7 +1258,7 @@ GAS_addresses_request_address (struct GAS_Addresses_Handle *handle, | |||
1258 | } | 1258 | } |
1259 | 1259 | ||
1260 | /* Get prefered address from solver */ | 1260 | /* Get prefered address from solver */ |
1261 | aa = (struct ATS_Address *) handle->s_get (handle->solver, handle->addresses, peer); | 1261 | aa = (struct ATS_Address *) handle->s_get (handle->solver, peer); |
1262 | if (NULL == aa) | 1262 | if (NULL == aa) |
1263 | { | 1263 | { |
1264 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 1264 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
@@ -1351,7 +1351,7 @@ normalized_preference_changed_cb (void *cls, | |||
1351 | GNUNET_assert (NULL != cls); | 1351 | GNUNET_assert (NULL != cls); |
1352 | struct GAS_Addresses_Handle *handle = cls; | 1352 | struct GAS_Addresses_Handle *handle = cls; |
1353 | /* Tell solver about update */ | 1353 | /* Tell solver about update */ |
1354 | handle->s_pref (handle->solver, handle->addresses, peer, kind, pref_rel); | 1354 | handle->s_pref (handle->solver, peer, kind, pref_rel); |
1355 | } | 1355 | } |
1356 | 1356 | ||
1357 | 1357 | ||
@@ -1403,9 +1403,9 @@ get_preferences_cb (void *cls, const struct GNUNET_PeerIdentity *id) | |||
1403 | * @return array of double values with |GNUNET_ATS_QualityPropertiesCount| elements | 1403 | * @return array of double values with |GNUNET_ATS_QualityPropertiesCount| elements |
1404 | */ | 1404 | */ |
1405 | const double * | 1405 | const double * |
1406 | get_property_cb (void *cls, struct ATS_Address *address) | 1406 | get_property_cb (void *cls, const struct ATS_Address *address) |
1407 | { | 1407 | { |
1408 | return GAS_normalization_get_properties (address); | 1408 | return GAS_normalization_get_properties ((struct ATS_Address *) address); |
1409 | } | 1409 | } |
1410 | 1410 | ||
1411 | /** | 1411 | /** |
@@ -1681,6 +1681,7 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
1681 | ah->s_bulk_stop = &GAS_mlp_bulk_stop; | 1681 | ah->s_bulk_stop = &GAS_mlp_bulk_stop; |
1682 | ah->s_done = &GAS_mlp_done; | 1682 | ah->s_done = &GAS_mlp_done; |
1683 | #else | 1683 | #else |
1684 | |||
1684 | GNUNET_free (ah); | 1685 | GNUNET_free (ah); |
1685 | return NULL; | 1686 | return NULL; |
1686 | #endif | 1687 | #endif |
@@ -1720,10 +1721,11 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
1720 | &normalized_property_changed_cb, ah); | 1721 | &normalized_property_changed_cb, ah); |
1721 | quota_count = load_quotas(cfg, quotas_in, quotas_out, GNUNET_ATS_NetworkTypeCount); | 1722 | quota_count = load_quotas(cfg, quotas_in, quotas_out, GNUNET_ATS_NetworkTypeCount); |
1722 | 1723 | ||
1723 | ah->solver = ah->s_init (cfg, stats, | 1724 | ah->solver = ah->s_init (cfg, stats, ah->addresses, |
1724 | quotas, quotas_in, quotas_out, quota_count, | 1725 | quotas, quotas_in, quotas_out, quota_count, |
1725 | &bandwidth_changed_cb, ah, | 1726 | &bandwidth_changed_cb, ah, |
1726 | &get_preferences_cb, NULL); | 1727 | &get_preferences_cb, NULL, |
1728 | &get_property_cb, NULL); | ||
1727 | if (NULL == ah->solver) | 1729 | if (NULL == ah->solver) |
1728 | { | 1730 | { |
1729 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to initialize solver!\n"); | 1731 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to initialize solver!\n"); |
@@ -1750,7 +1752,7 @@ free_address_it (void *cls, const struct GNUNET_HashCode * key, void *value) | |||
1750 | { | 1752 | { |
1751 | struct GAS_Addresses_Handle *handle = cls; | 1753 | struct GAS_Addresses_Handle *handle = cls; |
1752 | struct ATS_Address *aa = value; | 1754 | struct ATS_Address *aa = value; |
1753 | handle->s_del (handle->solver, handle->addresses, aa, GNUNET_NO); | 1755 | handle->s_del (handle->solver, aa, GNUNET_NO); |
1754 | destroy_address (handle, aa); | 1756 | destroy_address (handle, aa); |
1755 | return GNUNET_OK; | 1757 | return GNUNET_OK; |
1756 | } | 1758 | } |
diff --git a/src/ats/gnunet-service-ats_addresses.h b/src/ats/gnunet-service-ats_addresses.h index 4eed02fe3..a01f67d13 100644 --- a/src/ats/gnunet-service-ats_addresses.h +++ b/src/ats/gnunet-service-ats_addresses.h | |||
@@ -365,6 +365,11 @@ typedef const double * | |||
365 | (*GAS_get_preferences) (void *cls, const struct GNUNET_PeerIdentity *id); | 365 | (*GAS_get_preferences) (void *cls, const struct GNUNET_PeerIdentity *id); |
366 | 366 | ||
367 | 367 | ||
368 | typedef const double * | ||
369 | (*GAS_get_properties) (void *cls, const struct ATS_Address *address); | ||
370 | |||
371 | |||
372 | |||
368 | /* | 373 | /* |
369 | * Solver API | 374 | * Solver API |
370 | * ---------- | 375 | * ---------- |
@@ -372,6 +377,7 @@ typedef const double * | |||
372 | 377 | ||
373 | /** | 378 | /** |
374 | * Init the simplistic problem solving component | 379 | * Init the simplistic problem solving component |
380 | *==32673== by 0x40571F: GAS_addresses_request_address (gnunet-service-ats_addresses.c:1261) | ||
375 | * | 381 | * |
376 | * Quotas: | 382 | * Quotas: |
377 | * network[i] contains the network type as type GNUNET_ATS_NetworkType[i] | 383 | * network[i] contains the network type as type GNUNET_ATS_NetworkType[i] |
@@ -386,6 +392,7 @@ typedef const double * | |||
386 | * | 392 | * |
387 | * @param cfg configuration handle | 393 | * @param cfg configuration handle |
388 | * @param stats the GNUNET_STATISTICS handle | 394 | * @param stats the GNUNET_STATISTICS handle |
395 | * @param addresses hashmap containing all addresses | ||
389 | * @param network array of GNUNET_ATS_NetworkType with length dest_length | 396 | * @param network array of GNUNET_ATS_NetworkType with length dest_length |
390 | * @param out_quota array of outbound quotas | 397 | * @param out_quota array of outbound quotas |
391 | * @param in_quota array of outbound quota | 398 | * @param in_quota array of outbound quota |
@@ -395,6 +402,7 @@ typedef const double * | |||
395 | typedef void * | 402 | typedef void * |
396 | (*GAS_solver_init) (const struct GNUNET_CONFIGURATION_Handle *cfg, | 403 | (*GAS_solver_init) (const struct GNUNET_CONFIGURATION_Handle *cfg, |
397 | const struct GNUNET_STATISTICS_Handle *stats, | 404 | const struct GNUNET_STATISTICS_Handle *stats, |
405 | const struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
398 | int *network, | 406 | int *network, |
399 | unsigned long long *out_quota, | 407 | unsigned long long *out_quota, |
400 | unsigned long long *in_quota, | 408 | unsigned long long *in_quota, |
@@ -402,7 +410,9 @@ typedef void * | |||
402 | GAS_bandwidth_changed_cb bw_changed_cb, | 410 | GAS_bandwidth_changed_cb bw_changed_cb, |
403 | void *bw_changed_cb_cls, | 411 | void *bw_changed_cb_cls, |
404 | GAS_get_preferences get_preference, | 412 | GAS_get_preferences get_preference, |
405 | void *get_preference_cls); | 413 | void *get_preference_cls, |
414 | GAS_get_properties get_properties, | ||
415 | void *get_properties_cls); | ||
406 | 416 | ||
407 | 417 | ||
408 | /** | 418 | /** |
@@ -417,7 +427,6 @@ typedef void * | |||
417 | */ | 427 | */ |
418 | typedef void | 428 | typedef void |
419 | (*GAS_solver_address_change_preference) (void *solver, | 429 | (*GAS_solver_address_change_preference) (void *solver, |
420 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
421 | const struct GNUNET_PeerIdentity *peer, | 430 | const struct GNUNET_PeerIdentity *peer, |
422 | enum GNUNET_ATS_PreferenceKind kind, | 431 | enum GNUNET_ATS_PreferenceKind kind, |
423 | double pref_rel); | 432 | double pref_rel); |
@@ -438,9 +447,8 @@ typedef void | |||
438 | */ | 447 | */ |
439 | typedef void | 448 | typedef void |
440 | (*GAS_solver_address_add) (void *solver, | 449 | (*GAS_solver_address_add) (void *solver, |
441 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | 450 | struct ATS_Address *address, |
442 | struct ATS_Address *address, | 451 | uint32_t network); |
443 | uint32_t network); | ||
444 | 452 | ||
445 | 453 | ||
446 | /** | 454 | /** |
@@ -453,7 +461,6 @@ typedef void | |||
453 | */ | 461 | */ |
454 | typedef void | 462 | typedef void |
455 | (*GAS_solver_address_delete) (void *solver, | 463 | (*GAS_solver_address_delete) (void *solver, |
456 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
457 | struct ATS_Address *address, | 464 | struct ATS_Address *address, |
458 | int session_only); | 465 | int session_only); |
459 | 466 | ||
@@ -471,7 +478,6 @@ typedef void | |||
471 | */ | 478 | */ |
472 | typedef void | 479 | typedef void |
473 | (*GAS_solver_address_update) (void *solver, | 480 | (*GAS_solver_address_update) (void *solver, |
474 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
475 | struct ATS_Address *address, | 481 | struct ATS_Address *address, |
476 | uint32_t prev_session, | 482 | uint32_t prev_session, |
477 | int in_use, | 483 | int in_use, |
@@ -488,7 +494,6 @@ typedef void | |||
488 | */ | 494 | */ |
489 | typedef const struct ATS_Address * | 495 | typedef const struct ATS_Address * |
490 | (*GAS_solver_get_preferred_address) (void *solver, | 496 | (*GAS_solver_get_preferred_address) (void *solver, |
491 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
492 | const struct GNUNET_PeerIdentity *peer); | 497 | const struct GNUNET_PeerIdentity *peer); |
493 | 498 | ||
494 | 499 | ||
@@ -501,7 +506,6 @@ typedef const struct ATS_Address * | |||
501 | */ | 506 | */ |
502 | typedef void | 507 | typedef void |
503 | (*GAS_solver_stop_get_preferred_address) (void *solver, | 508 | (*GAS_solver_stop_get_preferred_address) (void *solver, |
504 | struct GNUNET_CONTAINER_MultiHashMap *addresses, | ||
505 | const struct GNUNET_PeerIdentity *peer); | 509 | const struct GNUNET_PeerIdentity *peer); |
506 | 510 | ||
507 | /** | 511 | /** |
diff --git a/src/ats/gnunet-service-ats_normalization.c b/src/ats/gnunet-service-ats_normalization.c index 6ced1b49e..982668d57 100644 --- a/src/ats/gnunet-service-ats_normalization.c +++ b/src/ats/gnunet-service-ats_normalization.c | |||
@@ -534,6 +534,7 @@ GAS_normalization_get_properties (struct ATS_Address *address) | |||
534 | else | 534 | else |
535 | norm_values[i] = DEFAULT_REL_QUALITY; | 535 | norm_values[i] = DEFAULT_REL_QUALITY; |
536 | } | 536 | } |
537 | GNUNET_break (0); | ||
537 | return norm_values; | 538 | return norm_values; |
538 | } | 539 | } |
539 | 540 | ||
diff --git a/src/ats/perf_ats_mlp.c b/src/ats/perf_ats_mlp.c index a9a142387..b6955b766 100644 --- a/src/ats/perf_ats_mlp.c +++ b/src/ats/perf_ats_mlp.c | |||
@@ -150,6 +150,12 @@ normalized_property_changed_cb (void *cls, | |||
150 | /* TODO */ | 150 | /* TODO */ |
151 | } | 151 | } |
152 | 152 | ||
153 | const double * | ||
154 | get_property_cb (void *cls, const struct ATS_Address *address) | ||
155 | { | ||
156 | return GAS_normalization_get_properties ((struct ATS_Address *) address); | ||
157 | } | ||
158 | |||
153 | 159 | ||
154 | static const double * | 160 | static const double * |
155 | get_preferences_cb (void *cls, const struct GNUNET_PeerIdentity *id) | 161 | get_preferences_cb (void *cls, const struct GNUNET_PeerIdentity *id) |
@@ -184,7 +190,7 @@ address_initial_update (void *solver, struct GNUNET_CONTAINER_MultiHashMap * add | |||
184 | ats[1].type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE); | 190 | ats[1].type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE); |
185 | ats[1].value = htonl (GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK, 10)); | 191 | ats[1].value = htonl (GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK, 10)); |
186 | 192 | ||
187 | GAS_mlp_address_update (mlp, addresses, address, 0, GNUNET_YES, ats, 2); | 193 | GAS_mlp_address_update (mlp, address, 0, GNUNET_YES, ats, 2); |
188 | } | 194 | } |
189 | 195 | ||
190 | 196 | ||
@@ -215,7 +221,7 @@ update_single_addresses (struct ATS_Address *cur) | |||
215 | default: | 221 | default: |
216 | break; | 222 | break; |
217 | } | 223 | } |
218 | GAS_mlp_address_update (mlp, addresses, cur, 0, GNUNET_YES, ats, 1); | 224 | GAS_mlp_address_update (mlp, cur, 0, GNUNET_YES, ats, 1); |
219 | } | 225 | } |
220 | 226 | ||
221 | static void | 227 | static void |
@@ -314,8 +320,11 @@ check (void *cls, char *const *args, const char *cfgfile, | |||
314 | addresses = GNUNET_CONTAINER_multihashmap_create (N_address, GNUNET_NO); | 320 | addresses = GNUNET_CONTAINER_multihashmap_create (N_address, GNUNET_NO); |
315 | 321 | ||
316 | /* Init MLP solver */ | 322 | /* Init MLP solver */ |
317 | mlp = GAS_mlp_init (cfg, stats, quotas, quotas_out, quotas_in, | 323 | mlp = GAS_mlp_init (cfg, stats, addresses, |
318 | GNUNET_ATS_NetworkTypeCount, &bandwidth_changed_cb, NULL, &get_preferences_cb, NULL); | 324 | quotas, quotas_out, quotas_in, |
325 | GNUNET_ATS_NetworkTypeCount, &bandwidth_changed_cb, NULL, | ||
326 | &get_preferences_cb, NULL, | ||
327 | &get_property_cb, NULL); | ||
319 | if (NULL == mlp) | 328 | if (NULL == mlp) |
320 | { | 329 | { |
321 | GNUNET_break (0); | 330 | GNUNET_break (0); |
@@ -338,16 +347,16 @@ check (void *cls, char *const *args, const char *cfgfile, | |||
338 | { | 347 | { |
339 | cur_addr = perf_create_address(cp, ca); | 348 | cur_addr = perf_create_address(cp, ca); |
340 | /* add address */ | 349 | /* add address */ |
341 | GAS_mlp_address_add (mlp, addresses, cur_addr, GNUNET_ATS_NET_UNSPECIFIED); | 350 | GAS_mlp_address_add (mlp, cur_addr, GNUNET_ATS_NET_UNSPECIFIED); |
342 | address_initial_update (mlp, addresses, cur_addr); | 351 | address_initial_update (mlp, addresses, cur_addr); |
343 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding address for peer %u address %u: \n", cp, ca); | 352 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding address for peer %u address %u: \n", cp, ca); |
344 | } | 353 | } |
345 | GAS_mlp_get_preferred_address( mlp, addresses, &peers[cp].id); | 354 | GAS_mlp_get_preferred_address( mlp, &peers[cp].id); |
346 | /* solve */ | 355 | /* solve */ |
347 | if (cp + 1 >= N_peers_start) | 356 | if (cp + 1 >= N_peers_start) |
348 | { | 357 | { |
349 | /* Solve the full problem */ | 358 | /* Solve the full problem */ |
350 | GAS_mlp_solve_problem (mlp, addresses); | 359 | GAS_mlp_solve_problem (mlp); |
351 | full_lp_res = mlp->ps.lp_res; | 360 | full_lp_res = mlp->ps.lp_res; |
352 | full_mip_res = mlp->ps.mip_res; | 361 | full_mip_res = mlp->ps.mip_res; |
353 | full_lp_presolv = mlp->ps.lp_presolv; | 362 | full_lp_presolv = mlp->ps.lp_presolv; |
@@ -361,8 +370,8 @@ check (void *cls, char *const *args, const char *cfgfile, | |||
361 | { | 370 | { |
362 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Updating problem with %u peers and %u addresses\n", cp + 1, ca); | 371 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Updating problem with %u peers and %u addresses\n", cp + 1, ca); |
363 | update_addresses (cp + 1, ca, opt_update_quantity); | 372 | update_addresses (cp + 1, ca, opt_update_quantity); |
364 | GAS_mlp_solve_problem (mlp, addresses); | 373 | GAS_mlp_solve_problem (mlp); |
365 | GAS_mlp_solve_problem (mlp, addresses); | 374 | GAS_mlp_solve_problem (mlp); |
366 | update_lp_res = mlp->ps.lp_res; | 375 | update_lp_res = mlp->ps.lp_res; |
367 | update_mip_res = mlp->ps.mip_res; | 376 | update_mip_res = mlp->ps.mip_res; |
368 | update_lp_presolv = mlp->ps.lp_presolv; | 377 | update_lp_presolv = mlp->ps.lp_presolv; |
@@ -418,7 +427,7 @@ check (void *cls, char *const *args, const char *cfgfile, | |||
418 | { | 427 | { |
419 | for (cur = peers[cp].head; cur != NULL; cur = next) | 428 | for (cur = peers[cp].head; cur != NULL; cur = next) |
420 | { | 429 | { |
421 | GAS_mlp_address_delete (mlp, addresses, cur, GNUNET_NO); | 430 | GAS_mlp_address_delete (mlp, cur, GNUNET_NO); |
422 | next = cur->next; | 431 | next = cur->next; |
423 | GNUNET_CONTAINER_DLL_remove (peers[cp].head, peers[cp].tail, cur); | 432 | GNUNET_CONTAINER_DLL_remove (peers[cp].head, peers[cp].tail, cur); |
424 | GNUNET_free (cur); | 433 | GNUNET_free (cur); |
diff --git a/src/ats/test_ats_api.conf b/src/ats/test_ats_api.conf index 9e00a15d7..96deef998 100644 --- a/src/ats/test_ats_api.conf +++ b/src/ats/test_ats_api.conf | |||
@@ -7,7 +7,7 @@ DEFAULTSERVICES = ats | |||
7 | UNIXPATH = /tmp/test-ats-scheduling-arm.sock | 7 | UNIXPATH = /tmp/test-ats-scheduling-arm.sock |
8 | 8 | ||
9 | [ats] | 9 | [ats] |
10 | #PREFIX = valgrind --leak-check=full --track-origins=yes --num-callers=25 | 10 | PREFIX = valgrind --leak-check=full --track-origins=yes --num-callers=25 |
11 | AUTOSTART = YES | 11 | AUTOSTART = YES |
12 | PORT = 12002 | 12 | PORT = 12002 |
13 | HOSTNAME = localhost | 13 | HOSTNAME = localhost |
diff --git a/src/ats/test_ats_mlp.c b/src/ats/test_ats_mlp.c index abdc74bdb..ea1e5076a 100644 --- a/src/ats/test_ats_mlp.c +++ b/src/ats/test_ats_mlp.c | |||
@@ -75,7 +75,7 @@ int addr_it (void *cls, | |||
75 | void *value) | 75 | void *value) |
76 | { | 76 | { |
77 | struct ATS_Address *address = (struct ATS_Address *) value; | 77 | struct ATS_Address *address = (struct ATS_Address *) value; |
78 | GAS_mlp_address_delete (mlp, addresses, address, GNUNET_NO); | 78 | GAS_mlp_address_delete (mlp, address, GNUNET_NO); |
79 | GNUNET_CONTAINER_multihashmap_remove (addresses, key, value); | 79 | GNUNET_CONTAINER_multihashmap_remove (addresses, key, value); |
80 | GNUNET_free (address); | 80 | GNUNET_free (address); |
81 | return GNUNET_OK; | 81 | return GNUNET_OK; |
@@ -133,6 +133,13 @@ get_preferences_cb (void *cls, const struct GNUNET_PeerIdentity *id) | |||
133 | return GAS_normalization_get_preferences (id); | 133 | return GAS_normalization_get_preferences (id); |
134 | } | 134 | } |
135 | 135 | ||
136 | const double * | ||
137 | get_property_cb (void *cls, const struct ATS_Address *address) | ||
138 | { | ||
139 | return GAS_normalization_get_properties ((struct ATS_Address *) address); | ||
140 | } | ||
141 | |||
142 | |||
136 | static void | 143 | static void |
137 | normalized_property_changed_cb (void *cls, | 144 | normalized_property_changed_cb (void *cls, |
138 | const struct ATS_Address *peer, | 145 | const struct ATS_Address *peer, |
@@ -214,8 +221,12 @@ check (void *cls, char *const *args, const char *cfgfile, | |||
214 | addresses = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO); | 221 | addresses = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO); |
215 | 222 | ||
216 | /* Init MLP solver */ | 223 | /* Init MLP solver */ |
217 | mlp = GAS_mlp_init (cfg, stats, quotas, quotas_out, quotas_in, | 224 | mlp = GAS_mlp_init (cfg, stats, addresses, |
218 | GNUNET_ATS_NetworkTypeCount, &bandwidth_changed_cb, NULL, &get_preferences_cb, NULL); | 225 | quotas, quotas_out, quotas_in, |
226 | GNUNET_ATS_NetworkTypeCount, | ||
227 | &bandwidth_changed_cb, NULL, | ||
228 | &get_preferences_cb, NULL, | ||
229 | &get_property_cb, NULL); | ||
219 | if (NULL == mlp) | 230 | if (NULL == mlp) |
220 | { | 231 | { |
221 | GNUNET_break (0); | 232 | GNUNET_break (0); |
@@ -251,7 +262,7 @@ check (void *cls, char *const *args, const char *cfgfile, | |||
251 | GNUNET_CONTAINER_multihashmap_put (addresses, &p[0].hashPubKey, address[0], | 262 | GNUNET_CONTAINER_multihashmap_put (addresses, &p[0].hashPubKey, address[0], |
252 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); | 263 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); |
253 | /* Adding address 0 */ | 264 | /* Adding address 0 */ |
254 | GAS_mlp_address_add (mlp, addresses, address[0], GNUNET_ATS_NET_UNSPECIFIED); | 265 | GAS_mlp_address_add (mlp, address[0], GNUNET_ATS_NET_UNSPECIFIED); |
255 | 266 | ||
256 | /* Create address 1 */ | 267 | /* Create address 1 */ |
257 | address[1] = create_address (&p[0], "test_plugin1", "test_addr1", strlen("test_addr1")+1, 0); | 268 | address[1] = create_address (&p[0], "test_plugin1", "test_addr1", strlen("test_addr1")+1, 0); |
@@ -264,7 +275,7 @@ check (void *cls, char *const *args, const char *cfgfile, | |||
264 | GNUNET_CONTAINER_multihashmap_put (addresses, &p[0].hashPubKey, address[1], | 275 | GNUNET_CONTAINER_multihashmap_put (addresses, &p[0].hashPubKey, address[1], |
265 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); | 276 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); |
266 | /* Adding address 1*/ | 277 | /* Adding address 1*/ |
267 | GAS_mlp_address_add (mlp, addresses, address[1], GNUNET_ATS_NET_UNSPECIFIED); | 278 | GAS_mlp_address_add (mlp, address[1], GNUNET_ATS_NET_UNSPECIFIED); |
268 | 279 | ||
269 | 280 | ||
270 | /* Create address 3 */ | 281 | /* Create address 3 */ |
@@ -278,22 +289,22 @@ check (void *cls, char *const *args, const char *cfgfile, | |||
278 | GNUNET_CONTAINER_multihashmap_put (addresses, &p[1].hashPubKey, address[2], | 289 | GNUNET_CONTAINER_multihashmap_put (addresses, &p[1].hashPubKey, address[2], |
279 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); | 290 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); |
280 | /* Adding address 3*/ | 291 | /* Adding address 3*/ |
281 | GAS_mlp_address_add (mlp, addresses, address[2], GNUNET_ATS_NET_UNSPECIFIED); | 292 | GAS_mlp_address_add (mlp, address[2], GNUNET_ATS_NET_UNSPECIFIED); |
282 | 293 | ||
283 | 294 | ||
284 | /* Updating address 0*/ | 295 | /* Updating address 0*/ |
285 | ats.type = htonl (GNUNET_ATS_NETWORK_TYPE); | 296 | ats.type = htonl (GNUNET_ATS_NETWORK_TYPE); |
286 | ats.value = htonl (GNUNET_ATS_NET_WAN); | 297 | ats.value = htonl (GNUNET_ATS_NET_WAN); |
287 | GAS_mlp_address_update (mlp, addresses, address[0], 1, GNUNET_NO, &ats, 1); | 298 | GAS_mlp_address_update (mlp, address[0], 1, GNUNET_NO, &ats, 1); |
288 | 299 | ||
289 | /* Retrieving preferred address for peer and wait for callback */ | 300 | /* Retrieving preferred address for peer and wait for callback */ |
290 | GAS_mlp_get_preferred_address (mlp, addresses, &p[0]); | 301 | GAS_mlp_get_preferred_address (mlp, &p[0]); |
291 | GAS_mlp_get_preferred_address (mlp, addresses, &p[1]); | 302 | GAS_mlp_get_preferred_address (mlp, &p[1]); |
292 | 303 | ||
293 | mlp->write_mip_mps = GNUNET_NO; | 304 | mlp->write_mip_mps = GNUNET_NO; |
294 | mlp->write_mip_sol = GNUNET_NO; | 305 | mlp->write_mip_sol = GNUNET_NO; |
295 | 306 | ||
296 | GAS_mlp_solve_problem (mlp, addresses); | 307 | GAS_mlp_solve_problem (mlp); |
297 | } | 308 | } |
298 | 309 | ||
299 | 310 | ||
diff --git a/src/ats/test_ats_mlp_update.c b/src/ats/test_ats_mlp_update.c index e806bd85d..c13261e9d 100644 --- a/src/ats/test_ats_mlp_update.c +++ b/src/ats/test_ats_mlp_update.c | |||
@@ -81,7 +81,7 @@ int addr_it (void *cls, | |||
81 | void *value) | 81 | void *value) |
82 | { | 82 | { |
83 | struct ATS_Address *address = (struct ATS_Address *) value; | 83 | struct ATS_Address *address = (struct ATS_Address *) value; |
84 | GAS_mlp_address_delete (mlp, addresses, address, GNUNET_NO); | 84 | GAS_mlp_address_delete (mlp, address, GNUNET_NO); |
85 | GNUNET_CONTAINER_multihashmap_remove (addresses, key, value); | 85 | GNUNET_CONTAINER_multihashmap_remove (addresses, key, value); |
86 | GNUNET_free (address); | 86 | GNUNET_free (address); |
87 | return GNUNET_OK; | 87 | return GNUNET_OK; |
@@ -139,6 +139,12 @@ get_preferences_cb (void *cls, const struct GNUNET_PeerIdentity *id) | |||
139 | return GAS_normalization_get_preferences (id); | 139 | return GAS_normalization_get_preferences (id); |
140 | } | 140 | } |
141 | 141 | ||
142 | const double * | ||
143 | get_property_cb (void *cls, const struct ATS_Address *address) | ||
144 | { | ||
145 | return GAS_normalization_get_properties ((struct ATS_Address *) address); | ||
146 | } | ||
147 | |||
142 | static void | 148 | static void |
143 | normalized_property_changed_cb (void *cls, | 149 | normalized_property_changed_cb (void *cls, |
144 | const struct ATS_Address *peer, | 150 | const struct ATS_Address *peer, |
@@ -210,8 +216,12 @@ check (void *cls, char *const *args, const char *cfgfile, | |||
210 | addresses = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO); | 216 | addresses = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO); |
211 | 217 | ||
212 | /* Init MLP solver */ | 218 | /* Init MLP solver */ |
213 | mlp = GAS_mlp_init (cfg, stats, quotas, quotas_out, quotas_in, | 219 | mlp = GAS_mlp_init (cfg, stats, addresses, |
214 | GNUNET_ATS_NetworkTypeCount, &bandwidth_changed_cb, NULL, &get_preferences_cb, NULL); | 220 | quotas, quotas_out, quotas_in, |
221 | GNUNET_ATS_NetworkTypeCount, | ||
222 | &bandwidth_changed_cb, NULL, | ||
223 | &get_preferences_cb, NULL, | ||
224 | &get_property_cb, NULL); | ||
215 | if (NULL == mlp) | 225 | if (NULL == mlp) |
216 | { | 226 | { |
217 | GNUNET_break (0); | 227 | GNUNET_break (0); |
@@ -239,13 +249,13 @@ check (void *cls, char *const *args, const char *cfgfile, | |||
239 | GNUNET_CONTAINER_multihashmap_put (addresses, &p[0].hashPubKey, address[0], | 249 | GNUNET_CONTAINER_multihashmap_put (addresses, &p[0].hashPubKey, address[0], |
240 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); | 250 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); |
241 | /* Adding address 0 */ | 251 | /* Adding address 0 */ |
242 | GAS_mlp_address_add (mlp, addresses, address[0], GNUNET_ATS_NET_UNSPECIFIED); | 252 | GAS_mlp_address_add (mlp, address[0], GNUNET_ATS_NET_UNSPECIFIED); |
243 | 253 | ||
244 | /* Retrieving preferred address for peer and wait for callback */ | 254 | /* Retrieving preferred address for peer and wait for callback */ |
245 | GAS_mlp_get_preferred_address (mlp, addresses, &p[0]); | 255 | GAS_mlp_get_preferred_address (mlp, &p[0]); |
246 | 256 | ||
247 | /* Solve problem to build matrix */ | 257 | /* Solve problem to build matrix */ |
248 | GAS_mlp_solve_problem (mlp, addresses); | 258 | GAS_mlp_solve_problem (mlp); |
249 | 259 | ||
250 | address[0]->atsi = ats; | 260 | address[0]->atsi = ats; |
251 | address[0]->atsi_count = 4; | 261 | address[0]->atsi_count = 4; |
@@ -268,10 +278,10 @@ check (void *cls, char *const *args, const char *cfgfile, | |||
268 | ats_prev[3].type = htonl (GNUNET_ATS_ARRAY_TERMINATOR); | 278 | ats_prev[3].type = htonl (GNUNET_ATS_ARRAY_TERMINATOR); |
269 | ats_prev[3].value = htonl (GNUNET_ATS_VALUE_UNDEFINED); | 279 | ats_prev[3].value = htonl (GNUNET_ATS_VALUE_UNDEFINED); |
270 | 280 | ||
271 | GAS_mlp_address_update (mlp, addresses, address[0], 1, GNUNET_NO, ats_prev, 4); | 281 | GAS_mlp_address_update (mlp, address[0], 1, GNUNET_NO, ats_prev, 4); |
272 | 282 | ||
273 | /* Solve problem to build matrix */ | 283 | /* Solve problem to build matrix */ |
274 | GAS_mlp_solve_problem (mlp, addresses); | 284 | GAS_mlp_solve_problem (mlp); |
275 | } | 285 | } |
276 | 286 | ||
277 | 287 | ||