aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2013-05-23 14:01:35 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2013-05-23 14:01:35 +0000
commit2c0bf156d17ea97298943fd28b3f5d4eb99de355 (patch)
tree6f8e13fb3e1e6a031758dc593c11429dbb16bd06 /src
parent9c818540f5e5254cc8c34976cfcd87993cd9387b (diff)
downloadgnunet-2c0bf156d17ea97298943fd28b3f5d4eb99de355.tar.gz
gnunet-2c0bf156d17ea97298943fd28b3f5d4eb99de355.zip
fix for 0002890
Diffstat (limited to 'src')
-rw-r--r--src/transport/gnunet-service-transport.c1
-rw-r--r--src/transport/gnunet-service-transport_manipulation.c50
-rw-r--r--src/transport/gnunet-service-transport_manipulation.h8
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 */
650void
651GST_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 */
110void
111GST_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