gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r16347 - gnunet/src/mesh


From: gnunet
Subject: [GNUnet-SVN] r16347 - gnunet/src/mesh
Date: Wed, 3 Aug 2011 14:39:02 +0200

Author: bartpolot
Date: 2011-08-03 14:39:02 +0200 (Wed, 03 Aug 2011)
New Revision: 16347

Modified:
   gnunet/src/mesh/gnunet-service-mesh.c
Log:
Added function to send data to specific peer


Modified: gnunet/src/mesh/gnunet-service-mesh.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh.c       2011-08-03 11:42:08 UTC (rev 
16346)
+++ gnunet/src/mesh/gnunet-service-mesh.c       2011-08-03 12:39:02 UTC (rev 
16347)
@@ -718,6 +718,7 @@
     return size_needed;
 }
 
+
 /**
  * FIXME / COMMENT
  * There are several options to send a "data to origin" or similar packet.
@@ -731,15 +732,29 @@
  * 2. Create a helper function to build the packet, then call
  *    core_ntfy_trnsmt_rdy with message as cls.
  *    - # memcpy: 2 (in helper function data->msg and in callback cls->buf)
- * 3- Define new container, pass container with pointers
+ * 3. Define new container, pass container with pointers
  *    - # memcpy = 1 (in callback, cls->buf)
  *    - Noise: extra containers defined per type of message
+ * 4. Define a generic container with all possible fields, pass container
+ *    - # memcpy = 1 (in callback, cls->buf)
+ *    - Slight memory waste in malloc'ing the container with extra fields
  */
-struct info_for_data_to_origin
+struct MeshDataDescriptor
 {
+    /** ID of the tunnel this packet travels in */
     struct MESH_TunnelID        *origin;
+    
+    /** Ultimate destination of the packet */
+    GNUNET_PEER_Id              destination;
+    
+    /** Pointer to the data to transmit */
     void                        *data;
+    
+    /** Size of the data */
     size_t                      size;
+    
+    /** Client that asked for the transmission */
+    struct GNUNET_SERVER_Client *client;
 };
 
 /**
@@ -748,7 +763,7 @@
  * NULL and "size" zero if the socket was closed for
  * writing in the meantime.
  *
- * @param cls closure (info_for_data_to_origin with all info to build packet)
+ * @param cls closure (MeshDataDescriptor with all info to build packet)
  * @param size number of bytes available in buf
  * @param buf where the callee should write the message
  * @return number of bytes written to buf
@@ -756,7 +771,7 @@
 static size_t
 send_core_data_to_origin (void *cls, size_t size, void *buf)
 {
-    struct info_for_data_to_origin              *info = cls;
+    struct MeshDataDescriptor                   *info = cls;
     struct GNUNET_MESH_DataMessageToOrigin      *msg = buf;
     size_t                                      total_size;
 
@@ -776,10 +791,14 @@
     if (0 != info->size && NULL != info->data) {
         memcpy(&msg[1], info->data, info->size);
     }
+    if (NULL != info->client) {
+        GNUNET_SERVER_receive_done(info->client, GNUNET_OK);
+    }
     GNUNET_free(info);
     return total_size;
 }
 
+
 /**
  * Function called to notify a client about the socket
  * being ready to queue more data.  "buf" will be
@@ -792,25 +811,37 @@
  * @return number of bytes written to buf
  */
 static size_t
-send_core_data_raw (void *cls, size_t size, void *buf)
+send_core_data_to_peer (void *cls, size_t size, void *buf)
 {
-    struct GNUNET_MessageHeader *msg = cls;
-    size_t                      total_size;
+    struct MeshDataDescriptor                   *info = cls;
+    struct GNUNET_MESH_DataMessageFromOrigin    *msg = buf;
+    size_t                                      total_size;
 
-    GNUNET_assert(NULL != msg);
-    total_size = ntohs(msg->size);
+    GNUNET_assert(NULL != info);
+    total_size = sizeof(struct GNUNET_MESH_DataMessageFromOrigin) + info->size;
+    GNUNET_assert(total_size < 65536); /* UNIT16_MAX */
 
     if (total_size > size) {
         GNUNET_log(GNUNET_ERROR_TYPE_WARNING,
-                   "not enough buffer to send data futher\n");
+                   "not enough buffer to send data to peer\n");
         return 0;
     }
-    memcpy(buf, msg, total_size);
+    msg->header.size = htons(total_size);
+    msg->header.type = htons(GNUNET_MESSAGE_TYPE_DATA_MESSAGE_FROM_ORIGIN);
+    GNUNET_PEER_resolve(info->origin->oid, &msg->oid);
+    GNUNET_PEER_resolve(info->destination, &msg->destination);
+    msg->tid = htonl(info->origin->tid);
+    if (0 != info->size && NULL != info->data) {
+        memcpy(&msg[1], info->data, info->size);
+    }
+    if (NULL != info->client) {
+        GNUNET_SERVER_receive_done(info->client, GNUNET_OK);
+    }
+    GNUNET_free(info);
     return total_size;
 }
 
 
-#if LATER
 /**
  * Function called to notify a client about the socket
  * being ready to queue more data.  "buf" will be
@@ -823,24 +854,25 @@
  * @return number of bytes written to buf
  */
 static size_t
-send_core_data_multicast (void *cls, size_t size, void *buf)
+send_core_data_raw (void *cls, size_t size, void *buf)
 {
-    struct GNUNET_MESH_DataMessageFromOrigin    *msg = cls;
-    size_t                                      total_size;
+    struct GNUNET_MessageHeader *msg = cls;
+    size_t                      total_size;
 
     GNUNET_assert(NULL != msg);
-    total_size = ntohs(msg->header.size);
+    total_size = ntohs(msg->size);
 
     if (total_size > size) {
         GNUNET_log(GNUNET_ERROR_TYPE_WARNING,
                    "not enough buffer to send data futher\n");
         return 0;
     }
-    memcpy(msg, buf, total_size);
+    memcpy(buf, msg, total_size);
     return total_size;
 }
 
 
+#if LATER
 /**
  * Function called to notify a client about the socket
  * being ready to queue more data.  "buf" will be
@@ -853,30 +885,20 @@
  * @return number of bytes written to buf
  */
 static size_t
-send_core_data_to_peer (void *cls, size_t size, void *buf)
+send_core_data_multicast (void *cls, size_t size, void *buf)
 {
-    struct info_for_data_to_origin              *info = cls;
-    struct GNUNET_MESH_DataMessageToOrigin      *msg = buf;
+    struct GNUNET_MESH_DataMessageFromOrigin    *msg = cls;
     size_t                                      total_size;
 
-    GNUNET_assert(NULL != info);
-    total_size = sizeof(struct GNUNET_MESH_DataMessageToOrigin) + info->size;
-    /* FIXME better constant? short >= 16 bits, not == 16 bits... */
-    GNUNET_assert(total_size < USHRT_MAX);
+    GNUNET_assert(NULL != msg);
+    total_size = ntohs(msg->header.size);
 
     if (total_size > size) {
         GNUNET_log(GNUNET_ERROR_TYPE_WARNING,
-                   "not enough buffer to send data to origin\n");
+                   "not enough buffer to send data futher\n");
         return 0;
     }
-    msg->header.size = htons(total_size);
-    msg->header.type = htons(GNUNET_MESSAGE_TYPE_DATA_MESSAGE_TO_ORIGIN);
-    GNUNET_PEER_resolve(info->origin->oid, &msg->oid);
-    msg->tid = htonl(info->origin->tid);
-    if (0 != info->size && NULL != info->data) {
-        memcpy(&msg[1], info->data, info->size);
-    }
-    GNUNET_free(info);
+    memcpy(msg, buf, total_size);
     return total_size;
 }
 
@@ -1095,16 +1117,17 @@
         add_path_to_origin(orig_peer_info, path);           /* inverts path!  
*/
         GNUNET_PEER_resolve(get_first_hop(path), &id); /* path is inverted :) 
*/
         /* FIXME / COMMENT 
-         * is it allowed/desired to declare variables this way?
+         * is it ok to declare variables this way?
          * (style, best practices, etc)
          * This variable is short lived and completely irrelevant for the rest
          * of the function
          */
-        struct info_for_data_to_origin *info =
-            GNUNET_malloc(sizeof(struct info_for_data_to_origin));
+        struct MeshDataDescriptor *info =
+            GNUNET_malloc(sizeof(struct MeshDataDescriptor     ));
         info->origin = &t->id;
         info->data = NULL;
         info->size = 0;
+        info->client = NULL;
         GNUNET_CORE_notify_transmit_ready(core_handle,
                                 0,
                                 0,
@@ -1944,6 +1967,7 @@
     struct MeshPeerInfo                         *pi;
     struct GNUNET_MESH_Data                     *data_msg;
     struct GNUNET_PeerIdentity                  next_hop;
+    struct MeshDataDescriptor                   *info;
     MESH_TunnelNumber                           tid;
 
     /* Sanity check for client registration */
@@ -1954,7 +1978,7 @@
     }
     data_msg = (struct GNUNET_MESH_Data *)message;
     /* Sanity check for message size */
-    if (sizeof(struct GNUNET_MESH_PeerControl) !=
+    if (sizeof(struct GNUNET_MESH_Data) >
             ntohs(data_msg->header.size))
     {
         GNUNET_break(0);
@@ -1990,6 +2014,12 @@
         return;
     }
     GNUNET_PEER_resolve(get_first_hop(pi->path), &next_hop);
+    info = GNUNET_malloc(sizeof(struct MeshDataDescriptor));
+    info->data = &data_msg[1];
+    info->destination = pi->id;
+    info->origin = &t->id;
+    info->size = ntohs(data_msg->header.size) - sizeof(struct 
GNUNET_MESH_Data);
+    info->client = client;
     GNUNET_CORE_notify_transmit_ready(core_handle,
                             0,
                             0,
@@ -1998,10 +2028,8 @@
                             /* FIXME re-check types */
                             message->size - sizeof(struct GNUNET_MESH_Data)
                             + sizeof(struct GNUNET_MESH_DataMessageFromOrigin),
-                            &send_core_data_to_origin, /* FIXME re-check */
-                            NULL);
-
-    GNUNET_SERVER_receive_done(client, GNUNET_OK); /* FIXME not yet */
+                            &send_core_data_to_peer,
+                            info);
     return;
 }
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]