+ memcpy (buf, hdr, msize);
+ GNUNET_CONTAINER_DLL_remove (h->control_pending_head,
+ h->control_pending_tail, cm);
+ if (cm->th != NULL)
+ cm->th->cm = NULL;
+ if (NULL != cm->cont)
+ cm->cont (cm->cont_cls, GNUNET_OK);
+ GNUNET_free (cm);
+ trigger_next_request (h, GNUNET_NO);
+ return msize;
+ }
+ /* now check for 'ready' P2P messages */
+ if (NULL != (pr = h->ready_peer_head))
+ {
+ GNUNET_assert (pr->pending_head != NULL);
+ th = pr->pending_head;
+ if (size < th->msize + sizeof (struct SendMessage))
+ {
+ trigger_next_request (h, GNUNET_NO);
+ return 0;
+ }
+ GNUNET_CONTAINER_DLL_remove (h->ready_peer_head, h->ready_peer_tail, pr);
+ GNUNET_CONTAINER_DLL_remove (pr->pending_head, pr->pending_tail, th);
+ pr->queue_size--;
+ if (pr->timeout_task != GNUNET_SCHEDULER_NO_TASK)
+ {
+ GNUNET_SCHEDULER_cancel (pr->timeout_task);
+ pr->timeout_task = GNUNET_SCHEDULER_NO_TASK;
+ }
+#if DEBUG_CORE
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Transmitting SEND request to `%s' with %u bytes.\n",
+ GNUNET_i2s (&pr->peer), (unsigned int) th->msize);
+#endif
+ sm = (struct SendMessage *) buf;
+ sm->header.type = htons (GNUNET_MESSAGE_TYPE_CORE_SEND);
+ sm->priority = htonl (th->priority);
+ sm->deadline = GNUNET_TIME_absolute_hton (th->timeout);
+ sm->peer = pr->peer;
+ sm->cork = htonl ((uint32_t) th->cork);
+ sm->reserved = htonl (0);
+ ret =
+ th->get_message (th->get_message_cls,
+ size - sizeof (struct SendMessage), &sm[1]);
+
+#if DEBUG_CORE
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Transmitting SEND request to `%s' yielded %u bytes.\n",
+ GNUNET_i2s (&pr->peer), ret);
+#endif
+ GNUNET_free (th);
+ if (0 == ret)
+ {
+#if DEBUG_CORE
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Size of clients message to peer %s is 0!\n",
+ GNUNET_i2s (&pr->peer));
+#endif
+ /* client decided to send nothing! */
+ request_next_transmission (pr);
+ return 0;
+ }
+#if DEBUG_CORE
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Produced SEND message to core with %u bytes payload\n",
+ (unsigned int) ret);
+#endif
+ GNUNET_assert (ret >= sizeof (struct GNUNET_MessageHeader));
+ if (ret + sizeof (struct SendMessage) >= GNUNET_SERVER_MAX_MESSAGE_SIZE)
+ {
+ GNUNET_break (0);
+ request_next_transmission (pr);
+ return 0;
+ }
+ ret += sizeof (struct SendMessage);
+ sm->header.size = htons (ret);
+ GNUNET_assert (ret <= size);
+ request_next_transmission (pr);
+ return ret;
+ }
+ return 0;