-there was no 0-terminator, fixing comment
[oweals/gnunet.git] / src / core / core.h
index efa7bf1c9b035d03fd8107e734539f0b40e34df3..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"
 
 /**
  * General core debugging.
  */
 #include "gnunet_crypto_lib.h"
 #include "gnunet_time_lib.h"
 
 /**
  * General core debugging.
  */
-#define DEBUG_CORE GNUNET_YES
-
-/**
- * Debugging interaction core-clients.
- */
-#define DEBUG_CORE_CLIENT GNUNET_YES
+#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_FULL_INBOUND   4
-#define GNUNET_CORE_OPTION_SEND_HDR_INBOUND    8
-#define GNUNET_CORE_OPTION_SEND_FULL_OUTBOUND 16
-#define GNUNET_CORE_OPTION_SEND_HDR_OUTBOUND  32
+#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
 
 /**
  * Message transmitted core clients to gnunet-service-core
@@ -93,20 +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;
+
+  /**
+   * Number of ATS key-value pairs that follow this struct
+   */
+  uint32_t ats_count GNUNET_PACKED;
+
+  /**
+   * Identity of the connecting peer.
+   */
+  struct GNUNET_PeerIdentity peer;
+
+};
+
+
+/**
+ * Message sent by the service to clients to notify them
+ * about a peer changing status.
+ */
+struct PeerStatusNotifyMessage
+{
+  /**
+   * Header with type GNUNET_MESSAGE_TYPE_CORE_NOTIFY_PEER_STATUS
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Number of ATS key-value pairs that follow this struct
+   * (excluding the 0-terminator).
+   */
+  uint32_t ats_count GNUNET_PACKED;
+
+  /**
+   * 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 by the service to clients to notify them
+ * about a peer disconnecting.
+ */
+struct DisconnectNotifyMessage
+{
+  /**
+   * Header with type GNUNET_MESSAGE_TYPE_CORE_NOTIFY_DISCONNECT.
    */
   struct GNUNET_MessageHeader header;
 
    */
   struct GNUNET_MessageHeader header;
 
@@ -123,7 +193,6 @@ struct ConnectNotifyMessage
 };
 
 
 };
 
 
-
 /**
  * Message sent by the service to clients to notify them about
  * messages being received or transmitted.  This overall message is
 /**
  * Message sent by the service to clients to notify them about
  * messages being received or transmitted.  This overall message is
@@ -142,106 +211,96 @@ struct NotifyTrafficMessage
   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.
    */
   struct GNUNET_PeerIdentity peer;
 
 
   /**
    * 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 */
 };
 
 
 /**
 };
 
 
 /**
- * Message sent to the core asking for configuration
- * information and possibly preference changes.
+ * Client notifying core about the maximum-priority
+ * message it has in the queue for a particular target.
  */
  */
-struct RequestInfoMessage
+struct SendMessageRequest
 {
   /**
 {
   /**
-   * Header with type GNUNET_MESSAGE_TYPE_CORE_REQUEST_CONFIGURE
+   * Header with type GNUNET_MESSAGE_TYPE_CORE_SEND_REQUEST
    */
   struct GNUNET_MessageHeader header;
 
   /**
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * Always zero.
+   * How important is this message?
    */
    */
-  uint32_t reserved GNUNET_PACKED;
+  uint32_t priority GNUNET_PACKED;
+
+  /**
+   * By what time would the sender really like to see this
+   * message transmitted?
+   */
+  struct GNUNET_TIME_AbsoluteNBO deadline;
 
   /**
 
   /**
-   * 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 intended target.
    */
    */
-  uint32_t limit_outbound_bpm GNUNET_PACKED;
+  struct GNUNET_PeerIdentity peer;
 
   /**
 
   /**
-   * Number of bytes of inbound traffic to reserve, can
-   * be negative (to unreserve).  NBO.
+   * How large is the client's message queue for this peer?
    */
    */
-  int32_t reserve_inbound GNUNET_PACKED;
+  uint32_t queue_size GNUNET_PACKED;
 
   /**
 
   /**
-   * 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.
+   * How large is the message?
    */
    */
-  uint64_t preference_change GNUNET_PACKED;
+  uint16_t size GNUNET_PACKED;
 
   /**
 
   /**
-   * Identity of the peer being configured.
+   * Counter for this peer to match SMRs to replies.
    */
    */
-  struct GNUNET_PeerIdentity peer;
+  uint16_t smr_id GNUNET_PACKED;
 
 };
 
 
 /**
 
 };
 
 
 /**
- * Response from the core to a "RequestInfoMessage"
- * providing traffic status information for a peer.
+ * 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 ConfigurationInfoMessage
+struct SendMessageReady
 {
   /**
 {
   /**
-   * Header with type GNUNET_MESSAGE_TYPE_CORE_CONFIGURATION_INFO
+   * Header with type GNUNET_MESSAGE_TYPE_CORE_SEND_READY
    */
   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.
-   */
-  int32_t reserved_amount GNUNET_PACKED;
-
-  /**
-   * Available bandwidth in (in bytes per minute) for this peer.
-   * 0 if we have been disconnected.
-   */
-  uint32_t bpm_in GNUNET_PACKED;
-
-  /**
-   * Available bandwidth out (in bytes per minute) for this peer,
-   * 0 if we have been disconnected.
+   * 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 bpm_out GNUNET_PACKED;
+  uint16_t size GNUNET_PACKED;
 
   /**
 
   /**
-   * Latest transport latency estimate for the peer.
-   * FOREVER if we have been disconnected.
+   * smr_id from the request.
    */
    */
-  struct GNUNET_TIME_RelativeNBO latency;
+  uint16_t smr_id GNUNET_PACKED;
 
   /**
 
   /**
-   * Current traffic preference for the peer.
-   * 0 if we have been disconnected.
-   */
-  uint64_t preference;
-
-  /**
-   * Identity of the receiver or sender.
+   * Identity of the intended target.
    */
   struct GNUNET_PeerIdentity peer;
 
    */
   struct GNUNET_PeerIdentity peer;
 
@@ -249,8 +308,8 @@ struct ConfigurationInfoMessage
 
 
 /**
 
 
 /**
- * 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
 {
@@ -271,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 */