-fix (C) notices
[oweals/gnunet.git] / src / transport / transport.h
index f1376f5a763dfab70c1f95a6d0072c9ca509a668..17e4f3c215d5659a5231cfddd9e815618df6df0f 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2009 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
@@ -14,8 +14,8 @@
 
      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.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 
 /**
  * @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
 
@@ -89,7 +90,7 @@ struct StartMessage
 {
 
   /**
-   * Type will be GNUNET_MESSAGE_TYPE_TRANSPORT_START
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_START
    */
   struct GNUNET_MessageHeader header;
 
@@ -117,7 +118,7 @@ struct ConnectInfoMessage
 {
 
   /**
-   * Type will be GNUNET_MESSAGE_TYPE_TRANSPORT_CONNECT
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_CONNECT
    */
   struct GNUNET_MessageHeader header;
 
@@ -146,7 +147,7 @@ struct DisconnectInfoMessage
 {
 
   /**
-   * Type will be GNUNET_MESSAGE_TYPE_TRANSPORT_DISCONNECT
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_DISCONNECT
    */
   struct GNUNET_MessageHeader header;
 
@@ -162,29 +163,6 @@ struct DisconnectInfoMessage
 
 };
 
-/**
- * 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;
-
-  /**
-   * For alignment.
-   */
-  uint32_t reserved;
-
-  /**
-   * 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
@@ -195,7 +173,7 @@ struct QuotaSetMessage
 {
 
   /**
-   * Type will be GNUNET_MESSAGE_TYPE_TRANSPORT_SET_QUOTA
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_SET_QUOTA
    */
   struct GNUNET_MessageHeader header;
 
@@ -220,7 +198,7 @@ struct InboundMessage
 {
 
   /**
-   * Type will be GNUNET_MESSAGE_TYPE_TRANSPORT_RECV
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_RECV
    */
   struct GNUNET_MessageHeader header;
 
@@ -240,19 +218,18 @@ struct SendOkMessage
 {
 
   /**
-   * Type will be GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * GNUNET_OK if the transmission succeeded,
-   * GNUNET_SYSERR if it failed (i.e. network disconnect);
+   * #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;
 
-
   /**
    * Size of message sent
    */
@@ -265,15 +242,37 @@ struct SendOkMessage
   uint32_t bytes_physical GNUNET_PACKED;
 
   /**
-   * Latency estimate.
+   * 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.
+ */
+struct AddressToStringResultMessage
+{
+
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING_REPLY
    */
-  struct GNUNET_TIME_RelativeNBO latency;
+  struct GNUNET_MessageHeader header;
 
   /**
-   * Which peer can send more now?
+   * #GNUNET_OK if the conversion succeeded,
+   * #GNUNET_SYSERR if it failed
    */
-  struct GNUNET_PeerIdentity peer;
+  uint32_t res GNUNET_PACKED;
 
+  /**
+   * Length of the following string, zero if @e is #GNUNET_SYSERR
+   */
+  uint32_t addr_len GNUNET_PACKED;
 };
 
 
@@ -285,14 +284,14 @@ struct OutboundMessage
 {
 
   /**
-   * Type will be GNUNET_MESSAGE_TYPE_TRANSPORT_SEND
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_SEND
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * Message priority.
+   * Always zero.
    */
-  uint32_t priority GNUNET_PACKED;
+  uint32_t reserved GNUNET_PACKED;
 
   /**
    * Allowed delay.
@@ -316,7 +315,7 @@ struct AddressLookupMessage
 {
 
   /**
-   * Type will be GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING
    */
   struct GNUNET_MessageHeader header;
 
@@ -332,23 +331,29 @@ struct AddressLookupMessage
   uint16_t addrlen GNUNET_PACKED;
 
   /**
-   * timeout to give up.
+   * timeout to give up (for DNS resolution timeout mostly)
    */
   struct GNUNET_TIME_RelativeNBO timeout;
 
-  /* followed by 'addrlen' bytes of the actual address, then
+  /* followed by @e addrlen bytes of the actual address, then
    * followed by the 0-terminated name of the transport */
 };
 
 
 /**
- * Message from the library to the transport service
- * asking for human readable addresses known for a peer.
+ * Message from the transport service to the library containing information
+ * about a peer. Information contained are:
+ * - current address used to communicate with this peer
+ * - state
+ * - state timeout
+ *
+ * Memory layout:
+ * [AddressIterateResponseMessage][address[addrlen]][transportname[pluginlen]]
  */
-struct PeerAddressLookupMessage
+struct ValidationIterateResponseMessage
 {
   /**
-   * Type will be GNUNET_MESSAGE_TYPE_TRANSPORT_PEER_ADDRESS_LOOKUP
+   * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_VALIDATION_RESPONSE
    */
   struct GNUNET_MessageHeader header;
 
@@ -358,37 +363,88 @@ struct PeerAddressLookupMessage
   uint32_t reserved;
 
   /**
-   * timeout to give up.  FIXME: remove in the future.
+   * Peer identity
    */
-  struct GNUNET_TIME_RelativeNBO timeout;
+  struct GNUNET_PeerIdentity peer;
 
   /**
-   * The identity of the peer to look up.
+   * Local info about the address
    */
-  struct GNUNET_PeerIdentity peer;
-};
+  uint32_t local_address_info GNUNET_PACKED;
+
+  /**
+   * Address length
+   */
+  uint32_t addrlen GNUNET_PACKED;
+
+  /**
+   * Length of the plugin name
+   */
+  uint32_t pluginlen GNUNET_PACKED;
+
+  /**
+   * State
+   */
+  uint32_t state GNUNET_PACKED;
+
+  /**
+   * At what time did we successfully validate the address last.
+   * Will be NEVER if the address failed validation.
+   */
+  struct GNUNET_TIME_AbsoluteNBO last_validation;
 
+  /**
+   * Until when is the address believed to be valid.
+   * Will be ZERO if the address is not belived to be valid.
+   */
+  struct GNUNET_TIME_AbsoluteNBO valid_until;
+
+  /**
+   * When will we next try to validate the address (typically
+   * done before @e valid_until happens).
+   */
+  struct GNUNET_TIME_AbsoluteNBO next_validation;
+};
 
 /**
  * Message from the library to the transport service
  * asking for binary addresses known for a peer.
  */
-struct AddressIterateMessage
+struct ValidationMonitorMessage
 {
   /**
-   * Type will be GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_ITERATE
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_VALIDATION_REQUEST
    */
   struct GNUNET_MessageHeader header;
 
   /**
    * One shot call or continous replies?
    */
-  uint32_t one_shot;
+  uint32_t one_shot GNUNET_PACKED;
 
   /**
-   * timeout to give up.  FIXME: remove in the future
+   * The identity of the peer to look up.
    */
-  struct GNUNET_TIME_AbsoluteNBO timeout;
+  struct GNUNET_PeerIdentity peer;
+
+};
+
+
+/**
+ * Message from the library to the transport service
+ * asking for binary addresses known for a peer.
+ */
+struct PeerMonitorMessage
+{
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PEER_REQUEST
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * One shot call or continous replies?
+   */
+  uint32_t one_shot GNUNET_PACKED;
 
   /**
    * The identity of the peer to look up.
@@ -405,37 +461,51 @@ struct AddressIterateMessage
 struct TrafficMetricMessage
 {
   /**
-   * Type will be GNUNET_MESSAGE_TYPE_TRANSPORT_TRAFFIC_METRIC
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_TRAFFIC_METRIC
    */
   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;
 };
 
 
 /**
- * Message from the transport service to the library
- * containing binary addresses known for a peer.
+ * Message from the transport service to the library containing information
+ * about a peer. Information contained are:
+ * - current address used to communicate with this peer
+ * - state
+ * - state timeout
+ *
  * Memory layout:
  * [AddressIterateResponseMessage][address[addrlen]][transportname[pluginlen]]
  */
-struct AddressIterateResponseMessage
+struct PeerIterateResponseMessage
 {
   /**
-   * Type will be GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_ITERATE_RESPONSE
+   * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PEER_RESPONSE
    */
   struct GNUNET_MessageHeader header;
 
@@ -444,18 +514,33 @@ struct AddressIterateResponseMessage
    */
   uint32_t reserved;
 
-    /**
+  /**
    * Peer identity
    */
   struct GNUNET_PeerIdentity peer;
 
   /**
-   * address length
+   * Timeout for the state this peer is in
+   */
+  struct GNUNET_TIME_AbsoluteNBO state_timeout;
+
+  /**
+   * Local info about the address
+   */
+  uint32_t local_address_info GNUNET_PACKED;
+
+  /**
+   * State this peer is in as an `enum GNUNET_TRANSPORT_PeerState`
+   */
+  uint32_t state GNUNET_PACKED;
+
+  /**
+   * Address length
    */
   uint32_t addrlen GNUNET_PACKED;
 
   /**
-   * length of the plugin name
+   * Length of the plugin name
    */
   uint32_t pluginlen GNUNET_PACKED;
 
@@ -470,13 +555,13 @@ struct BlacklistMessage
 {
 
   /**
-   * Type will be GNUNET_MESSAGE_TYPE_TRANSPORT_BLACKLIST_QUERY or
-   * GNUNET_MESSAGE_TYPE_TRANSPORT_BLACKLIST_REPLY.
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_BLACKLIST_QUERY or
+   * #GNUNET_MESSAGE_TYPE_TRANSPORT_BLACKLIST_REPLY.
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * 0 for the query, GNUNET_OK (allowed) or GNUNET_SYSERR (disallowed)
+   * 0 for the query, #GNUNET_OK (allowed) or #GNUNET_SYSERR (disallowed)
    * for the response.
    */
   uint32_t is_allowed GNUNET_PACKED;
@@ -487,6 +572,80 @@ struct BlacklistMessage
   struct GNUNET_PeerIdentity peer;
 
 };
+
+
+/**
+ * Transport-level connection status update.
+ */
+struct TransportPluginMonitorMessage
+{
+
+  /**
+   * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PLUGIN_EVENT.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * An `enum GNUNET_TRANSPORT_SessionState` in NBO.
+   */
+  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.
+   */
+  uint32_t msgs_pending GNUNET_PACKED;
+
+  /**
+   * Number of bytes waiting for transmission.
+   */
+  uint32_t bytes_pending GNUNET_PACKED;
+
+  /**
+   * When will this transport plugin session time out?
+   */
+  struct GNUNET_TIME_AbsoluteNBO timeout;
+
+  /**
+   * Until how long is this plugin currently blocked from reading?
+   */
+  struct GNUNET_TIME_AbsoluteNBO delay;
+
+  /**
+   * Which peer is this connection for?
+   */
+  struct GNUNET_PeerIdentity peer;
+
+  /**
+   * 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;
+
+  /**
+   * Length of the plugin address in bytes.
+   */
+  uint16_t plugin_address_len GNUNET_PACKED;
+
+  /* followed by 0-terminated plugin name and
+     @e plugin_address_len bytes of plugin address */
+
+};
+
+
 GNUNET_NETWORK_STRUCT_END
 
 /* end of transport.h */