/*
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
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.
*/
/**
#include "platform.h"
#include "gnunet_util_lib.h"
+#define CONNECTIONS_PER_TUNNEL 3
+
/**
* All the connectivity states a tunnel can be in.
*/
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
};
/**
* 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. 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. Opposite to KEY_PING,
+ * 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_TUNNEL3_KEY_REKEY,
+ CADET_TUNNEL_KEY_REKEY
};
/**
* @param type Type of message sent.
* @param size Size of the message.
*/
-typedef void (*GCT_sent) (void *cls,
- struct CadetTunnel *t,
- struct CadetTunnelQueue *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 (*GCT_conn_iter) (void *cls, struct CadetConnection *c);
-typedef void (*GCT_chan_iter) (void *cls, struct CadetChannel *ch);
+typedef void
+(*GCT_chan_iter) (void *cls, struct CadetChannel *ch);
/******************************************************************************/
GCT_init (const struct GNUNET_CONFIGURATION_Handle *c,
const struct GNUNET_CRYPTO_EddsaPrivateKey *key);
+
/**
* Shut down the tunnel subsystem.
*/
void
GCT_shutdown (void);
+
/**
* Create a tunnel.
*
struct CadetTunnel *
GCT_new (struct CadetPeer *destination);
+
/**
* Tunnel is empty: destroy it.
*
void
GCT_destroy_empty (struct CadetTunnel *t);
+
/**
* Destroy tunnel if empty (no more channels).
*
void
GCT_destroy_if_empty (struct CadetTunnel *t);
+
/**
* Destroy the tunnel.
*
void
GCT_change_estate (struct CadetTunnel* t, enum CadetTunnelEState state);
+
/**
* Add a connection to a tunnel.
*
void
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
-GCT_remove_path (struct CadetTunnel *t, struct CadetPeerPath *path);
/**
* Remove a connection from a tunnel.
void
GCT_remove_connection (struct CadetTunnel *t, struct CadetConnection *c);
+
/**
* Add a channel to a tunnel.
*
void
GCT_add_channel (struct CadetTunnel *t, struct CadetChannel *ch);
+
/**
* Remove a channel from a tunnel.
*
void
GCT_remove_channel (struct CadetTunnel *t, struct CadetChannel *ch);
+
/**
* Search for a channel by global ID.
*
struct CadetChannel *
GCT_get_channel (struct CadetTunnel *t, CADET_ChannelNumber chid);
+
/**
* Decrypt and demultiplex by message type. Call appropriate handler
- * for a message
- * towards a channel of a local tunnel.
+ * for a message towards a channel of a local tunnel.
*
* @param t Tunnel this message came on.
* @param msg Message header.
*/
void
GCT_handle_encrypted (struct CadetTunnel *t,
- const struct GNUNET_CADET_Encrypted *msg);
+ const struct GNUNET_MessageHeader *msg);
+
/**
* Demultiplex an encapsulated KX message by message type.
GCT_handle_kx (struct CadetTunnel *t,
const struct GNUNET_MessageHeader *message);
+
/**
* @brief Use the given path for the tunnel.
* Update the next and prev hops (and RCs).
struct CadetConnection *
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.
*
unsigned int
GCT_count_connections (struct CadetTunnel *t);
+
/**
* Count channels of a tunnel.
*
unsigned int
GCT_count_channels (struct CadetTunnel *t);
+
/**
* Get the connectivity state of a tunnel.
*
enum CadetTunnelCState
GCT_get_cstate (struct CadetTunnel *t);
+
/**
* Get the encryption state of a tunnel.
*
enum CadetTunnelEState
GCT_get_estate (struct CadetTunnel *t);
+
/**
* Get the maximum buffer space for a tunnel towards a local client.
*
unsigned int
GCT_get_channels_buffer (struct CadetTunnel *t);
+
/**
* Get the total buffer space for a tunnel for P2P traffic.
*
unsigned int
GCT_get_connections_buffer (struct CadetTunnel *t);
+
/**
* Get the tunnel's destination.
*
const struct GNUNET_PeerIdentity *
GCT_get_destination (struct CadetTunnel *t);
+
/**
* Get the tunnel's next free Channel ID.
*
CADET_ChannelNumber
GCT_get_next_chid (struct CadetTunnel *t);
+
/**
* Send ACK on one or more channels due to buffer in connections.
*
void
GCT_unchoke_channels (struct CadetTunnel *t);
+
/**
* Send ACK on one or more connections due to buffer space to the client.
*
void
GCT_send_connection_acks (struct CadetTunnel *t);
+
/**
* Cancel a previously sent message while it's in the queue.
*
void
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
* choosing the best connection.
struct CadetTunnel *t, struct CadetConnection *c,
int force, GCT_sent cont, void *cont_cls);
+
+/**
+ * Send an Axolotl 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_ax_kx (struct CadetTunnel *t, int force_reply);
+
+
/**
* Is the tunnel directed towards the local peer?
*
int
GCT_is_loopback (const struct CadetTunnel *t);
+
/**
* Is the tunnel using this path already?
*
int
GCT_is_path_used (const struct CadetTunnel *t, const struct CadetPeerPath *p);
+
/**
* Get a cost of a path for a tunnel considering existing connections.
*
GCT_get_path_cost (const struct CadetTunnel *t,
const struct CadetPeerPath *path);
+
/**
* Get the static string for the peer this tunnel is directed.
*
const char *
GCT_2s (const struct CadetTunnel *t);
+
/**
* Log all possible info about the tunnel state.
*
void
GCT_debug (const struct CadetTunnel *t, enum GNUNET_ErrorType level);
+
/**
* Iterate all tunnels.
*
void
GCT_iterate_all (GNUNET_CONTAINER_PeerMapIterator iter, void *cls);
+
/**
* Count all tunnels.
*
unsigned int
GCT_count_all (void);
+
/**
* Iterate all connections of a tunnel.
*
void
GCT_iterate_connections (struct CadetTunnel *t, GCT_conn_iter iter, void *cls);
+
/**
* Iterate all channels of a tunnel.
*
* @param cls Closure for @c iter.
*/
void
-GCT_iterate_channels (struct CadetTunnel *t, GCT_chan_iter iter, void *cls);
+GCT_iterate_channels (struct CadetTunnel *t,
+ GCT_chan_iter iter,
+ void *cls);
+
#if 0 /* keep Emacsens' auto-indent happy */
{