- debug
[oweals/gnunet.git] / src / mesh / gnunet-service-mesh_connection.h
index 638bda162c0fc33b134466d51f2e8c4cfc09cbca..3fecf3b63276a24445dbeb885ddcbde7e4f4b4a7 100644 (file)
@@ -39,10 +39,6 @@ extern "C"
 
 #include "gnunet_util_lib.h"
 
-#include "mesh_path.h"
-#include "gnunet-service-mesh_channel.h"
-#include "gnunet-service-mesh_peer.h"
-
 
 /**
  * All the states a connection can be in.
@@ -76,6 +72,9 @@ enum MeshConnectionState
  */
 struct MeshConnection;
 
+#include "mesh_path.h"
+#include "gnunet-service-mesh_channel.h"
+#include "gnunet-service-mesh_peer.h"
 
 
 
@@ -111,15 +110,16 @@ GMC_handle_confirm (void *cls, const struct GNUNET_PeerIdentity *peer,
  * Core handler for notifications of broken paths
  *
  * @param cls Closure (unused).
- * @param peer Peer identity of sending neighbor.
+ * @param id Peer identity of sending neighbor.
  * @param message Message.
  *
  * @return GNUNET_OK to keep the connection open,
  *         GNUNET_SYSERR to close it (signal serious error)
  */
 int
-GMC_handle_broken (void *cls, const struct GNUNET_PeerIdentity *peer,
-                   const struct GNUNET_MessageHeader *message);
+GMC_handle_broken (void* cls,
+                   const struct GNUNET_PeerIdentity* id,
+                   const struct GNUNET_MessageHeader* message);
 
 /**
  * Core handler for tunnel destruction
@@ -136,22 +136,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.
- *
- * @param cls Closure (unused).
- * @param message Message received.
- * @param peer Peer who sent the message.
- *
- * @return GNUNET_OK to keep the connection open,
- *         GNUNET_SYSERR to close it (signal serious error)
- */
-int
-GMC_handle_fwd (void *cls, const struct GNUNET_PeerIdentity *peer,
-                const struct GNUNET_MessageHeader *message);
-
-
-/**
- * Core handler for mesh network traffic going dest->orig.
+ * Core handler for encrypted mesh network traffic (channel mgmt, data).
  *
  * @param cls Closure (unused).
  * @param message Message received.
@@ -161,8 +146,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_encrypted (void *cls, const struct GNUNET_PeerIdentity *peer,
+                      const struct GNUNET_MessageHeader *message);
 
 /**
  * Core handler for mesh network traffic point-to-point acks.
@@ -207,6 +192,17 @@ int
 GMC_handle_keepalive (void *cls, const struct GNUNET_PeerIdentity *peer,
                       const struct GNUNET_MessageHeader *message);
 
+/**
+ * Send an ACK on the appropriate connection/channel, depending on
+ * 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)
+ */
+void
+GMC_send_ack (struct MeshConnection *c, struct MeshChannel *ch, int fwd);
+
 /**
  * Initialize the connections subsystem
  *
@@ -243,9 +239,6 @@ GMC_new (const struct GNUNET_HashCode *cid,
 void
 GMC_destroy (struct MeshConnection *c);
 
-struct MeshConnection *
-GMC_next (struct MeshConnection *c);
-
 /**
  * Get the connection ID.
  *
@@ -256,6 +249,16 @@ GMC_next (struct MeshConnection *c);
 const struct GNUNET_HashCode *
 GMC_get_id (const struct MeshConnection *c);
 
+/**
+ * Get the connection path.
+ *
+ * @param c Connection to get the path from.
+ *
+ * @return path used by the connection.
+ */
+const struct MeshPeerPath *
+GMC_get_path (const struct MeshConnection *c);
+
 /**
  * Get the connection state.
  *
@@ -266,6 +269,16 @@ GMC_get_id (const struct MeshConnection *c);
 enum MeshConnectionState
 GMC_get_state (const struct MeshConnection *c);
 
+/**
+ * Get the connection tunnel.
+ *
+ * @param c Connection to get the tunnel from.
+ *
+ * @return tunnel of the connection.
+ */
+struct MeshTunnel3 *
+GMC_get_tunnel (const struct MeshConnection *c);
+
 /**
  * Get free buffer space in a connection.
  *
@@ -277,6 +290,17 @@ GMC_get_state (const struct MeshConnection *c);
 unsigned int
 GMC_get_buffer (struct MeshConnection *c, int fwd);
 
+/**
+ * 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)?
+ *
+ * @return last_ack_sent - last_pid_recv
+ */
+unsigned int
+GMC_get_allowed (struct MeshConnection *c, int fwd);
+
 /**
  * Get messages queued in a connection.
  *
@@ -288,6 +312,19 @@ GMC_get_buffer (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.
  *
@@ -307,27 +344,16 @@ void
 GMC_bck_keepalive (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc);
 
 
-/**
- * Change the tunnel state.
- *
- * @param c Connection whose state to change.
- * @param state New state.
- */
-void
-GMC_change_state (struct MeshConnection* c, enum MeshConnectionState state);
-
 /**
  * Notify other peers on a connection of a broken link. Mark connections
  * to destroy after all traffic has been sent.
  *
  * @param c Connection on which there has been a disconnection.
  * @param peer Peer that disconnected.
- * @param my_full_id My ID (to send to other peers).
  */
 void
 GMC_notify_broken (struct MeshConnection *c,
-                   struct MeshPeer *peer,
-                   struct GNUNET_PeerIdentity *my_full_id);
+                   struct MeshPeer *peer);
 
 /**
  * Is this peer the first one on the connection?
@@ -352,6 +378,17 @@ GMC_is_origin (struct MeshConnection *c, int fwd);
 int
 GMC_is_terminal (struct MeshConnection *c, int fwd);
 
+/**
+ * See if we are allowed to send by the next hop in the given direction.
+ *
+ * @param c Connection.
+ * @param fwd Is this about fwd traffic?
+ *
+ * @return GNUNET_YES in case it's OK.
+ */
+int
+GMC_is_sendable (struct MeshConnection *c, int fwd);
+
 /**
  * Sends an already built message on a connection, properly registering
  * all used resources.
@@ -368,6 +405,15 @@ GMC_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
                            struct MeshChannel *ch,
                            int fwd);
 
+/**
+ * Sends a CREATE CONNECTION message for a path to a peer.
+ * Changes the connection and tunnel states if necessary.
+ *
+ * @param connection Connection to create.
+ */
+void
+GMC_send_create (struct MeshConnection *connection);
+
 /**
  * Send a message to all peers in this connection that the connection
  * is no longer valid.
@@ -380,6 +426,31 @@ GMC_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
 void
 GMC_send_destroy (struct MeshConnection *c);
 
+/**
+ * @brief Start a polling timer for the connection.
+ *
+ * When a neighbor does not accept more traffic on the connection it could be
+ * caused by a simple congestion or by a lost ACK. Polling enables to check
+ * for the lastest ACK status for a connection.
+ *
+ * @param c Connection.
+ * @param fwd Should we poll in the FWD direction?
+ */
+void
+GMC_start_poll (struct MeshConnection *c, int fwd);
+
+
+/**
+ * @brief Stop polling a connection for ACKs.
+ *
+ * Once we have enough ACKs for future traffic, polls are no longer necessary.
+ *
+ * @param c Connection.
+ * @param fwd Should we stop the poll in the FWD direction?
+ */
+void
+GMC_stop_poll (struct MeshConnection *c, int fwd);
+
 #if 0                           /* keep Emacsens' auto-indent happy */
 {
 #endif
@@ -389,4 +460,4 @@ GMC_send_destroy (struct MeshConnection *c);
 
 /* ifndef GNUNET_SERVICE_MESH_CONNECTION_H */
 #endif
-/* end of gnunet-service-mesh_connection.h */
\ No newline at end of file
+/* end of gnunet-service-mesh_connection.h */