gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r37964 - in gnunet/src: ats include namestore


From: gnunet
Subject: [GNUnet-SVN] r37964 - in gnunet/src: ats include namestore
Date: Wed, 21 Sep 2016 12:56:28 +0200

Author: grothoff
Date: 2016-09-21 12:56:28 +0200 (Wed, 21 Sep 2016)
New Revision: 37964

Removed:
   gnunet/src/ats/gnunet-service-ats_feedback.c
   gnunet/src/ats/gnunet-service-ats_feedback.h
Modified:
   gnunet/src/ats/Makefile.am
   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_connectivity.c
   gnunet/src/ats/gnunet-service-ats_connectivity.h
   gnunet/src/ats/gnunet-service-ats_performance.c
   gnunet/src/ats/gnunet-service-ats_performance.h
   gnunet/src/ats/gnunet-service-ats_plugins.c
   gnunet/src/ats/gnunet-service-ats_plugins.h
   gnunet/src/ats/gnunet-service-ats_preferences.c
   gnunet/src/ats/gnunet-service-ats_preferences.h
   gnunet/src/ats/gnunet-service-ats_reservations.c
   gnunet/src/ats/gnunet-service-ats_reservations.h
   gnunet/src/ats/gnunet-service-ats_scheduling.c
   gnunet/src/ats/gnunet-service-ats_scheduling.h
   gnunet/src/ats/plugin_ats_mlp.c
   gnunet/src/ats/plugin_ats_proportional.c
   gnunet/src/ats/plugin_ats_ril.c
   gnunet/src/include/gnunet_ats_plugin.h
   gnunet/src/namestore/gnunet-service-namestore.c
Log:
migrating more services to new service API

Modified: gnunet/src/ats/Makefile.am
===================================================================
--- gnunet/src/ats/Makefile.am  2016-09-20 20:27:36 UTC (rev 37963)
+++ gnunet/src/ats/Makefile.am  2016-09-21 10:56:28 UTC (rev 37964)
@@ -83,7 +83,6 @@
  gnunet-service-ats.c gnunet-service-ats.h \
  gnunet-service-ats_addresses.c gnunet-service-ats_addresses.h \
  gnunet-service-ats_connectivity.c gnunet-service-ats_connectivity.h \
- gnunet-service-ats_feedback.c gnunet-service-ats_feedback.h \
  gnunet-service-ats_normalization.c gnunet-service-ats_normalization.h \
  gnunet-service-ats_performance.c gnunet-service-ats_performance.h \
  gnunet-service-ats_plugins.c gnunet-service-ats_plugins.h \

Modified: gnunet/src/ats/gnunet-service-ats.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats.c 2016-09-20 20:27:36 UTC (rev 37963)
+++ gnunet/src/ats/gnunet-service-ats.c 2016-09-21 10:56:28 UTC (rev 37964)
@@ -28,7 +28,6 @@
 #include "gnunet-service-ats.h"
 #include "gnunet-service-ats_addresses.h"
 #include "gnunet-service-ats_connectivity.h"
-#include "gnunet-service-ats_feedback.h"
 #include "gnunet-service-ats_normalization.h"
 #include "gnunet-service-ats_performance.h"
 #include "gnunet-service-ats_preferences.h"
@@ -42,27 +41,19 @@
  */
 struct GNUNET_STATISTICS_Handle *GSA_stats;
 
-/**
- * Handle to the ATS server.
- */
-static struct GNUNET_SERVER_Handle *GSA_server;
 
-
 /**
  * We have received a `struct ClientStartMessage` from a client.  Find
  * out which type of client it is and notify the respective subsystem.
  *
- * @param cls closure, unused
- * @param client handle to the client
- * @param message the start message
+ * @param cls handle to the client
+ * @param msg the start message
  */
 static void
 handle_ats_start (void *cls,
-                  struct GNUNET_SERVER_Client *client,
-                  const struct GNUNET_MessageHeader *message)
+                  const struct ClientStartMessage *msg)
 {
-  const struct ClientStartMessage *msg =
-      (const struct ClientStartMessage *) message;
+  struct GNUNET_SERVICE_Client *client = cls;
   enum StartFlag flag;
 
   flag = ntohl (msg->start_flag);
@@ -72,10 +63,10 @@
   switch (flag)
   {
   case START_FLAG_SCHEDULING:
-    if (GNUNET_OK != GAS_scheduling_add_client (client))
+    if (GNUNET_OK !=
+       GAS_scheduling_add_client (client))
     {
-      GNUNET_SERVER_receive_done (client,
-                                  GNUNET_SYSERR);
+      GNUNET_SERVICE_client_drop (client);
       return;
     }
     break;
@@ -92,25 +83,325 @@
     break;
   default:
     GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
+    GNUNET_SERVICE_client_drop (client);
     return;
   }
-  GNUNET_SERVER_receive_done (client,
-                              GNUNET_OK);
+  GNUNET_SERVICE_client_continue (client);
 }
 
 
+
 /**
+ * Handle 'reservation request' messages from clients.
+ *
+ * @param cls client that sent the request
+ * @param message the request message
+ */
+static void
+handle_reservation_request (void *cls,
+                           const struct ReservationRequestMessage *message)
+{
+  struct GNUNET_SERVICE_Client *client = cls;
+
+  GAS_handle_reservation_request (client,
+                                 message);
+  GNUNET_SERVICE_client_continue (client);
+}
+
+
+/**
+ * Check 'preference feedback' message is well-formed
+ *
+ * @param cls client that sent the request
+ * @param message the request message
+ * @return #GNUNET_OK if @a message is well-formed
+ */
+static int
+check_feedback (void *cls,
+               const struct FeedbackPreferenceMessage *message)
+{
+  uint16_t msize;
+  uint32_t nump;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Received PREFERENCE_FEEDBACK message\n");
+  msize = ntohs (message->header.size);
+  nump = ntohl (message->num_feedback);
+  if (msize !=
+      sizeof (struct FeedbackPreferenceMessage) +
+      nump * sizeof (struct PreferenceInformation))
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  return GNUNET_OK;
+}
+
+
+/**
+ * Handle 'preference feedback' messages from clients.
+ *
+ * @param cls client that sent the request
+ * @param msg the request message
+ */
+static void
+handle_feedback (void *cls,
+                const struct FeedbackPreferenceMessage *msg)
+{
+  struct GNUNET_SERVICE_Client *client = cls;
+  const struct PreferenceInformation *pi;
+  uint32_t nump;
+
+  nump = ntohl (msg->num_feedback);
+  if (GNUNET_NO ==
+      GNUNET_CONTAINER_multipeermap_contains (GSA_addresses,
+                                             &msg->peer))
+  {
+    GNUNET_log(GNUNET_ERROR_TYPE_WARNING,
+              "Received PREFERENCE FEEDBACK for unknown peer `%s'\n",
+              GNUNET_i2s (&msg->peer));
+    GNUNET_SERVICE_client_continue (client);
+    return;
+  }
+
+  GNUNET_STATISTICS_update (GSA_stats,
+                            "# preference feedbacks requests processed",
+                            1,
+                            GNUNET_NO);
+  pi = (const struct PreferenceInformation *) &msg[1];
+  for (uint32_t i = 0; i < nump; i++)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+               "Received PREFERENCE FEEDBACK for peer `%s'\n",
+               GNUNET_i2s (&msg->peer));
+    GAS_plugin_notify_feedback (client,
+                               &msg->peer,
+                               GNUNET_TIME_relative_ntoh (msg->scope),
+                               (enum GNUNET_ATS_PreferenceKind) ntohl 
(pi[i].preference_kind),
+                               pi[i].preference_value);
+  }
+  GNUNET_SERVICE_client_continue (client);
+}
+
+
+/**
+ * Handle 'request address list' messages from clients.
+ *
+ * @param cls client that sent the request
+ * @param message the request message
+ */
+static void
+handle_request_address_list (void *cls,
+                            const struct AddressListRequestMessage *message)
+{
+  struct GNUNET_SERVICE_Client *client = cls;
+
+  GAS_handle_request_address_list (client,
+                                  message);
+  GNUNET_SERVICE_client_continue (client);
+}
+
+
+/**
+ * Handle 'request address' messages from clients.
+ *
+ * @param cls client that sent the request
+ * @param message the request message
+ */
+static void
+handle_request_address (void *cls,
+                       const struct RequestAddressMessage * message)
+{
+  struct GNUNET_SERVICE_Client *client = cls;
+
+  GAS_handle_request_address (client,
+                             message);
+  GNUNET_SERVICE_client_continue (client);
+}
+
+
+/**
+ * Cancel 'request address' messages from clients.
+ *
+ * @param cls client that sent the request
+ * @param message the request message
+ */
+static void
+handle_request_address_cancel (void *cls,
+                              const struct RequestAddressMessage *message)
+{
+  struct GNUNET_SERVICE_Client *client = cls;
+
+  GAS_handle_request_address_cancel (client,
+                                    message);
+  GNUNET_SERVICE_client_continue (client);
+}
+
+
+/**
+ * Handle 'address add' messages from clients.
+ *
+ * @param cls client that sent the request
+ * @param m the request message
+ */
+static int
+check_address_add (void *cls,
+                  const struct AddressAddMessage *m)
+{
+  const char *address;
+  const char *plugin_name;
+  uint16_t address_length;
+  uint16_t plugin_name_length;
+  uint16_t size;
+
+  size = ntohs (m->header.size);
+  address_length = ntohs (m->address_length);
+  plugin_name_length = ntohs (m->plugin_name_length);
+  address = (const char *) &m[1];
+  if (plugin_name_length != 0)
+    plugin_name = &address[address_length];
+  else
+    plugin_name = "";
+
+  if ( (address_length + plugin_name_length +
+       sizeof (struct AddressAddMessage) != size) ||
+       ( (plugin_name_length > 0) &&
+        (plugin_name[plugin_name_length - 1] != '\0') ) )
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  return GNUNET_OK;
+}
+
+
+/**
+ * Handle 'address add' messages from clients.
+ *
+ * @param cls client that sent the request
+ * @param message the request message
+ */
+static void
+handle_address_add (void *cls,
+                   const struct AddressAddMessage *message)
+{
+  struct GNUNET_SERVICE_Client *client = cls;
+
+  GAS_handle_address_add (message);
+  GNUNET_SERVICE_client_continue (client);
+}
+
+
+/**
+ * Handle 'address update' messages from clients.
+ *
+ * @param cls client that sent the request
+ * @param message the request message
+ */
+static void
+handle_address_update (void *cls,
+                      const struct AddressUpdateMessage *message)
+{
+  struct GNUNET_SERVICE_Client *client = cls;
+
+  GAS_handle_address_update (message);
+  GNUNET_SERVICE_client_continue (client);
+}
+
+
+/**
+ * Handle 'address destroyed' messages from clients.
+ *
+ * @param cls client that sent the request
+ * @param message the request message
+ */
+static void
+handle_address_destroyed (void *cls,
+                         const struct AddressDestroyedMessage *message)
+{
+  struct GNUNET_SERVICE_Client *client = cls;
+
+  GAS_handle_address_destroyed (message);
+  GNUNET_SERVICE_client_continue (client);
+}
+
+
+/**
+ * Check that 'change preference' message is well-formed.
+ *
+ * @param cls client that sent the request
+ * @param message the request message
+ * @return #GNUNET_OK if @a message is well-formed
+ */
+static int
+check_preference_change (void *cls,
+                        const struct ChangePreferenceMessage *message)
+{
+  uint16_t msize;
+  uint32_t nump;
+
+  msize = ntohs (message->header.size);
+  nump = ntohl (message->num_preferences);
+  if ( (msize !=
+        sizeof (struct ChangePreferenceMessage) +
+        nump * sizeof (struct PreferenceInformation)) ||
+       (UINT16_MAX / sizeof (struct PreferenceInformation) < nump) )
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  return GNUNET_OK;
+}
+
+
+/**
+ * Handle 'change preference' messages from clients.
+ *
+ * @param cls client that sent the request
+ * @param message the request message
+ */
+static void
+handle_preference_change (void *cls,
+                         const struct ChangePreferenceMessage *message)
+{
+  struct GNUNET_SERVICE_Client *client = cls;
+
+  GAS_handle_preference_change (client,
+                               message);
+  GNUNET_SERVICE_client_continue (client);
+}
+
+
+/**
+ * A client connected to us. Setup the local client
+ * record.
+ *
+ * @param cls unused
+ * @param client handle of the client
+ * @param mq message queue to talk to @a client
+ * @return @a client
+ */
+static void *
+client_connect_cb (void *cls,
+                  struct GNUNET_SERVICE_Client *client,
+                  struct GNUNET_MQ_Handle *mq)
+{
+  return client;
+}
+
+
+/**
  * A client disconnected from us.  Tear down the local client
  * record.
  *
  * @param cls unused
  * @param client handle of the client
+ * @param app_ctx
  */
 static void
-client_disconnect_handler (void *cls,
-                           struct GNUNET_SERVER_Client *client)
+client_disconnect_cb (void *cls,
+                     struct GNUNET_SERVICE_Client *client,
+                     void *app_ctx)
 {
   if (NULL == client)
     return;
@@ -134,7 +425,6 @@
   GAS_addresses_done ();
   GAS_plugin_done ();
   GAS_normalization_stop ();
-  GAS_scheduling_done ();
   GAS_performance_done ();
   GAS_preference_done ();
   GAS_reservations_done ();
@@ -150,51 +440,21 @@
  * Process template requests.
  *
  * @param cls closure
- * @param server the initialized server
  * @param cfg configuration to use
+ * @param service the initialized service
  */
 static void
 run (void *cls,
-     struct GNUNET_SERVER_Handle *server,
-     const struct GNUNET_CONFIGURATION_Handle *cfg)
+     const struct GNUNET_CONFIGURATION_Handle *cfg,
+     struct GNUNET_SERVICE_Handle *service)
 {
-  static const struct GNUNET_SERVER_MessageHandler handlers[] = {
-    {&handle_ats_start, NULL,
-     GNUNET_MESSAGE_TYPE_ATS_START,
-     sizeof (struct ClientStartMessage)},
-    {&GAS_handle_request_address, NULL,
-     GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS,
-     sizeof (struct RequestAddressMessage)},
-    {&GAS_handle_request_address_cancel, NULL,
-     GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS_CANCEL,
-     sizeof (struct RequestAddressMessage)},
-    {&GAS_handle_request_address_list, NULL,
-     GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_REQUEST,
-     sizeof (struct AddressListRequestMessage)},
-    {&GAS_handle_address_add, NULL,
-     GNUNET_MESSAGE_TYPE_ATS_ADDRESS_ADD, 0},
-    {&GAS_handle_address_update, NULL,
-     GNUNET_MESSAGE_TYPE_ATS_ADDRESS_UPDATE,
-     sizeof (struct AddressUpdateMessage) },
-    {&GAS_handle_address_destroyed, NULL,
-     GNUNET_MESSAGE_TYPE_ATS_ADDRESS_DESTROYED,
-     sizeof (struct AddressDestroyedMessage) },
-    {&GAS_handle_reservation_request, NULL,
-     GNUNET_MESSAGE_TYPE_ATS_RESERVATION_REQUEST,
-     sizeof (struct ReservationRequestMessage)},
-    {&GAS_handle_preference_change, NULL,
-     GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_CHANGE, 0},
-    {&GAS_handle_feedback, NULL,
-     GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_FEEDBACK, 0},
-    {NULL, NULL, 0, 0}
-  };
-  GSA_server = server;
-  GSA_stats = GNUNET_STATISTICS_create ("ats", cfg);
-  GAS_reservations_init (server);
+  GSA_stats = GNUNET_STATISTICS_create ("ats",
+                                       cfg);
+  GAS_reservations_init ();
   GAS_connectivity_init ();
   GAS_preference_init ();
   GAS_normalization_start ();
-  GAS_addresses_init (server);
+  GAS_addresses_init ();
   if (GNUNET_OK !=
       GAS_plugin_init (cfg))
   {
@@ -206,18 +466,13 @@
     GAS_preference_done ();
     if (NULL != GSA_stats)
     {
-      GNUNET_STATISTICS_destroy (GSA_stats, GNUNET_NO);
+      GNUNET_STATISTICS_destroy (GSA_stats,
+                                GNUNET_NO);
       GSA_stats = NULL;
     }
     return;
   }
-  GAS_performance_init (server);
-  GAS_scheduling_init (server);
-
-  GNUNET_SERVER_disconnect_notify (server,
-                                   &client_disconnect_handler,
-                                  NULL);
-  GNUNET_SERVER_add_handlers (server, handlers);
+  GAS_performance_init ();
   GNUNET_SCHEDULER_add_shutdown (&cleanup_task,
                                 NULL);
 }
@@ -224,19 +479,56 @@
 
 
 /**
- * The main function for the ats service.
- *
- * @param argc number of arguments from the command line
- * @param argv command line arguments
- * @return 0 ok, 1 on error
+ * Define "main" method using service macro.
  */
-int
-main (int argc, char *const *argv)
-{
-  return (GNUNET_OK ==
-          GNUNET_SERVICE_run (argc, argv, "ats",
-                              GNUNET_SERVICE_OPTION_NONE,
-                              &run, NULL)) ? 0 : 1;
-}
+GNUNET_SERVICE_MAIN
+("ats",
+ GNUNET_SERVICE_OPTION_NONE,
+ &run,
+ &client_connect_cb,
+ &client_disconnect_cb,
+ NULL,
+ GNUNET_MQ_hd_fixed_size (ats_start,
+                         GNUNET_MESSAGE_TYPE_ATS_START,
+                         struct ClientStartMessage,
+                         NULL),
+ GNUNET_MQ_hd_fixed_size (request_address,
+                         GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS,
+                         struct RequestAddressMessage,
+                         NULL),
+ GNUNET_MQ_hd_fixed_size (request_address_cancel, 
+                         GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS_CANCEL,
+                         struct RequestAddressMessage,
+                         NULL),
+ GNUNET_MQ_hd_fixed_size (request_address_list, 
+                         GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_REQUEST,
+                         struct AddressListRequestMessage,
+                         NULL),
+ GNUNET_MQ_hd_var_size (address_add, 
+                       GNUNET_MESSAGE_TYPE_ATS_ADDRESS_ADD,
+                       struct AddressAddMessage,
+                       NULL),
+ GNUNET_MQ_hd_fixed_size (address_update, 
+                         GNUNET_MESSAGE_TYPE_ATS_ADDRESS_UPDATE,
+                         struct AddressUpdateMessage,
+                         NULL),
+ GNUNET_MQ_hd_fixed_size (address_destroyed, 
+                         GNUNET_MESSAGE_TYPE_ATS_ADDRESS_DESTROYED,
+                         struct AddressDestroyedMessage,
+                         NULL),
+ GNUNET_MQ_hd_fixed_size (reservation_request, 
+                         GNUNET_MESSAGE_TYPE_ATS_RESERVATION_REQUEST,
+                         struct ReservationRequestMessage,
+                         NULL),
+ GNUNET_MQ_hd_var_size (preference_change, 
+                       GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_CHANGE,
+                       struct ChangePreferenceMessage,
+                       NULL),
+ GNUNET_MQ_hd_var_size (feedback, 
+                       GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_FEEDBACK,
+                       struct FeedbackPreferenceMessage,
+                       NULL),
+ GNUNET_MQ_handler_end ());
 
+
 /* end of gnunet-service-ats.c */

Modified: gnunet/src/ats/gnunet-service-ats_addresses.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses.c       2016-09-20 20:27:36 UTC 
(rev 37963)
+++ gnunet/src/ats/gnunet-service-ats_addresses.c       2016-09-21 10:56:28 UTC 
(rev 37964)
@@ -347,13 +347,13 @@
  * 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 (struct GNUNET_SERVER_Handle *server)
+GAS_addresses_init ()
 {
-  GSA_addresses = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_NO);
+  GSA_addresses
+    = GNUNET_CONTAINER_multipeermap_create (128,
+                                           GNUNET_NO);
   update_addresses_stat ();
 }
 
@@ -515,7 +515,7 @@
   /**
    * Actual handle to the client.
    */
-  struct GNUNET_SERVER_Client *client;
+  struct GNUNET_SERVICE_Client *client;
 
   /**
    * Are we sending all addresses, or only those that are active?
@@ -558,30 +558,26 @@
                    struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
 
 {
+  struct GNUNET_MQ_Envelope *env;
   struct PeerInformationMessage *msg;
   char *addrp;
   size_t plugin_name_length;
   size_t msize;
-  struct GNUNET_SERVER_NotificationContext **uc;
-  struct GNUNET_SERVER_NotificationContext *nc;
 
   if (NULL != plugin_name)
     plugin_name_length = strlen (plugin_name) + 1;
   else
     plugin_name_length = 0;
-  msize = sizeof (struct PeerInformationMessage) +
-          plugin_addr_len + plugin_name_length;
-  char buf[msize] GNUNET_ALIGN;
+  msize = plugin_addr_len + plugin_name_length;
 
-  GNUNET_assert (msize < GNUNET_SERVER_MAX_MESSAGE_SIZE);
-  msg = (struct PeerInformationMessage *) buf;
-  msg->header.size = htons (msize);
-  msg->header.type = htons (GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE);
+  GNUNET_assert (sizeof (struct PeerInformationMessage) + msize
+                < GNUNET_SERVER_MAX_MESSAGE_SIZE);
+  env = GNUNET_MQ_msg_extra (msg,
+                            msize,
+                            GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE);
   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);
@@ -590,28 +586,16 @@
   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 ((uint32_t) local_address_info);
   addrp = (char *) &msg[1];
-  if (NULL != plugin_addr)
-    GNUNET_memcpy (addrp, plugin_addr, plugin_addr_len);
+  GNUNET_memcpy (addrp,
+                plugin_addr,
+                plugin_addr_len);
   if (NULL != plugin_name)
-    strcpy (&addrp[plugin_addr_len], plugin_name);
-  uc = GNUNET_SERVER_client_get_user_context (ai->client,
-                                              struct 
GNUNET_SERVER_NotificationContext *);
-  if (NULL == uc)
-  {
-    GNUNET_break (0);
-    return;
-  }
-  nc = *uc;
-  GNUNET_SERVER_notification_context_unicast (nc,
-                                              ai->client,
-                                              &msg->header,
-                                              GNUNET_NO);
+    strcpy (&addrp[plugin_addr_len],
+           plugin_name);
+  GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (ai->client),
+                 env);
 }
 
 
@@ -679,22 +663,18 @@
 /**
  * Handle 'address list request' messages from clients.
  *
- * @param cls unused, NULL
- * @param client client that sent the request
- * @param message the request message
+ * @param cls client that sent the request
+ * @param alrm the request message
  */
 void
-GAS_handle_request_address_list (void *cls,
-                                 struct GNUNET_SERVER_Client *client,
-                                 const struct GNUNET_MessageHeader *message)
+GAS_handle_request_address_list (struct GNUNET_SERVICE_Client *client,
+                                 const struct AddressListRequestMessage *alrm)
 {
   struct AddressIteration ai;
-  const struct AddressListRequestMessage *alrm;
   struct GNUNET_PeerIdentity allzeros;
 
   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;
@@ -728,8 +708,6 @@
                      GNUNET_HELLO_ADDRESS_INFO_NONE,
                      GNUNET_BANDWIDTH_ZERO,
                      GNUNET_BANDWIDTH_ZERO);
-  GNUNET_SERVER_receive_done (client,
-                              GNUNET_OK);
 }
 
 

Modified: gnunet/src/ats/gnunet-service-ats_addresses.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses.h       2016-09-20 20:27:36 UTC 
(rev 37963)
+++ gnunet/src/ats/gnunet-service-ats_addresses.h       2016-09-21 10:56:28 UTC 
(rev 37964)
@@ -30,6 +30,7 @@
 #include "gnunet_util_lib.h"
 #include "gnunet_ats_service.h"
 #include "gnunet-service-ats.h"
+#include "ats.h"
 
 /**
  * NOTE: Do not change this documentation. This documentation is based on
@@ -366,11 +367,9 @@
 /**
  * Initialize address subsystem. The addresses subsystem manages the addresses
  * known and current performance information.
- *
- * @param server handle to our server
  */
 void
-GAS_addresses_init (struct GNUNET_SERVER_Handle *server);
+GAS_addresses_init (void);
 
 
 /**
@@ -475,14 +474,12 @@
 /**
  * Handle 'address list request' messages from clients.
  *
- * @param cls unused, NULL
  * @param client client that sent the request
- * @param message the request message
+ * @param alrm the request message
  */
 void
-GAS_handle_request_address_list (void *cls,
-                                 struct GNUNET_SERVER_Client *client,
-                                 const struct GNUNET_MessageHeader *message);
+GAS_handle_request_address_list (struct GNUNET_SERVICE_Client *client,
+                                 const struct AddressListRequestMessage *alrm);
 
 
 #endif

Modified: gnunet/src/ats/gnunet-service-ats_connectivity.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_connectivity.c    2016-09-20 20:27:36 UTC 
(rev 37963)
+++ gnunet/src/ats/gnunet-service-ats_connectivity.c    2016-09-21 10:56:28 UTC 
(rev 37964)
@@ -40,7 +40,7 @@
   /**
    * Client that made the request.
    */
-  struct GNUNET_SERVER_Client *client;
+  struct GNUNET_SERVICE_Client *client;
 
   /* TODO: allow client to express a 'strength' for this request */
 };
@@ -75,17 +75,13 @@
 /**
  * Handle #GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS messages from clients.
  *
- * @param cls unused, NULL
  * @param client client that sent the request
  * @param message the request message
  */
 void
-GAS_handle_request_address (void *cls,
-                            struct GNUNET_SERVER_Client *client,
-                            const struct GNUNET_MessageHeader *message)
+GAS_handle_request_address (struct GNUNET_SERVICE_Client *client,
+                           const struct RequestAddressMessage *msg)
 {
-  const struct RequestAddressMessage *msg =
-      (const struct RequestAddressMessage *) message;
   struct ConnectionRequest *cr;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -99,7 +95,6 @@
                                             cr,
                                             
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
   GAS_plugin_request_connect_start (&msg->peer);
-  GNUNET_SERVER_receive_done (client, GNUNET_OK);
 }
 
 
@@ -117,7 +112,7 @@
                         const struct GNUNET_PeerIdentity *pid,
                         void *value)
 {
-  struct GNUNET_SERVER_Client *client = cls;
+  struct GNUNET_SERVICE_Client *client = cls;
   struct ConnectionRequest *cr = value;
 
   if (cr->client == client)
@@ -140,18 +135,13 @@
  * Handle #GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS_CANCEL messages
  * from clients.
  *
- * @param cls unused, NULL
- * @param client client that sent the request
- * @param message the request message
+ * @param client the client that sent the request
+ * @param msg the request message
  */
 void
-GAS_handle_request_address_cancel (void *cls,
-                                   struct GNUNET_SERVER_Client *client,
-                                   const struct GNUNET_MessageHeader *message)
+GAS_handle_request_address_cancel (struct GNUNET_SERVICE_Client *client,
+                                  const struct RequestAddressMessage *msg)
 {
-  const struct RequestAddressMessage *msg =
-      (const struct RequestAddressMessage *) message;
-
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Received GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS_CANCEL message 
for peer %s\n",
               GNUNET_i2s (&msg->peer));
@@ -160,7 +150,6 @@
                                               &msg->peer,
                                               &free_matching_requests,
                                               client);
-  GNUNET_SERVER_receive_done (client, GNUNET_OK);
 }
 
 
@@ -171,7 +160,7 @@
  * @param client handle of the (now dead) client
  */
 void
-GAS_connectivity_remove_client (struct GNUNET_SERVER_Client *client)
+GAS_connectivity_remove_client (struct GNUNET_SERVICE_Client *client)
 {
   GNUNET_CONTAINER_multipeermap_iterate (connection_requests,
                                          &free_matching_requests,
@@ -185,7 +174,9 @@
 void
 GAS_connectivity_init ()
 {
-  connection_requests = GNUNET_CONTAINER_multipeermap_create (32, GNUNET_NO);
+  connection_requests
+    = GNUNET_CONTAINER_multipeermap_create (32,
+                                           GNUNET_NO);
 }
 
 

Modified: gnunet/src/ats/gnunet-service-ats_connectivity.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_connectivity.h    2016-09-20 20:27:36 UTC 
(rev 37963)
+++ gnunet/src/ats/gnunet-service-ats_connectivity.h    2016-09-21 10:56:28 UTC 
(rev 37964)
@@ -26,7 +26,9 @@
 #ifndef GNUNET_SERVICE_ATS_CONNECTIVITY_H
 #define GNUNET_SERVICE_ATS_CONNECTIVITY_H
 
+#include "ats.h"
 
+
 /**
  * Is the given peer in the list of peers for which we
  * have an address request?
@@ -43,27 +45,23 @@
 /**
  * Handle 'request address' messages from clients.
  *
- * @param cls unused, NULL
  * @param client client that sent the request
- * @param message the request message
+ * @param msg the request message
  */
 void
-GAS_handle_request_address (void *cls,
-                            struct GNUNET_SERVER_Client *client,
-                            const struct GNUNET_MessageHeader *message);
+GAS_handle_request_address (struct GNUNET_SERVICE_Client *client,
+                            const struct RequestAddressMessage *msg);
 
 
 /**
  * Cancel 'request address' messages from clients.
  *
- * @param cls unused, NULL
  * @param client client that sent the request
- * @param message the request message
+ * @param msg the request message
  */
 void
-GAS_handle_request_address_cancel (void *cls,
-                                   struct GNUNET_SERVER_Client *client,
-                                   const struct GNUNET_MessageHeader *message);
+GAS_handle_request_address_cancel (struct GNUNET_SERVICE_Client *client,
+                                   const struct RequestAddressMessage *msg);
 
 
 /**
@@ -73,7 +71,7 @@
  * @param client handle of the (now dead) client
  */
 void
-GAS_connectivity_remove_client (struct GNUNET_SERVER_Client *client);
+GAS_connectivity_remove_client (struct GNUNET_SERVICE_Client *client);
 
 
 /**

Deleted: gnunet/src/ats/gnunet-service-ats_feedback.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_feedback.c        2016-09-20 20:27:36 UTC 
(rev 37963)
+++ gnunet/src/ats/gnunet-service-ats_feedback.c        2016-09-21 10:56:28 UTC 
(rev 37964)
@@ -1,123 +0,0 @@
-/*
-     This file is part of GNUnet.
-     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
-     by the Free Software Foundation; either version 3, or (at your
-     option) any later version.
-
-     GNUnet is distributed in the hope that it will be useful, but
-     WITHOUT ANY WARRANTY; without even the implied warranty of
-     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-     General Public License for more details.
-
-     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., 51 Franklin Street, Fifth Floor,
-     Boston, MA 02110-1301, USA.
-*/
-/**
- * @file ats/gnunet-service-ats_feedback.c
- * @brief ats service, handling of feedback
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet-service-ats_plugins.h"
-#include "gnunet-service-ats_feedback.h"
-#include "ats.h"
-
-
-/**
- * Change the preference for a peer
- *
- * @param application the client sending this request
- * @param peer the peer id
- * @param scope the time interval for this feedback: [now - scope .. now]
- * @param kind the preference kind to change
- * @param score_abs the new preference score
- */
-static void
-preference_feedback (struct GNUNET_SERVER_Client *application,
-                     const struct GNUNET_PeerIdentity *peer,
-                     const struct GNUNET_TIME_Relative scope,
-                     enum GNUNET_ATS_PreferenceKind kind,
-                     float score_abs)
-{
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Received PREFERENCE FEEDBACK for peer `%s'\n",
-              GNUNET_i2s (peer));
-  GAS_plugin_notify_feedback (application,
-                                 peer,
-                                 scope,
-                                 kind,
-                                 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_feedback (void *cls,
-                               struct GNUNET_SERVER_Client *client,
-                               const struct GNUNET_MessageHeader *message)
-{
-  const struct FeedbackPreferenceMessage *msg;
-  const struct PreferenceInformation *pi;
-  uint16_t msize;
-  uint32_t nump;
-  uint32_t i;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Received PREFERENCE_FEEDBACK message\n");
-  msize = ntohs (message->size);
-  if (msize < sizeof (struct FeedbackPreferenceMessage))
-  {
-    GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
-    return;
-  }
-  msg = (const struct FeedbackPreferenceMessage *) message;
-  nump = ntohl (msg->num_feedback);
-  if (msize !=
-      sizeof (struct FeedbackPreferenceMessage) +
-      nump * sizeof (struct PreferenceInformation))
-  {
-    GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
-    return;
-  }
-  if (GNUNET_NO ==
-      GNUNET_CONTAINER_multipeermap_contains (GSA_addresses,
-                                             &msg->peer))
-  {
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING,
-              "Received PREFERENCE FEEDBACK for unknown peer `%s'\n",
-              GNUNET_i2s (&msg->peer));
-    return;
-  }
-
-  GNUNET_STATISTICS_update (GSA_stats,
-                            "# preference feedbacks requests processed",
-                            1,
-                            GNUNET_NO);
-  pi = (const struct PreferenceInformation *) &msg[1];
-  for (i = 0; i < nump; i++)
-    preference_feedback (client,
-                         &msg->peer,
-                         GNUNET_TIME_relative_ntoh(msg->scope),
-                         (enum GNUNET_ATS_PreferenceKind) ntohl 
(pi[i].preference_kind),
-                         pi[i].preference_value);
-  GNUNET_SERVER_receive_done (client,
-                              GNUNET_OK);
-}
-
-/* end of gnunet-service-ats_feedback.c */

Deleted: gnunet/src/ats/gnunet-service-ats_feedback.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_feedback.h        2016-09-20 20:27:36 UTC 
(rev 37963)
+++ gnunet/src/ats/gnunet-service-ats_feedback.h        2016-09-21 10:56:28 UTC 
(rev 37964)
@@ -1,43 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011-2014 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
- by the Free Software Foundation; either version 3, or (at your
- option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- General Public License for more details.
-
- 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., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
- */
-/**
- * @file ats/gnunet-service-ats_feedback.h
- * @brief handle client feedback
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#ifndef GNUNET_SERVICE_ATS_FEEDBACK_H
-#define GNUNET_SERVICE_ATS_FEEDBACK_H
-
-#include "gnunet_util_lib.h"
-
-/**
- * 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_feedback (void *cls,
-                                struct GNUNET_SERVER_Client *client,
-                                const struct GNUNET_MessageHeader *message);
-
-#endif

Modified: gnunet/src/ats/gnunet-service-ats_performance.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_performance.c     2016-09-20 20:27:36 UTC 
(rev 37963)
+++ gnunet/src/ats/gnunet-service-ats_performance.c     2016-09-21 10:56:28 UTC 
(rev 37964)
@@ -36,12 +36,12 @@
 /**
  * Context for sending messages to performance clients without PIC.
  */
-static struct GNUNET_SERVER_NotificationContext *nc_no_pic;
+static struct GNUNET_NotificationContext *nc_no_pic;
 
 /**
  * Context for sending messages to performance clients with PIC.
  */
-static struct GNUNET_SERVER_NotificationContext *nc_pic;
+static struct GNUNET_NotificationContext *nc_pic;
 
 
 /**
@@ -63,7 +63,7 @@
  * @param bandwidth_in assigned inbound bandwidth
  */
 static void
-notify_client (struct GNUNET_SERVER_Client *client,
+notify_client (struct GNUNET_SERVICE_Client *client,
                const struct GNUNET_PeerIdentity *peer,
                const char *plugin_name,
                const void *plugin_addr,
@@ -81,8 +81,6 @@
     plugin_addr_len +
     plugin_name_length;
   char buf[msize] GNUNET_ALIGN;
-  struct GNUNET_SERVER_NotificationContext **uc;
-  struct GNUNET_SERVER_NotificationContext *nc;
   char *addrp;
 
   if (NULL != prop)
@@ -111,24 +109,17 @@
   strcpy (&addrp[plugin_addr_len], plugin_name);
   if (NULL == client)
   {
-    GNUNET_SERVER_notification_context_broadcast (nc_pic,
-                                                  &msg->header,
-                                                  GNUNET_YES);
+    GNUNET_notification_context_broadcast (nc_pic,
+                                          &msg->header,
+                                          GNUNET_YES);
   }
   else
   {
-    uc = GNUNET_SERVER_client_get_user_context (client,
-                                                 struct 
GNUNET_SERVER_NotificationContext *);
-    if (NULL == uc)
-    {
-      GNUNET_break (0);
-      return;
-    }
-    nc = *uc;
-    GNUNET_SERVER_notification_context_unicast (nc,
-                                                client,
-                                                &msg->header,
-                                                GNUNET_YES);
+    struct GNUNET_MQ_Envelope *env;
+
+    env = GNUNET_MQ_msg_copy (&msg->header);
+    GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client),
+                   env);
   }
 }
 
@@ -183,7 +174,7 @@
 /**
  * Iterator for called from #GAS_addresses_get_peer_info()
  *
- * @param cls closure with the `struct GNUNET_SERVER_Client *` to inform.
+ * @param cls closure with the `struct GNUNET_SERVICE_Client *` to inform.
  * @param id the peer id
  * @param plugin_name plugin name
  * @param plugin_addr address
@@ -206,7 +197,7 @@
              struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
              struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
 {
-  struct GNUNET_SERVER_Client *client = cls;
+  struct GNUNET_SERVICE_Client *client = cls;
 
   if (NULL == id)
     return;
@@ -237,15 +228,16 @@
  * @param flag flag specifying the type of the client
  */
 void
-GAS_performance_add_client (struct GNUNET_SERVER_Client *client,
+GAS_performance_add_client (struct GNUNET_SERVICE_Client *client,
                             enum StartFlag flag)
 {
+  struct GNUNET_MQ_Handle *mq;
+
+  mq = GNUNET_SERVICE_client_get_mq (client);
   if (START_FLAG_PERFORMANCE_WITH_PIC == flag)
   {
-    GNUNET_SERVER_notification_context_add (nc_pic,
-                                            client);
-    GNUNET_SERVER_client_set_user_context (client,
-                                           &nc_pic);
+    GNUNET_notification_context_add (nc_pic,
+                                    mq);
     GAS_addresses_get_peer_info (NULL,
                                  &peerinfo_it,
                                  client);
@@ -252,10 +244,8 @@
   }
   else
   {
-    GNUNET_SERVER_notification_context_add (nc_no_pic,
-                                            client);
-    GNUNET_SERVER_client_set_user_context (client,
-                                           &nc_no_pic);
+    GNUNET_notification_context_add (nc_no_pic,
+                                    mq);
   }
 }
 
@@ -266,10 +256,10 @@
  * @param server handle to our server
  */
 void
-GAS_performance_init (struct GNUNET_SERVER_Handle *server)
+GAS_performance_init ()
 {
-  nc_no_pic = GNUNET_SERVER_notification_context_create (server, 32);
-  nc_pic = GNUNET_SERVER_notification_context_create (server, 32);
+  nc_no_pic = GNUNET_notification_context_create (32);
+  nc_pic = GNUNET_notification_context_create (32);
 }
 
 
@@ -279,9 +269,9 @@
 void
 GAS_performance_done ()
 {
-  GNUNET_SERVER_notification_context_destroy (nc_no_pic);
+  GNUNET_notification_context_destroy (nc_no_pic);
   nc_no_pic = NULL;
-  GNUNET_SERVER_notification_context_destroy (nc_pic);
+  GNUNET_notification_context_destroy (nc_pic);
   nc_pic = NULL;
 }
 

Modified: gnunet/src/ats/gnunet-service-ats_performance.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_performance.h     2016-09-20 20:27:36 UTC 
(rev 37963)
+++ gnunet/src/ats/gnunet-service-ats_performance.h     2016-09-21 10:56:28 UTC 
(rev 37964)
@@ -68,7 +68,7 @@
  * @param flag flag specifying the type of the client
  */
 void
-GAS_performance_add_client (struct GNUNET_SERVER_Client *client,
+GAS_performance_add_client (struct GNUNET_SERVICE_Client *client,
                             enum StartFlag flag);
 
 
@@ -79,7 +79,7 @@
  * @param addresses the address handle to use
  */
 void
-GAS_performance_init (struct GNUNET_SERVER_Handle *server);
+GAS_performance_init (void);
 
 
 /**

Modified: gnunet/src/ats/gnunet-service-ats_plugins.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_plugins.c 2016-09-20 20:27:36 UTC (rev 
37963)
+++ gnunet/src/ats/gnunet-service-ats_plugins.c 2016-09-21 10:56:28 UTC (rev 
37964)
@@ -510,7 +510,7 @@
  * @param score_abs degree of the appreciation
  */
 void
-GAS_plugin_notify_feedback (struct GNUNET_SERVER_Client *application,
+GAS_plugin_notify_feedback (struct GNUNET_SERVICE_Client *application,
                             const struct GNUNET_PeerIdentity *peer,
                             const struct GNUNET_TIME_Relative scope,
                             enum GNUNET_ATS_PreferenceKind kind,

Modified: gnunet/src/ats/gnunet-service-ats_plugins.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_plugins.h 2016-09-20 20:27:36 UTC (rev 
37963)
+++ gnunet/src/ats/gnunet-service-ats_plugins.h 2016-09-21 10:56:28 UTC (rev 
37964)
@@ -105,7 +105,7 @@
  * @param score_abs degree of the appreciation
  */
 void
-GAS_plugin_notify_feedback (struct GNUNET_SERVER_Client *application,
+GAS_plugin_notify_feedback (struct GNUNET_SERVICE_Client *application,
                             const struct GNUNET_PeerIdentity *peer,
                             const struct GNUNET_TIME_Relative scope,
                             enum GNUNET_ATS_PreferenceKind kind,

Modified: gnunet/src/ats/gnunet-service-ats_preferences.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_preferences.c     2016-09-20 20:27:36 UTC 
(rev 37963)
+++ gnunet/src/ats/gnunet-service-ats_preferences.c     2016-09-21 10:56:28 UTC 
(rev 37964)
@@ -132,7 +132,7 @@
   /**
    * Client handle
    */
-  struct GNUNET_SERVER_Client *client;
+  struct GNUNET_SERVICE_Client *client;
 
   /**
    * Mapping peer identities to `struct PreferencePeer` entry
@@ -553,7 +553,7 @@
  * @param score_abs the normalized score
  */
 static void
-update_preference (struct GNUNET_SERVER_Client *client,
+update_preference (struct GNUNET_SERVICE_Client *client,
                    const struct GNUNET_PeerIdentity *peer,
                    enum GNUNET_ATS_PreferenceKind kind,
                    float score_abs)
@@ -646,41 +646,17 @@
 /**
  * Handle 'preference change' messages from clients.
  *
- * @param cls unused, NULL
- * @param client client that sent the request
- * @param message the request message
+ * @param client the client that sent the request
+ * @param msg the request message
  */
 void
-GAS_handle_preference_change (void *cls,
-                              struct GNUNET_SERVER_Client *client,
-                              const struct GNUNET_MessageHeader *message)
+GAS_handle_preference_change (struct GNUNET_SERVICE_Client *client,
+                             const struct ChangePreferenceMessage *msg)
 {
-  const struct ChangePreferenceMessage *msg;
   const struct PreferenceInformation *pi;
-  uint16_t msize;
   uint32_t nump;
-  uint32_t i;
 
-  msize = ntohs (message->size);
-  if (msize < sizeof (struct ChangePreferenceMessage))
-  {
-    GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
-    return;
-  }
-  msg = (const struct ChangePreferenceMessage *) message;
   nump = ntohl (msg->num_preferences);
-  if ( (msize !=
-        sizeof (struct ChangePreferenceMessage) +
-        nump * sizeof (struct PreferenceInformation)) ||
-       (UINT16_MAX / sizeof (struct PreferenceInformation) < nump) )
-  {
-    GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
-    return;
-  }
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Received PREFERENCE_CHANGE message for peer `%s'\n",
               GNUNET_i2s (&msg->peer));
@@ -690,14 +666,12 @@
                             GNUNET_NO);
   pi = (const struct PreferenceInformation *) &msg[1];
   GAS_plugin_solver_lock ();
-  for (i = 0; i < nump; i++)
+  for (uint32_t i = 0; i < nump; i++)
     update_preference (client,
                        &msg->peer,
                        (enum GNUNET_ATS_PreferenceKind) ntohl 
(pi[i].preference_kind),
                        pi[i].preference_value);
   GAS_plugin_solver_unlock ();
-  GNUNET_SERVER_receive_done (client,
-                              GNUNET_OK);
 }
 
 
@@ -782,7 +756,7 @@
  * @param client the client
  */
 void
-GAS_preference_client_disconnect (struct GNUNET_SERVER_Client *client)
+GAS_preference_client_disconnect (struct GNUNET_SERVICE_Client *client)
 {
   struct PreferenceClient *c_cur;
 

Modified: gnunet/src/ats/gnunet-service-ats_preferences.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_preferences.h     2016-09-20 20:27:36 UTC 
(rev 37963)
+++ gnunet/src/ats/gnunet-service-ats_preferences.h     2016-09-21 10:56:28 UTC 
(rev 37964)
@@ -46,14 +46,12 @@
 /**
  * Handle 'preference change' messages from clients.
  *
- * @param cls unused, NULL
- * @param client client that sent the request
- * @param message the request message
+ * @param client the client that sent the request
+ * @param msg the request message
  */
 void
-GAS_handle_preference_change (void *cls,
-                              struct GNUNET_SERVER_Client *client,
-                              const struct GNUNET_MessageHeader *message);
+GAS_handle_preference_change (struct GNUNET_SERVICE_Client *client,
+                             const struct ChangePreferenceMessage *msg);
 
 
 /**
@@ -89,7 +87,7 @@
  * @param client the disconnecting client
  */
 void
-GAS_preference_client_disconnect (struct GNUNET_SERVER_Client *client);
+GAS_preference_client_disconnect (struct GNUNET_SERVICE_Client *client);
 
 
 #endif

Modified: gnunet/src/ats/gnunet-service-ats_reservations.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_reservations.c    2016-09-20 20:27:36 UTC 
(rev 37963)
+++ gnunet/src/ats/gnunet-service-ats_reservations.c    2016-09-21 10:56:28 UTC 
(rev 37964)
@@ -138,63 +138,43 @@
 /**
  * Handle 'reservation request' messages from clients.
  *
- * @param cls unused, NULL
  * @param client client that sent the request
- * @param message the request message
+ * @param msg the request message
  */
 void
-GAS_handle_reservation_request (void *cls,
-                                struct GNUNET_SERVER_Client *client,
-                                const struct GNUNET_MessageHeader *message)
+GAS_handle_reservation_request (struct GNUNET_SERVICE_Client *client,
+                                const struct ReservationRequestMessage *msg)
 {
-  const struct ReservationRequestMessage *msg =
-      (const struct ReservationRequestMessage *) message;
-  struct ReservationResultMessage result;
+  struct GNUNET_MQ_Envelope *env;
+  struct ReservationResultMessage *result;
   int32_t amount;
   struct GNUNET_TIME_Relative res_delay;
-  struct GNUNET_SERVER_NotificationContext **uc;
-  struct GNUNET_SERVER_NotificationContext *nc;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Received RESERVATION_REQUEST message\n");
-  uc = GNUNET_SERVER_client_get_user_context (client,
-                                              struct 
GNUNET_SERVER_NotificationContext *);
-  if (NULL == uc)
-  {
-    GNUNET_break (0);
-    return;
-  }
-  nc = *uc;
   amount = (int32_t) ntohl (msg->amount);
   res_delay = 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);
+  env = GNUNET_MQ_msg (result,
+                      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);
+  GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client),
+                 env);
 }
 
 
 /**
  * Initialize reservations subsystem.
- *
- * @param server handle to our server
  */
 void
-GAS_reservations_init (struct GNUNET_SERVER_Handle *server)
+GAS_reservations_init ()
 {
   trackers = GNUNET_CONTAINER_multipeermap_create (128,
                                                    GNUNET_NO);
@@ -211,7 +191,8 @@
  */
 static int
 free_tracker (void *cls,
-             const struct GNUNET_PeerIdentity *key, void *value)
+             const struct GNUNET_PeerIdentity *key,
+             void *value)
 {
   struct GNUNET_BANDWIDTH_Tracker *tracker = value;
 

Modified: gnunet/src/ats/gnunet-service-ats_reservations.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_reservations.h    2016-09-20 20:27:36 UTC 
(rev 37963)
+++ gnunet/src/ats/gnunet-service-ats_reservations.h    2016-09-21 10:56:28 UTC 
(rev 37964)
@@ -27,6 +27,7 @@
 #define GNUNET_SERVICE_ATS_RESERVATIONS_H
 
 #include "gnunet_util_lib.h"
+#include "ats.h"
 
 
 /**
@@ -46,14 +47,12 @@
 /**
  * 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);
+GAS_handle_reservation_request (struct GNUNET_SERVICE_Client *client,
+                                const struct ReservationRequestMessage 
*message);
 
 
 /**
@@ -62,7 +61,7 @@
  * @param server handle to our server
  */
 void
-GAS_reservations_init (struct GNUNET_SERVER_Handle *server);
+GAS_reservations_init (void);
 
 
 /**

Modified: gnunet/src/ats/gnunet-service-ats_scheduling.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_scheduling.c      2016-09-20 20:27:36 UTC 
(rev 37963)
+++ gnunet/src/ats/gnunet-service-ats_scheduling.c      2016-09-21 10:56:28 UTC 
(rev 37964)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     Copyright (C) 2011-2014 GNUnet e.V.
+     Copyright (C) 2011-2016 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
@@ -29,16 +29,10 @@
 #include "gnunet-service-ats_scheduling.h"
 #include "ats.h"
 
-
 /**
- * Context for sending messages to clients.
- */
-static struct GNUNET_SERVER_NotificationContext *nc;
-
-/**
  * Actual handle to the client.
  */
-static struct GNUNET_SERVER_Client *my_client;
+static struct GNUNET_SERVICE_Client *my_client;
 
 
 /**
@@ -48,7 +42,7 @@
  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
  */
 int
-GAS_scheduling_add_client (struct GNUNET_SERVER_Client *client)
+GAS_scheduling_add_client (struct GNUNET_SERVICE_Client *client)
 {
   if (NULL != my_client)
   {
@@ -57,10 +51,6 @@
     return GNUNET_SYSERR;
   }
   my_client = client;
-  GNUNET_SERVER_notification_context_add (nc,
-                                          client);
-  GNUNET_SERVER_client_set_user_context (client,
-                                         &nc);
   return GNUNET_OK;
 }
 
@@ -72,7 +62,7 @@
  * @param client handle of the (now dead) client
  */
 void
-GAS_scheduling_remove_client (struct GNUNET_SERVER_Client *client)
+GAS_scheduling_remove_client (struct GNUNET_SERVICE_Client *client)
 {
   if (my_client != client)
     return;
@@ -96,7 +86,8 @@
                                             struct GNUNET_BANDWIDTH_Value32NBO 
bandwidth_out,
                                             struct GNUNET_BANDWIDTH_Value32NBO 
bandwidth_in)
 {
-  struct AddressSuggestionMessage msg;
+  struct GNUNET_MQ_Envelope *env;
+  struct AddressSuggestionMessage *msg;
 
   if (NULL == my_client)
     return;
@@ -104,21 +95,19 @@
                             "# address suggestions made",
                            1,
                             GNUNET_NO);
-  msg.header.size = htons (sizeof (struct AddressSuggestionMessage));
-  msg.header.type = htons (GNUNET_MESSAGE_TYPE_ATS_ADDRESS_SUGGESTION);
-  msg.peer = *peer;
-  msg.session_id = htonl (session_id);
-  msg.bandwidth_out = bandwidth_out;
-  msg.bandwidth_in = bandwidth_in;
+  env = GNUNET_MQ_msg (msg,
+                      GNUNET_MESSAGE_TYPE_ATS_ADDRESS_SUGGESTION);
+  msg->peer = *peer;
+  msg->session_id = htonl (session_id);
+  msg->bandwidth_out = bandwidth_out;
+  msg->bandwidth_in = bandwidth_in;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "ATS sends quota for peer `%s': (in/out) %u/%u\n",
               GNUNET_i2s (peer),
               (unsigned int) ntohl (bandwidth_in.value__),
               (unsigned int) ntohl (bandwidth_out.value__));
-  GNUNET_SERVER_notification_context_unicast (nc,
-                                              my_client,
-                                              &msg.header,
-                                              GNUNET_YES);
+  GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (my_client),
+                 env);
 }
 
 
@@ -125,34 +114,20 @@
 /**
  * Handle 'address add' messages from clients.
  *
- * @param cls unused, NULL
- * @param client client that sent the request
- * @param message the request message
+ * @param m the request message
  */
 void
-GAS_handle_address_add (void *cls,
-                        struct GNUNET_SERVER_Client *client,
-                        const struct GNUNET_MessageHeader *message)
+GAS_handle_address_add (const struct AddressAddMessage *m)
 {
-  const struct AddressAddMessage *m;
   const char *address;
   const char *plugin_name;
   uint16_t address_length;
   uint16_t plugin_name_length;
-  uint16_t size;
   struct GNUNET_ATS_Properties prop;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Received `%s' message\n",
               "ADDRESS_ADD");
-  size = ntohs (message->size);
-  if (size < sizeof (struct AddressAddMessage))
-  {
-    GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
-    return;
-  }
-  m = (const struct AddressAddMessage *) message;
   address_length = ntohs (m->address_length);
   plugin_name_length = ntohs (m->plugin_name_length);
   address = (const char *) &m[1];
@@ -160,16 +135,6 @@
     plugin_name = &address[address_length];
   else
     plugin_name = "";
-
-  if ((address_length + plugin_name_length +
-       sizeof (struct AddressAddMessage) != ntohs (message->size)) ||
-       ( (plugin_name_length > 0) &&
-         (plugin_name[plugin_name_length - 1] != '\0') ) )
-  {
-    GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
-    return;
-  }
   GNUNET_STATISTICS_update (GSA_stats,
                             "# addresses created",
                             1,
@@ -184,8 +149,6 @@
                      ntohl (m->address_local_info),
                      ntohl (m->session_id),
                      &prop);
-  GNUNET_SERVER_receive_done (client,
-                              GNUNET_OK);
 }
 
 
@@ -192,19 +155,13 @@
 /**
  * Handle 'address update' messages from clients.
  *
- * @param cls unused, NULL
- * @param client client that sent the request
- * @param message the request message
+ * @param m the request message
  */
 void
-GAS_handle_address_update (void *cls,
-                           struct GNUNET_SERVER_Client *client,
-                           const struct GNUNET_MessageHeader *message)
+GAS_handle_address_update (const struct AddressUpdateMessage *m)
 {
-  const struct AddressUpdateMessage *m;
   struct GNUNET_ATS_Properties prop;
 
-  m = (const struct AddressUpdateMessage *) message;
   GNUNET_STATISTICS_update (GSA_stats,
                             "# address updates received",
                             1,
@@ -214,8 +171,6 @@
   GAS_addresses_update (&m->peer,
                         ntohl (m->session_id),
                         &prop);
-  GNUNET_SERVER_receive_done (client,
-                              GNUNET_OK);
 }
 
 
@@ -222,19 +177,14 @@
 /**
  * Handle 'address destroyed' messages from clients.
  *
- * @param cls unused, NULL
- * @param client client that sent the request
- * @param message the request message
+ * @param m the request message
  */
 void
-GAS_handle_address_destroyed (void *cls,
-                              struct GNUNET_SERVER_Client *client,
-                              const struct GNUNET_MessageHeader *message)
+GAS_handle_address_destroyed (const struct AddressDestroyedMessage *m)
 {
-  const struct AddressDestroyedMessage *m;
-  struct GNUNET_ATS_SessionReleaseMessage srm;
+  struct GNUNET_MQ_Envelope *env;
+  struct GNUNET_ATS_SessionReleaseMessage *srm;
 
-  m = (const struct AddressDestroyedMessage *) message;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Received `%s' message\n",
               "ADDRESS_DESTROYED");
@@ -244,43 +194,13 @@
                             GNUNET_NO);
   GAS_addresses_destroy (&m->peer,
                          ntohl (m->session_id));
-  srm.header.type = ntohs (GNUNET_MESSAGE_TYPE_ATS_SESSION_RELEASE);
-  srm.header.size = ntohs (sizeof (struct GNUNET_ATS_SessionReleaseMessage));
-  srm.session_id = m->session_id;
-  srm.peer = m->peer;
-  GNUNET_SERVER_notification_context_unicast (nc,
-                                              client,
-                                              &srm.header,
-                                              GNUNET_NO);
-  GNUNET_SERVER_receive_done (client, GNUNET_OK);
+  env = GNUNET_MQ_msg (srm,
+                      GNUNET_MESSAGE_TYPE_ATS_SESSION_RELEASE);
+  srm->session_id = m->session_id;
+  srm->peer = m->peer;
+  GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (my_client),
+                 env);
 }
 
 
-/**
- * Initialize scheduling subsystem.
- *
- * @param server handle to our server
- */
-void
-GAS_scheduling_init (struct GNUNET_SERVER_Handle *server)
-{
-  nc = GNUNET_SERVER_notification_context_create (server, 128);
-}
-
-
-/**
- * Shutdown scheduling subsystem.
- */
-void
-GAS_scheduling_done ()
-{
-  if (NULL != my_client)
-  {
-    my_client = NULL;
-  }
-  GNUNET_SERVER_notification_context_destroy (nc);
-  nc = NULL;
-}
-
-
 /* end of gnunet-service-ats_scheduling.c */

Modified: gnunet/src/ats/gnunet-service-ats_scheduling.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_scheduling.h      2016-09-20 20:27:36 UTC 
(rev 37963)
+++ gnunet/src/ats/gnunet-service-ats_scheduling.h      2016-09-21 10:56:28 UTC 
(rev 37964)
@@ -37,7 +37,7 @@
  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
  */
 int
-GAS_scheduling_add_client (struct GNUNET_SERVER_Client *client);
+GAS_scheduling_add_client (struct GNUNET_SERVICE_Client *client);
 
 
 /**
@@ -47,7 +47,7 @@
  * @param client handle of the (now dead) client
  */
 void
-GAS_scheduling_remove_client (struct GNUNET_SERVER_Client *client);
+GAS_scheduling_remove_client (struct GNUNET_SERVICE_Client *client);
 
 
 /**
@@ -69,58 +69,30 @@
 /**
  * Handle 'address add' messages from clients.
  *
- * @param cls unused, NULL
  * @param client client that sent the request
- * @param message the request message
+ * @param m the request message
  */
 void
-GAS_handle_address_add (void *cls,
-                        struct GNUNET_SERVER_Client *client,
-                        const struct GNUNET_MessageHeader *message);
+GAS_handle_address_add (const struct AddressAddMessage *m);
 
 
 /**
  * Handle 'address update' messages from clients.
  *
- * @param cls unused, NULL
- * @param client client that sent the request
- * @param message the request message
+ * @param m the request message
  */
 void
-GAS_handle_address_update (void *cls,
-                           struct GNUNET_SERVER_Client *client,
-                           const struct GNUNET_MessageHeader *message);
+GAS_handle_address_update (const struct AddressUpdateMessage *m);
 
 
 /**
  * Handle 'address destroyed' messages from clients.
  *
- * @param cls unused, NULL
- * @param client client that sent the request
- * @param message the request message
+ * @param m the request message
  */
 void
-GAS_handle_address_destroyed (void *cls,
-                              struct GNUNET_SERVER_Client *client,
-                              const struct GNUNET_MessageHeader *message);
+GAS_handle_address_destroyed (const struct AddressDestroyedMessage *m);
 
 
-/**
- * Initialize scheduling subsystem.
- *
- * @param server handle to our server
- * @param ah the address handle to use
- */
-void
-GAS_scheduling_init (struct GNUNET_SERVER_Handle *server);
-
-
-/**
- * Shutdown scheduling subsystem.
- */
-void
-GAS_scheduling_done (void);
-
-
 #endif
 /* end of gnunet-service-ats_scheduling.h */

Modified: gnunet/src/ats/plugin_ats_mlp.c
===================================================================
--- gnunet/src/ats/plugin_ats_mlp.c     2016-09-20 20:27:36 UTC (rev 37963)
+++ gnunet/src/ats/plugin_ats_mlp.c     2016-09-21 10:56:28 UTC (rev 37964)
@@ -2281,7 +2281,7 @@
  */
 static void
 GAS_mlp_address_preference_feedback (void *solver,
-                                     struct GNUNET_SERVER_Client *application,
+                                     struct GNUNET_SERVICE_Client *application,
                                      const struct GNUNET_PeerIdentity *peer,
                                      const struct GNUNET_TIME_Relative scope,
                                      enum GNUNET_ATS_PreferenceKind kind,

Modified: gnunet/src/ats/plugin_ats_proportional.c
===================================================================
--- gnunet/src/ats/plugin_ats_proportional.c    2016-09-20 20:27:36 UTC (rev 
37963)
+++ gnunet/src/ats/plugin_ats_proportional.c    2016-09-21 10:56:28 UTC (rev 
37964)
@@ -879,7 +879,7 @@
  */
 static void
 GAS_proportional_feedback (void *solver,
-                           struct GNUNET_SERVER_Client *application,
+                           struct GNUNET_SERVICE_Client *application,
                            const struct GNUNET_PeerIdentity *peer,
                            const struct GNUNET_TIME_Relative scope,
                            enum GNUNET_ATS_PreferenceKind kind,

Modified: gnunet/src/ats/plugin_ats_ril.c
===================================================================
--- gnunet/src/ats/plugin_ats_ril.c     2016-09-20 20:27:36 UTC (rev 37963)
+++ gnunet/src/ats/plugin_ats_ril.c     2016-09-21 10:56:28 UTC (rev 37964)
@@ -2373,7 +2373,7 @@
  */
 static void
 GAS_ril_address_preference_feedback (void *solver,
-                                     struct GNUNET_SERVER_Client *application,
+                                     struct GNUNET_SERVICE_Client *application,
                                      const struct GNUNET_PeerIdentity *peer,
                                      const struct GNUNET_TIME_Relative scope,
                                      enum GNUNET_ATS_PreferenceKind kind,

Modified: gnunet/src/include/gnunet_ats_plugin.h
===================================================================
--- gnunet/src/include/gnunet_ats_plugin.h      2016-09-20 20:27:36 UTC (rev 
37963)
+++ gnunet/src/include/gnunet_ats_plugin.h      2016-09-21 10:56:28 UTC (rev 
37964)
@@ -74,7 +74,7 @@
  */
 typedef void
 (*GAS_solver_address_feedback_preference) (void *solver,
-                                           struct GNUNET_SERVER_Client 
*application,
+                                           struct GNUNET_SERVICE_Client 
*application,
                                            const struct GNUNET_PeerIdentity 
*peer,
                                            const struct GNUNET_TIME_Relative 
scope,
                                            enum GNUNET_ATS_PreferenceKind kind,

Modified: gnunet/src/namestore/gnunet-service-namestore.c
===================================================================
--- gnunet/src/namestore/gnunet-service-namestore.c     2016-09-20 20:27:36 UTC 
(rev 37963)
+++ gnunet/src/namestore/gnunet-service-namestore.c     2016-09-21 10:56:28 UTC 
(rev 37964)
@@ -61,7 +61,7 @@
   /**
    * Namestore client which intiated this zone iteration
    */
-  struct NamestoreClient *client;
+  struct NamestoreClient *nc;
 
   /**
    * The nick to add to the records
@@ -95,21 +95,17 @@
  */
 struct NamestoreClient
 {
-  /**
-   * Next element in the DLL
-   */
-  struct NamestoreClient *next;
 
   /**
-   * Previous element in the DLL
+   * The client
    */
-  struct NamestoreClient *prev;
+  struct GNUNET_SERVICE_Client *client;
 
   /**
-   * The client
+   * Message queue for transmission to @e client
    */
-  struct GNUNET_SERVER_Client *client;
-
+  struct GNUNET_MQ_Handle *mq;
+  
   /**
    * Head of the DLL of
    * Zone iteration operations in progress initiated by this client
@@ -152,7 +148,7 @@
   /**
    * Task active during initial iteration.
    */
-  struct GNUNET_SCHEDULER_Task * task;
+  struct GNUNET_SCHEDULER_Task *task;
 
   /**
    * Offset of the zone iteration used to address next result of the zone
@@ -190,7 +186,7 @@
   /**
    * Client to notify about the result.
    */
-  struct GNUNET_SERVER_Client *client;
+  struct NamestoreClient *nc;
 
   /**
    * Client's request ID.
@@ -225,21 +221,6 @@
 static char *db_lib_name;
 
 /**
- * Our notification context.
- */
-static struct GNUNET_SERVER_NotificationContext *snc;
-
-/**
- * Head of the Client DLL
- */
-static struct NamestoreClient *client_head;
-
-/**
- * Tail of the Client DLL
- */
-static struct NamestoreClient *client_tail;
-
-/**
  * Head of cop DLL.
  */
 static struct CacheOperation *cop_head;
@@ -262,10 +243,9 @@
 /**
  * Notification context shared by all monitors.
  */
-static struct GNUNET_SERVER_NotificationContext *monitor_nc;
+static struct GNUNET_NotificationContext *monitor_nc;
 
 
-
 /**
  * Task run during shutdown.
  *
@@ -274,17 +254,10 @@
 static void
 cleanup_task (void *cls)
 {
-  struct ZoneIteration *no;
-  struct NamestoreClient *nc;
   struct CacheOperation *cop;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Stopping namestore service\n");
-  if (NULL != snc)
-  {
-    GNUNET_SERVER_notification_context_destroy (snc);
-    snc = NULL;
-  }
   while (NULL != (cop = cop_head))
   {
     GNUNET_NAMECACHE_cancel (cop->qe);
@@ -295,23 +268,13 @@
   }
   GNUNET_NAMECACHE_disconnect (namecache);
   namecache = NULL;
-  while (NULL != (nc = client_head))
-  {
-    while (NULL != (no = nc->op_head))
-    {
-      GNUNET_CONTAINER_DLL_remove (nc->op_head, nc->op_tail, no);
-      GNUNET_free (no);
-    }
-    GNUNET_CONTAINER_DLL_remove (client_head, client_tail, nc);
-    GNUNET_SERVER_client_set_user_context (nc->client, NULL);
-    GNUNET_free (nc);
-  }
-  GNUNET_break (NULL == GNUNET_PLUGIN_unload (db_lib_name, GSN_database));
+  GNUNET_break (NULL == GNUNET_PLUGIN_unload (db_lib_name, 
+                                             GSN_database));
   GNUNET_free (db_lib_name);
   db_lib_name = NULL;
   if (NULL != monitor_nc)
   {
-    GNUNET_SERVER_notification_context_destroy (monitor_nc);
+    GNUNET_notification_context_destroy (monitor_nc);
     monitor_nc = NULL;
   }
 }
@@ -323,26 +286,24 @@
  *
  * @param cls closure
  * @param client identification of the client
+ * @param app_ctx the `struct NamestoreClient` of @a client
  */
 static void
-client_disconnect_notification (void *cls,
-                               struct GNUNET_SERVER_Client *client)
+client_disconnect_cb (void *cls,
+                     struct GNUNET_SERVICE_Client *client,
+                     void *app_ctx)
 {
+  struct NamestoreClient *nc = app_ctx;
   struct ZoneIteration *no;
-  struct NamestoreClient *nc;
   struct ZoneMonitor *zm;
   struct CacheOperation *cop;
 
-  if (NULL == client)
-    return;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Client %p disconnected\n",
              client);
-  if (NULL == (nc = GNUNET_SERVER_client_get_user_context (client, struct 
NamestoreClient)))
-    return;
   for (zm = monitor_head; NULL != zm; zm = zm->next)
   {
-    if (client == zm->nc->client)
+    if (nc == zm->nc)
     {
       GNUNET_CONTAINER_DLL_remove (monitor_head,
                                   monitor_tail,
@@ -358,40 +319,39 @@
   }
   while (NULL != (no = nc->op_head))
   {
-    GNUNET_CONTAINER_DLL_remove (nc->op_head, nc->op_tail, no);
+    GNUNET_CONTAINER_DLL_remove (nc->op_head,
+                                nc->op_tail,
+                                no);
     GNUNET_free (no);
   }
-  GNUNET_CONTAINER_DLL_remove (client_head, client_tail, nc);
+  for (cop = cop_head; NULL != cop; cop = cop->next)
+    if (nc == cop->nc)
+      cop->nc = NULL;
   GNUNET_free (nc);
-  for (cop = cop_head; NULL != cop; cop = cop->next)
-    if (client == cop->client)
-      cop->client = NULL;
 }
 
 
 /**
- * Add a client to our list of active clients, if it is not yet
- * in there.
+ * Add a client to our list of active clients.
  *
+ * @param cls NULL
  * @param client client to add
+ * @param mq message queue for @a client
  * @return internal namestore client structure for this client
  */
-static struct NamestoreClient *
-client_lookup (struct GNUNET_SERVER_Client *client)
+static void *
+client_connect_cb (void *cls,
+                  struct GNUNET_SERVICE_Client *client,
+                  struct GNUNET_MQ_Handle *mq)
 {
   struct NamestoreClient *nc;
 
-  nc = GNUNET_SERVER_client_get_user_context (client, struct NamestoreClient);
-  if (NULL != nc)
-    return nc;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Client %p connected\n",
              client);
   nc = GNUNET_new (struct NamestoreClient);
   nc->client = client;
-  GNUNET_SERVER_notification_context_add (snc, client);
-  GNUNET_CONTAINER_DLL_insert (client_head, client_tail, nc);
-  GNUNET_SERVER_client_set_user_context (client, nc);
+  nc->mq = mq;
   return nc;
 }
 
@@ -415,7 +375,6 @@
                 const struct GNUNET_GNSRECORD_Data *rd)
 {
   struct GNUNET_GNSRECORD_Data **res = cls;
-  int c;
 
   if (0 != strcmp (label, GNUNET_GNS_MASTERZONE_STR))
   {
@@ -422,7 +381,7 @@
     GNUNET_break (0);
     return;
   }
-  for (c = 0; c < rd_count; c++)
+  for (unsigned int c = 0; c < rd_count; c++)
   {
     if (GNUNET_GNSRECORD_TYPE_NICK == rd[c].record_type)
     {
@@ -537,8 +496,7 @@
  * Generate a `struct LookupNameResponseMessage` and send it to the
  * given client using the given notification context.
  *
- * @param nc notification context to use
- * @param client client to unicast to
+ * @param nc client to unicast to
  * @param request_id request ID to use
  * @param zone_key zone key of the zone
  * @param name name
@@ -546,8 +504,7 @@
  * @param rd array of records
  */
 static void
-send_lookup_response (struct GNUNET_SERVER_NotificationContext *nc,
-                     struct GNUNET_SERVER_Client *client,
+send_lookup_response (struct NamestoreClient *nc,
                      uint32_t request_id,
                      const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
                      const char *name,
@@ -554,6 +511,7 @@
                      unsigned int rd_count,
                      const struct GNUNET_GNSRECORD_Data *rd)
 {
+  struct GNUNET_MQ_Envelope *env;
   struct RecordResultMessage *zir_msg;
   struct GNUNET_GNSRECORD_Data *nick;
   struct GNUNET_GNSRECORD_Data *res;
@@ -560,7 +518,6 @@
   unsigned int res_count;
   size_t name_len;
   size_t rd_ser_len;
-  size_t msg_size;
   char *name_tmp;
   char *rd_ser;
 
@@ -583,11 +540,9 @@
 
   name_len = strlen (name) + 1;
   rd_ser_len = GNUNET_GNSRECORD_records_get_size (res_count, res);
-  msg_size = sizeof (struct RecordResultMessage) + name_len + rd_ser_len;
-  (void) client_lookup (client);
-  zir_msg = GNUNET_malloc (msg_size);
-  zir_msg->gns_header.header.type = htons 
(GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_RESULT);
-  zir_msg->gns_header.header.size = htons (msg_size);
+  env = GNUNET_MQ_msg_extra (zir_msg,
+                            name_len + rd_ser_len,
+                            GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_RESULT);
   zir_msg->gns_header.r_id = htonl (request_id);
   zir_msg->name_len = htons (name_len);
   zir_msg->rd_count = htons (res_count);
@@ -594,20 +549,21 @@
   zir_msg->rd_len = htons (rd_ser_len);
   zir_msg->private_key = *zone_key;
   name_tmp = (char *) &zir_msg[1];
-  GNUNET_memcpy (name_tmp, name, name_len);
+  GNUNET_memcpy (name_tmp,
+                name,
+                name_len);
   rd_ser = &name_tmp[name_len];
-  GNUNET_GNSRECORD_records_serialize (res_count, res, rd_ser_len, rd_ser);
+  GNUNET_GNSRECORD_records_serialize (res_count,
+                                     res,
+                                     rd_ser_len,
+                                     rd_ser);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-             "Sending RECORD_RESULT message with %u records and size %zu\n",
-             res_count,
-             msg_size);
-  GNUNET_SERVER_notification_context_unicast (nc,
-                                             client,
-                                             &zir_msg->gns_header.header,
-                                             GNUNET_NO);
+             "Sending RECORD_RESULT message with %u records\n",
+             res_count);
+  GNUNET_MQ_send (nc->mq,
+                 env);
   if (rd != res)
     GNUNET_free (res);
-  GNUNET_free (zir_msg);
 }
 
 
@@ -619,22 +575,21 @@
  * @param rid client's request ID
  */
 static void
-send_store_response (struct GNUNET_SERVER_Client *client,
+send_store_response (struct NamestoreClient *nc,
                      int res,
                      uint32_t rid)
 {
-  struct RecordStoreResponseMessage rcr_msg;
+  struct GNUNET_MQ_Envelope *env;
+  struct RecordStoreResponseMessage *rcr_msg;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-             "Sending `%s' message\n",
-             "RECORD_STORE_RESPONSE");
-  rcr_msg.gns_header.header.type = htons 
(GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE_RESPONSE);
-  rcr_msg.gns_header.header.size = htons (sizeof (struct 
RecordStoreResponseMessage));
-  rcr_msg.gns_header.r_id = htonl (rid);
-  rcr_msg.op_result = htonl (res);
-  GNUNET_SERVER_notification_context_unicast (snc, client,
-                                             &rcr_msg.gns_header.header,
-                                             GNUNET_NO);
+             "Sending RECORD_STORE_RESPONSE message\n");
+  env = GNUNET_MQ_msg (rcr_msg,
+                      GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE_RESPONSE);
+  rcr_msg->gns_header.r_id = htonl (rid);
+  rcr_msg->op_result = htonl (res);
+  GNUNET_MQ_send (nc->mq,
+                 env);
 }
 
 
@@ -662,8 +617,8 @@
   GNUNET_CONTAINER_DLL_remove (cop_head,
                                cop_tail,
                                cop);
-  if (NULL != cop->client)
-    send_store_response (cop->client,
+  if (NULL != cop->nc)
+    send_store_response (cop->nc,
                          success,
                          cop->rid);
   GNUNET_free (cop);
@@ -674,7 +629,7 @@
  * We just touched the plaintext information about a name in our zone;
  * refresh the corresponding (encrypted) block in the namecache.
  *
- * @param client client responsible for the request
+ * @param nc client responsible for the request, can be NULL
  * @param rid request ID of the client
  * @param zone_key private key of the zone
  * @param name label for the records
@@ -682,7 +637,7 @@
  * @param rd records stored under the given @a name
  */
 static void
-refresh_block (struct GNUNET_SERVER_Client *client,
+refresh_block (struct NamestoreClient *nc,
                uint32_t rid,
                const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
                const char *name,
@@ -702,7 +657,10 @@
   if (NULL != nick)
   {
     nick->flags = (nick->flags | GNUNET_GNSRECORD_RF_PRIVATE) ^ 
GNUNET_GNSRECORD_RF_PRIVATE;
-    merge_with_nick_records (nick, rd_count,rd, &res_count, &res);
+    merge_with_nick_records (nick,
+                            rd_count,rd,
+                            &res_count,
+                            &res);
     GNUNET_free (nick);
   }
 
@@ -726,7 +684,7 @@
               res_count,
               GNUNET_GNSRECORD_z2s (&pkey));
   cop = GNUNET_new (struct CacheOperation);
-  cop->client = client;
+  cop->nc = nc;
   cop->rid = rid;
   GNUNET_CONTAINER_DLL_insert (cop_head,
                                cop_tail,
@@ -824,42 +782,24 @@
 /**
  * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP message
  *
- * @param cls unused
- * @param client client sending the message
- * @param message message of type 'struct RecordCreateMessage'
+ * @param cls client sending the message
+ * @param ll_msg message of type `struct LabelLookupMessage`
+ * @return #GNUNET_OK if @a ll_msg is well-formed
  */
-static void
-handle_record_lookup (void *cls,
-                     struct GNUNET_SERVER_Client *client,
-                     const struct GNUNET_MessageHeader *message)
+static int
+check_record_lookup (void *cls,
+                    const struct LabelLookupMessage *ll_msg)
 {
-  const struct LabelLookupMessage *ll_msg;
-  struct LabelLookupResponseMessage *llr_msg;
-  struct RecordLookupContext rlc;
-  const char *name_tmp;
-  char *res_name;
-  char *conv_name;
   uint32_t name_len;
   size_t src_size;
-  size_t res_size;
-  int res;
+  const char *name_tmp;
 
-  if (ntohs (message->size) < sizeof (struct LabelLookupMessage))
-  {
-    GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
-    return;
-  }
-
-  ll_msg = (const struct LabelLookupMessage *) message;
   name_len = ntohl (ll_msg->label_len);
-  src_size = ntohs (message->size);
-
-  if (name_len !=  src_size - sizeof (struct LabelLookupMessage))
+  src_size = ntohs (ll_msg->gns_header.header.size);
+  if (name_len != src_size - sizeof (struct LabelLookupMessage))
   {
     GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
-    return;
+    return GNUNET_SYSERR;
   }
 
   name_tmp = (const char *) &ll_msg[1];
@@ -866,25 +806,39 @@
   if ('\0' != name_tmp[name_len -1])
   {
     GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
-    return;
+    return GNUNET_SYSERR;
   }
+  return GNUNET_OK;
+}
 
-  GNUNET_SERVER_receive_done (client,
-                              GNUNET_OK);
+
+/**
+ * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP message
+ *
+ * @param cls client sending the message
+ * @param ll_msg message of type `struct LabelLookupMessage`
+ */
+static void
+handle_record_lookup (void *cls,
+                     const struct LabelLookupMessage *ll_msg)
+{
+  struct NamestoreClient *nc = cls;
+  struct GNUNET_MQ_Envelope *env;
+  struct LabelLookupResponseMessage *llr_msg;
+  struct RecordLookupContext rlc;
+  const char *name_tmp;
+  char *res_name;
+  char *conv_name;
+  uint32_t name_len;
+  int res;
+
+  name_len = ntohl (ll_msg->label_len);
+  name_tmp = (const char *) &ll_msg[1];
+  GNUNET_SERVICE_client_continue (nc->client);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Received NAMESTORE_RECORD_LOOKUP message for name `%s'\n",
               name_tmp);
 
-  if (NULL == (client_lookup (client)))
-  {
-    GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
-    return;
-  }
-
   conv_name = GNUNET_GNSRECORD_string_to_lowercase (name_tmp);
   if (NULL == conv_name)
   {
@@ -891,8 +845,7 @@
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 "Error converting name `%s'\n",
                 name_tmp);
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
+    GNUNET_SERVICE_client_drop (nc->client);
     return;
   }
   rlc.label = conv_name;
@@ -907,10 +860,9 @@
                                       &lookup_it,
                                       &rlc);
   GNUNET_free (conv_name);
-  res_size = sizeof (struct LabelLookupResponseMessage) + name_len + 
rlc.rd_ser_len;
-  llr_msg = GNUNET_malloc (res_size);
-  llr_msg->gns_header.header.size = htons (res_size);
-  llr_msg->gns_header.header.type = htons 
(GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP_RESPONSE);
+  env = GNUNET_MQ_msg_extra (llr_msg,
+                            name_len + rlc.rd_ser_len,
+                            
GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP_RESPONSE);
   llr_msg->gns_header.r_id = ll_msg->gns_header.r_id;
   llr_msg->private_key = ll_msg->zone;
   llr_msg->name_len = htons (name_len);
@@ -927,31 +879,65 @@
   GNUNET_memcpy (&res_name[name_len],
                  rlc.res_rd,
                  rlc.rd_ser_len);
-  GNUNET_SERVER_notification_context_unicast (snc,
-                                              client,
-                                              &llr_msg->gns_header.header,
-                                              GNUNET_NO);
+  GNUNET_MQ_send (nc->mq,
+                 env);
   GNUNET_free_non_null (rlc.res_rd);
-  GNUNET_free (llr_msg);
 }
 
 
 /**
+ * Checks a #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE message
+ *
+ * @param cls client sending the message
+ * @param rp_msg message of type `struct RecordStoreMessage`
+ * @return #GNUNET_OK if @a rp_msg is well-formed
+ */
+static int
+check_record_store (void *cls,
+                   const struct RecordStoreMessage *rp_msg)
+{
+  size_t name_len;
+  size_t msg_size;
+  size_t msg_size_exp;
+  size_t rd_ser_len;
+  const char *name_tmp;
+
+  name_len = ntohs (rp_msg->name_len);
+  msg_size = ntohs (rp_msg->gns_header.header.size);
+  rd_ser_len = ntohs (rp_msg->rd_len);
+  msg_size_exp = sizeof (struct RecordStoreMessage) + name_len + rd_ser_len;
+  if (msg_size != msg_size_exp)
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  if ((0 == name_len) || (name_len > MAX_NAME_LEN))
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  name_tmp = (const char *) &rp_msg[1];
+  if ('\0' != name_tmp[name_len -1])
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  return GNUNET_OK;
+}
+
+
+/**
  * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE message
  *
- * @param cls unused
- * @param client client sending the message
- * @param message message of type 'struct RecordCreateMessage'
+ * @param cls client sending the message
+ * @param rp_msg message of type `struct RecordStoreMessage`
  */
 static void
 handle_record_store (void *cls,
-                     struct GNUNET_SERVER_Client *client,
-                     const struct GNUNET_MessageHeader *message)
+                    const struct RecordStoreMessage *rp_msg)
 {
-  const struct RecordStoreMessage *rp_msg;
+  struct NamestoreClient *nc = cls;
   size_t name_len;
-  size_t msg_size;
-  size_t msg_size_exp;
   size_t rd_ser_len;
   uint32_t rid;
   const char *name_tmp;
@@ -964,45 +950,14 @@
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Received NAMESTORE_RECORD_STORE message\n");
-  if (ntohs (message->size) < sizeof (struct RecordStoreMessage))
-  {
-    GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
-    return;
-  }
-  rp_msg = (const struct RecordStoreMessage *) message;
   rid = ntohl (rp_msg->gns_header.r_id);
   name_len = ntohs (rp_msg->name_len);
-  msg_size = ntohs (message->size);
   rd_count = ntohs (rp_msg->rd_count);
   rd_ser_len = ntohs (rp_msg->rd_len);
   GNUNET_break (0 == ntohs (rp_msg->reserved));
-  msg_size_exp = sizeof (struct RecordStoreMessage) + name_len + rd_ser_len;
-  if (msg_size != msg_size_exp)
-  {
-    GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
-    return;
-  }
-  if ((0 == name_len) || (name_len > MAX_NAME_LEN))
-  {
-    GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
-    return;
-  }
   name_tmp = (const char *) &rp_msg[1];
   rd_ser = &name_tmp[name_len];
-  if ('\0' != name_tmp[name_len -1])
   {
-    GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
-    return;
-  }
-  (void) client_lookup (client);
-  {
     struct GNUNET_GNSRECORD_Data rd[rd_count];
 
     if (GNUNET_OK !=
@@ -1012,8 +967,7 @@
                                               rd))
     {
       GNUNET_break (0);
-      GNUNET_SERVER_receive_done (client,
-                                  GNUNET_SYSERR);
+      GNUNET_SERVICE_client_drop (nc->client);
       return;
     }
 
@@ -1026,7 +980,7 @@
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                   "Error converting name `%s'\n",
                   name_tmp);
-      GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+      GNUNET_SERVICE_client_drop (nc->client);
       return;
     }
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -1052,12 +1006,11 @@
     else
     {
       struct GNUNET_GNSRECORD_Data rd_clean[rd_count];
-      unsigned int i;
       unsigned int rd_clean_off;
 
       /* remove "NICK" records, unless this is for the "+" label */
       rd_clean_off = 0;
-      for (i=0;i<rd_count;i++)
+      for (unsigned int i=0;i<rd_count;i++)
       {
         rd_clean[rd_clean_off] = rd[i];
         if ( (0 == strcmp (GNUNET_GNS_MASTERZONE_STR,
@@ -1083,8 +1036,7 @@
             GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                         "Notifying monitor about changes under label `%s'\n",
                         conv_name);
-            send_lookup_response (monitor_nc,
-                                  zm->nc->client,
+            send_lookup_response (zm->nc,
                                   0,
                                   &rp_msg->private_key,
                                   conv_name,
@@ -1107,22 +1059,22 @@
     }
     if (GNUNET_OK == res)
     {
-      refresh_block (client, rid,
+      refresh_block (nc,
+                    rid,
                      &rp_msg->private_key,
                      conv_name,
-                     rd_count, rd);
-      GNUNET_SERVER_receive_done (client,
-                                  GNUNET_OK);
+                     rd_count,
+                    rd);
+      GNUNET_SERVICE_client_continue (nc->client);
       GNUNET_free (conv_name);
       return;
     }
     GNUNET_free (conv_name);
   }
-  send_store_response (client,
+  send_store_response (nc,
                        res,
                        rid);
-  GNUNET_SERVER_receive_done (client,
-                              GNUNET_OK);
+  GNUNET_SERVICE_client_continue (nc->client);
 }
 
 
@@ -1168,6 +1120,7 @@
                        const struct GNUNET_GNSRECORD_Data *rd)
 {
   struct ZoneToNameCtx *ztn_ctx = cls;
+  struct GNUNET_MQ_Envelope *env;
   struct ZoneToNameResponseMessage *ztnr_msg;
   int16_t res;
   size_t name_len;
@@ -1189,8 +1142,9 @@
     ztn_ctx->success = GNUNET_SYSERR;
     return;
   }
-  ztnr_msg = GNUNET_malloc (msg_size);
-  ztnr_msg->gns_header.header.type = htons 
(GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME_RESPONSE);
+  env = GNUNET_MQ_msg_extra (ztnr_msg,
+                            name_len + rd_ser_len,
+                            
GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME_RESPONSE);
   ztnr_msg->gns_header.header.size = htons (msg_size);
   ztnr_msg->gns_header.r_id = htonl (ztn_ctx->rid);
   ztnr_msg->res = htons (res);
@@ -1199,15 +1153,17 @@
   ztnr_msg->name_len = htons (name_len);
   ztnr_msg->zone = *zone_key;
   name_tmp = (char *) &ztnr_msg[1];
-  if (NULL != name)
-    GNUNET_memcpy (name_tmp, name, name_len);
+  GNUNET_memcpy (name_tmp,
+                name,
+                name_len);
   rd_tmp = &name_tmp[name_len];
-  GNUNET_GNSRECORD_records_serialize (rd_count, rd, rd_ser_len, rd_tmp);
+  GNUNET_GNSRECORD_records_serialize (rd_count,
+                                     rd,
+                                     rd_ser_len,
+                                     rd_tmp);
   ztn_ctx->success = GNUNET_OK;
-  GNUNET_SERVER_notification_context_unicast (snc, ztn_ctx->nc->client,
-                                             &ztnr_msg->gns_header.header,
-                                             GNUNET_NO);
-  GNUNET_free (ztnr_msg);
+  GNUNET_MQ_send (ztn_ctx->nc->mq,
+                 env);
 }
 
 
@@ -1214,25 +1170,21 @@
 /**
  * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME message
  *
- * @param cls unused
- * @param client client sending the message
- * @param message message of type 'struct ZoneToNameMessage'
+ * @param cls client client sending the message
+ * @param ztn_msg message of type 'struct ZoneToNameMessage'
  */
 static void
 handle_zone_to_name (void *cls,
-                     struct GNUNET_SERVER_Client *client,
-                     const struct GNUNET_MessageHeader *message)
+                     const struct ZoneToNameMessage *ztn_msg)
 {
-  struct NamestoreClient *nc;
-  const struct ZoneToNameMessage *ztn_msg;
+  struct NamestoreClient *nc = cls;
   struct ZoneToNameCtx ztn_ctx;
-  struct ZoneToNameResponseMessage ztnr_msg;
+  struct GNUNET_MQ_Envelope *env;
+  struct ZoneToNameResponseMessage *ztnr_msg;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Received `%s' message\n",
              "ZONE_TO_NAME");
-  ztn_msg = (const struct ZoneToNameMessage *) message;
-  nc = client_lookup (client);
   ztn_ctx.rid = ntohl (ztn_msg->gns_header.r_id);
   ztn_ctx.nc = nc;
   ztn_ctx.success = GNUNET_NO;
@@ -1245,7 +1197,7 @@
     /* internal error, hang up instead of signalling something
        that might be wrong */
     GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+    GNUNET_SERVICE_client_drop (nc->client);
     return;
   }
   if (GNUNET_NO == ztn_ctx.success)
@@ -1253,17 +1205,14 @@
     /* no result found, send empty response */
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Found no result for zone-to-name lookup.\n");
-    memset (&ztnr_msg, 0, sizeof (ztnr_msg));
-    ztnr_msg.gns_header.header.type = htons 
(GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME_RESPONSE);
-    ztnr_msg.gns_header.header.size = htons (sizeof (ztnr_msg));
-    ztnr_msg.gns_header.r_id = ztn_msg->gns_header.r_id;
-    ztnr_msg.res = htons (GNUNET_NO);
-    GNUNET_SERVER_notification_context_unicast (snc,
-                                               client,
-                                               &ztnr_msg.gns_header.header,
-                                               GNUNET_NO);
+    env = GNUNET_MQ_msg (ztnr_msg,
+                        GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME_RESPONSE);
+    ztnr_msg->gns_header.r_id = ztn_msg->gns_header.r_id;
+    ztnr_msg->res = htons (GNUNET_NO);
+    GNUNET_MQ_send (nc->mq,
+                   env);
   }
-  GNUNET_SERVER_receive_done (client, GNUNET_OK);
+  GNUNET_SERVICE_client_continue (nc->client);
 }
 
 
@@ -1324,13 +1273,12 @@
  */
 static void
 zone_iterate_proc (void *cls,
-                       const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
-                       const char *name,
-                       unsigned int rd_count,
-                       const struct GNUNET_GNSRECORD_Data *rd)
+                  const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+                  const char *name,
+                  unsigned int rd_count,
+                  const struct GNUNET_GNSRECORD_Data *rd)
 {
   struct ZoneIterationProcResult *proc = cls;
-  unsigned int i;
   int do_refresh_block;
 
   if ((NULL == zone_key) && (NULL == name))
@@ -1348,8 +1296,7 @@
     return;
   }
   proc->res_iteration_finished = IT_SUCCESS_MORE_AVAILABLE;
-  send_lookup_response (snc,
-                       proc->zi->client->client,
+  send_lookup_response (proc->zi->nc,
                        proc->zi->request_id,
                        zone_key,
                        name,
@@ -1356,7 +1303,7 @@
                        rd_count,
                        rd);
   do_refresh_block = GNUNET_NO;
-  for (i=0;i<rd_count;i++)
+  for (unsigned int i=0;i<rd_count;i++)
     if (0 != (rd[i].flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION))
     {
       do_refresh_block = GNUNET_YES;
@@ -1363,7 +1310,8 @@
       break;
     }
   if (GNUNET_YES == do_refresh_block)
-    refresh_block (NULL, 0,
+    refresh_block (NULL,
+                  0,
                    zone_key,
                    name,
                    rd_count,
@@ -1381,7 +1329,8 @@
 run_zone_iteration_round (struct ZoneIteration *zi)
 {
   struct ZoneIterationProcResult proc;
-  struct RecordResultMessage rrm;
+  struct GNUNET_MQ_Envelope *env;
+  struct RecordResultMessage *rrm;
   int ret;
 
   memset (&proc, 0, sizeof (proc));
@@ -1411,16 +1360,13 @@
     return; /* more results later */
   }
   /* send empty response to indicate end of list */
-  memset (&rrm, 0, sizeof (rrm));
-  rrm.gns_header.header.type = htons 
(GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_RESULT);
-  rrm.gns_header.header.size = htons (sizeof (rrm));
-  rrm.gns_header.r_id = htonl (zi->request_id);
-  GNUNET_SERVER_notification_context_unicast (snc,
-                                             zi->client->client,
-                                             &rrm.gns_header.header,
-                                             GNUNET_NO);
-  GNUNET_CONTAINER_DLL_remove (zi->client->op_head,
-                              zi->client->op_tail,
+  env = GNUNET_MQ_msg (rrm,
+                      GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_RESULT);
+  rrm->gns_header.r_id = htonl (zi->request_id);
+  GNUNET_MQ_send (zi->nc->mq,
+                 env);
+  GNUNET_CONTAINER_DLL_remove (zi->nc->op_head,
+                              zi->nc->op_tail,
                               zi);
   GNUNET_free (zi);
 }
@@ -1429,37 +1375,29 @@
 /**
  * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_START message
  *
- * @param cls unused
- * @param client the client sending the message
- * @param message message of type 'struct ZoneIterationStartMessage'
+ * @param cls the client sending the message
+ * @param zis_msg message from the client
  */
 static void
 handle_iteration_start (void *cls,
-                        struct GNUNET_SERVER_Client *client,
-                        const struct GNUNET_MessageHeader *message)
+                       const struct ZoneIterationStartMessage *zis_msg)
 {
-  const struct ZoneIterationStartMessage *zis_msg;
-  struct NamestoreClient *nc;
+  struct NamestoreClient *nc = cls;
   struct ZoneIteration *zi;
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", 
"ZONE_ITERATION_START");
-  if (NULL == (nc = client_lookup (client)))
-  {
-    GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
-    return;
-  }
-  zis_msg = (const struct ZoneIterationStartMessage *) message;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+             "Received ZONE_ITERATION_START message\n");
   zi = GNUNET_new (struct ZoneIteration);
   zi->request_id = ntohl (zis_msg->gns_header.r_id);
   zi->offset = 0;
-  zi->client = nc;
+  zi->nc = nc;
   zi->zone = zis_msg->zone;
 
-
-  GNUNET_CONTAINER_DLL_insert (nc->op_head, nc->op_tail, zi);
+  GNUNET_CONTAINER_DLL_insert (nc->op_head,
+                              nc->op_tail,
+                              zi);
   run_zone_iteration_round (zi);
-  GNUNET_SERVER_receive_done (client, GNUNET_OK);
+  GNUNET_SERVICE_client_continue (nc->client);
 }
 
 
@@ -1466,30 +1404,20 @@
 /**
  * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_STOP message
  *
- * @param cls unused
- * @param client GNUNET_SERVER_Client sending the message
- * @param message message of type 'struct ZoneIterationStopMessage'
+ * @param cls the client sending the message
+ * @param zis_msg message from the client
  */
 static void
 handle_iteration_stop (void *cls,
-                       struct GNUNET_SERVER_Client *client,
-                       const struct GNUNET_MessageHeader *message)
+                      const struct ZoneIterationStopMessage *zis_msg)
 {
-  struct NamestoreClient *nc;
+  struct NamestoreClient *nc = cls;
   struct ZoneIteration *zi;
-  const struct ZoneIterationStopMessage *zis_msg;
   uint32_t rid;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Received `%s' message\n",
              "ZONE_ITERATION_STOP");
-  if (NULL == (nc = client_lookup(client)))
-  {
-    GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
-    return;
-  }
-  zis_msg = (const struct ZoneIterationStopMessage *) message;
   rid = ntohl (zis_msg->gns_header.r_id);
   for (zi = nc->op_head; NULL != zi; zi = zi->next)
     if (zi->request_id == rid)
@@ -1497,12 +1425,14 @@
   if (NULL == zi)
   {
     GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+    GNUNET_SERVICE_client_drop (nc->client);
     return;
   }
-  GNUNET_CONTAINER_DLL_remove (nc->op_head, nc->op_tail, zi);
+  GNUNET_CONTAINER_DLL_remove (nc->op_head,
+                              nc->op_tail,
+                              zi);
   GNUNET_free (zi);
-  GNUNET_SERVER_receive_done (client, GNUNET_OK);
+  GNUNET_SERVICE_client_continue (nc->client);
 }
 
 
@@ -1509,30 +1439,19 @@
 /**
  * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_NEXT message
  *
- * @param cls unused
- * @param client GNUNET_SERVER_Client sending the message
- * @param message message of type 'struct ZoneIterationNextMessage'
+ * @param cls the client sending the message
+ * @param message message from the client
  */
 static void
 handle_iteration_next (void *cls,
-                       struct GNUNET_SERVER_Client *client,
-                       const struct GNUNET_MessageHeader *message)
+                      const struct ZoneIterationNextMessage *zis_msg)
 {
-  struct NamestoreClient *nc;
+  struct NamestoreClient *nc = cls;
   struct ZoneIteration *zi;
-  const struct ZoneIterationNextMessage *zis_msg;
   uint32_t rid;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Received `%s' message\n",
-              "ZONE_ITERATION_NEXT");
-  if (NULL == (nc = client_lookup(client)))
-  {
-    GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
-    return;
-  }
-  zis_msg = (const struct ZoneIterationNextMessage *) message;
+              "Received ZONE_ITERATION_NEXT message\n");
   rid = ntohl (zis_msg->gns_header.r_id);
   for (zi = nc->op_head; NULL != zi; zi = zi->next)
     if (zi->request_id == rid)
@@ -1540,11 +1459,11 @@
   if (NULL == zi)
   {
     GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+    GNUNET_SERVICE_client_drop (nc->client);
     return;
   }
   run_zone_iteration_round (zi);
-  GNUNET_SERVER_receive_done (client, GNUNET_OK);
+  GNUNET_SERVICE_client_continue (nc->client);
 }
 
 
@@ -1556,14 +1475,13 @@
 static void
 monitor_sync (struct ZoneMonitor *zm)
 {
-  struct GNUNET_MessageHeader sync;
+  struct GNUNET_MQ_Envelope *env;
+  struct GNUNET_MessageHeader *sync;
 
-  sync.size = htons (sizeof (struct GNUNET_MessageHeader));
-  sync.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_MONITOR_SYNC);
-  GNUNET_SERVER_notification_context_unicast (monitor_nc,
-                                             zm->nc->client,
-                                             &sync,
-                                             GNUNET_NO);
+  env = GNUNET_MQ_msg (sync,
+                      GNUNET_MESSAGE_TYPE_NAMESTORE_MONITOR_SYNC);
+  GNUNET_MQ_send (zm->nc->mq,
+                 env);
 }
 
 
@@ -1600,14 +1518,14 @@
     monitor_sync (zm);
     return;
   }
-  send_lookup_response (monitor_nc,
-                       zm->nc->client,
+  send_lookup_response (zm->nc,
                        0,
                        zone_key,
                        name,
                        rd_count,
                        rd);
-  zm->task = GNUNET_SCHEDULER_add_now (&monitor_next, zm);
+  zm->task = GNUNET_SCHEDULER_add_now (&monitor_next,
+                                      zm);
 }
 
 
@@ -1614,33 +1532,31 @@
 /**
  * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_MONITOR_START message
  *
- * @param cls unused
- * @param client the client sending the message
- * @param message message of type 'struct ZoneMonitorStartMessage'
+ * @param cls the client sending the message
+ * @param message message from the client
  */
 static void
 handle_monitor_start (void *cls,
-                     struct GNUNET_SERVER_Client *client,
-                     const struct GNUNET_MessageHeader *message)
+                     const struct ZoneMonitorStartMessage *zis_msg)
 {
-  const struct ZoneMonitorStartMessage *zis_msg;
+  struct NamestoreClient *nc = cls;
   struct ZoneMonitor *zm;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-             "Received `%s' message\n",
-             "ZONE_MONITOR_START");
-  zis_msg = (const struct ZoneMonitorStartMessage *) message;
+             "Received ZONE_MONITOR_START message\n");
   zm = GNUNET_new (struct ZoneMonitor);
-  zm->offset = 0;
-  zm->nc = client_lookup (client);
+  zm->nc = nc;
   zm->zone = zis_msg->zone;
-  GNUNET_CONTAINER_DLL_insert (monitor_head, monitor_tail, zm);
-  GNUNET_SERVER_client_mark_monitor (client);
-  GNUNET_SERVER_disable_receive_done_warning (client);
-  GNUNET_SERVER_notification_context_add (monitor_nc,
-                                         client);
+  GNUNET_CONTAINER_DLL_insert (monitor_head,
+                              monitor_tail,
+                              zm);
+  GNUNET_SERVICE_client_mark_monitor (nc->client);
+  GNUNET_SERVICE_client_disable_continue_warning (nc->client);
+  GNUNET_notification_context_add (monitor_nc,
+                                  nc->mq);
   if (GNUNET_YES == ntohl (zis_msg->iterate_first))
-    zm->task = GNUNET_SCHEDULER_add_now (&monitor_next, zm);
+    zm->task = GNUNET_SCHEDULER_add_now (&monitor_next,
+                                        zm);
   else
     monitor_sync (zm);
 }
@@ -1659,14 +1575,17 @@
 
   zm->task = NULL;
   ret = GSN_database->iterate_records (GSN_database->cls,
-                                       (0 == memcmp (&zm->zone, &zero, sizeof 
(zero)))
+                                       (0 == memcmp (&zm->zone,
+                                                    &zero,
+                                                    sizeof (zero)))
                                        ? NULL
                                        : &zm->zone,
                                       zm->offset++,
-                                      &monitor_iterate_cb, zm);
+                                      &monitor_iterate_cb,
+                                      zm);
   if (GNUNET_SYSERR == ret)
   {
-    GNUNET_SERVER_client_disconnect (zm->nc->client);
+    GNUNET_SERVICE_client_drop (zm->nc->client);
     return;
   }
   if (GNUNET_NO == ret)
@@ -1682,35 +1601,20 @@
  * Process namestore requests.
  *
  * @param cls closure
- * @param server the initialized server
  * @param cfg configuration to use
+ * @param service the initialized service
  */
 static void
-run (void *cls, struct GNUNET_SERVER_Handle *server,
-     const struct GNUNET_CONFIGURATION_Handle *cfg)
+run (void *cls,
+     const struct GNUNET_CONFIGURATION_Handle *cfg,
+     struct GNUNET_SERVICE_Handle *service)
 {
-  static const struct GNUNET_SERVER_MessageHandler handlers[] = {
-    {&handle_record_store, NULL,
-     GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE, 0},
-    {&handle_record_lookup, NULL,
-     GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP, 0},
-    {&handle_zone_to_name, NULL,
-     GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME, sizeof (struct 
ZoneToNameMessage) },
-    {&handle_iteration_start, NULL,
-     GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_START, sizeof (struct 
ZoneIterationStartMessage) },
-    {&handle_iteration_next, NULL,
-     GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_NEXT, sizeof (struct 
ZoneIterationNextMessage) },
-    {&handle_iteration_stop, NULL,
-     GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_STOP, sizeof (struct 
ZoneIterationStopMessage) },
-    {&handle_monitor_start, NULL,
-     GNUNET_MESSAGE_TYPE_NAMESTORE_MONITOR_START, sizeof (struct 
ZoneMonitorStartMessage) },
-    {NULL, NULL, 0, 0}
-  };
   char *database;
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting namestore service\n");
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+             "Starting namestore service\n");
   GSN_cfg = cfg;
-  monitor_nc = GNUNET_SERVER_notification_context_create (server, 1);
+  monitor_nc = GNUNET_notification_context_create (1);
   namecache = GNUNET_NAMECACHE_connect (cfg);
   /* Loading database plugin */
   if (GNUNET_OK !=
@@ -1727,39 +1631,58 @@
   GSN_database = GNUNET_PLUGIN_load (db_lib_name,
                                      (void *) GSN_cfg);
   GNUNET_free (database);
+  GNUNET_SCHEDULER_add_shutdown (&cleanup_task,
+                                NULL);
   if (NULL == GSN_database)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                "Could not load database backend `%s'\n",
                db_lib_name);
-    GNUNET_SCHEDULER_add_now (&cleanup_task, NULL);
+    GNUNET_SCHEDULER_shutdown ();
     return;
   }
-
-  /* Configuring server handles */
-  GNUNET_SERVER_add_handlers (server, handlers);
-  snc = GNUNET_SERVER_notification_context_create (server, 16);
-  GNUNET_SERVER_disconnect_notify (server,
-                                   &client_disconnect_notification,
-                                   NULL);
-  GNUNET_SCHEDULER_add_shutdown (&cleanup_task,
-                                NULL);
 }
 
 
 /**
- * The main function for the template service.
- *
- * @param argc number of arguments from the command line
- * @param argv command line arguments
- * @return 0 ok, 1 on error
+ * Define "main" method using service macro.
  */
-int
-main (int argc, char *const *argv)
-{
-  return (GNUNET_OK ==
-          GNUNET_SERVICE_run (argc, argv, "namestore",
-                              GNUNET_SERVICE_OPTION_NONE, &run, NULL)) ? 0 : 1;
-}
+GNUNET_SERVICE_MAIN
+("namestore",
+ GNUNET_SERVICE_OPTION_NONE,
+ &run,
+ &client_connect_cb,
+ &client_disconnect_cb,
+ NULL,
+ GNUNET_MQ_hd_var_size (record_store,
+                       GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE,
+                       struct RecordStoreMessage,
+                       NULL),
+ GNUNET_MQ_hd_var_size (record_lookup,
+                       GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP,
+                       struct LabelLookupMessage,
+                       NULL),
+ GNUNET_MQ_hd_fixed_size (zone_to_name,
+                         GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME,
+                         struct ZoneToNameMessage,
+                         NULL),
+ GNUNET_MQ_hd_fixed_size (iteration_start, 
+                         GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_START,
+                         struct ZoneIterationStartMessage,
+                         NULL),
+ GNUNET_MQ_hd_fixed_size (iteration_next, 
+                         GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_NEXT,
+                         struct ZoneIterationNextMessage,
+                         NULL),
+ GNUNET_MQ_hd_fixed_size (iteration_stop, 
+                         GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_STOP,
+                         struct ZoneIterationStopMessage,
+                         NULL),
+ GNUNET_MQ_hd_fixed_size (monitor_start, 
+                         GNUNET_MESSAGE_TYPE_NAMESTORE_MONITOR_START,
+                         struct ZoneMonitorStartMessage,
+                         NULL),
+ GNUNET_MQ_handler_end ());
+                         
 
 /* end of gnunet-service-namestore.c */




reply via email to

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