pass only CadetTunnelAxolotl if it suffices, preparation for having ambiguous KX...
[oweals/gnunet.git] / src / cadet / gnunet-service-cadet_tunnel.h
index 16616de592f487c63071fc6d936c51e61d6be5f5..0abdc02ce6a140e08020dd3dbb801a3b1d8659a7 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2013 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2013 GNUnet e.V.
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -14,8 +14,8 @@
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 
 /**
@@ -40,70 +40,89 @@ extern "C"
 #include "platform.h"
 #include "gnunet_util_lib.h"
 
+#define CONNECTIONS_PER_TUNNEL 3
+
 /**
  * All the connectivity states a tunnel can be in.
  */
-enum CadetTunnel3CState
+enum CadetTunnelCState
 {
-    /**
-     * Uninitialized status, should never appear in operation.
-     */
-  CADET_TUNNEL3_NEW,
-
-    /**
-     * Path to the peer not known yet.
-     */
-  CADET_TUNNEL3_SEARCHING,
-
-    /**
-     * Request sent, not yet answered.
-     */
-  CADET_TUNNEL3_WAITING,
-
-    /**
-     * Peer connected and ready to accept data.
-     */
-  CADET_TUNNEL3_READY,
+  /**
+   * Uninitialized status, should never appear in operation.
+   */
+  CADET_TUNNEL_NEW,
+
+  /**
+   * No path to the peer known yet.
+   */
+  CADET_TUNNEL_SEARCHING,
+
+  /**
+   * Request sent, not yet answered.
+   */
+  CADET_TUNNEL_WAITING,
+
+  /**
+   * Peer connected and ready to accept data.
+   */
+  CADET_TUNNEL_READY,
 
   /**
    * Tunnel being shut down, don't try to keep it alive.
    */
-  CADET_TUNNEL3_SHUTDOWN
+  CADET_TUNNEL_SHUTDOWN
 };
 
 
 /**
  * All the encryption states a tunnel can be in.
  */
-enum CadetTunnel3EState
+enum CadetTunnelEState
 {
   /**
    * Uninitialized status, should never appear in operation.
    */
-  CADET_TUNNEL3_KEY_UNINITIALIZED,
+  CADET_TUNNEL_KEY_UNINITIALIZED,
 
   /**
    * Ephemeral key sent, waiting for peer's key.
    */
-  CADET_TUNNEL3_KEY_SENT,
+  CADET_TUNNEL_KEY_SENT,
 
   /**
-   * New ephemeral key and ping sent, waiting for pong.
+   * In OTR: New ephemeral key and ping sent, waiting for pong.
+   *
    * This means that we DO have the peer's ephemeral key, otherwise the
-   * state would be KEY_SENT.
+   * state would be KEY_SENT. We DO NOT have a valid session key (either no
+   * previous key or previous key expired).
+   *
+   *
+   * In Axolotl: Key sent and received but no deciphered traffic yet.
+   *
+   * This means that we can send traffic (otherwise we would never complete
+   * the handshake), but we don't have complete confirmation. Since the first
+   * traffic MUST be a complete channel creation 3-way handshake, no payload
+   * will be sent before confirmation.
    */
-  CADET_TUNNEL3_KEY_PING,
+  CADET_TUNNEL_KEY_PING,
 
   /**
    * Handshake completed: session key available.
    */
-  CADET_TUNNEL3_KEY_OK,
+  CADET_TUNNEL_KEY_OK,
+
+  /**
+   * New ephemeral key and ping sent, waiting for pong. Unlike KEY_PING,
+   * we still have a valid session key and therefore we *can* still send
+   * traffic on the tunnel.
+   */
+  CADET_TUNNEL_KEY_REKEY
 };
 
 /**
  * Struct containing all information regarding a given peer
  */
-struct CadetTunnel3;
+struct CadetTunnel;
 
 
 #include "gnunet-service-cadet_channel.h"
@@ -113,7 +132,7 @@ struct CadetTunnel3;
 /**
  * Handle for messages queued but not yet sent.
  */
-struct CadetTunnel3Queue;
+struct CadetTunnelQueue;
 
 /**
  * Callback called when a queued message is sent.
@@ -123,13 +142,18 @@ struct CadetTunnel3Queue;
  * @param type Type of message sent.
  * @param size Size of the message.
  */
-typedef void (*GMT_sent) (void *cls,
-                          struct CadetTunnel3 *t,
-                          struct CadetTunnel3Queue *q,
-                          uint16_t type, size_t size);
+typedef void
+(*GCT_sent) (void *cls,
+            struct CadetTunnel *t,
+            struct CadetTunnelQueue *q,
+            uint16_t type, size_t size);
+
+typedef void
+(*GCT_conn_iter) (void *cls, struct CadetConnection *c);
+
 
-typedef void (*GMT_conn_iter) (void *cls, struct CadetConnection *c);
-typedef void (*GMT_chan_iter) (void *cls, struct CadetChannel *ch);
+typedef void
+(*GCT_chan_iter) (void *cls, struct CadetChannel *ch);
 
 
 /******************************************************************************/
@@ -143,22 +167,25 @@ typedef void (*GMT_chan_iter) (void *cls, struct CadetChannel *ch);
  * @param key ECC private key, to derive all other keys and do crypto.
  */
 void
-GMT_init (const struct GNUNET_CONFIGURATION_Handle *c,
+GCT_init (const struct GNUNET_CONFIGURATION_Handle *c,
           const struct GNUNET_CRYPTO_EddsaPrivateKey *key);
 
+
 /**
  * Shut down the tunnel subsystem.
  */
 void
-GMT_shutdown (void);
+GCT_shutdown (void);
+
 
 /**
  * Create a tunnel.
  *
  * @param destination Peer this tunnel is towards.
  */
-struct CadetTunnel3 *
-GMT_new (struct CadetPeer *destination);
+struct CadetTunnel *
+GCT_new (struct CadetPeer *destination);
+
 
 /**
  * Tunnel is empty: destroy it.
@@ -168,7 +195,8 @@ GMT_new (struct CadetPeer *destination);
  * @param t Tunnel to destroy.
  */
 void
-GMT_destroy_empty (struct CadetTunnel3 *t);
+GCT_destroy_empty (struct CadetTunnel *t);
+
 
 /**
  * Destroy tunnel if empty (no more channels).
@@ -176,7 +204,8 @@ GMT_destroy_empty (struct CadetTunnel3 *t);
  * @param t Tunnel to destroy if empty.
  */
 void
-GMT_destroy_if_empty (struct CadetTunnel3 *t);
+GCT_destroy_if_empty (struct CadetTunnel *t);
+
 
 /**
  * Destroy the tunnel.
@@ -190,7 +219,7 @@ GMT_destroy_if_empty (struct CadetTunnel3 *t);
  * @param t The tunnel to destroy.
  */
 void
-GMT_destroy (struct CadetTunnel3 *t);
+GCT_destroy (struct CadetTunnel *t);
 
 
 /**
@@ -200,7 +229,7 @@ GMT_destroy (struct CadetTunnel3 *t);
  * @param cstate New connection state.
  */
 void
-GMT_change_cstate (struct CadetTunnel3* t, enum CadetTunnel3CState cstate);
+GCT_change_cstate (struct CadetTunnel* t, enum CadetTunnelCState cstate);
 
 
 /**
@@ -210,7 +239,8 @@ GMT_change_cstate (struct CadetTunnel3* t, enum CadetTunnel3CState cstate);
  * @param state New encryption state.
  */
 void
-GMT_change_estate (struct CadetTunnel3* t, enum CadetTunnel3EState state);
+GCT_change_estate (struct CadetTunnel* t, enum CadetTunnelEState state);
+
 
 /**
  * Add a connection to a tunnel.
@@ -219,16 +249,8 @@ GMT_change_estate (struct CadetTunnel3* t, enum CadetTunnel3EState state);
  * @param c Connection.
  */
 void
-GMT_add_connection (struct CadetTunnel3 *t, struct CadetConnection *c);
+GCT_add_connection (struct CadetTunnel *t, struct CadetConnection *c);
 
-/**
- * Mark a path as no longer valid for this tunnel: has been tried and failed.
- *
- * @param t Tunnel to update.
- * @param path Invalid path to remove. Is destroyed after removal.
- */
-void
-GMT_remove_path (struct CadetTunnel3 *t, struct CadetPeerPath *path);
 
 /**
  * Remove a connection from a tunnel.
@@ -237,7 +259,8 @@ GMT_remove_path (struct CadetTunnel3 *t, struct CadetPeerPath *path);
  * @param c Connection.
  */
 void
-GMT_remove_connection (struct CadetTunnel3 *t, struct CadetConnection *c);
+GCT_remove_connection (struct CadetTunnel *t, struct CadetConnection *c);
+
 
 /**
  * Add a channel to a tunnel.
@@ -246,7 +269,8 @@ GMT_remove_connection (struct CadetTunnel3 *t, struct CadetConnection *c);
  * @param ch Channel.
  */
 void
-GMT_add_channel (struct CadetTunnel3 *t, struct CadetChannel *ch);
+GCT_add_channel (struct CadetTunnel *t, struct CadetChannel *ch);
+
 
 /**
  * Remove a channel from a tunnel.
@@ -255,40 +279,44 @@ GMT_add_channel (struct CadetTunnel3 *t, struct CadetChannel *ch);
  * @param ch Channel.
  */
 void
-GMT_remove_channel (struct CadetTunnel3 *t, struct CadetChannel *ch);
+GCT_remove_channel (struct CadetTunnel *t, struct CadetChannel *ch);
+
 
 /**
  * Search for a channel by global ID.
  *
  * @param t Tunnel containing the channel.
- * @param chid Public channel number.
+ * @param ctn Public channel number.
  *
  * @return channel handler, NULL if doesn't exist
  */
 struct CadetChannel *
-GMT_get_channel (struct CadetTunnel3 *t, CADET_ChannelNumber chid);
+GCT_get_channel (struct CadetTunnel *t, struct GNUNET_CADET_ChannelTunnelNumber ctn);
+
 
 /**
- * Decrypt and demultiplex by message type. Call appropriate handler
- * for a message
- * towards a channel of a local tunnel.
+ * Decrypt and process an encrypted message.
+ *
+ * Calls the appropriate handler for a message in a channel of a local tunnel.
  *
  * @param t Tunnel this message came on.
  * @param msg Message header.
  */
 void
-GMT_handle_encrypted (struct CadetTunnel3 *t,
-                      const struct GNUNET_CADET_Encrypted *msg);
+GCT_handle_encrypted (struct CadetTunnel *t,
+                      const struct GNUNET_CADET_TunnelEncryptedMessage *msg);
+
 
 /**
- * Demultiplex an encapsulated KX message by message type.
+ * Handle a Key eXchange message.
  *
  * @param t Tunnel on which the message came.
- * @param message KX message itself.
+ * @param msg KX message itself.
  */
 void
-GMT_handle_kx (struct CadetTunnel3 *t,
-               const struct GNUNET_MessageHeader *message);
+GCT_handle_kx (struct CadetTunnel *t,
+               const struct GNUNET_CADET_TunnelKeyExchangeMessage *msg);
+
 
 /**
  * @brief Use the given path for the tunnel.
@@ -301,7 +329,19 @@ GMT_handle_kx (struct CadetTunnel3 *t,
  * @return Connection created.
  */
 struct CadetConnection *
-GMT_use_path (struct CadetTunnel3 *t, struct CadetPeerPath *p);
+GCT_use_path (struct CadetTunnel *t, struct CadetPeerPath *p);
+
+
+/**
+ * Count all created connections of a tunnel. Not necessarily ready connections!
+ *
+ * @param t Tunnel on which to count.
+ *
+ * @return Number of connections created, either being established or ready.
+ */
+unsigned int
+GCT_count_any_connections (struct CadetTunnel *t);
+
 
 /**
  * Count established (ready) connections of a tunnel.
@@ -311,7 +351,8 @@ GMT_use_path (struct CadetTunnel3 *t, struct CadetPeerPath *p);
  * @return Number of connections.
  */
 unsigned int
-GMT_count_connections (struct CadetTunnel3 *t);
+GCT_count_connections (struct CadetTunnel *t);
+
 
 /**
  * Count channels of a tunnel.
@@ -321,7 +362,8 @@ GMT_count_connections (struct CadetTunnel3 *t);
  * @return Number of channels.
  */
 unsigned int
-GMT_count_channels (struct CadetTunnel3 *t);
+GCT_count_channels (struct CadetTunnel *t);
+
 
 /**
  * Get the connectivity state of a tunnel.
@@ -330,8 +372,9 @@ GMT_count_channels (struct CadetTunnel3 *t);
  *
  * @return Tunnel's connectivity state.
  */
-enum CadetTunnel3CState
-GMT_get_cstate (struct CadetTunnel3 *t);
+enum CadetTunnelCState
+GCT_get_cstate (struct CadetTunnel *t);
+
 
 /**
  * Get the encryption state of a tunnel.
@@ -340,8 +383,9 @@ GMT_get_cstate (struct CadetTunnel3 *t);
  *
  * @return Tunnel's encryption state.
  */
-enum CadetTunnel3EState
-GMT_get_estate (struct CadetTunnel3 *t);
+enum CadetTunnelEState
+GCT_get_estate (struct CadetTunnel *t);
+
 
 /**
  * Get the maximum buffer space for a tunnel towards a local client.
@@ -351,7 +395,8 @@ GMT_get_estate (struct CadetTunnel3 *t);
  * @return Biggest buffer space offered by any channel in the tunnel.
  */
 unsigned int
-GMT_get_channels_buffer (struct CadetTunnel3 *t);
+GCT_get_channels_buffer (struct CadetTunnel *t);
+
 
 /**
  * Get the total buffer space for a tunnel for P2P traffic.
@@ -361,7 +406,8 @@ GMT_get_channels_buffer (struct CadetTunnel3 *t);
  * @return Buffer space offered by all connections in the tunnel.
  */
 unsigned int
-GMT_get_connections_buffer (struct CadetTunnel3 *t);
+GCT_get_connections_buffer (struct CadetTunnel *t);
+
 
 /**
  * Get the tunnel's destination.
@@ -371,7 +417,8 @@ GMT_get_connections_buffer (struct CadetTunnel3 *t);
  * @return ID of the destination peer.
  */
 const struct GNUNET_PeerIdentity *
-GMT_get_destination (struct CadetTunnel3 *t);
+GCT_get_destination (struct CadetTunnel *t);
+
 
 /**
  * Get the tunnel's next free Channel ID.
@@ -380,8 +427,9 @@ GMT_get_destination (struct CadetTunnel3 *t);
  *
  * @return ID of a channel free to use.
  */
-CADET_ChannelNumber
-GMT_get_next_chid (struct CadetTunnel3 *t);
+struct GNUNET_CADET_ChannelTunnelNumber
+GCT_get_next_ctn (struct CadetTunnel *t);
+
 
 /**
  * Send ACK on one or more channels due to buffer in connections.
@@ -389,7 +437,8 @@ GMT_get_next_chid (struct CadetTunnel3 *t);
  * @param t Channel which has some free buffer space.
  */
 void
-GMT_unchoke_channels (struct CadetTunnel3 *t);
+GCT_unchoke_channels (struct CadetTunnel *t);
+
 
 /**
  * Send ACK on one or more connections due to buffer space to the client.
@@ -399,7 +448,8 @@ GMT_unchoke_channels (struct CadetTunnel3 *t);
  * @param t Tunnel which has some free buffer space.
  */
 void
-GMT_send_connection_acks (struct CadetTunnel3 *t);
+GCT_send_connection_acks (struct CadetTunnel *t);
+
 
 /**
  * Cancel a previously sent message while it's in the queue.
@@ -411,7 +461,19 @@ GMT_send_connection_acks (struct CadetTunnel3 *t);
  * @param q Handle to the queue.
  */
 void
-GMT_cancel (struct CadetTunnel3Queue *q);
+GCT_cancel (struct CadetTunnelQueue *q);
+
+
+/**
+ * Check if the tunnel has queued traffic.
+ *
+ * @param t Tunnel to check.
+ *
+ * @return #GNUNET_YES if there is queued traffic
+ *         #GNUNET_NO otherwise
+ */
+int
+GCT_has_queued_traffic (struct CadetTunnel *t);
 
 /**
  * Sends an already built message on a tunnel, encrypting it and
@@ -426,10 +488,21 @@ GMT_cancel (struct CadetTunnel3Queue *q);
  *
  * @return Handle to cancel message. NULL if @c cont is NULL.
  */
-struct CadetTunnel3Queue *
-GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
-                           struct CadetTunnel3 *t, struct CadetConnection *c,
-                           int force, GMT_sent cont, void *cont_cls);
+struct CadetTunnelQueue *
+GCT_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
+                           struct CadetTunnel *t, struct CadetConnection *c,
+                           int force, GCT_sent cont, void *cont_cls);
+
+
+/**
+ * Send a KX message.
+ *
+ * @param t Tunnel on which to send it.
+ * @param force_reply Force the other peer to reply with a KX message.
+ */
+void
+GCT_send_kx (struct CadetTunnel *t, int force_reply);
+
 
 /**
  * Is the tunnel directed towards the local peer?
@@ -439,7 +512,8 @@ GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
  * @return #GNUNET_YES if it is loopback.
  */
 int
-GMT_is_loopback (const struct CadetTunnel3 *t);
+GCT_is_loopback (const struct CadetTunnel *t);
+
 
 /**
  * Is the tunnel using this path already?
@@ -450,7 +524,8 @@ GMT_is_loopback (const struct CadetTunnel3 *t);
  * @return #GNUNET_YES a connection uses this path.
  */
 int
-GMT_is_path_used (const struct CadetTunnel3 *t, const struct CadetPeerPath *p);
+GCT_is_path_used (const struct CadetTunnel *t, const struct CadetPeerPath *p);
+
 
 /**
  * Get a cost of a path for a tunnel considering existing connections.
@@ -461,9 +536,10 @@ GMT_is_path_used (const struct CadetTunnel3 *t, const struct CadetPeerPath *p);
  * @return Cost of the path (path length + number of overlapping nodes)
  */
 unsigned int
-GMT_get_path_cost (const struct CadetTunnel3 *t,
+GCT_get_path_cost (const struct CadetTunnel *t,
                    const struct CadetPeerPath *path);
 
+
 /**
  * Get the static string for the peer this tunnel is directed.
  *
@@ -472,15 +548,18 @@ GMT_get_path_cost (const struct CadetTunnel3 *t,
  * @return Static string the destination peer's ID.
  */
 const char *
-GMT_2s (const struct CadetTunnel3 *t);
+GCT_2s (const struct CadetTunnel *t);
+
 
 /**
  * Log all possible info about the tunnel state.
  *
  * @param t Tunnel to debug.
+ * @param level Debug level to use.
  */
 void
-GMT_debug (const struct CadetTunnel3 *t);
+GCT_debug (const struct CadetTunnel *t, enum GNUNET_ErrorType level);
+
 
 /**
  * Iterate all tunnels.
@@ -489,7 +568,8 @@ GMT_debug (const struct CadetTunnel3 *t);
  * @param cls Closure for @c iter.
  */
 void
-GMT_iterate_all (GNUNET_CONTAINER_PeerMapIterator iter, void *cls);
+GCT_iterate_all (GNUNET_CONTAINER_PeerMapIterator iter, void *cls);
+
 
 /**
  * Count all tunnels.
@@ -497,7 +577,8 @@ GMT_iterate_all (GNUNET_CONTAINER_PeerMapIterator iter, void *cls);
  * @return Number of tunnels to remote peers kept by this peer.
  */
 unsigned int
-GMT_count_all (void);
+GCT_count_all (void);
+
 
 /**
  * Iterate all connections of a tunnel.
@@ -507,7 +588,8 @@ GMT_count_all (void);
  * @param cls Closure for @c iter.
  */
 void
-GMT_iterate_connections (struct CadetTunnel3 *t, GMT_conn_iter iter, void *cls);
+GCT_iterate_connections (struct CadetTunnel *t, GCT_conn_iter iter, void *cls);
+
 
 /**
  * Iterate all channels of a tunnel.
@@ -517,7 +599,10 @@ GMT_iterate_connections (struct CadetTunnel3 *t, GMT_conn_iter iter, void *cls);
  * @param cls Closure for @c iter.
  */
 void
-GMT_iterate_channels (struct CadetTunnel3 *t, GMT_chan_iter iter, void *cls);
+GCT_iterate_channels (struct CadetTunnel *t,
+                      GCT_chan_iter iter,
+                      void *cls);
+
 
 #if 0                           /* keep Emacsens' auto-indent happy */
 {