*/
unsigned int session_array_size;
+ /**
+ * Should we reconnect to ATS due to some serious error?
+ */
+ int reconnect;
};
reconnect (struct GNUNET_ATS_SchedulingHandle *sh);
-
/**
* Re-establish the connection to the ATS service.
*
}
+/**
+ * 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).
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;
}
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;
}
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,
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) &&
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;
(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,
GNUNET_CLIENT_receive (sh->client,
&process_ats_message, sh,
GNUNET_TIME_UNIT_FOREVER_REL);
+ if (GNUNET_YES == sh->reconnect)
+ force_reconnect (sh);
}