[Top][All Lists]
[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);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r17867 - gnunet/src/ats,
gnunet <=