aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2011-10-11 12:57:14 +0000
committerChristian Grothoff <christian@grothoff.org>2011-10-11 12:57:14 +0000
commit6a61b370a282421bb80cf6c503807d837aaaeb6b (patch)
treec5da0e807887dadac306c8712c61f08418b4d8fc /src/core
parentbc31c9fbcf465b4d4960a335e79115ffcd00ee43 (diff)
downloadgnunet-6a61b370a282421bb80cf6c503807d837aaaeb6b.tar.gz
gnunet-6a61b370a282421bb80cf6c503807d837aaaeb6b.zip
also allow deferral of encrypted messages
Diffstat (limited to 'src/core')
-rw-r--r--src/core/gnunet-service-core_clients.c4
-rw-r--r--src/core/gnunet-service-core_kx.c22
-rw-r--r--src/core/gnunet-service-core_sessions.c5
3 files changed, 31 insertions, 0 deletions
diff --git a/src/core/gnunet-service-core_clients.c b/src/core/gnunet-service-core_clients.c
index c6672c8d2..38bea0f42 100644
--- a/src/core/gnunet-service-core_clients.c
+++ b/src/core/gnunet-service-core_clients.c
@@ -344,6 +344,10 @@ handle_client_send_request (void *cls, struct GNUNET_SERVER_Client *client,
344 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)); 344 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST));
345 car->client_handle = c; 345 car->client_handle = c;
346 } 346 }
347 else
348 {
349 GSC_SESSIONS_dequeue_request (car);
350 }
347 car->target = req->peer; 351 car->target = req->peer;
348 car->deadline = GNUNET_TIME_absolute_ntoh (req->deadline); 352 car->deadline = GNUNET_TIME_absolute_ntoh (req->deadline);
349 car->priority = ntohl (req->priority); 353 car->priority = ntohl (req->priority);
diff --git a/src/core/gnunet-service-core_kx.c b/src/core/gnunet-service-core_kx.c
index 4b9a9498b..92a9e13c9 100644
--- a/src/core/gnunet-service-core_kx.c
+++ b/src/core/gnunet-service-core_kx.c
@@ -294,6 +294,12 @@ struct GSC_KeyExchangeInfo
294 struct PongMessage *pong_received; 294 struct PongMessage *pong_received;
295 295
296 /** 296 /**
297 * Encrypted message we received from the other peer and
298 * did not process yet (or NULL).
299 */
300 struct EncryptedMessage *emsg_received;
301
302 /**
297 * Non-NULL if we are currently looking up HELLOs for this peer. 303 * Non-NULL if we are currently looking up HELLOs for this peer.
298 * for this peer. 304 * for this peer.
299 */ 305 */
@@ -697,6 +703,7 @@ GSC_KX_stop (struct GSC_KeyExchangeInfo *kx)
697 GNUNET_free_non_null (kx->skm_received); 703 GNUNET_free_non_null (kx->skm_received);
698 GNUNET_free_non_null (kx->ping_received); 704 GNUNET_free_non_null (kx->ping_received);
699 GNUNET_free_non_null (kx->pong_received); 705 GNUNET_free_non_null (kx->pong_received);
706 GNUNET_free_non_null (kx->emsg_received);
700 GNUNET_free_non_null (kx->public_key); 707 GNUNET_free_non_null (kx->public_key);
701 GNUNET_free (kx); 708 GNUNET_free (kx);
702} 709}
@@ -1062,6 +1069,7 @@ GSC_KX_handle_pong (struct GSC_KeyExchangeInfo *kx, const struct GNUNET_MessageH
1062{ 1069{
1063 const struct PongMessage *m; 1070 const struct PongMessage *m;
1064 struct PongMessage t; 1071 struct PongMessage t;
1072 struct EncryptedMessage *emsg;
1065 struct GNUNET_CRYPTO_AesInitializationVector iv; 1073 struct GNUNET_CRYPTO_AesInitializationVector iv;
1066 uint16_t msize; 1074 uint16_t msize;
1067 1075
@@ -1142,6 +1150,13 @@ GSC_KX_handle_pong (struct GSC_KeyExchangeInfo *kx, const struct GNUNET_MessageH
1142 GNUNET_SCHEDULER_cancel (kx->retry_set_key_task); 1150 GNUNET_SCHEDULER_cancel (kx->retry_set_key_task);
1143 kx->retry_set_key_task = GNUNET_SCHEDULER_NO_TASK; 1151 kx->retry_set_key_task = GNUNET_SCHEDULER_NO_TASK;
1144 GNUNET_assert (kx->keep_alive_task == GNUNET_SCHEDULER_NO_TASK); 1152 GNUNET_assert (kx->keep_alive_task == GNUNET_SCHEDULER_NO_TASK);
1153 if (kx->emsg_received != NULL)
1154 {
1155 emsg = kx->emsg_received;
1156 kx->emsg_received = NULL;
1157 GSC_KX_handle_encrypted_message (kx, &emsg->header, NULL, 0 /* FIXME: ATSI */);
1158 GNUNET_free (emsg);
1159 }
1145 update_timeout (kx); 1160 update_timeout (kx);
1146 break; 1161 break;
1147 case KX_STATE_UP: 1162 case KX_STATE_UP:
@@ -1342,6 +1357,13 @@ GSC_KX_handle_encrypted_message (struct GSC_KeyExchangeInfo *kx,
1342 1, GNUNET_NO); 1357 1, GNUNET_NO);
1343 return; 1358 return;
1344 } 1359 }
1360 if (kx->status == KX_STATE_KEY_RECEIVED)
1361 {
1362 /* defer */
1363 GNUNET_free_non_null (kx->ping_received);
1364 kx->emsg_received = (struct EncryptedMessage*) GNUNET_copy_message (msg);
1365 return;
1366 }
1345 /* validate hash */ 1367 /* validate hash */
1346 derive_auth_key (&auth_key, &kx->decrypt_key, m->iv_seed, 1368 derive_auth_key (&auth_key, &kx->decrypt_key, m->iv_seed,
1347 kx->decrypt_key_created); 1369 kx->decrypt_key_created);
diff --git a/src/core/gnunet-service-core_sessions.c b/src/core/gnunet-service-core_sessions.c
index ab83532c0..cbbc1b850 100644
--- a/src/core/gnunet-service-core_sessions.c
+++ b/src/core/gnunet-service-core_sessions.c
@@ -715,6 +715,11 @@ GSC_SESSIONS_set_typemap (const struct GNUNET_PeerIdentity *peer,
715 if (NULL == nmap) 715 if (NULL == nmap)
716 return; /* malformed */ 716 return; /* malformed */
717 session = find_session (peer); 717 session = find_session (peer);
718 if (NULL == session)
719 {
720 GNUNET_break (0);
721 return;
722 }
718 GSC_CLIENTS_notify_clients_about_neighbour (peer, 723 GSC_CLIENTS_notify_clients_about_neighbour (peer,
719 NULL, 0, /* FIXME: ATS */ 724 NULL, 0, /* FIXME: ATS */
720 session->tmap, 725 session->tmap,