aboutsummaryrefslogtreecommitdiff
path: root/src/transport/gnunet-service-transport_manipulation.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/transport/gnunet-service-transport_manipulation.c')
-rw-r--r--src/transport/gnunet-service-transport_manipulation.c50
1 files changed, 50 insertions, 0 deletions
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)