aboutsummaryrefslogtreecommitdiff
path: root/src/dv/dv_api.c
diff options
context:
space:
mode:
authorNathan S. Evans <evans@in.tum.de>2010-04-03 14:27:50 +0000
committerNathan S. Evans <evans@in.tum.de>2010-04-03 14:27:50 +0000
commit1687b7a632f45a63fce5bf635a6286a1dad1c1d6 (patch)
tree1e249fda57bb2a912c1ce2656036ad3ce5ca6d97 /src/dv/dv_api.c
parent1d5caebcb5ec2617f92550cf1789037313d5c9e0 (diff)
downloadgnunet-1687b7a632f45a63fce5bf635a6286a1dad1c1d6.tar.gz
gnunet-1687b7a632f45a63fce5bf635a6286a1dad1c1d6.zip
lots of fixes, on its way to actually working...
Diffstat (limited to 'src/dv/dv_api.c')
-rw-r--r--src/dv/dv_api.c50
1 files changed, 33 insertions, 17 deletions
diff --git a/src/dv/dv_api.c b/src/dv/dv_api.c
index 4418f3a0f..60c1ba4e4 100644
--- a/src/dv/dv_api.c
+++ b/src/dv/dv_api.c
@@ -170,8 +170,15 @@ transmit_pending (void *cls, size_t size, void *buf)
170 size_t ret; 170 size_t ret;
171 size_t tsize; 171 size_t tsize;
172 172
173#if DEBUG_DV
174 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "DV API: Transmit pending called with message type %d\n", ntohs(handle->current->msg->header.type));
175#endif
176
173 if (buf == NULL) 177 if (buf == NULL)
174 { 178 {
179#if DEBUG_DV
180 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "DV API: Transmit pending FAILED!\n\n\n");
181#endif
175 finish(handle, GNUNET_SYSERR); 182 finish(handle, GNUNET_SYSERR);
176 return 0; 183 return 0;
177 } 184 }
@@ -185,11 +192,13 @@ transmit_pending (void *cls, size_t size, void *buf)
185 if (size >= tsize) 192 if (size >= tsize)
186 { 193 {
187 memcpy(buf, handle->current->msg, tsize); 194 memcpy(buf, handle->current->msg, tsize);
195#if DEBUG_DV
196 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "DV API: Copied %d bytes into buffer!\n\n\n", tsize);
197#endif
198 finish(handle, GNUNET_OK);
199 return tsize;
188 } 200 }
189 else 201
190 {
191 return ret;
192 }
193 } 202 }
194 203
195 return ret; 204 return ret;
@@ -200,7 +209,6 @@ transmit_pending (void *cls, size_t size, void *buf)
200 */ 209 */
201static void process_pending_message(struct GNUNET_DV_Handle *handle) 210static void process_pending_message(struct GNUNET_DV_Handle *handle)
202{ 211{
203 struct GNUNET_TIME_Relative timeout;
204 212
205 if (handle->current != NULL) 213 if (handle->current != NULL)
206 return; /* action already pending */ 214 return; /* action already pending */
@@ -224,11 +232,10 @@ static void process_pending_message(struct GNUNET_DV_Handle *handle)
224 handle->pending_list = handle->pending_list->next; 232 handle->pending_list = handle->pending_list->next;
225 handle->current->next = NULL; 233 handle->current->next = NULL;
226 234
227 timeout = GNUNET_TIME_absolute_get_remaining (handle->current->timeout);
228 if (NULL == 235 if (NULL ==
229 (handle->th = GNUNET_CLIENT_notify_transmit_ready (handle->client, 236 (handle->th = GNUNET_CLIENT_notify_transmit_ready (handle->client,
230 ntohs(handle->current->msg->msgbuf_size), 237 ntohs(handle->current->msg->msgbuf_size),
231 timeout, 238 handle->current->msg->timeout,
232 GNUNET_YES, 239 GNUNET_YES,
233 &transmit_pending, handle))) 240 &transmit_pending, handle)))
234 { 241 {
@@ -285,6 +292,7 @@ void handle_message_receipt (void *cls,
285 size_t sender_address_len; 292 size_t sender_address_len;
286 char *sender_address; 293 char *sender_address;
287 char *packed_msg; 294 char *packed_msg;
295 char *packed_msg_start;
288 296
289 if (msg == NULL) 297 if (msg == NULL)
290 { 298 {
@@ -299,16 +307,20 @@ void handle_message_receipt (void *cls,
299 received_msg = (struct GNUNET_DV_MessageReceived *)msg; 307 received_msg = (struct GNUNET_DV_MessageReceived *)msg;
300 packed_msg_len = ntohs(received_msg->msg_len); 308 packed_msg_len = ntohs(received_msg->msg_len);
301 sender_address_len = ntohs(received_msg->sender_address_len); 309 sender_address_len = ntohs(received_msg->sender_address_len);
310
311 GNUNET_assert(ntohs(msg->size) == (sizeof(struct GNUNET_DV_MessageReceived) + packed_msg_len + sender_address_len));
302#if DEBUG_DV 312#if DEBUG_DV
303 fprintf(stdout, "dv api receives message from service: total len: %lu, packed len: %lu, sender_address_len: %lu, base message len: %lu\ntotal is %lu, should be %lu\n", ntohs(msg->size), packed_msg_len, sender_address_len, sizeof(struct GNUNET_DV_MessageReceived), sizeof(struct GNUNET_DV_MessageReceived) + packed_msg_len + sender_address_len, ntohs(msg->size)); 313 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "dv api receives message, size checks out!\n");
304#endif 314#endif
305 GNUNET_assert(ntohs(msg->size) == (sizeof(struct GNUNET_DV_MessageReceived) + packed_msg_len + sender_address_len));
306
307 sender_address = GNUNET_malloc(sender_address_len); 315 sender_address = GNUNET_malloc(sender_address_len);
308 memcpy(sender_address, &received_msg[1], sender_address_len); 316 memcpy(sender_address, &received_msg[1], sender_address_len);
317 packed_msg_start = (char *)&received_msg[1];
309 packed_msg = GNUNET_malloc(packed_msg_len); 318 packed_msg = GNUNET_malloc(packed_msg_len);
310 memcpy(packed_msg, &received_msg[1 + sender_address_len], packed_msg_len); 319 memcpy(packed_msg, &packed_msg_start[sender_address_len], packed_msg_len);
311 320
321#if DEBUG_DV
322 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "packed message type: %d or %d\n", ntohs(((struct GNUNET_MessageHeader *)packed_msg)->type), ((struct GNUNET_MessageHeader *)packed_msg)->type);
323#endif
312 handle->receive_handler(handle->receive_cls, 324 handle->receive_handler(handle->receive_cls,
313 &received_msg->sender, 325 &received_msg->sender,
314 packed_msg, 326 packed_msg,
@@ -348,19 +360,23 @@ int GNUNET_DV_send (struct GNUNET_DV_Handle *dv_handle,
348 size_t addrlen) 360 size_t addrlen)
349{ 361{
350 struct GNUNET_DV_SendMessage *msg; 362 struct GNUNET_DV_SendMessage *msg;
351 363 char *end_of_message;
352 msg = GNUNET_malloc(sizeof(struct GNUNET_DV_SendMessage) + msgbuf_size + addrlen); 364 /* FIXME: Copy message to end of thingy, can't just allocate dummy! */
353 msg->header.size = htons(sizeof(struct GNUNET_DV_SendMessage) + msgbuf_size + addrlen); 365#if DEBUG_DV
366 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "DV SEND called with message of size %d, address size %d, total size to send is %d\n", msgbuf_size, addrlen, sizeof(struct GNUNET_DV_SendMessage) + msgbuf_size + addrlen);
367#endif
368 msg = GNUNET_malloc(sizeof(struct GNUNET_DV_SendMessage) + addrlen + msgbuf_size);
369 msg->header.size = htons(sizeof(struct GNUNET_DV_SendMessage) + addrlen + msgbuf_size);
354 msg->header.type = htons(GNUNET_MESSAGE_TYPE_TRANSPORT_DV_SEND); 370 msg->header.type = htons(GNUNET_MESSAGE_TYPE_TRANSPORT_DV_SEND);
355 memcpy(&msg->target, target, sizeof(struct GNUNET_PeerIdentity)); 371 memcpy(&msg->target, target, sizeof(struct GNUNET_PeerIdentity));
356 msg->msgbuf = GNUNET_malloc(msgbuf_size);
357 memcpy(msg->msgbuf, msgbuf, msgbuf_size);
358 msg->msgbuf_size = htons(msgbuf_size); 372 msg->msgbuf_size = htons(msgbuf_size);
359 msg->priority = htonl(priority); 373 msg->priority = htonl(priority);
360 msg->timeout = timeout; 374 msg->timeout = timeout;
361 msg->addrlen = htons(addrlen); 375 msg->addrlen = htons(addrlen);
362 memcpy(&msg[1], addr, addrlen); 376 memcpy(&msg[1], addr, addrlen);
363 377 end_of_message = (char *)&msg[1];
378 end_of_message = &end_of_message[addrlen];
379 memcpy(end_of_message, msgbuf, msgbuf_size);
364 add_pending(dv_handle, msg); 380 add_pending(dv_handle, msg);
365 381
366 return GNUNET_OK; 382 return GNUNET_OK;