#include "gnunet_util_lib.h"
/**
- * All the states a tunnel can be in.
+ * All the connectivity states a tunnel can be in.
*/
-enum MeshTunnel3State
+enum MeshTunnel3CState
{
/**
* Uninitialized status, should never appear in operation.
*/
MESH_TUNNEL3_WAITING,
- /**
- * Ephemeral key sent, waiting for peer's key.
- */
- MESH_TUNNEL3_KEY_SENT,
-
/**
* Peer connected and ready to accept data.
*/
MESH_TUNNEL3_READY,
- /**
- * Peer connected previosly but not responding.
- */
- MESH_TUNNEL3_RECONNECTING,
+ /**
+ * Tunnel being shut down, don't try to keep it alive.
+ */
+ MESH_TUNNEL3_SHUTDOWN
+};
- /**
- * 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.
- */
- MESH_TUNNEL3_REKEY,
+
+/**
+ * All the encryption states a tunnel can be in.
+ */
+enum MeshTunnel3EState
+{
+ /**
+ * Uninitialized status, should never appear in operation.
+ */
+ MESH_TUNNEL3_KEY_UNINITIALIZED,
+
+ /**
+ * Ephemeral key sent, waiting for peer's key.
+ */
+ MESH_TUNNEL3_KEY_SENT,
+
+ /**
+ * 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.
+ */
+ MESH_TUNNEL3_KEY_PING,
+
+ /**
+ * Handshake completed: session key available.
+ */
+ MESH_TUNNEL3_KEY_OK,
};
/**
struct MeshTunnel3Queue *q,
uint16_t type, size_t size);
+typedef void (*GMT_conn_iter) (void *cls, struct MeshConnection *c);
+typedef void (*GMT_chan_iter) (void *cls, struct MeshChannel *ch);
+
/******************************************************************************/
/******************************** API ***********************************/
void
GMT_destroy (struct MeshTunnel3 *t);
+
+/**
+ * Change the tunnel's connection state.
+ *
+ * @param t Tunnel whose connection state to change.
+ * @param cstate New connection state.
+ */
+void
+GMT_change_cstate (struct MeshTunnel3* t, enum MeshTunnel3CState cstate);
+
+
/**
- * Change the tunnel state.
+ * Change the tunnel encryption state.
*
- * @param t Tunnel whose state to change.
- * @param state New state.
+ * @param t Tunnel whose encryption state to change.
+ * @param state New encryption state.
*/
void
-GMT_change_state (struct MeshTunnel3* t, enum MeshTunnel3State state);
+GMT_change_estate (struct MeshTunnel3* t, enum MeshTunnel3EState state);
/**
* Add a connection to a tunnel.
void
GMT_add_connection (struct MeshTunnel3 *t, struct MeshConnection *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 MeshTunnel3 *t, struct MeshPeerPath *path);
+
/**
* Remove a connection from a tunnel.
*
GMT_count_channels (struct MeshTunnel3 *t);
/**
- * Get the state of a tunnel.
+ * Get the connectivity state of a tunnel.
+ *
+ * @param t Tunnel.
+ *
+ * @return Tunnel's connectivity state.
+ */
+enum MeshTunnel3CState
+GMT_get_cstate (struct MeshTunnel3 *t);
+
+/**
+ * Get the encryption state of a tunnel.
*
* @param t Tunnel.
*
- * @return Tunnel's state.
+ * @return Tunnel's encryption state.
*/
-enum MeshTunnel3State
-GMT_get_state (struct MeshTunnel3 *t);
+enum MeshTunnel3EState
+GMT_get_estate (struct MeshTunnel3 *t);
/**
* Get the maximum buffer space for a tunnel towards a local client.
*
* @param message Message to send. Function modifies it.
* @param t Tunnel on which this message is transmitted.
- * @param ch Channel on which this message is transmitted.
- * @param fwd Is this a fwd message on @c ch?
+ * @param c Connection to use (autoselect if NULL).
+ * @param force Force the tunnel to take the message (buffer overfill).
* @param cont Continuation to call once message is really sent.
- * @param cls Closure for @c cont.
+ * @param cont_cls Closure for @c cont.
*
* @return Handle to cancel message. NULL if @c cont is NULL.
*/
struct MeshTunnel3Queue *
GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
- struct MeshTunnel3 *t,
- struct MeshChannel *ch, int fwd,
- GMT_sent cont, void *cls);
+ struct MeshTunnel3 *t, struct MeshConnection *c,
+ int force, GMT_sent cont, void *cont_cls);
/**
* Is the tunnel directed towards the local peer?
const char *
GMT_2s (const struct MeshTunnel3 *t);
+/**
+ * Log all possible info about the tunnel state.
+ *
+ * @param t Tunnel to debug.
+ */
+void
+GMT_debug (const struct MeshTunnel3 *t);
+
+/**
+ * Iterate all tunnels.
+ *
+ * @param iter Iterator.
+ * @param cls Closure for @c iter.
+ */
+void
+GMT_iterate_all (GNUNET_CONTAINER_PeerMapIterator iter, void *cls);
+
+/**
+ * Count all tunnels.
+ *
+ * @return Number of tunnels to remote peers kept by this peer.
+ */
+unsigned int
+GMT_count_all (void);
+
+/**
+ * Iterate all connections of a tunnel.
+ *
+ * @param t Tunnel whose connections to iterate.
+ * @param iter Iterator.
+ * @param cls Closure for @c iter.
+ */
+void
+GMT_iterate_connections (struct MeshTunnel3 *t, GMT_conn_iter iter, void *cls);
+
+/**
+ * Iterate all channels of a tunnel.
+ *
+ * @param t Tunnel whose channels to iterate.
+ * @param iter Iterator.
+ * @param cls Closure for @c iter.
+ */
+void
+GMT_iterate_channels (struct MeshTunnel3 *t, GMT_chan_iter iter, void *cls);
+
#if 0 /* keep Emacsens' auto-indent happy */
{
#endif