aboutsummaryrefslogtreecommitdiff
path: root/src/ats
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2013-07-03 13:40:31 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2013-07-03 13:40:31 +0000
commit8042ec745551791cdd06aa6f7aec4a766fe0ded3 (patch)
treeca113611a8ca17e9fede53f6eaff4d7814591a68 /src/ats
parentbfa3b153493bc4d15f0be2d3dfa0b77e45065a61 (diff)
downloadgnunet-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.c70
-rw-r--r--src/ats/gnunet-service-ats-solver_mlp.h40
-rw-r--r--src/ats/gnunet-service-ats-solver_proportional.c157
-rw-r--r--src/ats/gnunet-service-ats-solver_proportional.h13
-rw-r--r--src/ats/gnunet-service-ats_addresses.c32
-rw-r--r--src/ats/gnunet-service-ats_addresses.h22
-rw-r--r--src/ats/gnunet-service-ats_normalization.c1
-rw-r--r--src/ats/perf_ats_mlp.c29
-rw-r--r--src/ats/test_ats_api.conf2
-rw-r--r--src/ats/test_ats_mlp.c31
-rw-r--r--src/ats/test_ats_mlp_update.c26
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
402static int mlp_create_problem_count_addresses ( 402static 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 */
718static int 718static int
719mlp_create_problem (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHashMap * addresses) 719mlp_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 */
941int 940int
942GAS_mlp_solve_problem (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addresses) 941GAS_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 */
1054void 1052void
1055GAS_mlp_address_add (void *solver, 1053GAS_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
1100static void 1095static void
1101mlp_update_quality (struct GAS_MLP_Handle *mlp, 1096mlp_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 */
1329void 1324void
1330GAS_mlp_address_update (void *solver, 1325GAS_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 */
1382void 1374void
1383GAS_mlp_address_delete (void *solver, 1375GAS_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 */
1476const struct ATS_Address * 1465const struct ATS_Address *
1477GAS_mlp_get_preferred_address (void *solver, 1466GAS_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 */
1564void 1551void
1565GAS_mlp_stop_get_preferred_address (void *solver, 1552GAS_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 */
1593void 1578void
1594GAS_mlp_address_change_preference (void *solver, 1579GAS_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)
1683void * 1666void *
1684GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, 1667GAS_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 */
359int 370int
360GAS_mlp_solve_problem (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addresses); 371GAS_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
378void * 389void *
379GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, 390GAS_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 */
399void 413void
400GAS_mlp_address_add (void *solver, 414GAS_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 */
425void 438void
426GAS_mlp_address_update (void *solver, 439GAS_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 */
446void 458void
447GAS_mlp_address_delete (void *solver, 459GAS_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 */
462void 473void
463GAS_mlp_address_change_preference (void *solver, 474GAS_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 */
494const struct ATS_Address * 504const struct ATS_Address *
495GAS_mlp_get_preferred_address (void *solver, 505GAS_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
508void 517void
509GAS_mlp_stop_get_preferred_address (void *solver, 518GAS_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,
551static int 566static int
552get_performance_info (struct ATS_Address *address, uint32_t type); 567get_performance_info (struct ATS_Address *address, uint32_t type);
553 568
569
570
571struct 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);
564static int 588static int
565find_best_address_it (void *cls, const struct GNUNET_HashCode * key, void *value) 589find_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 */
865void 881void
866GAS_proportional_address_change_preference (void *solver, 882GAS_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 */
886const struct ATS_Address * 902const struct ATS_Address *
887GAS_proportional_get_preferred_address (void *solver, 903GAS_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 */
965void 984void
966GAS_proportional_stop_get_preferred_address (void *solver, 985GAS_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 */
982void 1000void
983GAS_proportional_address_delete (void *solver, 1001GAS_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 */
1097void 1114void
1098GAS_proportional_address_add (void *solver, 1115GAS_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 */
1114void 1130void
1115GAS_proportional_address_update (void *solver, 1131GAS_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 */
1249void 1264void
1250GAS_proportional_address_add (void *solver, 1265GAS_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,
1306void * 1321void *
1307GAS_proportional_init (const struct GNUNET_CONFIGURATION_Handle *cfg, 1322GAS_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 */
46void 46void
47GAS_proportional_address_change_preference (void *solver, 47GAS_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,
80void * 80void *
81GAS_proportional_init (const struct GNUNET_CONFIGURATION_Handle *cfg, 81GAS_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 */
110void 112void
111GAS_proportional_address_add (void *solver, 113GAS_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 */
128void 129void
129GAS_proportional_address_update (void *solver, 130GAS_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 */
146void 146void
147GAS_proportional_address_delete (void *solver, 147GAS_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 */
174void 173void
175GAS_proportional_stop_get_preferred_address (void *solver, 174GAS_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 */
187const struct ATS_Address * 185const struct ATS_Address *
188GAS_proportional_get_preferred_address (void *solver, 186GAS_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 */
1405const double * 1405const double *
1406get_property_cb (void *cls, struct ATS_Address *address) 1406get_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
368typedef 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 *
395typedef void * 402typedef 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 */
418typedef void 428typedef 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 */
439typedef void 448typedef 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 */
454typedef void 462typedef 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 */
472typedef void 479typedef 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 */
489typedef const struct ATS_Address * 495typedef 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 */
502typedef void 507typedef 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
153const double *
154get_property_cb (void *cls, const struct ATS_Address *address)
155{
156 return GAS_normalization_get_properties ((struct ATS_Address *) address);
157}
158
153 159
154static const double * 160static const double *
155get_preferences_cb (void *cls, const struct GNUNET_PeerIdentity *id) 161get_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
221static void 227static 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
7UNIXPATH = /tmp/test-ats-scheduling-arm.sock 7UNIXPATH = /tmp/test-ats-scheduling-arm.sock
8 8
9[ats] 9[ats]
10#PREFIX = valgrind --leak-check=full --track-origins=yes --num-callers=25 10PREFIX = valgrind --leak-check=full --track-origins=yes --num-callers=25
11AUTOSTART = YES 11AUTOSTART = YES
12PORT = 12002 12PORT = 12002
13HOSTNAME = localhost 13HOSTNAME = 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
136const double *
137get_property_cb (void *cls, const struct ATS_Address *address)
138{
139 return GAS_normalization_get_properties ((struct ATS_Address *) address);
140}
141
142
136static void 143static void
137normalized_property_changed_cb (void *cls, 144normalized_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
142const double *
143get_property_cb (void *cls, const struct ATS_Address *address)
144{
145 return GAS_normalization_get_properties ((struct ATS_Address *) address);
146}
147
142static void 148static void
143normalized_property_changed_cb (void *cls, 149normalized_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