diff options
Diffstat (limited to 'src/core/gnunet-service-core_sessions.c')
-rw-r--r-- | src/core/gnunet-service-core_sessions.c | 242 |
1 files changed, 104 insertions, 138 deletions
diff --git a/src/core/gnunet-service-core_sessions.c b/src/core/gnunet-service-core_sessions.c index a8f7bf6bf..108fd47cf 100644 --- a/src/core/gnunet-service-core_sessions.c +++ b/src/core/gnunet-service-core_sessions.c | |||
@@ -20,7 +20,7 @@ | |||
20 | 20 | ||
21 | /** | 21 | /** |
22 | * @file core/gnunet-service-core_sessions.c | 22 | * @file core/gnunet-service-core_sessions.c |
23 | * @brief code for managing of 'encrypted' sessions (key exchange done) | 23 | * @brief code for managing of 'encrypted' sessions (key exchange done) |
24 | * @author Christian Grothoff | 24 | * @author Christian Grothoff |
25 | */ | 25 | */ |
26 | #include "platform.h" | 26 | #include "platform.h" |
@@ -133,7 +133,7 @@ struct Session | |||
133 | 133 | ||
134 | /** | 134 | /** |
135 | * Is the neighbour queue empty and thus ready for us | 135 | * Is the neighbour queue empty and thus ready for us |
136 | * to transmit an encrypted message? | 136 | * to transmit an encrypted message? |
137 | */ | 137 | */ |
138 | int ready_to_transmit; | 138 | int ready_to_transmit; |
139 | 139 | ||
@@ -162,7 +162,7 @@ find_session (const struct GNUNET_PeerIdentity *peer) | |||
162 | 162 | ||
163 | /** | 163 | /** |
164 | * End the session with the given peer (we are no longer | 164 | * End the session with the given peer (we are no longer |
165 | * connected). | 165 | * connected). |
166 | * | 166 | * |
167 | * @param pid identity of peer to kill session with | 167 | * @param pid identity of peer to kill session with |
168 | */ | 168 | */ |
@@ -176,8 +176,7 @@ GSC_SESSIONS_end (const struct GNUNET_PeerIdentity *pid) | |||
176 | if (NULL == session) | 176 | if (NULL == session) |
177 | return; | 177 | return; |
178 | #if DEBUG_CORE | 178 | #if DEBUG_CORE |
179 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 179 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Destroying session for peer `%4s'\n", |
180 | "Destroying session for peer `%4s'\n", | ||
181 | GNUNET_i2s (&session->peer)); | 180 | GNUNET_i2s (&session->peer)); |
182 | #endif | 181 | #endif |
183 | if (GNUNET_SCHEDULER_NO_TASK != session->cork_task) | 182 | if (GNUNET_SCHEDULER_NO_TASK != session->cork_task) |
@@ -188,22 +187,21 @@ GSC_SESSIONS_end (const struct GNUNET_PeerIdentity *pid) | |||
188 | while (NULL != (car = session->active_client_request_head)) | 187 | while (NULL != (car = session->active_client_request_head)) |
189 | { | 188 | { |
190 | GNUNET_CONTAINER_DLL_remove (session->active_client_request_head, | 189 | GNUNET_CONTAINER_DLL_remove (session->active_client_request_head, |
191 | session->active_client_request_tail, | 190 | session->active_client_request_tail, car); |
192 | car); | ||
193 | GSC_CLIENTS_reject_request (car); | 191 | GSC_CLIENTS_reject_request (car); |
194 | } | 192 | } |
195 | GNUNET_SCHEDULER_cancel (session->typemap_task); | 193 | GNUNET_SCHEDULER_cancel (session->typemap_task); |
196 | GSC_CLIENTS_notify_clients_about_neighbour (&session->peer, | 194 | GSC_CLIENTS_notify_clients_about_neighbour (&session->peer, NULL, |
197 | NULL, 0 /* FIXME: ATSI */, | 195 | 0 /* FIXME: ATSI */ , |
198 | session->tmap, | 196 | session->tmap, NULL); |
199 | NULL); | ||
200 | GNUNET_assert (GNUNET_YES == | 197 | GNUNET_assert (GNUNET_YES == |
201 | GNUNET_CONTAINER_multihashmap_remove (sessions, | 198 | GNUNET_CONTAINER_multihashmap_remove (sessions, |
202 | &session->peer.hashPubKey, session)); | 199 | &session-> |
203 | GNUNET_STATISTICS_set (GSC_stats, | 200 | peer.hashPubKey, |
204 | gettext_noop ("# entries in session map"), | 201 | session)); |
205 | GNUNET_CONTAINER_multihashmap_size (sessions), | 202 | GNUNET_STATISTICS_set (GSC_stats, gettext_noop ("# entries in session map"), |
206 | GNUNET_NO); | 203 | GNUNET_CONTAINER_multihashmap_size (sessions), |
204 | GNUNET_NO); | ||
207 | GSC_TYPEMAP_destroy (session->tmap); | 205 | GSC_TYPEMAP_destroy (session->tmap); |
208 | session->tmap = NULL; | 206 | session->tmap = NULL; |
209 | GNUNET_free (session); | 207 | GNUNET_free (session); |
@@ -216,10 +214,9 @@ GSC_SESSIONS_end (const struct GNUNET_PeerIdentity *pid) | |||
216 | * | 214 | * |
217 | * @param cls the 'struct Session*' | 215 | * @param cls the 'struct Session*' |
218 | * @param tc unused | 216 | * @param tc unused |
219 | */ | 217 | */ |
220 | static void | 218 | static void |
221 | transmit_typemap_task (void *cls, | 219 | transmit_typemap_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) |
222 | const struct GNUNET_SCHEDULER_TaskContext *tc) | ||
223 | { | 220 | { |
224 | struct Session *session = cls; | 221 | struct Session *session = cls; |
225 | struct GNUNET_MessageHeader *hdr; | 222 | struct GNUNET_MessageHeader *hdr; |
@@ -227,19 +224,15 @@ transmit_typemap_task (void *cls, | |||
227 | 224 | ||
228 | delay = TYPEMAP_FREQUENCY; | 225 | delay = TYPEMAP_FREQUENCY; |
229 | /* randomize a bit to avoid spont. sync */ | 226 | /* randomize a bit to avoid spont. sync */ |
230 | delay.rel_value += GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, | 227 | delay.rel_value += |
231 | 1000); | 228 | GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 1000); |
232 | session->typemap_task = GNUNET_SCHEDULER_add_delayed (delay, | 229 | session->typemap_task = |
233 | &transmit_typemap_task, | 230 | GNUNET_SCHEDULER_add_delayed (delay, &transmit_typemap_task, session); |
234 | session); | 231 | GNUNET_STATISTICS_update (GSC_stats, |
235 | GNUNET_STATISTICS_update (GSC_stats, | 232 | gettext_noop ("# type map refreshes sent"), 1, |
236 | gettext_noop ("# type map refreshes sent"), | 233 | GNUNET_NO); |
237 | 1, | ||
238 | GNUNET_NO); | ||
239 | hdr = GSC_TYPEMAP_compute_type_map_message (); | 234 | hdr = GSC_TYPEMAP_compute_type_map_message (); |
240 | GSC_KX_encrypt_and_transmit (session->kxinfo, | 235 | GSC_KX_encrypt_and_transmit (session->kxinfo, hdr, ntohs (hdr->size)); |
241 | hdr, | ||
242 | ntohs (hdr->size)); | ||
243 | GNUNET_free (hdr); | 236 | GNUNET_free (hdr); |
244 | } | 237 | } |
245 | 238 | ||
@@ -252,33 +245,30 @@ transmit_typemap_task (void *cls, | |||
252 | */ | 245 | */ |
253 | void | 246 | void |
254 | GSC_SESSIONS_create (const struct GNUNET_PeerIdentity *peer, | 247 | GSC_SESSIONS_create (const struct GNUNET_PeerIdentity *peer, |
255 | struct GSC_KeyExchangeInfo *kx) | 248 | struct GSC_KeyExchangeInfo *kx) |
256 | { | 249 | { |
257 | struct Session *session; | 250 | struct Session *session; |
258 | 251 | ||
259 | #if DEBUG_CORE | 252 | #if DEBUG_CORE |
260 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 253 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Creating session for peer `%4s'\n", |
261 | "Creating session for peer `%4s'\n", GNUNET_i2s (peer)); | 254 | GNUNET_i2s (peer)); |
262 | #endif | 255 | #endif |
263 | session = GNUNET_malloc (sizeof (struct Session)); | 256 | session = GNUNET_malloc (sizeof (struct Session)); |
264 | session->tmap = GSC_TYPEMAP_create (); | 257 | session->tmap = GSC_TYPEMAP_create (); |
265 | session->peer = *peer; | 258 | session->peer = *peer; |
266 | session->kxinfo = kx; | 259 | session->kxinfo = kx; |
267 | session->time_established = GNUNET_TIME_absolute_get (); | 260 | session->time_established = GNUNET_TIME_absolute_get (); |
268 | session->typemap_task = GNUNET_SCHEDULER_add_now (&transmit_typemap_task, | 261 | session->typemap_task = |
269 | session); | 262 | GNUNET_SCHEDULER_add_now (&transmit_typemap_task, session); |
270 | GNUNET_assert (GNUNET_OK == | 263 | GNUNET_assert (GNUNET_OK == |
271 | GNUNET_CONTAINER_multihashmap_put (sessions, | 264 | GNUNET_CONTAINER_multihashmap_put (sessions, &peer->hashPubKey, |
272 | &peer->hashPubKey, session, | 265 | session, |
273 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); | 266 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); |
274 | GNUNET_STATISTICS_set (GSC_stats, | 267 | GNUNET_STATISTICS_set (GSC_stats, gettext_noop ("# entries in session map"), |
275 | gettext_noop ("# entries in session map"), | 268 | GNUNET_CONTAINER_multihashmap_size (sessions), |
276 | GNUNET_CONTAINER_multihashmap_size (sessions), | 269 | GNUNET_NO); |
277 | GNUNET_NO); | 270 | GSC_CLIENTS_notify_clients_about_neighbour (peer, NULL, 0 /* FIXME: ATSI */ , |
278 | GSC_CLIENTS_notify_clients_about_neighbour (peer, | 271 | NULL, session->tmap); |
279 | NULL, 0 /* FIXME: ATSI */, | ||
280 | NULL, | ||
281 | session->tmap); | ||
282 | } | 272 | } |
283 | 273 | ||
284 | 274 | ||
@@ -286,23 +276,20 @@ GSC_SESSIONS_create (const struct GNUNET_PeerIdentity *peer, | |||
286 | * Notify the given client about the session (client is new). | 276 | * Notify the given client about the session (client is new). |
287 | * | 277 | * |
288 | * @param cls the 'struct GSC_Client' | 278 | * @param cls the 'struct GSC_Client' |
289 | * @param key peer identity | 279 | * @param key peer identity |
290 | * @param value the 'struct Session' | 280 | * @param value the 'struct Session' |
291 | * @return GNUNET_OK (continue to iterate) | 281 | * @return GNUNET_OK (continue to iterate) |
292 | */ | 282 | */ |
293 | static int | 283 | static int |
294 | notify_client_about_session (void *cls, | 284 | notify_client_about_session (void *cls, const GNUNET_HashCode * key, |
295 | const GNUNET_HashCode *key, | 285 | void *value) |
296 | void *value) | ||
297 | { | 286 | { |
298 | struct GSC_Client *client = cls; | 287 | struct GSC_Client *client = cls; |
299 | struct Session *session = value; | 288 | struct Session *session = value; |
300 | 289 | ||
301 | GSC_CLIENTS_notify_client_about_neighbour (client, | 290 | GSC_CLIENTS_notify_client_about_neighbour (client, &session->peer, NULL, 0, /* FIXME: ATS!? */ |
302 | &session->peer, | 291 | NULL, /* old TMAP: none */ |
303 | NULL, 0, /* FIXME: ATS!? */ | 292 | session->tmap); |
304 | NULL, /* old TMAP: none */ | ||
305 | session->tmap); | ||
306 | return GNUNET_OK; | 293 | return GNUNET_OK; |
307 | } | 294 | } |
308 | 295 | ||
@@ -316,8 +303,8 @@ void | |||
316 | GSC_SESSIONS_notify_client_about_sessions (struct GSC_Client *client) | 303 | GSC_SESSIONS_notify_client_about_sessions (struct GSC_Client *client) |
317 | { | 304 | { |
318 | /* notify new client about existing sessions */ | 305 | /* notify new client about existing sessions */ |
319 | GNUNET_CONTAINER_multihashmap_iterate (sessions, | 306 | GNUNET_CONTAINER_multihashmap_iterate (sessions, ¬ify_client_about_session, |
320 | ¬ify_client_about_session, client); | 307 | client); |
321 | } | 308 | } |
322 | 309 | ||
323 | 310 | ||
@@ -373,7 +360,7 @@ GSC_SESSIONS_queue_request (struct GSC_ClientActiveRequest *car) | |||
373 | "Received client transmission request. queueing\n"); | 360 | "Received client transmission request. queueing\n"); |
374 | #endif | 361 | #endif |
375 | GNUNET_CONTAINER_DLL_insert (session->active_client_request_head, | 362 | GNUNET_CONTAINER_DLL_insert (session->active_client_request_head, |
376 | session->active_client_request_tail, car); | 363 | session->active_client_request_tail, car); |
377 | try_transmission (session); | 364 | try_transmission (session); |
378 | } | 365 | } |
379 | 366 | ||
@@ -389,11 +376,11 @@ GSC_SESSIONS_dequeue_request (struct GSC_ClientActiveRequest *car) | |||
389 | { | 376 | { |
390 | struct Session *s; | 377 | struct Session *s; |
391 | 378 | ||
392 | if (0 == memcmp (&car->target, | 379 | if (0 == |
393 | &GSC_my_identity, | 380 | memcmp (&car->target, &GSC_my_identity, |
394 | sizeof (struct GNUNET_PeerIdentity))) | 381 | sizeof (struct GNUNET_PeerIdentity))) |
395 | return; | 382 | return; |
396 | s = find_session (&car->target); | 383 | s = find_session (&car->target); |
397 | GNUNET_assert (NULL != s); | 384 | GNUNET_assert (NULL != s); |
398 | GNUNET_CONTAINER_DLL_remove (s->active_client_request_head, | 385 | GNUNET_CONTAINER_DLL_remove (s->active_client_request_head, |
399 | s->active_client_request_tail, car); | 386 | s->active_client_request_tail, car); |
@@ -411,7 +398,7 @@ discard_expired_requests (struct Session *session) | |||
411 | struct GSC_ClientActiveRequest *pos; | 398 | struct GSC_ClientActiveRequest *pos; |
412 | struct GSC_ClientActiveRequest *nxt; | 399 | struct GSC_ClientActiveRequest *nxt; |
413 | struct GNUNET_TIME_Absolute now; | 400 | struct GNUNET_TIME_Absolute now; |
414 | 401 | ||
415 | now = GNUNET_TIME_absolute_get (); | 402 | now = GNUNET_TIME_absolute_get (); |
416 | pos = NULL; | 403 | pos = NULL; |
417 | nxt = session->active_client_request_head; | 404 | nxt = session->active_client_request_head; |
@@ -419,16 +406,15 @@ discard_expired_requests (struct Session *session) | |||
419 | { | 406 | { |
420 | pos = nxt; | 407 | pos = nxt; |
421 | nxt = pos->next; | 408 | nxt = pos->next; |
422 | if ( (pos->deadline.abs_value < now.abs_value) && | 409 | if ((pos->deadline.abs_value < now.abs_value) && |
423 | (GNUNET_YES != pos->was_solicited) ) | 410 | (GNUNET_YES != pos->was_solicited)) |
424 | { | 411 | { |
425 | GNUNET_STATISTICS_update (GSC_stats, | 412 | GNUNET_STATISTICS_update (GSC_stats, |
426 | gettext_noop | 413 | gettext_noop |
427 | ("# messages discarded (expired prior to transmission)"), | 414 | ("# messages discarded (expired prior to transmission)"), |
428 | 1, GNUNET_NO); | 415 | 1, GNUNET_NO); |
429 | GNUNET_CONTAINER_DLL_remove (session->active_client_request_head, | 416 | GNUNET_CONTAINER_DLL_remove (session->active_client_request_head, |
430 | session->active_client_request_tail, | 417 | session->active_client_request_tail, pos); |
431 | pos); | ||
432 | GSC_CLIENTS_reject_request (pos); | 418 | GSC_CLIENTS_reject_request (pos); |
433 | } | 419 | } |
434 | } | 420 | } |
@@ -446,7 +432,7 @@ solicit_messages (struct Session *session) | |||
446 | struct GSC_ClientActiveRequest *car; | 432 | struct GSC_ClientActiveRequest *car; |
447 | size_t so_size; | 433 | size_t so_size; |
448 | 434 | ||
449 | discard_expired_requests (session); | 435 | discard_expired_requests (session); |
450 | so_size = 0; | 436 | so_size = 0; |
451 | for (car = session->active_client_request_head; NULL != car; car = car->next) | 437 | for (car = session->active_client_request_head; NULL != car; car = car->next) |
452 | { | 438 | { |
@@ -462,15 +448,14 @@ solicit_messages (struct Session *session) | |||
462 | 448 | ||
463 | 449 | ||
464 | /** | 450 | /** |
465 | * Some messages were delayed (corked), but the timeout has now expired. | 451 | * Some messages were delayed (corked), but the timeout has now expired. |
466 | * Send them now. | 452 | * Send them now. |
467 | * | 453 | * |
468 | * @param cls 'struct Session' with the messages to transmit now | 454 | * @param cls 'struct Session' with the messages to transmit now |
469 | * @param tc scheduler context (unused) | 455 | * @param tc scheduler context (unused) |
470 | */ | 456 | */ |
471 | static void | 457 | static void |
472 | pop_cork_task (void *cls, | 458 | pop_cork_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) |
473 | const struct GNUNET_SCHEDULER_TaskContext *tc) | ||
474 | { | 459 | { |
475 | struct Session *session = cls; | 460 | struct Session *session = cls; |
476 | 461 | ||
@@ -499,31 +484,31 @@ try_transmission (struct Session *session) | |||
499 | min_deadline = GNUNET_TIME_UNIT_FOREVER_ABS; | 484 | min_deadline = GNUNET_TIME_UNIT_FOREVER_ABS; |
500 | /* check 'ready' messages */ | 485 | /* check 'ready' messages */ |
501 | pos = session->sme_head; | 486 | pos = session->sme_head; |
502 | while ( (NULL != pos) && | 487 | while ((NULL != pos) && |
503 | (msize + pos->size <= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE) ) | 488 | (msize + pos->size <= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)) |
504 | { | 489 | { |
505 | GNUNET_assert (pos->size < GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE); | 490 | GNUNET_assert (pos->size < GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE); |
506 | msize += pos->size; | 491 | msize += pos->size; |
507 | min_deadline = GNUNET_TIME_absolute_min (min_deadline, | 492 | min_deadline = GNUNET_TIME_absolute_min (min_deadline, pos->deadline); |
508 | pos->deadline); | ||
509 | pos = pos->next; | 493 | pos = pos->next; |
510 | } | 494 | } |
511 | now = GNUNET_TIME_absolute_get (); | 495 | now = GNUNET_TIME_absolute_get (); |
512 | if ( (msize == 0) || | 496 | if ((msize == 0) || |
513 | ( (msize < GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / 2) && | 497 | ((msize < GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / 2) && |
514 | (min_deadline.abs_value > now.abs_value) ) ) | 498 | (min_deadline.abs_value > now.abs_value))) |
515 | { | 499 | { |
516 | /* not enough ready yet, try to solicit more */ | 500 | /* not enough ready yet, try to solicit more */ |
517 | solicit_messages (session); | 501 | solicit_messages (session); |
518 | if (msize > 0) | 502 | if (msize > 0) |
519 | { | 503 | { |
520 | /* if there is data to send, just not yet, make sure we do transmit | 504 | /* if there is data to send, just not yet, make sure we do transmit |
521 | it once the deadline is reached */ | 505 | * it once the deadline is reached */ |
522 | if (session->cork_task != GNUNET_SCHEDULER_NO_TASK) | 506 | if (session->cork_task != GNUNET_SCHEDULER_NO_TASK) |
523 | GNUNET_SCHEDULER_cancel (session->cork_task); | 507 | GNUNET_SCHEDULER_cancel (session->cork_task); |
524 | session->cork_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_absolute_get_remaining (min_deadline), | 508 | session->cork_task = |
525 | &pop_cork_task, | 509 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_absolute_get_remaining |
526 | session); | 510 | (min_deadline), &pop_cork_task, |
511 | session); | ||
527 | } | 512 | } |
528 | return; | 513 | return; |
529 | } | 514 | } |
@@ -531,18 +516,15 @@ try_transmission (struct Session *session) | |||
531 | { | 516 | { |
532 | static unsigned long long total_bytes; | 517 | static unsigned long long total_bytes; |
533 | static unsigned int total_msgs; | 518 | static unsigned int total_msgs; |
534 | char pbuf[msize]; /* plaintext */ | 519 | char pbuf[msize]; /* plaintext */ |
535 | size_t used; | 520 | size_t used; |
536 | 521 | ||
537 | used = 0; | 522 | used = 0; |
538 | while ( (NULL != (pos = session->sme_head)) && | 523 | while ((NULL != (pos = session->sme_head)) && (used + pos->size <= msize)) |
539 | (used + pos->size <= msize) ) | ||
540 | { | 524 | { |
541 | memcpy (&pbuf[used], &pos[1], pos->size); | 525 | memcpy (&pbuf[used], &pos[1], pos->size); |
542 | used += pos->size; | 526 | used += pos->size; |
543 | GNUNET_CONTAINER_DLL_remove (session->sme_head, | 527 | GNUNET_CONTAINER_DLL_remove (session->sme_head, session->sme_tail, pos); |
544 | session->sme_tail, | ||
545 | pos); | ||
546 | GNUNET_free (pos); | 528 | GNUNET_free (pos); |
547 | } | 529 | } |
548 | /* compute average payload size */ | 530 | /* compute average payload size */ |
@@ -554,15 +536,11 @@ try_transmission (struct Session *session) | |||
554 | total_msgs = 1; | 536 | total_msgs = 1; |
555 | total_bytes = used; | 537 | total_bytes = used; |
556 | } | 538 | } |
557 | GNUNET_STATISTICS_set (GSC_stats, | 539 | GNUNET_STATISTICS_set (GSC_stats, "# avg payload per encrypted message", |
558 | "# avg payload per encrypted message", | 540 | total_bytes / total_msgs, GNUNET_NO); |
559 | total_bytes / total_msgs, | ||
560 | GNUNET_NO); | ||
561 | /* now actually transmit... */ | 541 | /* now actually transmit... */ |
562 | session->ready_to_transmit = GNUNET_NO; | 542 | session->ready_to_transmit = GNUNET_NO; |
563 | GSC_KX_encrypt_and_transmit (session->kxinfo, | 543 | GSC_KX_encrypt_and_transmit (session->kxinfo, pbuf, used); |
564 | pbuf, | ||
565 | used); | ||
566 | } | 544 | } |
567 | } | 545 | } |
568 | 546 | ||
@@ -587,9 +565,7 @@ do_send_message (void *cls, const GNUNET_HashCode * key, void *value) | |||
587 | m = GNUNET_malloc (sizeof (struct SessionMessageEntry) + size); | 565 | m = GNUNET_malloc (sizeof (struct SessionMessageEntry) + size); |
588 | memcpy (&m[1], hdr, size); | 566 | memcpy (&m[1], hdr, size); |
589 | m->size = size; | 567 | m->size = size; |
590 | GNUNET_CONTAINER_DLL_insert (session->sme_head, | 568 | GNUNET_CONTAINER_DLL_insert (session->sme_head, session->sme_tail, m); |
591 | session->sme_tail, | ||
592 | m); | ||
593 | try_transmission (session); | 569 | try_transmission (session); |
594 | return GNUNET_OK; | 570 | return GNUNET_OK; |
595 | } | 571 | } |
@@ -605,8 +581,8 @@ GSC_SESSIONS_broadcast (const struct GNUNET_MessageHeader *msg) | |||
605 | { | 581 | { |
606 | if (NULL == sessions) | 582 | if (NULL == sessions) |
607 | return; | 583 | return; |
608 | GNUNET_CONTAINER_multihashmap_iterate (sessions, | 584 | GNUNET_CONTAINER_multihashmap_iterate (sessions, &do_send_message, |
609 | &do_send_message, (void*) msg); | 585 | (void *) msg); |
610 | } | 586 | } |
611 | 587 | ||
612 | 588 | ||
@@ -640,8 +616,7 @@ GSC_SESSIONS_solicit (const struct GNUNET_PeerIdentity *pid) | |||
640 | */ | 616 | */ |
641 | void | 617 | void |
642 | GSC_SESSIONS_transmit (struct GSC_ClientActiveRequest *car, | 618 | GSC_SESSIONS_transmit (struct GSC_ClientActiveRequest *car, |
643 | const struct GNUNET_MessageHeader *msg, | 619 | const struct GNUNET_MessageHeader *msg, int cork) |
644 | int cork) | ||
645 | { | 620 | { |
646 | struct Session *session; | 621 | struct Session *session; |
647 | struct SessionMessageEntry *sme; | 622 | struct SessionMessageEntry *sme; |
@@ -655,10 +630,9 @@ GSC_SESSIONS_transmit (struct GSC_ClientActiveRequest *car, | |||
655 | memcpy (&sme[1], msg, msize); | 630 | memcpy (&sme[1], msg, msize); |
656 | sme->size = msize; | 631 | sme->size = msize; |
657 | if (GNUNET_YES == cork) | 632 | if (GNUNET_YES == cork) |
658 | sme->deadline = GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_MAX_CORK_DELAY); | 633 | sme->deadline = |
659 | GNUNET_CONTAINER_DLL_insert_tail (session->sme_head, | 634 | GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_MAX_CORK_DELAY); |
660 | session->sme_tail, | 635 | GNUNET_CONTAINER_DLL_insert_tail (session->sme_head, session->sme_tail, sme); |
661 | sme); | ||
662 | try_transmission (session); | 636 | try_transmission (session); |
663 | } | 637 | } |
664 | 638 | ||
@@ -678,7 +652,7 @@ queue_connect_message (void *cls, const GNUNET_HashCode * key, void *value) | |||
678 | struct GNUNET_SERVER_TransmitContext *tc = cls; | 652 | struct GNUNET_SERVER_TransmitContext *tc = cls; |
679 | struct Session *session = value; | 653 | struct Session *session = value; |
680 | struct ConnectNotifyMessage cnm; | 654 | struct ConnectNotifyMessage cnm; |
681 | 655 | ||
682 | /* FIXME: code duplication with clients... */ | 656 | /* FIXME: code duplication with clients... */ |
683 | cnm.header.size = htons (sizeof (struct ConnectNotifyMessage)); | 657 | cnm.header.size = htons (sizeof (struct ConnectNotifyMessage)); |
684 | cnm.header.type = htons (GNUNET_MESSAGE_TYPE_CORE_NOTIFY_CONNECT); | 658 | cnm.header.type = htons (GNUNET_MESSAGE_TYPE_CORE_NOTIFY_CONNECT); |
@@ -693,23 +667,23 @@ queue_connect_message (void *cls, const GNUNET_HashCode * key, void *value) | |||
693 | /** | 667 | /** |
694 | * Handle CORE_ITERATE_PEERS request. For this request type, the client | 668 | * Handle CORE_ITERATE_PEERS request. For this request type, the client |
695 | * does not have to have transmitted an INIT request. All current peers | 669 | * does not have to have transmitted an INIT request. All current peers |
696 | * are returned, regardless of which message types they accept. | 670 | * are returned, regardless of which message types they accept. |
697 | * | 671 | * |
698 | * @param cls unused | 672 | * @param cls unused |
699 | * @param client client sending the iteration request | 673 | * @param client client sending the iteration request |
700 | * @param message iteration request message | 674 | * @param message iteration request message |
701 | */ | 675 | */ |
702 | void | 676 | void |
703 | GSC_SESSIONS_handle_client_iterate_peers (void *cls, struct GNUNET_SERVER_Client *client, | 677 | GSC_SESSIONS_handle_client_iterate_peers (void *cls, |
704 | const struct GNUNET_MessageHeader *message) | 678 | struct GNUNET_SERVER_Client *client, |
679 | const struct GNUNET_MessageHeader | ||
680 | *message) | ||
705 | { | 681 | { |
706 | struct GNUNET_MessageHeader done_msg; | 682 | struct GNUNET_MessageHeader done_msg; |
707 | struct GNUNET_SERVER_TransmitContext *tc; | 683 | struct GNUNET_SERVER_TransmitContext *tc; |
708 | 684 | ||
709 | tc = GNUNET_SERVER_transmit_context_create (client); | 685 | tc = GNUNET_SERVER_transmit_context_create (client); |
710 | GNUNET_CONTAINER_multihashmap_iterate (sessions, | 686 | GNUNET_CONTAINER_multihashmap_iterate (sessions, &queue_connect_message, tc); |
711 | &queue_connect_message, | ||
712 | tc); | ||
713 | done_msg.size = htons (sizeof (struct GNUNET_MessageHeader)); | 687 | done_msg.size = htons (sizeof (struct GNUNET_MessageHeader)); |
714 | done_msg.type = htons (GNUNET_MESSAGE_TYPE_CORE_ITERATE_PEERS_END); | 688 | done_msg.type = htons (GNUNET_MESSAGE_TYPE_CORE_ITERATE_PEERS_END); |
715 | GNUNET_SERVER_transmit_context_append_message (tc, &done_msg); | 689 | GNUNET_SERVER_transmit_context_append_message (tc, &done_msg); |
@@ -728,14 +702,16 @@ GSC_SESSIONS_handle_client_iterate_peers (void *cls, struct GNUNET_SERVER_Client | |||
728 | * @param message iteration request message | 702 | * @param message iteration request message |
729 | */ | 703 | */ |
730 | void | 704 | void |
731 | GSC_SESSIONS_handle_client_have_peer (void *cls, struct GNUNET_SERVER_Client *client, | 705 | GSC_SESSIONS_handle_client_have_peer (void *cls, |
732 | const struct GNUNET_MessageHeader *message) | 706 | struct GNUNET_SERVER_Client *client, |
707 | const struct GNUNET_MessageHeader | ||
708 | *message) | ||
733 | { | 709 | { |
734 | struct GNUNET_MessageHeader done_msg; | 710 | struct GNUNET_MessageHeader done_msg; |
735 | struct GNUNET_SERVER_TransmitContext *tc; | 711 | struct GNUNET_SERVER_TransmitContext *tc; |
736 | const struct GNUNET_PeerIdentity *peer; | 712 | const struct GNUNET_PeerIdentity *peer; |
737 | 713 | ||
738 | peer = (const struct GNUNET_PeerIdentity *) &message[1]; // YUCK! | 714 | peer = (const struct GNUNET_PeerIdentity *) &message[1]; // YUCK! |
739 | tc = GNUNET_SERVER_transmit_context_create (client); | 715 | tc = GNUNET_SERVER_transmit_context_create (client); |
740 | GNUNET_CONTAINER_multihashmap_get_multiple (sessions, &peer->hashPubKey, | 716 | GNUNET_CONTAINER_multihashmap_get_multiple (sessions, &peer->hashPubKey, |
741 | &queue_connect_message, tc); | 717 | &queue_connect_message, tc); |
@@ -755,24 +731,22 @@ GSC_SESSIONS_handle_client_have_peer (void *cls, struct GNUNET_SERVER_Client *cl | |||
755 | */ | 731 | */ |
756 | void | 732 | void |
757 | GSC_SESSIONS_set_typemap (const struct GNUNET_PeerIdentity *peer, | 733 | GSC_SESSIONS_set_typemap (const struct GNUNET_PeerIdentity *peer, |
758 | const struct GNUNET_MessageHeader *msg) | 734 | const struct GNUNET_MessageHeader *msg) |
759 | { | 735 | { |
760 | struct Session *session; | 736 | struct Session *session; |
761 | struct GSC_TypeMap *nmap; | 737 | struct GSC_TypeMap *nmap; |
762 | 738 | ||
763 | nmap = GSC_TYPEMAP_get_from_message (msg); | 739 | nmap = GSC_TYPEMAP_get_from_message (msg); |
764 | if (NULL == nmap) | 740 | if (NULL == nmap) |
765 | return; /* malformed */ | 741 | return; /* malformed */ |
766 | session = find_session (peer); | 742 | session = find_session (peer); |
767 | if (NULL == session) | 743 | if (NULL == session) |
768 | { | 744 | { |
769 | GNUNET_break (0); | 745 | GNUNET_break (0); |
770 | return; | 746 | return; |
771 | } | 747 | } |
772 | GSC_CLIENTS_notify_clients_about_neighbour (peer, | 748 | GSC_CLIENTS_notify_clients_about_neighbour (peer, NULL, 0, /* FIXME: ATS */ |
773 | NULL, 0, /* FIXME: ATS */ | 749 | session->tmap, nmap); |
774 | session->tmap, | ||
775 | nmap); | ||
776 | GSC_TYPEMAP_destroy (session->tmap); | 750 | GSC_TYPEMAP_destroy (session->tmap); |
777 | session->tmap = nmap; | 751 | session->tmap = nmap; |
778 | } | 752 | } |
@@ -788,7 +762,7 @@ GSC_SESSIONS_set_typemap (const struct GNUNET_PeerIdentity *peer, | |||
788 | */ | 762 | */ |
789 | void | 763 | void |
790 | GSC_SESSIONS_add_to_typemap (const struct GNUNET_PeerIdentity *peer, | 764 | GSC_SESSIONS_add_to_typemap (const struct GNUNET_PeerIdentity *peer, |
791 | uint16_t type) | 765 | uint16_t type) |
792 | { | 766 | { |
793 | struct Session *session; | 767 | struct Session *session; |
794 | struct GSC_TypeMap *nmap; | 768 | struct GSC_TypeMap *nmap; |
@@ -797,16 +771,11 @@ GSC_SESSIONS_add_to_typemap (const struct GNUNET_PeerIdentity *peer, | |||
797 | return; | 771 | return; |
798 | session = find_session (peer); | 772 | session = find_session (peer); |
799 | GNUNET_assert (NULL != session); | 773 | GNUNET_assert (NULL != session); |
800 | if (GNUNET_YES == | 774 | if (GNUNET_YES == GSC_TYPEMAP_test_match (session->tmap, &type, 1)) |
801 | GSC_TYPEMAP_test_match (session->tmap, | 775 | return; /* already in it */ |
802 | &type, 1)) | 776 | nmap = GSC_TYPEMAP_extend (session->tmap, &type, 1); |
803 | return; /* already in it */ | 777 | GSC_CLIENTS_notify_clients_about_neighbour (peer, NULL, 0, /* FIXME: ATS */ |
804 | nmap = GSC_TYPEMAP_extend (session->tmap, | 778 | session->tmap, nmap); |
805 | &type, 1); | ||
806 | GSC_CLIENTS_notify_clients_about_neighbour (peer, | ||
807 | NULL, 0, /* FIXME: ATS */ | ||
808 | session->tmap, | ||
809 | nmap); | ||
810 | GSC_TYPEMAP_destroy (session->tmap); | 779 | GSC_TYPEMAP_destroy (session->tmap); |
811 | session->tmap = nmap; | 780 | session->tmap = nmap; |
812 | } | 781 | } |
@@ -846,12 +815,9 @@ free_session_helper (void *cls, const GNUNET_HashCode * key, void *value) | |||
846 | void | 815 | void |
847 | GSC_SESSIONS_done () | 816 | GSC_SESSIONS_done () |
848 | { | 817 | { |
849 | GNUNET_CONTAINER_multihashmap_iterate (sessions, | 818 | GNUNET_CONTAINER_multihashmap_iterate (sessions, &free_session_helper, NULL); |
850 | &free_session_helper, | ||
851 | NULL); | ||
852 | GNUNET_CONTAINER_multihashmap_destroy (sessions); | 819 | GNUNET_CONTAINER_multihashmap_destroy (sessions); |
853 | sessions = NULL; | 820 | sessions = NULL; |
854 | } | 821 | } |
855 | 822 | ||
856 | /* end of gnunet-service-core_sessions.c */ | 823 | /* end of gnunet-service-core_sessions.c */ |
857 | |||