gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r35103 - gnunet/src/ats


From: gnunet
Subject: [GNUnet-SVN] r35103 - gnunet/src/ats
Date: Thu, 5 Feb 2015 17:09:26 +0100

Author: grothoff
Date: 2015-02-05 17:09:26 +0100 (Thu, 05 Feb 2015)
New Revision: 35103

Modified:
   gnunet/src/ats/gnunet-service-ats.c
   gnunet/src/ats/gnunet-service-ats_addresses.c
   gnunet/src/ats/gnunet-service-ats_addresses.h
   gnunet/src/ats/gnunet-service-ats_performance.c
   gnunet/src/ats/gnunet-service-ats_performance.h
   gnunet/src/ats/gnunet-service-ats_preferences.h
   gnunet/src/ats/gnunet-service-ats_reservations.c
   gnunet/src/ats/gnunet-service-ats_reservations.h
Log:
-cleaning up gnunet-service-ats_performance-*

Modified: gnunet/src/ats/gnunet-service-ats.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats.c 2015-02-05 15:45:30 UTC (rev 35102)
+++ gnunet/src/ats/gnunet-service-ats.c 2015-02-05 16:09:26 UTC (rev 35103)
@@ -109,7 +109,6 @@
   if (NULL == client)
     return;
   GAS_scheduling_remove_client (client);
-  GAS_performance_remove_client (client);
   GAS_connectivity_remove_client (client);
   GAS_normalization_preference_client_disconnect (client);
   GAS_addresses_preference_client_disconnect (client);
@@ -188,10 +187,10 @@
   };
   GSA_server = server;
   GSA_stats = GNUNET_STATISTICS_create ("ats", cfg);
-  GAS_reservations_init ();
+  GAS_reservations_init (server);
   GAS_connectivity_init ();
   GAS_normalization_start ();
-  GAS_addresses_init ();
+  GAS_addresses_init (server);
   if (GNUNET_OK !=
       GAS_plugins_init (cfg))
   {

Modified: gnunet/src/ats/gnunet-service-ats_addresses.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses.c       2015-02-05 15:45:30 UTC 
(rev 35102)
+++ gnunet/src/ats/gnunet-service-ats_addresses.c       2015-02-05 16:09:26 UTC 
(rev 35103)
@@ -220,7 +220,12 @@
  */
 struct GNUNET_CONTAINER_MultiPeerMap *GSA_addresses;
 
+/**
+ * Context for sending messages to performance clients without PIC.
+ */
+static struct GNUNET_SERVER_NotificationContext *nc;
 
+
 /**
  * Update statistic on number of addresses.
  */
@@ -701,12 +706,15 @@
  * known and current performance information. It has a solver component
  * responsible for the resource allocation. It tells the solver about changes
  * and receives updates when the solver changes the resource allocation.
+ *
+ * @param server handle to our server
  */
 void
-GAS_addresses_init ()
+GAS_addresses_init (struct GNUNET_SERVER_Handle *server)
 {
   GSA_addresses = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_NO);
   update_addresses_stat ();
+  nc = GNUNET_SERVER_notification_context_create (server, 32);
 }
 
 
@@ -757,6 +765,8 @@
   GAS_addresses_destroy_all ();
   GNUNET_CONTAINER_multipeermap_destroy (GSA_addresses);
   GSA_addresses = NULL;
+  GNUNET_SERVER_notification_context_destroy (nc);
+  nc = NULL;
 }
 
 
@@ -850,4 +860,224 @@
          GNUNET_BANDWIDTH_ZERO);
 }
 
+
+/**
+ * Information we need for the callbacks to return a list of addresses
+ * back to the client.
+ */
+struct AddressIteration
+{
+  /**
+   * Actual handle to the client.
+   */
+  struct GNUNET_SERVER_Client *client;
+
+  /**
+   * Are we sending all addresses, or only those that are active?
+   */
+  int all;
+
+  /**
+   * Which ID should be included in the response?
+   */
+  uint32_t id;
+
+};
+
+
+/**
+ * Send a #GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE with the
+ * given address details to the client identified in @a ai.
+ *
+ * @param ai our address information context (identifies the client)
+ * @param id the peer id this address is for
+ * @param plugin_name name of the plugin that supports this address
+ * @param plugin_addr address
+ * @param plugin_addr_len length of @a plugin_addr
+ * @param active #GNUNET_YES if this address is actively used
+ * @param atsi ats performance information
+ * @param atsi_count number of ats performance elements in @a atsi
+ * @param bandwidth_out current outbound bandwidth assigned to address
+ * @param bandwidth_in current inbound bandwidth assigned to address
+ */
+static void
+transmit_req_addr (struct AddressIteration *ai,
+                   const struct GNUNET_PeerIdentity *id,
+                   const char *plugin_name,
+                   const void *plugin_addr,
+                   size_t plugin_addr_len,
+                   int active,
+                   const struct GNUNET_ATS_Information *atsi,
+                   uint32_t atsi_count,
+                   struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
+                   struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
+
+{
+  struct GNUNET_ATS_Information *atsp;
+  struct PeerInformationMessage *msg;
+  char *addrp;
+  size_t plugin_name_length;
+  size_t msize;
+
+  if (NULL != plugin_name)
+    plugin_name_length = strlen (plugin_name) + 1;
+  else
+    plugin_name_length = 0;
+  msize = sizeof (struct PeerInformationMessage) +
+          atsi_count * sizeof (struct GNUNET_ATS_Information) +
+          plugin_addr_len + plugin_name_length;
+  char buf[msize] GNUNET_ALIGN;
+
+  GNUNET_assert (msize < GNUNET_SERVER_MAX_MESSAGE_SIZE);
+  GNUNET_assert (atsi_count <
+                 GNUNET_SERVER_MAX_MESSAGE_SIZE /
+                 sizeof (struct GNUNET_ATS_Information));
+  msg = (struct PeerInformationMessage *) buf;
+  msg->header.size = htons (msize);
+  msg->header.type = htons (GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE);
+  msg->ats_count = htonl (atsi_count);
+  msg->id = htonl (ai->id);
+  if (NULL != id)
+    msg->peer = *id;
+  else
+    memset (&msg->peer, '\0', sizeof (struct GNUNET_PeerIdentity));
+  msg->address_length = htons (plugin_addr_len);
+  msg->address_active = ntohl (active);
+  msg->plugin_name_length = htons (plugin_name_length);
+  msg->bandwidth_out = bandwidth_out;
+  msg->bandwidth_in = bandwidth_in;
+  atsp = (struct GNUNET_ATS_Information *) &msg[1];
+  memcpy (atsp, atsi, sizeof (struct GNUNET_ATS_Information) * atsi_count);
+  addrp = (char *) &atsp[atsi_count];
+  if (NULL != plugin_addr)
+    memcpy (addrp, plugin_addr, plugin_addr_len);
+  if (NULL != plugin_name)
+    strcpy (&addrp[plugin_addr_len], plugin_name);
+  GNUNET_SERVER_notification_context_unicast (nc,
+                                              ai->client,
+                                              &msg->header,
+                                              GNUNET_NO);
+}
+
+
+/**
+ * Iterator for #GAS_addresses_get_peer_info(), called with peer-specific
+ * information to be passed back to the client.
+ *
+ * @param cls closure with our `struct AddressIteration *`
+ * @param id the peer id
+ * @param plugin_name plugin name
+ * @param plugin_addr address
+ * @param plugin_addr_len length of @a plugin_addr
+ * @param active is address actively used
+ * @param atsi ats performance information
+ * @param atsi_count number of ats performance elements in @a atsi
+ * @param bandwidth_out current outbound bandwidth assigned to address
+ * @param bandwidth_in current inbound bandwidth assigned to address
+ */
+static void
+req_addr_peerinfo_it (void *cls,
+                      const struct GNUNET_PeerIdentity *id,
+                      const char *plugin_name,
+                      const void *plugin_addr,
+                      size_t plugin_addr_len,
+                      int active,
+                      const struct GNUNET_ATS_Information *atsi,
+                      uint32_t atsi_count,
+                      struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
+                      struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
+{
+  struct AddressIteration *ai = cls;
+
+  if ( (NULL == id) &&
+       (NULL == plugin_name) &&
+       (NULL == plugin_addr) )
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Address iteration done for one peer\n");
+    return;
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Callback for %s peer `%s' plugin `%s' BW out %u, BW in %u\n",
+              (active == GNUNET_YES) ? "ACTIVE" : "INACTIVE",
+              GNUNET_i2s (id),
+              plugin_name,
+              (unsigned int) ntohl (bandwidth_out.value__),
+              (unsigned int) ntohl (bandwidth_in.value__));
+  /* Transmit result (either if address is active, or if
+     client wanted all addresses) */
+  if ( (GNUNET_YES != ai->all) &&
+       (GNUNET_YES != active))
+    return;
+  transmit_req_addr (ai,
+                     id,
+                     plugin_name,
+                     plugin_addr, plugin_addr_len,
+                     active,
+                     atsi,
+                     atsi_count,
+                     bandwidth_out,
+                     bandwidth_in);
+}
+
+
+/**
+ * Handle 'address list request' messages from clients.
+ *
+ * @param cls unused, NULL
+ * @param client client that sent the request
+ * @param message the request message
+ */
+void
+GAS_handle_request_address_list (void *cls,
+                                 struct GNUNET_SERVER_Client *client,
+                                 const struct GNUNET_MessageHeader *message)
+{
+  struct AddressIteration ai;
+  const struct AddressListRequestMessage *alrm;
+  struct GNUNET_PeerIdentity allzeros;
+
+  GNUNET_SERVER_notification_context_add (nc,
+                                          client);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Received ADDRESSLIST_REQUEST message\n");
+  alrm = (const struct AddressListRequestMessage *) message;
+  ai.all = ntohl (alrm->all);
+  ai.id = ntohl (alrm->id);
+  ai.client = client;
+
+  memset (&allzeros,
+          '\0',
+          sizeof (struct GNUNET_PeerIdentity));
+  if (0 == memcmp (&alrm->peer,
+                   &allzeros,
+                   sizeof (struct GNUNET_PeerIdentity)))
+  {
+    /* Return addresses for all peers */
+    GAS_addresses_get_peer_info (NULL,
+                                 &req_addr_peerinfo_it,
+                                 &ai);
+  }
+  else
+  {
+    /* Return addresses for a specific peer */
+    GAS_addresses_get_peer_info (&alrm->peer,
+                                 &req_addr_peerinfo_it,
+                                 &ai);
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Finished handling `%s' message\n",
+              "ADDRESSLIST_REQUEST");
+  transmit_req_addr (&ai,
+                     NULL, NULL, NULL,
+                     0, GNUNET_NO,
+                     NULL, 0,
+                     GNUNET_BANDWIDTH_ZERO,
+                     GNUNET_BANDWIDTH_ZERO);
+  GNUNET_SERVER_receive_done (client,
+                              GNUNET_OK);
+}
+
+
+
 /* end of gnunet-service-ats_addresses.c */

Modified: gnunet/src/ats/gnunet-service-ats_addresses.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses.h       2015-02-05 15:45:30 UTC 
(rev 35102)
+++ gnunet/src/ats/gnunet-service-ats_addresses.h       2015-02-05 16:09:26 UTC 
(rev 35103)
@@ -359,9 +359,11 @@
 /**
  * Initialize address subsystem. The addresses subsystem manages the addresses
  * known and current performance information.
+ *
+ * @param server handle to our server
  */
 void
-GAS_addresses_init (void);
+GAS_addresses_init (struct GNUNET_SERVER_Handle *server);
 
 
 /**
@@ -466,6 +468,20 @@
                              GNUNET_ATS_PeerInfo_Iterator pi_it,
                              void *pi_it_cls);
 
+
+/**
+ * Handle 'address list request' messages from clients.
+ *
+ * @param cls unused, NULL
+ * @param client client that sent the request
+ * @param message the request message
+ */
+void
+GAS_handle_request_address_list (void *cls,
+                                 struct GNUNET_SERVER_Client *client,
+                                 const struct GNUNET_MessageHeader *message);
+
+
 #endif
 
 /* end of gnunet-service-ats_addresses.h */

Modified: gnunet/src/ats/gnunet-service-ats_performance.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_performance.c     2015-02-05 15:45:30 UTC 
(rev 35102)
+++ gnunet/src/ats/gnunet-service-ats_performance.c     2015-02-05 16:09:26 UTC 
(rev 35103)
@@ -17,7 +17,6 @@
      Free Software Foundation, Inc., 59 Temple Place - Suite 330,
      Boston, MA 02111-1307, USA.
 */
-
 /**
  * @file ats/gnunet-service-ats_performance.c
  * @brief ats service, interaction with 'performance' API
@@ -31,92 +30,23 @@
 #include "gnunet-service-ats_reservations.h"
 #include "ats.h"
 
-/**
- * We keep clients that are interested in performance in a linked list.
- */
-struct PerformanceClient
-{
-  /**
-   * Next in doubly-linked list.
-   */
-  struct PerformanceClient *next;
 
-  /**
-   * Previous in doubly-linked list.
-   */
-  struct PerformanceClient *prev;
-
-  /**
-   * Actual handle to the client.
-   */
-  struct GNUNET_SERVER_Client *client;
-
-  /**
-   * Options for the client.
-   */
-  enum StartFlag flag;
-
-};
-
-
 /**
- * Head of linked list of all clients to this service.
+ * Context for sending messages to performance clients without PIC.
  */
-static struct PerformanceClient *pc_head;
-
-/**
- * Tail of linked list of all clients to this service.
- */
-static struct PerformanceClient *pc_tail;
-
-
-/**
- * Context for sending messages to performance clients.
- */
 static struct GNUNET_SERVER_NotificationContext *nc;
 
-
 /**
- * Find the performance client associated with the given handle.
- *
- * @param client server handle
- * @return internal handle
+ * Context for sending messages to performance clients with PIC.
  */
-static struct PerformanceClient *
-find_client (struct GNUNET_SERVER_Client *client)
-{
-  struct PerformanceClient *pc;
+static struct GNUNET_SERVER_NotificationContext *nc_pic;
 
-  for (pc = pc_head; pc != NULL; pc = pc->next)
-    if (pc->client == client)
-      return pc;
-  return NULL;
-}
 
 /**
- * Unregister a client (which may have been a performance client,
- * but this is not assured).
- *
- * @param client handle of the (now dead) client
- */
-void
-GAS_performance_remove_client (struct GNUNET_SERVER_Client *client)
-{
-  struct PerformanceClient *pc;
-
-  pc = find_client (client);
-  if (NULL == pc)
-    return;
-  GNUNET_CONTAINER_DLL_remove (pc_head, pc_tail, pc);
-  GNUNET_free (pc);
-}
-
-
-/**
  * Transmit the given performance information to all performance
  * clients.
  *
- * @param pc performance client to send to
+ * @param pc client to send to, NULL for all
  * @param peer peer for which this is an address suggestion
  * @param plugin_name 0-termintated string specifying the transport plugin
  * @param plugin_addr binary address for the plugin to use
@@ -131,7 +61,7 @@
  * @param bandwidth_in assigned inbound bandwidth
  */
 void
-GAS_performance_notify_client (struct PerformanceClient *pc,
+GAS_performance_notify_client (struct GNUNET_SERVER_Client *client,
                                const struct GNUNET_PeerIdentity *peer,
                                const char *plugin_name,
                                const void *plugin_addr,
@@ -142,7 +72,6 @@
                                struct GNUNET_BANDWIDTH_Value32NBO 
bandwidth_out,
                                struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
 {
-
   struct PeerInformationMessage *msg;
   size_t plugin_name_length = strlen (plugin_name) + 1;
   size_t msize =
@@ -153,10 +82,6 @@
   struct GNUNET_ATS_Information *atsp;
   char *addrp;
 
-  GNUNET_assert (NULL != pc);
-  if (NULL == find_client (pc->client))
-    return; /* Client disconnected */
-
   GNUNET_assert (msize < GNUNET_SERVER_MAX_MESSAGE_SIZE);
   GNUNET_assert (atsi_count <
                  GNUNET_SERVER_MAX_MESSAGE_SIZE /
@@ -177,10 +102,19 @@
   addrp = (char *) &atsp[atsi_count];
   memcpy (addrp, plugin_addr, plugin_addr_len);
   strcpy (&addrp[plugin_addr_len], plugin_name);
-  GNUNET_SERVER_notification_context_unicast (nc,
-                                              pc->client,
-                                              &msg->header,
-                                              GNUNET_YES);
+  if (NULL == client)
+  {
+    GNUNET_SERVER_notification_context_broadcast (nc_pic,
+                                                  &msg->header,
+                                                  GNUNET_YES);
+  }
+  else
+  {
+    GNUNET_SERVER_notification_context_unicast (nc,
+                                                client,
+                                                &msg->header,
+                                                GNUNET_YES);
+  }
 }
 
 
@@ -212,31 +146,26 @@
                                     struct GNUNET_BANDWIDTH_Value32NBO 
bandwidth_out,
                                     struct GNUNET_BANDWIDTH_Value32NBO 
bandwidth_in)
 {
-  struct PerformanceClient *pc;
-
-  for (pc = pc_head; pc != NULL; pc = pc->next)
-    if (pc->flag == START_FLAG_PERFORMANCE_WITH_PIC)
-    {
-        GAS_performance_notify_client (pc,
-                                       peer,
-                                       plugin_name,
-                                       plugin_addr,
-                                       plugin_addr_len,
-                                       active,
-                                       atsi, atsi_count,
-                                       bandwidth_out, bandwidth_in);
-    }
+  GAS_performance_notify_client (NULL,
+                                 peer,
+                                 plugin_name,
+                                 plugin_addr,
+                                 plugin_addr_len,
+                                 active,
+                                 atsi, atsi_count,
+                                 bandwidth_out,
+                                 bandwidth_in);
   GNUNET_STATISTICS_update (GSA_stats,
-                            "# performance updates given to clients", 1,
+                            "# performance updates given to clients",
+                            1,
                             GNUNET_NO);
 }
 
 
-
 /**
  * Iterator for called from #GAS_addresses_get_peer_info()
  *
- * @param cls closure with the `struct PerformanceClient *`
+ * @param cls closure with the `struct GNUNET_SERVER_Client *` to inform.
  * @param id the peer id
  * @param plugin_name plugin name
  * @param plugin_addr address
@@ -259,9 +188,8 @@
              struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
              struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
 {
-  struct PerformanceClient *pc = cls;
+  struct GNUNET_SERVER_Client *client = cls;
 
-  GNUNET_assert (NULL != pc);
   if (NULL == id)
     return;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -270,7 +198,7 @@
               plugin_name,
               (unsigned int) ntohl (bandwidth_out.value__),
               (unsigned int) ntohl (bandwidth_in.value__));
-  GAS_performance_notify_client (pc,
+  GAS_performance_notify_client (client,
                                  id,
                                  plugin_name,
                                  plugin_addr,
@@ -292,318 +220,32 @@
 GAS_performance_add_client (struct GNUNET_SERVER_Client *client,
                             enum StartFlag flag)
 {
-  struct PerformanceClient *pc;
-
-  GNUNET_break (NULL == find_client (client));
-  pc = GNUNET_new (struct PerformanceClient);
-  pc->client = client;
-  pc->flag = flag;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Adding performance client %s PIC\n",
-              (flag == START_FLAG_PERFORMANCE_WITH_PIC) ? "with" : "without");
-
-  GNUNET_SERVER_notification_context_add (nc,
-                                          client);
-  GNUNET_CONTAINER_DLL_insert (pc_head,
-                               pc_tail,
-                               pc);
-  GAS_addresses_get_peer_info (NULL,
-                               &peerinfo_it,
-                               pc);
-}
-
-
-/**
- * Information we need for the callbacks to return a list of addresses
- * back to the client.
- */
-struct AddressIteration
-{
-  /**
-   * Actual handle to the client.
-   */
-  struct PerformanceClient *pc;
-
-  /**
-   * Are we sending all addresses, or only those that are active?
-   */
-  int all;
-
-  /**
-   * Which ID should be included in the response?
-   */
-  uint32_t id;
-
-};
-
-
-/**
- * Send a #GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE with the
- * given address details to the client identified in @a ai.
- *
- * @param ai our address information context (identifies the client)
- * @param id the peer id this address is for
- * @param plugin_name name of the plugin that supports this address
- * @param plugin_addr address
- * @param plugin_addr_len length of @a plugin_addr
- * @param active #GNUNET_YES if this address is actively used
- * @param atsi ats performance information
- * @param atsi_count number of ats performance elements in @a atsi
- * @param bandwidth_out current outbound bandwidth assigned to address
- * @param bandwidth_in current inbound bandwidth assigned to address
- */
-static void
-transmit_req_addr (struct AddressIteration *ai,
-                   const struct GNUNET_PeerIdentity *id,
-                   const char *plugin_name,
-                   const void *plugin_addr,
-                   size_t plugin_addr_len,
-                   int active,
-                   const struct GNUNET_ATS_Information *atsi,
-                   uint32_t atsi_count,
-                   struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
-                   struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
-
-{
-  struct GNUNET_ATS_Information *atsp;
-  struct PeerInformationMessage *msg;
-  char *addrp;
-  size_t plugin_name_length;
-  size_t msize;
-
-  if (NULL != plugin_name)
-    plugin_name_length = strlen (plugin_name) + 1;
-  else
-    plugin_name_length = 0;
-  msize = sizeof (struct PeerInformationMessage) +
-          atsi_count * sizeof (struct GNUNET_ATS_Information) +
-          plugin_addr_len + plugin_name_length;
-  char buf[msize] GNUNET_ALIGN;
-
-  GNUNET_assert (msize < GNUNET_SERVER_MAX_MESSAGE_SIZE);
-  GNUNET_assert (atsi_count <
-                 GNUNET_SERVER_MAX_MESSAGE_SIZE /
-                 sizeof (struct GNUNET_ATS_Information));
-  msg = (struct PeerInformationMessage *) buf;
-  msg->header.size = htons (msize);
-  msg->header.type = htons (GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE);
-  msg->ats_count = htonl (atsi_count);
-  msg->id = htonl (ai->id);
-  if (NULL != id)
-    msg->peer = *id;
-  else
-    memset (&msg->peer, '\0', sizeof (struct GNUNET_PeerIdentity));
-  msg->address_length = htons (plugin_addr_len);
-  msg->address_active = ntohl (active);
-  msg->plugin_name_length = htons (plugin_name_length);
-  msg->bandwidth_out = bandwidth_out;
-  msg->bandwidth_in = bandwidth_in;
-  atsp = (struct GNUNET_ATS_Information *) &msg[1];
-  memcpy (atsp, atsi, sizeof (struct GNUNET_ATS_Information) * atsi_count);
-  addrp = (char *) &atsp[atsi_count];
-  if (NULL != plugin_addr)
-    memcpy (addrp, plugin_addr, plugin_addr_len);
-  if (NULL != plugin_name)
-    strcpy (&addrp[plugin_addr_len], plugin_name);
-  GNUNET_SERVER_notification_context_unicast (nc,
-                                              ai->pc->client,
-                                              &msg->header,
-                                              GNUNET_NO);
-}
-
-
-/**
- * Iterator for #GAS_addresses_get_peer_info(), called with peer-specific
- * information to be passed back to the client.
- *
- * @param cls closure with our `struct AddressIteration *`
- * @param id the peer id
- * @param plugin_name plugin name
- * @param plugin_addr address
- * @param plugin_addr_len length of @a plugin_addr
- * @param active is address actively used
- * @param atsi ats performance information
- * @param atsi_count number of ats performance elements in @a atsi
- * @param bandwidth_out current outbound bandwidth assigned to address
- * @param bandwidth_in current inbound bandwidth assigned to address
- */
-static void
-req_addr_peerinfo_it (void *cls,
-                      const struct GNUNET_PeerIdentity *id,
-                      const char *plugin_name,
-                      const void *plugin_addr,
-                      size_t plugin_addr_len,
-                      int active,
-                      const struct GNUNET_ATS_Information *atsi,
-                      uint32_t atsi_count,
-                      struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
-                      struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
-{
-  struct AddressIteration *ai = cls;
-
-  if ( (NULL == id) &&
-       (NULL == plugin_name) &&
-       (NULL == plugin_addr) )
+  if (START_FLAG_PERFORMANCE_WITH_PIC == flag)
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Address iteration done for one peer\n");
-    return;
+    GNUNET_SERVER_notification_context_add (nc_pic,
+                                            client);
+    GNUNET_SERVER_notification_context_add (nc,
+                                            client);
   }
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Callback for %s peer `%s' plugin `%s' BW out %u, BW in %u\n",
-              (active == GNUNET_YES) ? "ACTIVE" : "INACTIVE",
-              GNUNET_i2s (id),
-              plugin_name,
-              (unsigned int) ntohl (bandwidth_out.value__),
-              (unsigned int) ntohl (bandwidth_in.value__));
-
-  /* Transmit result (either if address is active, or if
-     client wanted all addresses) */
-  if ( (GNUNET_YES == ai->all) ||
-       (GNUNET_YES == active))
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Sending result for %s peer `%s' plugin `%s' BW out %u, BW in 
%u\n",
-                (active == GNUNET_YES) ? "ACTIVE" : "INACTIVE",
-                GNUNET_i2s (id),
-                plugin_name,
-                (unsigned int) ntohl (bandwidth_out.value__),
-                (unsigned int) ntohl (bandwidth_in.value__));
-    transmit_req_addr (ai,
-                       id,
-                       plugin_name,
-                       plugin_addr, plugin_addr_len,
-                       active,
-                       atsi,
-                       atsi_count,
-                       bandwidth_out,
-                       bandwidth_in);
-  }
-}
-
-
-/**
- * Handle 'address list request' messages from clients.
- *
- * @param cls unused, NULL
- * @param client client that sent the request
- * @param message the request message
- */
-void
-GAS_handle_request_address_list (void *cls,
-                                 struct GNUNET_SERVER_Client *client,
-                                 const struct GNUNET_MessageHeader *message)
-{
-  struct PerformanceClient *pc;
-  struct AddressIteration ai;
-  const struct AddressListRequestMessage *alrm;
-  struct GNUNET_PeerIdentity allzeros;
-  struct GNUNET_BANDWIDTH_Value32NBO bandwidth_zero;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Received `%s' message\n",
-              "ADDRESSLIST_REQUEST");
-  if (NULL == (pc = find_client(client)))
-  {
-    GNUNET_break (0);
-    return;
-  }
-  alrm = (const struct AddressListRequestMessage *) message;
-  ai.all = ntohl (alrm->all);
-  ai.id = ntohl (alrm->id);
-  ai.pc = pc;
-
-  memset (&allzeros, '\0', sizeof (struct GNUNET_PeerIdentity));
-  bandwidth_zero.value__ = htonl (0);
-  if (0 == memcmp (&alrm->peer,
-                   &allzeros,
-                   sizeof (struct GNUNET_PeerIdentity)))
-  {
-    /* Return addresses for all peers */
-    GAS_addresses_get_peer_info (NULL,
-                                 &req_addr_peerinfo_it,
-                                 &ai);
-  }
   else
-  {
-    /* Return addresses for a specific peer */
-    GAS_addresses_get_peer_info (&alrm->peer,
-                                 &req_addr_peerinfo_it,
-                                 &ai);
-  }
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Finished handling `%s' message\n",
-              "ADDRESSLIST_REQUEST");
-  transmit_req_addr (&ai,
-                     NULL, NULL, NULL,
-                     0, GNUNET_NO,
-                     NULL, 0,
-                     bandwidth_zero,
-                     bandwidth_zero);
-  GNUNET_SERVER_receive_done (client,
-                              GNUNET_OK);
+    GNUNET_SERVER_notification_context_add (nc,
+                                            client);
+  GAS_addresses_get_peer_info (NULL,
+                               &peerinfo_it,
+                               client);
 }
 
 
 /**
- * Handle 'reservation request' messages from clients.
- *
- * @param cls unused, NULL
- * @param client client that sent the request
- * @param message the request message
- */
-void
-GAS_handle_reservation_request (void *cls,
-                                struct GNUNET_SERVER_Client *client,
-                                const struct GNUNET_MessageHeader *message)
-{
-  const struct ReservationRequestMessage *msg =
-      (const struct ReservationRequestMessage *) message;
-  struct ReservationResultMessage result;
-  int32_t amount;
-  struct GNUNET_TIME_Relative res_delay;
-
-  if (NULL == find_client (client))
-  {
-    /* missing start message! */
-    GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
-    return;
-  }
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Received `%s' message\n",
-              "RESERVATION_REQUEST");
-  amount = (int32_t) ntohl (msg->amount);
-  res_delay = GAS_reservations_reserve (&msg->peer, amount);
-  if (res_delay.rel_value_us > 0)
-    amount = 0;
-  result.header.size = htons (sizeof (struct ReservationResultMessage));
-  result.header.type = htons (GNUNET_MESSAGE_TYPE_ATS_RESERVATION_RESULT);
-  result.amount = htonl (amount);
-  result.peer = msg->peer;
-  result.res_delay = GNUNET_TIME_relative_hton (res_delay);
-  GNUNET_STATISTICS_update (GSA_stats,
-                            "# reservation requests processed", 1,
-                            GNUNET_NO);
-  GNUNET_SERVER_notification_context_unicast (nc, client, &result.header,
-                                              GNUNET_NO);
-  GNUNET_SERVER_receive_done (client, GNUNET_OK);
-}
-
-
-
-
-/**
  * Initialize performance subsystem.
  *
  * @param server handle to our server
- * @param addresses the address handle to use
  */
 void
 GAS_performance_init (struct GNUNET_SERVER_Handle *server)
 {
-  nc = GNUNET_SERVER_notification_context_create (server, 128);
+  nc = GNUNET_SERVER_notification_context_create (server, 32);
+  nc_pic = GNUNET_SERVER_notification_context_create (server, 32);
 }
 
 
@@ -615,6 +257,8 @@
 {
   GNUNET_SERVER_notification_context_destroy (nc);
   nc = NULL;
+  GNUNET_SERVER_notification_context_destroy (nc_pic);
+  nc_pic = NULL;
 }
 
 /* end of gnunet-service-ats_performance.c */

Modified: gnunet/src/ats/gnunet-service-ats_performance.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_performance.h     2015-02-05 15:45:30 UTC 
(rev 35102)
+++ gnunet/src/ats/gnunet-service-ats_performance.h     2015-02-05 16:09:26 UTC 
(rev 35103)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2011 Christian Grothoff (and other contributing authors)
+     (C) 2011-2015 Christian Grothoff (and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -43,16 +43,6 @@
 
 
 /**
- * Unregister a client (which may have been a performance client,
- * but this is not assured).
- *
- * @param client handle of the (now dead) client
- */
-void
-GAS_performance_remove_client (struct GNUNET_SERVER_Client *client);
-
-
-/**
  * Transmit the given performance information to all performance
  * clients.
  *
@@ -82,62 +72,6 @@
 
 
 /**
- * Handle 'address list request' messages from clients.
- *
- * @param cls unused, NULL
- * @param client client that sent the request
- * @param message the request message
- */
-void
-GAS_handle_request_address_list (void *cls,
-                                 struct GNUNET_SERVER_Client *client,
-                                 const struct GNUNET_MessageHeader *message);
-
-/**
- * Handle 'reservation request' messages from clients.
- *
- * @param cls unused, NULL
- * @param client client that sent the request
- * @param message the request message
- */
-void
-GAS_handle_reservation_request (void *cls,
-                                struct GNUNET_SERVER_Client *client,
-                                const struct GNUNET_MessageHeader *message);
-
-
-/**
- * Handle 'preference change' messages from clients.
- *
- * @param cls unused, NULL
- * @param client client that sent the request
- * @param message the request message
- */
-void
-GAS_handle_preference_change (void *cls,
-                              struct GNUNET_SERVER_Client *client,
-                              const struct GNUNET_MessageHeader *message);
-
-
-/**
- * Handle 'preference feedback' messages from clients.
- *
- * @param cls unused, NULL
- * @param client client that sent the request
- * @param message the request message
- */
-void
-GAS_handle_preference_feedback (void *cls,
-                                struct GNUNET_SERVER_Client *client,
-                                const struct GNUNET_MessageHeader *message);
-
-
-void
-GAS_handle_monitor (void *cls,
-                    struct GNUNET_SERVER_Client *client,
-                    const struct GNUNET_MessageHeader *message);
-
-/**
  * Initialize performance subsystem.
  *
  * @param server handle to our server
@@ -154,7 +88,5 @@
 GAS_performance_done (void);
 
 
-/* FIXME: add API to broadcast performance updates! */
-
 #endif
 /* end of gnunet-service-ats_performance.h */

Modified: gnunet/src/ats/gnunet-service-ats_preferences.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_preferences.h     2015-02-05 15:45:30 UTC 
(rev 35102)
+++ gnunet/src/ats/gnunet-service-ats_preferences.h     2015-02-05 16:09:26 UTC 
(rev 35103)
@@ -39,8 +39,6 @@
 #define DEFAULT_REL_PREFERENCE 0.0
 
 
-
-
 /**
  * A preference client disconnected
  *
@@ -50,8 +48,6 @@
 GAS_addresses_preference_client_disconnect (void *client);
 
 
-
-
 /**
  * Change the preference for a peer
  *
@@ -68,6 +64,20 @@
 
 
 /**
+ * Handle 'preference change' messages from clients.
+ *
+ * @param cls unused, NULL
+ * @param client client that sent the request
+ * @param message the request message
+ */
+void
+GAS_handle_preference_change (void *cls,
+                              struct GNUNET_SERVER_Client *client,
+                              const struct GNUNET_MessageHeader *message);
+
+
+
+/**
  * Application feedback on how good preference requirements are fulfilled
  * for a specific preference in the given time scope [now - scope .. now]
  *
@@ -92,6 +102,20 @@
                                    float score_abs);
 
 /**
+ * Handle 'preference feedback' messages from clients.
+ *
+ * @param cls unused, NULL
+ * @param client client that sent the request
+ * @param message the request message
+ */
+void
+GAS_handle_preference_feedback (void *cls,
+                                struct GNUNET_SERVER_Client *client,
+                                const struct GNUNET_MessageHeader *message);
+
+
+
+/**
  * Shutdown preferences subsystem.
  */
 void

Modified: gnunet/src/ats/gnunet-service-ats_reservations.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_reservations.c    2015-02-05 15:45:30 UTC 
(rev 35102)
+++ gnunet/src/ats/gnunet-service-ats_reservations.c    2015-02-05 16:09:26 UTC 
(rev 35103)
@@ -25,6 +25,8 @@
  */
 #include "platform.h"
 #include "gnunet-service-ats_reservations.h"
+#include "gnunet-service-ats.h"
+#include "ats.h"
 
 /**
  * Number of seconds that available bandwidth carries over
@@ -38,7 +40,12 @@
  */
 static struct GNUNET_CONTAINER_MultiPeerMap *trackers;
 
+/**
+ * Context for sending messages to performance clients without PIC.
+ */
+static struct GNUNET_SERVER_NotificationContext *nc;
 
+
 /**
  * Reserve the given amount of incoming bandwidth (in bytes) from the
  * given peer.  If a reservation is not possible right now, return how
@@ -120,12 +127,59 @@
 
 
 /**
+ * Handle 'reservation request' messages from clients.
+ *
+ * @param cls unused, NULL
+ * @param client client that sent the request
+ * @param message the request message
+ */
+void
+GAS_handle_reservation_request (void *cls,
+                                struct GNUNET_SERVER_Client *client,
+                                const struct GNUNET_MessageHeader *message)
+{
+  const struct ReservationRequestMessage *msg =
+      (const struct ReservationRequestMessage *) message;
+  struct ReservationResultMessage result;
+  int32_t amount;
+  struct GNUNET_TIME_Relative res_delay;
+
+  GNUNET_SERVER_notification_context_add (nc,
+                                          client);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Received RESERVATION_REQUEST message\n");
+  amount = (int32_t) ntohl (msg->amount);
+  res_delay = GAS_reservations_reserve (&msg->peer, amount);
+  if (res_delay.rel_value_us > 0)
+    amount = 0;
+  result.header.size = htons (sizeof (struct ReservationResultMessage));
+  result.header.type = htons (GNUNET_MESSAGE_TYPE_ATS_RESERVATION_RESULT);
+  result.amount = htonl (amount);
+  result.peer = msg->peer;
+  result.res_delay = GNUNET_TIME_relative_hton (res_delay);
+  GNUNET_STATISTICS_update (GSA_stats,
+                            "# reservation requests processed",
+                            1,
+                            GNUNET_NO);
+  GNUNET_SERVER_notification_context_unicast (nc,
+                                              client,
+                                              &result.header,
+                                              GNUNET_NO);
+  GNUNET_SERVER_receive_done (client,
+                              GNUNET_OK);
+}
+
+
+/**
  * Initialize reservations subsystem.
+ *
+ * @param server handle to our server
  */
 void
-GAS_reservations_init ()
+GAS_reservations_init (struct GNUNET_SERVER_Handle *server)
 {
   trackers = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_NO);
+  nc = GNUNET_SERVER_notification_context_create (server, 128);
 }
 
 
@@ -134,8 +188,8 @@
  *
  * @param cls NULL
  * @param key peer identity (unused)
- * @param value the 'struct GNUNET_BANDWIDTH_Tracker' to free
- * @return GNUNET_OK (continue to iterate)
+ * @param value the `struct GNUNET_BANDWIDTH_Tracker` to free
+ * @return #GNUNET_OK (continue to iterate)
  */
 static int
 free_tracker (void *cls,
@@ -154,8 +208,13 @@
 void
 GAS_reservations_done ()
 {
-  GNUNET_CONTAINER_multipeermap_iterate (trackers, &free_tracker, NULL);
+  GNUNET_CONTAINER_multipeermap_iterate (trackers,
+                                         &free_tracker,
+                                         NULL);
   GNUNET_CONTAINER_multipeermap_destroy (trackers);
+  GNUNET_SERVER_notification_context_destroy (nc);
+  nc = NULL;
+
 }
 
 /* end of gnunet-service-ats_reservations.c */

Modified: gnunet/src/ats/gnunet-service-ats_reservations.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_reservations.h    2015-02-05 15:45:30 UTC 
(rev 35102)
+++ gnunet/src/ats/gnunet-service-ats_reservations.h    2015-02-05 16:09:26 UTC 
(rev 35103)
@@ -60,10 +60,25 @@
 
 
 /**
+ * Handle 'reservation request' messages from clients.
+ *
+ * @param cls unused, NULL
+ * @param client client that sent the request
+ * @param message the request message
+ */
+void
+GAS_handle_reservation_request (void *cls,
+                                struct GNUNET_SERVER_Client *client,
+                                const struct GNUNET_MessageHeader *message);
+
+
+/**
  * Initialize reservations subsystem.
+ *
+ * @param server handle to our server
  */
 void
-GAS_reservations_init (void);
+GAS_reservations_init (struct GNUNET_SERVER_Handle *server);
 
 
 /**




reply via email to

[Prev in Thread] Current Thread [Next in Thread]