/*
This file is part of GNUnet.
- (C) 2010-2015 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2010-2016 GNUnet e.V.
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
You should have received a copy of the GNU General Public License
along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
*/
/**
* @file ats/ats_api_connectivity.c
#include "ats.h"
+#define LOG(kind,...) GNUNET_log_from(kind, "ats-connectivity-api", __VA_ARGS__)
+
+
/**
* Handle for ATS address suggestion requests.
*/
* Connecitivity handle this suggestion handle belongs to.
*/
struct GNUNET_ATS_ConnectivityHandle *ch;
+
+ /**
+ * How urgent is the request.
+ */
+ uint32_t strength;
};
*/
struct GNUNET_CONTAINER_MultiPeerMap *sug_requests;
- /**
- * Connection to ATS service.
- */
- struct GNUNET_CLIENT_Connection *client;
-
/**
* Message queue for sending requests to the ATS service.
*/
*/
struct GNUNET_SCHEDULER_Task *task;
+ /**
+ * Reconnect backoff delay.
+ */
+ struct GNUNET_TIME_Relative backoff;
};
* Re-establish the connection to the ATS service.
*
* @param cls handle to use to re-connect.
- * @param tc scheduler context
*/
static void
-reconnect_task (void *cls,
- const struct GNUNET_SCHEDULER_TaskContext *tc)
+reconnect_task (void *cls)
{
struct GNUNET_ATS_ConnectivityHandle *ch = cls;
GNUNET_MQ_destroy (ch->mq);
ch->mq = NULL;
}
- if (NULL != ch->client)
- {
- GNUNET_CLIENT_disconnect (ch->client);
- ch->client = NULL;
- }
- ch->task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
+ ch->backoff = GNUNET_TIME_STD_BACKOFF (ch->backoff);
+ ch->task = GNUNET_SCHEDULER_add_delayed (ch->backoff,
&reconnect_task,
ch);
}
{
struct GNUNET_ATS_ConnectivityHandle *ch = cls;
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "ATS connection died (code %d), reconnecting\n",
- (int) error);
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "ATS connection died (code %d), reconnecting\n",
+ (int) error);
force_reconnect (ch);
}
void *value)
{
struct GNUNET_ATS_ConnectivityHandle *ch = cls;
+ struct GNUNET_ATS_ConnectivitySuggestHandle *sh = value;
struct GNUNET_MQ_Envelope *ev;
struct RequestAddressMessage *m;
if (NULL == ch->mq)
return GNUNET_SYSERR;
ev = GNUNET_MQ_msg (m, GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS);
- m->reserved = htonl (0);
+ m->strength = htonl (sh->strength);
m->peer = *peer;
GNUNET_MQ_send (ch->mq, ev);
return GNUNET_OK;
struct GNUNET_MQ_Envelope *ev;
struct ClientStartMessage *init;
- GNUNET_assert (NULL == ch->client);
- ch->client = GNUNET_CLIENT_connect ("ats", ch->cfg);
- if (NULL == ch->client)
+ GNUNET_assert (NULL == ch->mq);
+ ch->mq = GNUNET_CLIENT_connecT (ch->cfg,
+ "ats",
+ handlers,
+ &error_handler,
+ ch);
+ if (NULL == ch->mq)
{
force_reconnect (ch);
return;
}
- ch->mq = GNUNET_MQ_queue_for_connection_client (ch->client,
- handlers,
- &error_handler,
- ch);
ev = GNUNET_MQ_msg (init,
GNUNET_MESSAGE_TYPE_ATS_START);
init->start_flag = htonl (START_FLAG_CONNECTION_SUGGESTION);
/**
- * Function called to free all `struct GNUNET_ATS_SuggestHandles`
+ * Function called to free all `struct GNUNET_ATS_ConnectivitySuggestHandle`s
* in the map.
*
* @param cls NULL
GNUNET_MQ_destroy (ch->mq);
ch->mq = NULL;
}
- if (NULL != ch->client)
- {
- GNUNET_CLIENT_disconnect (ch->client);
- ch->client = NULL;
- }
if (NULL != ch->task)
{
GNUNET_SCHEDULER_cancel (ch->task);
*
* @param ch handle
* @param peer identity of the peer we need an address for
+ * @param strength how urgent is the need for such a suggestion
* @return suggest handle, NULL if a request is already pending
*/
struct GNUNET_ATS_ConnectivitySuggestHandle *
GNUNET_ATS_connectivity_suggest (struct GNUNET_ATS_ConnectivityHandle *ch,
- const struct GNUNET_PeerIdentity *peer)
+ const struct GNUNET_PeerIdentity *peer,
+ uint32_t strength)
{
struct GNUNET_ATS_ConnectivitySuggestHandle *s;
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Requesting ATS to suggest address for `%s'\n",
+ GNUNET_i2s (peer));
s = GNUNET_new (struct GNUNET_ATS_ConnectivitySuggestHandle);
s->ch = ch;
s->id = *peer;
+ s->strength = strength;
if (GNUNET_OK !=
GNUNET_CONTAINER_multipeermap_put (ch->sug_requests,
&s->id,
struct GNUNET_MQ_Envelope *ev;
struct RequestAddressMessage *m;
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Telling ATS we no longer care for an address for `%s'\n",
+ GNUNET_i2s (&sh->id));
GNUNET_assert (GNUNET_OK ==
GNUNET_CONTAINER_multipeermap_remove (ch->sug_requests,
&sh->id,
return;
}
ev = GNUNET_MQ_msg (m, GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS_CANCEL);
- m->reserved = htonl (0);
+ m->strength = htonl (0);
m->peer = sh->id;
GNUNET_MQ_send (ch->mq, ev);
GNUNET_free (sh);