set: destroy client mq properly
[oweals/gnunet.git] / src / set / set.h
index 8527b6abb8eef1792083f8820547a57461129518..258e2bff9de2c69abf40c03fddab46aeef18743e 100644 (file)
@@ -1,10 +1,10 @@
 /*
      This file is part of GNUnet.
 /*
      This file is part of GNUnet.
-     (C) 2012, 2013 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2012-2014 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
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
 
      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.
 */
 */
-
 /**
 /**
- * @author Florian Dold
  * @file set/set.h
  * @brief messages used for the set api
  * @file set/set.h
  * @brief messages used for the set api
+ * @author Florian Dold
+ * @author Christian Grothoff
  */
 #ifndef SET_H
 #define SET_H
 
 #include "platform.h"
 #include "gnunet_common.h"
  */
 #ifndef SET_H
 #define SET_H
 
 #include "platform.h"
 #include "gnunet_common.h"
-
-#define GNUNET_SET_ACK_WINDOW 10
-
+#include "gnunet_set_service.h"
 
 GNUNET_NETWORK_STRUCT_BEGIN
 
 
 GNUNET_NETWORK_STRUCT_BEGIN
 
+/**
+ * Message sent by the client to the service to ask starting
+ * a new set to perform operations with.  Includes the desired
+ * set operation type.
+ */
 struct GNUNET_SET_CreateMessage
 {
   /**
 struct GNUNET_SET_CreateMessage
 {
   /**
-   * Type: GNUNET_MESSAGE_TYPE_SET_CREATE
+   * Type: #GNUNET_MESSAGE_TYPE_SET_CREATE
    */
   struct GNUNET_MessageHeader header;
 
   /**
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * Operation type, values of enum GNUNET_SET_OperationType
+   * Operation type, values of `enum GNUNET_SET_OperationType`
    */
    */
-  // FIXME: use 32_t for 'enum'.
-  uint16_t operation GNUNET_PACKED;
+  uint32_t operation GNUNET_PACKED;
 };
 
 
 };
 
 
+/**
+ * Message sent by the client to the service to start listening for
+ * incoming requests to perform a certain type of set operation for a
+ * certain type of application.
+ */
 struct GNUNET_SET_ListenMessage
 {
   /**
 struct GNUNET_SET_ListenMessage
 {
   /**
-   * Type: GNUNET_MESSAGE_TYPE_SET_LISTEN
+   * Type: #GNUNET_MESSAGE_TYPE_SET_LISTEN
    */
   struct GNUNET_MessageHeader header;
 
   /**
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * Operation type, values of enum GNUNET_SET_OperationType
+   * Operation type, values of `enum GNUNET_SET_OperationType`
    */
   uint32_t operation GNUNET_PACKED;
 
    */
   uint32_t operation GNUNET_PACKED;
 
@@ -69,41 +76,87 @@ struct GNUNET_SET_ListenMessage
 };
 
 
 };
 
 
-struct GNUNET_SET_AcceptRejectMessage
+/**
+ * Message sent by a listening client to the service to accept
+ * performing the operation with the other peer.
+ */
+struct GNUNET_SET_AcceptMessage
 {
   /**
 {
   /**
-   * Type: GNUNET_MESSAGE_TYPE_SET_ACCEPT or
-   *       GNUNET_MESSAGE_TYPE_SET_REJECT
+   * Type: #GNUNET_MESSAGE_TYPE_SET_ACCEPT
    */
   struct GNUNET_MessageHeader header;
 
   /**
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * ID of the incoming request we want to accept / reject.
+   * ID of the incoming request we want to accept.
    */
   uint32_t accept_reject_id GNUNET_PACKED;
 
   /**
    */
   uint32_t accept_reject_id GNUNET_PACKED;
 
   /**
-   * Request ID to identify responses,
-   * must be 0 if we don't accept the request.
+   * Request ID to identify responses.
    */
   uint32_t request_id GNUNET_PACKED;
    */
   uint32_t request_id GNUNET_PACKED;
+
+  /**
+   * How should results be sent to us?
+   * See `enum GNUNET_SET_ResultMode`.
+   */
+  uint32_t result_mode GNUNET_PACKED;
+
+  /**
+   * Always use delta operation instead of sending full sets,
+   * even it it's less efficient.
+   */
+  uint8_t force_delta;
+
+  /**
+   * Always send full sets, even if delta operations would
+   * be more efficient.
+   */
+  uint8_t force_full;
+
+  /**
+   * #GNUNET_YES to fail operations where Byzantine faults
+   * are suspected
+   */
+  uint8_t byzantine;
+
+  /**
+   * Lower bound for the set size, used only when
+   * byzantine mode is enabled.
+   */
+  uint8_t byzantine_lower_bound;
 };
 
 
 /**
 };
 
 
 /**
- * A request for an operation with another client.
+ * Message sent by a listening client to the service to reject
+ * performing the operation with the other peer.
  */
  */
-struct GNUNET_SET_RequestMessage
+struct GNUNET_SET_RejectMessage
 {
   /**
 {
   /**
-   * Type: GNUNET_MESSAGE_TYPE_SET_Request.
+   * Type: #GNUNET_MESSAGE_TYPE_SET_REJECT
    */
   struct GNUNET_MessageHeader header;
 
   /**
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * Identity of the requesting peer.
+   * ID of the incoming request we want to reject.
    */
    */
-  struct GNUNET_PeerIdentity peer_id;
+  uint32_t accept_reject_id GNUNET_PACKED;
+
+};
+
+
+/**
+ * A request for an operation with another client.
+ */
+struct GNUNET_SET_RequestMessage
+{
+  /**
+   * Type: #GNUNET_MESSAGE_TYPE_SET_REQUEST.
+   */
+  struct GNUNET_MessageHeader header;
 
   /**
    * ID of the to identify the request when accepting or
 
   /**
    * ID of the to identify the request when accepting or
@@ -111,21 +164,33 @@ struct GNUNET_SET_RequestMessage
    */
   uint32_t accept_id GNUNET_PACKED;
 
    */
   uint32_t accept_id GNUNET_PACKED;
 
-  /* rest: nested context message */
+  /**
+   * Identity of the requesting peer.
+   */
+  struct GNUNET_PeerIdentity peer_id;
+
+  /* rest: context message, that is, application-specific
+     message to convince listener to pick up */
 };
 
 
 };
 
 
+/**
+ * Message sent by client to service to initiate a set operation as a
+ * client (not as listener).  A set (which determines the operation
+ * type) must already exist in association with this client.
+ */
 struct GNUNET_SET_EvaluateMessage
 {
   /**
 struct GNUNET_SET_EvaluateMessage
 {
   /**
-   * Type: GNUNET_MESSAGE_TYPE_SET_EVALUATE
+   * Type: #GNUNET_MESSAGE_TYPE_SET_EVALUATE
    */
   struct GNUNET_MessageHeader header;
 
   /**
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * id of our evaluate, chosen by the client
+   * How should results be sent to us?
+   * See `enum GNUNET_SET_ResultMode`.
    */
    */
-  uint32_t request_id GNUNET_PACKED;
+  uint32_t result_mode GNUNET_PACKED;
 
   /**
    * Peer to evaluate the operation with
 
   /**
    * Peer to evaluate the operation with
@@ -138,39 +203,71 @@ struct GNUNET_SET_EvaluateMessage
   struct GNUNET_HashCode app_id;
 
   /**
   struct GNUNET_HashCode app_id;
 
   /**
-   * Salt to use for the operation
+   * Id of our set to evaluate, chosen implicitly by the client when it
+   * calls #GNUNET_SET_commit().
    */
    */
-  uint16_t salt GNUNET_PACKED;
+  uint32_t request_id GNUNET_PACKED;
 
   /**
 
   /**
-   * Padding
+   * Always use delta operation instead of sending full sets,
+   * even it it's less efficient.
    */
    */
-  uint16_t reserved GNUNET_PACKED;
+  uint8_t force_delta;
+
+  /**
+   * Always send full sets, even if delta operations would
+   * be more efficient.
+   */
+  uint8_t force_full;
+
+  /**
+   * #GNUNET_YES to fail operations where Byzantine faults
+   * are suspected
+   */
+  uint8_t byzantine;
+
+  /**
+   * Lower bound for the set size, used only when
+   * byzantine mode is enabled.
+   */
+  uint8_t byzantine_lower_bound;
 
 
-  /* rest: inner message */
+  /* rest: context message, that is, application-specific
+     message to convince listener to pick up */
 };
 
 
 };
 
 
+/**
+ * Message sent by the service to the client to indicate an
+ * element that is removed (set intersection) or added
+ * (set union) or part of the final result, depending on
+ * options specified for the operation.
+ */
 struct GNUNET_SET_ResultMessage
 {
   /**
 struct GNUNET_SET_ResultMessage
 {
   /**
-   * Type: GNUNET_MESSAGE_TYPE_SET_RESULT
+   * Type: #GNUNET_MESSAGE_TYPE_SET_RESULT
    */
   struct GNUNET_MessageHeader header;
 
    */
   struct GNUNET_MessageHeader header;
 
+  /**
+   * Current set size.
+   */
+  uint64_t current_size;
+
   /**
    * id the result belongs to
    */
   uint32_t request_id GNUNET_PACKED;
 
   /**
   /**
    * id the result belongs to
    */
   uint32_t request_id GNUNET_PACKED;
 
   /**
-   * Was the evaluation successful?
+   * Was the evaluation successful? Contains
+   * an `enum GNUNET_SET_Status` in NBO.
    */
   uint16_t result_status GNUNET_PACKED;
 
   /**
    */
   uint16_t result_status GNUNET_PACKED;
 
   /**
-   * Type of the element attachted to the message,
-   * if any.
+   * Type of the element attachted to the message, if any.
    */
   uint16_t element_type GNUNET_PACKED;
 
    */
   uint16_t element_type GNUNET_PACKED;
 
@@ -178,16 +275,26 @@ struct GNUNET_SET_ResultMessage
 };
 
 
 };
 
 
+/**
+ * Message sent by client to the service to add or remove
+ * an element to/from the set.
+ */
 struct GNUNET_SET_ElementMessage
 {
   /**
 struct GNUNET_SET_ElementMessage
 {
   /**
-   * Type: GNUNET_MESSAGE_TYPE_SET_ADD or
-   *       GNUNET_MESSAGE_TYPE_SET_REMOVE
+   * Type: #GNUNET_MESSAGE_TYPE_SET_ADD or
+   *       #GNUNET_MESSAGE_TYPE_SET_REMOVE
    */
   struct GNUNET_MessageHeader header;
 
    */
   struct GNUNET_MessageHeader header;
 
+  /**
+   * Type of the element to add or remove.
+   */
   uint16_t element_type GNUNET_PACKED;
 
   uint16_t element_type GNUNET_PACKED;
 
+  /**
+   * For alignment, always zero.
+   */
   uint16_t reserved GNUNET_PACKED;
 
   /* rest: the actual element */
   uint16_t reserved GNUNET_PACKED;
 
   /* rest: the actual element */
@@ -201,7 +308,7 @@ struct GNUNET_SET_ElementMessage
 struct GNUNET_SET_CancelMessage
 {
   /**
 struct GNUNET_SET_CancelMessage
 {
   /**
-   * Type: GNUNET_MESSAGE_TYPE_SET_CANCEL
+   * Type: #GNUNET_MESSAGE_TYPE_SET_CANCEL
    */
   struct GNUNET_MessageHeader header;
 
    */
   struct GNUNET_MessageHeader header;
 
@@ -211,13 +318,24 @@ struct GNUNET_SET_CancelMessage
   uint32_t request_id GNUNET_PACKED;
 };
 
   uint32_t request_id GNUNET_PACKED;
 };
 
+
+/**
+ * Set element transmitted by service to client in response to a set
+ * iteration request.
+ */
 struct GNUNET_SET_IterResponseMessage
 {
   /**
 struct GNUNET_SET_IterResponseMessage
 {
   /**
-   * Type: GNUNET_MESSAGE_TYPE_SET_ITER_RESPONSE
+   * Type: #GNUNET_MESSAGE_TYPE_SET_ITER_ELEMENT
    */
   struct GNUNET_MessageHeader header;
 
    */
   struct GNUNET_MessageHeader header;
 
+  /**
+   * To which set iteration does this reponse belong to?  First
+   * iteration (per client) has counter zero. Wraps around.
+   */
+  uint16_t iteration_id GNUNET_PACKED;
+
   /**
    * Type of the element attachted to the message,
    * if any.
   /**
    * Type of the element attachted to the message,
    * if any.
@@ -227,10 +345,14 @@ struct GNUNET_SET_IterResponseMessage
   /* rest: element */
 };
 
   /* rest: element */
 };
 
+
+/**
+ * Client acknowledges receiving element in iteration.
+ */
 struct GNUNET_SET_IterAckMessage
 {
   /**
 struct GNUNET_SET_IterAckMessage
 {
   /**
-   * Type: GNUNET_MESSAGE_TYPE_SET_ITER_ACK
+   * Type: #GNUNET_MESSAGE_TYPE_SET_ITER_ACK
    */
   struct GNUNET_MessageHeader header;
 
    */
   struct GNUNET_MessageHeader header;
 
@@ -240,6 +362,41 @@ struct GNUNET_SET_IterAckMessage
   uint32_t send_more;
 };
 
   uint32_t send_more;
 };
 
+
+/**
+ * Server responds to a lazy copy request.
+ */
+struct GNUNET_SET_CopyLazyResponseMessage
+{
+  /**
+   * Type: #GNUNET_MESSAGE_TYPE_SET_COPY_LAZY_RESPONSE
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Temporary name for the copied set.
+   */
+  uint32_t cookie;
+};
+
+
+/**
+ * Client connects to a lazily copied set.
+ */
+struct GNUNET_SET_CopyLazyConnectMessage
+{
+  /**
+   * Type: #GNUNET_MESSAGE_TYPE_SET_COPY_LAZY_CONNECT
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Temporary name for the copied set.
+   */
+  uint32_t cookie;
+};
+
+
 GNUNET_NETWORK_STRUCT_END
 
 #endif
 GNUNET_NETWORK_STRUCT_END
 
 #endif