(no commit message)
[oweals/gnunet.git] / src / include / gnunet_ats_service.h
index 3d1c5b2b2e9eae5c015d6c8bf88e46ef8a9ca4f0..8c9be13d42600f8675fee20627c1eca71f396c5f 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "gnunet_constants.h"
 #include "gnunet_util_lib.h"
+#include "gnunet_hello_lib.h"
 
 
 /**
@@ -49,14 +50,14 @@ 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,
@@ -74,14 +75,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 +103,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 +124,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 +145,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 +163,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 +180,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 +199,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 +227,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 +249,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 +266,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 +286,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 +315,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 +329,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 +345,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 +361,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,21 +374,17 @@ 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
 };
 
 
@@ -461,13 +437,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
@@ -475,12 +448,7 @@ struct Session;
  * @param ats_count number of performance records in 'ats'
  */
 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,
+                                                     const struct GNUNET_HELLO_Address *address,
                                                       struct Session * session,
                                                       struct
                                                       GNUNET_BANDWIDTH_Value32NBO
@@ -488,10 +456,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 +471,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);
 
 
 /**
@@ -529,6 +496,16 @@ 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);
+
 /**
  * We have updated performance statistics for a given address.  Note
  * that this function can be called for addresses that are currently
@@ -538,40 +515,44 @@ 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,
+                              const struct GNUNET_HELLO_Address *address,
                              struct Session *session);
 
 
@@ -587,32 +568,23 @@ 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 +597,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 +621,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 +650,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 +662,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 +681,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 +693,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, ...);