gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r17867 - gnunet/src/ats


From: gnunet
Subject: [GNUnet-SVN] r17867 - gnunet/src/ats
Date: Sun, 30 Oct 2011 20:41:10 +0100

Author: grothoff
Date: 2011-10-30 20:41:10 +0100 (Sun, 30 Oct 2011)
New Revision: 17867

Modified:
   gnunet/src/ats/ats_api_scheduling.c
Log:
reconnect on protocol errors instead of crashing -- see #1863

Modified: gnunet/src/ats/ats_api_scheduling.c
===================================================================
--- gnunet/src/ats/ats_api_scheduling.c 2011-10-30 19:35:19 UTC (rev 17866)
+++ gnunet/src/ats/ats_api_scheduling.c 2011-10-30 19:41:10 UTC (rev 17867)
@@ -138,6 +138,10 @@
    */
   unsigned int session_array_size;
 
+  /**
+   * Should we reconnect to ATS due to some serious error?
+   */
+  int reconnect;
 };
 
 
@@ -150,7 +154,6 @@
 reconnect (struct GNUNET_ATS_SchedulingHandle *sh);
 
 
-
 /**
  * Re-establish the connection to the ATS service.
  *
@@ -169,6 +172,22 @@
 
 
 /**
+ * Disconnect from ATS and then reconnect.
+ *
+ * @param sh our handle
+ */
+static void
+force_reconnect (struct GNUNET_ATS_SchedulingHandle *sh)
+{
+  sh->reconnect = GNUNET_NO;
+  GNUNET_CLIENT_disconnect (sh->client, GNUNET_NO);
+  sh->client = NULL;
+  sh->task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
+                                          &reconnect_task, sh);
+}
+
+
+/**
  * Transmit messages from the message queue to the service
  * (if there are any, and if we are not already trying).
  *
@@ -211,10 +230,7 @@
   sh->th = NULL;
   if ( (size == 0) || (buf == NULL))
   {
-    GNUNET_CLIENT_disconnect (sh->client, GNUNET_NO);
-    sh->client = NULL;
-    sh->task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
-                                             &reconnect_task, sh);
+    force_reconnect (sh);
     return 0;
   }
   ret = 0;
@@ -284,9 +300,14 @@
   }
   if (session_id == 0)
     return NULL;
-  GNUNET_assert (0 == memcmp (peer,
-                             &sh->session_array[session_id].peer,
-                             sizeof (struct GNUNET_PeerIdentity)));
+  if (0 != memcmp (peer,
+                  &sh->session_array[session_id].peer,
+                  sizeof (struct GNUNET_PeerIdentity)))
+  {
+    GNUNET_break (0);
+    sh->reconnect = GNUNET_YES;
+    return NULL;
+  }
   return sh->session_array[session_id].session;
 }
 
@@ -376,10 +397,20 @@
                 uint32_t session_id,
                 const struct GNUNET_PeerIdentity *peer)
 {
-  GNUNET_assert (session_id < sh->session_array_size);
-  GNUNET_assert (0 == memcmp (peer,
-                             &sh->session_array[session_id].peer,
-                             sizeof (struct GNUNET_PeerIdentity)));
+  if (session_id >= sh->session_array_size)
+  {
+    GNUNET_break (0);
+    sh->reconnect = GNUNET_YES;
+    return;
+  }
+  if (0 != memcmp (peer,
+                  &sh->session_array[session_id].peer,
+                  sizeof (struct GNUNET_PeerIdentity)))
+  {
+    GNUNET_break (0);
+    sh->reconnect = GNUNET_YES;
+    return;
+  }
   sh->session_array[session_id].slot_used = GNUNET_NO;
   memset (&sh->session_array[session_id].peer,
          0, 
@@ -419,10 +450,7 @@
 
   if (NULL == msg) 
   {
-    GNUNET_CLIENT_disconnect (sh->client, GNUNET_NO);
-    sh->client = NULL;
-    sh->task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
-                                            &reconnect_task, sh);
+    force_reconnect (sh);
     return;
   }
   if ( (ntohs (msg->type) == GNUNET_MESSAGE_TYPE_ATS_SESSION_RELEASE) &&
@@ -433,16 +461,15 @@
     GNUNET_CLIENT_receive (sh->client,
                           &process_ats_message, sh,
                           GNUNET_TIME_UNIT_FOREVER_REL);
+    if (GNUNET_YES == sh->reconnect)
+      force_reconnect (sh);
     return;
   }
   if ( (ntohs (msg->type) != GNUNET_MESSAGE_TYPE_ATS_ADDRESS_SUGGESTION) ||
        (ntohs (msg->size) <= sizeof (struct AddressSuggestionMessage)) )
   {
     GNUNET_break (0);
-    GNUNET_CLIENT_disconnect (sh->client, GNUNET_NO);
-    sh->client = NULL;
-    sh->task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
-                                            &reconnect_task, sh);
+    force_reconnect (sh);
     return;
   }
   m = (const struct AddressSuggestionMessage*) msg;
@@ -460,10 +487,7 @@
        (plugin_name[plugin_name_length - 1] != '\0') )
   {
     GNUNET_break (0);
-    GNUNET_CLIENT_disconnect (sh->client, GNUNET_NO);
-    sh->client = NULL;
-    sh->task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
-                                            &reconnect_task, sh);
+    force_reconnect (sh);
     return;
   }
   sh->suggest_cb (sh->suggest_cb_cls,
@@ -478,6 +502,8 @@
   GNUNET_CLIENT_receive (sh->client,
                         &process_ats_message, sh,
                         GNUNET_TIME_UNIT_FOREVER_REL);
+  if (GNUNET_YES == sh->reconnect)
+    force_reconnect (sh);
 }
 
 




reply via email to

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