aboutsummaryrefslogtreecommitdiff
path: root/src/core/gnunet-service-core_sessions.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2016-07-26 21:12:56 +0000
committerChristian Grothoff <christian@grothoff.org>2016-07-26 21:12:56 +0000
commit8c2dc7d19810d58f23c43bf900e2fb3eebe06fed (patch)
tree9173a966e2f51a34d9259a0126484e05d44dcaac /src/core/gnunet-service-core_sessions.c
parenta89ea716333ad5ad43757a946efc01cb5e95a0c0 (diff)
downloadgnunet-8c2dc7d19810d58f23c43bf900e2fb3eebe06fed.tar.gz
gnunet-8c2dc7d19810d58f23c43bf900e2fb3eebe06fed.zip
-converting CORE service to new transport MQ API
Diffstat (limited to 'src/core/gnunet-service-core_sessions.c')
-rw-r--r--src/core/gnunet-service-core_sessions.c74
1 files changed, 44 insertions, 30 deletions
diff --git a/src/core/gnunet-service-core_sessions.c b/src/core/gnunet-service-core_sessions.c
index 41d3cc24b..ef5285b45 100644
--- a/src/core/gnunet-service-core_sessions.c
+++ b/src/core/gnunet-service-core_sessions.c
@@ -1,6 +1,6 @@
1/* 1/*
2 This file is part of GNUnet. 2 This file is part of GNUnet.
3 Copyright (C) 2009-2014 GNUnet e.V. 3 Copyright (C) 2009-2014, 2016 GNUnet e.V.
4 4
5 GNUnet is free software; you can redistribute it and/or modify 5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published 6 it under the terms of the GNU General Public License as published
@@ -25,7 +25,6 @@
25 */ 25 */
26#include "platform.h" 26#include "platform.h"
27#include "gnunet-service-core.h" 27#include "gnunet-service-core.h"
28#include "gnunet-service-core_neighbours.h"
29#include "gnunet-service-core_kx.h" 28#include "gnunet-service-core_kx.h"
30#include "gnunet-service-core_typemap.h" 29#include "gnunet-service-core_typemap.h"
31#include "gnunet-service-core_sessions.h" 30#include "gnunet-service-core_sessions.h"
@@ -88,9 +87,14 @@ struct Session
88 /** 87 /**
89 * Identity of the other peer. 88 * Identity of the other peer.
90 */ 89 */
91 struct GNUNET_PeerIdentity peer; 90 const struct GNUNET_PeerIdentity *peer;
92 91
93 /** 92 /**
93 * Key exchange state for this peer.
94 */
95 struct GSC_KeyExchangeInfo *kx;
96
97 /**
94 * Head of list of requests from clients for transmission to 98 * Head of list of requests from clients for transmission to
95 * this peer. 99 * this peer.
96 */ 100 */
@@ -113,11 +117,6 @@ struct Session
113 struct SessionMessageEntry *sme_tail; 117 struct SessionMessageEntry *sme_tail;
114 118
115 /** 119 /**
116 * Information about the key exchange with the other peer.
117 */
118 struct GSC_KeyExchangeInfo *kxinfo;
119
120 /**
121 * Current type map for this peer. 120 * Current type map for this peer.
122 */ 121 */
123 struct GSC_TypeMap *tmap; 122 struct GSC_TypeMap *tmap;
@@ -197,7 +196,10 @@ static struct GNUNET_CONTAINER_MultiPeerMap *sessions;
197static struct Session * 196static struct Session *
198find_session (const struct GNUNET_PeerIdentity *peer) 197find_session (const struct GNUNET_PeerIdentity *peer)
199{ 198{
200 return GNUNET_CONTAINER_multipeermap_get (sessions, peer); 199 if (NULL == sessions)
200 return NULL;
201 return GNUNET_CONTAINER_multipeermap_get (sessions,
202 peer);
201} 203}
202 204
203 205
@@ -218,8 +220,8 @@ GSC_SESSIONS_end (const struct GNUNET_PeerIdentity *pid)
218 if (NULL == session) 220 if (NULL == session)
219 return; 221 return;
220 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 222 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
221 "Destroying session for peer `%4s'\n", 223 "Destroying session for peer `%s'\n",
222 GNUNET_i2s (&session->peer)); 224 GNUNET_i2s (session->peer));
223 if (NULL != session->cork_task) 225 if (NULL != session->cork_task)
224 { 226 {
225 GNUNET_SCHEDULER_cancel (session->cork_task); 227 GNUNET_SCHEDULER_cancel (session->cork_task);
@@ -244,13 +246,15 @@ GSC_SESSIONS_end (const struct GNUNET_PeerIdentity *pid)
244 GNUNET_SCHEDULER_cancel (session->typemap_task); 246 GNUNET_SCHEDULER_cancel (session->typemap_task);
245 session->typemap_task = NULL; 247 session->typemap_task = NULL;
246 } 248 }
247 GSC_CLIENTS_notify_clients_about_neighbour (&session->peer, 249 GSC_CLIENTS_notify_clients_about_neighbour (session->peer,
248 session->tmap, NULL); 250 session->tmap,
251 NULL);
249 GNUNET_assert (GNUNET_YES == 252 GNUNET_assert (GNUNET_YES ==
250 GNUNET_CONTAINER_multipeermap_remove (sessions, 253 GNUNET_CONTAINER_multipeermap_remove (sessions,
251 &session->peer, 254 session->peer,
252 session)); 255 session));
253 GNUNET_STATISTICS_set (GSC_stats, gettext_noop ("# peers connected"), 256 GNUNET_STATISTICS_set (GSC_stats,
257 gettext_noop ("# peers connected"),
254 GNUNET_CONTAINER_multipeermap_size (sessions), 258 GNUNET_CONTAINER_multipeermap_size (sessions),
255 GNUNET_NO); 259 GNUNET_NO);
256 GSC_TYPEMAP_destroy (session->tmap); 260 GSC_TYPEMAP_destroy (session->tmap);
@@ -285,7 +289,7 @@ transmit_typemap_task (void *cls)
285 1, 289 1,
286 GNUNET_NO); 290 GNUNET_NO);
287 hdr = GSC_TYPEMAP_compute_type_map_message (); 291 hdr = GSC_TYPEMAP_compute_type_map_message ();
288 GSC_KX_encrypt_and_transmit (session->kxinfo, 292 GSC_KX_encrypt_and_transmit (session->kx,
289 hdr, 293 hdr,
290 ntohs (hdr->size)); 294 ntohs (hdr->size));
291 GNUNET_free (hdr); 295 GNUNET_free (hdr);
@@ -327,14 +331,15 @@ GSC_SESSIONS_create (const struct GNUNET_PeerIdentity *peer,
327 GNUNET_i2s (peer)); 331 GNUNET_i2s (peer));
328 session = GNUNET_new (struct Session); 332 session = GNUNET_new (struct Session);
329 session->tmap = GSC_TYPEMAP_create (); 333 session->tmap = GSC_TYPEMAP_create ();
330 session->peer = *peer; 334 session->peer = peer;
331 session->kxinfo = kx; 335 session->kx = kx;
332 GNUNET_assert (GNUNET_OK == 336 GNUNET_assert (GNUNET_OK ==
333 GNUNET_CONTAINER_multipeermap_put (sessions, 337 GNUNET_CONTAINER_multipeermap_put (sessions,
334 &session->peer, 338 session->peer,
335 session, 339 session,
336 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); 340 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
337 GNUNET_STATISTICS_set (GSC_stats, gettext_noop ("# peers connected"), 341 GNUNET_STATISTICS_set (GSC_stats,
342 gettext_noop ("# peers connected"),
338 GNUNET_CONTAINER_multipeermap_size (sessions), 343 GNUNET_CONTAINER_multipeermap_size (sessions),
339 GNUNET_NO); 344 GNUNET_NO);
340 GSC_CLIENTS_notify_clients_about_neighbour (peer, 345 GSC_CLIENTS_notify_clients_about_neighbour (peer,
@@ -433,7 +438,7 @@ notify_client_about_session (void *cls,
433 struct Session *session = value; 438 struct Session *session = value;
434 439
435 GSC_CLIENTS_notify_client_about_neighbour (client, 440 GSC_CLIENTS_notify_client_about_neighbour (client,
436 &session->peer, 441 session->peer,
437 NULL, /* old TMAP: none */ 442 NULL, /* old TMAP: none */
438 session->tmap); 443 session->tmap);
439 return GNUNET_OK; 444 return GNUNET_OK;
@@ -620,7 +625,7 @@ try_transmission (struct Session *session)
620 if (GNUNET_YES != session->ready_to_transmit) 625 if (GNUNET_YES != session->ready_to_transmit)
621 { 626 {
622 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 627 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
623 "Already ready to transmit, not evaluating queue\n"); 628 "Not yet ready to transmit, not evaluating queue\n");
624 return; 629 return;
625 } 630 }
626 msize = 0; 631 msize = 0;
@@ -628,13 +633,13 @@ try_transmission (struct Session *session)
628 /* if the peer has excess bandwidth, background traffic is allowed, 633 /* if the peer has excess bandwidth, background traffic is allowed,
629 otherwise not */ 634 otherwise not */
630 if (MAX_ENCRYPTED_MESSAGE_QUEUE_SIZE <= 635 if (MAX_ENCRYPTED_MESSAGE_QUEUE_SIZE <=
631 GSC_NEIGHBOURS_get_queue_size (&session->peer)) 636 GSC_NEIGHBOURS_get_queue_length (session->kx))
632 { 637 {
633 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 638 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
634 "Transmission queue already very long, waiting...\n"); 639 "Transmission queue already very long, waiting...\n");
635 return; /* queue already too long */ 640 return; /* queue already too long */
636 } 641 }
637 excess = GSC_NEIGHBOURS_check_excess_bandwidth (&session->peer); 642 excess = GSC_NEIGHBOURS_check_excess_bandwidth (session->kx);
638 if (GNUNET_YES == excess) 643 if (GNUNET_YES == excess)
639 maxp = GNUNET_CORE_PRIO_BACKGROUND; 644 maxp = GNUNET_CORE_PRIO_BACKGROUND;
640 else 645 else
@@ -769,7 +774,7 @@ try_transmission (struct Session *session)
769 GNUNET_NO); 774 GNUNET_NO);
770 /* now actually transmit... */ 775 /* now actually transmit... */
771 session->ready_to_transmit = GNUNET_NO; 776 session->ready_to_transmit = GNUNET_NO;
772 GSC_KX_encrypt_and_transmit (session->kxinfo, 777 GSC_KX_encrypt_and_transmit (session->kx,
773 pbuf, 778 pbuf,
774 used); 779 used);
775 } 780 }
@@ -797,7 +802,9 @@ do_restart_typemap_message (void *cls,
797 802
798 size = ntohs (hdr->size); 803 size = ntohs (hdr->size);
799 sme = GNUNET_malloc (sizeof (struct SessionMessageEntry) + size); 804 sme = GNUNET_malloc (sizeof (struct SessionMessageEntry) + size);
800 GNUNET_memcpy (&sme[1], hdr, size); 805 GNUNET_memcpy (&sme[1],
806 hdr,
807 size);
801 sme->size = size; 808 sme->size = size;
802 sme->priority = GNUNET_CORE_PRIO_CRITICAL_CONTROL; 809 sme->priority = GNUNET_CORE_PRIO_CRITICAL_CONTROL;
803 GNUNET_CONTAINER_DLL_insert (session->sme_head, 810 GNUNET_CONTAINER_DLL_insert (session->sme_head,
@@ -871,12 +878,18 @@ GSC_SESSIONS_transmit (struct GSC_ClientActiveRequest *car,
871 return; 878 return;
872 msize = ntohs (msg->size); 879 msize = ntohs (msg->size);
873 sme = GNUNET_malloc (sizeof (struct SessionMessageEntry) + msize); 880 sme = GNUNET_malloc (sizeof (struct SessionMessageEntry) + msize);
874 GNUNET_memcpy (&sme[1], msg, msize); 881 GNUNET_memcpy (&sme[1],
882 msg,
883 msize);
875 sme->size = msize; 884 sme->size = msize;
876 sme->priority = priority; 885 sme->priority = priority;
877 if (GNUNET_YES == cork) 886 if (GNUNET_YES == cork)
887 {
878 sme->deadline = 888 sme->deadline =
879 GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_MAX_CORK_DELAY); 889 GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_MAX_CORK_DELAY);
890 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
891 "Mesage corked, delaying transmission\n");
892 }
880 pos = session->sme_head; 893 pos = session->sme_head;
881 while ( (NULL != pos) && 894 while ( (NULL != pos) &&
882 (pos->priority >= sme->priority) ) 895 (pos->priority >= sme->priority) )
@@ -998,9 +1011,9 @@ free_session_helper (void *cls,
998 const struct GNUNET_PeerIdentity *key, 1011 const struct GNUNET_PeerIdentity *key,
999 void *value) 1012 void *value)
1000{ 1013{
1001 struct Session *session = value; 1014 /* struct Session *session = value; */
1002 1015
1003 GSC_SESSIONS_end (&session->peer); 1016 GSC_SESSIONS_end (key);
1004 return GNUNET_OK; 1017 return GNUNET_OK;
1005} 1018}
1006 1019
@@ -1014,7 +1027,8 @@ GSC_SESSIONS_done ()
1014 if (NULL != sessions) 1027 if (NULL != sessions)
1015 { 1028 {
1016 GNUNET_CONTAINER_multipeermap_iterate (sessions, 1029 GNUNET_CONTAINER_multipeermap_iterate (sessions,
1017 &free_session_helper, NULL); 1030 &free_session_helper,
1031 NULL);
1018 GNUNET_CONTAINER_multipeermap_destroy (sessions); 1032 GNUNET_CONTAINER_multipeermap_destroy (sessions);
1019 sessions = NULL; 1033 sessions = NULL;
1020 } 1034 }