gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r16639 - gnunet/src/mesh
Date: Tue, 30 Aug 2011 14:57:50 +0200

Author: grothoff
Date: 2011-08-30 14:57:50 +0200 (Tue, 30 Aug 2011)
New Revision: 16639

Modified:
   gnunet/src/mesh/mesh_api_new.c
Log:
include message overheads in size request, handle change in message size at 
queue head

Modified: gnunet/src/mesh/mesh_api_new.c
===================================================================
--- gnunet/src/mesh/mesh_api_new.c      2011-08-30 12:47:41 UTC (rev 16638)
+++ gnunet/src/mesh/mesh_api_new.c      2011-08-30 12:57:50 UTC (rev 16639)
@@ -512,103 +512,93 @@
 {
   struct GNUNET_MESH_Handle *h = cls;
   struct GNUNET_MESH_TransmitHandle *q;
+  char *cbuf = buf;
+  size_t ret;
+  size_t psize;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "mesh: Send packet() Buffer %u\n", 
size);
   h->th = NULL;
-  if (0 == size || NULL == buf)
+  if ( (0 == size) || (NULL == buf) )
   {
     // FIXME: disconnect, reconnect, retry?
     // do_reconnect ();
     return 0;
   }
-  q = h->queue_head;
-  GNUNET_assert (NULL != q);
-  if (sizeof (struct GNUNET_MessageHeader) > size)
-  {
-    GNUNET_break (0);
-    GNUNET_assert (sizeof (struct GNUNET_MessageHeader) > ntohs 
(q->data->size));
-    h->th =
-        GNUNET_CLIENT_notify_transmit_ready (h->client, q->size,
-                                             GNUNET_TIME_UNIT_FOREVER_REL,
-                                             GNUNET_YES, &send_raw, h);
-    return 0;
-  }
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "mesh:   type: %i\n",
-              ntohs (q->data->type));
-  if (NULL == q->data)
+  ret = 0;
+  while ( (NULL != (q = h->queue_head)) &&
+         (size >= q->size) )
     {
-      GNUNET_assert (NULL != q->notify);
-      if (q->target == 0)
+      GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, 
+                      "mesh-api",
+                      "type: %u\n",
+                      ntohs (q->data->type));
+      if (NULL == q->data)
        {
-         /* multicast */
-         struct GNUNET_MESH_Multicast mc; 
-         char *cbuf;
-
-         GNUNET_assert (size >= sizeof (mc) + q->size);
-         cbuf = buf;
-         q->size = q->notify (q->notify_cls,
-                              size - sizeof (mc), 
-                              &cbuf[sizeof(mc)]);
-         if (q->size == 0)
+         GNUNET_assert (NULL != q->notify);
+         if (q->target == 0)
            {
-             size = 0;       
+             /* multicast */
+             struct GNUNET_MESH_Multicast mc; 
+             
+             GNUNET_assert (size >= sizeof (mc) + q->size);
+             psize = q->notify (q->notify_cls,
+                                size - sizeof (mc), 
+                                &cbuf[sizeof(mc)]);
+             if (psize > 0)
+               {
+                 mc.header.size = htons (sizeof (mc) + q->size);
+                 mc.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_MULTICAST);
+                 mc.tid = htonl (q->tunnel->tid);
+                 memset (&mc.oid, 0, sizeof (struct GNUNET_PeerIdentity)); /* 
myself */
+                 memcpy (cbuf, &mc, sizeof (mc));
+                 psize = q->size + sizeof (mc);
+               }
            }
          else
            {
-             mc.header.size = htons (sizeof (mc) + q->size);
-             mc.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_MULTICAST);
-             mc.tid = htonl (q->tunnel->tid);
-             memset (&mc.oid, 0, sizeof (struct GNUNET_PeerIdentity)); /* 
myself */
-             memcpy (buf, &mc, sizeof (mc));
-             size = q->size + sizeof (mc);
+             /* unicast */
+             struct GNUNET_MESH_Unicast uc; 
+             
+             GNUNET_assert (size >= sizeof (uc) + q->size);
+             psize = q->notify (q->notify_cls,
+                                size - sizeof (uc), 
+                                &cbuf[sizeof(uc)]);
+             if (psize > 0)
+               {
+                 uc.header.size = htons (sizeof (uc) + q->size);
+                 uc.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_UNICAST);
+                 uc.tid = htonl (q->tunnel->tid);
+                 memset (&uc.oid, 0, sizeof (struct GNUNET_PeerIdentity)); /* 
myself */
+                 GNUNET_PEER_resolve (q->target, &uc.destination);
+                 memcpy (cbuf, &uc, sizeof (uc));
+                 psize = q->size + sizeof (uc);
+               }         
            }
        }
       else
        {
-         /* unicast */
-         struct GNUNET_MESH_Unicast uc; 
-         char *cbuf;
-
-         GNUNET_assert (size >= sizeof (uc) + q->size);
-         cbuf = buf;
-         q->size = q->notify (q->notify_cls,
-                              size - sizeof (uc), 
-                              &cbuf[sizeof(uc)]);
-         if (q->size == 0)
-           {
-             size = 0;       
-           }
-         else
-           {
-             uc.header.size = htons (sizeof (uc) + q->size);
-             uc.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_UNICAST);
-             uc.tid = htonl (q->tunnel->tid);
-             memset (&uc.oid, 0, sizeof (struct GNUNET_PeerIdentity)); /* 
myself */
-             GNUNET_PEER_resolve (q->target, &uc.destination);
-             memcpy (buf, &uc, sizeof (uc));
-             size = q->size + sizeof (uc);
-           }     
+         memcpy (cbuf, q->data, q->size);
+         psize = q->size;
        }
+      if (q->timeout_task != GNUNET_SCHEDULER_NO_TASK)
+       GNUNET_SCHEDULER_cancel (q->timeout_task);
+      GNUNET_CONTAINER_DLL_remove (h->queue_head, h->queue_tail, q);
+      GNUNET_free (q);
+      cbuf += psize;
+      size -= psize;
+      ret += psize;
     }
-  else
-    {
-      memcpy (buf, q->data, q->size);
-      size = q->size;
-    }
-  if (q->timeout_task != GNUNET_SCHEDULER_NO_TASK)
-    GNUNET_SCHEDULER_cancel (q->timeout_task);
-  GNUNET_CONTAINER_DLL_remove (h->queue_head, h->queue_tail, q);
-  GNUNET_free (q);
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "mesh:   size: %u\n", size);
 
-  if (NULL != h->queue_head)
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "mesh:   size: %u\n", ret);
+
+  if (NULL != (q = h->queue_head))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "mesh:   next size: %u\n",
-                h->queue_head->size);
+                q->size);
     h->th =
-        GNUNET_CLIENT_notify_transmit_ready (h->client, h->queue_head->size,
-                                             GNUNET_TIME_UNIT_FOREVER_REL,
-                                             GNUNET_YES, &send_raw, h);
+      GNUNET_CLIENT_notify_transmit_ready (h->client, q->size,
+                                          GNUNET_TIME_UNIT_FOREVER_REL,
+                                          GNUNET_YES, &send_raw, h);
   }
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "mesh: Send packet() END\n");
   if (GNUNET_NO == h->in_receive)
@@ -617,7 +607,7 @@
       GNUNET_CLIENT_receive (h->client, &msg_received, h,
                             GNUNET_TIME_UNIT_FOREVER_REL);
     }
-  return size;
+  return ret;
 }
 
 
@@ -1011,6 +1001,7 @@
                                    void *notify_cls)
 {
   struct GNUNET_MESH_TransmitHandle *q;
+  size_t overhead;
 
   if (get_queue_length (tunnel->mesh) >= tunnel->mesh->max_queue_size)
     return NULL; /* queue full */
@@ -1020,7 +1011,8 @@
   q->priority = priority;
   q->timeout = GNUNET_TIME_relative_to_absolute (maxdelay);
   q->target = GNUNET_PEER_intern (target);
-  q->size = notify_size;
+  overhead = (NULL == target) ? sizeof (struct GNUNET_MESH_Multicast) : sizeof 
(struct GNUNET_MESH_Unicast);
+  q->size = notify_size + overhead;
   q->notify = notify;
   q->notify_cls = notify_cls;
   queue_transmit_handle (tunnel->mesh, q);
@@ -1039,8 +1031,8 @@
   struct GNUNET_MESH_Handle *mesh;
   
   mesh = th->tunnel->mesh;
-  if (q->timeout_task != GNUNET_SCHEDULER_NO_TASK)
-    GNUNET_SCHEDULER_cancel (q->timeout_task);
+  if (th->timeout_task != GNUNET_SCHEDULER_NO_TASK)
+    GNUNET_SCHEDULER_cancel (th->timeout_task);
   GNUNET_CONTAINER_DLL_remove (mesh->queue_head, 
                               mesh->queue_tail,
                                th);




reply via email to

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