-there was no 0-terminator, fixing comment
[oweals/gnunet.git] / src / core / core.h
index 840c7e143a2543210e7763140a661c40eb916975..03e328ca835e9e505e9f51a50c22debbeb5282b0 100644 (file)
@@ -1,10 +1,10 @@
 /*
      This file is part of GNUnet.
 /*
      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
 
      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
  * @brief common internal definitions for core service
  * @author Christian Grothoff
  */
  * @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"
 
 #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
 
 /**
  * Definition of bits in the InitMessage's options field that specify
  * transmitted to the client.
  */
 #define GNUNET_CORE_OPTION_NOTHING             0
  * 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
 
 
 #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
 /**
  * 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.
    */
   /**
    * 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
 
 };
 
 
 /**
  * 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
  */
 struct ConnectNotifyMessage
 {
   /**
    * Header with type GNUNET_MESSAGE_TYPE_CORE_NOTIFY_CONNECT
-   * or GNUNET_MESSAGE_TYPE_CORE_NOTIFY_DISCONNECT.
    */
   struct GNUNET_MessageHeader header;
 
   /**
    */
   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;
 
 
   /**
    * 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;
 
   /**
    */
   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;
 
    */
   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;
 
    */
   struct GNUNET_MessageHeader header;
 
@@ -173,102 +186,121 @@ struct RequestConfigureMessage
   uint32_t reserved GNUNET_PACKED;
 
   /**
   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;
 
    */
   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;
 
   /**
    */
   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;
 
   /**
    */
   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;
 
    */
   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
 {
  */
 struct SendMessage
 {
@@ -298,11 +330,23 @@ struct SendMessage
   struct GNUNET_TIME_AbsoluteNBO deadline;
 
   /**
   struct GNUNET_TIME_AbsoluteNBO deadline;
 
   /**
-   * Identity of the receiver or sender.
+   * Identity of the intended receiver.
    */
   struct GNUNET_PeerIdentity peer;
 
    */
   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 */
 /* end of core.h */