aboutsummaryrefslogtreecommitdiff
path: root/src/ats/gnunet-service-ats_addresses.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2013-11-18 14:37:22 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2013-11-18 14:37:22 +0000
commit56b1b94b3ee7fe0fa4cfcf7184b48246c481a1ac (patch)
tree619bbaad8087cc3ae52c8167e58e11f067a3a818 /src/ats/gnunet-service-ats_addresses.c
parentcf31c1bc656e1747c2e3deea8ef851743b9e09c5 (diff)
downloadgnunet-56b1b94b3ee7fe0fa4cfcf7184b48246c481a1ac.tar.gz
gnunet-56b1b94b3ee7fe0fa4cfcf7184b48246c481a1ac.zip
utilization
Diffstat (limited to 'src/ats/gnunet-service-ats_addresses.c')
-rw-r--r--src/ats/gnunet-service-ats_addresses.c119
1 files changed, 104 insertions, 15 deletions
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c
index 26b7bc90b..e1042b64b 100644
--- a/src/ats/gnunet-service-ats_addresses.c
+++ b/src/ats/gnunet-service-ats_addresses.c
@@ -265,16 +265,6 @@ struct GAS_Addresses_Handle
265 struct GNUNET_CONTAINER_MultiPeerMap *addresses; 265 struct GNUNET_CONTAINER_MultiPeerMap *addresses;
266 266
267 /** 267 /**
268 * Configure WAN quota in
269 */
270 unsigned long long wan_quota_in;
271
272 /**
273 * Configure WAN quota out
274 */
275 unsigned long long wan_quota_out;
276
277 /**
278 * Is ATS addresses running 268 * Is ATS addresses running
279 */ 269 */
280 int running; 270 int running;
@@ -1271,6 +1261,8 @@ GAS_addresses_handle_backoff_reset (struct GAS_Addresses_Handle *handle,
1271 &reset_address_it, NULL)); 1261 &reset_address_it, NULL));
1272} 1262}
1273 1263
1264
1265
1274static int 1266static int
1275eval_count_active_it (void *cls, const struct GNUNET_PeerIdentity *id, void *obj) 1267eval_count_active_it (void *cls, const struct GNUNET_PeerIdentity *id, void *obj)
1276{ 1268{
@@ -1286,6 +1278,44 @@ eval_count_active_it (void *cls, const struct GNUNET_PeerIdentity *id, void *obj
1286 return GNUNET_YES; 1278 return GNUNET_YES;
1287} 1279}
1288 1280
1281struct SummaryContext {
1282 unsigned long long bandwidth_in_assigned[GNUNET_ATS_NetworkTypeCount];
1283 unsigned long long bandwidth_out_assigned[GNUNET_ATS_NetworkTypeCount];
1284 unsigned int addresses_in_network[GNUNET_ATS_NetworkTypeCount];
1285};
1286
1287
1288static int
1289eval_sum_bw_used (void *cls, const struct GNUNET_PeerIdentity *id, void *obj)
1290{
1291 struct ATS_Address *addr = obj;
1292 int networks[GNUNET_ATS_NetworkTypeCount] = GNUNET_ATS_NetworkType;
1293 int net;
1294 struct SummaryContext *ctx = cls;
1295
1296 int c;
1297
1298 if (GNUNET_YES == addr->active)
1299 {
1300 net = get_performance_info (addr, GNUNET_ATS_NETWORK_TYPE);
1301 for (c = 0; c < GNUNET_ATS_NetworkTypeCount; c++)
1302 {
1303 if (net == networks[c])
1304 {
1305 ctx->addresses_in_network[c] ++;
1306 ctx->bandwidth_in_assigned[c] += ntohl (addr->assigned_bw_in.value__);
1307 ctx->bandwidth_out_assigned[c] += ntohl (addr->assigned_bw_out.value__);
1308 }
1309 }
1310 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Active address in %s with (in/out) %llu/%llu Bps\n",
1311 GNUNET_ATS_print_network_type(net),
1312 ntohl (addr->assigned_bw_in.value__),
1313 ntohl (addr->assigned_bw_out.value__));
1314 }
1315 return GNUNET_OK;
1316}
1317
1318
1289/** 1319/**
1290 * Evaluate current bandwidth assignment 1320 * Evaluate current bandwidth assignment
1291 * 1321 *
@@ -1295,8 +1325,22 @@ void
1295GAS_addresses_evaluate_assignment (struct GAS_Addresses_Handle *ah) 1325GAS_addresses_evaluate_assignment (struct GAS_Addresses_Handle *ah)
1296{ 1326{
1297 struct GAS_Addresses_Suggestion_Requests *cur; 1327 struct GAS_Addresses_Suggestion_Requests *cur;
1328 int c;
1329
1330 float quality_requests_fulfilled = 0.0;
1331 float quality_bandwidth_utilization[GNUNET_ATS_NetworkTypeCount];
1332 float quality_bandwidth_utilization_total = 0.0;
1333 float quality_application_requirements = 0.0;
1334 float guq = 0.0;
1335
1336 /* Variable related to requests */
1298 unsigned int requests_pending; 1337 unsigned int requests_pending;
1299 unsigned int requests_fulfilled; 1338 unsigned int requests_fulfilled;
1339 unsigned int request_active;
1340
1341 /* Variable related to utilization */
1342 struct SummaryContext sum;
1343 int network_count;
1300 1344
1301 GNUNET_assert (NULL != ah); 1345 GNUNET_assert (NULL != ah);
1302 GNUNET_assert (NULL != ah->addresses); 1346 GNUNET_assert (NULL != ah->addresses);
@@ -1306,20 +1350,65 @@ GAS_addresses_evaluate_assignment (struct GAS_Addresses_Handle *ah)
1306 /* 1) How many requests could be fulfilled? */ 1350 /* 1) How many requests could be fulfilled? */
1307 for (cur = ah->pending_requests_head; NULL != cur; cur = cur->next) 1351 for (cur = ah->pending_requests_head; NULL != cur; cur = cur->next)
1308 { 1352 {
1309 1353 request_active = GNUNET_NO;
1310 GNUNET_CONTAINER_multipeermap_get_multiple (ah->addresses, 1354 GNUNET_CONTAINER_multipeermap_get_multiple (ah->addresses,
1311 &cur->id, &eval_count_active_it, &requests_fulfilled); 1355 &cur->id, &eval_count_active_it, &request_active);
1312 if (GNUNET_YES == requests_fulfilled) 1356 if (GNUNET_YES == request_active)
1313 requests_fulfilled ++; 1357 requests_fulfilled ++;
1314 requests_pending ++; 1358 requests_pending ++;
1359 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Peer `%s': pending requests, %s\n",
1360 GNUNET_i2s (&cur->id),
1361 (GNUNET_YES == request_active) ? "active adress" : "no active address");
1362
1315 } 1363 }
1316 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%u pending requests, %u requests fullfilled\n", 1364 if (requests_pending > 0)
1365 quality_requests_fulfilled = (float) requests_fulfilled / requests_pending;
1366 else
1367 quality_requests_fulfilled = 0.0;
1368 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "%u pending requests, %u requests fullfilled\n",
1317 requests_pending, requests_fulfilled); 1369 requests_pending, requests_fulfilled);
1318 1370
1319
1320 /* 2) How well is bandwidth utilized? */ 1371 /* 2) How well is bandwidth utilized? */
1372 network_count = 0;
1373 for (c = 0; c < GNUNET_ATS_NetworkTypeCount; c++)
1374 {
1375 quality_bandwidth_utilization[c] = 0.0;
1376 sum.addresses_in_network[c] = 0;
1377 sum.bandwidth_in_assigned[c] = 0;
1378 sum.bandwidth_out_assigned[c] = 0;
1379 }
1380 GNUNET_CONTAINER_multipeermap_iterate(ah->addresses,
1381 &eval_sum_bw_used, &sum);
1382 for (c = 0; c < GNUNET_ATS_NetworkTypeCount; c++)
1383 {
1384 quality_bandwidth_utilization[c] = (((float)sum.bandwidth_out_assigned[c] / ah->env.out_quota[c]) +
1385 ((float)sum.bandwidth_in_assigned[c] / ah->env.in_quota[c])) / 2;
1386
1387 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Utilization for network `%s': %f\n",
1388 GNUNET_ATS_print_network_type(ah->env.networks[c]),
1389 quality_bandwidth_utilization[c]);
1390 if (sum.addresses_in_network[c] > 0)
1391 {
1392 quality_bandwidth_utilization_total += quality_bandwidth_utilization[c];
1393 network_count ++;
1394 }
1395 }
1396 if (0 < network_count)
1397 quality_bandwidth_utilization_total /= network_count;
1398 else
1399 quality_bandwidth_utilization_total = 0.0;
1321 1400
1322 /* 3) How well does selection match application requirements */ 1401 /* 3) How well does selection match application requirements */
1402
1403 /* GUQ */
1404 guq = (quality_requests_fulfilled + quality_bandwidth_utilization_total + quality_application_requirements) /3;
1405
1406 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1407 "Requests fulfilled %.3f bandwidth utilized %.3f application preferences met %.3f => %.3f\n",
1408 quality_requests_fulfilled,
1409 quality_bandwidth_utilization_total,
1410 quality_application_requirements,
1411 guq);
1323} 1412}
1324 1413
1325/** 1414/**