/*
This file is part of GNUnet
- (C) 2002--2014 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2002--2014 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.
*/
/**
/**
* Session of this request.
*/
- struct Session *session;
+ struct GNUNET_ATS_Session *session;
/**
* Number of bytes to transmit.
/**
* Session handle for connections.
*/
-struct Session
+struct GNUNET_ATS_Session
{
/**
* Pointer to the global plugin struct.
*/
static void
notify_session_monitor (struct Plugin *plugin,
- struct Session *session,
+ struct GNUNET_ATS_Session *session,
enum GNUNET_TRANSPORT_SessionState state)
{
struct GNUNET_TRANSPORT_SessionInfo info;
* @param session session where the distance changed
*/
static void
-notify_distance_change (struct Session *session)
+notify_distance_change (struct GNUNET_ATS_Session *session)
{
struct Plugin *plugin = session->plugin;
- struct GNUNET_ATS_Information ats;
if (GNUNET_YES != session->active)
return;
- ats.type = htonl ((uint32_t) GNUNET_ATS_QUALITY_NET_DISTANCE);
- ats.value = htonl (session->distance);
- plugin->env->update_address_metrics (plugin->env->cls,
- session->address, session, &ats, 1);
+ plugin->env->update_address_distance (plugin->env->cls,
+ session->address,
+ session->distance);
}
* Function called by MST on each message from the box.
*
* @param cls closure with the `struct Plugin *`
- * @param client identification of the client (with the 'struct Session')
+ * @param client identification of the client (with the 'struct GNUNET_ATS_Session')
* @param message the actual message
* @return #GNUNET_OK on success
*/
const struct GNUNET_MessageHeader *message)
{
struct Plugin *plugin = cls;
- struct Session *session = client;
- struct GNUNET_ATS_Information ats;
+ struct GNUNET_ATS_Session *session = client;
- ats.type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE);
- ats.value = htonl (session->distance);
session->active = GNUNET_YES;
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Delivering message of type %u with %u bytes from peer `%s'\n",
ntohs (message->type),
ntohs (message->size),
GNUNET_i2s (&session->sender));
-
- plugin->env->receive (plugin->env->cls, session->address, session,
+ plugin->env->receive (plugin->env->cls,
+ session->address,
+ session,
message);
- plugin->env->update_address_metrics (plugin->env->cls,
- session->address, session, &ats, 1);
+ plugin->env->update_address_distance (plugin->env->cls,
+ session->address,
+ session->distance);
return GNUNET_OK;
}
const struct GNUNET_MessageHeader *msg)
{
struct Plugin *plugin = cls;
- struct GNUNET_ATS_Information ats;
- struct Session *session;
+ struct GNUNET_ATS_Session *session;
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Received DV_MESSAGE_RECEIVED message for peer `%s': new distance %u\n",
- GNUNET_i2s (sender), distance);
+ GNUNET_i2s (sender),
+ distance);
session = GNUNET_CONTAINER_multipeermap_get (plugin->sessions,
sender);
if (NULL == session)
GNUNET_NO);
return;
}
- ats.type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE);
- ats.value = htonl (distance);
session->active = GNUNET_YES;
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Delivering message of type %u with %u bytes from peer `%s'\n",
ntohs (msg->type),
ntohs (msg->size),
GNUNET_i2s (sender));
- plugin->env->receive (plugin->env->cls, session->address, session, msg);
- plugin->env->update_address_metrics (plugin->env->cls,
- session->address, session, &ats, 1);
+ plugin->env->receive (plugin->env->cls,
+ session->address,
+ session,
+ msg);
+ plugin->env->update_address_distance (plugin->env->cls,
+ session->address,
+ session->distance);
}
enum GNUNET_ATS_Network_Type network)
{
struct Plugin *plugin = cls;
- struct Session *session;
- struct GNUNET_ATS_Information ats[2];
+ struct GNUNET_ATS_Session *session;
GNUNET_break (GNUNET_ATS_NET_UNSPECIFIED != network);
/**
* If you remove it, also remove libgnunetats linkage from Makefile.am
*/
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Received `%s' message for peer `%s' with next hop in network %s\n",
- "DV_CONNECT",
+ "Received DV_CONNECT message for peer `%s' with next hop in network %s\n",
GNUNET_i2s (peer),
GNUNET_ATS_print_network_type (network));
return; /* nothing to do */
}
- session = GNUNET_new (struct Session);
+ session = GNUNET_new (struct GNUNET_ATS_Session);
session->address = GNUNET_HELLO_address_allocate (peer, "dv",
- NULL, 0, GNUNET_HELLO_ADDRESS_INFO_NONE);
+ NULL, 0,
+ GNUNET_HELLO_ADDRESS_INFO_NONE);
session->sender = *peer;
session->plugin = plugin;
session->distance = distance;
GNUNET_i2s (peer),
distance);
- /* Notify transport and ats about new connection */
- ats[0].type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE);
- ats[0].value = htonl (distance);
- ats[1].type = htonl (GNUNET_ATS_NETWORK_TYPE);
- ats[1].value = htonl ((uint32_t) network);
session->active = GNUNET_YES;
- plugin->env->session_start (plugin->env->cls, session->address,
- session, ats, 2);
+ plugin->env->session_start (plugin->env->cls,
+ session->address,
+ session,
+ network);
+ plugin->env->update_address_distance (plugin->env->cls,
+ session->address,
+ session->distance);
+
notify_session_monitor (session->plugin,
session,
GNUNET_TRANSPORT_SS_UP);
enum GNUNET_ATS_Network_Type network)
{
struct Plugin *plugin = cls;
- struct Session *session;
+ struct GNUNET_ATS_Session *session;
GNUNET_break (GNUNET_ATS_NET_UNSPECIFIED != network);
LOG (GNUNET_ERROR_TYPE_DEBUG,
* @param session session to clean up
*/
static void
-free_session (struct Session *session)
+free_session (struct GNUNET_ATS_Session *session)
{
struct Plugin *plugin = session->plugin;
struct PendingRequest *pr;
{
notify_session_monitor (session->plugin,
session,
- GNUNET_TRANSPORT_SS_DOWN);
+ GNUNET_TRANSPORT_SS_DONE);
plugin->env->session_end (plugin->env->cls,
session->address,
session);
const struct GNUNET_PeerIdentity *peer)
{
struct Plugin *plugin = cls;
- struct Session *session;
+ struct GNUNET_ATS_Session *session;
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Received `%s' message for peer `%s'\n",
int ok)
{
struct PendingRequest *pr = cls;
- struct Session *session = pr->session;
+ struct GNUNET_ATS_Session *session = pr->session;
pr->th = NULL;
GNUNET_CONTAINER_DLL_remove (session->pr_head,
*/
static ssize_t
dv_plugin_send (void *cls,
- struct Session *session,
+ struct GNUNET_ATS_Session *session,
const char *msgbuf,
size_t msgbuf_size,
unsigned int priority,
const struct GNUNET_PeerIdentity *target)
{
struct Plugin *plugin = cls;
- struct Session *session;
+ struct GNUNET_ATS_Session *session;
struct PendingRequest *pr;
session = GNUNET_CONTAINER_multipeermap_get (plugin->sessions,
*/
static int
dv_plugin_disconnect_session (void *cls,
- struct Session *session)
+ struct GNUNET_ATS_Session *session)
{
struct PendingRequest *pr;
* @param address the address
* @return the session if the address is valid, NULL otherwise
*/
-static struct Session *
+static struct GNUNET_ATS_Session *
dv_get_session (void *cls,
const struct GNUNET_HELLO_Address *address)
{
struct Plugin *plugin = cls;
- struct Session *session;
+ struct GNUNET_ATS_Session *session;
if (0 != address->address_length)
return NULL;
static void
dv_plugin_update_session_timeout (void *cls,
const struct GNUNET_PeerIdentity *peer,
- struct Session *session)
+ struct GNUNET_ATS_Session *session)
{
/* DV currently doesn't time out like "normal" plugins,
so it should be safe to do nothing, right?
*/
static enum GNUNET_ATS_Network_Type
dv_get_network (void *cls,
- struct Session *session)
+ struct GNUNET_ATS_Session *session)
{
GNUNET_assert (NULL != session);
return session->network;
}
+/**
+ * Function obtain the network type for an address.
+ *
+ * @param cls closure (`struct Plugin *`)
+ * @param address the address
+ * @return the network type
+ */
+static enum GNUNET_ATS_Network_Type
+dv_plugin_get_network_for_address (void *cls,
+ const struct GNUNET_HELLO_Address *address)
+{
+ return GNUNET_ATS_NET_WAN; /* FOR NOW */
+}
+
+
/**
* Function that is called to get the keepalive factor.
* #GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT is divided by this number to
*
* @param cls the `struct Plugin` with the monitor callback (`sic`)
* @param peer peer we send information about
- * @param value our `struct Session` to send information about
+ * @param value our `struct GNUNET_ATS_Session` to send information about
* @return #GNUNET_OK (continue to iterate)
*/
static int
void *value)
{
struct Plugin *plugin = cls;
- struct Session *session = value;
+ struct GNUNET_ATS_Session *session = value;
if (GNUNET_YES != session->active)
return GNUNET_OK;
api->query_keepalive_factor = &dv_plugin_query_keepalive_factor;
api->get_session = &dv_get_session;
api->get_network = &dv_get_network;
+ api->get_network_for_address = &dv_plugin_get_network_for_address;
api->update_session_timeout = &dv_plugin_update_session_timeout;
api->setup_monitor = &dv_plugin_setup_monitor;
return api;
const struct GNUNET_PeerIdentity *key,
void *value)
{
- struct Session *session = value;
+ struct GNUNET_ATS_Session *session = value;
free_session (session);
return GNUNET_OK;