X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fdht%2Fdht.h;h=772471a7c40a78c2a163f8716f0aeb6491bb6f69;hb=d0b4927e6ab7e8b9874dd7807055e77fb4c5163f;hp=9ff41c56e13bdfde28c45a292c2e8daad6e5fc8f;hpb=f96aac2ff4f49d1d7ee85061e2fa23ec5efdb950;p=oweals%2Fgnunet.git diff --git a/src/dht/dht.h b/src/dht/dht.h index 9ff41c56e..772471a7c 100644 --- a/src/dht/dht.h +++ b/src/dht/dht.h @@ -1,6 +1,6 @@ /* 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 @@ -24,106 +24,26 @@ * @file dht/dht.h */ -#ifndef DHT_H_ -#define DHT_H_ +#ifndef DHT_H +#define DHT_H -#define DEBUG_DHT GNUNET_NO - -/** - * Needs to be GNUNET_YES for logging to dhtlog to work! - */ -#define DEBUG_DHT_ROUTING GNUNET_YES /** * Size of the bloom filter the DHT uses to filter peers. */ #define DHT_BLOOM_SIZE 128 -/** - * Number of bits set per entry in the bloom filter for peers. - */ -#define DHT_BLOOM_K 6 - -/** - * How many requests to remember for forwarding responses. - */ -#define MAX_OUTSTANDING_FORWARDS 100 - -/** - * How long to remember requests so we can forward responses. - */ -#define DHT_FORWARD_TIMEOUT GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MINUTES, 5) - -/** - * Priority for routing results from other peers through - * the DHT. - */ -#define DHT_SEND_PRIORITY 4 - - -#define STAT_ROUTES "# DHT ROUTE Requests Seen" -#define STAT_ROUTE_FORWARDS "# DHT ROUTE Requests Forwarded" -#define STAT_ROUTE_FORWARDS_CLOSEST "# DHT ROUTE Requests Forwarded to Closest Known Peer" -#define STAT_RESULTS "# DHT ROUTE RESULT Requests Seen" -#define STAT_RESULTS_TO_CLIENT "# DHT ROUTE RESULT Sent to Client" -#define STAT_RESULT_FORWARDS "# DHT ROUTE RESULT Requests Forwarded" -#define STAT_GETS "# DHT GET Requests Handled" -#define STAT_PUTS "# DHT PUT Requests Handled" -#define STAT_PUTS_INSERTED "# DHT PUT Data Inserts" -#define STAT_FIND_PEER "# DHT FIND_PEER Requests Handled" -#define STAT_FIND_PEER_START "# DHT FIND_PEER Requests Initiated" -#define STAT_GET_START "# DHT GET Requests Initiated" -#define STAT_PUT_START "# DHT PUT Requests Initiated" -#define STAT_FIND_PEER_REPLY "# DHT FIND_PEER Responses Received" -#define STAT_GET_REPLY "# DHT GET Responses Received" -#define STAT_FIND_PEER_ANSWER "# DHT FIND_PEER Responses Initiated" -#define STAT_BLOOM_FIND_PEER "# DHT FIND_PEER Responses Ignored (bloom match)" -#define STAT_GET_RESPONSE_START "# DHT GET Responses Initiated" -#define STAT_HELLOS_PROVIDED "# HELLO Messages given to transport" -#define STAT_DISCONNECTS "# Disconnects received" -#define STAT_DUPLICATE_UID "# Duplicate UID's encountered (bad if any!)" -#define STAT_RECENT_SEEN "# recent requests seen again (routing loops, alternate paths)" -#define STAT_PEERS_KNOWN "# DHT Peers known" - - -/** - * FIXME: document. - */ -typedef void (*GNUNET_DHT_MessageReceivedHandler) (void *cls, - const struct - GNUNET_MessageHeader * msg); - - -/** - * FIXME: document. - */ -struct GNUNET_DHT_ControlMessage -{ - /** - * Type: GNUNET_MESSAGE_TYPE_DHT_CONTROL - */ - struct GNUNET_MessageHeader header; - - /** - * Command code of the message. - */ - uint16_t command; - - /** - * Variable parameter for the command. - */ - uint16_t variable; -}; +GNUNET_NETWORK_STRUCT_BEGIN /** * 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_STOP + * Type: GNUNET_MESSAGE_TYPE_DHT_GET_STOP */ struct GNUNET_MessageHeader header; @@ -140,20 +60,19 @@ struct GNUNET_DHT_StopMessage /** * Key of this request */ - GNUNET_HashCode key; + struct GNUNET_HashCode key; }; /** - * Generic DHT message, indicates that a route request - * should be issued, if coming from a client. Shared - * usage for api->server and P2P message passing. + * 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_LOCAL_ROUTE + * Type: GNUNET_MESSAGE_TYPE_DHT_CLIENT_GET */ struct GNUNET_MessageHeader header; @@ -168,14 +87,15 @@ struct GNUNET_DHT_RouteMessage uint32_t desired_replication_level GNUNET_PACKED; /** - * For alignment, always zero. + * The type for the data for the GET request; actually an 'enum + * GNUNET_BLOCK_Type'. */ - uint32_t reserved GNUNET_PACKED; + uint32_t type; /** * The key to search for */ - GNUNET_HashCode key; + struct GNUNET_HashCode key; /** * Unique ID identifying this request, if 0 then @@ -183,305 +103,310 @@ struct GNUNET_DHT_RouteMessage */ uint64_t unique_id GNUNET_PACKED; - - /* GNUNET_MessageHeader *enc actual DHT message, copied to end of this dealy do */ + /* Possibly followed by xquery, copied to end of this dealy do */ }; /** - * Generic local route result message + * Reply to a GET send from the service to a client. */ -struct GNUNET_DHT_RouteResultMessage +struct GNUNET_DHT_ClientResultMessage { /** - * Type: GNUNET_MESSAGE_TYPE_DHT_LOCAL_ROUTE_RESULT + * Type: GNUNET_MESSAGE_TYPE_DHT_CLIENT_RESULT */ struct GNUNET_MessageHeader header; /** - * Number of peers recorded in the outgoing - * path from source to the final destination - * of this message. + * 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 outgoing_path_length GNUNET_PACKED; + uint32_t get_path_length GNUNET_PACKED; /** - * Unique ID identifying this request (necessary for - * client to compare to sent requests) + * Unique ID of the matching GET request. */ uint64_t unique_id GNUNET_PACKED; + /** + * When does this entry expire? + */ + struct GNUNET_TIME_AbsoluteNBO expiration; + /** * The key that was searched for */ - GNUNET_HashCode key; + 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 */ - /* OUTGOING path */ }; /** - * Generic P2P DHT route message + * Message to insert data into the DHT, sent from clients to DHT service. */ -struct GNUNET_DHT_P2PRouteMessage +struct GNUNET_DHT_ClientPutMessage { /** - * Type: GNUNET_MESSAGE_TYPE_DHT_P2P_ROUTE + * Type: GNUNET_MESSAGE_TYPE_DHT_CLIENT_PUT */ struct GNUNET_MessageHeader header; /** - * Always zero. + * The type of data to insert. */ - uint32_t reserved GNUNET_PACKED; + uint32_t type GNUNET_PACKED; /** - * Message options + * Message options, actually an 'enum GNUNET_DHT_RouteOption' value. */ uint32_t options GNUNET_PACKED; /** - * Hop count + * Replication level for this message */ - uint32_t hop_count GNUNET_PACKED; + uint32_t desired_replication_level GNUNET_PACKED; /** - * Replication level for this message + * Unique ID for the PUT message. */ - uint32_t desired_replication_level GNUNET_PACKED; + uint64_t unique_id GNUNET_PACKED; /** - * Network size estimate + * How long should this data persist? */ - uint32_t network_size GNUNET_PACKED; + struct GNUNET_TIME_AbsoluteNBO expiration; /** - * Generic route path length for a message in the - * DHT that arrived at a peer and generated - * a reply. Copied to the end of this message. + * The key to store the value under. */ - uint32_t outgoing_path_length GNUNET_PACKED; + struct GNUNET_HashCode key; + + /* DATA copied to end of this message */ + +}; + +/** + * Message to confirming receipt of PUT, sent from DHT service to clients. + */ +struct GNUNET_DHT_ClientPutConfirmationMessage +{ /** - * Unique ID identifying this request + * Type: GNUNET_MESSAGE_TYPE_DHT_CLIENT_PUT_OK */ - uint64_t unique_id GNUNET_PACKED; + struct GNUNET_MessageHeader header; /** - * Bloomfilter (for peer identities) to stop circular routes + * Always zero. */ - char bloomfilter[DHT_BLOOM_SIZE]; + uint32_t reserved GNUNET_PACKED; /** - * The key to search for + * Unique ID from the PUT message that is being confirmed. */ - GNUNET_HashCode key; + uint64_t unique_id GNUNET_PACKED; - /* GNUNET_MessageHeader *enc actual DHT message, copied to end of this dealy do */ +}; - /* OUTGOING PATH */ -}; /** - * Generic P2P route result + * Message to monitor put requests going through peer, DHT service -> clients. */ -struct GNUNET_DHT_P2PRouteResultMessage +struct GNUNET_DHT_MonitorPutMessage { /** - * Type: GNUNET_MESSAGE_TYPE_DHT_P2P_ROUTE_RESULT + * Type: GNUNET_MESSAGE_TYPE_DHT_MONITOR_PUT */ struct GNUNET_MessageHeader header; /** - * Number of peers recorded in the path - * (inverse of the path the outgoing message took). - * These peer identities follow this message. + * Message options, actually an 'enum GNUNET_DHT_RouteOption' value. */ - uint32_t outgoing_path_length GNUNET_PACKED; + uint32_t options GNUNET_PACKED; /** - * Message options + * The type of data in the request. */ - uint32_t options GNUNET_PACKED; + uint32_t type GNUNET_PACKED; /** - * Hop count + * Hop count so far. */ uint32_t hop_count GNUNET_PACKED; - + /** - * Unique ID identifying this request (may not be set) + * Replication level for this message */ - uint64_t unique_id GNUNET_PACKED; + uint32_t desired_replication_level GNUNET_PACKED; /** - * Bloomfilter to stop circular routes + * Number of peers recorded in the outgoing path from source to the + * storage location of this message. */ - char bloomfilter[DHT_BLOOM_SIZE]; + uint32_t put_path_length GNUNET_PACKED; /** - * The key that was searched for + * How long should this data persist? */ - GNUNET_HashCode key; + struct GNUNET_TIME_AbsoluteNBO expiration_time; -#if FORWARD_UNKNOWN /** - * Network size estimate + * The key to store the value under. */ - uint32_t network_size GNUNET_PACKED; -#endif + struct GNUNET_HashCode key; + + /* put path (if tracked) */ - /* GNUNET_MessageHeader *enc actual DHT message, copied to end of this dealy do */ + /* Payload */ - /* OUTGOING PATH */ }; /** - * Message to insert data into the DHT, shared - * between api->server communication and P2P communication. - * The type must be different for the two purposes. + * Message to request monitoring messages, clients -> DHT service. */ -struct GNUNET_DHT_PutMessage +struct GNUNET_DHT_MonitorStartStopMessage { /** - * Type: GNUNET_MESSAGE_TYPE_DHT_PUT / GNUNET_MESSAGE_TYPE_DHT_P2P_PUT + * Type: GNUNET_MESSAGE_TYPE_DHT_MONITOR_(START|STOP) */ struct GNUNET_MessageHeader header; /** - * The type of data to insert. + * The type of data desired, GNUNET_BLOCK_TYPE_ANY for all. */ uint32_t type GNUNET_PACKED; /** - * How long should this data persist? + * Flag whether to notify about GET messages. */ - struct GNUNET_TIME_AbsoluteNBO expiration; + int16_t get GNUNET_PACKED; - /* DATA copied to end of this message */ + /** + * 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 request data from the DHT, shared - * between P2P requests and local get requests. - * Main difference is that if the request comes in - * locally we need to remember it (for client response). + * Message to monitor get requests going through peer, DHT service -> clients. */ -struct GNUNET_DHT_GetMessage +struct GNUNET_DHT_MonitorGetMessage { /** - * Type: GNUNET_MESSAGE_TYPE_DHT_GET / GNUNET_MESSAGE_TYPE_DHT_P2P_GET + * Type: GNUNET_MESSAGE_TYPE_DHT_MONITOR_PUT */ struct GNUNET_MessageHeader header; /** - * The type for the data for the GET request; actually an 'enum - * GNUNET_BLOCK_Type'. + * Message options, actually an 'enum GNUNET_DHT_RouteOption' value. */ - uint32_t type; + uint32_t options GNUNET_PACKED; /** - * Mutator used for the bloom filter (0 if no bf is used). + * The type of data in the request. */ - uint32_t bf_mutator; + uint32_t type GNUNET_PACKED; /** - * Size of the eXtended query (xquery). + * Hop count */ - uint16_t xquery_size; - + uint32_t hop_count GNUNET_PACKED; + /** - * Size of the bloom filter. + * Replication level for this message */ - uint16_t bf_size; - - /* Followed by the xquery which has 'xquery_size' bytes */ - - /* Followed by the bloom filter (after xquery) with 'bf_size' bytes */ -}; - + uint32_t desired_replication_level GNUNET_PACKED; -/** - * Generic DHT message, indicates that a route request - * should be issued, if coming from a client. Shared - * usage for api->server and P2P message passing. - */ -struct GNUNET_DHT_FindPeerMessage -{ /** - * Type: GNUNET_MESSAGE_TYPE_DHT_FIND_PEER + * Number of peers recorded in the outgoing path from source to the + * storage location of this message. */ - struct GNUNET_MessageHeader header; + uint32_t get_path_length GNUNET_PACKED; /** - * Bloomfilter to reduce find peer responses + * The key to store the value under. */ - char bloomfilter[DHT_BLOOM_SIZE]; -}; + struct GNUNET_HashCode key; + /* get path (if tracked) */ + +}; /** - * Message to return data either to the client API - * or to respond to a request received from another - * peer. Shared format, different types. + * Message to monitor get results going through peer, DHT service -> clients. */ -struct GNUNET_DHT_GetResultMessage +struct GNUNET_DHT_MonitorGetRespMessage { /** - * Type: GNUNET_MESSAGE_TYPE_DHT_GET_RESULT / GNUNET_MESSAGE_TYPE_DHT_P2P_GET_RESULT + * Type: GNUNET_MESSAGE_TYPE_DHT_P2P_RESULT */ struct GNUNET_MessageHeader header; /** - * The type for the data for the GET request - * FIXME: use 32-bit types, as in block? What is this type exactly for? + * Content type. */ - uint16_t type; + uint32_t type GNUNET_PACKED; /** - * The number of peer identities appended to the end of this - * message. + * Length of the PUT path that follows (if tracked). */ - uint16_t put_path_length; + uint32_t put_path_length GNUNET_PACKED; /** - * When does this entry expire? + * Length of the GET path that follows (if tracked). */ - struct GNUNET_TIME_AbsoluteNBO expiration; - - /* OUTGOING path copied to end of this message */ - /* DATA result copied to end of this message */ + uint32_t get_path_length GNUNET_PACKED; -}; - -/** - * Entry for inserting data into datacache from the DHT. - * Needed here so block library can verify entries that - * are shoveled into the DHT. - */ -struct DHTPutEntry -{ /** - * Size of data. + * When does the content expire? */ - uint16_t data_size; + struct GNUNET_TIME_AbsoluteNBO expiration_time; /** - * Length of recorded path. + * The key of the corresponding GET request. */ - uint16_t path_length; + struct GNUNET_HashCode key; + + /* put path (if tracked) */ - /* PUT DATA */ + /* get path (if tracked) */ + + /* Payload */ - /* PATH ENTRIES */ }; +GNUNET_NETWORK_STRUCT_END -#endif /* DHT_H_ */ +#endif