extend API to enalbe exclusive port ranges to be specified for testing-system objects
[oweals/gnunet.git] / src / include / gnunet_ats_service.h
index f2d1c2aad4fd9b42e7a11f89ae44b6a00c88ca12..e8e7abb5b116f7d32149b023ea6d14d510aa5c5d 100644 (file)
 
 #include "gnunet_constants.h"
 #include "gnunet_util_lib.h"
+#include "gnunet_hello_lib.h"
 
 
+enum GNUNET_ATS_Network_Type
+{
+  GNUNET_ATS_NET_UNSPECIFIED = 0,
+  GNUNET_ATS_NET_LOOPBACK = 1,
+  GNUNET_ATS_NET_LAN = 2,
+  GNUNET_ATS_NET_WAN = 3,
+  GNUNET_ATS_NET_WLAN = 4,
+};
+
 /**
  * Enum defining all known property types for ATS Enum values are used
  * in the GNUNET_ATS_Information struct as
@@ -49,18 +59,24 @@ enum GNUNET_ATS_Property
 
   /**
    * Actual traffic on this connection from the other peer to this peer.
-   * 
+   *
    * Unit: [bytes/second]
    */
   GNUNET_ATS_UTILIZATION_UP,
 
   /**
    * Actual traffic on this connection from this peer to the other peer.
-   * 
+   *
    * Unit: [bytes/second]
    */
   GNUNET_ATS_UTILIZATION_DOWN,
 
+  /**
+   * Is this address located in WAN, LAN or a loopback address
+   * Value is element of GNUNET_ATS_Network_Type
+   */
+  GNUNET_ATS_NETWORK_TYPE,
+
   /**
    * Delay
    * Time between when the time packet is sent and the packet arrives
@@ -74,14 +90,14 @@ enum GNUNET_ATS_Property
    * Dialup:  500
    */
   GNUNET_ATS_QUALITY_NET_DELAY,
+
   /**
    * Distance on network layer (required for distance-vector routing).
    *
    * Unit: [DV-hops]
    */
   GNUNET_ATS_QUALITY_NET_DISTANCE,
+
   /**
    * Network overhead on WAN (Wide-Area Network)
    *
@@ -102,7 +118,7 @@ enum GNUNET_ATS_Property
    * UDP/IPv6 over Ethernet: 1024 + 38 + 40 + 8  = 1110 [bytes/kb]
    */
   GNUNET_ATS_COST_WAN,
+
   /**
    * Network overhead on LAN (Local-Area Network)
    *
@@ -123,7 +139,7 @@ enum GNUNET_ATS_Property
    * UDP/IPv6 over Ethernet: 1024 + 38 + 40 + 8  = 1110 [bytes/kb]
    */
   GNUNET_ATS_COST_LAN,
-  
+
   /**
    * Network overhead on WLAN (Wireless Local Area Network)
    *
@@ -144,12 +160,8 @@ enum GNUNET_ATS_Property
    * UDP/IPv6 over Ethernet: 1024 + 38 + 40 + 8  = 1110 [bytes/kb]
    */
   GNUNET_ATS_COST_WLAN
-
-
-  /* Cost related values */
-  /* =================== */
-
+      /* Cost related values */
+      /* =================== */
   /**
    * Volume based cost in financial units to transmit data
    *
@@ -166,8 +178,7 @@ enum GNUNET_ATS_Property
    * LAN:  0 [cent/MB]
    * 2G : 10 [cent/MB]
    */
-  // GNUNET_ATS_COST_FINANCIAL_PER_VOLUME = 1,
-
+      // GNUNET_ATS_COST_FINANCIAL_PER_VOLUME = 1,
   /**
    * Time based cost in financial units to transmit data
    *
@@ -184,8 +195,7 @@ enum GNUNET_ATS_Property
    * LAN   :  0 [cent/h]
    * Dialup: 10 [cent/h]
    */
-  // GNUNET_ATS_COST_FINANCIAL_PER_TIME = 2,
-
+      // GNUNET_ATS_COST_FINANCIAL_PER_TIME = 2,
   /**
    * Computational costs
    *
@@ -204,8 +214,7 @@ enum GNUNET_ATS_Property
    * HTTPS with AES CBC-128:   5,279
    * HTTPS with RC4-1024:      2,652
    */
-  // GNUNET_ATS_COST_COMPUTATIONAL = 3,
-
+      // GNUNET_ATS_COST_COMPUTATIONAL = 3,
   /**
    * Energy consumption
    *
@@ -233,8 +242,7 @@ enum GNUNET_ATS_Property
    * WLAN:      89 (600 mW @ 802.11g /w 54 MBit/s)
    * Bluetooth: 267 (100 mW @ BT2.0 EDR /w 3 MBit/s)
    */
-  // GNUNET_ATS_COST_ENERGY_CONSUMPTION = 4,
-
+      // GNUNET_ATS_COST_ENERGY_CONSUMPTION = 4,
   /**
    * Connect cost
    * How many bytes are transmitted to initiate a new connection using
@@ -256,8 +264,7 @@ enum GNUNET_ATS_Property
    *  2129 bytes Ethernet, 1975 bytes TCP/IP, 1755 bytes TCP, 1403 bytes HTTPS
    *
    * */
-  // GNUNET_ATS_COST_CONNECT = 5,
-
+      // GNUNET_ATS_COST_CONNECT = 5,
   /**
    * Bandwidth cost
    *
@@ -274,8 +281,7 @@ enum GNUNET_ATS_Property
    * Dial-up: 8       (64 Kbit/s)
    *
    */
-  // GNUNET_ATS_COST_BANDWITH_AVAILABLE = 6,
-
+      // GNUNET_ATS_COST_BANDWITH_AVAILABLE = 6,
   /**
    *  Network overhead
    *
@@ -295,35 +301,28 @@ enum GNUNET_ATS_Property
    * UDP/IPv4 over Ethernet: 1024 + 38 + 20 + 8  = 1090 [bytes/kb]
    * UDP/IPv6 over Ethernet: 1024 + 38 + 40 + 8  = 1110 [bytes/kb]
    */
-  // GNUNET_ATS_COST_NETWORK_OVERHEAD = 7,
-
-
-  /* Quality related values */
-  /* ====================== */
-
-  /* Physical layer quality properties */
-
+      // GNUNET_ATS_COST_NETWORK_OVERHEAD = 7,
+      /* Quality related values */
+      /* ====================== */
+      /* Physical layer quality properties */
   /**
    * Signal strength on physical layer
    *
    * Unit: [dBm]
    */
-  // GNUNET_ATS_QUALITY_PHY_SIGNAL_STRENGTH = 1025,
-
+      // GNUNET_ATS_QUALITY_PHY_SIGNAL_STRENGTH = 1025,
   /**
    * Collision rate on physical layer
    *
    * Unit: [B/s]
    */
-  // GNUNET_ATS_QUALITY_PHY_COLLISION_RATE = 1026,
-
+      // GNUNET_ATS_QUALITY_PHY_COLLISION_RATE = 1026,
   /**
    * Error rate on physical layer
    *
    * Unit: [B/s]
    */
-  // GNUNET_ATS_QUALITY_PHY_ERROR_RATE = 1027,
-
+      // GNUNET_ATS_QUALITY_PHY_ERROR_RATE = 1027,
   /**
    * Jitter
    * Time variations of the delay
@@ -331,8 +330,7 @@ enum GNUNET_ATS_Property
    *
    * Unit: [ms]
    */
-  // GNUNET_ATS_QUALITY_NET_JITTER = 1029,
-
+      // GNUNET_ATS_QUALITY_NET_JITTER = 1029,
   /**
    * Error rate on network layer
    *
@@ -346,8 +344,7 @@ enum GNUNET_ATS_Property
    * Note: This numbers are just assumptions as an example, not
    * measured or somehow determined
    */
-  // GNUNET_ATS_QUALITY_NET_ERRORRATE = 1030,
-
+      // GNUNET_ATS_QUALITY_NET_ERRORRATE = 1030,
   /**
    * Drop rate on network layer
    * Bytes actively dismissed by a network component during transmission
@@ -363,8 +360,7 @@ enum GNUNET_ATS_Property
    * Note: This numbers are just assumptions as an example, not
    * measured or somehow determined
    */
-  // GNUNET_ATS_QUALITY_NET_DROPRATE = 1031,
-
+      // GNUNET_ATS_QUALITY_NET_DROPRATE = 1031,
   /**
    * Loss rate on network layer
    * Bytes lost during transmission
@@ -380,8 +376,7 @@ enum GNUNET_ATS_Property
    * Note: This numbers are just assumptions as an example, not measured
    * or somehow determined
    */
-  // GNUNET_ATS_QUALITY_NET_LOSSRATE = 1032,
-
+      // GNUNET_ATS_QUALITY_NET_LOSSRATE = 1032,
   /**
    * Throughput on network layer
    *
@@ -394,23 +389,40 @@ enum GNUNET_ATS_Property
    * Dialup:     4
    *
    */
-  // GNUNET_ATS_QUALITY_NET_THROUGHPUT = 1033,
-
-
-  /* Availability related values */
-  /* =========================== */
-
+      // GNUNET_ATS_QUALITY_NET_THROUGHPUT = 1033,
+      /* Availability related values */
+      /* =========================== */
   /**
    * Is a peer reachable?
    */
-  // GNUNET_ATS_AVAILABILITY_REACHABLE = 2048,
-
+      // GNUNET_ATS_AVAILABILITY_REACHABLE = 2048,
   /**
    * Is there a connection established to a peer using this transport
    */
-  // GNUNET_ATS_AVAILABILITY_CONNECTED = 2049
+      // GNUNET_ATS_AVAILABILITY_CONNECTED = 2049
 };
 
+/**
+ * Number of ATS quality properties
+ */
+#define GNUNET_ATS_QualityPropertiesCount 2
+
+/**
+ * ATS quality properties as array initializer
+ */
+#define GNUNET_ATS_QualityProperties {GNUNET_ATS_QUALITY_NET_DELAY, GNUNET_ATS_QUALITY_NET_DISTANCE}
+
+/**
+ * Number of ATS quality properties
+ */
+#define GNUNET_ATS_NetworkTypeCount 5
+
+/**
+ * ATS quality properties as array initializer
+ */
+#define GNUNET_ATS_NetworkType {GNUNET_ATS_NET_UNSPECIFIED, GNUNET_ATS_NET_LOOPBACK, GNUNET_ATS_NET_LAN, GNUNET_ATS_NET_WAN, GNUNET_ATS_NET_WLAN}
+
+GNUNET_NETWORK_STRUCT_BEGIN
 
 /**
  * struct used to communicate the transport's properties like cost and
@@ -435,14 +447,14 @@ struct GNUNET_ATS_Information
   /**
    * ATS property type, in network byte order.
    */
-  uint32_t type;
+  uint32_t type GNUNET_PACKED;
 
   /**
    * ATS property value, in network byte order.
    */
-  uint32_t value;
+  uint32_t value GNUNET_PACKED;
 };
-
+GNUNET_NETWORK_STRUCT_END
 
 
 /* ******************************** Scheduling API ***************************** */
@@ -461,13 +473,10 @@ struct Session;
 
 /**
  * Signature of a function called by ATS with the current bandwidth
- * and address preferences as determined by ATS.  
+ * and address preferences as determined by ATS.
  *
  * @param cls closure
- * @param peer identity of the new peer
- * @param plugin_name name of the plugin, NULL if we have no suggestion
- * @param plugin_addr suggested address, NULL if we have no suggestion
- * @param plugin_addr_len number of bytes in plugin_addr
+ * @param address suggested address (including peer identity of the peer)
  * @param session session to use
  * @param bandwidth_out assigned outbound bandwidth for the connection
  * @param bandwidth_in assigned inbound bandwidth for the connection
@@ -476,11 +485,8 @@ struct Session;
  */
 typedef void (*GNUNET_ATS_AddressSuggestionCallback) (void *cls,
                                                       const struct
-                                                      GNUNET_PeerIdentity *
-                                                      peer,
-                                                      const char *plugin_name,
-                                                      const void *plugin_addr,
-                                                      size_t plugin_addr_len,
+                                                      GNUNET_HELLO_Address *
+                                                      address,
                                                       struct Session * session,
                                                       struct
                                                       GNUNET_BANDWIDTH_Value32NBO
@@ -488,10 +494,9 @@ typedef void (*GNUNET_ATS_AddressSuggestionCallback) (void *cls,
                                                       struct
                                                       GNUNET_BANDWIDTH_Value32NBO
                                                       bandwidth_in,
-                                                     const struct
-                                                     GNUNET_ATS_Information
-                                                     * ats,
-                                                     uint32_t ats_count);
+                                                      const struct
+                                                      GNUNET_ATS_Information *
+                                                      ats, uint32_t ats_count);
 
 
 /**
@@ -504,8 +509,8 @@ typedef void (*GNUNET_ATS_AddressSuggestionCallback) (void *cls,
  */
 struct GNUNET_ATS_SchedulingHandle *
 GNUNET_ATS_scheduling_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
-                           GNUNET_ATS_AddressSuggestionCallback suggest_cb,
-                           void *suggest_cb_cls);
+                            GNUNET_ATS_AddressSuggestionCallback suggest_cb,
+                            void *suggest_cb_cls);
 
 
 /**
@@ -517,6 +522,17 @@ void
 GNUNET_ATS_scheduling_done (struct GNUNET_ATS_SchedulingHandle *sh);
 
 
+/**
+ * We would like to reset the address suggestion block time for this
+ * peer
+ *
+ * @param sh handle
+ * @param peer identity of the peer we want to reset
+ */
+void
+GNUNET_ATS_reset_backoff (struct GNUNET_ATS_SchedulingHandle *sh,
+                          const struct GNUNET_PeerIdentity *peer);
+
 /**
  * We would like to establish a new connection with a peer.  ATS
  * should suggest a good address to begin with.
@@ -529,6 +545,47 @@ GNUNET_ATS_suggest_address (struct GNUNET_ATS_SchedulingHandle *sh,
                             const struct GNUNET_PeerIdentity *peer);
 
 
+/**
+ * We want to cancel ATS suggesting addresses for a peer.
+ *
+ * @param sh handle
+ * @param peer identity of the peer
+ */
+void
+GNUNET_ATS_suggest_address_cancel (struct GNUNET_ATS_SchedulingHandle *sh,
+                                   const struct GNUNET_PeerIdentity *peer);
+
+
+/**
+ * Returns where the address is located: LAN or WAN or ...
+ * @param sh the GNUNET_ATS_SchedulingHandle handle
+ * @param addr address
+ * @param addrlen address length
+ * @return location as GNUNET_ATS_Information
+ */
+struct GNUNET_ATS_Information
+GNUNET_ATS_address_get_type (struct GNUNET_ATS_SchedulingHandle *sh,
+                             const struct sockaddr * addr,
+                             socklen_t addrlen);
+
+/**
+ * We have a new address ATS should know. Addresses have to be added with this
+ * function before they can be: updated, set in use and destroyed
+ *
+ * @param sh handle
+ * @param address the address
+ * @param session session handle (if available)
+ * @param ats performance data for the address
+ * @param ats_count number of performance records in 'ats'
+ */
+int
+GNUNET_ATS_address_add (struct GNUNET_ATS_SchedulingHandle *sh,
+                        const struct GNUNET_HELLO_Address *address,
+                        struct Session *session,
+                        const struct GNUNET_ATS_Information *ats,
+                        uint32_t ats_count);
+
+
 /**
  * We have updated performance statistics for a given address.  Note
  * that this function can be called for addresses that are currently
@@ -538,41 +595,45 @@ GNUNET_ATS_suggest_address (struct GNUNET_ATS_SchedulingHandle *sh,
  * for later use).  Update bandwidth assignments.
  *
  * @param sh handle
- * @param peer identity of the new peer
- * @param plugin_name name of the transport plugin
- * @param plugin_addr address  (if available)
- * @param plugin_addr_len number of bytes in plugin_addr
+ * @param address updated address
  * @param session session handle (if available)
  * @param ats performance data for the address
  * @param ats_count number of performance records in 'ats'
  */
 void
 GNUNET_ATS_address_update (struct GNUNET_ATS_SchedulingHandle *sh,
-                           const struct GNUNET_PeerIdentity *peer,
-                           const char *plugin_name,
-                           const void *plugin_addr, size_t plugin_addr_len,
-                          struct Session *session,
+                           const struct GNUNET_HELLO_Address *address,
+                           struct Session *session,
                            const struct GNUNET_ATS_Information *ats,
                            uint32_t ats_count);
 
 
+/**
+ * An address is now in use or not used any more.
+ *
+ * @param sh handle
+ * @param address the address
+ * @param session session handle
+ * @param in_use GNUNET_YES if this address is now used, GNUNET_NO
+ * if address is not used any more
+ */
+void
+GNUNET_ATS_address_in_use (struct GNUNET_ATS_SchedulingHandle *sh,
+                           const struct GNUNET_HELLO_Address *address,
+                           struct Session *session, int in_use);
+
+
 /**
  * A session got destroyed, stop including it as a valid address.
  *
  * @param sh handle
- * @param peer identity of the peer
- * @param plugin_name name of the transport plugin
- * @param plugin_addr address  (if available)
- * @param plugin_addr_len number of bytes in plugin_addr
+ * @param address the address
  * @param session session handle that is no longer valid (if available)
  */
 void
 GNUNET_ATS_address_destroyed (struct GNUNET_ATS_SchedulingHandle *sh,
-                              const struct GNUNET_PeerIdentity *peer,
-                             const char *plugin_name,
-                             const void *plugin_addr, 
-                             size_t plugin_addr_len,
-                             struct Session *session);
+                              const struct GNUNET_HELLO_Address *address,
+                              struct Session *session);
 
 
 /* ******************************** Performance API ***************************** */
@@ -587,32 +648,25 @@ struct GNUNET_ATS_PerformanceHandle;
  * Signature of a function that is called with QoS information about a peer.
  *
  * @param cls closure
- * @param peer identity of the new peer
- * @param plugin_name name of the plugin, NULL if we have no suggestion
- * @param plugin_addr suggested address, NULL if we have no suggestion
- * @param plugin_addr_len number of bytes in plugin_addr
+ * @param address the address
  * @param bandwidth_out assigned outbound bandwidth for the connection
  * @param bandwidth_in assigned inbound bandwidth for the connection
  * @param ats performance data for the address (as far as known)
  * @param ats_count number of performance records in 'ats'
  */
 typedef void (*GNUNET_ATS_PeerInformationCallback) (void *cls,
-                                                   const struct
-                                                   GNUNET_PeerIdentity *
-                                                   peer,
-                                                   const char *plugin_name,
-                                                   const void *plugin_addr,
-                                                   size_t plugin_addr_len,
-                                                   struct
-                                                   GNUNET_BANDWIDTH_Value32NBO
-                                                   bandwidth_out,
-                                                   struct
-                                                   GNUNET_BANDWIDTH_Value32NBO
-                                                   bandwidth_in,
-                                                   const struct
-                                                   GNUNET_ATS_Information
-                                                   * ats,
-                                                   uint32_t ats_count);
+                                                    const struct
+                                                    GNUNET_HELLO_Address *
+                                                    address,
+                                                    struct
+                                                    GNUNET_BANDWIDTH_Value32NBO
+                                                    bandwidth_out,
+                                                    struct
+                                                    GNUNET_BANDWIDTH_Value32NBO
+                                                    bandwidth_in,
+                                                    const struct
+                                                    GNUNET_ATS_Information *
+                                                    ats, uint32_t ats_count);
 
 
 /**
@@ -625,8 +679,8 @@ typedef void (*GNUNET_ATS_PeerInformationCallback) (void *cls,
  */
 struct GNUNET_ATS_PerformanceHandle *
 GNUNET_ATS_performance_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
-                            GNUNET_ATS_PeerInformationCallback infocb,
-                            void *infocb_cls);
+                             GNUNET_ATS_PeerInformationCallback infocb,
+                             void *infocb_cls);
 
 
 /**
@@ -649,13 +703,10 @@ GNUNET_ATS_performance_done (struct GNUNET_ATS_PerformanceHandle *ph);
  *        long should the client wait until re-trying?
  */
 typedef void (*GNUNET_ATS_ReservationCallback) (void *cls,
-                                               const struct
-                                               GNUNET_PeerIdentity *
-                                               peer,
-                                               int32_t amount,
-                                               struct
-                                               GNUNET_TIME_Relative
-                                               res_delay);
+                                                const struct GNUNET_PeerIdentity
+                                                * peer, int32_t amount,
+                                                struct GNUNET_TIME_Relative
+                                                res_delay);
 
 
 
@@ -681,10 +732,10 @@ struct GNUNET_ATS_ReservationContext;
  */
 struct GNUNET_ATS_ReservationContext *
 GNUNET_ATS_reserve_bandwidth (struct GNUNET_ATS_PerformanceHandle *ph,
-                             const struct GNUNET_PeerIdentity *peer,
-                             int32_t amount, 
-                             GNUNET_ATS_ReservationCallback rcb, 
-                             void *rcb_cls);
+                              const struct GNUNET_PeerIdentity *peer,
+                              int32_t amount,
+                              GNUNET_ATS_ReservationCallback rcb,
+                              void *rcb_cls);
 
 
 /**
@@ -693,8 +744,7 @@ GNUNET_ATS_reserve_bandwidth (struct GNUNET_ATS_PerformanceHandle *ph,
  * @param rc context returned by the original GNUNET_ATS_reserve_bandwidth call
  */
 void
-GNUNET_ATS_reserve_bandwidth_cancel (struct
-                                    GNUNET_ATS_ReservationContext *rc);
+GNUNET_ATS_reserve_bandwidth_cancel (struct GNUNET_ATS_ReservationContext *rc);
 
 
 
@@ -713,7 +763,7 @@ enum GNUNET_ATS_PreferenceKind
    * Change the peer's bandwidth value (value per byte of bandwidth in
    * the goal function) to the given amount.  The argument is followed
    * by a double value giving the desired value (can be negative).
-   * Preference changes are forgotten if peers disconnect. 
+   * Preference changes are forgotten if peers disconnect.
    */
   GNUNET_ATS_PREFERENCE_BANDWIDTH,
 
@@ -725,22 +775,20 @@ enum GNUNET_ATS_PreferenceKind
    * the latency preferences.
    */
   GNUNET_ATS_PREFERENCE_LATENCY
-
 };
 
-  
+
 /**
  * Change preferences for the given peer. Preference changes are forgotten if peers
  * disconnect.
- * 
+ *
  * @param ph performance handle
  * @param peer identifies the peer
  * @param ... 0-terminated specification of the desired changes
  */
 void
 GNUNET_ATS_change_preference (struct GNUNET_ATS_PerformanceHandle *ph,
-                             const struct GNUNET_PeerIdentity *peer,
-                             ...);
+                              const struct GNUNET_PeerIdentity *peer, ...);