X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fcore%2Fcore.h;h=03e328ca835e9e505e9f51a50c22debbeb5282b0;hb=fca0750a1b767e2ccc88a585ec598ca29e622a1e;hp=840c7e143a2543210e7763140a661c40eb916975;hpb=0a217a8df1657b4334b55b0e4a6c7837a8dbcfd9;p=oweals%2Fgnunet.git diff --git a/src/core/core.h b/src/core/core.h index 840c7e143..03e328ca8 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -1,10 +1,10 @@ /* This file is part of GNUnet. - (C) 2009 Christian Grothoff (and other contributing authors) + (C) 2009, 2010 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 - 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 @@ -23,10 +23,18 @@ * @brief common internal definitions for core service * @author Christian Grothoff */ +#ifndef CORE_H +#define CORE_H + +#include "gnunet_bandwidth_lib.h" +#include "gnunet_transport_service.h" #include "gnunet_crypto_lib.h" #include "gnunet_time_lib.h" -#define DEBUG_CORE GNUNET_NO +/** + * General core debugging. + */ +#define DEBUG_CORE GNUNET_EXTRA_LOGGING /** * Definition of bits in the InitMessage's options field that specify @@ -35,15 +43,15 @@ * transmitted to the client. */ #define GNUNET_CORE_OPTION_NOTHING 0 -#define GNUNET_CORE_OPTION_SEND_CONNECT 1 -#define GNUNET_CORE_OPTION_SEND_DISCONNECT 2 -#define GNUNET_CORE_OPTION_SEND_BFC 4 +#define GNUNET_CORE_OPTION_SEND_STATUS_CHANGE 4 #define GNUNET_CORE_OPTION_SEND_FULL_INBOUND 8 #define GNUNET_CORE_OPTION_SEND_HDR_INBOUND 16 #define GNUNET_CORE_OPTION_SEND_FULL_OUTBOUND 32 #define GNUNET_CORE_OPTION_SEND_HDR_OUTBOUND 64 +GNUNET_NETWORK_STRUCT_BEGIN + /** * Message transmitted core clients to gnunet-service-core * to start the interaction. This header is followed by @@ -86,84 +94,89 @@ struct InitReplyMessage /** * Public key of the local peer. */ - struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded publicKey; + struct GNUNET_PeerIdentity my_identity; }; /** * Message sent by the service to clients to notify them - * about a peer connecting or disconnecting. + * about a peer connecting. */ struct ConnectNotifyMessage { /** * Header with type GNUNET_MESSAGE_TYPE_CORE_NOTIFY_CONNECT - * or GNUNET_MESSAGE_TYPE_CORE_NOTIFY_DISCONNECT. */ struct GNUNET_MessageHeader header; /** - * Available bandwidth to this peer; zero for disconnect. - * [TODO: currently set to hard-coded constant and hence - * not really useful, right?] + * Number of ATS key-value pairs that follow this struct */ - uint32_t bpm_available GNUNET_PACKED; + uint32_t ats_count GNUNET_PACKED; /** * Identity of the connecting peer. */ struct GNUNET_PeerIdentity peer; - /** - * Time of our last interaction with the peer; close - * to "now" for connect messages. - * [TODO: is this useful?] - */ - struct GNUNET_TIME_AbsoluteNBO last_activity; - }; - /** - * Message sent by the service to clients to notify them about - * messages being received or transmitted. This overall message is - * followed by the real message, or just the header of the real - * message (depending on the client's preferences). The receiver can - * tell if he got the full message or only a partial message by - * looking at the size field in the header of NotifyTrafficMessage and - * checking it with the size field in the message that follows. + * Message sent by the service to clients to notify them + * about a peer changing status. */ -struct NotifyTrafficMessage +struct PeerStatusNotifyMessage { /** - * Header with type GNUNET_MESSAGE_TYPE_CORE_NOTIFY_INBOUND - * or GNUNET_MESSAGE_TYPE_CORE_NOTIFY_OUTBOUND. + * Header with type GNUNET_MESSAGE_TYPE_CORE_NOTIFY_PEER_STATUS */ struct GNUNET_MessageHeader header; /** - * Always zero. + * Number of ATS key-value pairs that follow this struct + * (excluding the 0-terminator). */ - uint32_t reserved GNUNET_PACKED; + uint32_t ats_count GNUNET_PACKED; /** - * Identity of the receiver or sender. + * When the peer would time out (unless we see activity) + */ + struct GNUNET_TIME_AbsoluteNBO timeout; + + /** + * Available bandwidth from the peer. + */ + struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in; + + /** + * Available bandwidth to the peer. + */ + struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out; + + /** + * Identity of the peer. */ struct GNUNET_PeerIdentity peer; + /** + * First of the ATS information blocks (we must have at least + * one due to the 0-termination requirement). + */ + struct GNUNET_ATS_Information ats; + }; /** - * Message sent to the core asking for configuration - * information and possibly preference changes. + * Message sent by the service to clients to notify them + * about a peer disconnecting. */ -struct RequestConfigureMessage +struct DisconnectNotifyMessage { /** - * Header with type GNUNET_MESSAGE_TYPE_CORE_REQUEST_CONFIGURE + * Header with type GNUNET_MESSAGE_TYPE_CORE_NOTIFY_DISCONNECT. */ struct GNUNET_MessageHeader header; @@ -173,102 +186,121 @@ struct RequestConfigureMessage uint32_t reserved GNUNET_PACKED; /** - * Limit the number of bytes of outbound traffic to this - * peer to at most the specified amount (naturally, the - * amount is also limited by the receiving peer). + * Identity of the connecting peer. */ - uint32_t limit_outbound_bpm GNUNET_PACKED; + struct GNUNET_PeerIdentity peer; + +}; + +/** + * Message sent by the service to clients to notify them about + * messages being received or transmitted. This overall message is + * followed by the real message, or just the header of the real + * message (depending on the client's preferences). The receiver can + * tell if he got the full message or only a partial message by + * looking at the size field in the header of NotifyTrafficMessage and + * checking it with the size field in the message that follows. + */ +struct NotifyTrafficMessage +{ /** - * Number of bytes of inbound traffic to reserve, can - * be negative (to unreserve). NBO. + * Header with type GNUNET_MESSAGE_TYPE_CORE_NOTIFY_INBOUND + * or GNUNET_MESSAGE_TYPE_CORE_NOTIFY_OUTBOUND. */ - int32_t reserve_inbound GNUNET_PACKED; + struct GNUNET_MessageHeader header; /** - * Increment the current traffic preference for the given peer by - * the specified amont. The traffic preference is used to determine - * the share of bandwidth this peer will typcially be assigned. + * Number of ATS key-value pairs that follow this struct + * (excluding the 0-terminator). */ - double preference_change GNUNET_PACKED; + uint32_t ats_count GNUNET_PACKED; /** - * Identity of the peer being configured. + * Identity of the receiver or sender. */ struct GNUNET_PeerIdentity peer; + /* Followed by ATS information blocks: + * struct GNUNET_ATS_Information ats[ats_count] + */ + + /* Followed by payload (message or just header), variable size */ }; /** - * Response from the core to a "RequestConfigureMessage" - * providing traffic status information for a peer. + * Client notifying core about the maximum-priority + * message it has in the queue for a particular target. */ -struct ConfigurationInfoMessage +struct SendMessageRequest { /** - * Header with type GNUNET_MESSAGE_TYPE_CORE_CONFIGURATION_INFO + * Header with type GNUNET_MESSAGE_TYPE_CORE_SEND_REQUEST */ struct GNUNET_MessageHeader header; /** - * Amount of traffic (inbound number of bytes) that was reserved in - * response to the configuration change request. Negative for - * "unreserved" bytes. + * How important is this message? */ - int32_t reserved_amount GNUNET_PACKED; + uint32_t priority GNUNET_PACKED; /** - * Available bandwidth in (in bytes per minute) for this peer. - * 0 if we have been disconnected. + * By what time would the sender really like to see this + * message transmitted? */ - uint32_t bpm_in GNUNET_PACKED; + struct GNUNET_TIME_AbsoluteNBO deadline; /** - * Available bandwidth out (in bytes per minute) for this peer, - * 0 if we have been disconnected. + * Identity of the intended target. */ - uint32_t bpm_out GNUNET_PACKED; + struct GNUNET_PeerIdentity peer; /** - * Latest transport latency estimate for the peer. - * FOREVER if we have been disconnected. + * How large is the client's message queue for this peer? */ - struct GNUNET_TIME_RelativeNBO latency; + uint32_t queue_size GNUNET_PACKED; /** - * Current traffic preference for the peer. - * 0 if we have been disconnected. + * How large is the message? */ - double preference; + uint16_t size GNUNET_PACKED; /** - * Identity of the receiver or sender. + * Counter for this peer to match SMRs to replies. */ - struct GNUNET_PeerIdentity peer; + uint16_t smr_id GNUNET_PACKED; }; /** - * Core asking a client to generate traffic for a particular - * target. + * Core notifying client that it is allowed to now + * transmit a message to the given target + * (response to GNUNET_MESSAGE_TYPE_CORE_SEND_REQUEST). */ -struct SolicitTrafficMessage +struct SendMessageReady { /** - * Header with type GNUNET_MESSAGE_TYPE_CORE_SOLICIT_TRAFFIC - * or GNUNET_MESSAGE_TYPE_CORE_RECV_OK + * Header with type GNUNET_MESSAGE_TYPE_CORE_SEND_READY */ struct GNUNET_MessageHeader header; /** - * Number of bytes of traffic being solicited. + * How many bytes are allowed for transmission? + * Guaranteed to be at least as big as the requested size, + * or ZERO if the request is rejected (will timeout, + * peer disconnected, queue full, etc.). */ - uint32_t solicit_size GNUNET_PACKED; + uint16_t size GNUNET_PACKED; /** - * Identity of the receiver or sender. + * smr_id from the request. + */ + uint16_t smr_id GNUNET_PACKED; + + /** + * Identity of the intended target. */ struct GNUNET_PeerIdentity peer; @@ -276,8 +308,8 @@ struct SolicitTrafficMessage /** - * Client asking core to transmit a particular message to - * a particular target. Does NOT have to be solicited. + * Client asking core to transmit a particular message to a particular + * target (response to GNUNET_MESSAGE_TYPE_CORE_SEND_READY). */ struct SendMessage { @@ -298,11 +330,23 @@ struct SendMessage struct GNUNET_TIME_AbsoluteNBO deadline; /** - * Identity of the receiver or sender. + * Identity of the intended receiver. */ struct GNUNET_PeerIdentity peer; + /** + * GNUNET_YES if corking is allowed, GNUNET_NO if not. + */ + uint32_t cork GNUNET_PACKED; + + /** + * Always 0. + */ + uint64_t reserved GNUNET_PACKED; + }; +GNUNET_NETWORK_STRUCT_END +#endif /* end of core.h */