aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2014-02-11 10:02:46 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2014-02-11 10:02:46 +0000
commitaa7ba7f32e905f463ee16ff0d6bbc4403a430776 (patch)
tree9899dc2aa8864520870e3c2685b3079af47a6d29 /src
parentf65a1270609f4cc37f023a0a61788e014a7f85b0 (diff)
downloadgnunet-aa7ba7f32e905f463ee16ff0d6bbc4403a430776.tar.gz
gnunet-aa7ba7f32e905f463ee16ff0d6bbc4403a430776.zip
adding and deleting address from solver
Diffstat (limited to 'src')
-rw-r--r--src/ats/experiments/example.exp20
-rw-r--r--src/ats/gnunet-ats-solver-eval.c159
-rw-r--r--src/ats/gnunet-ats-solver-eval.h41
3 files changed, 152 insertions, 68 deletions
diff --git a/src/ats/experiments/example.exp b/src/ats/experiments/example.exp
index 1d94c212a..da2ca0342 100644
--- a/src/ats/experiments/example.exp
+++ b/src/ats/experiments/example.exp
@@ -29,20 +29,20 @@ op-0-plugin = udp
29# BANDWIDTH, LATENCY 29# BANDWIDTH, LATENCY
30#op-1-pref = BANDWIDTH 30#op-1-pref = BANDWIDTH
31 31
32op-1-operation = start_set_property 32#op-1-operation = start_set_property
33op-1-address-id = 0 33#op-1-address-id = 0
34op-1-peer-id = 0 34#op-1-peer-id = 0
35# constant, linear, sinus, random 35# constant, linear, sinus, random
36op-1-gen-type = random 36#op-1-gen-type = random
37op-1-base-rate= 10000 37#op-1-base-rate= 10000
38op-1-max-rate = 100000 38#op-1-max-rate = 100000
39op-1-frequency = 100 ms 39#op-1-frequency = 100 ms
40# bandwidth, latency 40# bandwidth, latency
41# "TERMINATOR", "UTILIZATION_UP", "UTILIZATION_DOWN", "UTILIZATION_PAYLOAD_UP", "UTILIZATION_PAYLOAD_DOWN", "NETWORK_TYPE", "DELAY", "DISTANCE", "COST_WAN", "COST_LAN", "COST_WLAN" 41# "TERMINATOR", "UTILIZATION_UP", "UTILIZATION_DOWN", "UTILIZATION_PAYLOAD_UP", "UTILIZATION_PAYLOAD_DOWN", "NETWORK_TYPE", "DELAY", "DISTANCE", "COST_WAN", "COST_LAN", "COST_WLAN"
42op-1-property = UTILIZATION_UP 42#op-1-property = UTILIZATION_UP
43 43
44op-2-operation = start_request 44op-1-operation = start_request
45op-2-peer-id = 0 45op-1-peer-id = 0
46 46
47[episode-1] 47[episode-1]
48duration = 2 s 48duration = 2 s
diff --git a/src/ats/gnunet-ats-solver-eval.c b/src/ats/gnunet-ats-solver-eval.c
index f9598b692..13afcf470 100644
--- a/src/ats/gnunet-ats-solver-eval.c
+++ b/src/ats/gnunet-ats-solver-eval.c
@@ -27,14 +27,16 @@
27#include "gnunet_util_lib.h" 27#include "gnunet_util_lib.h"
28#include "gnunet-ats-solver-eval.h" 28#include "gnunet-ats-solver-eval.h"
29 29
30
31#define BIG_M_STRING "unlimited" 30#define BIG_M_STRING "unlimited"
32 31
33static struct Experiment *e; 32static struct Experiment *e;
34 33
35static struct LoggingHandle *l; 34static struct LoggingHandle *l;
36 35
37static struct GNUNET_ATS_TESTING_SolverHandle *sh; 36static struct SolverHandle *sh;
37
38static struct TestPeer *peer_head;
39static struct TestPeer *peer_tail;
38 40
39/** 41/**
40 * cmd option -e: experiment file 42 * cmd option -e: experiment file
@@ -1452,7 +1454,7 @@ load_episode (struct Experiment *e, struct Episode *cur,
1452 return GNUNET_SYSERR; 1454 return GNUNET_SYSERR;
1453 } 1455 }
1454 1456
1455 GNUNET_CONTAINER_DLL_insert (cur->head,cur->tail, o); 1457 GNUNET_CONTAINER_DLL_insert_tail (cur->head,cur->tail, o);
1456 op_counter++; 1458 op_counter++;
1457 } 1459 }
1458 GNUNET_free (sec_name); 1460 GNUNET_free (sec_name);
@@ -1724,64 +1726,121 @@ timeout_experiment (void *cls, const struct GNUNET_SCHEDULER_TaskContext* tc)
1724 GNUNET_SYSERR); 1726 GNUNET_SYSERR);
1725} 1727}
1726 1728
1729static struct TestPeer *
1730find_peer_by_id (int id)
1731{
1732 struct TestPeer *cur;
1733 for (cur = peer_head; NULL != cur; cur = cur->next)
1734 if (cur->id == id)
1735 return cur;
1736 return NULL;
1737}
1738
1739struct ATS_Address *
1740create_ats_address (const struct GNUNET_PeerIdentity *peer,
1741 const char *plugin_name,
1742 const void *plugin_addr, size_t plugin_addr_len,
1743 uint32_t session_id)
1744{
1745 struct ATS_Address *aa = NULL;
1746
1747 aa = GNUNET_malloc (sizeof (struct ATS_Address) + plugin_addr_len + strlen (plugin_name) + 1);
1748 aa->peer = *peer;
1749 aa->addr_len = plugin_addr_len;
1750 aa->addr = &aa[1];
1751 aa->plugin = (char *) &aa[1] + plugin_addr_len;
1752 memcpy (&aa[1], plugin_addr, plugin_addr_len);
1753 memcpy (aa->plugin, plugin_name, strlen (plugin_name) + 1);
1754 aa->session_id = session_id;
1755 aa->active = GNUNET_NO;
1756 aa->used = GNUNET_NO;
1757 aa->solver_information = NULL;
1758 aa->assigned_bw_in = GNUNET_BANDWIDTH_value_init(0);
1759 aa->assigned_bw_out = GNUNET_BANDWIDTH_value_init(0);
1760 return aa;
1761}
1762
1727static void 1763static void
1728enforce_add_address (struct GNUNET_ATS_TEST_Operation *op) 1764enforce_add_address (struct GNUNET_ATS_TEST_Operation *op)
1729{ 1765{
1730 /* 1766 struct ATS_Address *addr;
1731 struct BenchmarkPeer *peer; 1767 struct TestPeer *p;
1732 struct BenchmarkPartner *partner;
1733 1768
1734 peer = GNUNET_ATS_TEST_get_peer (op->src_id); 1769 if (NULL == (p = find_peer_by_id (op->peer_id)))
1735 if (NULL == peer)
1736 { 1770 {
1737 GNUNET_break (0); 1771 p = GNUNET_new (struct TestPeer);
1738 return; 1772 p->id = op->peer_id;
1773 memset (&p->peer_id, '0', sizeof (p->peer_id));
1774 GNUNET_CONTAINER_DLL_insert (peer_head, peer_tail, p);
1739 } 1775 }
1740 1776
1741 partner = GNUNET_ATS_TEST_get_partner (op->src_id, op->dest_id); 1777 addr = create_ats_address (&p->peer_id, op->plugin, op->address,
1742 if (NULL == partner) 1778 strlen (op->address) + 1, op->address_session);
1743 { 1779
1744 GNUNET_break (0); 1780 GNUNET_CONTAINER_multipeermap_put (sh->addresses, &p->peer_id, addr,
1745 return; 1781 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
1746 } 1782
1783 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Adding address %u for peer %u\n",
1784 op->address_id, op->peer_id);
1785
1786 sh->env.sf.s_add (sh->solver, addr, op->address_network);
1787
1788}
1747 1789
1748 fprintf (stderr, "Found master %llu slave %llu\n",op->src_id, op->dest_id); 1790struct AddressLookupCtx
1791{
1792 struct ATS_Address *res;
1793 struct GNUNET_ATS_TEST_Operation *op;
1794};
1795
1796int find_address_it (void *cls,
1797 const struct GNUNET_PeerIdentity *key,
1798 void *value)
1799{
1800 struct AddressLookupCtx *ctx = cls;
1801 struct ATS_Address *addr = value;
1749 1802
1750 if (NULL != partner->tg) 1803 if ( (0 == strcmp (ctx->op->plugin, addr->plugin)) &&
1804 (0 == strcmp (ctx->op->address, addr->addr)) )
1751 { 1805 {
1752 fprintf (stderr, "Stopping traffic between master %llu slave %llu\n",op->src_id, op->dest_id); 1806 ctx->res = addr;
1753 GNUNET_ATS_TEST_generate_traffic_stop(partner->tg); 1807 return GNUNET_NO;
1754 partner->tg = NULL;
1755 } 1808 }
1756 1809 return GNUNET_YES;
1757 partner->tg = GNUNET_ATS_TEST_generate_traffic_start(peer, partner,
1758 op->tg_type, op->base_rate, op->max_rate, op->period,
1759 GNUNET_TIME_UNIT_FOREVER_REL);
1760 */
1761} 1810}
1762 1811
1763static void 1812static void
1764enforce_del_address (struct GNUNET_ATS_TEST_Operation *op) 1813enforce_del_address (struct GNUNET_ATS_TEST_Operation *op)
1765{ 1814{
1766 /* 1815 struct TestPeer *p;
1767 struct BenchmarkPartner *p; 1816 struct AddressLookupCtx ctx;
1768 p = GNUNET_ATS_TEST_get_partner (op->src_id, op->dest_id); 1817
1769 if (NULL == p) 1818 if (NULL == (p = find_peer_by_id (op->peer_id)))
1770 { 1819 {
1771 GNUNET_break (0); 1820 GNUNET_break (0);
1821 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1822 "Deleting address for unknown peer %u\n", op->peer_id);
1772 return; 1823 return;
1773 } 1824 }
1774 1825
1775 fprintf (stderr, "Found master %llu slave %llu\n",op->src_id, op->dest_id); 1826 ctx.op = op;
1776 1827 ctx.res = NULL;
1777 if (NULL != p->tg) 1828 GNUNET_CONTAINER_multipeermap_get_multiple (sh->addresses, &p->peer_id,
1829 find_address_it, &ctx);
1830 if (NULL == ctx.res)
1778 { 1831 {
1779 fprintf (stderr, "Stopping traffic between master %llu slave %llu\n", 1832 GNUNET_break (0);
1780 op->src_id, op->dest_id); 1833 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1781 GNUNET_ATS_TEST_generate_traffic_stop(p->tg); 1834 "Deleting unknown address for peer %u\n", op->peer_id);
1782 p->tg = NULL; 1835 return;
1783 } 1836 }
1784 */ 1837
1838 GNUNET_CONTAINER_multipeermap_remove (sh->addresses, &p->peer_id, ctx.res);
1839
1840 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Removing address %u for peer %u\n",
1841 op->address_id, op->peer_id);
1842
1843 sh->env.sf.s_del (sh->solver, ctx.res, GNUNET_NO);
1785} 1844}
1786 1845
1787static void 1846static void
@@ -2108,24 +2167,8 @@ GNUNET_ATS_solvers_experimentation_load (char *filename)
2108 * Solver 2167 * Solver
2109 */ 2168 */
2110 2169
2111struct GNUNET_ATS_TESTING_SolverHandle
2112{
2113 char * plugin;
2114 struct GNUNET_ATS_PluginEnvironment env;
2115 void *solver;
2116 struct GNUNET_CONTAINER_MultiPeerMap *addresses;
2117};
2118
2119enum GNUNET_ATS_Solvers
2120{
2121 GNUNET_ATS_SOLVER_PROPORTIONAL,
2122 GNUNET_ATS_SOLVER_MLP,
2123 GNUNET_ATS_SOLVER_RIL,
2124};
2125
2126
2127void 2170void
2128GNUNET_ATS_solvers_solver_stop (struct GNUNET_ATS_TESTING_SolverHandle *sh) 2171GNUNET_ATS_solvers_solver_stop (struct SolverHandle *sh)
2129{ 2172{
2130 GNUNET_STATISTICS_destroy ((struct GNUNET_STATISTICS_Handle *) sh->env.stats, 2173 GNUNET_STATISTICS_destroy ((struct GNUNET_STATISTICS_Handle *) sh->env.stats,
2131 GNUNET_NO); 2174 GNUNET_NO);
@@ -2375,10 +2418,10 @@ normalized_property_changed_cb (void *cls, struct ATS_Address *peer,
2375} 2418}
2376 2419
2377 2420
2378struct GNUNET_ATS_TESTING_SolverHandle * 2421struct SolverHandle *
2379GNUNET_ATS_solvers_solver_start (enum GNUNET_ATS_Solvers type) 2422GNUNET_ATS_solvers_solver_start (enum GNUNET_ATS_Solvers type)
2380{ 2423{
2381 struct GNUNET_ATS_TESTING_SolverHandle *sh; 2424 struct SolverHandle *sh;
2382 char * solver_str; 2425 char * solver_str;
2383 unsigned long long quotas_in[GNUNET_ATS_NetworkTypeCount]; 2426 unsigned long long quotas_in[GNUNET_ATS_NetworkTypeCount];
2384 unsigned long long quotas_out[GNUNET_ATS_NetworkTypeCount]; 2427 unsigned long long quotas_out[GNUNET_ATS_NetworkTypeCount];
@@ -2399,7 +2442,7 @@ GNUNET_ATS_solvers_solver_start (enum GNUNET_ATS_Solvers type)
2399 break; 2442 break;
2400 } 2443 }
2401 2444
2402 sh = GNUNET_new (struct GNUNET_ATS_TESTING_SolverHandle); 2445 sh = GNUNET_new (struct SolverHandle);
2403 GNUNET_asprintf (&sh->plugin, "libgnunet_plugin_ats_%s", solver_str); 2446 GNUNET_asprintf (&sh->plugin, "libgnunet_plugin_ats_%s", solver_str);
2404 2447
2405 /* setup environment */ 2448 /* setup environment */
diff --git a/src/ats/gnunet-ats-solver-eval.h b/src/ats/gnunet-ats-solver-eval.h
index fe63a6b58..8c8e1c459 100644
--- a/src/ats/gnunet-ats-solver-eval.h
+++ b/src/ats/gnunet-ats-solver-eval.h
@@ -52,6 +52,47 @@ enum OperationType
52 SOLVER_OP_STOP_REQUEST, 52 SOLVER_OP_STOP_REQUEST,
53}; 53};
54 54
55struct SolverHandle
56{
57 /**
58 * Solver plugin name
59 */
60 char *plugin;
61
62 /**
63 * Solver environment
64 */
65 struct GNUNET_ATS_PluginEnvironment env;
66
67 /**
68 * Solver handle
69 */
70 void *solver;
71
72 /**
73 * Address hashmap
74 */
75 struct GNUNET_CONTAINER_MultiPeerMap *addresses;
76};
77
78enum GNUNET_ATS_Solvers
79{
80 GNUNET_ATS_SOLVER_PROPORTIONAL,
81 GNUNET_ATS_SOLVER_MLP,
82 GNUNET_ATS_SOLVER_RIL,
83};
84
85
86struct TestPeer
87{
88 struct TestPeer *prev;
89 struct TestPeer *next;
90
91 int id;
92 struct GNUNET_PeerIdentity peer_id;
93};
94
95
55struct Episode; 96struct Episode;
56 97
57struct Experiment; 98struct Experiment;