diff options
author | Christian Grothoff <christian@grothoff.org> | 2016-07-26 21:12:56 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2016-07-26 21:12:56 +0000 |
commit | 8c2dc7d19810d58f23c43bf900e2fb3eebe06fed (patch) | |
tree | 9173a966e2f51a34d9259a0126484e05d44dcaac /src/core/gnunet-service-core_sessions.c | |
parent | a89ea716333ad5ad43757a946efc01cb5e95a0c0 (diff) | |
download | gnunet-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.c | 74 |
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; | |||
197 | static struct Session * | 196 | static struct Session * |
198 | find_session (const struct GNUNET_PeerIdentity *peer) | 197 | find_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 | } |