gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r27271 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r27271 - gnunet/src/transport
Date: Thu, 23 May 2013 16:01:36 +0200

Author: wachs
Date: 2013-05-23 16:01:35 +0200 (Thu, 23 May 2013)
New Revision: 27271

Modified:
   gnunet/src/transport/gnunet-service-transport.c
   gnunet/src/transport/gnunet-service-transport_manipulation.c
   gnunet/src/transport/gnunet-service-transport_manipulation.h
Log:
fix for 0002890


Modified: gnunet/src/transport/gnunet-service-transport.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport.c     2013-05-23 14:01:21 UTC 
(rev 27270)
+++ gnunet/src/transport/gnunet-service-transport.c     2013-05-23 14:01:35 UTC 
(rev 27271)
@@ -548,6 +548,7 @@
               "Peer `%s' disconnected and we are connected to %u peers\n",
               GNUNET_i2s (peer), connections);
 
+  GST_manipulation_peer_disconnect (peer);
   disconnect_msg.header.size = htons (sizeof (struct DisconnectInfoMessage));
   disconnect_msg.header.type = htons 
(GNUNET_MESSAGE_TYPE_TRANSPORT_DISCONNECT);
   disconnect_msg.reserved = htonl (0);

Modified: gnunet/src/transport/gnunet-service-transport_manipulation.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport_manipulation.c        
2013-05-23 14:01:21 UTC (rev 27270)
+++ gnunet/src/transport/gnunet-service-transport_manipulation.c        
2013-05-23 14:01:35 UTC (rev 27271)
@@ -628,6 +628,8 @@
                        {
                                        next = dqe->next;
                                        GNUNET_CONTAINER_DLL_remove 
(tmp->send_head, tmp->send_tail, dqe);
+                                       if (NULL != dqe->cont)
+                                                       dqe->cont 
(dqe->cont_cls, GNUNET_SYSERR, dqe->msg_size, 0);
                                        GNUNET_free (dqe);
                        }
                        if (GNUNET_SCHEDULER_NO_TASK != tmp->send_delay_task)
@@ -640,7 +642,53 @@
        return GNUNET_OK;
 }
 
+/**
+ * Notify manipulation about disconnect so it can discard queued messages
+ *
+ * @param peer the disconnecting peer
+ */
+void
+GST_manipulation_peer_disconnect (const struct GNUNET_PeerIdentity *peer)
+{
+       struct TM_Peer *tmp;
+       struct DelayQueueEntry *dqe;
+       struct DelayQueueEntry *next;
 
+       if (NULL != (tmp = GNUNET_CONTAINER_multihashmap_get (man_handle.peers, 
&peer->hashPubKey)))
+       {
+                       next = tmp->send_head;
+                       while (NULL != (dqe = next))
+                       {
+                                       next = dqe->next;
+                                       GNUNET_CONTAINER_DLL_remove 
(tmp->send_head, tmp->send_tail, dqe);
+                                       if (NULL != dqe->cont)
+                                                       dqe->cont 
(dqe->cont_cls, GNUNET_SYSERR, dqe->msg_size, 0);
+                                       GNUNET_free (dqe);
+                       }
+       }
+       else if (UINT32_MAX != find_metric (&man_handle.general, 
GNUNET_ATS_QUALITY_NET_DELAY, TM_SEND))
+       {
+                       next = generic_dqe_head;
+                       while (NULL != (dqe = next))
+                       {
+                                       if (0 == memcmp (&peer, &dqe->id, 
sizeof (dqe->id)))
+                                       {
+                                                       
GNUNET_CONTAINER_DLL_remove (generic_dqe_head, generic_dqe_tail, dqe);
+                                                       if (NULL != dqe->cont)
+                                                               dqe->cont 
(dqe->cont_cls, GNUNET_SYSERR, dqe->msg_size, 0);
+                                                       GNUNET_free (dqe);
+
+                                       }
+                       }
+                       if (GNUNET_SCHEDULER_NO_TASK != generic_send_delay_task)
+                       {
+                                       GNUNET_SCHEDULER_cancel 
(generic_send_delay_task);
+                                       generic_send_delay_task = 
GNUNET_SCHEDULER_add_delayed 
(GNUNET_TIME_absolute_get_remaining(generic_dqe_head->sent_at), &send_delayed, 
generic_dqe_head);
+                       }
+       }
+}
+
+
 /**
  * Stop traffic manipulation
  */
@@ -657,6 +705,8 @@
        {
                        next = cur->next;
                        GNUNET_CONTAINER_DLL_remove (generic_dqe_head, 
generic_dqe_tail, cur);
+                       if (NULL != cur->cont)
+                               cur->cont (cur->cont_cls, GNUNET_SYSERR, 
cur->msg_size, 0);
                        GNUNET_free (cur);
        }
        if (GNUNET_SCHEDULER_NO_TASK != generic_send_delay_task)

Modified: gnunet/src/transport/gnunet-service-transport_manipulation.h
===================================================================
--- gnunet/src/transport/gnunet-service-transport_manipulation.h        
2013-05-23 14:01:21 UTC (rev 27270)
+++ gnunet/src/transport/gnunet-service-transport_manipulation.h        
2013-05-23 14:01:35 UTC (rev 27271)
@@ -103,6 +103,14 @@
                uint32_t ats_count);
 
 /**
+ * Notify manipulation about disconnect so it can discard queued messages
+ *
+ * @param peer the disconnecting peer
+ */
+void
+GST_manipulation_peer_disconnect (const struct GNUNET_PeerIdentity *peer);
+
+/**
  * Initialize traffic manipulation
  *
  * @param GST_cfg configuration handle




reply via email to

[Prev in Thread] Current Thread [Next in Thread]