tolerate additional IPv4 address now available for gnunet.org
[oweals/gnunet.git] / src / transport / transport.h
index 87bfeb38671ee4252e9d84e29519c09ae7e8206a..ed89940ccd942692829db7b9cae2b5cc04f0ac33 100644 (file)
@@ -1,21 +1,21 @@
 /*
      This file is part of GNUnet.
-     (C) 2009-2014 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2009-2014 GNUnet e.V.
 
-     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 3, or (at your
-     option) any later version.
+     GNUnet is free software: you can redistribute it and/or modify it
+     under the terms of the GNU Affero General Public License as published
+     by the Free Software Foundation, either version 3 of the License,
+     or (at your option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-     General Public License for more details.
+     Affero General Public License for more details.
 
-     You should have received a copy of the GNU General Public License
-     along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     You should have received a copy of the GNU Affero General Public License
+     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
 */
 
 /**
@@ -28,7 +28,6 @@
 
 #include "gnunet_crypto_lib.h"
 #include "gnunet_time_lib.h"
-#include "gnunet_transport_service.h"
 #include "gnunet_constants.h"
 
 #define DEBUG_TRANSPORT GNUNET_EXTRA_LOGGING
 /**
  * Maximum frequency for re-evaluating latencies for all transport addresses.
  */
-#define LATENCY_EVALUATION_MAX_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 1)
+#define LATENCY_EVALUATION_MAX_DELAY \
+  GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 1)
 
 /**
  * Maximum frequency for re-evaluating latencies for connected addresses.
  */
-#define CONNECTED_LATENCY_EVALUATION_MAX_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 1)
+#define CONNECTED_LATENCY_EVALUATION_MAX_DELAY \
+  GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 1)
 
 /**
  * Similiar to GNUNET_TRANSPORT_NotifyDisconnect but in and out quotas are
  * @param bandwidth_out outbound bandwidth in NBO
  *
  */
-typedef void
-(*NotifyConnect) (void *cls,
-                  const struct GNUNET_PeerIdentity *peer,
-                  struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
-                  struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out);
+typedef void (*NotifyConnect) (
+  void *cls,
+  const struct GNUNET_PeerIdentity *peer,
+  struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
+  struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out);
 
 
 GNUNET_NETWORK_STRUCT_BEGIN
 
+
 /**
  * Message from the transport service to the library
  * asking to check if both processes agree about this
@@ -96,7 +98,7 @@ struct StartMessage
 
   /**
    * 0: no options
-   * 1: The 'self' field should be checked
+   * 1: The @e self field should be checked
    * 2: this client is interested in payload traffic
    */
   uint32_t options;
@@ -106,7 +108,6 @@ struct StartMessage
    * receiver should print out an error message and disconnect.
    */
   struct GNUNET_PeerIdentity self;
-
 };
 
 
@@ -122,20 +123,26 @@ struct ConnectInfoMessage
    */
   struct GNUNET_MessageHeader header;
 
-  /**
-   * Identity of the new neighbour.
-   */
-  struct GNUNET_PeerIdentity id;
+#if (defined(GNUNET_TRANSPORT_COMMUNICATION_VERSION) || \
+     defined(GNUNET_TRANSPORT_CORE_VERSION))
 
   /**
-   * Current inbound quota for this peer
+   * Always zero, for alignment.
    */
-  struct GNUNET_BANDWIDTH_Value32NBO quota_in;
+  uint32_t reserved GNUNET_PACKED;
+
+#else
 
   /**
    * Current outbound quota for this peer
    */
   struct GNUNET_BANDWIDTH_Value32NBO quota_out;
+#endif
+
+  /**
+   * Identity of the new neighbour.
+   */
+  struct GNUNET_PeerIdentity id;
 };
 
 
@@ -160,37 +167,15 @@ struct DisconnectInfoMessage
    * Who got disconnected?
    */
   struct GNUNET_PeerIdentity peer;
-
 };
 
-/**
- * Message type for sending a request connect message
- * to the transport service.  Must be done before transport
- * api will allow messages to be queued/sent to transport
- * service for transmission to a peer.
- */
-struct TransportRequestConnectMessage
-{
-  /**
-   *  Message header
-   */
-  struct GNUNET_MessageHeader header;
-
-  /**
-   * Connect (#GNUNET_YES) or connect (#GNUNET_NO).
-   */
-  uint32_t connect;
-
-  /**
-   * Identity of the peer we would like to connect to.
-   */
-  struct GNUNET_PeerIdentity peer;
-};
 
 /**
  * Message used to set a particular bandwidth quota.  Sent TO the
  * service to set an incoming quota, sent FROM the service to update
  * an outgoing quota.
+ *
+ * NOTE: no longer used in TNG!
  */
 struct QuotaSetMessage
 {
@@ -209,7 +194,6 @@ struct QuotaSetMessage
    * About which peer are we talking here?
    */
   struct GNUNET_PeerIdentity peer;
-
 };
 
 
@@ -229,7 +213,6 @@ struct InboundMessage
    * Which peer sent the message?
    */
   struct GNUNET_PeerIdentity peer;
-
 };
 
 
@@ -245,62 +228,64 @@ struct SendOkMessage
    */
   struct GNUNET_MessageHeader header;
 
+#if (defined(GNUNET_TRANSPORT_COMMUNICATION_VERSION) || \
+     defined(GNUNET_TRANSPORT_CORE_VERSION))
+
+  uint32_t reserved GNUNET_PACKED;
+
+#else
+
   /**
    * #GNUNET_OK if the transmission succeeded,
    * #GNUNET_SYSERR if it failed (i.e. network disconnect);
    * in either case, it is now OK for this client to
    * send us another message for the given peer.
    */
-  uint32_t success GNUNET_PACKED;
+  uint16_t success GNUNET_PACKED;
 
   /**
    * Size of message sent
    */
-  uint32_t bytes_msg GNUNET_PACKED;
+  uint16_t bytes_msg GNUNET_PACKED;
 
   /**
-   * Size of message sent over wire
-   * Includes plugin and protocol specific overhead
+   * Size of message sent over wire.
+   * Includes plugin and protocol specific overheads.
    */
   uint32_t bytes_physical GNUNET_PACKED;
 
-  /**
-   * Latency estimate.
-   */
-  struct GNUNET_TIME_RelativeNBO latency;
+#endif
 
   /**
    * Which peer can send more now?
    */
   struct GNUNET_PeerIdentity peer;
-
 };
 
+
 /**
- * Message used to notify the transport API about an address to string
- * conversion. Message is followed by the string with the humand-readable
- * address.  For each lookup, multiple results may be returned.  The
- * last message must have a @e res of #GNUNET_OK and an @e addr_len
- * of zero.
+ * Message used to notify the transport API that it can
+ * send another message to the transport service.
+ * (Used to implement flow control.)
  */
-struct AddressToStringResultMessage
+struct RecvOkMessage
 {
 
   /**
-   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING_REPLY
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_RECV_OK
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * #GNUNET_OK if the conversion succeeded,
-   * #GNUNET_SYSERR if it failed
+   * Number of messages by which to increase the window, greater or
+   * equal to one.
    */
-  uint32_t res GNUNET_PACKED;
+  uint32_t increase_window_delta GNUNET_PACKED;
 
   /**
-   * Length of the following string, zero if @e is #GNUNET_SYSERR
+   * Which peer can CORE handle more from now?
    */
-  uint32_t addr_len GNUNET_PACKED;
+  struct GNUNET_PeerIdentity peer;
 };
 
 
@@ -321,16 +306,51 @@ struct OutboundMessage
    */
   uint32_t reserved GNUNET_PACKED;
 
+#if ! (defined(GNUNET_TRANSPORT_COMMUNICATION_VERSION) || \
+       defined(GNUNET_TRANSPORT_CORE_VERSION))
+
   /**
    * Allowed delay.
    */
   struct GNUNET_TIME_RelativeNBO timeout;
+#endif
 
   /**
    * Which peer should receive the message?
    */
   struct GNUNET_PeerIdentity peer;
+};
+
+
+#if ! (defined(GNUNET_TRANSPORT_COMMUNICATION_VERSION) || \
+       defined(GNUNET_TRANSPORT_CORE_VERSION))
+
+
+/**
+ * Message used to notify the transport API about an address to string
+ * conversion. Message is followed by the string with the humand-readable
+ * address.  For each lookup, multiple results may be returned.  The
+ * last message must have a @e res of #GNUNET_OK and an @e addr_len
+ * of zero.
+ */
+struct AddressToStringResultMessage
+{
 
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING_REPLY
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * #GNUNET_OK if the conversion succeeded,
+   * #GNUNET_SYSERR if it failed
+   */
+  uint32_t res GNUNET_PACKED;
+
+  /**
+   * Length of the following string, zero if @e is #GNUNET_SYSERR
+   */
+  uint32_t addr_len GNUNET_PACKED;
 };
 
 
@@ -434,6 +454,7 @@ struct ValidationIterateResponseMessage
   struct GNUNET_TIME_AbsoluteNBO next_validation;
 };
 
+
 /**
  * Message from the library to the transport service
  * asking for binary addresses known for a peer.
@@ -448,13 +469,12 @@ struct ValidationMonitorMessage
   /**
    * One shot call or continous replies?
    */
-  uint32_t one_shot;
+  uint32_t one_shot GNUNET_PACKED;
 
   /**
    * The identity of the peer to look up.
    */
   struct GNUNET_PeerIdentity peer;
-
 };
 
 
@@ -472,13 +492,12 @@ struct PeerMonitorMessage
   /**
    * One shot call or continous replies?
    */
-  uint32_t one_shot;
+  uint32_t one_shot GNUNET_PACKED;
 
   /**
    * The identity of the peer to look up.
    */
   struct GNUNET_PeerIdentity peer;
-
 };
 
 
@@ -494,19 +513,29 @@ struct TrafficMetricMessage
   struct GNUNET_MessageHeader header;
 
   /**
-   * SEND, RECEIVE or BOTH?
+   * Always zero.
    */
-  uint16_t direction;
+  uint32_t reserved GNUNET_PACKED;
 
   /**
-   * Traffic metrics count
+   * The identity of the peer to look up.
    */
-  uint16_t ats_count;
+  struct GNUNET_PeerIdentity peer;
 
   /**
-   * The identity of the peer to look up.
+   * Fake properties to generate.
    */
-  struct GNUNET_PeerIdentity peer;
+  struct GNUNET_ATS_PropertiesNBO properties;
+
+  /**
+   * Fake delay to add on inbound traffic.
+   */
+  struct GNUNET_TIME_RelativeNBO delay_in;
+
+  /**
+   * Fake delay to add on outbound traffic.
+   */
+  struct GNUNET_TIME_RelativeNBO delay_out;
 };
 
 
@@ -561,7 +590,6 @@ struct PeerIterateResponseMessage
    * Length of the plugin name
    */
   uint32_t pluginlen GNUNET_PACKED;
-
 };
 
 
@@ -588,7 +616,6 @@ struct BlacklistMessage
    * Which peer is being blacklisted or queried?
    */
   struct GNUNET_PeerIdentity peer;
-
 };
 
 
@@ -599,14 +626,24 @@ struct TransportPluginMonitorMessage
 {
 
   /**
-   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_PLUGIN_MONITOR_EVENT.
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PLUGIN_EVENT.
    */
   struct GNUNET_MessageHeader header;
 
   /**
    * An `enum GNUNET_TRANSPORT_SessionState` in NBO.
    */
-  int32_t session_state GNUNET_PACKED;
+  uint16_t session_state GNUNET_PACKED;
+
+  /**
+   * #GNUNET_YES if this is an inbound connection,
+   * #GNUNET_NO if this is an outbound connection,
+   * #GNUNET_SYSERR if connections of this plugin
+   *             are so fundamentally bidirectional
+   *             that they have no 'initiator'
+   * Value given in NBO.
+   */
+  int16_t is_inbound GNUNET_PACKED;
 
   /**
    * Number of messages waiting transmission.
@@ -624,9 +661,9 @@ struct TransportPluginMonitorMessage
   struct GNUNET_TIME_AbsoluteNBO timeout;
 
   /**
-   * What is the expected latency?
+   * Until how long is this plugin currently blocked from reading?
    */
-  struct GNUNET_TIME_RelativeNBO delay;
+  struct GNUNET_TIME_AbsoluteNBO delay;
 
   /**
    * Which peer is this connection for?
@@ -634,7 +671,12 @@ struct TransportPluginMonitorMessage
   struct GNUNET_PeerIdentity peer;
 
   /**
-   * Length of the plugin name in bytes, excluding 0-termination.
+   * Unique identifier for the session.
+   */
+  uint64_t session_id;
+
+  /**
+   * Length of the plugin name in bytes, including 0-termination.
    */
   uint16_t plugin_name_len GNUNET_PACKED;
 
@@ -643,12 +685,534 @@ struct TransportPluginMonitorMessage
    */
   uint16_t plugin_address_len GNUNET_PACKED;
 
-  /* followed by 0-terminated plugin name and 
+  /* followed by 0-terminated plugin name and
      @e plugin_address_len bytes of plugin address */
+};
+
+#else
+
+/* *********************** TNG messages ***************** */
 
+/**
+ * Communicator goes online.  Note which addresses it can
+ * work with.
+ */
+struct GNUNET_TRANSPORT_CommunicatorAvailableMessage
+{
+
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_NEW_COMMUNICATOR.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * NBO encoding of `enum GNUNET_TRANSPORT_CommunicatorCharacteristics`
+   */
+  uint32_t cc;
+
+  /* Followed by the address prefix of the communicator */
+};
+
+
+/**
+ * Add address to the list.
+ */
+struct GNUNET_TRANSPORT_AddAddressMessage
+{
+
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_ADD_ADDRESS.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Address identifier (used during deletion).
+   */
+  uint32_t aid GNUNET_PACKED;
+
+  /**
+   * When does the address expire?
+   */
+  struct GNUNET_TIME_RelativeNBO expiration;
+
+  /**
+   * An `enum GNUNET_NetworkType` in NBO.
+   */
+  uint32_t nt;
+
+  /* followed by UTF-8 encoded, 0-terminated human-readable address */
+};
+
+
+/**
+ * Remove address from the list.
+ */
+struct GNUNET_TRANSPORT_DelAddressMessage
+{
+
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_DEL_ADDRESS.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Address identifier.
+   */
+  uint32_t aid GNUNET_PACKED;
+};
+
+
+/**
+ * Inform transport about an incoming message.
+ */
+struct GNUNET_TRANSPORT_IncomingMessage
+{
+
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_INCOMING_MSG.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Do we use flow control or not?
+   */
+  uint32_t fc_on GNUNET_PACKED;
+
+  /**
+   * 64-bit number to identify the matching ACK.
+   */
+  uint64_t fc_id GNUNET_PACKED;
+
+  /**
+   * How long does the communicator believe the address on which
+   * the message was received to remain valid?
+   */
+  struct GNUNET_TIME_RelativeNBO expected_address_validity;
+
+  /**
+   * Sender identifier.
+   */
+  struct GNUNET_PeerIdentity sender;
+
+  /* followed by the message */
+};
+
+
+/**
+ * Transport informs us about being done with an incoming message.
+ * (only sent if fc_on was set).
+ */
+struct GNUNET_TRANSPORT_IncomingMessageAck
+{
+
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_INCOMING_MSG_ACK.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Reserved (0)
+   */
+  uint32_t reserved GNUNET_PACKED;
+
+  /**
+   * Which message is being ACKed?
+   */
+  uint64_t fc_id GNUNET_PACKED;
+
+  /**
+   * Sender identifier of the original message.
+   */
+  struct GNUNET_PeerIdentity sender;
 };
 
 
+/**
+ * Add queue to the transport
+ */
+struct GNUNET_TRANSPORT_AddQueueMessage
+{
+
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_SETUP.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Queue identifier (used to identify the queue).
+   */
+  uint32_t qid GNUNET_PACKED;
+
+  /**
+   * Receiver that can be addressed via the queue.
+   */
+  struct GNUNET_PeerIdentity receiver;
+
+  /**
+   * An `enum GNUNET_NetworkType` in NBO.
+   */
+  uint32_t nt;
+
+  /**
+   * Maximum transmission unit, in NBO.  UINT32_MAX for unlimited.
+   */
+  uint32_t mtu;
+
+  /**
+   * An `enum GNUNET_TRANSPORT_ConnectionStatus` in NBO.
+   */
+  uint32_t cs;
+
+  /* followed by UTF-8 encoded, 0-terminated human-readable address */
+};
+
+
+/**
+ * Remove queue, it is no longer available.
+ */
+struct GNUNET_TRANSPORT_DelQueueMessage
+{
+
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_TEARDOWN.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Address identifier.
+   */
+  uint32_t qid GNUNET_PACKED;
+
+  /**
+   * Receiver that can be addressed via the queue.
+   */
+  struct GNUNET_PeerIdentity receiver;
+};
+
+
+/**
+ * Transport tells communicator that it wants a new queue.
+ */
+struct GNUNET_TRANSPORT_CreateQueue
+{
+
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Unique ID for the request.
+   */
+  uint32_t request_id GNUNET_PACKED;
+
+  /**
+   * Receiver that can be addressed via the queue.
+   */
+  struct GNUNET_PeerIdentity receiver;
+
+  /* followed by UTF-8 encoded, 0-terminated human-readable address */
+};
+
+
+/**
+ * Communicator tells transport how queue creation went down.
+ */
+struct GNUNET_TRANSPORT_CreateQueueResponse
+{
+
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_OK or
+   * #GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_FAIL.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Unique ID for the request.
+   */
+  uint32_t request_id GNUNET_PACKED;
+};
+
+
+/**
+ * Inform communicator about transport's desire to send a message.
+ */
+struct GNUNET_TRANSPORT_SendMessageTo
+{
+
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_MSG.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Which queue should we use?
+   */
+  uint32_t qid GNUNET_PACKED;
+
+  /**
+   * Message ID, used for flow control.
+   */
+  uint64_t mid GNUNET_PACKED;
+
+  /**
+   * Receiver identifier.
+   */
+  struct GNUNET_PeerIdentity receiver;
+
+  /* followed by the message */
+};
+
+
+/**
+ * Inform transport that message was sent.
+ */
+struct GNUNET_TRANSPORT_SendMessageToAck
+{
+
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_MSG_ACK.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Success (#GNUNET_OK), failure (#GNUNET_SYSERR).
+   */
+  uint32_t status GNUNET_PACKED;
+
+  /**
+   * Message ID of the original message.
+   */
+  uint64_t mid GNUNET_PACKED;
+
+  /**
+   * Receiver identifier.
+   */
+  struct GNUNET_PeerIdentity receiver;
+};
+
+
+/**
+ * Message from communicator to transport service asking for
+ * transmission of a backchannel message with the given peer @e pid
+ * and communicator.
+ */
+struct GNUNET_TRANSPORT_CommunicatorBackchannel
+{
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_COMMUNICATOR_BACKCHANNEL
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Always zero, for alignment.
+   */
+  uint32_t reserved;
+
+  /**
+   * Target peer.
+   */
+  struct GNUNET_PeerIdentity pid;
+
+  /* Followed by a `struct GNUNET_MessageHeader` with the encapsulated
+     message to the communicator */
+
+  /* Followed by the 0-terminated string specifying the desired
+     communicator at the target (@e pid) peer */
+};
+
+
+/**
+ * Message from transport to communicator passing along a backchannel
+ * message from the given peer @e pid.
+ */
+struct GNUNET_TRANSPORT_CommunicatorBackchannelIncoming
+{
+  /**
+   * Type will be
+   * #GNUNET_MESSAGE_TYPE_TRANSPORT_COMMUNICATOR_BACKCHANNEL_INCOMING
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Always zero, for alignment.
+   */
+  uint32_t reserved;
+
+  /**
+   * Origin peer.
+   */
+  struct GNUNET_PeerIdentity pid;
+
+  /* Followed by a `struct GNUNET_MessageHeader` with the encapsulated
+     message to the communicator */
+};
+
+
+/**
+ * Request to start monitoring.
+ */
+struct GNUNET_TRANSPORT_MonitorStart
+{
+
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_START.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * #GNUNET_YES for one-shot montoring, #GNUNET_NO for continuous monitoring.
+   */
+  uint32_t one_shot;
+
+  /**
+   * Target identifier to monitor, all zeros for "all peers".
+   */
+  struct GNUNET_PeerIdentity peer;
+};
+
+
+/**
+ * Monitoring data.
+ */
+struct GNUNET_TRANSPORT_MonitorData
+{
+
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_DATA.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Network type (an `enum GNUNET_NetworkType` in NBO).
+   */
+  uint32_t nt GNUNET_PACKED;
+
+  /**
+   * Target identifier.
+   */
+  struct GNUNET_PeerIdentity peer;
+
+  /**
+   * @deprecated To be discussed if we keep these...
+   */
+  struct GNUNET_TIME_AbsoluteNBO last_validation;
+  struct GNUNET_TIME_AbsoluteNBO valid_until;
+  struct GNUNET_TIME_AbsoluteNBO next_validation;
+
+  /**
+   * Current round-trip time estimate.
+   */
+  struct GNUNET_TIME_RelativeNBO rtt;
+
+  /**
+   * Connection status (in NBO).
+   */
+  uint32_t cs GNUNET_PACKED;
+
+  /**
+   * Messages pending (in NBO).
+   */
+  uint32_t num_msg_pending GNUNET_PACKED;
+
+  /**
+   * Bytes pending (in NBO).
+   */
+  uint32_t num_bytes_pending GNUNET_PACKED;
+
+  /* Followed by 0-terminated address of the peer */
+};
+
+
+/**
+ * Request to verify address.
+ */
+struct GNUNET_TRANSPORT_AddressToVerify
+{
+
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_CONSIDER_VERIFY.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Reserved. 0.
+   */
+  uint32_t reserved;
+
+  /**
+   * Peer the address is from.
+   */
+  struct GNUNET_PeerIdentity peer;
+
+  /* followed by variable-size raw address */
+};
+
+
+/**
+ * Application client to TRANSPORT service: we would like to have
+ * address suggestions for this peer.
+ */
+struct ExpressPreferenceMessage
+{
+  /**
+   * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST or
+   * #GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST_CANCEL to stop
+   * suggestions.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * What type of performance preference does the client have?
+   * A `enum GNUNET_MQ_PreferenceKind` in NBO.
+   */
+  uint32_t pk GNUNET_PACKED;
+
+  /**
+   * Peer to get address suggestions for.
+   */
+  struct GNUNET_PeerIdentity peer;
+
+  /**
+   * How much bandwidth in bytes/second does the application expect?
+   */
+  struct GNUNET_BANDWIDTH_Value32NBO bw;
+};
+
+
+/**
+ * We got an address of another peer, TRANSPORT service
+ * should validate it.  There is no response.
+ */
+struct RequestHelloValidationMessage
+{
+
+  /**
+   * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_REQUEST_HELLO_VALIDATION.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * What type of network does the other peer claim this is?
+   * A `enum GNUNET_NetworkType` in NBO.
+   */
+  uint32_t nt GNUNET_PACKED;
+
+  /**
+   * Peer to the address is presumably for.
+   */
+  struct GNUNET_PeerIdentity peer;
+
+  /**
+   * When does the address expire?
+   */
+  struct GNUNET_TIME_AbsoluteNBO expiration;
+
+  /* followed by 0-terminated address to validate */
+};
+
+#endif
+
 GNUNET_NETWORK_STRUCT_END
 
 /* end of transport.h */