more changes
authorMatthias Wachs <wachs@net.in.tum.de>
Mon, 10 Dec 2012 14:25:53 +0000 (14:25 +0000)
committerMatthias Wachs <wachs@net.in.tum.de>
Mon, 10 Dec 2012 14:25:53 +0000 (14:25 +0000)
src/ats/gnunet-service-ats_addresses.c
src/ats/gnunet-service-ats_addresses.h
src/ats/gnunet-service-ats_addresses_mlp.c
src/ats/gnunet-service-ats_addresses_mlp.h
src/ats/gnunet-service-ats_addresses_simplistic.c
src/ats/gnunet-service-ats_addresses_simplistic.h

index 3b6e2352256c25659e7129f815df0ff1b5f44866..1066b78aa2b9b869c25ee8c860bb23366c9cbf71 100644 (file)
@@ -806,7 +806,6 @@ GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer)
        "Address %p ready for suggestion, block interval now %llu \n",
        aa, aa->block_interval);
 
-
   GNUNET_free (ats);
 }
 
@@ -940,6 +939,41 @@ load_quotas (const struct GNUNET_CONFIGURATION_Handle *cfg, unsigned long long *
 }
 
 
+static void
+bandwidth_changed_cb (struct ATS_Address *address)
+{
+  struct GAS_Addresses_Suggestion_Requests *cur;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Bandwidth assignment changed for peer %s \n", GNUNET_i2s(&address->peer));
+  struct GNUNET_ATS_Information *ats;
+  unsigned int ats_count;
+
+  cur = handle->r_head;
+  while (NULL != cur)
+  {
+      if (0 == memcmp (&address->peer, &cur->id, sizeof (cur->id)))
+        break; /* we have an address request pending*/
+      cur = cur->next;
+  }
+  if (NULL == cur)
+  {
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "Nobody is interested in peer `%s' :(\n",GNUNET_i2s (&address->peer));
+      return;
+  }
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Sending bandwidth update for peer `%s'\n",GNUNET_i2s (&address->peer));
+
+  ats_count = assemble_ats_information (address, &ats);
+  GAS_scheduling_transmit_address_suggestion (&address->peer,
+                                              address->plugin,
+                                              address->addr, address->addr_len,
+                                              address->session_id,
+                                              ats, ats_count,
+                                              address->assigned_bw_out,
+                                              address->assigned_bw_in);
+}
+
 
 /**
  * Initialize address subsystem.
@@ -1042,7 +1076,7 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
 
   quota_count = load_quotas(cfg, quotas_in, quotas_out, GNUNET_ATS_NetworkTypeCount);
 
-  ah->solver = ah->s_init (cfg, stats, quotas, quotas_in, quotas_out, quota_count);
+  ah->solver = ah->s_init (cfg, stats, quotas, quotas_in, quotas_out, quota_count, &bandwidth_changed_cb);
   if (NULL == ah->solver)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to initialize solver!\n");
index ae1215954a79c847c579fd79c97369c49cc7539c..c856b09b0083ac2b849213163eb5f8adf64d90fe 100644 (file)
@@ -147,6 +147,15 @@ struct ATS_Address
 };
 
 
+/**
+ * Callback to call from solver when bandwidth for address has changed
+ *
+ * @param address the with changed bandwidth assigned
+ */
+
+typedef void
+ (*GAS_bandwidth_changed_cb) (struct ATS_Address *address);
+
 /**
  * Init the simplistic problem solving component
  *
@@ -165,7 +174,8 @@ struct ATS_Address
  * @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 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 *
@@ -174,7 +184,8 @@ typedef void *
                      int *network,
                      unsigned long long *out_quota,
                      unsigned long long *in_quota,
-                     int dest_length);
+                     int dest_length,
+                     GAS_bandwidth_changed_cb bw_changed_cb);
 
 
 typedef void
index c493517a9817dbfc11de27eff39c6ed1e717fd18..ef0f18160f338443b313f689438fb16b6230ed88 100644 (file)
@@ -1079,7 +1079,10 @@ void *
 GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
               const struct GNUNET_STATISTICS_Handle *stats,
               int *network,
-              unsigned long long *out_dest, unsigned long long *in_dest, int dest_length)
+              unsigned long long *out_dest,
+              unsigned long long *in_dest,
+              int dest_length,
+              GAS_bandwidth_changed_cb bw_changed_cb)
 {
   struct GAS_MLP_Handle * mlp = GNUNET_malloc (sizeof (struct GAS_MLP_Handle));
 
index 646b65824742c33c40226528abf2e0667725f71b..78010a0cfd525c5ee5f155b3b188ff4a625ec674 100644 (file)
@@ -316,13 +316,17 @@ struct MLP_information
  *
  * @param cfg configuration handle
  * @param stats the GNUNET_STATISTICS handle
+ * @param bw_changed_cb callback to call when assigned changes
  * @return struct GAS_MLP_Handle on success, NULL on fail
  */
 void *
 GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
               const struct GNUNET_STATISTICS_Handle *stats,
               int *network,
-              unsigned long long *out_dest, unsigned long long *in_dest, int dest_length);
+              unsigned long long *out_dest,
+              unsigned long long *in_dest,
+              int dest_length,
+              GAS_bandwidth_changed_cb bw_changed_cb);
 
 
 /**
index c9c9bd7af7087e34ddad914176d4d9eb84058ab4..39b7cd10790fe6acc3ee2c3dc113192932614394 100644 (file)
@@ -41,6 +41,7 @@ struct GAS_SIMPLISTIC_Handle
   struct Network *network_entries;
 
   unsigned int networks;
+  GAS_bandwidth_changed_cb bw_changed;
 };
 
 struct Network
@@ -71,6 +72,17 @@ struct Network
    * Number of active addresses for this network
    */
   unsigned int active_addresses;
+
+  struct AddressWrapper *head;
+  struct AddressWrapper *tail;
+};
+
+struct AddressWrapper
+{
+  struct AddressWrapper *next;
+  struct AddressWrapper *prev;
+
+  struct ATS_Address *addr;
 };
 
 /**
@@ -100,13 +112,15 @@ GAS_simplistic_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
                      int *network,
                      unsigned long long *out_quota,
                      unsigned long long *in_quota,
-                     int dest_length)
+                     int dest_length,
+                     GAS_bandwidth_changed_cb bw_changed_cb)
 {
   int c;
   struct GAS_SIMPLISTIC_Handle *s = GNUNET_malloc (sizeof (struct GAS_SIMPLISTIC_Handle));
   struct Network * cur;
   char * net_str[GNUNET_ATS_NetworkTypeCount] = {"UNSPECIFIED", "LOOPBACK", "LAN", "WAN", "WLAN"};
 
+  s->bw_changed = bw_changed_cb;
   s->networks = dest_length;
   s->network_entries = GNUNET_malloc (dest_length * sizeof (struct Network));
 
@@ -141,6 +155,7 @@ update_quota (struct GAS_SIMPLISTIC_Handle *s, struct Network *net)
 {
   unsigned long long quota_in;
   unsigned long long quota_out;
+  struct AddressWrapper *cur;
 
   quota_in = net->total_quota_in / net->active_addresses;
   quota_out = net->total_quota_out / net->active_addresses;
@@ -148,6 +163,22 @@ update_quota (struct GAS_SIMPLISTIC_Handle *s, struct Network *net)
   LOG (GNUNET_ERROR_TYPE_DEBUG,
               "New quota for network type `%s' (in/out): %llu/%llu \n",
               net->desc, quota_in, quota_out);
+
+  cur = net->head;
+  while (NULL != cur)
+  {
+      /* Compare to current bandwidth assigned */
+      if ((quota_in != ntohl(cur->addr->assigned_bw_in.value__)) ||
+          (quota_out != ntohl(cur->addr->assigned_bw_out.value__)))
+      {
+        cur->addr->assigned_bw_in.value__ = htonl (quota_in);
+        cur->addr->assigned_bw_out.value__ = htonl (quota_out);
+        /* Notify on change */
+        s->bw_changed (cur->addr);
+      }
+      cur = cur->next;
+  }
+
 }
 
 /**
@@ -162,20 +193,14 @@ GAS_simplistic_address_add (void *solver, struct GNUNET_CONTAINER_MultiHashMap *
 {
   struct GAS_SIMPLISTIC_Handle *s = solver;
   struct Network *cur = NULL;
+  struct AddressWrapper *aw = NULL;
   GNUNET_assert (NULL != s);
   int c;
   for (c = 0; c < s->networks; c++)
   {
       cur = &s->network_entries[c];
       if (address->atsp_network_type == cur->type)
-      {
-          cur->active_addresses ++;
-          LOG (GNUNET_ERROR_TYPE_DEBUG,
-                      "Adding new address for network type `%s' (now %u total)\n",
-                      cur->desc,
-                      cur->active_addresses);
           break;
-      }
   }
   if (NULL == cur)
   {
@@ -183,6 +208,16 @@ GAS_simplistic_address_add (void *solver, struct GNUNET_CONTAINER_MultiHashMap *
     return;
   }
 
+  aw = GNUNET_malloc (sizeof (struct AddressWrapper));
+  aw->addr = address;
+  GNUNET_CONTAINER_DLL_insert (cur->head, cur->tail, aw);
+  cur->active_addresses ++;
+
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+              "Adding new address for network type `%s' (now %u total)\n",
+              cur->desc,
+              cur->active_addresses);
+
   /* Update quota for this network type */
   update_quota (s, cur);
 
index da60f6edc2581d3354a079e1909f43e29125a097..f2005b889662f60aa2d6f0cea28985ae03206e38 100644 (file)
@@ -49,6 +49,7 @@
  * @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
  */
 void *
@@ -57,7 +58,8 @@ GAS_simplistic_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
                      int *network,
                      unsigned long long *out_quota,
                      unsigned long long *in_quota,
-                     int dest_length);
+                     int dest_length,
+                     GAS_bandwidth_changed_cb bw_changed_cb);
 
 /**
  * Shutdown the simplistic problem solving component