aboutsummaryrefslogtreecommitdiff
path: root/src/core/gnunet-service-core_sessions.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/gnunet-service-core_sessions.c')
-rw-r--r--src/core/gnunet-service-core_sessions.c242
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 */
220static void 218static void
221transmit_typemap_task (void *cls, 219transmit_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 */
253void 246void
254GSC_SESSIONS_create (const struct GNUNET_PeerIdentity *peer, 247GSC_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 */
293static int 283static int
294notify_client_about_session (void *cls, 284notify_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
316GSC_SESSIONS_notify_client_about_sessions (struct GSC_Client *client) 303GSC_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, &notify_client_about_session,
320 &notify_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 */
471static void 457static void
472pop_cork_task (void *cls, 458pop_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 */
641void 617void
642GSC_SESSIONS_transmit (struct GSC_ClientActiveRequest *car, 618GSC_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 */
702void 676void
703GSC_SESSIONS_handle_client_iterate_peers (void *cls, struct GNUNET_SERVER_Client *client, 677GSC_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 */
730void 704void
731GSC_SESSIONS_handle_client_have_peer (void *cls, struct GNUNET_SERVER_Client *client, 705GSC_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 */
756void 732void
757GSC_SESSIONS_set_typemap (const struct GNUNET_PeerIdentity *peer, 733GSC_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 */
789void 763void
790GSC_SESSIONS_add_to_typemap (const struct GNUNET_PeerIdentity *peer, 764GSC_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)
846void 815void
847GSC_SESSIONS_done () 816GSC_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