diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2013-05-07 15:51:54 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2013-05-07 15:51:54 +0000 |
commit | 7a3022c4bb8ea4f4d5d23263155d446d7dd4628f (patch) | |
tree | 6edc2b65bd5ac623f84a2a57896e7f26ae364469 | |
parent | 05aa8d8001e3977adb5d68d851db608c075dffee (diff) | |
download | gnunet-7a3022c4bb8ea4f4d5d23263155d446d7dd4628f.tar.gz gnunet-7a3022c4bb8ea4f4d5d23263155d446d7dd4628f.zip |
fix for 0002881 + test
-rw-r--r-- | src/transport/Makefile.am | 13 | ||||
-rw-r--r-- | src/transport/gnunet-service-transport_manipulation.c | 75 | ||||
-rw-r--r-- | src/transport/test_transport_api_manipulation_cfg_peer1.conf | 31 | ||||
-rw-r--r-- | src/transport/test_transport_api_manipulation_cfg_peer2.conf | 31 |
4 files changed, 137 insertions, 13 deletions
diff --git a/src/transport/Makefile.am b/src/transport/Makefile.am index 14ab82e5d..258a7aae5 100644 --- a/src/transport/Makefile.am +++ b/src/transport/Makefile.am | |||
@@ -351,6 +351,7 @@ check_PROGRAMS = \ | |||
351 | test_transport_blacklisting_multiple_plugins \ | 351 | test_transport_blacklisting_multiple_plugins \ |
352 | test_transport_api_manipulation_send_tcp \ | 352 | test_transport_api_manipulation_send_tcp \ |
353 | test_transport_api_manipulation_recv_tcp \ | 353 | test_transport_api_manipulation_recv_tcp \ |
354 | test_transport_api_manipulation_cfg \ | ||
354 | test_transport_api_reliability_tcp \ | 355 | test_transport_api_reliability_tcp \ |
355 | test_transport_api_reliability_tcp_nat \ | 356 | test_transport_api_reliability_tcp_nat \ |
356 | test_transport_api_unreliability_udp \ | 357 | test_transport_api_unreliability_udp \ |
@@ -406,6 +407,7 @@ TESTS = \ | |||
406 | test_transport_blacklisting_multiple_plugins \ | 407 | test_transport_blacklisting_multiple_plugins \ |
407 | test_transport_api_manipulation_send_tcp \ | 408 | test_transport_api_manipulation_send_tcp \ |
408 | test_transport_api_manipulation_recv_tcp \ | 409 | test_transport_api_manipulation_recv_tcp \ |
410 | test_transport_api_manipulation_cfg \ | ||
409 | test_transport_api_reliability_tcp \ | 411 | test_transport_api_reliability_tcp \ |
410 | test_transport_api_reliability_tcp_nat \ | 412 | test_transport_api_reliability_tcp_nat \ |
411 | test_transport_api_unreliability_udp \ | 413 | test_transport_api_unreliability_udp \ |
@@ -677,6 +679,15 @@ test_transport_api_manipulation_recv_tcp_LDADD = \ | |||
677 | $(top_builddir)/src/util/libgnunetutil.la \ | 679 | $(top_builddir)/src/util/libgnunetutil.la \ |
678 | $(top_builddir)/src/transport/libgnunettransporttesting.la | 680 | $(top_builddir)/src/transport/libgnunettransporttesting.la |
679 | 681 | ||
682 | test_transport_api_manipulation_cfg_SOURCES = \ | ||
683 | test_transport_api_manipulation_cfg.c | ||
684 | test_transport_api_manipulation_cfg_LDADD = \ | ||
685 | $(top_builddir)/src/transport/libgnunettransport.la \ | ||
686 | $(top_builddir)/src/hello/libgnunethello.la \ | ||
687 | $(top_builddir)/src/util/libgnunetutil.la \ | ||
688 | $(top_builddir)/src/transport/libgnunettransporttesting.la | ||
689 | |||
690 | |||
680 | 691 | ||
681 | test_transport_api_reliability_tcp_SOURCES = \ | 692 | test_transport_api_reliability_tcp_SOURCES = \ |
682 | test_transport_api_reliability.c | 693 | test_transport_api_reliability.c |
@@ -1005,6 +1016,8 @@ test_transport_api_manipulation_send_tcp_peer1.conf\ | |||
1005 | test_transport_api_manipulation_send_tcp_peer2.conf\ | 1016 | test_transport_api_manipulation_send_tcp_peer2.conf\ |
1006 | test_transport_api_manipulation_recv_tcp_peer1.conf\ | 1017 | test_transport_api_manipulation_recv_tcp_peer1.conf\ |
1007 | test_transport_api_manipulation_recv_tcp_peer2.conf\ | 1018 | test_transport_api_manipulation_recv_tcp_peer2.conf\ |
1019 | test_transport_api_manipulation_cfg_peer1.conf\ | ||
1020 | test_transport_api_manipulation_cfg_peer2.conf\ | ||
1008 | test_transport_api_tcp_nat_peer1.conf\ | 1021 | test_transport_api_tcp_nat_peer1.conf\ |
1009 | test_transport_api_tcp_nat_peer2.conf\ | 1022 | test_transport_api_tcp_nat_peer2.conf\ |
1010 | test_transport_api_tcp_peer1.conf\ | 1023 | test_transport_api_tcp_peer1.conf\ |
diff --git a/src/transport/gnunet-service-transport_manipulation.c b/src/transport/gnunet-service-transport_manipulation.c index 76278aa4b..d537dd9b7 100644 --- a/src/transport/gnunet-service-transport_manipulation.c +++ b/src/transport/gnunet-service-transport_manipulation.c | |||
@@ -48,6 +48,7 @@ enum TRAFFIC_METRIC_DIRECTION | |||
48 | struct GST_ManipulationHandle man_handle; | 48 | struct GST_ManipulationHandle man_handle; |
49 | 49 | ||
50 | 50 | ||
51 | |||
51 | /** | 52 | /** |
52 | * Struct containing information about manipulations to a specific peer | 53 | * Struct containing information about manipulations to a specific peer |
53 | */ | 54 | */ |
@@ -151,6 +152,11 @@ struct DelayQueueEntry | |||
151 | struct TM_Peer *tmp; | 152 | struct TM_Peer *tmp; |
152 | 153 | ||
153 | /** | 154 | /** |
155 | * Peer ID | ||
156 | */ | ||
157 | struct GNUNET_PeerIdentity id; | ||
158 | |||
159 | /** | ||
154 | * Absolute time when to send | 160 | * Absolute time when to send |
155 | */ | 161 | */ |
156 | struct GNUNET_TIME_Absolute sent_at; | 162 | struct GNUNET_TIME_Absolute sent_at; |
@@ -182,6 +188,14 @@ struct DelayQueueEntry | |||
182 | }; | 188 | }; |
183 | 189 | ||
184 | 190 | ||
191 | struct DelayQueueEntry *generic_dqe_head; | ||
192 | struct DelayQueueEntry *generic_dqe_tail; | ||
193 | |||
194 | /** | ||
195 | * Task to schedule delayed sendding | ||
196 | */ | ||
197 | GNUNET_SCHEDULER_TaskIdentifier generic_send_delay_task; | ||
198 | |||
185 | static void | 199 | static void |
186 | set_metric (struct TM_Peer *dest, int direction, uint32_t type, uint32_t value) | 200 | set_metric (struct TM_Peer *dest, int direction, uint32_t type, uint32_t value) |
187 | { | 201 | { |
@@ -340,16 +354,34 @@ send_delayed (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
340 | struct DelayQueueEntry *next; | 354 | struct DelayQueueEntry *next; |
341 | struct TM_Peer *tmp = dqe->tmp; | 355 | struct TM_Peer *tmp = dqe->tmp; |
342 | struct GNUNET_TIME_Relative delay; | 356 | struct GNUNET_TIME_Relative delay; |
343 | tmp->send_delay_task = GNUNET_SCHEDULER_NO_TASK; | ||
344 | GNUNET_CONTAINER_DLL_remove (tmp->send_head, tmp->send_tail, dqe); | ||
345 | GST_neighbours_send (&tmp->peer, dqe->msg, dqe->msg_size, dqe->timeout, dqe->cont, dqe->cont_cls); | ||
346 | 357 | ||
347 | next = tmp->send_head; | 358 | if (NULL != tmp) |
348 | if (NULL != next) | 359 | { |
360 | tmp->send_delay_task = GNUNET_SCHEDULER_NO_TASK; | ||
361 | GNUNET_CONTAINER_DLL_remove (tmp->send_head, tmp->send_tail, dqe); | ||
362 | GST_neighbours_send (&dqe->id, dqe->msg, dqe->msg_size, dqe->timeout, dqe->cont, dqe->cont_cls); | ||
363 | |||
364 | next = tmp->send_head; | ||
365 | if (NULL != next) | ||
366 | { | ||
367 | /* More delayed messages */ | ||
368 | delay = GNUNET_TIME_absolute_get_remaining (next->sent_at); | ||
369 | tmp->send_delay_task = GNUNET_SCHEDULER_add_delayed (delay, &send_delayed, dqe); | ||
370 | } | ||
371 | } | ||
372 | else | ||
349 | { | 373 | { |
350 | /* More delayed messages */ | 374 | /* Remove from generic queue */ |
351 | delay = GNUNET_TIME_absolute_get_remaining (next->sent_at); | 375 | generic_send_delay_task = GNUNET_SCHEDULER_NO_TASK; |
352 | tmp->send_delay_task = GNUNET_SCHEDULER_add_delayed (delay, &send_delayed, dqe); | 376 | GNUNET_CONTAINER_DLL_remove (generic_dqe_head, generic_dqe_tail, dqe); |
377 | GST_neighbours_send (&dqe->id, dqe->msg, dqe->msg_size, dqe->timeout, dqe->cont, dqe->cont_cls); | ||
378 | next = generic_dqe_head; | ||
379 | if (NULL != next) | ||
380 | { | ||
381 | /* More delayed messages */ | ||
382 | delay = GNUNET_TIME_absolute_get_remaining (next->sent_at); | ||
383 | generic_send_delay_task = GNUNET_SCHEDULER_add_delayed (delay, &send_delayed, dqe); | ||
384 | } | ||
353 | } | 385 | } |
354 | 386 | ||
355 | GNUNET_free (dqe); | 387 | GNUNET_free (dqe); |
@@ -384,6 +416,7 @@ GST_manipulation_send (const struct GNUNET_PeerIdentity *target, const void *msg | |||
384 | /* We have a delay */ | 416 | /* We have a delay */ |
385 | delay.rel_value = find_metric(tmp, GNUNET_ATS_QUALITY_NET_DELAY, TM_SEND); | 417 | delay.rel_value = find_metric(tmp, GNUNET_ATS_QUALITY_NET_DELAY, TM_SEND); |
386 | dqe = GNUNET_malloc (sizeof (struct DelayQueueEntry) + msg_size); | 418 | dqe = GNUNET_malloc (sizeof (struct DelayQueueEntry) + msg_size); |
419 | dqe->id = *target; | ||
387 | dqe->tmp = tmp; | 420 | dqe->tmp = tmp; |
388 | dqe->sent_at = GNUNET_TIME_absolute_add (GNUNET_TIME_absolute_get(), delay); | 421 | dqe->sent_at = GNUNET_TIME_absolute_add (GNUNET_TIME_absolute_get(), delay); |
389 | dqe->cont = cont; | 422 | dqe->cont = cont; |
@@ -403,7 +436,8 @@ GST_manipulation_send (const struct GNUNET_PeerIdentity *target, const void *msg | |||
403 | /* We have a delay */ | 436 | /* We have a delay */ |
404 | delay.rel_value = find_metric (&man_handle.general, GNUNET_ATS_QUALITY_NET_DELAY, TM_SEND); | 437 | delay.rel_value = find_metric (&man_handle.general, GNUNET_ATS_QUALITY_NET_DELAY, TM_SEND); |
405 | dqe = GNUNET_malloc (sizeof (struct DelayQueueEntry) + msg_size); | 438 | dqe = GNUNET_malloc (sizeof (struct DelayQueueEntry) + msg_size); |
406 | dqe->tmp = tmp; | 439 | dqe->id = *target; |
440 | dqe->tmp = NULL; | ||
407 | dqe->sent_at = GNUNET_TIME_absolute_add (GNUNET_TIME_absolute_get(), delay); | 441 | dqe->sent_at = GNUNET_TIME_absolute_add (GNUNET_TIME_absolute_get(), delay); |
408 | dqe->cont = cont; | 442 | dqe->cont = cont; |
409 | dqe->cont_cls = cont_cls; | 443 | dqe->cont_cls = cont_cls; |
@@ -411,9 +445,9 @@ GST_manipulation_send (const struct GNUNET_PeerIdentity *target, const void *msg | |||
411 | dqe->msg_size = msg_size; | 445 | dqe->msg_size = msg_size; |
412 | dqe->timeout = timeout; | 446 | dqe->timeout = timeout; |
413 | memcpy (dqe->msg, msg, msg_size); | 447 | memcpy (dqe->msg, msg, msg_size); |
414 | GNUNET_CONTAINER_DLL_insert_tail (tmp->send_head, tmp->send_tail, dqe); | 448 | GNUNET_CONTAINER_DLL_insert_tail (generic_dqe_head, generic_dqe_tail, dqe); |
415 | if (GNUNET_SCHEDULER_NO_TASK == tmp->send_delay_task) | 449 | if (GNUNET_SCHEDULER_NO_TASK == generic_send_delay_task) |
416 | tmp->send_delay_task =GNUNET_SCHEDULER_add_delayed (delay, &send_delayed, dqe); | 450 | generic_send_delay_task = GNUNET_SCHEDULER_add_delayed (delay, &send_delayed, dqe); |
417 | return; | 451 | return; |
418 | } | 452 | } |
419 | 453 | ||
@@ -597,9 +631,24 @@ free_tmps (void *cls, | |||
597 | void | 631 | void |
598 | GST_manipulation_stop () | 632 | GST_manipulation_stop () |
599 | { | 633 | { |
634 | struct DelayQueueEntry *cur; | ||
635 | struct DelayQueueEntry *next; | ||
600 | GNUNET_CONTAINER_multihashmap_iterate (man_handle.peers, &free_tmps,NULL); | 636 | GNUNET_CONTAINER_multihashmap_iterate (man_handle.peers, &free_tmps,NULL); |
601 | |||
602 | GNUNET_CONTAINER_multihashmap_destroy (man_handle.peers); | 637 | GNUNET_CONTAINER_multihashmap_destroy (man_handle.peers); |
638 | |||
639 | next = generic_dqe_head; | ||
640 | while (NULL != (cur = next)) | ||
641 | { | ||
642 | next = cur->next; | ||
643 | GNUNET_CONTAINER_DLL_remove (generic_dqe_head, generic_dqe_tail, cur); | ||
644 | GNUNET_free (cur); | ||
645 | } | ||
646 | if (GNUNET_SCHEDULER_NO_TASK != generic_send_delay_task) | ||
647 | { | ||
648 | GNUNET_SCHEDULER_cancel (generic_send_delay_task); | ||
649 | generic_send_delay_task = GNUNET_SCHEDULER_NO_TASK; | ||
650 | } | ||
651 | |||
603 | free_metric (&man_handle.general); | 652 | free_metric (&man_handle.general); |
604 | man_handle.peers = NULL; | 653 | man_handle.peers = NULL; |
605 | } | 654 | } |
diff --git a/src/transport/test_transport_api_manipulation_cfg_peer1.conf b/src/transport/test_transport_api_manipulation_cfg_peer1.conf new file mode 100644 index 000000000..bfd01d5d8 --- /dev/null +++ b/src/transport/test_transport_api_manipulation_cfg_peer1.conf | |||
@@ -0,0 +1,31 @@ | |||
1 | @INLINE@ template_cfg_peer1.conf | ||
2 | [PATHS] | ||
3 | SERVICEHOME = /tmp/test-transport/api-tcp-p1/ | ||
4 | |||
5 | [transport-tcp] | ||
6 | PORT = 12000 | ||
7 | TIMEOUT = 5 s | ||
8 | |||
9 | [arm] | ||
10 | PORT = 12005 | ||
11 | DEFAULTSERVICES = transport | ||
12 | UNIXPATH = /tmp/gnunet-p1-service-arm.sock | ||
13 | |||
14 | [statistics] | ||
15 | PORT = 12004 | ||
16 | UNIXPATH = /tmp/gnunet-p1-service-statistics.sock | ||
17 | |||
18 | [resolver] | ||
19 | PORT = 12003 | ||
20 | UNIXPATH = /tmp/gnunet-p1-service-resolver.sock | ||
21 | |||
22 | [peerinfo] | ||
23 | PORT = 12002 | ||
24 | UNIXPATH = /tmp/gnunet-p1-service-peerinfo.sock | ||
25 | |||
26 | [transport] | ||
27 | PORT = 12001 | ||
28 | UNIXPATH = /tmp/gnunet-p1-service-transport.sock | ||
29 | PLUGINS = tcp | ||
30 | MANIPULATE_DELAY_IN = 100 | ||
31 | MANIPULATE_DELAY_OUT = 100 \ No newline at end of file | ||
diff --git a/src/transport/test_transport_api_manipulation_cfg_peer2.conf b/src/transport/test_transport_api_manipulation_cfg_peer2.conf new file mode 100644 index 000000000..6545e80e2 --- /dev/null +++ b/src/transport/test_transport_api_manipulation_cfg_peer2.conf | |||
@@ -0,0 +1,31 @@ | |||
1 | @INLINE@ template_cfg_peer2.conf | ||
2 | [PATHS] | ||
3 | SERVICEHOME = /tmp/test-transport/api-tcp-p2/ | ||
4 | |||
5 | [transport-tcp] | ||
6 | PORT = 12015 | ||
7 | TIMEOUT = 5 s | ||
8 | |||
9 | [arm] | ||
10 | PORT = 12014 | ||
11 | DEFAULTSERVICES = transport | ||
12 | UNIXPATH = /tmp/gnunet-p2-service-arm.sock | ||
13 | |||
14 | [statistics] | ||
15 | PORT = 12013 | ||
16 | UNIXPATH = /tmp/gnunet-p2-service-statistics.sock | ||
17 | |||
18 | [resolver] | ||
19 | PORT = 12012 | ||
20 | UNIXPATH = /tmp/gnunet-p2-service-resolver.sock | ||
21 | |||
22 | [peerinfo] | ||
23 | PORT = 12011 | ||
24 | UNIXPATH = /tmp/gnunet-p2-service-peerinfo.sock | ||
25 | |||
26 | [transport] | ||
27 | PORT = 12010 | ||
28 | PLUGINS = tcp | ||
29 | UNIXPATH = /tmp/gnunet-p2-service-transport.sock | ||
30 | MANIPULATE_DELAY_IN = 100 | ||
31 | MANIPULATE_DELAY_OUT = 100 | ||