#endif
+/**
+ * FIXME: document.
+ */
+#define GNUNET_DHT_DEFAULT_REPUBLISH_FREQUENCY GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MINUTES, 60)
+
/**
* K-value that must be used for the bloom filter 'GET'
* queries.
*/
#define GNUNET_DHT_GET_BLOOMFILTER_K 16
+/**
+ * Non-intelligent default DHT GET replication.
+ * Should be chosen by application if anything about
+ * the network is known.
+ */
+#define DEFAULT_GET_REPLICATION 5
+
+/**
+ * Non-intelligent default DHT PUT replication.
+ * Should be chosen by application if anything about
+ * the network is known.
+ */
+#define DEFAULT_PUT_REPLICATION 8
+
/**
* Connection to the DHT service.
*/
* We should keep track of the route that the message
* took in the P2P network.
*/
- GNUNET_DHT_RO_RECORD_ROUTE = 2
+ GNUNET_DHT_RO_RECORD_ROUTE = 2,
+
+ /**
+ * Possible message option for query key randomization.
+ */
+ GNUNET_DHT_RO_BART = 4
};
/**
* Initialize the connection with the DHT service.
*
- * @param sched scheduler to use
* @param cfg configuration to use
* @param ht_len size of the internal hash table to use for
* processing multiple GET/FIND requests in parallel
* @return NULL on error
*/
struct GNUNET_DHT_Handle *
-GNUNET_DHT_connect (struct GNUNET_SCHEDULER_Handle *sched,
- const struct GNUNET_CONFIGURATION_Handle *cfg,
+GNUNET_DHT_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
unsigned int ht_len);
/* *************** Standard API: get and put ******************* */
/**
- * Perform a PUT operation on the DHT identified by 'table' storing
- * a binding of 'key' to 'value'. The peer does not have to be part
- * of the table (if so, we will attempt to locate a peer that is!)
+ * Perform a PUT operation storing data in the DHT.
*
* @param handle handle to DHT service
- * @param key the key to store data under
+ * @param key the key to store under
+ * @param desired_replication_level estimate of how many
+ * nearest peers this request should reach
* @param options routing options for this message
* @param type type of the value
* @param size number of bytes in data; must be less than 64k
* @param data the data to store
- * @param exp desired expiration time for the data
- * @param timeout when to abort if we fail to transmit the request
- * for the PUT to the local DHT service
+ * @param exp desired expiration time for the value
+ * @param timeout how long to wait for transmission of this request
* @param cont continuation to call when done (transmitting request to service)
* @param cont_cls closure for cont
+ * @return GNUNET_YES if put message is queued for transmission
*/
void
GNUNET_DHT_put (struct GNUNET_DHT_Handle *handle,
const GNUNET_HashCode * key,
- enum GNUNET_DHT_RouteOption options,
+ uint32_t desired_replication_level,
+ enum GNUNET_DHT_RouteOption options,
enum GNUNET_BLOCK_Type type,
size_t size,
const char *data,
struct GNUNET_TIME_Absolute exp,
struct GNUNET_TIME_Relative timeout,
- GNUNET_SCHEDULER_Task cont,
- void *cont_cls);
+ GNUNET_SCHEDULER_Task cont,
+ void *cont_cls);
/**
/**
- * Perform an asynchronous GET operation on the DHT. See
+ * Perform an asynchronous GET operation on the DHT identified. See
* also "GNUNET_BLOCK_evaluate".
*
* @param handle handle to the DHT service
- * @param timeout timeout for this request to be sent to the
- * service (this is NOT a timeout for receiving responses)
- * @param type expected type of the response object (GNUNET_BLOCK_TYPE_FS_*)
+ * @param timeout how long to wait for transmission of this request to the service
+ * @param type expected type of the response object
* @param key the key to look up
+ * @param desired_replication_level estimate of how many
+ nearest peers this request should reach
* @param options routing options for this message
* @param bf bloom filter associated with query (can be NULL)
* @param bf_mutator mutation value for bf
- * @param xquery extrended query data (can be NULL, depending on type)
+ * @param xquery extended query data (can be NULL, depending on type)
* @param xquery_size number of bytes in xquery
* @param iter function to call on each result
* @param iter_cls closure for iter
- * @return handle to stop the async get, NULL on error
+ *
+ * @return handle to stop the async get
*/
struct GNUNET_DHT_GetHandle *
GNUNET_DHT_get_start (struct GNUNET_DHT_Handle *handle,
struct GNUNET_TIME_Relative timeout,
enum GNUNET_BLOCK_Type type,
const GNUNET_HashCode * key,
- enum GNUNET_DHT_RouteOption options,
- const struct GNUNET_CONTAINER_BloomFilter *bf,
- int32_t bf_mutator,
- const void *xquery,
- size_t xquery_size,
+ uint32_t desired_replication_level,
+ enum GNUNET_DHT_RouteOption options,
+ const struct GNUNET_CONTAINER_BloomFilter *bf,
+ int32_t bf_mutator,
+ const void *xquery,
+ size_t xquery_size,
GNUNET_DHT_GetIterator iter,
void *iter_cls);
* Stop async DHT-get. Frees associated resources.
*
* @param get_handle GET operation to stop.
+ *
+ * On return get_handle will no longer be valid, caller
+ * must not use again!!!
*/
void
GNUNET_DHT_get_stop (struct GNUNET_DHT_GetHandle *get_handle);
*
* @param cls closure
* @param key key that was used
- * @param get_path NULL-terminated array of pointers
- * to the peers on reverse GET path (or NULL if not recorded)
- * @param put_path NULL-terminated array of pointers
+ * @param outgoing_path NULL-terminated array of pointers
+ * to the peers on reverse outgoing
+ * path (or NULL if not recorded)
* to the peers on the PUT path (or NULL if not recorded)
* @param reply response
*/
typedef void (*GNUNET_DHT_ReplyProcessor)(void *cls,
const GNUNET_HashCode *key,
- const struct GNUNET_PeerIdentity * const *get_path,
- const struct GNUNET_PeerIdentity * const *put_path,
+ const struct GNUNET_PeerIdentity * const *outgoing_path,
const struct GNUNET_MessageHeader *reply);
* all requests received.
*
* @param handle handle to the DHT service
+ * @param cont continuation to call when done (transmitting request to service)
+ * @param cont_cls closure for cont
+ *
*/
void
-GNUNET_DHT_set_malicious_dropper (struct GNUNET_DHT_Handle *handle);
+GNUNET_DHT_set_malicious_dropper (struct GNUNET_DHT_Handle *handle, GNUNET_SCHEDULER_Task cont,
+ void *cont_cls);
/**
* requests every 'frequency' milliseconds.
*
* @param handle handle to the DHT service
- * @param frequency delay (in milliseconds) between sending malicious messages
+ * @param frequency delay between sending malicious messages
+ * @param cont continuation to call when done (transmitting request to service)
+ * @param cont_cls closure for cont
*/
void
GNUNET_DHT_set_malicious_putter (struct GNUNET_DHT_Handle *handle,
- struct GNUNET_TIME_Relative frequency);
+ struct GNUNET_TIME_Relative frequency, GNUNET_SCHEDULER_Task cont,
+ void *cont_cls);
/**
*
* @param handle handle to the DHT service
* @param frequency delay between sending malicious messages
+ * @param cont continuation to call when done (transmitting request to service)
+ * @param cont_cls closure for cont
*/
-void
-GNUNET_DHT_set_malicious_getter (struct GNUNET_DHT_Handle *handle,
- struct GNUNET_TIME_Relative frequency);
+void
+GNUNET_DHT_set_malicious_getter (struct GNUNET_DHT_Handle *handle,
+ struct GNUNET_TIME_Relative frequency, GNUNET_SCHEDULER_Task cont,
+ void *cont_cls);
#endif