Avoid trying to disconnect a neighbour twice
[oweals/gnunet.git] / src / transport / plugin_transport_udp.c
index abf3860bca1841c462316352317c66b3546fb066..4db28b45c11f48f9a6d8bb0b7d6ed4fa8e20f0c4 100644 (file)
@@ -1901,7 +1901,7 @@ udp_plugin_send (void *cls,
                               GNUNET_NO);
     GNUNET_STATISTICS_update (plugin->env->stats,
                               "# UDP, unfragmented bytes payload queued total",
-                              udpw->payload_size,
+                              msgbuf_size,
                               GNUNET_NO);
   }
   else
@@ -2005,7 +2005,7 @@ read_process_ack (struct Plugin *plugin,
   }
   if (NULL == s->frag_ctx)
   {
-    LOG (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
+    LOG (GNUNET_ERROR_TYPE_DEBUG | GNUNET_ERROR_TYPE_BULK,
          "Fragmentation context of address %s for ACK (%s) not found\n",
          udp_address_to_string (plugin,
                                 address->address,
@@ -2416,7 +2416,7 @@ udp_plugin_get_session (void *cls,
 {
   struct Plugin *plugin = cls;
   struct Session *s;
-  enum GNUNET_ATS_Network_Type network_type;
+  enum GNUNET_ATS_Network_Type network_type = GNUNET_ATS_NET_UNSPECIFIED;
   const struct IPv4UdpAddress *udp_v4;
   const struct IPv6UdpAddress *udp_v6;
 
@@ -2634,7 +2634,11 @@ ack_proc (void *cls,
   if (GNUNET_NO == rc->have_sender)
   {
     /* tried to defragment but never succeeded, hence will not ACK */
-    GNUNET_break_op (0);
+    /* This can happen if we just lost msgs */
+    GNUNET_STATISTICS_update (plugin->env->stats,
+                              "# UDP, fragments discarded without ACK",
+                              1,
+                              GNUNET_NO);
     return;
   }
   address = GNUNET_HELLO_address_allocate (&rc->sender,
@@ -2665,7 +2669,6 @@ ack_proc (void *cls,
     delay = s->flow_delay_for_other_peer.rel_value_us;
   else
     delay = UINT32_MAX;
-
   LOG (GNUNET_ERROR_TYPE_DEBUG,
        "Sending ACK to `%s' including delay of %s\n",
        udp_address_to_string (plugin,
@@ -2983,13 +2986,12 @@ remove_timeout_messages_and_select (struct Plugin *plugin,
     if (GNUNET_TIME_UNIT_ZERO.rel_value_us == remaining.rel_value_us)
     {
       /* Message timed out */
-      udpw->qc (udpw->qc_cls,
-                udpw,
-                GNUNET_SYSERR);
-      /* Remove message */
       removed = GNUNET_YES;
       dequeue (plugin,
                udpw);
+      udpw->qc (udpw->qc_cls,
+                udpw,
+                GNUNET_SYSERR);
       GNUNET_free (udpw);
 
       if (sock == plugin->sockv4)
@@ -3163,11 +3165,11 @@ udp_select_send (struct Plugin *plugin,
     else
     {
       GNUNET_break (0);
+      dequeue (plugin,
+               udpw);
       udpw->qc (udpw->qc_cls,
                 udpw,
                 GNUNET_SYSERR);
-      dequeue (plugin,
-               udpw);
       notify_session_monitor (plugin,
                               udpw->session,
                               GNUNET_TRANSPORT_SS_UPDATE);
@@ -3179,6 +3181,8 @@ udp_select_send (struct Plugin *plugin,
                                          udpw->msg_size,
                                          a,
                                          slen);
+    dequeue (plugin,
+             udpw);
     if (GNUNET_SYSERR == sent)
     {
       /* Failure */
@@ -3223,8 +3227,6 @@ udp_select_send (struct Plugin *plugin,
                 udpw,
                 GNUNET_OK);
     }
-    dequeue (plugin,
-             udpw);
     notify_session_monitor (plugin,
                             udpw->session,
                             GNUNET_TRANSPORT_SS_UPDATE);
@@ -3253,8 +3255,9 @@ udp_plugin_select_v4 (void *cls,
   plugin->select_task_v4 = NULL;
   if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
     return;
+  if (NULL == plugin->sockv4)
+    return;
   if ((0 != (tc->reason & GNUNET_SCHEDULER_REASON_READ_READY)) &&
-      (NULL != plugin->sockv4) &&
       (GNUNET_NETWORK_fdset_isset (tc->read_ready,
                                    plugin->sockv4)))
     udp_select_read (plugin,
@@ -3282,12 +3285,14 @@ udp_plugin_select_v6 (void *cls,
   plugin->select_task_v6 = NULL;
   if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
     return;
+  if (NULL == plugin->sockv6)
+    return;
   if ( (0 != (tc->reason & GNUNET_SCHEDULER_REASON_READ_READY)) &&
-       (NULL != plugin->sockv6) &&
        (GNUNET_NETWORK_fdset_isset (tc->read_ready,
                                     plugin->sockv6)) )
     udp_select_read (plugin,
                      plugin->sockv6);
+
   udp_select_send (plugin,
                    plugin->sockv6);
   schedule_select_v6 (plugin);