From: Christian Grothoff Date: Tue, 11 Oct 2011 12:57:14 +0000 (+0000) Subject: also allow deferral of encrypted messages X-Git-Tag: initial-import-from-subversion-38251~16624 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=6a61b370a282421bb80cf6c503807d837aaaeb6b;p=oweals%2Fgnunet.git also allow deferral of encrypted messages --- 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, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)); car->client_handle = c; } + else + { + GSC_SESSIONS_dequeue_request (car); + } car->target = req->peer; car->deadline = GNUNET_TIME_absolute_ntoh (req->deadline); 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 @@ -293,6 +293,12 @@ struct GSC_KeyExchangeInfo */ struct PongMessage *pong_received; + /** + * Encrypted message we received from the other peer and + * did not process yet (or NULL). + */ + struct EncryptedMessage *emsg_received; + /** * Non-NULL if we are currently looking up HELLOs for this peer. * for this peer. @@ -697,6 +703,7 @@ GSC_KX_stop (struct GSC_KeyExchangeInfo *kx) GNUNET_free_non_null (kx->skm_received); GNUNET_free_non_null (kx->ping_received); GNUNET_free_non_null (kx->pong_received); + GNUNET_free_non_null (kx->emsg_received); GNUNET_free_non_null (kx->public_key); GNUNET_free (kx); } @@ -1062,6 +1069,7 @@ GSC_KX_handle_pong (struct GSC_KeyExchangeInfo *kx, const struct GNUNET_MessageH { const struct PongMessage *m; struct PongMessage t; + struct EncryptedMessage *emsg; struct GNUNET_CRYPTO_AesInitializationVector iv; uint16_t msize; @@ -1142,6 +1150,13 @@ GSC_KX_handle_pong (struct GSC_KeyExchangeInfo *kx, const struct GNUNET_MessageH GNUNET_SCHEDULER_cancel (kx->retry_set_key_task); kx->retry_set_key_task = GNUNET_SCHEDULER_NO_TASK; GNUNET_assert (kx->keep_alive_task == GNUNET_SCHEDULER_NO_TASK); + if (kx->emsg_received != NULL) + { + emsg = kx->emsg_received; + kx->emsg_received = NULL; + GSC_KX_handle_encrypted_message (kx, &emsg->header, NULL, 0 /* FIXME: ATSI */); + GNUNET_free (emsg); + } update_timeout (kx); break; case KX_STATE_UP: @@ -1342,6 +1357,13 @@ GSC_KX_handle_encrypted_message (struct GSC_KeyExchangeInfo *kx, 1, GNUNET_NO); return; } + if (kx->status == KX_STATE_KEY_RECEIVED) + { + /* defer */ + GNUNET_free_non_null (kx->ping_received); + kx->emsg_received = (struct EncryptedMessage*) GNUNET_copy_message (msg); + return; + } /* validate hash */ derive_auth_key (&auth_key, &kx->decrypt_key, m->iv_seed, 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, if (NULL == nmap) return; /* malformed */ session = find_session (peer); + if (NULL == session) + { + GNUNET_break (0); + return; + } GSC_CLIENTS_notify_clients_about_neighbour (peer, NULL, 0, /* FIXME: ATS */ session->tmap,