aboutsummaryrefslogtreecommitdiff
path: root/src/ats/gnunet-service-ats_addresses.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2014-05-09 18:03:03 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2014-05-09 18:03:03 +0000
commit380d6d885e12803bd972d47812e093f78ee859f8 (patch)
treea550ca50a4d42512c6b0d883ca4d33fdd82589ca /src/ats/gnunet-service-ats_addresses.c
parentdb718fae66b0f4093730cac19b5d19d026ebf46e (diff)
downloadgnunet-380d6d885e12803bd972d47812e093f78ee859f8.tar.gz
gnunet-380d6d885e12803bd972d47812e093f78ee859f8.zip
clean up for addresses and modification to perf to get values in averaging
Diffstat (limited to 'src/ats/gnunet-service-ats_addresses.c')
-rw-r--r--src/ats/gnunet-service-ats_addresses.c307
1 files changed, 0 insertions, 307 deletions
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c
index 8b5413b92..6b8f13a1b 100644
--- a/src/ats/gnunet-service-ats_addresses.c
+++ b/src/ats/gnunet-service-ats_addresses.c
@@ -1355,312 +1355,6 @@ GAS_addresses_handle_backoff_reset (struct GAS_Addresses_Handle *handle,
1355} 1355}
1356 1356
1357 1357
1358static int
1359eval_count_active_it (void *cls,
1360 const struct GNUNET_PeerIdentity *id,
1361 void *obj)
1362{
1363 int *request_fulfilled = cls;
1364 struct ATS_Address *addr = obj;
1365
1366 if (GNUNET_YES == addr->active)
1367 (*request_fulfilled) = GNUNET_YES;
1368
1369 if (*request_fulfilled == GNUNET_YES)
1370 return GNUNET_NO;
1371 else
1372 return GNUNET_YES;
1373}
1374
1375
1376/**
1377 * Summary context
1378 */
1379struct SummaryContext
1380{
1381 /**
1382 * Sum of the utilized inbound bandwidth per network
1383 */
1384 unsigned long long bandwidth_in_assigned[GNUNET_ATS_NetworkTypeCount];
1385
1386 /**
1387 * Sum of the utilized outbound bandwidth per network
1388 */
1389 unsigned long long bandwidth_out_assigned[GNUNET_ATS_NetworkTypeCount];
1390
1391 /**
1392 * Sum addresses within a network
1393 */
1394 unsigned int addresses_in_network[GNUNET_ATS_NetworkTypeCount];
1395};
1396
1397
1398static int
1399eval_sum_bw_used (void *cls, const struct GNUNET_PeerIdentity *id, void *obj)
1400{
1401 struct SummaryContext *ctx = cls;
1402 struct ATS_Address *addr = obj;
1403 int networks[GNUNET_ATS_NetworkTypeCount] = GNUNET_ATS_NetworkType;
1404 int net;
1405 int c;
1406
1407 if (GNUNET_YES == addr->active)
1408 {
1409 net = get_performance_info (addr, GNUNET_ATS_NETWORK_TYPE);
1410 for (c = 0; c < GNUNET_ATS_NetworkTypeCount; c++)
1411 {
1412 if (net == networks[c])
1413 {
1414 ctx->addresses_in_network[c] ++;
1415 ctx->bandwidth_in_assigned[c] += ntohl (addr->assigned_bw_in.value__);
1416 ctx->bandwidth_out_assigned[c] += ntohl (addr->assigned_bw_out.value__);
1417 }
1418 }
1419 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1420 "Active address in %s with (in/out) %u/%u Bps\n",
1421 GNUNET_ATS_print_network_type (net),
1422 (unsigned int) ntohl (addr->assigned_bw_in.value__),
1423 (unsigned int) ntohl (addr->assigned_bw_out.value__));
1424 }
1425 return GNUNET_OK;
1426}
1427
1428
1429/**
1430 * Summary context
1431 */
1432struct RelativityContext
1433{
1434
1435 struct GAS_Addresses_Handle *ah;
1436};
1437
1438
1439static int
1440find_active_address (void *cls, const struct GNUNET_PeerIdentity *id, void *obj)
1441{
1442 struct ATS_Address **res = cls;
1443 struct ATS_Address *addr = obj;
1444
1445 if (GNUNET_YES == addr->active)
1446 (*res) = addr;
1447
1448 if (NULL != (*res))
1449 return GNUNET_NO;
1450 else
1451 return GNUNET_YES;
1452}
1453
1454/**
1455 * Evaluate current bandwidth assignment
1456 *
1457 * @param ah address handle
1458 */
1459void
1460GAS_addresses_evaluate_assignment (struct GAS_Addresses_Handle *ah)
1461{
1462#if 0
1463 struct GAS_Addresses_Suggestion_Requests *cur;
1464 struct GAS_Addresses_Preference_Clients *pcur;
1465 int c;
1466
1467 float quality_requests_fulfilled = 0.0;
1468 float quality_bandwidth_utilization[GNUNET_ATS_NetworkTypeCount];
1469 float quality_bandwidth_utilization_total = 0.0;
1470 float quality_application_requirements = 0.0;
1471 float guq = 0.0;
1472
1473 int include_requests;
1474 int include_utilization;
1475 int include_requirements;
1476
1477 /* Variable related to requests */
1478 unsigned int requests_pending;
1479 unsigned int requests_fulfilled;
1480 unsigned int request_active;
1481
1482 /* Variable related to utilization */
1483 struct SummaryContext sum;
1484 struct ATS_Address *active_address;
1485 int network_count;
1486
1487 /* Variables for preferences */
1488 int prefs[GNUNET_ATS_PreferenceCount] = GNUNET_ATS_PreferenceType;
1489 double pref_val;
1490 double prop_val;
1491 const double *norm_values;
1492 double prefs_fulfill[GNUNET_ATS_PreferenceCount];
1493 int prefs_clients[GNUNET_ATS_PreferenceCount];
1494 int rels;
1495
1496 GNUNET_assert (NULL != ah);
1497 GNUNET_assert (NULL != ah->addresses);
1498
1499 requests_pending = 0;
1500 requests_fulfilled = 0;
1501 /* 1) How many requests could be fulfilled? */
1502 for (cur = ah->pending_requests_head; NULL != cur; cur = cur->next)
1503 {
1504 request_active = GNUNET_NO;
1505 GNUNET_CONTAINER_multipeermap_get_multiple (ah->addresses,
1506 &cur->id, &eval_count_active_it, &request_active);
1507 if (GNUNET_YES == request_active)
1508 requests_fulfilled ++;
1509 requests_pending ++;
1510 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer `%s': %u pending requests, %s\n",
1511 GNUNET_i2s (&cur->id),
1512 requests_pending,
1513 (GNUNET_YES == request_active) ? "active adress" : "no active address");
1514
1515 }
1516 if (requests_pending > 0)
1517 {
1518 quality_requests_fulfilled = (float) requests_fulfilled / requests_pending;
1519 include_requests = GNUNET_YES;
1520 }
1521 else
1522 {
1523 quality_requests_fulfilled = 0.0;
1524 include_requests = GNUNET_NO;
1525 }
1526 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%u pending requests, %u requests fullfilled\n",
1527 requests_pending, requests_fulfilled);
1528
1529 /* 2) How well is bandwidth utilized? */
1530 network_count = 0;
1531 for (c = 0; c < GNUNET_ATS_NetworkTypeCount; c++)
1532 {
1533 quality_bandwidth_utilization[c] = 0.0;
1534 sum.addresses_in_network[c] = 0;
1535 sum.bandwidth_in_assigned[c] = 0;
1536 sum.bandwidth_out_assigned[c] = 0;
1537 }
1538 GNUNET_CONTAINER_multipeermap_iterate(ah->addresses,
1539 &eval_sum_bw_used, &sum);
1540 for (c = 0; c < GNUNET_ATS_NetworkTypeCount; c++)
1541 {
1542 quality_bandwidth_utilization[c] = (((float)sum.bandwidth_out_assigned[c] / ah->env.out_quota[c]) +
1543 ((float)sum.bandwidth_in_assigned[c] / ah->env.in_quota[c])) / 2;
1544
1545 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Utilization for network `%s': %f\n",
1546 GNUNET_ATS_print_network_type(ah->env.networks[c]),
1547 quality_bandwidth_utilization[c]);
1548 if (sum.addresses_in_network[c] > 0)
1549 {
1550 quality_bandwidth_utilization_total += quality_bandwidth_utilization[c];
1551 network_count ++;
1552 }
1553 }
1554 if (0 < network_count)
1555 {
1556 quality_bandwidth_utilization_total /= network_count;
1557 include_utilization = GNUNET_YES;
1558 }
1559 else
1560 {
1561 quality_bandwidth_utilization_total = 0.0;
1562 include_utilization = GNUNET_NO;
1563 }
1564
1565 /* 3) How well does selection match application requirements */
1566 if (0 == ah->pref_clients)
1567 {
1568 include_requirements = 0;
1569 }
1570 else
1571 {
1572 for (c = 0; c < GNUNET_ATS_PreferenceCount; c++)
1573 {
1574 prefs_fulfill[c] = 0.0;
1575 prefs_clients[c] = 0;
1576 }
1577
1578 for (cur = ah->pending_requests_head; NULL != cur; cur = cur->next)
1579 {
1580 active_address = NULL;
1581 GNUNET_CONTAINER_multipeermap_get_multiple (ah->addresses,
1582 &cur->id, &find_active_address, &active_address);
1583
1584 for (pcur = ah->preference_clients_head; NULL != pcur; pcur = pcur->next)
1585 {
1586 for (c = 0; c < GNUNET_ATS_PreferenceCount; c++)
1587 {
1588 if (prefs[c] == GNUNET_ATS_PREFERENCE_END)
1589 continue;
1590 pref_val = GAS_normalization_get_preferences_by_client (pcur->client, &cur->id, prefs[c]);
1591 if (-1.0 == pref_val)
1592 {
1593 GNUNET_break (0);
1594 continue;
1595 }
1596
1597 if (DEFAULT_REL_PREFERENCE == pref_val)
1598 {
1599 /* Default preference value */
1600 continue;
1601 }
1602
1603 if (NULL != active_address)
1604 {
1605 norm_values = GAS_normalization_get_properties (active_address);
1606 prop_val = norm_values[c];
1607 if ((norm_values[c] <= 1.0) || (norm_values[c] >= 2.0))
1608 prop_val = DEFAULT_REL_QUALITY;
1609 }
1610 else
1611 {
1612 prop_val = DEFAULT_REL_QUALITY;
1613 }
1614
1615 /* We now have preference values [1..2] and properties [1..2] */
1616
1617 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%u Client %p, Peer %s Property %s: pref: %.3f prop %.3f \n",
1618 c,
1619 pcur->client,
1620 GNUNET_i2s (&cur->id),
1621 GNUNET_ATS_print_preference_type(prefs[c]),
1622 pref_val,
1623 prop_val);
1624
1625 prefs_fulfill[c] += (pref_val * prop_val) / 2;
1626 prefs_clients[c] ++;
1627 }
1628 }
1629 }
1630 rels = 0;
1631 for (c = 0; c < GNUNET_ATS_PreferenceCount; c++)
1632 {
1633 if (0 < prefs_clients[c])
1634 {
1635 prefs_fulfill[c] /= prefs_clients[c];
1636 rels ++;
1637 quality_application_requirements += prefs_fulfill[c];
1638 }
1639 }
1640 if (rels > 0)
1641 quality_application_requirements /= rels;
1642 else
1643 quality_application_requirements = 0.0;
1644
1645 include_requirements = 1;
1646 }
1647 /* GUQ */
1648
1649 if (include_requests + include_utilization + include_requirements > 0)
1650 guq = (quality_requests_fulfilled + quality_bandwidth_utilization_total + quality_application_requirements) /
1651 (include_requests + include_utilization + include_requirements);
1652 else
1653 guq = 0.0;
1654
1655 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1656 "Requests fulfilled %.3f bandwidth utilized %.3f application preferences met %.3f => %.3f\n",
1657 quality_requests_fulfilled,
1658 quality_bandwidth_utilization_total,
1659 quality_application_requirements,
1660 guq);
1661#endif
1662}
1663
1664/** 1358/**
1665 * Solver information callback 1359 * Solver information callback
1666 * 1360 *
@@ -1753,7 +1447,6 @@ solver_info_cb (void *cls,
1753 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, 1447 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
1754 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP", 1448 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP",
1755 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL"); 1449 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
1756 GAS_addresses_evaluate_assignment (cls);
1757 return; 1450 return;
1758 default: 1451 default:
1759 break; 1452 break;