fix memleak
[oweals/gnunet.git] / src / dht / dht.h
index 2bafc369491562620455012ebbd3ac77a0b688a2..772471a7c40a78c2a163f8716f0aeb6491bb6f69 100644 (file)
@@ -1,10 +1,10 @@
 /*
      This file is part of GNUnet.
 /*
      This file is part of GNUnet.
-     (C) 2001, 2002, 2003, 2004, 2009 Christian Grothoff (and other contributing authors)
+     (C) 2001, 2002, 2003, 2004, 2009, 2011 Christian Grothoff (and other contributing authors)
 
      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
  * @file dht/dht.h
  */
 
  * @file dht/dht.h
  */
 
-#ifndef DHT_H_
-#define DHT_H_
+#ifndef DHT_H
+#define DHT_H
 
 
-#define DEBUG_DHT GNUNET_NO
 
 
-typedef void (*GNUNET_DHT_MessageReceivedHandler) (void *cls,
-                                                   const struct GNUNET_MessageHeader
-                                                   * msg);
+/**
+ * Size of the bloom filter the DHT uses to filter peers.
+ */
+#define DHT_BLOOM_SIZE 128
+
+
+GNUNET_NETWORK_STRUCT_BEGIN
 
 /**
 
 /**
- * FIXME.
+ * Message which indicates the DHT should cancel outstanding
+ * requests and discard any state.
  */
  */
-struct GNUNET_DHT_StopMessage
+struct GNUNET_DHT_ClientGetStopMessage
 {
   /**
 {
   /**
-   * Type: GNUNET_MESSAGE_TYPE_DHT_MESSAGE
+   * Type: GNUNET_MESSAGE_TYPE_DHT_GET_STOP
    */
   struct GNUNET_MessageHeader header;
 
    */
   struct GNUNET_MessageHeader header;
 
@@ -53,146 +57,356 @@ struct GNUNET_DHT_StopMessage
    */
   uint64_t unique_id GNUNET_PACKED;
 
    */
   uint64_t unique_id GNUNET_PACKED;
 
+  /**
+   * Key of this request
+   */
+  struct GNUNET_HashCode key;
+
 };
 
 
 /**
 };
 
 
 /**
- * Generic DHT message, wrapper for other message types
+ * DHT GET message sent from clients to service. Indicates that a GET
+ * request should be issued.
  */
  */
-struct GNUNET_DHT_RouteMessage
+struct GNUNET_DHT_ClientGetMessage
 {
   /**
 {
   /**
-   * Type: GNUNET_MESSAGE_TYPE_DHT_ROUTE
+   * Type: GNUNET_MESSAGE_TYPE_DHT_CLIENT_GET
    */
   struct GNUNET_MessageHeader header;
 
   /**
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * Message options
+   * Message options, actually an 'enum GNUNET_DHT_RouteOption' value.
    */
   uint32_t options GNUNET_PACKED;
 
    */
   uint32_t options GNUNET_PACKED;
 
+  /**
+   * Replication level for this message
+   */
+  uint32_t desired_replication_level GNUNET_PACKED;
+
+  /**
+   * The type for the data for the GET request; actually an 'enum
+   * GNUNET_BLOCK_Type'.
+   */
+  uint32_t type;
+
   /**
    * The key to search for
    */
   /**
    * The key to search for
    */
-  GNUNET_HashCode key;
+  struct GNUNET_HashCode key;
 
   /**
 
   /**
-   * Unique ID identifying this request
+   * Unique ID identifying this request, if 0 then
+   * the client will not expect a response
    */
   uint64_t unique_id GNUNET_PACKED;
 
    */
   uint64_t unique_id GNUNET_PACKED;
 
+  /* Possibly followed by xquery, copied to end of this dealy do */
+
+};
+
+
+/**
+ * Reply to a GET send from the service to a client.
+ */
+struct GNUNET_DHT_ClientResultMessage
+{
   /**
   /**
-   * Replication level for this message
+   * Type: GNUNET_MESSAGE_TYPE_DHT_CLIENT_RESULT
    */
    */
-  uint32_t desired_replication_level GNUNET_PACKED;
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * The type for the data.
+   */
+  uint32_t type;
+
+  /**
+   * Number of peers recorded in the outgoing path from source to the
+   * storgage location of this message.
+   */
+  uint32_t put_path_length GNUNET_PACKED;
+
+  /**
+   * The number of peer identities recorded from the storage location
+   * to this peer.
+   */
+  uint32_t get_path_length GNUNET_PACKED;
+
+  /**
+   * Unique ID of the matching GET request.
+   */
+  uint64_t unique_id GNUNET_PACKED;
 
   /**
 
   /**
-   * Is this message uniquely identified?  If so it will
-   * be fire and forget, if not we will wait for a receipt
-   * from the service.
+   * When does this entry expire?
+   */
+  struct GNUNET_TIME_AbsoluteNBO expiration;
+
+  /**
+   * The key that was searched for
    */
    */
-  uint32_t unique GNUNET_PACKED;
+  struct GNUNET_HashCode key;
 
 
-  /* GNUNET_MessageHeader *enc actual DHT message, copied to end of this dealy do */
+  /* put path, get path and actual data are copied to end of this dealy do */
 
 };
 
 
 };
 
-struct GNUNET_DHT_RouteResultMessage
+
+/**
+ * Message to insert data into the DHT, sent from clients to DHT service.
+ */
+struct GNUNET_DHT_ClientPutMessage
 {
   /**
 {
   /**
-   * Type: GNUNET_MESSAGE_TYPE_DHT_ROUTE_RESULT
+   * Type: GNUNET_MESSAGE_TYPE_DHT_CLIENT_PUT
    */
   struct GNUNET_MessageHeader header;
 
   /**
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * Message options
+   * The type of data to insert.
+   */
+  uint32_t type GNUNET_PACKED;
+
+  /**
+   * Message options, actually an 'enum GNUNET_DHT_RouteOption' value.
    */
   uint32_t options GNUNET_PACKED;
 
   /**
    */
   uint32_t options GNUNET_PACKED;
 
   /**
-   * The key that was searched for
+   * Replication level for this message
    */
    */
-  GNUNET_HashCode key;
+  uint32_t desired_replication_level GNUNET_PACKED;
 
   /**
 
   /**
-   * Unique ID identifying this request
+   * Unique ID for the PUT message.
    */
   uint64_t unique_id GNUNET_PACKED;
 
    */
   uint64_t unique_id GNUNET_PACKED;
 
-  /* GNUNET_MessageHeader *enc actual DHT message, copied to end of this dealy do */
+  /**
+   * How long should this data persist?
+   */
+  struct GNUNET_TIME_AbsoluteNBO expiration;
+
+  /**
+   * The key to store the value under.
+   */
+  struct GNUNET_HashCode key;
+
+  /* DATA copied to end of this message */
+
 };
 
 };
 
+
 /**
 /**
- * Message to insert data into the DHT
+ * Message to confirming receipt of PUT, sent from DHT service to clients.
  */
  */
-struct GNUNET_DHT_PutMessage
+struct GNUNET_DHT_ClientPutConfirmationMessage
 {
   /**
 {
   /**
-   * Type: GNUNET_MESSAGE_TYPE_DHT_PUT
+   * Type: GNUNET_MESSAGE_TYPE_DHT_CLIENT_PUT_OK
    */
   struct GNUNET_MessageHeader header;
 
   /**
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * The type of data to insert.
+   * Always zero.
+   */
+  uint32_t reserved GNUNET_PACKED;
+
+  /**
+   * Unique ID from the PUT message that is being confirmed.
+   */
+  uint64_t unique_id GNUNET_PACKED;
+
+};
+
+
+
+/**
+ * Message to monitor put requests going through peer, DHT service -> clients.
+ */
+struct GNUNET_DHT_MonitorPutMessage
+{
+  /**
+   * Type: GNUNET_MESSAGE_TYPE_DHT_MONITOR_PUT
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Message options, actually an 'enum GNUNET_DHT_RouteOption' value.
+   */
+  uint32_t options GNUNET_PACKED;
+
+  /**
+   * The type of data in the request.
+   */
+  uint32_t type GNUNET_PACKED;
+
+  /**
+   * Hop count so far.
+   */
+  uint32_t hop_count GNUNET_PACKED;
+  
+  /**
+   * Replication level for this message
+   */
+  uint32_t desired_replication_level GNUNET_PACKED;
+
+  /**
+   * Number of peers recorded in the outgoing path from source to the
+   * storage location of this message.
    */
    */
-  size_t type GNUNET_PACKED;
+  uint32_t put_path_length GNUNET_PACKED;
 
   /**
    * How long should this data persist?
    */
 
   /**
    * How long should this data persist?
    */
-  struct GNUNET_TIME_AbsoluteNBO expiration;
+  struct GNUNET_TIME_AbsoluteNBO expiration_time;
 
   /**
 
   /**
-   * The size of the data, appended to the end of this message.
+   * The key to store the value under.
    */
    */
-  size_t data_size GNUNET_PACKED;
+  struct GNUNET_HashCode key;
+
+  /* put path (if tracked) */
+
+  /* Payload */
 
 };
 
 
 /**
 
 };
 
 
 /**
- * Message to request data from the DHT
+ * Message to request monitoring messages, clients -> DHT service.
  */
  */
-struct GNUNET_DHT_GetMessage
+struct GNUNET_DHT_MonitorStartStopMessage
 {
   /**
 {
   /**
-   * Type: GNUNET_MESSAGE_TYPE_DHT_GET
+   * Type: GNUNET_MESSAGE_TYPE_DHT_MONITOR_(START|STOP)
    */
   struct GNUNET_MessageHeader header;
 
   /**
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * The type for the data for the GET request
+   * The type of data desired, GNUNET_BLOCK_TYPE_ANY for all.
    */
    */
-  uint32_t type;
+  uint32_t type GNUNET_PACKED;
+
+  /**
+   * Flag whether to notify about GET messages.
+   */
+  int16_t get GNUNET_PACKED;
+
+  /**
+   * Flag whether to notify about GET_REPONSE messages.
+   */
+  int16_t get_resp GNUNET_PACKED;
 
 
+  /**
+   * Flag whether to notify about PUT messages.
+   */
+  int16_t put GNUNET_PACKED;
+
+  /**
+   * Flag whether to use the provided key to filter messages.
+   */
+  int16_t filter_key GNUNET_PACKED;
+
+  /**
+   * The key to filter messages by.
+   */
+  struct GNUNET_HashCode key;
 };
 
 };
 
+
 /**
 /**
- * Message to return data from the DHT
+ * Message to monitor get requests going through peer, DHT service -> clients.
  */
  */
-struct GNUNET_DHT_GetResultMessage
+struct GNUNET_DHT_MonitorGetMessage
 {
   /**
 {
   /**
-   * Type: GNUNET_MESSAGE_TYPE_DHT_GET_RESULT
+   * Type: GNUNET_MESSAGE_TYPE_DHT_MONITOR_PUT
    */
   struct GNUNET_MessageHeader header;
 
   /**
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * The type for the data for the GET request
+   * Message options, actually an 'enum GNUNET_DHT_RouteOption' value.
    */
    */
-  uint32_t type;
+  uint32_t options GNUNET_PACKED;
 
   /**
 
   /**
-   * The key to search for
+   * The type of data in the request.
    */
    */
-  GNUNET_HashCode key;
+  uint32_t type GNUNET_PACKED;
 
   /**
 
   /**
-   * When does this entry expire?
+   * Hop count
+   */
+  uint32_t hop_count GNUNET_PACKED;
+  
+  /**
+   * Replication level for this message
    */
    */
-  struct GNUNET_TIME_Absolute expiration;
+  uint32_t desired_replication_level GNUNET_PACKED;
+
+  /**
+   * Number of peers recorded in the outgoing path from source to the
+   * storage location of this message.
+   */
+  uint32_t get_path_length GNUNET_PACKED;
+
+  /**
+   * The key to store the value under.
+   */
+  struct GNUNET_HashCode key;
+
+  /* get path (if tracked) */
+
+};
+
+/**
+ * Message to monitor get results going through peer, DHT service -> clients.
+ */
+struct GNUNET_DHT_MonitorGetRespMessage
+{
+  /**
+   * Type: GNUNET_MESSAGE_TYPE_DHT_P2P_RESULT
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Content type.
+   */
+  uint32_t type GNUNET_PACKED;
+
+  /**
+   * Length of the PUT path that follows (if tracked).
+   */
+  uint32_t put_path_length GNUNET_PACKED;
+
+  /**
+   * Length of the GET path that follows (if tracked).
+   */
+  uint32_t get_path_length GNUNET_PACKED;
+
+  /**
+   * When does the content expire?
+   */
+  struct GNUNET_TIME_AbsoluteNBO expiration_time;
+
+  /**
+   * The key of the corresponding GET request.
+   */
+  struct GNUNET_HashCode key;
+
+  /* put path (if tracked) */
+
+  /* get path (if tracked) */
+
+  /* Payload */
 
 };
 
 
 };
 
+GNUNET_NETWORK_STRUCT_END
 
 
-#endif /* DHT_H_ */
+#endif