diff options
author | Christian Grothoff <christian@grothoff.org> | 2011-10-11 12:57:14 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2011-10-11 12:57:14 +0000 |
commit | 6a61b370a282421bb80cf6c503807d837aaaeb6b (patch) | |
tree | c5da0e807887dadac306c8712c61f08418b4d8fc /src/core | |
parent | bc31c9fbcf465b4d4960a335e79115ffcd00ee43 (diff) | |
download | gnunet-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.c | 4 | ||||
-rw-r--r-- | src/core/gnunet-service-core_kx.c | 22 | ||||
-rw-r--r-- | src/core/gnunet-service-core_sessions.c | 5 |
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, |