clean up for configs
[oweals/gnunet.git] / src / mesh / gnunet-service-mesh_connection.h
index a617054ffa3fbfebb27bd8fb7283c6d739f4d441..f4722a6fce8ac3bf990cb931a5ef67144d36136b 100644 (file)
@@ -64,6 +64,11 @@ enum MeshConnectionState
    * Connection confirmed, ready to carry traffic.
    */
   MESH_CONNECTION_READY,
+
+  /**
+   * Connection to be destroyed, just waiting to empty queues.
+   */
+  MESH_CONNECTION_DESTROYED,
 };
 
 
@@ -72,12 +77,31 @@ enum MeshConnectionState
  */
 struct MeshConnection;
 
+/**
+ * Handle for messages queued but not yet sent.
+ */
+struct MeshConnectionQueue;
+
 #include "mesh_path.h"
 #include "gnunet-service-mesh_channel.h"
 #include "gnunet-service-mesh_peer.h"
 
 
 
+/**
+ * Callback called when a queued message is sent.
+ *
+ * @param cls Closure.
+ * @param c Connection this message was on.
+ * @param type Type of message sent.
+ * @param fwd Was this a FWD going message?
+ * @param size Size of the message.
+ */
+typedef void (*GMC_sent) (void *cls,
+                          struct MeshConnection *c,
+                          struct MeshConnectionQueue *q,
+                          uint16_t type, int fwd, size_t size);
+
 /**
  * Core handler for connection creation.
  *
@@ -136,7 +160,7 @@ GMC_handle_destroy (void *cls, const struct GNUNET_PeerIdentity *peer,
                     const struct GNUNET_MessageHeader *message);
 
 /**
- * Core handler for mesh network traffic going orig->dest.
+ * Core handler for encrypted mesh network traffic (channel mgmt, data).
  *
  * @param cls Closure (unused).
  * @param message Message received.
@@ -146,12 +170,11 @@ GMC_handle_destroy (void *cls, const struct GNUNET_PeerIdentity *peer,
  *         GNUNET_SYSERR to close it (signal serious error)
  */
 int
-GMC_handle_fwd (void *cls, const struct GNUNET_PeerIdentity *peer,
-                const struct GNUNET_MessageHeader *message);
-
+GMC_handle_encrypted (void *cls, const struct GNUNET_PeerIdentity *peer,
+                      const struct GNUNET_MessageHeader *message);
 
 /**
- * Core handler for mesh network traffic going dest->orig.
+ * Core handler for key exchange traffic (ephemeral key, ping, pong).
  *
  * @param cls Closure (unused).
  * @param message Message received.
@@ -161,8 +184,8 @@ GMC_handle_fwd (void *cls, const struct GNUNET_PeerIdentity *peer,
  *         GNUNET_SYSERR to close it (signal serious error)
  */
 int
-GMC_handle_bck (void *cls, const struct GNUNET_PeerIdentity *peer,
-                const struct GNUNET_MessageHeader *message);
+GMC_handle_kx (void *cls, const struct GNUNET_PeerIdentity *peer,
+               const struct GNUNET_MessageHeader *message);
 
 /**
  * Core handler for mesh network traffic point-to-point acks.
@@ -212,11 +235,11 @@ GMC_handle_keepalive (void *cls, const struct GNUNET_PeerIdentity *peer,
  * the direction and the position of the peer.
  *
  * @param c Which connection to send the hop-by-hop ACK.
- * @param ch Channel, if any.
- * @param fwd Is this a fwd ACK? (will go dest->root)
+ * @param fwd Is this a fwd ACK? (will go dest->root).
+ * @param force Send the ACK even if suboptimal (e.g. requested by POLL).
  */
 void
-GMC_send_ack (struct MeshConnection *c, struct MeshChannel *ch, int fwd);
+GMC_send_ack (struct MeshConnection *c, int fwd, int force);
 
 /**
  * Initialize the connections subsystem
@@ -239,6 +262,8 @@ GMC_shutdown (void);
  * @param t Tunnel this connection belongs to (or NULL);
  * @param p Path this connection has to use.
  * @param own_pos Own position in the @c p path.
+ *
+ * @return Newly created connection, NULL in case of error (own id not in path).
  */
 struct MeshConnection *
 GMC_new (const struct GNUNET_HashCode *cid,
@@ -247,7 +272,10 @@ GMC_new (const struct GNUNET_HashCode *cid,
          unsigned int own_pos);
 
 /**
- * Connection is no longer needed: destroy it and remove from tunnel.
+ * Connection is no longer needed: destroy it.
+ *
+ * Cancels all pending traffic (including possible DESTROY messages), all
+ * maintenance tasks and removes the connection from neighbor peers and tunnel.
  *
  * @param c Connection to destroy.
  */
@@ -306,7 +334,7 @@ unsigned int
 GMC_get_buffer (struct MeshConnection *c, int fwd);
 
 /**
- * Get how many messages have we allowed to send to us from a direction..
+ * Get how many messages have we allowed to send to us from a direction.
  *
  * @param c Connection.
  * @param fwd Are we asking about traffic from FWD (BCK messages)?
@@ -327,6 +355,19 @@ GMC_get_allowed (struct MeshConnection *c, int fwd);
 unsigned int
 GMC_get_qn (struct MeshConnection *c, int fwd);
 
+/**
+ * Allow the connection to advertise a buffer of the given size.
+ *
+ * The connection will send an @c fwd ACK message (so: in direction !fwd)
+ * allowing up to last_pid_recv + buffer.
+ *
+ * @param c Connection.
+ * @param buffer How many more messages the connection can accept.
+ * @param fwd Is this about FWD traffic? (The ack will go dest->root).
+ */
+void
+GMC_allow (struct MeshConnection *c, unsigned int buffer, int fwd);
+
 /**
  * Send FWD keepalive packets for a connection.
  *
@@ -363,7 +404,7 @@ GMC_notify_broken (struct MeshConnection *c,
  * @param c Connection.
  * @param fwd Is this about fwd traffic?
  *
- * @return GNUNET_YES if origin, GNUNET_NO if relay/terminal.
+ * @return #GNUNET_YES if origin, #GNUNET_NO if relay/terminal.
  */
 int
 GMC_is_origin (struct MeshConnection *c, int fwd);
@@ -375,7 +416,7 @@ GMC_is_origin (struct MeshConnection *c, int fwd);
  * @param fwd Is this about fwd traffic?
  *            Note that the ROOT is the terminal for BCK traffic!
  *
- * @return GNUNET_YES if terminal, GNUNET_NO if relay/origin.
+ * @return #GNUNET_YES if terminal, #GNUNET_NO if relay/origin.
  */
 int
 GMC_is_terminal (struct MeshConnection *c, int fwd);
@@ -386,11 +427,23 @@ GMC_is_terminal (struct MeshConnection *c, int fwd);
  * @param c Connection.
  * @param fwd Is this about fwd traffic?
  *
- * @return GNUNET_YES in case it's OK.
+ * @return #GNUNET_YES in case it's OK to send.
  */
 int
 GMC_is_sendable (struct MeshConnection *c, int fwd);
 
+/**
+ * Cancel a previously sent message while it's in the queue.
+ *
+ * ONLY can be called before the continuation given to the send function
+ * is called. Once the continuation is called, the message is no longer in the
+ * queue.
+ *
+ * @param q Handle to the queue.
+ */
+void
+GMC_cancel (struct MeshConnectionQueue *q);
+
 /**
  * Sends an already built message on a connection, properly registering
  * all used resources.
@@ -398,14 +451,19 @@ GMC_is_sendable (struct MeshConnection *c, int fwd);
  * @param message Message to send. Function makes a copy of it.
  *                If message is not hop-by-hop, decrements TTL of copy.
  * @param c Connection on which this message is transmitted.
- * @param ch Channel on which this message is transmitted, or NULL.
  * @param fwd Is this a fwd message?
+ * @param force Force the connection to accept the message (buffer overfill).
+ * @param cont Continuation called once message is sent. Can be NULL.
+ * @param cont_cls Closure for @c cont.
+ *
+ * @return Handle to cancel the message before it's sent.
+ *         NULL on error or if @c cont is NULL.
+ *         Invalid on @c cont call.
  */
-void
+struct MeshConnectionQueue *
 GMC_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
-                           struct MeshConnection *c,
-                           struct MeshChannel *ch,
-                           int fwd);
+                           struct MeshConnection *c, int fwd, int force,
+                           GMC_sent cont, void *cont_cls);
 
 /**
  * Sends a CREATE CONNECTION message for a path to a peer.
@@ -453,6 +511,14 @@ GMC_start_poll (struct MeshConnection *c, int fwd);
 void
 GMC_stop_poll (struct MeshConnection *c, int fwd);
 
+/**
+ * Get a (static) string for a connection.
+ *
+ * @param c Connection.
+ */
+const char *
+GMC_2s (const struct MeshConnection *c);
+
 #if 0                           /* keep Emacsens' auto-indent happy */
 {
 #endif