X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fdht%2Fdht.h;h=772471a7c40a78c2a163f8716f0aeb6491bb6f69;hb=d0b4927e6ab7e8b9874dd7807055e77fb4c5163f;hp=237b91f64dfc0a151b035447e4e60f7d0b9c212e;hpb=7b80cc15aaf3f61fb05635577fdd5258d5b8bb17;p=oweals%2Fgnunet.git diff --git a/src/dht/dht.h b/src/dht/dht.h index 237b91f64..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,90 +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! + * Size of the bloom filter the DHT uses to filter peers. */ -#define DEBUG_DHT_ROUTING GNUNET_YES - #define DHT_BLOOM_SIZE 128 -#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) - -#define DEFAULT_DHT_REPUBLISH_FREQUENCY GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MINUTES, 60) - -#define DHT_SEND_PRIORITY 4 - -#define DEFAULT_GET_REPLICATION 5 - -#define DEFAULT_PUT_REPLICATION 8 - -#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)" - -typedef void (*GNUNET_DHT_MessageReceivedHandler) (void *cls, - const struct GNUNET_MessageHeader - *msg); -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; @@ -124,271 +60,353 @@ 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; /** - * Message options + * Message options, actually an 'enum GNUNET_DHT_RouteOption' value. */ uint32_t options GNUNET_PACKED; /** - * The key to search for + * Replication level for this message */ - GNUNET_HashCode key; + uint32_t desired_replication_level GNUNET_PACKED; /** - * Unique ID identifying this request, if 0 then - * the client will not expect a response + * The type for the data for the GET request; actually an 'enum + * GNUNET_BLOCK_Type'. */ - uint64_t unique_id GNUNET_PACKED; + uint32_t type; /** - * Replication level for this message + * The key to search for */ - uint32_t desired_replication_level GNUNET_PACKED; + struct GNUNET_HashCode key; + /** + * Unique ID identifying this request, if 0 then + * the client will not expect a response + */ + 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; /** - * Message options + * The type for the data. */ - uint32_t options GNUNET_PACKED; + 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 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; + + /* put path, get path and actual data are copied to end of this dealy do */ - /* GNUNET_MessageHeader *enc actual DHT message, copied to end of this dealy do */ }; + /** - * 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; /** - * 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; /** - * Hop count + * Replication level for this message */ - uint32_t hop_count GNUNET_PACKED; + uint32_t desired_replication_level GNUNET_PACKED; /** - * Network size estimate + * Unique ID for the PUT message. */ - uint32_t network_size GNUNET_PACKED; + uint64_t unique_id GNUNET_PACKED; /** - * Replication level for this message + * How long should this data persist? */ - uint32_t desired_replication_level GNUNET_PACKED; + struct GNUNET_TIME_AbsoluteNBO expiration; /** - * Unique ID identifying this request + * The key to store the value under. */ - uint64_t unique_id GNUNET_PACKED; + struct GNUNET_HashCode key; - /* - * Bloomfilter to stop circular routes + /* DATA copied to end of this message */ + +}; + + +/** + * Message to confirming receipt of PUT, sent from DHT service to clients. + */ +struct GNUNET_DHT_ClientPutConfirmationMessage +{ + /** + * Type: GNUNET_MESSAGE_TYPE_DHT_CLIENT_PUT_OK */ - char bloomfilter[DHT_BLOOM_SIZE]; + struct GNUNET_MessageHeader header; /** - * The key to search for + * Always zero. */ - GNUNET_HashCode key; + uint32_t reserved GNUNET_PACKED; - /* GNUNET_MessageHeader *enc actual DHT message, copied to end of this dealy do */ + /** + * Unique ID from the PUT message that is being confirmed. + */ + uint64_t unique_id GNUNET_PACKED; }; + + /** - * Generic P2P route result - * - * FIXME: One question is how much to include for a route result message. - * Assuming a peer receives such a message, but has no record of a - * route message, what should it do? It can either drop the message - * or try to forward it towards the original peer... However, for - * that to work we would need to include the original peer identity - * in the GET request, which adds more data to the message. + * 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; /** - * Message options + * Message options, actually an 'enum GNUNET_DHT_RouteOption' value. */ uint32_t options GNUNET_PACKED; /** - * Hop count + * The type of data in the request. */ - uint32_t hop_count GNUNET_PACKED; + uint32_t type GNUNET_PACKED; /** - * Unique ID identifying this request (may not be set) + * Hop count so far. */ - uint64_t unique_id GNUNET_PACKED; + uint32_t hop_count GNUNET_PACKED; + + /** + * Replication level for this message + */ + 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) */ + + /* Payload */ - /* GNUNET_MessageHeader *enc actual DHT message, copied to end of this dealy do */ }; /** - * 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. */ - size_t type GNUNET_PACKED; + 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; + + /** + * 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 + * Message options, actually an 'enum GNUNET_DHT_RouteOption' value. */ - uint32_t type; + uint32_t options GNUNET_PACKED; -}; + /** + * The type of data in the request. + */ + uint32_t type 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 + * Hop count + */ + uint32_t hop_count GNUNET_PACKED; + + /** + * Replication level for this message */ - struct GNUNET_MessageHeader header; + uint32_t desired_replication_level GNUNET_PACKED; - /* - * Bloomfilter to reduce find peer responses + /** + * Number of peers recorded in the outgoing path from source to the + * storage location of this message. */ - char bloomfilter[DHT_BLOOM_SIZE]; + uint32_t get_path_length GNUNET_PACKED; + + /** + * The key to store the value under. + */ + 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 + * Content type. */ - uint32_t type; + uint32_t type GNUNET_PACKED; /** - * The key that was searched for + * Length of the PUT path that follows (if tracked). */ - //GNUNET_HashCode key; + 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; + 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