-add newline
[oweals/gnunet.git] / src / ats / gnunet-service-ats_addresses.h
index fe07563ac75a07ea0b6ab57fcd0ef4c759d92536..a9aac2094aae48b2db46cc61c4874fb8374e0988 100644 (file)
 #include "gnunet_statistics_service.h"
 #include "ats.h"
 
+#define ATS_BLOCKING_DELTA GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 100)
+
+struct GAS_Addresses_Handle;
+
+/**
+ * Address with additional information
+ */
 struct ATS_Address
 {
+  /**
+   * Next element in DLL
+   */
   struct ATS_Address *next;
 
+  /**
+   * Previous element in DLL
+   */
   struct ATS_Address *prev;
 
+  /**
+   * Peer ID
+   */
   struct GNUNET_PeerIdentity peer;
 
-  size_t addr_len;
-
+  /**
+   * Session ID, 0 if no session is given
+   */
   uint32_t session_id;
 
-  uint32_t ats_count;
-
+  /**
+   * Address
+   */
   const void *addr;
 
-  char *plugin;
+  /**
+   * Address length
+   */
+  size_t addr_len;
 
-  void *mlp_information;
+  /**
+   * Plugin name
+   */
+  char *plugin;
 
-  struct GNUNET_ATS_Information *ats;
+  /**
+   * Solver specific information for this address
+   */
+  void *solver_information;
 
+  /* CHECK USAGE */
   struct GNUNET_TIME_Relative atsp_latency;
 
+  /* CHECK USAGE */
   struct GNUNET_BANDWIDTH_Value32NBO atsp_utilization_in;
 
+  /* CHECK USAGE */
   struct GNUNET_BANDWIDTH_Value32NBO atsp_utilization_out;
 
+
+  /* CHECK USAGE */
   uint32_t atsp_distance;
 
+  /* CHECK USAGE */
   uint32_t atsp_cost_wan;
 
+  /* CHECK USAGE */
   uint32_t atsp_cost_lan;
 
+  /* CHECK USAGE */
   uint32_t atsp_cost_wlan;
 
+  /* CHECK USAGE */
   uint32_t atsp_network_type;
 
+  /**
+   * Inbound bandwidth assigned by solver in NBO
+   */
   struct GNUNET_BANDWIDTH_Value32NBO assigned_bw_in;
 
+  /**
+   * Outbound bandwidth assigned by solver in NBO
+   */
   struct GNUNET_BANDWIDTH_Value32NBO assigned_bw_out;
 
   /**
@@ -95,36 +137,127 @@ struct ATS_Address
   int used;
 };
 
+
+/**
+ * Callback to call from solver when bandwidth for address has changed
+ *
+ * @param address the with changed bandwidth assigned
+ */
+
+typedef void
+ (*GAS_bandwidth_changed_cb) (void *cls, struct ATS_Address *address);
+
+/**
+ * Init the simplistic problem solving component
+ *
+ * Quotas:
+ * network[i] contains the network type as type GNUNET_ATS_NetworkType[i]
+ * out_quota[i] contains outbound quota for network type i
+ * in_quota[i] contains inbound quota for network type i
+ *
+ * Example
+ * network = {GNUNET_ATS_NET_UNSPECIFIED, GNUNET_ATS_NET_LOOPBACK, GNUNET_ATS_NET_LAN, GNUNET_ATS_NET_WAN, GNUNET_ATS_NET_WLAN}
+ * network[2]   == GNUNET_ATS_NET_LAN
+ * out_quota[2] == 65353
+ * in_quota[2]  == 65353
+ *
+ * @param cfg configuration handle
+ * @param stats the GNUNET_STATISTICS handle
+ * @param network array of GNUNET_ATS_NetworkType with length dest_length
+ * @param out_quota array of outbound quotas
+ * @param in_quota array of outbound quota
+ * @param bw_changed_cb callback to call when assigned changes
+ * @return handle for the solver on success, NULL on fail
+ */
+typedef void *
+ (*GAS_solver_init) (const struct GNUNET_CONFIGURATION_Handle *cfg,
+                     const struct GNUNET_STATISTICS_Handle *stats,
+                     int *network,
+                     unsigned long long *out_quota,
+                     unsigned long long *in_quota,
+                     int dest_length,
+                     GAS_bandwidth_changed_cb bw_changed_cb,
+                     void *bw_changed_cb_cls);
+
+
+typedef void
+(*GAS_solver_address_change_preference) (void *solver,
+                                         const struct GNUNET_PeerIdentity *peer,
+                                         enum GNUNET_ATS_PreferenceKind kind,
+                                         float score);
+
+/**
+ * Add a single address to the solver
+ *
+ * @param solver the solver Handle
+ * @param addresses the address hashmap containing all addresses
+ * @param address the address to add
+ */
+typedef void
+(*GAS_solver_address_add) (void *solver,
+                           struct GNUNET_CONTAINER_MultiHashMap * addresses,
+                           struct ATS_Address *address);
+
+
+
+typedef void
+ (*GAS_solver_address_delete) (void *solver,
+                               struct GNUNET_CONTAINER_MultiHashMap *addresses,
+                               struct ATS_Address *address,
+                               int session_only);
+
+typedef void
+(*GAS_solver_address_update) (void *solver,
+                              struct GNUNET_CONTAINER_MultiHashMap *addresses,
+                              struct ATS_Address *address,
+                              uint32_t session,
+                              int in_use,
+                              const struct GNUNET_ATS_Information *atsi,
+                              uint32_t atsi_count);
+
+
+typedef const struct ATS_Address *
+(*GAS_solver_get_preferred_address) (void *solver,
+                                     struct GNUNET_CONTAINER_MultiHashMap *addresses,
+                                     const struct GNUNET_PeerIdentity *peer);
+
+
+typedef void
+ (*GAS_solver_done) (void *solver);
+
+
 /**
  * Initialize address subsystem.
  *
  * @param cfg configuration to use
  * @param stats the statistics handle to use
  */
-void
+struct GAS_Addresses_Handle *
 GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
                     const struct GNUNET_STATISTICS_Handle *stats);
 
-
 /**
  * Shutdown address subsystem.
  */
 void
-GAS_addresses_done (void);
+GAS_addresses_done (struct GAS_Addresses_Handle *handle);
 
 void
-GAS_addresses_handle_backoff_reset (const struct GNUNET_PeerIdentity *peer);
+GAS_addresses_handle_backoff_reset (struct GAS_Addresses_Handle *handle,
+                                    const struct GNUNET_PeerIdentity *peer);
 
 /**
  * This address is now used or not used anymore
  */
 int
-GAS_addresses_in_use (const struct GNUNET_PeerIdentity *peer,
+GAS_addresses_in_use (struct GAS_Addresses_Handle *handle,
+                      const struct GNUNET_PeerIdentity *peer,
                       const char *plugin_name, const void *plugin_addr,
                       size_t plugin_addr_len, uint32_t session_id, int in_use);
 
 void
-GAS_addresses_update (const struct GNUNET_PeerIdentity *peer,
+GAS_addresses_update (struct GAS_Addresses_Handle *handle,
+                      const struct GNUNET_PeerIdentity *peer,
                       const char *plugin_name, const void *plugin_addr,
                       size_t plugin_addr_len, uint32_t session_id,
                       const struct GNUNET_ATS_Information *atsi,
@@ -132,32 +265,81 @@ GAS_addresses_update (const struct GNUNET_PeerIdentity *peer,
 
 
 void
-GAS_addresses_destroy (const struct GNUNET_PeerIdentity *peer,
+GAS_addresses_destroy (struct GAS_Addresses_Handle *handle,
+                       const struct GNUNET_PeerIdentity *peer,
                        const char *plugin_name, const void *plugin_addr,
                        size_t plugin_addr_len, uint32_t session_id);
 
 
 void
-GAS_addresses_destroy_all (void);
+GAS_addresses_destroy_all (struct GAS_Addresses_Handle *handle);
 
 
-// FIXME: this function should likely end up in the LP-subsystem and
-// not with 'addresses' in the future...
-// Note: this call should trigger an address suggestion
-// (GAS_scheduling_transmit_address_suggestion)
+/**
+ * Cancel address suggestions for a peer
+ *
+ * @param peer the respective peer
+ */
 void
-GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer);
+GAS_addresses_request_address_cancel (struct GAS_Addresses_Handle *handle,
+                                      const struct GNUNET_PeerIdentity *peer);
 
+void
+GAS_addresses_request_address (struct GAS_Addresses_Handle *handle,
+                               const struct GNUNET_PeerIdentity *peer);
 
-// FIXME: this function should likely end up in the LP-subsystem and
-// not with 'addresses' in the future...
 void
-GAS_addresses_change_preference (const struct GNUNET_PeerIdentity *peer,
+GAS_addresses_change_preference (struct GAS_Addresses_Handle *handle,
+                                 const struct GNUNET_PeerIdentity *peer,
                                  enum GNUNET_ATS_PreferenceKind kind,
                                  float score);
 
+void
+GAS_addresses_add (struct GAS_Addresses_Handle *handle,
+                   const struct GNUNET_PeerIdentity *peer,
+                   const char *plugin_name, const void *plugin_addr,
+                   size_t plugin_addr_len, uint32_t session_id,
+                   const struct GNUNET_ATS_Information *atsi,
+                   uint32_t atsi_count);
+
+
+typedef void (*GNUNET_ATS_Peer_Iterator) (void *p_it_cls,
+                                          const struct GNUNET_PeerIdentity *id);
 
-/* FIXME: add performance request API */
+/**
+ * Return all peers currently known to ATS
+ *
+ * @param p_it the iterator to call for every peer
+ * @param p_it_cls the closure for the iterator
+ */
+void
+GAS_addresses_iterate_peers (struct GAS_Addresses_Handle *handle,
+                             GNUNET_ATS_Peer_Iterator p_it,
+                             void *p_it_cls);
+
+typedef void (*GNUNET_ATS_PeerInfo_Iterator) (void *p_it_cls,
+    const struct GNUNET_PeerIdentity *id,
+    const char *plugin_name,
+    const void *plugin_addr, size_t plugin_addr_len,
+    const int address_active,
+    const struct GNUNET_ATS_Information *atsi,
+    uint32_t atsi_count,
+    struct GNUNET_BANDWIDTH_Value32NBO
+    bandwidth_out,
+    struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in);
+
+/**
+ * Return information all peers currently known to ATS
+ *
+ * @param peer the respective peer
+ * @param pi_it the iterator to call for every peer
+ * @param pi_it_cls the closure for the iterator
+ */
+void
+GAS_addresses_get_peer_info (struct GAS_Addresses_Handle *handle,
+                             const struct GNUNET_PeerIdentity *peer,
+                             GNUNET_ATS_PeerInfo_Iterator pi_it,
+                             void *pi_it_cls);
 
 #endif