aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2016-09-21 10:56:28 +0000
committerChristian Grothoff <christian@grothoff.org>2016-09-21 10:56:28 +0000
commitd4afc6e37a14fe3257263c377a243c1a22ed9ee5 (patch)
treeccfce6d4f92808372d3e7ebfe9f5372e9f21f50c
parent60d02b5b0899f454cb65408bd2ed4c453fa75a3d (diff)
migrating more services to new service API
-rw-r--r--src/ats/Makefile.am1
-rw-r--r--src/ats/gnunet-service-ats.c456
-rw-r--r--src/ats/gnunet-service-ats_addresses.c70
-rw-r--r--src/ats/gnunet-service-ats_addresses.h13
-rw-r--r--src/ats/gnunet-service-ats_connectivity.c33
-rw-r--r--src/ats/gnunet-service-ats_connectivity.h20
-rw-r--r--src/ats/gnunet-service-ats_feedback.c123
-rw-r--r--src/ats/gnunet-service-ats_feedback.h43
-rw-r--r--src/ats/gnunet-service-ats_performance.c62
-rw-r--r--src/ats/gnunet-service-ats_performance.h4
-rw-r--r--src/ats/gnunet-service-ats_plugins.c2
-rw-r--r--src/ats/gnunet-service-ats_plugins.h2
-rw-r--r--src/ats/gnunet-service-ats_preferences.c42
-rw-r--r--src/ats/gnunet-service-ats_preferences.h12
-rw-r--r--src/ats/gnunet-service-ats_reservations.c49
-rw-r--r--src/ats/gnunet-service-ats_reservations.h9
-rw-r--r--src/ats/gnunet-service-ats_scheduling.c136
-rw-r--r--src/ats/gnunet-service-ats_scheduling.h44
-rw-r--r--src/ats/plugin_ats_mlp.c2
-rw-r--r--src/ats/plugin_ats_proportional.c2
-rw-r--r--src/ats/plugin_ats_ril.c2
-rw-r--r--src/include/gnunet_ats_plugin.h2
-rw-r--r--src/namestore/gnunet-service-namestore.c713
23 files changed, 844 insertions, 998 deletions
diff --git a/src/ats/Makefile.am b/src/ats/Makefile.am
index ffe2c96167..aa3612c2d9 100644
--- a/src/ats/Makefile.am
+++ b/src/ats/Makefile.am
@@ -83,7 +83,6 @@ gnunet_service_ats_SOURCES = \
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 \
diff --git a/src/ats/gnunet-service-ats.c b/src/ats/gnunet-service-ats.c
index 045a5bb673..9762faa511 100644
--- a/src/ats/gnunet-service-ats.c
+++ b/src/ats/gnunet-service-ats.c
@@ -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 @@ handle_ats_start (void *cls,
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,12 +83,310 @@ handle_ats_start (void *cls,
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;
}
@@ -107,10 +396,12 @@ handle_ats_start (void *cls,
*
* @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 @@ cleanup_task (void *cls)
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 @@ cleanup_task (void *cls)
* 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)
-{
- 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);
+ const struct GNUNET_CONFIGURATION_Handle *cfg,
+ struct GNUNET_SERVICE_Handle *service)
+{
+ 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,37 +466,69 @@ run (void *cls,
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);
}
/**
- * 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 */
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c
index 44a4782d5a..1a4a332066 100644
--- a/src/ats/gnunet-service-ats_addresses.c
+++ b/src/ats/gnunet-service-ats_addresses.c
@@ -347,13 +347,13 @@ GAS_addresses_destroy (const struct GNUNET_PeerIdentity *peer,
* 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 @@ struct AddressIteration
/**
* 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 @@ transmit_req_addr (struct AddressIteration *ai,
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;
-
- 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);
+ msize = plugin_addr_len + plugin_name_length;
+
+ 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 @@ transmit_req_addr (struct AddressIteration *ai,
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 @@ req_addr_peerinfo_it (void *cls,
/**
* 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 @@ GAS_handle_request_address_list (void *cls,
GNUNET_HELLO_ADDRESS_INFO_NONE,
GNUNET_BANDWIDTH_ZERO,
GNUNET_BANDWIDTH_ZERO);
- GNUNET_SERVER_receive_done (client,
- GNUNET_OK);
}
diff --git a/src/ats/gnunet-service-ats_addresses.h b/src/ats/gnunet-service-ats_addresses.h
index 274985e668..61de1cd31f 100644
--- a/src/ats/gnunet-service-ats_addresses.h
+++ b/src/ats/gnunet-service-ats_addresses.h
@@ -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 @@ extern struct GNUNET_CONTAINER_MultiPeerMap *GSA_addresses;
/**
* 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 @@ GAS_addresses_get_peer_info (const struct GNUNET_PeerIdentity *peer,
/**
* 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
diff --git a/src/ats/gnunet-service-ats_connectivity.c b/src/ats/gnunet-service-ats_connectivity.c
index 2cf434c70b..c47ee03e66 100644
--- a/src/ats/gnunet-service-ats_connectivity.c
+++ b/src/ats/gnunet-service-ats_connectivity.c
@@ -40,7 +40,7 @@ struct ConnectionRequest
/**
* 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 @@ GAS_connectivity_has_peer (void *cls,
/**
* 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 @@ GAS_handle_request_address (void *cls,
cr,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
GAS_plugin_request_connect_start (&msg->peer);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
}
@@ -117,7 +112,7 @@ free_matching_requests (void *cls,
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 @@ free_matching_requests (void *cls,
* 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 @@ GAS_handle_request_address_cancel (void *cls,
&msg->peer,
&free_matching_requests,
client);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
}
@@ -171,7 +160,7 @@ GAS_handle_request_address_cancel (void *cls,
* @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 @@ GAS_connectivity_remove_client (struct GNUNET_SERVER_Client *client)
void
GAS_connectivity_init ()
{
- connection_requests = GNUNET_CONTAINER_multipeermap_create (32, GNUNET_NO);
+ connection_requests
+ = GNUNET_CONTAINER_multipeermap_create (32,
+ GNUNET_NO);
}
diff --git a/src/ats/gnunet-service-ats_connectivity.h b/src/ats/gnunet-service-ats_connectivity.h
index f10f9de0e9..b8f194b364 100644
--- a/src/ats/gnunet-service-ats_connectivity.h
+++ b/src/ats/gnunet-service-ats_connectivity.h
@@ -26,6 +26,8 @@
#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
@@ -43,27 +45,23 @@ GAS_connectivity_has_peer (void *cls,
/**
* 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 @@ GAS_handle_request_address_cancel (void *cls,
* @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);
/**
diff --git a/src/ats/gnunet-service-ats_feedback.c b/src/ats/gnunet-service-ats_feedback.c
deleted file mode 100644
index deb8e3d5d4..0000000000
--- a/src/ats/gnunet-service-ats_feedback.c
+++ /dev/null
@@ -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 */
diff --git a/src/ats/gnunet-service-ats_feedback.h b/src/ats/gnunet-service-ats_feedback.h
deleted file mode 100644
index 0ecb5d9b41..0000000000
--- a/src/ats/gnunet-service-ats_feedback.h
+++ /dev/null
@@ -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
diff --git a/src/ats/gnunet-service-ats_performance.c b/src/ats/gnunet-service-ats_performance.c
index 8702716f9f..5252a71bc1 100644
--- a/src/ats/gnunet-service-ats_performance.c
+++ b/src/ats/gnunet-service-ats_performance.c
@@ -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 @@ static struct GNUNET_SERVER_NotificationContext *nc_pic;
* @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 @@ notify_client (struct GNUNET_SERVER_Client *client,
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 @@ notify_client (struct GNUNET_SERVER_Client *client,
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 @@ GAS_performance_notify_all_clients (const struct GNUNET_PeerIdentity *peer,
/**
* 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 @@ peerinfo_it (void *cls,
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,25 +228,24 @@ peerinfo_it (void *cls,
* @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);
}
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 @@ GAS_performance_add_client (struct GNUNET_SERVER_Client *client,
* @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 @@ GAS_performance_init (struct GNUNET_SERVER_Handle *server)
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;
}
diff --git a/src/ats/gnunet-service-ats_performance.h b/src/ats/gnunet-service-ats_performance.h
index bbaa8bc2b5..7958a84e51 100644
--- a/src/ats/gnunet-service-ats_performance.h
+++ b/src/ats/gnunet-service-ats_performance.h
@@ -68,7 +68,7 @@ GAS_performance_notify_all_clients (const struct GNUNET_PeerIdentity *peer,
* @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 @@ GAS_performance_add_client (struct GNUNET_SERVER_Client *client,
* @param addresses the address handle to use
*/
void
-GAS_performance_init (struct GNUNET_SERVER_Handle *server);
+GAS_performance_init (void);
/**
diff --git a/src/ats/gnunet-service-ats_plugins.c b/src/ats/gnunet-service-ats_plugins.c
index c2388e28b6..f70c4cd9b8 100644
--- a/src/ats/gnunet-service-ats_plugins.c
+++ b/src/ats/gnunet-service-ats_plugins.c
@@ -510,7 +510,7 @@ GAS_plugin_delete_address (struct ATS_Address *address)
* @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,
diff --git a/src/ats/gnunet-service-ats_plugins.h b/src/ats/gnunet-service-ats_plugins.h
index 3f3261767e..8b12416c6f 100644
--- a/src/ats/gnunet-service-ats_plugins.h
+++ b/src/ats/gnunet-service-ats_plugins.h
@@ -105,7 +105,7 @@ GAS_plugin_delete_address (struct ATS_Address *address);
* @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,
diff --git a/src/ats/gnunet-service-ats_preferences.c b/src/ats/gnunet-service-ats_preferences.c
index 64779bbca4..9f11dc6a8d 100644
--- a/src/ats/gnunet-service-ats_preferences.c
+++ b/src/ats/gnunet-service-ats_preferences.c
@@ -132,7 +132,7 @@ struct PreferenceClient
/**
* Client handle
*/
- struct GNUNET_SERVER_Client *client;
+ struct GNUNET_SERVICE_Client *client;
/**
* Mapping peer identities to `struct PreferencePeer` entry
@@ -553,7 +553,7 @@ update_iterator (void *cls,
* @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 @@ update_preference (struct GNUNET_SERVER_Client *client,
/**
* 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 @@ GAS_handle_preference_change (void *cls,
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 @@ GAS_preference_get_by_peer (void *cls,
* @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;
diff --git a/src/ats/gnunet-service-ats_preferences.h b/src/ats/gnunet-service-ats_preferences.h
index 3a483d8164..fe01aa573b 100644
--- a/src/ats/gnunet-service-ats_preferences.h
+++ b/src/ats/gnunet-service-ats_preferences.h
@@ -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 @@ GAS_preference_get_by_peer (void *cls,
* @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
diff --git a/src/ats/gnunet-service-ats_reservations.c b/src/ats/gnunet-service-ats_reservations.c
index 97098c8192..95952e96fc 100644
--- a/src/ats/gnunet-service-ats_reservations.c
+++ b/src/ats/gnunet-service-ats_reservations.c
@@ -138,63 +138,43 @@ GAS_reservations_set_bandwidth (const struct GNUNET_PeerIdentity *peer,
/**
* 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 @@ GAS_reservations_init (struct GNUNET_SERVER_Handle *server)
*/
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;
diff --git a/src/ats/gnunet-service-ats_reservations.h b/src/ats/gnunet-service-ats_reservations.h
index cc51e82a5b..ec28053b5a 100644
--- a/src/ats/gnunet-service-ats_reservations.h
+++ b/src/ats/gnunet-service-ats_reservations.h
@@ -27,6 +27,7 @@
#define GNUNET_SERVICE_ATS_RESERVATIONS_H
#include "gnunet_util_lib.h"
+#include "ats.h"
/**
@@ -46,14 +47,12 @@ GAS_reservations_set_bandwidth (const struct GNUNET_PeerIdentity *peer,
/**
* 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 @@ GAS_handle_reservation_request (void *cls,
* @param server handle to our server
*/
void
-GAS_reservations_init (struct GNUNET_SERVER_Handle *server);
+GAS_reservations_init (void);
/**
diff --git a/src/ats/gnunet-service-ats_scheduling.c b/src/ats/gnunet-service-ats_scheduling.c
index f19370f7a6..fd7eff8fbe 100644
--- a/src/ats/gnunet-service-ats_scheduling.c
+++ b/src/ats/gnunet-service-ats_scheduling.c
@@ -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 @@ static struct GNUNET_SERVER_Client *my_client;
* @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 @@ GAS_scheduling_add_client (struct GNUNET_SERVER_Client *client)
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 @@ GAS_scheduling_add_client (struct GNUNET_SERVER_Client *client)
* @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 @@ GAS_scheduling_transmit_address_suggestion (const struct GNUNET_PeerIdentity *pe
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,55 +95,39 @@ GAS_scheduling_transmit_address_suggestion (const struct GNUNET_PeerIdentity *pe
"# 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);
}
/**
* 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 @@ GAS_handle_address_add (void *cls,
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,27 +149,19 @@ GAS_handle_address_add (void *cls,
ntohl (m->address_local_info),
ntohl (m->session_id),
&prop);
- GNUNET_SERVER_receive_done (client,
- GNUNET_OK);
}
/**
* 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,27 +171,20 @@ GAS_handle_address_update (void *cls,
GAS_addresses_update (&m->peer,
ntohl (m->session_id),
&prop);
- GNUNET_SERVER_receive_done (client,
- GNUNET_OK);
}
/**
* 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,42 +194,12 @@ GAS_handle_address_destroyed (void *cls,
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);
-}
-
-
-/**
- * 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;
+ 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);
}
diff --git a/src/ats/gnunet-service-ats_scheduling.h b/src/ats/gnunet-service-ats_scheduling.h
index 99dc6084bc..26cb2c73af 100644
--- a/src/ats/gnunet-service-ats_scheduling.h
+++ b/src/ats/gnunet-service-ats_scheduling.h
@@ -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 @@ GAS_scheduling_add_client (struct GNUNET_SERVER_Client *client);
* @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,57 +69,29 @@ GAS_scheduling_transmit_address_suggestion (const struct GNUNET_PeerIdentity *pe
/**
* 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
- */
-void
-GAS_handle_address_destroyed (void *cls,
- struct GNUNET_SERVER_Client *client,
- const struct GNUNET_MessageHeader *message);
-
-
-/**
- * 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.
+ * @param m the request message
*/
void
-GAS_scheduling_done (void);
+GAS_handle_address_destroyed (const struct AddressDestroyedMessage *m);
#endif
diff --git a/src/ats/plugin_ats_mlp.c b/src/ats/plugin_ats_mlp.c
index e6a7903777..90f99cb5d6 100644
--- a/src/ats/plugin_ats_mlp.c
+++ b/src/ats/plugin_ats_mlp.c
@@ -2281,7 +2281,7 @@ GAS_mlp_address_change_preference (void *solver,
*/
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,
diff --git a/src/ats/plugin_ats_proportional.c b/src/ats/plugin_ats_proportional.c
index 7d55fcad3d..9309bc2ea7 100644
--- a/src/ats/plugin_ats_proportional.c
+++ b/src/ats/plugin_ats_proportional.c
@@ -879,7 +879,7 @@ GAS_proportional_change_preference (void *solver,
*/
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,
diff --git a/src/ats/plugin_ats_ril.c b/src/ats/plugin_ats_ril.c
index eac62c4404..a3bdf200c5 100644
--- a/src/ats/plugin_ats_ril.c
+++ b/src/ats/plugin_ats_ril.c
@@ -2373,7 +2373,7 @@ GAS_ril_address_property_changed (void *solver,
*/
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,
diff --git a/src/include/gnunet_ats_plugin.h b/src/include/gnunet_ats_plugin.h
index 731e39d866..27f4a6f0f3 100644
--- a/src/include/gnunet_ats_plugin.h
+++ b/src/include/gnunet_ats_plugin.h
@@ -74,7 +74,7 @@ typedef void
*/
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,
diff --git a/src/namestore/gnunet-service-namestore.c b/src/namestore/gnunet-service-namestore.c
index effb33e515..ae65802b05 100644
--- a/src/namestore/gnunet-service-namestore.c
+++ b/src/namestore/gnunet-service-namestore.c
@@ -61,7 +61,7 @@ struct ZoneIteration
/**
* 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 ZoneIteration
*/
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 @@ struct ZoneMonitor
/**
* 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 @@ struct CacheOperation
/**
* Client to notify about the result.
*/
- struct GNUNET_SERVER_Client *client;
+ struct NamestoreClient *nc;
/**
* Client's request ID.
@@ -225,21 +221,6 @@ static struct GNUNET_NAMESTORE_PluginFunctions *GSN_database;
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,8 +243,7 @@ static struct ZoneMonitor *monitor_tail;
/**
* Notification context shared by all monitors.
*/
-static struct GNUNET_SERVER_NotificationContext *monitor_nc;
-
+static struct GNUNET_NotificationContext *monitor_nc;
/**
@@ -274,17 +254,10 @@ static struct GNUNET_SERVER_NotificationContext *monitor_nc;
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 @@ cleanup_task (void *cls)
}
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 @@ cleanup_task (void *cls)
*
* @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 @@ client_disconnect_notification (void *cls,
}
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);
- GNUNET_free (nc);
for (cop = cop_head; NULL != cop; cop = cop->next)
- if (client == cop->client)
- cop->client = NULL;
+ if (nc == cop->nc)
+ cop->nc = NULL;
+ GNUNET_free (nc);
}
/**
- * 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,14 +375,13 @@ lookup_nick_it (void *cls,
const struct GNUNET_GNSRECORD_Data *rd)
{
struct GNUNET_GNSRECORD_Data **res = cls;
- int c;
if (0 != strcmp (label, GNUNET_GNS_MASTERZONE_STR))
{
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 @@ merge_with_nick_records (const struct GNUNET_GNSRECORD_Data *nick_rd,
* 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,21 +504,20 @@ merge_with_nick_records (const struct GNUNET_GNSRECORD_Data *nick_rd,
* @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,
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;
unsigned int res_count;
size_t name_len;
size_t rd_ser_len;
- size_t msg_size;
char *name_tmp;
char *rd_ser;
@@ -583,31 +540,30 @@ send_lookup_response (struct GNUNET_SERVER_NotificationContext *nc,
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);
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 @@ send_lookup_response (struct GNUNET_SERVER_NotificationContext *nc,
* @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 @@ finish_cache_operation (void *cls,
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 @@ finish_cache_operation (void *cls,
* 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 @@ finish_cache_operation (void *cls,
* @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 @@ refresh_block (struct GNUNET_SERVER_Client *client,
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 @@ refresh_block (struct GNUNET_SERVER_Client *client,
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,75 +782,70 @@ lookup_it (void *cls,
/**
* 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;
-
- if (ntohs (message->size) < sizeof (struct LabelLookupMessage))
- {
- GNUNET_break (0);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
+ const char *name_tmp;
- 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];
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)
{
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 @@ handle_record_lookup (void *cls,
&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 @@ handle_record_lookup (void *cls,
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,44 +950,13 @@ handle_record_store (void *cls,
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];
@@ -1012,8 +967,7 @@ handle_record_store (void *cls,
rd))
{
GNUNET_break (0);
- GNUNET_SERVER_receive_done (client,
- GNUNET_SYSERR);
+ GNUNET_SERVICE_client_drop (nc->client);
return;
}
@@ -1026,7 +980,7 @@ handle_record_store (void *cls,
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 @@ handle_record_store (void *cls,
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 @@ handle_record_store (void *cls,
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 @@ handle_record_store (void *cls,
}
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 @@ handle_zone_to_name_it (void *cls,
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 @@ handle_zone_to_name_it (void *cls,
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,40 +1153,38 @@ handle_zone_to_name_it (void *cls,
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);
}
/**
* 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 @@ handle_zone_to_name (void *cls,
/* 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 @@ handle_zone_to_name (void *cls,
/* 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 @@ struct ZoneIterationProcResult
*/
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,22 +1296,22 @@ zone_iterate_proc (void *cls,
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,
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;
break;
}
if (GNUNET_YES == do_refresh_block)
- refresh_block (NULL, 0,
+ refresh_block (NULL,
+ 0,
zone_key,
name,
rd_count,
@@ -1381,7 +1329,8 @@ static void
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 @@ run_zone_iteration_round (struct ZoneIteration *zi)
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,67 +1375,49 @@ run_zone_iteration_round (struct ZoneIteration *zi)
/**
* 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);
}
/**
* 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,42 +1425,33 @@ handle_iteration_stop (void *cls,
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);
}
/**
* 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 @@ handle_iteration_next (void *cls,
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 @@ handle_iteration_next (void *cls,
static void
monitor_sync (struct ZoneMonitor *zm)
{
- 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);
+ struct GNUNET_MQ_Envelope *env;
+ struct GNUNET_MessageHeader *sync;
+
+ env = GNUNET_MQ_msg (sync,
+ GNUNET_MESSAGE_TYPE_NAMESTORE_MONITOR_SYNC);
+ GNUNET_MQ_send (zm->nc->mq,
+ env);
}
@@ -1600,47 +1518,45 @@ monitor_iterate_cb (void *cls,
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);
}
/**
* 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 @@ monitor_next (void *cls)
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 @@ monitor_next (void *cls)
* 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 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
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 */