- add callback when we give a message to CORE
authorBart Polot <bart@net.in.tum.de>
Wed, 9 Oct 2013 17:26:57 +0000 (17:26 +0000)
committerBart Polot <bart@net.in.tum.de>
Wed, 9 Oct 2013 17:26:57 +0000 (17:26 +0000)
src/mesh/gnunet-service-mesh_connection.c
src/mesh/gnunet-service-mesh_peer.c
src/mesh/gnunet-service-mesh_peer.h

index 20f122dedfee2801fa72562de51b8ace10c5edb7..1320c783715dda7f0c8d1179f0780749ad3d3653 100644 (file)
 #include "mesh_path.h"
 
 
+#define LOG(level, ...) GNUNET_log_from (level,"mesh-con",__VA_ARGS__)
+
 #define MESH_MAX_POLL_TIME      GNUNET_TIME_relative_multiply (\
                                   GNUNET_TIME_UNIT_MINUTES,\
                                   10)
-#define LOG(level, ...) GNUNET_log_from (level,"mesh-con",__VA_ARGS__)
+#define AVG_MSGS                32
 
 
 /******************************************************************************/
 /********************************   STRUCTS  **********************************/
 /******************************************************************************/
 
-/**
- * Struct containing info about a queued transmission to this peer
- */
-struct MeshPeerQueue
-{
-    /**
-      * DLL next
-      */
-  struct MeshPeerQueue *next;
-
-    /**
-      * DLL previous
-      */
-  struct MeshPeerQueue *prev;
-
-    /**
-     * Peer this transmission is directed to.
-     */
-  struct MeshPeer *peer;
-
-    /**
-     * Connection this message belongs to.
-     */
-  struct MeshConnection *c;
-
-    /**
-     * Is FWD in c?
-     */
-  int fwd;
-
-    /**
-     * Channel this message belongs to, if known.
-     */
-  struct MeshChannel *ch;
-
-    /**
-     * Pointer to info stucture used as cls.
-     */
-  void *cls;
-
-    /**
-     * Type of message
-     */
-  uint16_t type;
-
-    /**
-     * Size of the message
-     */
-  size_t size;
-};
-
-
 /**
  * Struct to encapsulate all the Flow Control information to a peer to which
  * we are directly connected (on a core level).
@@ -156,6 +106,13 @@ struct MeshFlowControl
   struct GNUNET_TIME_Relative poll_time;
 };
 
+struct MeshConnectionPerformance
+{
+  double secsperbyte[AVG_MSGS];
+
+  unsigned int idx;
+};
+
 
 /**
  * Struct containing all information regarding a connection to a peer.
@@ -177,6 +134,11 @@ struct MeshConnection
    */
   struct MeshFlowControl bck_fc;
 
+  /**
+   * Measure connection performance on the endpoint.
+   */
+  struct MeshConnectionPerformance *perf;
+
   /**
    * ID of the connection.
    */
index 2c3967d8a6f670e84f456ddc350f4fb95607cc5f..d700f3aa210e86db453d57e29cd201ee20980ae3 100644 (file)
 /********************************   STRUCTS  **********************************/
 /******************************************************************************/
 
+/**
+ * Struct containing info about a queued transmission to this peer
+ */
+struct MeshPeerQueue
+{
+    /**
+      * DLL next
+      */
+  struct MeshPeerQueue *next;
+
+    /**
+      * DLL previous
+      */
+  struct MeshPeerQueue *prev;
+
+    /**
+     * Peer this transmission is directed to.
+     */
+  struct MeshPeer *peer;
+
+    /**
+     * Connection this message belongs to.
+     */
+  struct MeshConnection *c;
+
+    /**
+     * Is FWD in c?
+     */
+  int fwd;
+
+    /**
+     * Channel this message belongs to, if known.
+     */
+  struct MeshChannel *ch;
+
+    /**
+     * Pointer to info stucture used as cls.
+     */
+  void *cls;
+
+    /**
+     * Type of message
+     */
+  uint16_t type;
+
+    /**
+     * Size of the message
+     */
+  size_t size;
+
+    /**
+     * Set when this message starts waiting for CORE.
+     */
+  struct GNUNET_TIME_Absolute start_waiting;
+
+    /**
+     * Function to call on sending.
+     */
+  GMP_sent callback;
+
+    /**
+     * Closure for callback.
+     */
+  void *callback_cls;
+};
+
 /**
  * Struct containing all information regarding a given peer
  */
@@ -822,7 +888,7 @@ path_add_to_peers (struct MeshPeerPath *p, int confirmed)
   {
     struct MeshPeer *aux;
     struct MeshPeerPath *copy;
-    
+
     aux = peer_get_short (p->peers[i]);
     copy = path_duplicate (p);
     copy->length = i + 1;
@@ -977,7 +1043,7 @@ queue_send (void *cls, size_t size, void *buf)
   }
 
   if (0 < drop_percent &&
-      GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK, 101) < drop_percent)
+      GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 101) < drop_percent)
   {
     LOG (GNUNET_ERROR_TYPE_WARNING,
                 "Dropping message of type %s\n",
@@ -985,9 +1051,17 @@ queue_send (void *cls, size_t size, void *buf)
     data_size = 0;
   }
 
+  if (NULL != queue->callback)
+  {
+    LOG (GNUNET_ERROR_TYPE_DEBUG, "*   Calling callback\n");
+    queue->callback (queue->callback_cls,
+                    queue->c,
+                    GNUNET_TIME_absolute_get_duration (queue->start_waiting));
+  }
+
   /* Free queue, but cls was freed by send_core_* */
   ch = queue->ch;
-  queue_destroy (queue, GNUNET_NO);
+  GMP_queue_destroy (queue, GNUNET_NO);
 
   /* Send ACK if needed, after accounting for sent ID in fc->queue_n */
   switch (type)
@@ -1018,6 +1092,7 @@ queue_send (void *cls, size_t size, void *buf)
                                             queue->size,
                                             &queue_send,
                                             peer);
+      queue->start_waiting = GNUNET_TIME_absolute_get ();
     }
     else
     {
@@ -1193,12 +1268,15 @@ GMP_queue_destroy (struct MeshPeerQueue *queue, int clear_cls)
  * @param c Connection this message belongs to (cannot be NULL).
  * @param ch Channel this message belongs to, if applicable (otherwise NULL).
  * @param fwd Is this a message going root->dest? (FWD ACK are NOT FWD!)
+ * @param callback Function to be called once CORE has taken the message.
+ * @param callback_cls Closure for @c callback.
  */
 void
-GMP_queue_add (void *cls, uint16_t type, size_t size, 
+GMP_queue_add (void *cls, uint16_t type, size_t size,
                struct MeshConnection *c,
                struct MeshChannel *ch,
-               int fwd)
+               int fwd,
+               GMP_sent callback, void *callback_cls)
 {
   struct MeshPeerQueue *queue;
   struct MeshFlowControl *fc;
@@ -1274,6 +1352,8 @@ GMP_queue_add (void *cls, uint16_t type, size_t size,
   queue->c = c;
   queue->ch = ch;
   queue->fwd = fwd;
+  queue->callback = callback;
+  queue->callback_cls = callback_cls;
   if (100 <= priority)
   {
     struct MeshPeerQueue *copy;
@@ -1285,7 +1365,7 @@ GMP_queue_add (void *cls, uint16_t type, size_t size,
       if (copy->type == type && copy->c == c && copy->fwd == fwd)
       {
         /* Example: also a FWD ACK for connection XYZ */
-        queue_destroy (copy, GNUNET_YES);
+        GMP_queue_destroy (copy, GNUNET_YES);
       }
     }
     GNUNET_CONTAINER_DLL_insert (peer->queue_head, peer->queue_tail, queue);
@@ -1312,6 +1392,7 @@ GMP_queue_add (void *cls, uint16_t type, size_t size,
                                            size,
                                            &queue_send,
                                            peer);
+    queue->start_waiting = GNUNET_TIME_absolute_get ();
   }
   else
   {
@@ -1457,8 +1538,9 @@ GMP_connect (struct MeshPeer *peer)
   {
     GMD_search_stop (peer->search_h);
     peer->search_h = NULL;
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-                "  Stopping DHT GET for peer %s\n", peer2s (peer));
+    LOG (GNUNET_ERROR_TYPE_DEBUG, 
+         "  Stopping DHT GET for peer %s\n",
+         GMP_2s (peer));
   }
 
   if (NULL == peer->search_h)
index 065da773166357a3fd35eb906932d305b7579520..8280d16d2d8f961c1891183579dd7a7d262333ad 100644 (file)
@@ -45,6 +45,17 @@ extern "C"
  */
 struct MeshPeer;
 
+/**
+ * Callback called when a queued message is sent.
+ *
+ * @param cls Closure.
+ * @param c Connection this message was on.
+ * @param wait Time spent waiting for core (only the time for THIS message)
+ */
+typedef void (*GMP_sent) (void *cls,
+                          struct MeshConnection *c,
+                          struct GNUNET_TIME_Relative wait);
+
 #include "gnunet-service-mesh_connection.h"
 
 
@@ -76,12 +87,15 @@ GMP_shutdown (void);
  * @param c Connection this message belongs to (cannot be NULL).
  * @param ch Channel this message belongs to, if applicable (otherwise NULL).
  * @param fwd Is this a message going root->dest? (FWD ACK are NOT FWD!)
+ * @param callback Function to be called once CORE has taken the message.
+ * @param callback_cls Closure for @c callback.
  */
 void
 GMP_queue_add (void *cls, uint16_t type, size_t size,
                struct MeshConnection *c,
                struct MeshChannel *ch,
-               int fwd);
+               int fwd,
+               GMP_sent callback, void *callback_cls);
 
 /**
  * Set tunnel.