diff options
author | Nathan S. Evans <evans@in.tum.de> | 2010-04-03 14:27:50 +0000 |
---|---|---|
committer | Nathan S. Evans <evans@in.tum.de> | 2010-04-03 14:27:50 +0000 |
commit | 1687b7a632f45a63fce5bf635a6286a1dad1c1d6 (patch) | |
tree | 1e249fda57bb2a912c1ce2656036ad3ce5ca6d97 /src/dv/dv_api.c | |
parent | 1d5caebcb5ec2617f92550cf1789037313d5c9e0 (diff) | |
download | gnunet-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.c | 50 |
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 | */ |
201 | static void process_pending_message(struct GNUNET_DV_Handle *handle) | 210 | static 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; |