-only trigger check config if we actually need it
[oweals/gnunet.git] / src / ats / gnunet-service-ats_performance.c
index e87cf3f6dc78aaa18cb71789e2cd366a47ccae23..1b22039db15e33a369d5fdde025cdc8f2bc3b825 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2011-2015 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2011-2015 GNUnet e.V.
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 /**
  * @file ats/gnunet-service-ats_performance.c
  * @brief ats service, interaction with 'performance' API
  * @author Matthias Wachs
  * @author Christian Grothoff
+ *
+ * TODO:
+ * - simplify functions by passing a `struct GNUNET_HELLO_Address`
  */
 #include "platform.h"
 #include "gnunet-service-ats.h"
@@ -54,8 +57,8 @@ static struct GNUNET_SERVER_NotificationContext *nc_pic;
  *        to maintain a connection to a peer;
  *        #GNUNET_NO if the address is not actively used;
  *        #GNUNET_SYSERR if this address is no longer available for ATS
- * @param atsi performance data for the address
- * @param atsi_count number of performance records in @a atsi
+ * @param prop performance data for the address
+ * @param local_address_info information about the local flags for the address
  * @param bandwidth_out assigned outbound bandwidth
  * @param bandwidth_in assigned inbound bandwidth
  */
@@ -66,40 +69,44 @@ notify_client (struct GNUNET_SERVER_Client *client,
                const void *plugin_addr,
                size_t plugin_addr_len,
                int active,
-               const struct GNUNET_ATS_Information *atsi,
-               uint32_t atsi_count,
+               const struct GNUNET_ATS_Properties *prop,
+               enum GNUNET_HELLO_AddressInfo local_address_info,
                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 =
-      sizeof (struct PeerInformationMessage) +
-      atsi_count * sizeof (struct GNUNET_ATS_Information) + plugin_addr_len +
-      plugin_name_length;
+    sizeof (struct PeerInformationMessage) +
+    plugin_addr_len +
+    plugin_name_length;
   char buf[msize] GNUNET_ALIGN;
-  struct GNUNET_ATS_Information *atsp;
+  struct GNUNET_SERVER_NotificationContext **uc;
   struct GNUNET_SERVER_NotificationContext *nc;
   char *addrp;
 
+  if (NULL != prop)
+    GNUNET_break (GNUNET_ATS_NET_UNSPECIFIED != prop->scope);
   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_PEER_INFORMATION);
   msg->id = htonl (0);
-  msg->ats_count = htonl (atsi_count);
   msg->peer = *peer;
   msg->address_length = htons (plugin_addr_len);
   msg->address_active = ntohl ((uint32_t) 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 != prop)
+    GNUNET_ATS_properties_hton (&msg->properties,
+                                prop);
+  else
+    memset (&msg->properties,
+            0,
+            sizeof (struct GNUNET_ATS_Properties));
+  msg->address_local_info = htonl (local_address_info);
+  addrp = (char *) &msg[1];
   memcpy (addrp, plugin_addr, plugin_addr_len);
   strcpy (&addrp[plugin_addr_len], plugin_name);
   if (NULL == client)
@@ -110,13 +117,14 @@ notify_client (struct GNUNET_SERVER_Client *client,
   }
   else
   {
-    nc = *GNUNET_SERVER_client_get_user_context (client,
+    uc = GNUNET_SERVER_client_get_user_context (client,
                                                  struct GNUNET_SERVER_NotificationContext *);
-    if (NULL == nc)
+    if (NULL == uc)
     {
       GNUNET_break (0);
       return;
     }
+    nc = *uc;
     GNUNET_SERVER_notification_context_unicast (nc,
                                                 client,
                                                 &msg->header,
@@ -137,8 +145,8 @@ notify_client (struct GNUNET_SERVER_Client *client,
  *        to maintain a connection to a peer;
  *        #GNUNET_NO if the address is not actively used;
  *        #GNUNET_SYSERR if this address is no longer available for ATS
- * @param atsi performance data for the address
- * @param atsi_count number of performance records in @a atsi
+ * @param prop performance data for the address
+ * @param local_address_info information about the local flags for the address
  * @param bandwidth_out assigned outbound bandwidth
  * @param bandwidth_in assigned inbound bandwidth
  */
@@ -148,18 +156,21 @@ GAS_performance_notify_all_clients (const struct GNUNET_PeerIdentity *peer,
                                     const void *plugin_addr,
                                     size_t plugin_addr_len,
                                     int active,
-                                    const struct GNUNET_ATS_Information *atsi,
-                                    uint32_t atsi_count,
+                                    const struct GNUNET_ATS_Properties *prop,
+                                    enum GNUNET_HELLO_AddressInfo local_address_info,
                                     struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
                                     struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
 {
+  GNUNET_break ( (NULL == prop) ||
+                 (GNUNET_ATS_NET_UNSPECIFIED != prop->scope) );
   notify_client (NULL,
                  peer,
                  plugin_name,
                  plugin_addr,
                  plugin_addr_len,
                  active,
-                 atsi, atsi_count,
+                 prop,
+                 local_address_info,
                  bandwidth_out,
                  bandwidth_in);
   GNUNET_STATISTICS_update (GSA_stats,
@@ -178,8 +189,8 @@ GAS_performance_notify_all_clients (const struct GNUNET_PeerIdentity *peer,
  * @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 prop performance information
+ * @param local_address_info information about the local flags for the address
  * @param bandwidth_out current outbound bandwidth assigned to address
  * @param bandwidth_in current inbound bandwidth assigned to address
  */
@@ -190,8 +201,8 @@ peerinfo_it (void *cls,
              const void *plugin_addr,
              size_t plugin_addr_len,
              int active,
-             const struct GNUNET_ATS_Information *atsi,
-             uint32_t atsi_count,
+             const struct GNUNET_ATS_Properties *prop,
+             enum GNUNET_HELLO_AddressInfo local_address_info,
              struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
              struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
 {
@@ -205,13 +216,15 @@ peerinfo_it (void *cls,
               plugin_name,
               (unsigned int) ntohl (bandwidth_out.value__),
               (unsigned int) ntohl (bandwidth_in.value__));
+  GNUNET_break (GNUNET_ATS_NET_UNSPECIFIED != prop->scope);
   notify_client (client,
                  id,
                  plugin_name,
                  plugin_addr,
                  plugin_addr_len,
                  active,
-                 atsi, atsi_count,
+                 prop,
+                 local_address_info,
                  bandwidth_out,
                  bandwidth_in);
 }