- message format for flow control info
authorBart Polot <bart@net.in.tum.de>
Mon, 23 Jul 2012 17:35:55 +0000 (17:35 +0000)
committerBart Polot <bart@net.in.tum.de>
Mon, 23 Jul 2012 17:35:55 +0000 (17:35 +0000)
src/mesh/gnunet-service-mesh.c
src/mesh/mesh_protocol.h

index 932fb31254163378bccf1ed86872ea76d9c7c1f5..069893f1370dd4d814036501f985397672e45d5a 100644 (file)
@@ -313,16 +313,16 @@ struct MeshTunnel
   int speed_min;
 
     /**
-     * Is buffering allowed in the tunnel?
+     * Is the tunnel bufferless (minimum latency)?
      */
-  int buffering;
+  int nobuffer;
 
-  /**
+    /**
      * Flag to signal the destruction of the tunnel.
      * If this is set GNUNET_YES the tunnel will be destroyed
      * when the queue is empty.
      */
-   int destroy;
+  int destroy;
 
     /**
      * Last time the tunnel was used
@@ -3265,6 +3265,7 @@ send_core_path_create (void *cls, size_t size, void *buf)
   struct MeshTunnel *t = info->t;
   struct MeshPeerPath *p = info->path;
   size_t size_needed;
+  uint32_t opt;
   int i;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "CREATE PATH sending...\n");
@@ -3282,6 +3283,12 @@ send_core_path_create (void *cls, size_t size, void *buf)
   msg->header.type = htons (GNUNET_MESSAGE_TYPE_MESH_PATH_CREATE);
   msg->tid = ntohl (t->id.tid);
 
+  if (GNUNET_YES == t->speed_min)
+    opt = MESH_TUNNEL_OPT_SPEED_MIN;
+  if (GNUNET_YES == t->nobuffer)
+    opt |= MESH_TUNNEL_OPT_NOBUFFER;
+  msg->opt = htonl(opt);
+
   peer_ptr = (struct GNUNET_PeerIdentity *) &msg[1];
   for (i = 0; i < p->length; i++)
   {
@@ -3655,8 +3662,15 @@ handle_mesh_path_create (void *cls, const struct GNUNET_PeerIdentity *peer,
   t = tunnel_get (pi, tid);
   if (NULL == t) // FIXME only for INCOMING tunnels?
   {
+    uint32_t opt;
+
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  Creating tunnel\n");
     t = tunnel_new (GNUNET_PEER_intern (pi), tid, NULL, 0);
+    opt = ntohl (msg->opt);
+    t->speed_min = (0 != (opt & MESH_TUNNEL_OPT_SPEED_MIN)) ?
+                   GNUNET_YES : GNUNET_NO;
+    t->nobuffer = (0 != (opt & MESH_TUNNEL_OPT_NOBUFFER)) ?
+                  GNUNET_YES : GNUNET_NO;;
 
     while (NULL != tunnel_get_incoming (next_local_tid))
       next_local_tid = (next_local_tid + 1) | GNUNET_MESH_LOCAL_TUNNEL_ID_SERV;
@@ -5191,14 +5205,15 @@ handle_local_tunnel_buffer (void *cls, struct GNUNET_SERVER_Client *client,
   switch (ntohs(message->type))
   {
       case GNUNET_MESSAGE_TYPE_MESH_LOCAL_TUNNEL_BUFFER:
-          t->buffering = GNUNET_YES;
+          t->nobuffer = GNUNET_NO;
           break;
       case GNUNET_MESSAGE_TYPE_MESH_LOCAL_TUNNEL_NOBUFFER:
-          t->buffering = GNUNET_NO;
+          t->nobuffer = GNUNET_YES;
           break;
       default:
           GNUNET_break (0);
   }
+
   GNUNET_SERVER_receive_done (client, GNUNET_OK);
 }
 
index 21f64d3eb75069b22ae8c68c9bcfe61b6fb867a0..37f2ffb72dbd72faf33375c2f9d152fc0fdc49d0 100644 (file)
@@ -35,6 +35,10 @@ extern "C"
 #endif
 #endif
 
+#define MESH_TUNNEL_OPT_SPEED_MIN       0x1
+#define MESH_TUNNEL_OPT_NOBUFFER        0x2
+
+
 /******************************************************************************/
 /********************      MESH NETWORK MESSAGES     **************************/
 /******************************************************************************/
@@ -47,7 +51,7 @@ GNUNET_NETWORK_STRUCT_BEGIN
 struct GNUNET_MESH_ManipulatePath
 {
     /**
-     * Type: GNUNET_MESSAGE_TYPE_MESH_PATH_[CREATE|CHANGE|ADD|DEL]
+     * Type: GNUNET_MESSAGE_TYPE_MESH_PATH_[CREATE|CHANGE|ADD|DESTROY]
      *
      * Size: sizeof(struct GNUNET_MESH_ManipulatePath) +
      *       path_length * sizeof (struct GNUNET_PeerIdentity)
@@ -60,6 +64,16 @@ struct GNUNET_MESH_ManipulatePath
      */
   uint32_t tid GNUNET_PACKED;
 
+    /**
+     * Tunnel options (MESH_TUNNEL_OPT_*).
+     */
+  uint32_t opt GNUNET_PACKED;
+
+    /**
+     * 64 bit alignment padding.
+     */
+  uint32_t reserved GNUNET_PACKED;
+
     /**
      * path_length structs defining the *whole* path from the origin [0] to the
      * final destination [path_length-1].
@@ -292,38 +306,6 @@ struct GNUNET_MESH_TunnelDestroy
 };
 
 
-/**
- * Message for mesh flow control
- */
-struct GNUNET_MESH_SpeedNotify
-{
-    /**
-     * Type: GNUNET_MESSAGE_TYPE_DATA_SPEED_NOTIFY
-     */
-  struct GNUNET_MessageHeader header;
-
-    /**
-     * TID of the tunnel
-     */
-  uint32_t tid GNUNET_PACKED;
-
-    /**
-     * OID of the tunnel
-     */
-  struct GNUNET_PeerIdentity oid;
-
-    /**
-     * Is the speed limited by the slowest peer?.
-     */
-  int16_t speed_min;
-
-    /**
-     * Is the buffering allowed?.
-     */
-  int16_t buffering;
-
-};
-
 GNUNET_NETWORK_STRUCT_END
 
 #if 0                           /* keep Emacsens' auto-indent happy */