SET building is working now ... but SET itself seems to fail
[oweals/gnunet.git] / src / dv / plugin_transport_dv.c
index 19c577f13fa089c86e1232faa7c0e8ab1b30e22f..2acc3da3fdb1d2288a739ec2e6aad7cba128057e 100644 (file)
  */
 
 #include "platform.h"
+#include "gnunet_util_lib.h"
 #include "gnunet_protocols.h"
-#include "gnunet_connection_lib.h"
-#include "gnunet_server_lib.h"
-#include "gnunet_service_lib.h"
 #include "gnunet_statistics_service.h"
 #include "gnunet_dv_service.h"
 #include "gnunet_transport_service.h"
@@ -38,6 +36,9 @@
 #include "dv.h"
 
 
+#define LOG(kind,...) GNUNET_log_from (kind, "transport-dv",__VA_ARGS__)
+
+
 /**
  * Encapsulation of all of the state of the plugin.
  */
@@ -143,7 +144,7 @@ struct Plugin
   /**
    * Hash map of sessions (active and inactive).
    */
-  struct GNUNET_CONTAINER_MultiHashMap *sessions;
+  struct GNUNET_CONTAINER_MultiPeerMap *sessions;
 
   /**
    * Copy of the handler array where the closures are
@@ -159,7 +160,7 @@ struct Plugin
   /**
    * Tokenizer for boxed messages.
    */
-  struct GNUNET_SERVER_MessageStreamTokenizer *mst; 
+  struct GNUNET_SERVER_MessageStreamTokenizer *mst;
 
 };
 
@@ -172,7 +173,16 @@ struct Plugin
 static void
 notify_distance_change (struct Session *session)
 {
-  GNUNET_break (0); // FIXME: need extended plugin API!
+  struct Plugin *plugin = session->plugin;
+  struct GNUNET_ATS_Information ats;
+
+  ats.type = htonl ((uint32_t) GNUNET_ATS_QUALITY_NET_DISTANCE);
+  ats.value = htonl (session->distance);
+  plugin->env->update_address_metrics (plugin->env->cls,
+                                      &session->sender,
+                                      "", 0,
+                                      session,
+                                      &ats, 1);
 }
 
 
@@ -192,15 +202,16 @@ unbox_cb (void *cls,
   struct Plugin *plugin = cls;
   struct Session *session = client;
   struct GNUNET_ATS_Information ats;
-  
+
   ats.type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE);
   ats.value = htonl (session->distance);
   session->active = GNUNET_YES;
-  plugin->env->receive (plugin->env->cls, 
+  plugin->env->receive (plugin->env->cls,
                        &session->sender,
                         message,
-                        &ats, 1,
                        session, "", 0);
+  plugin->env->update_address_metrics (plugin->env->cls,
+               &session->sender, "", 0, session, &ats, 1);
   return GNUNET_OK;
 }
 
@@ -211,7 +222,7 @@ unbox_cb (void *cls,
  * @param cls closure with the plugin
  * @param sender sender of the message
  * @param distance how far did the message travel
- * @param msg actual message payload 
+ * @param msg actual message payload
  */
 static void
 handle_dv_message_received (void *cls,
@@ -223,9 +234,9 @@ handle_dv_message_received (void *cls,
   struct GNUNET_ATS_Information ats;
   struct Session *session;
 
-  session = GNUNET_CONTAINER_multihashmap_get (plugin->sessions,
-                                              &sender->hashPubKey);
-  if (NULL == session)    
+  session = GNUNET_CONTAINER_multipeermap_get (plugin->sessions,
+                                              sender);
+  if (NULL == session)
   {
     GNUNET_break (0);
     return;
@@ -233,7 +244,7 @@ handle_dv_message_received (void *cls,
   if (GNUNET_MESSAGE_TYPE_DV_BOX == ntohs (msg->type))
   {
     /* need to unbox using MST */
-    GNUNET_SERVER_mst_receive (plugin->mst, 
+    GNUNET_SERVER_mst_receive (plugin->mst,
                               session,
                               (const char *) &msg[1],
                               ntohs (msg->size) - sizeof (struct GNUNET_MessageHeader),
@@ -246,8 +257,9 @@ handle_dv_message_received (void *cls,
   session->active = GNUNET_YES;
   plugin->env->receive (plugin->env->cls, sender,
                         msg,
-                        &ats, 1,
-                       session, "", 0);
+                        session, "", 0);
+  plugin->env->update_address_metrics (plugin->env->cls,
+                                      sender, "", 0, session, &ats, 1);
 }
 
 
@@ -258,7 +270,7 @@ handle_dv_message_received (void *cls,
  * @param peer newly connected peer
  * @param distance distance to the peer
  */
-static void 
+static void
 handle_dv_connect (void *cls,
                   const struct GNUNET_PeerIdentity *peer,
                   uint32_t distance)
@@ -266,22 +278,22 @@ handle_dv_connect (void *cls,
   struct Plugin *plugin = cls;
   struct Session *session;
 
-  session = GNUNET_CONTAINER_multihashmap_get (plugin->sessions,
-                                              &peer->hashPubKey);
-  if (NULL != session)    
+  session = GNUNET_CONTAINER_multipeermap_get (plugin->sessions,
+                                              peer);
+  if (NULL != session)
   {
     GNUNET_break (0);
     session->distance = distance;
     if (GNUNET_YES == session->active)
       notify_distance_change (session);
-    return; /* nothing to do */  
+    return; /* nothing to do */
   }
-  session = GNUNET_malloc (sizeof (struct Session));
+  session = GNUNET_new (struct Session);
   session->sender = *peer;
   session->distance = distance;
   GNUNET_assert (GNUNET_YES ==
-                GNUNET_CONTAINER_multihashmap_put (plugin->sessions,
-                                                   &session->sender.hashPubKey,
+                GNUNET_CONTAINER_multipeermap_put (plugin->sessions,
+                                                   &session->sender,
                                                    session,
                                                    GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
 }
@@ -294,7 +306,7 @@ handle_dv_connect (void *cls,
  * @param peer connected peer
  * @param distance new distance to the peer
  */
-static void 
+static void
 handle_dv_distance_changed (void *cls,
                            const struct GNUNET_PeerIdentity *peer,
                            uint32_t distance)
@@ -302,9 +314,9 @@ handle_dv_distance_changed (void *cls,
   struct Plugin *plugin = cls;
   struct Session *session;
 
-  session = GNUNET_CONTAINER_multihashmap_get (plugin->sessions,
-                                              &peer->hashPubKey);
-  if (NULL == session)    
+  session = GNUNET_CONTAINER_multipeermap_get (plugin->sessions,
+                                              peer);
+  if (NULL == session)
   {
     GNUNET_break (0);
     handle_dv_connect (plugin, peer, distance);
@@ -328,8 +340,8 @@ free_session (struct Session *session)
   struct PendingRequest *pr;
 
   GNUNET_assert (GNUNET_YES ==
-                GNUNET_CONTAINER_multihashmap_remove (plugin->sessions,
-                                                      &session->sender.hashPubKey,
+                GNUNET_CONTAINER_multipeermap_remove (plugin->sessions,
+                                                      &session->sender,
                                                       session));
   if (GNUNET_YES == session->active)
     plugin->env->session_end (plugin->env->cls,
@@ -358,16 +370,16 @@ free_session (struct Session *session)
  * @param cls closure with 'struct Plugin'
  * @param peer peer that disconnected
  */
-static void 
+static void
 handle_dv_disconnect (void *cls,
                      const struct GNUNET_PeerIdentity *peer)
 {
   struct Plugin *plugin = cls;
   struct Session *session;
 
-  session = GNUNET_CONTAINER_multihashmap_get (plugin->sessions,
-                                              &peer->hashPubKey);
-  if (NULL == session)    
+  session = GNUNET_CONTAINER_multipeermap_get (plugin->sessions,
+                                              peer);
+  if (NULL == session)
     return; /* nothing to do */
   free_session (session);
 }
@@ -419,10 +431,10 @@ send_finished (void *cls,
  *         and does NOT mean that the message was not transmitted (DV)
  */
 static ssize_t
-dv_plugin_send (void *cls, 
+dv_plugin_send (void *cls,
                struct Session *session,
                 const char *msgbuf, size_t msgbuf_size, unsigned int priority,
-                struct GNUNET_TIME_Relative timeout, 
+                struct GNUNET_TIME_Relative timeout,
                 GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls)
 {
   struct PendingRequest *pr;
@@ -440,7 +452,7 @@ dv_plugin_send (void *cls,
     memcpy (&box[1], msgbuf, msgbuf_size);
     msg = box;
   }
-  pr = GNUNET_malloc (sizeof (struct PendingRequest));
+  pr = GNUNET_new (struct PendingRequest);
   pr->transmit_cont = cont;
   pr->transmit_cont_cls = cont_cls;
   pr->session = session;
@@ -472,10 +484,10 @@ dv_plugin_disconnect (void *cls, const struct GNUNET_PeerIdentity *target)
   struct Session *session;
   struct PendingRequest *pr;
 
-  session = GNUNET_CONTAINER_multihashmap_get (plugin->sessions,
-                                              &target->hashPubKey);
-  if (NULL == session)    
-    return; /* nothing to do */  
+  session = GNUNET_CONTAINER_multipeermap_get (plugin->sessions,
+                                              target);
+  if (NULL == session)
+    return; /* nothing to do */
   while (NULL != (pr = session->pr_head))
   {
     GNUNET_CONTAINER_DLL_remove (session->pr_head,
@@ -536,7 +548,7 @@ dv_plugin_address_to_string (void *cls, const void *addr, size_t addrlen)
   if (0 != addrlen)
   {
     GNUNET_break (0); /* malformed */
-    return NULL; 
+    return NULL;
   }
   return "dv";
 }
@@ -576,7 +588,7 @@ dv_plugin_check_address (void *cls, const void *addr, size_t addrlen)
  * @param address the address
  * @return the session if the address is valid, NULL otherwise
  */
-static struct Session * 
+static struct Session *
 dv_get_session (void *cls,
                const struct GNUNET_HELLO_Address *address)
 {
@@ -585,8 +597,8 @@ dv_get_session (void *cls,
 
   if (0 != address->address_length)
     return NULL;
-  session = GNUNET_CONTAINER_multihashmap_get (plugin->sessions,
-                                              &address->peer.hashPubKey);
+  session = GNUNET_CONTAINER_multipeermap_get (plugin->sessions,
+                                              &address->peer);
   if (NULL == session)
     return NULL; /* not valid right now */
   session->active = GNUNET_YES;
@@ -606,7 +618,7 @@ dv_get_session (void *cls,
  * @param added length of created address
  * @return GNUNET_OK on success, GNUNET_SYSERR on failure
  */
-static int 
+static int
 dv_plugin_string_to_address (void *cls,
                             const char *addr,
                             uint16_t addrlen,
@@ -623,8 +635,31 @@ dv_plugin_string_to_address (void *cls,
 }
 
 
+
+/**
+ * Function to obtain the network type for a session
+ * FIXME: we should probably look at the network type
+ * used by the next hop here.  Or find some other way
+ * to properly allow ATS-DV resource allocation.
+ *
+ * @param cls closure ('struct Plugin*')
+ * @param session the session
+ * @return the network type
+ */
+static enum GNUNET_ATS_Network_Type
+dv_get_network (void *cls,
+               struct Session *session)
+{
+  GNUNET_assert (NULL != session);
+  return GNUNET_ATS_NET_UNSPECIFIED;
+}
+
+
 /**
  * Entry point for the plugin.
+ *
+ * @param cls closure with the plugin environment
+ * @return plugin API
  */
 void *
 libgnunet_plugin_transport_dv_init (void *cls)
@@ -633,9 +668,9 @@ libgnunet_plugin_transport_dv_init (void *cls)
   struct GNUNET_TRANSPORT_PluginFunctions *api;
   struct Plugin *plugin;
 
-  plugin = GNUNET_malloc (sizeof (struct Plugin));
+  plugin = GNUNET_new (struct Plugin);
   plugin->env = env;
-  plugin->sessions = GNUNET_CONTAINER_multihashmap_create (1024 * 8, GNUNET_YES);
+  plugin->sessions = GNUNET_CONTAINER_multipeermap_create (1024 * 8, GNUNET_YES);
   plugin->mst = GNUNET_SERVER_mst_create (&unbox_cb,
                                          plugin);
   plugin->dvh = GNUNET_DV_service_connect (env->cfg,
@@ -646,12 +681,12 @@ libgnunet_plugin_transport_dv_init (void *cls)
                                           &handle_dv_message_received);
   if (NULL == plugin->dvh)
   {
-    GNUNET_CONTAINER_multihashmap_destroy (plugin->sessions);
-    GNUNET_SERVER_mst_destroy (plugin->mst);    
+    GNUNET_CONTAINER_multipeermap_destroy (plugin->sessions);
+    GNUNET_SERVER_mst_destroy (plugin->mst);
     GNUNET_free (plugin);
     return NULL;
   }
-  api = GNUNET_malloc (sizeof (struct GNUNET_TRANSPORT_PluginFunctions));
+  api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
   api->cls = plugin;
   api->send = &dv_plugin_send;
   api->disconnect = &dv_plugin_disconnect;
@@ -659,7 +694,8 @@ libgnunet_plugin_transport_dv_init (void *cls)
   api->check_address = &dv_plugin_check_address;
   api->address_to_string = &dv_plugin_address_to_string;
   api->string_to_address = &dv_plugin_string_to_address;
-  api->get_session = dv_get_session;
+  api->get_session = &dv_get_session;
+  api->get_network = &dv_get_network;
   return api;
 }
 
@@ -674,7 +710,7 @@ libgnunet_plugin_transport_dv_init (void *cls)
  */
 static int
 free_session_iterator (void *cls,
-                      const struct GNUNET_HashCode *key,
+                      const struct GNUNET_PeerIdentity *key,
                       void *value)
 {
   struct Session *session = value;
@@ -686,6 +722,9 @@ free_session_iterator (void *cls,
 
 /**
  * Exit point from the plugin.
+ *
+ * @param cls plugin API
+ * @return NULL
  */
 void *
 libgnunet_plugin_transport_dv_done (void *cls)
@@ -694,11 +733,11 @@ libgnunet_plugin_transport_dv_done (void *cls)
   struct Plugin *plugin = api->cls;
 
   GNUNET_DV_service_disconnect (plugin->dvh);
-  GNUNET_CONTAINER_multihashmap_iterate (plugin->sessions,
+  GNUNET_CONTAINER_multipeermap_iterate (plugin->sessions,
                                         &free_session_iterator,
                                         NULL);
-  GNUNET_CONTAINER_multihashmap_destroy (plugin->sessions);
-  GNUNET_SERVER_mst_destroy (plugin->mst);    
+  GNUNET_CONTAINER_multipeermap_destroy (plugin->sessions);
+  GNUNET_SERVER_mst_destroy (plugin->mst);
   GNUNET_free (plugin);
   GNUNET_free (api);
   return NULL;