also allow deferral of encrypted messages
authorChristian Grothoff <christian@grothoff.org>
Tue, 11 Oct 2011 12:57:14 +0000 (12:57 +0000)
committerChristian Grothoff <christian@grothoff.org>
Tue, 11 Oct 2011 12:57:14 +0000 (12:57 +0000)
src/core/gnunet-service-core_clients.c
src/core/gnunet-service-core_kx.c
src/core/gnunet-service-core_sessions.c

index c6672c8d2f50de4aab1439efd406808186f6ccc3..38bea0f42ebd4f8d08fbcbcd3d613179d53e4151 100644 (file)
@@ -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);
index 4b9a9498b81c27a03492e6a3259bfdd247de4f5a..92a9e13c96137d28371f4389d7370c9a074aa04d 100644 (file)
@@ -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);
index ab83532c08e05ae3a261f19070e0153a0e995f08..cbbc1b850db744548206fd8f92707c4fe91efcda 100644 (file)
@@ -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,