From dca2051799b683ced76973359950dbc2e624d56e Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 20 Sep 2016 09:32:30 +0000 Subject: [PATCH] converting scalarproduct alice-ecc to new service API --- src/include/gnunet_protocols.h | 4 +- .../gnunet-service-scalarproduct-ecc_alice.c | 272 +++++++++--------- .../gnunet-service-scalarproduct-ecc_bob.c | 2 +- .../gnunet-service-scalarproduct_alice.c | 2 +- .../gnunet-service-scalarproduct_bob.c | 2 +- src/scalarproduct/scalarproduct_api.c | 4 +- 6 files changed, 141 insertions(+), 145 deletions(-) diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h index 392a4d761..1d2a87691 100644 --- a/src/include/gnunet_protocols.h +++ b/src/include/gnunet_protocols.h @@ -1903,12 +1903,12 @@ extern "C" /** * Client -> Alice multipart */ -#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MUTLIPART_ALICE 642 +#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_ALICE 642 /** * Client -> Bob multipart */ -#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MUTLIPART_BOB 643 +#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_BOB 643 /** * Alice -> Bob session initialization diff --git a/src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c b/src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c index fe27067e8..ba8b4b796 100644 --- a/src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c +++ b/src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2013-2015 GNUnet e.V. + Copyright (C) 2013-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 @@ -93,7 +93,7 @@ struct AliceServiceSession /** * The client this request is related to. */ - struct GNUNET_SERVER_Client *client; + struct GNUNET_SERVICE_Client *client; /** * The message queue for the client. @@ -238,11 +238,6 @@ destroy_service_session (struct AliceServiceSession *s) if (GNUNET_YES == s->in_destroy) return; s->in_destroy = GNUNET_YES; - if (NULL != s->client_mq) - { - GNUNET_MQ_destroy (s->client_mq); - s->client_mq = NULL; - } if (NULL != s->cadet_mq) { GNUNET_MQ_destroy (s->cadet_mq); @@ -250,9 +245,7 @@ destroy_service_session (struct AliceServiceSession *s) } if (NULL != s->client) { - GNUNET_SERVER_client_set_user_context (s->client, - NULL); - GNUNET_SERVER_client_disconnect (s->client); + GNUNET_SERVICE_client_drop (s->client); s->client = NULL; } if (NULL != s->channel) @@ -895,48 +888,23 @@ client_request_complete_alice (struct AliceServiceSession *s) /** - * We're receiving additional set data. Add it to our - * set and if we are done, initiate the transaction. + * We're receiving additional set data. Check if + * @a msg is well-formed. * - * @param cls closure - * @param client identification of the client - * @param message the actual message + * @param cls client identification of the client + * @param msg the actual message + * @return #GNUNET_OK if @a msg is well-formed */ -static void -GSS_handle_alice_client_message_multipart (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) +static int +check_alice_client_message_multipart (void *cls, + const struct ComputationBobCryptodataMultipartMessage *msg) { - const struct ComputationBobCryptodataMultipartMessage * msg; - struct AliceServiceSession *s; + struct AliceServiceSession *s = cls; uint32_t contained_count; - const struct GNUNET_SCALARPRODUCT_Element *elements; - uint32_t i; uint16_t msize; - struct GNUNET_SET_Element set_elem; - struct GNUNET_SCALARPRODUCT_Element *elem; - s = GNUNET_SERVER_client_get_user_context (client, - struct AliceServiceSession); - if (NULL == s) - { - /* session needs to already exist */ - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; - } - msize = ntohs (message->size); - if (msize < sizeof (struct ComputationBobCryptodataMultipartMessage)) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; - } - msg = (const struct ComputationBobCryptodataMultipartMessage *) message; + msize = ntohs (msg->header.size); contained_count = ntohl (msg->element_count_contained); - if ( (msize != (sizeof (struct ComputationBobCryptodataMultipartMessage) + contained_count * sizeof (struct GNUNET_SCALARPRODUCT_Element))) || (0 == contained_count) || @@ -944,18 +912,38 @@ GSS_handle_alice_client_message_multipart (void *cls, (s->total < s->client_received_element_count + contained_count) ) { GNUNET_break_op (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; + return GNUNET_SYSERR; } + return GNUNET_OK; +} + + +/** + * We're receiving additional set data. Add it to our + * set and if we are done, initiate the transaction. + * + * @param cls client identification of the client + * @param msg the actual message + */ +static void +handle_alice_client_message_multipart (void *cls, + const struct ComputationBobCryptodataMultipartMessage *msg) +{ + struct AliceServiceSession *s = cls; + uint32_t contained_count; + const struct GNUNET_SCALARPRODUCT_Element *elements; + struct GNUNET_SET_Element set_elem; + struct GNUNET_SCALARPRODUCT_Element *elem; + + contained_count = ntohl (msg->element_count_contained); s->client_received_element_count += contained_count; elements = (const struct GNUNET_SCALARPRODUCT_Element *) &msg[1]; - for (i = 0; i < contained_count; i++) + for (uint32_t i = 0; i < contained_count; i++) { elem = GNUNET_new (struct GNUNET_SCALARPRODUCT_Element); GNUNET_memcpy (elem, - &elements[i], - sizeof (struct GNUNET_SCALARPRODUCT_Element)); + &elements[i], + sizeof (struct GNUNET_SCALARPRODUCT_Element)); if (GNUNET_SYSERR == GNUNET_CONTAINER_multihashmap_put (s->intersected_elements, &elem->key, @@ -974,8 +962,7 @@ GSS_handle_alice_client_message_multipart (void *cls, NULL, NULL); s->used_element_count++; } - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (s->client); if (s->total != s->client_received_element_count) { /* more to come */ @@ -987,45 +974,29 @@ GSS_handle_alice_client_message_multipart (void *cls, /** * Handler for Alice's client request message. - * We are doing request-initiation to compute a scalar product with a peer. + * Check that @a msg is well-formed. * - * @param cls closure - * @param client identification of the client - * @param message the actual message + * @param cls identification of the client + * @param msg the actual message + * @return #GNUNET_OK if @a msg is well-formed */ -static void -GSS_handle_alice_client_message (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) +static int +check_alice_client_message (void *cls, + const struct AliceComputationMessage *msg) { - const struct AliceComputationMessage *msg; - struct AliceServiceSession *s; - uint32_t contained_count; - uint32_t total_count; - const struct GNUNET_SCALARPRODUCT_Element *elements; - uint32_t i; + struct AliceServiceSession *s = cls; uint16_t msize; - struct GNUNET_SET_Element set_elem; - struct GNUNET_SCALARPRODUCT_Element *elem; + uint32_t total_count; + uint32_t contained_count; - s = GNUNET_SERVER_client_get_user_context (client, - struct AliceServiceSession); - if (NULL != s) + if (NULL != s->intersected_elements) { /* only one concurrent session per client connection allowed, simplifies logic a lot... */ GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - msize = ntohs (message->size); - if (msize < sizeof (struct AliceComputationMessage)) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; + return GNUNET_SYSERR; } - msg = (const struct AliceComputationMessage *) message; + msize = ntohs (msg->header.size); total_count = ntohl (msg->element_count_total); contained_count = ntohl (msg->element_count_contained); if ( (0 == total_count) || @@ -1034,15 +1005,34 @@ GSS_handle_alice_client_message (void *cls, contained_count * sizeof (struct GNUNET_SCALARPRODUCT_Element))) ) { GNUNET_break_op (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; + return GNUNET_SYSERR; } + return GNUNET_OK; +} - s = GNUNET_new (struct AliceServiceSession); + +/** + * Handler for Alice's client request message. + * We are doing request-initiation to compute a scalar product with a peer. + * + * @param cls identification of the client + * @param msg the actual message + */ +static void +handle_alice_client_message (void *cls, + const struct AliceComputationMessage *msg) +{ + struct AliceServiceSession *s = cls; + uint32_t contained_count; + uint32_t total_count; + const struct GNUNET_SCALARPRODUCT_Element *elements; + struct GNUNET_SET_Element set_elem; + struct GNUNET_SCALARPRODUCT_Element *elem; + + total_count = ntohl (msg->element_count_total); + contained_count = ntohl (msg->element_count_contained); s->peer = msg->peer; s->status = GNUNET_SCALARPRODUCT_STATUS_ACTIVE; - s->client = client; - s->client_mq = GNUNET_MQ_queue_for_server_client (client); s->total = total_count; s->client_received_element_count = contained_count; s->session_id = msg->session_key; @@ -1051,14 +1041,14 @@ GSS_handle_alice_client_message (void *cls, GNUNET_YES); s->intersection_set = GNUNET_SET_create (cfg, GNUNET_SET_OPERATION_INTERSECTION); - for (i = 0; i < contained_count; i++) + for (uint32_t i = 0; i < contained_count; i++) { if (0 == GNUNET_ntohll (elements[i].value)) continue; elem = GNUNET_new (struct GNUNET_SCALARPRODUCT_Element); GNUNET_memcpy (elem, - &elements[i], - sizeof (struct GNUNET_SCALARPRODUCT_Element)); + &elements[i], + sizeof (struct GNUNET_SCALARPRODUCT_Element)); if (GNUNET_SYSERR == GNUNET_CONTAINER_multihashmap_put (s->intersected_elements, &elem->key, @@ -1078,10 +1068,7 @@ GSS_handle_alice_client_message (void *cls, NULL, NULL); s->used_element_count++; } - GNUNET_SERVER_client_set_user_context (client, - s); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (s->client); if (s->total != s->client_received_element_count) { /* wait for multipart msg */ @@ -1116,6 +1103,30 @@ shutdown_task (void *cls) } +/** + * A client connected. + * + * Setup the associated data structure. + * + * @param cls closure, NULL + * @param client identification of the client + * @param mq message queue to communicate with @a client + * @return our `struct AliceServiceSession` + */ +static void * +client_connect_cb (void *cls, + struct GNUNET_SERVICE_Client *client, + struct GNUNET_MQ_Handle *mq) +{ + struct AliceServiceSession *s; + + s = GNUNET_new (struct AliceServiceSession); + s->client = client; + s->client_mq = mq; + return s; +} + + /** * A client disconnected. * @@ -1124,25 +1135,20 @@ shutdown_task (void *cls) * * @param cls closure, NULL * @param client identification of the client + * @param app_cls our `struct AliceServiceSession` */ static void -handle_client_disconnect (void *cls, - struct GNUNET_SERVER_Client *client) +client_disconnect_cb (void *cls, + struct GNUNET_SERVICE_Client *client, + void *app_cls) { - struct AliceServiceSession *s; + struct AliceServiceSession *s = app_cls; - if (NULL == client) - return; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client %p disconnected from us.\n", client); - s = GNUNET_SERVER_client_get_user_context (client, - struct AliceServiceSession); - if (NULL == s) - return; s->client = NULL; - GNUNET_SERVER_client_set_user_context (client, - NULL); + s->client_mq = NULL; destroy_service_session (s); } @@ -1151,13 +1157,13 @@ handle_client_disconnect (void *cls, * Initialization of the program and message handlers * * @param cls closure - * @param server the initialized server * @param c configuration to use + * @param service the initialized service */ static void run (void *cls, - struct GNUNET_SERVER_Handle *server, - const struct GNUNET_CONFIGURATION_Handle *c) + const struct GNUNET_CONFIGURATION_Handle *c, + struct GNUNET_SERVICE_Handle *service) { static const struct GNUNET_CADET_MessageHandler cadet_handlers[] = { { &handle_bobs_cryptodata_message, @@ -1165,15 +1171,6 @@ run (void *cls, 0}, { NULL, 0, 0} }; - static const struct GNUNET_SERVER_MessageHandler server_handlers[] = { - { &GSS_handle_alice_client_message, NULL, - GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_TO_ALICE, - 0}, - { &GSS_handle_alice_client_message_multipart, NULL, - GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MUTLIPART_ALICE, - 0}, - { NULL, NULL, 0, 0} - }; cfg = c; edc = GNUNET_CRYPTO_ecc_dlog_prepare (MAX_RESULT, @@ -1182,12 +1179,8 @@ run (void *cls, GNUNET_CRYPTO_ecc_rnd_mpi (edc, &my_privkey, &my_privkey_inv); - GNUNET_SERVER_add_handlers (server, - server_handlers); - GNUNET_SERVER_disconnect_notify (server, - &handle_client_disconnect, - NULL); - my_cadet = GNUNET_CADET_connect (cfg, NULL, + my_cadet = GNUNET_CADET_connect (cfg, + NULL, &cb_channel_destruction, cadet_handlers); if (NULL == my_cadet) @@ -1204,21 +1197,24 @@ run (void *cls, /** - * The main function for the scalarproduct 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, - "scalarproduct-alice", - GNUNET_SERVICE_OPTION_NONE, - &run, NULL)) ? 0 : 1; -} +GNUNET_SERVICE_MAIN +("scalarproduct-alice", + GNUNET_SERVICE_OPTION_NONE, + &run, + &client_connect_cb, + &client_disconnect_cb, + NULL, + GNUNET_MQ_hd_var_size (alice_client_message, + GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_TO_ALICE, + struct AliceComputationMessage, + NULL), + GNUNET_MQ_hd_var_size (alice_client_message_multipart, + GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_ALICE, + struct ComputationBobCryptodataMultipartMessage, + NULL), + GNUNET_MQ_handler_end ()); + /* end of gnunet-service-scalarproduct-ecc_alice.c */ diff --git a/src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c b/src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c index db656d39b..7942c0b3d 100644 --- a/src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c +++ b/src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c @@ -1231,7 +1231,7 @@ run (void *cls, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_TO_BOB, 0}, { &GSS_handle_bob_client_message_multipart, NULL, - GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MUTLIPART_BOB, + GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_BOB, 0}, { NULL, NULL, 0, 0} }; diff --git a/src/scalarproduct/gnunet-service-scalarproduct_alice.c b/src/scalarproduct/gnunet-service-scalarproduct_alice.c index 0df7da00c..51bfcb80f 100644 --- a/src/scalarproduct/gnunet-service-scalarproduct_alice.c +++ b/src/scalarproduct/gnunet-service-scalarproduct_alice.c @@ -1387,7 +1387,7 @@ run (void *cls, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_TO_ALICE, 0}, { &GSS_handle_alice_client_message_multipart, NULL, - GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MUTLIPART_ALICE, + GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_ALICE, 0}, { NULL, NULL, 0, 0} }; diff --git a/src/scalarproduct/gnunet-service-scalarproduct_bob.c b/src/scalarproduct/gnunet-service-scalarproduct_bob.c index 1136f1e00..a19c909e1 100644 --- a/src/scalarproduct/gnunet-service-scalarproduct_bob.c +++ b/src/scalarproduct/gnunet-service-scalarproduct_bob.c @@ -1511,7 +1511,7 @@ run (void *cls, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_TO_BOB, 0}, { &GSS_handle_bob_client_message_multipart, NULL, - GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MUTLIPART_BOB, + GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_BOB, 0}, { NULL, NULL, 0, 0} }; diff --git a/src/scalarproduct/scalarproduct_api.c b/src/scalarproduct/scalarproduct_api.c index 5ad64f4be..9606851c8 100644 --- a/src/scalarproduct/scalarproduct_api.c +++ b/src/scalarproduct/scalarproduct_api.c @@ -294,7 +294,7 @@ GNUNET_SCALARPRODUCT_accept_computation (const struct GNUNET_CONFIGURATION_Handl size = todo * sizeof (struct GNUNET_SCALARPRODUCT_Element); env = GNUNET_MQ_msg_extra (mmsg, size, - GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MUTLIPART_BOB); + GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_BOB); mmsg->element_count_contained = htonl (todo); GNUNET_memcpy (&mmsg[1], &elements[element_count_transfered], @@ -454,7 +454,7 @@ GNUNET_SCALARPRODUCT_start_computation (const struct GNUNET_CONFIGURATION_Handle size = todo * sizeof (struct GNUNET_SCALARPRODUCT_Element); env = GNUNET_MQ_msg_extra (mmsg, size, - GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MUTLIPART_ALICE); + GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_ALICE); mmsg->element_count_contained = htonl (todo); GNUNET_memcpy (&mmsg[1], &elements[element_count_transfered], -- 2.25.1