diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2014-02-11 10:02:46 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2014-02-11 10:02:46 +0000 |
commit | aa7ba7f32e905f463ee16ff0d6bbc4403a430776 (patch) | |
tree | 9899dc2aa8864520870e3c2685b3079af47a6d29 /src | |
parent | f65a1270609f4cc37f023a0a61788e014a7f85b0 (diff) | |
download | gnunet-aa7ba7f32e905f463ee16ff0d6bbc4403a430776.tar.gz gnunet-aa7ba7f32e905f463ee16ff0d6bbc4403a430776.zip |
adding and deleting address from solver
Diffstat (limited to 'src')
-rw-r--r-- | src/ats/experiments/example.exp | 20 | ||||
-rw-r--r-- | src/ats/gnunet-ats-solver-eval.c | 159 | ||||
-rw-r--r-- | src/ats/gnunet-ats-solver-eval.h | 41 |
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 | ||
32 | op-1-operation = start_set_property | 32 | #op-1-operation = start_set_property |
33 | op-1-address-id = 0 | 33 | #op-1-address-id = 0 |
34 | op-1-peer-id = 0 | 34 | #op-1-peer-id = 0 |
35 | # constant, linear, sinus, random | 35 | # constant, linear, sinus, random |
36 | op-1-gen-type = random | 36 | #op-1-gen-type = random |
37 | op-1-base-rate= 10000 | 37 | #op-1-base-rate= 10000 |
38 | op-1-max-rate = 100000 | 38 | #op-1-max-rate = 100000 |
39 | op-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" |
42 | op-1-property = UTILIZATION_UP | 42 | #op-1-property = UTILIZATION_UP |
43 | 43 | ||
44 | op-2-operation = start_request | 44 | op-1-operation = start_request |
45 | op-2-peer-id = 0 | 45 | op-1-peer-id = 0 |
46 | 46 | ||
47 | [episode-1] | 47 | [episode-1] |
48 | duration = 2 s | 48 | duration = 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 | ||
33 | static struct Experiment *e; | 32 | static struct Experiment *e; |
34 | 33 | ||
35 | static struct LoggingHandle *l; | 34 | static struct LoggingHandle *l; |
36 | 35 | ||
37 | static struct GNUNET_ATS_TESTING_SolverHandle *sh; | 36 | static struct SolverHandle *sh; |
37 | |||
38 | static struct TestPeer *peer_head; | ||
39 | static 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 | ||
1729 | static struct TestPeer * | ||
1730 | find_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 | |||
1739 | struct ATS_Address * | ||
1740 | create_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 | |||
1727 | static void | 1763 | static void |
1728 | enforce_add_address (struct GNUNET_ATS_TEST_Operation *op) | 1764 | enforce_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); | 1790 | struct AddressLookupCtx |
1791 | { | ||
1792 | struct ATS_Address *res; | ||
1793 | struct GNUNET_ATS_TEST_Operation *op; | ||
1794 | }; | ||
1795 | |||
1796 | int 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 | ||
1763 | static void | 1812 | static void |
1764 | enforce_del_address (struct GNUNET_ATS_TEST_Operation *op) | 1813 | enforce_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 | ||
1787 | static void | 1846 | static void |
@@ -2108,24 +2167,8 @@ GNUNET_ATS_solvers_experimentation_load (char *filename) | |||
2108 | * Solver | 2167 | * Solver |
2109 | */ | 2168 | */ |
2110 | 2169 | ||
2111 | struct 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 | |||
2119 | enum GNUNET_ATS_Solvers | ||
2120 | { | ||
2121 | GNUNET_ATS_SOLVER_PROPORTIONAL, | ||
2122 | GNUNET_ATS_SOLVER_MLP, | ||
2123 | GNUNET_ATS_SOLVER_RIL, | ||
2124 | }; | ||
2125 | |||
2126 | |||
2127 | void | 2170 | void |
2128 | GNUNET_ATS_solvers_solver_stop (struct GNUNET_ATS_TESTING_SolverHandle *sh) | 2171 | GNUNET_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 | ||
2378 | struct GNUNET_ATS_TESTING_SolverHandle * | 2421 | struct SolverHandle * |
2379 | GNUNET_ATS_solvers_solver_start (enum GNUNET_ATS_Solvers type) | 2422 | GNUNET_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 | ||
55 | struct 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 | |||
78 | enum GNUNET_ATS_Solvers | ||
79 | { | ||
80 | GNUNET_ATS_SOLVER_PROPORTIONAL, | ||
81 | GNUNET_ATS_SOLVER_MLP, | ||
82 | GNUNET_ATS_SOLVER_RIL, | ||
83 | }; | ||
84 | |||
85 | |||
86 | struct TestPeer | ||
87 | { | ||
88 | struct TestPeer *prev; | ||
89 | struct TestPeer *next; | ||
90 | |||
91 | int id; | ||
92 | struct GNUNET_PeerIdentity peer_id; | ||
93 | }; | ||
94 | |||
95 | |||
55 | struct Episode; | 96 | struct Episode; |
56 | 97 | ||
57 | struct Experiment; | 98 | struct Experiment; |