aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2012-05-22 09:57:18 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2012-05-22 09:57:18 +0000
commit58243199da1c8959f3a86d5ec848575f97ca6e94 (patch)
tree0b1accdbb672fe5c36af033f59a955c910e41a86
parent17a97ae662262369a0610e5a9a52f49d4ef03e91 (diff)
downloadgnunet-58243199da1c8959f3a86d5ec848575f97ca6e94.tar.gz
gnunet-58243199da1c8959f3a86d5ec848575f97ca6e94.zip
- suggest backoff reset
-rw-r--r--src/ats/Makefile.am7
-rw-r--r--src/ats/ats.h9
-rw-r--r--src/ats/ats_api_scheduling.c26
-rw-r--r--src/ats/gnunet-service-ats.c3
-rw-r--r--src/ats/gnunet-service-ats_addresses.c24
-rw-r--r--src/ats/gnunet-service-ats_addresses.h3
-rw-r--r--src/ats/gnunet-service-ats_scheduling.c24
-rw-r--r--src/ats/gnunet-service-ats_scheduling.h13
-rw-r--r--src/ats/test_ats_api_reset_backoff.c316
-rw-r--r--src/include/gnunet_ats_service.h11
-rw-r--r--src/include/gnunet_protocols.h6
11 files changed, 441 insertions, 1 deletions
diff --git a/src/ats/Makefile.am b/src/ats/Makefile.am
index d8c7e8688..91d25a274 100644
--- a/src/ats/Makefile.am
+++ b/src/ats/Makefile.am
@@ -54,6 +54,7 @@ gnunet_service_ats_LDADD = \
54 54
55check_PROGRAMS = \ 55check_PROGRAMS = \
56 test_ats_api_scheduling \ 56 test_ats_api_scheduling \
57 test_ats_api_reset_backoff \
57 $(GN_MLP_TEST) \ 58 $(GN_MLP_TEST) \
58 $(GN_MLP_TEST_AVG) \ 59 $(GN_MLP_TEST_AVG) \
59 $(GN_MLP_PERF) 60 $(GN_MLP_PERF)
@@ -96,6 +97,12 @@ test_ats_api_scheduling_LDADD = \
96 $(top_builddir)/src/util/libgnunetutil.la \ 97 $(top_builddir)/src/util/libgnunetutil.la \
97 $(top_builddir)/src/ats/libgnunetats.la 98 $(top_builddir)/src/ats/libgnunetats.la
98 99
100test_ats_api_reset_backoff_SOURCES = \
101 test_ats_api_reset_backoff.c
102test_ats_api_reset_backoff_LDADD = \
103 $(top_builddir)/src/util/libgnunetutil.la \
104 $(top_builddir)/src/ats/libgnunetats.la
105
99#test_ats_api_scheduling_get_type_SOURCES = \ 106#test_ats_api_scheduling_get_type_SOURCES = \
100# test_ats_api_scheduling_get_type.c 107# test_ats_api_scheduling_get_type.c
101#test_ats_api_scheduling_get_type_LDADD = \ 108#test_ats_api_scheduling_get_type_LDADD = \
diff --git a/src/ats/ats.h b/src/ats/ats.h
index 30ca29580..f4c3d9fba 100644
--- a/src/ats/ats.h
+++ b/src/ats/ats.h
@@ -61,6 +61,15 @@ struct RequestAddressMessage
61 struct GNUNET_PeerIdentity peer; 61 struct GNUNET_PeerIdentity peer;
62}; 62};
63 63
64struct ResetBackoffMessage
65{
66 struct GNUNET_MessageHeader header;
67
68 uint32_t reserved GNUNET_PACKED;
69
70 struct GNUNET_PeerIdentity peer;
71};
72
64 73
65struct AddressUpdateMessage 74struct AddressUpdateMessage
66{ 75{
diff --git a/src/ats/ats_api_scheduling.c b/src/ats/ats_api_scheduling.c
index 3c98b238c..583ada8f7 100644
--- a/src/ats/ats_api_scheduling.c
+++ b/src/ats/ats_api_scheduling.c
@@ -918,6 +918,32 @@ GNUNET_ATS_scheduling_done (struct GNUNET_ATS_SchedulingHandle *sh)
918 sh = NULL; 918 sh = NULL;
919} 919}
920 920
921/**
922 * We would like to reset the address suggestion block time for this
923 * peer
924 *
925 * @param sh handle
926 * @param peer identity of the peer we want to reset
927 */
928void
929GNUNET_ATS_reset_backoff (struct GNUNET_ATS_SchedulingHandle *sh,
930 const struct GNUNET_PeerIdentity *peer)
931{
932 struct PendingMessage *p;
933 struct ResetBackoffMessage *m;
934
935 p = GNUNET_malloc (sizeof (struct PendingMessage) +
936 sizeof (struct ResetBackoffMessage));
937 p->size = sizeof (struct ResetBackoffMessage);
938 p->is_init = GNUNET_NO;
939 m = (struct ResetBackoffMessage *) &p[1];
940 m->header.type = htons (GNUNET_MESSAGE_TYPE_ATS_RESET_BACKOFF);
941 m->header.size = htons (sizeof (struct ResetBackoffMessage));
942 m->reserved = htonl (0);
943 m->peer = *peer;
944 GNUNET_CONTAINER_DLL_insert_tail (sh->pending_head, sh->pending_tail, p);
945 do_transmit (sh);
946}
921 947
922/** 948/**
923 * We would like to establish a new connection with a peer. ATS 949 * We would like to establish a new connection with a peer. ATS
diff --git a/src/ats/gnunet-service-ats.c b/src/ats/gnunet-service-ats.c
index 2f1dc95e8..aef72f171 100644
--- a/src/ats/gnunet-service-ats.c
+++ b/src/ats/gnunet-service-ats.c
@@ -153,6 +153,9 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
153 sizeof (struct ReservationRequestMessage)}, 153 sizeof (struct ReservationRequestMessage)},
154 {&GAS_handle_preference_change, NULL, 154 {&GAS_handle_preference_change, NULL,
155 GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_CHANGE, 0}, 155 GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_CHANGE, 0},
156 {&GAS_handle_reset_backoff, NULL,
157 GNUNET_MESSAGE_TYPE_ATS_RESET_BACKOFF,
158 sizeof (struct ResetBackoffMessage)},
156 {NULL, NULL, 0, 0} 159 {NULL, NULL, 0, 0}
157 }; 160 };
158 GSA_server = server; 161 GSA_server = server;
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c
index 096a98314..7f96edcac 100644
--- a/src/ats/gnunet-service-ats_addresses.c
+++ b/src/ats/gnunet-service-ats_addresses.c
@@ -743,6 +743,30 @@ GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer)
743} 743}
744 744
745 745
746static int
747reset_address_it (void *cls, const GNUNET_HashCode * key, void *value)
748{
749 struct ATS_Address *aa = value;
750
751 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
752 "Resetting interval for peer `%s' address %p from %llu to 0\n", GNUNET_i2s (&aa->peer), aa, aa->block_interval);
753
754 aa->blocked_until = GNUNET_TIME_absolute_get_zero();
755 aa->block_interval = GNUNET_TIME_relative_get_zero();
756 return GNUNET_OK;
757}
758
759void
760GAS_addresses_handle_backoff_reset (const struct GNUNET_PeerIdentity *peer)
761{
762 GNUNET_break (GNUNET_SYSERR != GNUNET_CONTAINER_multihashmap_get_multiple (addresses,
763 &peer->hashPubKey,
764 &reset_address_it,
765 NULL));
766}
767
768
769
746// FIXME: this function should likely end up in the LP-subsystem and 770// FIXME: this function should likely end up in the LP-subsystem and
747// not with 'addresses' in the future... 771// not with 'addresses' in the future...
748void 772void
diff --git a/src/ats/gnunet-service-ats_addresses.h b/src/ats/gnunet-service-ats_addresses.h
index fbe1fc994..fe07563ac 100644
--- a/src/ats/gnunet-service-ats_addresses.h
+++ b/src/ats/gnunet-service-ats_addresses.h
@@ -112,6 +112,9 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
112void 112void
113GAS_addresses_done (void); 113GAS_addresses_done (void);
114 114
115void
116GAS_addresses_handle_backoff_reset (const struct GNUNET_PeerIdentity *peer);
117
115/** 118/**
116 * This address is now used or not used anymore 119 * This address is now used or not used anymore
117 */ 120 */
diff --git a/src/ats/gnunet-service-ats_scheduling.c b/src/ats/gnunet-service-ats_scheduling.c
index 5d03ff007..0b66ac566 100644
--- a/src/ats/gnunet-service-ats_scheduling.c
+++ b/src/ats/gnunet-service-ats_scheduling.c
@@ -198,6 +198,30 @@ GAS_handle_request_address_cancel (void *cls,
198 GNUNET_SERVER_receive_done (client, GNUNET_OK); 198 GNUNET_SERVER_receive_done (client, GNUNET_OK);
199} 199}
200 200
201/**
202 * Handle 'reset backoff' messages from clients.
203 *
204 * @param cls unused, NULL
205 * @param client client that sent the request
206 * @param message the request message
207 */
208void
209GAS_handle_reset_backoff (void *cls,
210 struct GNUNET_SERVER_Client *client,
211 const struct GNUNET_MessageHeader *message)
212{
213 const struct ResetBackoffMessage *msg =
214 (const struct ResetBackoffMessage *) message;
215
216 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n",
217 "RESET_BACKOFF");
218 GNUNET_STATISTICS_update (GSA_stats, "# backoff reset requests received", 1,
219 GNUNET_NO);
220 GNUNET_break (0 == ntohl (msg->reserved));
221 GAS_addresses_handle_backoff_reset (&msg->peer);
222 GNUNET_SERVER_receive_done (client, GNUNET_OK);
223}
224
201 225
202/** 226/**
203 * Handle 'address update' messages from clients. 227 * Handle 'address update' messages from clients.
diff --git a/src/ats/gnunet-service-ats_scheduling.h b/src/ats/gnunet-service-ats_scheduling.h
index 45fca2f3d..08a7f1b33 100644
--- a/src/ats/gnunet-service-ats_scheduling.h
+++ b/src/ats/gnunet-service-ats_scheduling.h
@@ -51,6 +51,19 @@ GAS_scheduling_remove_client (struct GNUNET_SERVER_Client *client);
51 51
52 52
53/** 53/**
54 * Handle 'reset backoff' messages from clients.
55 *
56 * @param cls unused, NULL
57 * @param client client that sent the request
58 * @param message the request message
59 */
60void
61GAS_handle_reset_backoff (void *cls,
62 struct GNUNET_SERVER_Client *client,
63 const struct GNUNET_MessageHeader *message);
64
65
66/**
54 * Transmit the given address suggestion and bandwidth update to all scheduling 67 * Transmit the given address suggestion and bandwidth update to all scheduling
55 * clients. 68 * clients.
56 * 69 *
diff --git a/src/ats/test_ats_api_reset_backoff.c b/src/ats/test_ats_api_reset_backoff.c
new file mode 100644
index 000000000..90d9e7f83
--- /dev/null
+++ b/src/ats/test_ats_api_reset_backoff.c
@@ -0,0 +1,316 @@
1/*
2 This file is part of GNUnet.
3 (C) 2010,2011 Christian Grothoff (and other contributing authors)
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
19*/
20/**
21 * @file ats/test_ats_api_reset_backoff.c
22 * @brief test case for block reset api
23 * @author Christian Grothoff
24 * @author Matthias Wachs
25 */
26#include "platform.h"
27#include "gnunet_ats_service.h"
28#include "ats.h"
29
30#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10)
31#define ATS_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1)
32
33static GNUNET_SCHEDULER_TaskIdentifier die_task;
34
35static GNUNET_SCHEDULER_TaskIdentifier suggest_timeout_task;
36
37static struct GNUNET_ATS_SchedulingHandle *ats;
38
39struct GNUNET_OS_Process *arm_proc;
40
41static int ret;
42
43struct Address
44{
45 char *plugin;
46 size_t plugin_len;
47
48 void *addr;
49 size_t addr_len;
50
51 struct GNUNET_ATS_Information *ats;
52 int ats_count;
53
54 void *session;
55};
56
57struct PeerContext
58{
59 struct GNUNET_PeerIdentity id;
60
61 struct Address *addr;
62};
63
64struct GNUNET_HELLO_Address hello_addr;
65struct Address address;
66struct PeerContext peer;
67struct GNUNET_ATS_Information atsi[2];
68
69static void
70stop_arm ()
71{
72 if (0 != GNUNET_OS_process_kill (arm_proc, SIGTERM))
73 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
74 GNUNET_OS_process_wait (arm_proc);
75 GNUNET_OS_process_destroy (arm_proc);
76 arm_proc = NULL;
77}
78
79
80static void
81end_badly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
82{
83 die_task = GNUNET_SCHEDULER_NO_TASK;
84
85 if (suggest_timeout_task != GNUNET_SCHEDULER_NO_TASK)
86 {
87 GNUNET_SCHEDULER_cancel (suggest_timeout_task);
88 suggest_timeout_task = GNUNET_SCHEDULER_NO_TASK;
89 }
90
91 if (ats != NULL)
92 {
93 GNUNET_ATS_scheduling_done (ats);
94 ats = NULL;
95 }
96
97 ret = GNUNET_SYSERR;
98
99 stop_arm ();
100}
101
102
103static void
104end ()
105{
106 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Shutting down\n");
107 if (die_task != GNUNET_SCHEDULER_NO_TASK)
108 {
109 GNUNET_SCHEDULER_cancel (die_task);
110 die_task = GNUNET_SCHEDULER_NO_TASK;
111 }
112
113 if (suggest_timeout_task != GNUNET_SCHEDULER_NO_TASK)
114 {
115 GNUNET_SCHEDULER_cancel (suggest_timeout_task);
116 suggest_timeout_task = GNUNET_SCHEDULER_NO_TASK;
117 }
118
119 GNUNET_ATS_scheduling_done (ats);
120
121 ret = 0;
122
123 stop_arm ();
124}
125
126
127static void
128suggest_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
129{
130 suggest_timeout_task = GNUNET_SCHEDULER_NO_TASK;
131
132 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Requesting address for peer timed out\n");
133}
134
135static void request_address ()
136{
137
138 if (suggest_timeout_task != GNUNET_SCHEDULER_NO_TASK)
139 {
140 GNUNET_SCHEDULER_cancel (suggest_timeout_task);
141 suggest_timeout_task = GNUNET_SCHEDULER_NO_TASK;
142 }
143
144 suggest_timeout_task = GNUNET_SCHEDULER_add_delayed(GNUNET_TIME_UNIT_MINUTES, &suggest_timeout, NULL);
145
146 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Requesting address for peer `%s'\n",
147 GNUNET_i2s (&peer.id));
148 GNUNET_ATS_suggest_address (ats, &peer.id);
149}
150
151
152static void
153address_suggest_cb (void *cls, const struct GNUNET_HELLO_Address *a,
154 struct Session *session,
155 struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
156 struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
157 const struct GNUNET_ATS_Information *atsi,
158 uint32_t ats_count)
159{
160 static int suggestions;
161 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "ATS suggests address `%s'\n",
162 GNUNET_i2s (&a->peer));
163
164 if (0 != memcmp (&a->peer, &peer.id,
165 sizeof (struct GNUNET_PeerIdentity)))
166 {
167 GNUNET_break (0);
168 if (die_task != GNUNET_SCHEDULER_NO_TASK)
169 {
170 GNUNET_SCHEDULER_cancel (die_task);
171 die_task = GNUNET_SCHEDULER_NO_TASK;
172 }
173 GNUNET_SCHEDULER_add_now (&end_badly, NULL);
174 return;
175 }
176
177 if (0 != strcmp (a->transport_name, address.plugin))
178 {
179 GNUNET_break (0);
180 if (die_task != GNUNET_SCHEDULER_NO_TASK)
181 {
182 GNUNET_SCHEDULER_cancel (die_task);
183 die_task = GNUNET_SCHEDULER_NO_TASK;
184 }
185 GNUNET_SCHEDULER_add_now (&end_badly, NULL);
186 return;
187 }
188
189 if (a->address_length != address.addr_len)
190 {
191 GNUNET_break (0);
192 if (die_task != GNUNET_SCHEDULER_NO_TASK)
193 {
194 GNUNET_SCHEDULER_cancel (die_task);
195 die_task = GNUNET_SCHEDULER_NO_TASK;
196 }
197 GNUNET_SCHEDULER_add_now (&end_badly, NULL);
198 return;
199 }
200
201 if (0 != memcmp (a->address, address.addr,
202 a->address_length))
203 {
204 GNUNET_break (0);
205 if (die_task != GNUNET_SCHEDULER_NO_TASK)
206 {
207 GNUNET_SCHEDULER_cancel (die_task);
208 die_task = GNUNET_SCHEDULER_NO_TASK;
209 }
210 GNUNET_SCHEDULER_add_now (&end_badly, NULL);
211 return;
212 }
213
214 if (session != address.session)
215 {
216 GNUNET_break (0);
217 if (die_task != GNUNET_SCHEDULER_NO_TASK)
218 {
219 GNUNET_SCHEDULER_cancel (die_task);
220 die_task = GNUNET_SCHEDULER_NO_TASK;
221 }
222 GNUNET_SCHEDULER_add_now (&end_badly, NULL);
223 return;
224 }
225
226 suggestions ++;
227
228 if (2 == suggestions)
229 {
230 GNUNET_SCHEDULER_add_now(&end, NULL);
231 return;
232 }
233
234 if (suggest_timeout_task != GNUNET_SCHEDULER_NO_TASK)
235 {
236 GNUNET_SCHEDULER_cancel (suggest_timeout_task);
237 suggest_timeout_task = GNUNET_SCHEDULER_NO_TASK;
238 }
239
240 GNUNET_ATS_reset_backoff(ats, &a->peer);
241 request_address ();
242}
243
244
245
246
247void
248start_arm (const char *cfgname)
249{
250 arm_proc =
251 GNUNET_OS_start_process (GNUNET_YES, NULL, NULL, "gnunet-service-arm",
252 "gnunet-service-arm",
253 "-c", cfgname, NULL);
254}
255
256static void
257check (void *cls, char *const *args, const char *cfgfile,
258 const struct GNUNET_CONFIGURATION_Handle *cfg)
259{
260 ret = GNUNET_SYSERR;
261
262 die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &end_badly, NULL);
263 start_arm (cfgfile);
264
265 ats = GNUNET_ATS_scheduling_init (cfg, &address_suggest_cb, NULL);
266
267 if (ats == NULL)
268 {
269 ret = GNUNET_SYSERR;
270 end ();
271 return;
272 }
273
274 /* set up peer */
275 GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_WEAK,
276 &peer.id.hashPubKey);
277 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created peer `%s'\n", GNUNET_i2s (&peer.id));
278
279 address.plugin = "test";
280 address.session = NULL;
281 address.addr = GNUNET_strdup ("test");
282 address.addr_len = 4;
283
284 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding address\n");
285
286 hello_addr.peer = peer.id;
287 hello_addr.transport_name = address.plugin;
288 hello_addr.address = address.addr;
289 hello_addr.address_length = address.addr_len;
290 GNUNET_ATS_address_update (ats, &hello_addr, address.session, NULL, 0);
291
292 request_address ();
293}
294
295int
296main (int argc, char *argv[])
297{
298 static char *const argv2[] = { "test_ats_api_scheduling",
299 "-c",
300 "test_ats_api.conf",
301 "-L", "WARNING",
302 NULL
303 };
304
305 static struct GNUNET_GETOPT_CommandLineOption options[] = {
306 GNUNET_GETOPT_OPTION_END
307 };
308
309 GNUNET_PROGRAM_run ((sizeof (argv2) / sizeof (char *)) - 1, argv2,
310 "test_ats_api_scheduling", "nohelp", options, &check,
311 NULL);
312
313
314 return ret;
315}
316/* end of file test_ats_api_reset_backoff.c */
diff --git a/src/include/gnunet_ats_service.h b/src/include/gnunet_ats_service.h
index 0ee3d5535..a5f1bdc23 100644
--- a/src/include/gnunet_ats_service.h
+++ b/src/include/gnunet_ats_service.h
@@ -523,6 +523,17 @@ GNUNET_ATS_scheduling_done (struct GNUNET_ATS_SchedulingHandle *sh);
523 523
524 524
525/** 525/**
526 * We would like to reset the address suggestion block time for this
527 * peer
528 *
529 * @param sh handle
530 * @param peer identity of the peer we want to reset
531 */
532void
533GNUNET_ATS_reset_backoff (struct GNUNET_ATS_SchedulingHandle *sh,
534 const struct GNUNET_PeerIdentity *peer);
535
536/**
526 * We would like to establish a new connection with a peer. ATS 537 * We would like to establish a new connection with a peer. ATS
527 * should suggest a good address to begin with. 538 * should suggest a good address to begin with.
528 * 539 *
diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h
index 2ec2baea6..b655f0896 100644
--- a/src/include/gnunet_protocols.h
+++ b/src/include/gnunet_protocols.h
@@ -1028,7 +1028,11 @@ extern "C"
1028 */ 1028 */
1029#define GNUNET_MESSAGE_TYPE_ATS_ADDRESS_IN_USE 351 1029#define GNUNET_MESSAGE_TYPE_ATS_ADDRESS_IN_USE 351
1030 1030
1031 1031/**
1032 * Type of the 'struct AddressUseMessage' sent by ATS to client
1033 * to confirm that an address is used or not used anymore
1034 */
1035#define GNUNET_MESSAGE_TYPE_ATS_RESET_BACKOFF 352
1032 1036
1033 1037
1034/******************************************************************************* 1038/*******************************************************************************