aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2014-02-11 11:50:56 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2014-02-11 11:50:56 +0000
commit7daab7b7f8478178fe230a816ac590e4f46fc83a (patch)
tree0f0b9e2b6b84af12612e350d5b6c561fbb8784c6 /src
parent57562efaac37da015040ba5ade24afb549c67023 (diff)
downloadgnunet-7daab7b7f8478178fe230a816ac590e4f46fc83a.tar.gz
gnunet-7daab7b7f8478178fe230a816ac590e4f46fc83a.zip
property enforcement
Diffstat (limited to 'src')
-rw-r--r--src/ats/experiments/example.exp34
-rw-r--r--src/ats/gnunet-ats-solver-eval.c88
-rw-r--r--src/ats/gnunet-ats-solver-eval.h15
3 files changed, 86 insertions, 51 deletions
diff --git a/src/ats/experiments/example.exp b/src/ats/experiments/example.exp
index 1edd83cfd..bfedcf262 100644
--- a/src/ats/experiments/example.exp
+++ b/src/ats/experiments/example.exp
@@ -29,20 +29,22 @@ op-0-plugin = udp
29# BANDWIDTH, LATENCY 29# BANDWIDTH, LATENCY
30#op-1-pref = BANDWIDTH 30#op-1-pref = BANDWIDTH
31 31
32#op-1-operation = start_set_property 32op-1-operation = start_request
33#op-1-address-id = 0 33op-1-peer-id = 0
34#op-1-peer-id = 0 34
35
36op-2-operation = start_set_property
37op-2-address-id = 0
38op-2-peer-id = 0
35# constant, linear, sinus, random 39# constant, linear, sinus, random
36#op-1-gen-type = random 40op-2-gen-type = constant
37#op-1-base-rate= 10000 41op-2-base-rate= 10000
38#op-1-max-rate = 100000 42op-2-max-rate = 100000
39#op-1-frequency = 100 ms 43op-2-frequency = 500 ms
40# bandwidth, latency 44# bandwidth, latency
41# "TERMINATOR", "UTILIZATION_UP", "UTILIZATION_DOWN", "UTILIZATION_PAYLOAD_UP", "UTILIZATION_PAYLOAD_DOWN", "NETWORK_TYPE", "DELAY", "DISTANCE", "COST_WAN", "COST_LAN", "COST_WLAN" 45# "TERMINATOR", "UTILIZATION_UP", "UTILIZATION_DOWN", "UTILIZATION_PAYLOAD_UP", "UTILIZATION_PAYLOAD_DOWN", "NETWORK_TYPE", "DELAY", "DISTANCE", "COST_WAN", "COST_LAN", "COST_WLAN"
42#op-1-property = UTILIZATION_UP 46op-2-property = UTILIZATION_UP
43 47
44op-1-operation = start_request
45op-1-peer-id = 0
46 48
47[episode-1] 49[episode-1]
48duration = 2 s 50duration = 2 s
@@ -60,10 +62,10 @@ op-1-address-id = 1
60op-1-peer-id = 1 62op-1-peer-id = 1
61op-1-pref = BANDWIDTH 63op-1-pref = BANDWIDTH
62 64
63#op-2-operation = stop_set_property 65op-2-operation = stop_set_property
64#op-2-address-id = 0 66op-2-address-id = 0
65#op-2-peer-id = 0 67op-2-peer-id = 0
66#op-2-property = UTILIZATION_UP 68op-2-property = UTILIZATION_UP
67 69
68op-2-operation = stop_request 70op-3-operation = stop_request
69op-2-peer-id = 0 \ No newline at end of file 71op-3-peer-id = 0 \ No newline at end of file
diff --git a/src/ats/gnunet-ats-solver-eval.c b/src/ats/gnunet-ats-solver-eval.c
index aea4f7495..0e0c5bb9f 100644
--- a/src/ats/gnunet-ats-solver-eval.c
+++ b/src/ats/gnunet-ats-solver-eval.c
@@ -88,9 +88,9 @@ struct AddressLookupCtx
88 struct ATS_Address *res; 88 struct ATS_Address *res;
89 char *plugin; 89 char *plugin;
90 char *addr; 90 char *addr;
91 unsigned int address_id;
92}; 91};
93 92
93
94int find_address_it (void *cls, 94int find_address_it (void *cls,
95 const struct GNUNET_PeerIdentity *key, 95 const struct GNUNET_PeerIdentity *key,
96 void *value) 96 void *value)
@@ -117,6 +117,17 @@ find_peer_by_id (int id)
117 return NULL; 117 return NULL;
118} 118}
119 119
120static struct TestAddress *
121find_address_by_id (struct TestPeer *peer, int aid)
122{
123 struct TestAddress *cur;
124 for (cur = peer->addr_head; NULL != cur; cur = cur->next)
125 if (cur->aid == aid)
126 return cur;
127 return NULL;
128}
129
130
120 131
121/** 132/**
122 * Logging 133 * Logging
@@ -253,22 +264,13 @@ static void
253set_prop_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 264set_prop_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
254{ 265{
255 struct PropertyGenerator *pg = cls; 266 struct PropertyGenerator *pg = cls;
256 struct TestPeer *p;
257 double pref_value; 267 double pref_value;
258 struct GNUNET_ATS_Information atsi; 268 struct GNUNET_ATS_Information atsi;
259 269
260 pg->set_task = GNUNET_SCHEDULER_NO_TASK; 270 pg->set_task = GNUNET_SCHEDULER_NO_TASK;
261 271
262 if (NULL == (p = find_peer_by_id (pg->peer)))
263 {
264 GNUNET_break (0);
265 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
266 "Setting property generation for unknown peer %u\n", pg->peer);
267 return;
268 }
269
270 if (GNUNET_NO == GNUNET_CONTAINER_multipeermap_contains_value (sh->addresses, 272 if (GNUNET_NO == GNUNET_CONTAINER_multipeermap_contains_value (sh->addresses,
271 &p->peer_id, pg->address)) 273 &pg->test_peer->peer_id, pg->test_address->ats_addr))
272 { 274 {
273 GNUNET_break (0); 275 GNUNET_break (0);
274 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 276 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@@ -289,7 +291,8 @@ set_prop_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
289 291
290 /* set performance here! */ 292 /* set performance here! */
291 sh->env.sf.s_bulk_start (sh->solver); 293 sh->env.sf.s_bulk_start (sh->solver);
292 GAS_normalization_normalize_property (sh->addresses, pg->address, &atsi, 1); 294 GAS_normalization_normalize_property (sh->addresses,
295 pg->test_address->ats_addr, &atsi, 1);
293 sh->env.sf.s_bulk_stop (sh->solver); 296 sh->env.sf.s_bulk_stop (sh->solver);
294 297
295 298
@@ -356,7 +359,8 @@ GNUNET_ATS_solver_generate_property_stop (struct PropertyGenerator *pg)
356struct PropertyGenerator * 359struct PropertyGenerator *
357GNUNET_ATS_solver_generate_property_start (unsigned int peer, 360GNUNET_ATS_solver_generate_property_start (unsigned int peer,
358 unsigned int address_id, 361 unsigned int address_id,
359 struct ATS_Address *ats_address, 362 struct TestPeer *test_peer,
363 struct TestAddress *test_address,
360 enum GeneratorType type, 364 enum GeneratorType type,
361 long int base_value, 365 long int base_value,
362 long int value_rate, 366 long int value_rate,
@@ -370,7 +374,8 @@ GNUNET_ATS_solver_generate_property_start (unsigned int peer,
370 GNUNET_CONTAINER_DLL_insert (prop_gen_head, prop_gen_tail, pg); 374 GNUNET_CONTAINER_DLL_insert (prop_gen_head, prop_gen_tail, pg);
371 pg->type = type; 375 pg->type = type;
372 pg->peer = peer; 376 pg->peer = peer;
373 pg->address = ats_address; 377 pg->test_address = test_address;
378 pg->test_peer = test_peer;
374 pg->address_id = address_id; 379 pg->address_id = address_id;
375 pg->ats_property = ats_property; 380 pg->ats_property = ats_property;
376 pg->base_value = base_value; 381 pg->base_value = base_value;
@@ -1616,30 +1621,42 @@ create_ats_address (const struct GNUNET_PeerIdentity *peer,
1616 return aa; 1621 return aa;
1617} 1622}
1618 1623
1624
1625
1619static void 1626static void
1620enforce_add_address (struct GNUNET_ATS_TEST_Operation *op) 1627enforce_add_address (struct GNUNET_ATS_TEST_Operation *op)
1621{ 1628{
1622 struct ATS_Address *addr;
1623 struct TestPeer *p; 1629 struct TestPeer *p;
1630 struct TestAddress *a;
1624 1631
1625 if (NULL == (p = find_peer_by_id (op->peer_id))) 1632 if (NULL == (p = find_peer_by_id (op->peer_id)))
1626 { 1633 {
1627 p = GNUNET_new (struct TestPeer); 1634 p = GNUNET_new (struct TestPeer);
1628 p->id = op->peer_id; 1635 p->id = op->peer_id;
1629 memset (&p->peer_id, '0', sizeof (p->peer_id)); 1636 memset (&p->peer_id, op->peer_id, sizeof (p->peer_id));
1630 GNUNET_CONTAINER_DLL_insert (peer_head, peer_tail, p); 1637 GNUNET_CONTAINER_DLL_insert (peer_head, peer_tail, p);
1631 } 1638 }
1632 1639
1633 addr = create_ats_address (&p->peer_id, op->plugin, op->address, 1640 if (NULL != (a = find_address_by_id (p, op->address_id)))
1641 {
1642 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Duplicate address %u for peer %u\n",
1643 op->address_id, op->peer_id);
1644 }
1645
1646 a = GNUNET_new (struct TestAddress);
1647 a->aid = op->address_id;
1648 a->ats_addr = create_ats_address (&p->peer_id, op->plugin, op->address,
1634 strlen (op->address) + 1, op->address_session); 1649 strlen (op->address) + 1, op->address_session);
1650 memset (&p->peer_id, op->peer_id, sizeof (p->peer_id));
1651 GNUNET_CONTAINER_DLL_insert (p->addr_head, p->addr_tail, a);
1635 1652
1636 GNUNET_CONTAINER_multipeermap_put (sh->addresses, &p->peer_id, addr, 1653 GNUNET_CONTAINER_multipeermap_put (sh->addresses, &p->peer_id, a->ats_addr,
1637 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); 1654 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
1638 1655
1639 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Adding address %u for peer %u\n", 1656 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Adding address %u for peer %u\n",
1640 op->address_id, op->peer_id); 1657 op->address_id, op->peer_id);
1641 1658
1642 sh->env.sf.s_add (sh->solver, addr, op->address_network); 1659 sh->env.sf.s_add (sh->solver, a->ats_addr, op->address_network);
1643 1660
1644} 1661}
1645 1662
@@ -1648,6 +1665,7 @@ static void
1648enforce_del_address (struct GNUNET_ATS_TEST_Operation *op) 1665enforce_del_address (struct GNUNET_ATS_TEST_Operation *op)
1649{ 1666{
1650 struct TestPeer *p; 1667 struct TestPeer *p;
1668 struct TestAddress *a;
1651 struct AddressLookupCtx ctx; 1669 struct AddressLookupCtx ctx;
1652 1670
1653 if (NULL == (p = find_peer_by_id (op->peer_id))) 1671 if (NULL == (p = find_peer_by_id (op->peer_id)))
@@ -1671,6 +1689,15 @@ enforce_del_address (struct GNUNET_ATS_TEST_Operation *op)
1671 return; 1689 return;
1672 } 1690 }
1673 1691
1692 if (NULL == (a = find_address_by_id (p, op->address_id)))
1693 {
1694 GNUNET_break (0);
1695 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1696 "Deleting address for unknown peer %u\n", op->peer_id);
1697 return;
1698 }
1699 GNUNET_CONTAINER_DLL_remove (p->addr_head, p->addr_tail, a);
1700
1674 GNUNET_CONTAINER_multipeermap_remove (sh->addresses, &p->peer_id, ctx.res); 1701 GNUNET_CONTAINER_multipeermap_remove (sh->addresses, &p->peer_id, ctx.res);
1675 1702
1676 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Removing address %u for peer %u\n", 1703 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Removing address %u for peer %u\n",
@@ -1685,15 +1712,15 @@ static void
1685enforce_start_property (struct GNUNET_ATS_TEST_Operation *op) 1712enforce_start_property (struct GNUNET_ATS_TEST_Operation *op)
1686{ 1713{
1687 struct PropertyGenerator *pg; 1714 struct PropertyGenerator *pg;
1715 struct TestPeer *p;
1716 struct TestAddress *a;
1717
1688 if (NULL != (pg = find_prop_gen (op->peer_id, op->address_id, op->prop_type))) 1718 if (NULL != (pg = find_prop_gen (op->peer_id, op->address_id, op->prop_type)))
1689 { 1719 {
1690 GNUNET_ATS_solver_generate_property_stop (pg); 1720 GNUNET_ATS_solver_generate_property_stop (pg);
1691 GNUNET_free (pg); 1721 GNUNET_free (pg);
1692 } 1722 }
1693 1723
1694 struct TestPeer *p;
1695 struct AddressLookupCtx ctx;
1696
1697 if (NULL == (p = find_peer_by_id (op->peer_id))) 1724 if (NULL == (p = find_peer_by_id (op->peer_id)))
1698 { 1725 {
1699 GNUNET_break (0); 1726 GNUNET_break (0);
@@ -1702,23 +1729,17 @@ enforce_start_property (struct GNUNET_ATS_TEST_Operation *op)
1702 return; 1729 return;
1703 } 1730 }
1704 1731
1705 ctx.plugin = op->plugin; 1732 if (NULL == (a = find_address_by_id (p, op->address_id)))
1706 ctx.addr = op->address;
1707 ctx.res = NULL;
1708 GNUNET_CONTAINER_multipeermap_get_multiple (sh->addresses, &p->peer_id,
1709 find_address_it, &ctx);
1710 if (NULL == ctx.res)
1711 { 1733 {
1712 GNUNET_break (0); 1734 GNUNET_break (0);
1713 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 1735 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1714 "Starting property generation for unknown address for peer %u\n", 1736 "Setting proprterty for unknown address %u\n", op->peer_id);
1715 op->peer_id);
1716 return; 1737 return;
1717 } 1738 }
1718 1739
1719 GNUNET_ATS_solver_generate_property_start (op->peer_id, 1740 GNUNET_ATS_solver_generate_property_start (op->peer_id,
1720 op->address_id, 1741 op->address_id,
1721 ctx.res, 1742 p, a,
1722 op->gen_type, 1743 op->gen_type,
1723 op->base_rate, 1744 op->base_rate,
1724 op->max_rate, 1745 op->max_rate,
@@ -2419,7 +2440,6 @@ done ()
2419 { 2440 {
2420 next = cur->next; 2441 next = cur->next;
2421 GNUNET_CONTAINER_DLL_remove (peer_head, peer_tail, cur); 2442 GNUNET_CONTAINER_DLL_remove (peer_head, peer_tail, cur);
2422 GNUNET_break (0);
2423 GNUNET_CONTAINER_multipeermap_iterate (sh->env.addresses, &free_all_it, NULL); 2443 GNUNET_CONTAINER_multipeermap_iterate (sh->env.addresses, &free_all_it, NULL);
2424 2444
2425 GNUNET_free (cur); 2445 GNUNET_free (cur);
diff --git a/src/ats/gnunet-ats-solver-eval.h b/src/ats/gnunet-ats-solver-eval.h
index 4fa69e59d..57cca782d 100644
--- a/src/ats/gnunet-ats-solver-eval.h
+++ b/src/ats/gnunet-ats-solver-eval.h
@@ -90,9 +90,21 @@ struct TestPeer
90 90
91 int id; 91 int id;
92 struct GNUNET_PeerIdentity peer_id; 92 struct GNUNET_PeerIdentity peer_id;
93
94 struct TestAddress *addr_head;
95 struct TestAddress *addr_tail;
93}; 96};
94 97
95 98
99struct TestAddress
100{
101 struct TestAddress *next;
102 struct TestAddress *prev;
103
104 int aid;
105 struct ATS_Address *ats_addr;
106};
107
96struct Episode; 108struct Episode;
97 109
98struct Experiment; 110struct Experiment;
@@ -202,7 +214,8 @@ struct PropertyGenerator
202 unsigned int peer; 214 unsigned int peer;
203 unsigned int address_id; 215 unsigned int address_id;
204 216
205 struct ATS_Address *address; 217 struct TestPeer *test_peer;
218 struct TestAddress *test_address;
206 uint32_t ats_property; 219 uint32_t ats_property;
207 220
208 long int base_value; 221 long int base_value;