diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2013-05-23 14:01:35 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2013-05-23 14:01:35 +0000 |
commit | 2c0bf156d17ea97298943fd28b3f5d4eb99de355 (patch) | |
tree | 6f8e13fb3e1e6a031758dc593c11429dbb16bd06 /src | |
parent | 9c818540f5e5254cc8c34976cfcd87993cd9387b (diff) | |
download | gnunet-2c0bf156d17ea97298943fd28b3f5d4eb99de355.tar.gz gnunet-2c0bf156d17ea97298943fd28b3f5d4eb99de355.zip |
fix for 0002890
Diffstat (limited to 'src')
-rw-r--r-- | src/transport/gnunet-service-transport.c | 1 | ||||
-rw-r--r-- | src/transport/gnunet-service-transport_manipulation.c | 50 | ||||
-rw-r--r-- | src/transport/gnunet-service-transport_manipulation.h | 8 |
3 files changed, 59 insertions, 0 deletions
diff --git a/src/transport/gnunet-service-transport.c b/src/transport/gnunet-service-transport.c index 9d24ff58f..9971e4dca 100644 --- a/src/transport/gnunet-service-transport.c +++ b/src/transport/gnunet-service-transport.c | |||
@@ -548,6 +548,7 @@ neighbours_disconnect_notification (void *cls, | |||
548 | "Peer `%s' disconnected and we are connected to %u peers\n", | 548 | "Peer `%s' disconnected and we are connected to %u peers\n", |
549 | GNUNET_i2s (peer), connections); | 549 | GNUNET_i2s (peer), connections); |
550 | 550 | ||
551 | GST_manipulation_peer_disconnect (peer); | ||
551 | disconnect_msg.header.size = htons (sizeof (struct DisconnectInfoMessage)); | 552 | disconnect_msg.header.size = htons (sizeof (struct DisconnectInfoMessage)); |
552 | disconnect_msg.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_DISCONNECT); | 553 | disconnect_msg.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_DISCONNECT); |
553 | disconnect_msg.reserved = htonl (0); | 554 | disconnect_msg.reserved = htonl (0); |
diff --git a/src/transport/gnunet-service-transport_manipulation.c b/src/transport/gnunet-service-transport_manipulation.c index 786b95bed..eb520ec20 100644 --- a/src/transport/gnunet-service-transport_manipulation.c +++ b/src/transport/gnunet-service-transport_manipulation.c | |||
@@ -628,6 +628,8 @@ free_tmps (void *cls, | |||
628 | { | 628 | { |
629 | next = dqe->next; | 629 | next = dqe->next; |
630 | GNUNET_CONTAINER_DLL_remove (tmp->send_head, tmp->send_tail, dqe); | 630 | GNUNET_CONTAINER_DLL_remove (tmp->send_head, tmp->send_tail, dqe); |
631 | if (NULL != dqe->cont) | ||
632 | dqe->cont (dqe->cont_cls, GNUNET_SYSERR, dqe->msg_size, 0); | ||
631 | GNUNET_free (dqe); | 633 | GNUNET_free (dqe); |
632 | } | 634 | } |
633 | if (GNUNET_SCHEDULER_NO_TASK != tmp->send_delay_task) | 635 | if (GNUNET_SCHEDULER_NO_TASK != tmp->send_delay_task) |
@@ -640,6 +642,52 @@ free_tmps (void *cls, | |||
640 | return GNUNET_OK; | 642 | return GNUNET_OK; |
641 | } | 643 | } |
642 | 644 | ||
645 | /** | ||
646 | * Notify manipulation about disconnect so it can discard queued messages | ||
647 | * | ||
648 | * @param peer the disconnecting peer | ||
649 | */ | ||
650 | void | ||
651 | GST_manipulation_peer_disconnect (const struct GNUNET_PeerIdentity *peer) | ||
652 | { | ||
653 | struct TM_Peer *tmp; | ||
654 | struct DelayQueueEntry *dqe; | ||
655 | struct DelayQueueEntry *next; | ||
656 | |||
657 | if (NULL != (tmp = GNUNET_CONTAINER_multihashmap_get (man_handle.peers, &peer->hashPubKey))) | ||
658 | { | ||
659 | next = tmp->send_head; | ||
660 | while (NULL != (dqe = next)) | ||
661 | { | ||
662 | next = dqe->next; | ||
663 | GNUNET_CONTAINER_DLL_remove (tmp->send_head, tmp->send_tail, dqe); | ||
664 | if (NULL != dqe->cont) | ||
665 | dqe->cont (dqe->cont_cls, GNUNET_SYSERR, dqe->msg_size, 0); | ||
666 | GNUNET_free (dqe); | ||
667 | } | ||
668 | } | ||
669 | else if (UINT32_MAX != find_metric (&man_handle.general, GNUNET_ATS_QUALITY_NET_DELAY, TM_SEND)) | ||
670 | { | ||
671 | next = generic_dqe_head; | ||
672 | while (NULL != (dqe = next)) | ||
673 | { | ||
674 | if (0 == memcmp (&peer, &dqe->id, sizeof (dqe->id))) | ||
675 | { | ||
676 | GNUNET_CONTAINER_DLL_remove (generic_dqe_head, generic_dqe_tail, dqe); | ||
677 | if (NULL != dqe->cont) | ||
678 | dqe->cont (dqe->cont_cls, GNUNET_SYSERR, dqe->msg_size, 0); | ||
679 | GNUNET_free (dqe); | ||
680 | |||
681 | } | ||
682 | } | ||
683 | if (GNUNET_SCHEDULER_NO_TASK != generic_send_delay_task) | ||
684 | { | ||
685 | GNUNET_SCHEDULER_cancel (generic_send_delay_task); | ||
686 | generic_send_delay_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_absolute_get_remaining(generic_dqe_head->sent_at), &send_delayed, generic_dqe_head); | ||
687 | } | ||
688 | } | ||
689 | } | ||
690 | |||
643 | 691 | ||
644 | /** | 692 | /** |
645 | * Stop traffic manipulation | 693 | * Stop traffic manipulation |
@@ -657,6 +705,8 @@ GST_manipulation_stop () | |||
657 | { | 705 | { |
658 | next = cur->next; | 706 | next = cur->next; |
659 | GNUNET_CONTAINER_DLL_remove (generic_dqe_head, generic_dqe_tail, cur); | 707 | GNUNET_CONTAINER_DLL_remove (generic_dqe_head, generic_dqe_tail, cur); |
708 | if (NULL != cur->cont) | ||
709 | cur->cont (cur->cont_cls, GNUNET_SYSERR, cur->msg_size, 0); | ||
660 | GNUNET_free (cur); | 710 | GNUNET_free (cur); |
661 | } | 711 | } |
662 | if (GNUNET_SCHEDULER_NO_TASK != generic_send_delay_task) | 712 | if (GNUNET_SCHEDULER_NO_TASK != generic_send_delay_task) |
diff --git a/src/transport/gnunet-service-transport_manipulation.h b/src/transport/gnunet-service-transport_manipulation.h index d58c11ea3..4fe68ade1 100644 --- a/src/transport/gnunet-service-transport_manipulation.h +++ b/src/transport/gnunet-service-transport_manipulation.h | |||
@@ -103,6 +103,14 @@ GST_manipulation_manipulate_metrics (const struct GNUNET_PeerIdentity *peer, | |||
103 | uint32_t ats_count); | 103 | uint32_t ats_count); |
104 | 104 | ||
105 | /** | 105 | /** |
106 | * Notify manipulation about disconnect so it can discard queued messages | ||
107 | * | ||
108 | * @param peer the disconnecting peer | ||
109 | */ | ||
110 | void | ||
111 | GST_manipulation_peer_disconnect (const struct GNUNET_PeerIdentity *peer); | ||
112 | |||
113 | /** | ||
106 | * Initialize traffic manipulation | 114 | * Initialize traffic manipulation |
107 | * | 115 | * |
108 | * @param GST_cfg configuration handle | 116 | * @param GST_cfg configuration handle |