X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fscalarproduct%2Fscalarproduct_api.c;h=dcacd85c98152c7ee1f11d21977b4e6738915610;hb=27c12911f4f2aba2d90099270d70de846e83854f;hp=b3390f349a47c0b635c150daba9a255ea80d2d4f;hpb=dc91365855b72f0c97c0a7abc6eac7d479704daf;p=oweals%2Fgnunet.git diff --git a/src/scalarproduct/scalarproduct_api.c b/src/scalarproduct/scalarproduct_api.c index b3390f349..dcacd85c9 100644 --- a/src/scalarproduct/scalarproduct_api.c +++ b/src/scalarproduct/scalarproduct_api.c @@ -23,7 +23,7 @@ * @brief API for the scalarproduct * @author Christian Fuchs * @author Gaurav Kukreja - * + * */ #include "platform.h" #include "gnunet_util_lib.h" @@ -38,6 +38,13 @@ *** Datatype Declarations ********** **************************************************************/ +/** + * the abstraction function for our internal callback + */ +typedef void (*GNUNET_SCALARPRODUCT_ResponseMessageHandler) (void *cls, + const struct GNUNET_MessageHeader *msg, + enum GNUNET_SCALARPRODUCT_ResponseStatus status); + /** * Entry in the request queue per client */ @@ -71,7 +78,7 @@ struct GNUNET_SCALARPRODUCT_ComputationHandle /** * The shared session key identifying this computation */ - struct GNUNET_HashCode * key; + struct GNUNET_HashCode key; /** * Current transmit handle. @@ -88,17 +95,20 @@ struct GNUNET_SCALARPRODUCT_ComputationHandle */ struct GNUNET_SCALARPRODUCT_client_request * msg; + /** + * The msg handler callback + */ union { - /** - * Function to call after transmission of the request. - */ - GNUNET_SCALARPRODUCT_ContinuationWithStatus cont_status; - - /** - * Function to call after transmission of the request. - */ - GNUNET_SCALARPRODUCT_DatumProcessor cont_datum; + /** + * Function to call after transmission of the request. + */ + GNUNET_SCALARPRODUCT_ContinuationWithStatus cont_status; + + /** + * Function to call after transmission of the request. + */ + GNUNET_SCALARPRODUCT_DatumProcessor cont_datum; }; /** @@ -138,11 +148,11 @@ GNUNET_SCALARPRODUCT_cancel (struct GNUNET_SCALARPRODUCT_ComputationHandle * h); /** - * Handles the RESULT received in reply of prepare_response from the - * service - * - * @param cls Handle to the Master Context + * Handles the STATUS received from the service for a response, does not contain a payload + * + * @param cls our Handle * @param msg Pointer to the response received + * @param status the condition the request was terminated with (eg: disconnect) */ static void process_status_message (void *cls, @@ -156,11 +166,11 @@ process_status_message (void *cls, /** - * Handles the RESULT received in reply of prepare_response from the - * service - * - * @param cls Handle to the Master Context + * Handles the RESULT received from the service for a request, should contain a result MPI value + * + * @param cls our Handle * @param msg Pointer to the response received + * @param status the condition the request was terminated with (eg: disconnect) */ static void process_result_message (void *cls, @@ -173,8 +183,7 @@ process_result_message (void *cls, gcry_mpi_t result = NULL; gcry_error_t rc; - if (GNUNET_SCALARPRODUCT_Status_Success == status - && qe->cont_datum != NULL) + if (GNUNET_SCALARPRODUCT_Status_Success == status) { size_t product_len = ntohl (message->product_length); result = gcry_mpi_new (0); @@ -184,7 +193,7 @@ process_result_message (void *cls, gcry_mpi_t num; size_t read = 0; - if (0 != (rc = gcry_mpi_scan (&num, GCRYMPI_FMT_USG, &msg[1], product_len, &read))) + if (0 != (rc = gcry_mpi_scan (&num, GCRYMPI_FMT_STD, &message[1], product_len, &read))) { LOG_GCRY(GNUNET_ERROR_TYPE_ERROR, "gcry_mpi_scan", rc); gcry_mpi_release (result); @@ -193,9 +202,9 @@ process_result_message (void *cls, } else { - if (message->range > 0) + if (0 < message->range) gcry_mpi_add (result, result, num); - else + else if (0 > message->range) gcry_mpi_sub (result, result, num); gcry_mpi_release (num); } @@ -206,10 +215,10 @@ process_result_message (void *cls, /** - * Called when a response is received from the service. After basic check + * Called when a response is received from the service. After basic check, the * handler in qe->response_proc is called. This functions handles the response * to the client which used the API. - * + * * @param cls Pointer to the Master Context * @param msg Pointer to the data received in response */ @@ -243,17 +252,18 @@ receive_cb (void *cls, const struct GNUNET_MessageHeader *msg) if (qe->cont_datum != NULL) qe->response_proc (qe, msg, status); + GNUNET_CONTAINER_DLL_remove (head, tail, qe); GNUNET_free (qe); } /** - * Transmits the request to the VectorProduct Sevice - * + * Transmits the request to the VectorProduct Service + * * @param cls Closure * @param size Size of the buffer * @param buf Pointer to the buffer - * + * * @return Size of the message sent */ static size_t @@ -272,6 +282,7 @@ transmit_request (void *cls, size_t size, // notify caller about the error, done here. if (qe->cont_datum != NULL) qe->response_proc (qe, NULL, GNUNET_SCALARPRODUCT_Status_Failure); + GNUNET_SCALARPRODUCT_cancel (cls); return 0; } @@ -299,22 +310,24 @@ transmit_request (void *cls, size_t size, /** - * Used by Bob's client to cooperate with Alice, - * - * @param h handle to the master context - * @param key Session key - unique to the requesting client + * Used by Bob's client to cooperate with Alice, + * + * @param cfg the gnunet configuration handle + * @param key Session key unique to the requesting client * @param elements Array of elements of the vector * @param element_count Number of elements in the vector * @param cont Callback function * @param cont_cls Closure for the callback function + * + * @return a new handle for this computation */ struct GNUNET_SCALARPRODUCT_ComputationHandle * -GNUNET_SCALARPRODUCT_response (const struct GNUNET_CONFIGURATION_Handle *cfg, +GNUNET_SCALARPRODUCT_response (const struct GNUNET_CONFIGURATION_Handle * cfg, const struct GNUNET_HashCode * key, const int32_t * elements, uint32_t element_count, GNUNET_SCALARPRODUCT_ContinuationWithStatus cont, - void *cont_cls) + void * cont_cls) { struct GNUNET_SCALARPRODUCT_ComputationHandle *h; struct GNUNET_SCALARPRODUCT_client_request *msg; @@ -322,12 +335,8 @@ GNUNET_SCALARPRODUCT_response (const struct GNUNET_CONFIGURATION_Handle *cfg, uint16_t size; uint64_t i; - GNUNET_assert (key); - GNUNET_assert (elements); - GNUNET_assert (cont); - GNUNET_assert (element_count > 1); GNUNET_assert (GNUNET_SERVER_MAX_MESSAGE_SIZE >= sizeof (struct GNUNET_SCALARPRODUCT_client_request) - +element_count * sizeof (int32_t)); + + element_count * sizeof (int32_t)); h = GNUNET_new (struct GNUNET_SCALARPRODUCT_ComputationHandle); h->client = GNUNET_CLIENT_connect ("scalarproduct", cfg); if (!h->client) @@ -338,7 +347,7 @@ GNUNET_SCALARPRODUCT_response (const struct GNUNET_CONFIGURATION_Handle *cfg, return NULL; } h->stats = GNUNET_STATISTICS_create ("scalarproduct-api", cfg); - if (!h->th) + if (!h->stats) { LOG (GNUNET_ERROR_TYPE_ERROR, _ ("Failed to send a message to the statistics service\n")); @@ -347,18 +356,18 @@ GNUNET_SCALARPRODUCT_response (const struct GNUNET_CONFIGURATION_Handle *cfg, return NULL; } - size = sizeof (struct GNUNET_SCALARPRODUCT_client_request) +element_count * sizeof (int32_t); + size = sizeof (struct GNUNET_SCALARPRODUCT_client_request) + element_count * sizeof (int32_t); h->cont_status = cont; h->cont_cls = cont_cls; - h->response_proc = &process_result_message; + h->response_proc = &process_status_message; h->cfg = cfg; - h->msg = GNUNET_malloc (size); memcpy (&h->key, key, sizeof (struct GNUNET_HashCode)); - msg = (struct GNUNET_SCALARPRODUCT_client_request*) h->msg; + msg = (struct GNUNET_SCALARPRODUCT_client_request*) GNUNET_malloc (size); + h->msg = msg; msg->header.size = htons (size); - msg->header.type = htons (GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_TO_ALICE); + msg->header.type = htons (GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_TO_BOB); msg->element_count = htonl (element_count); vector = (int32_t*) & msg[1]; @@ -389,9 +398,9 @@ GNUNET_SCALARPRODUCT_response (const struct GNUNET_CONFIGURATION_Handle *cfg, /** * Request by Alice's client for computing a scalar product - * - * @param h handle to the master context - * @param key Session key - unique to the requesting client + * + * @param cfg the gnunet configuration handle + * @param key Session key should be unique to the requesting client * @param peer PeerID of the other peer * @param elements Array of elements of the vector * @param element_count Number of elements in the vector @@ -399,9 +408,11 @@ GNUNET_SCALARPRODUCT_response (const struct GNUNET_CONFIGURATION_Handle *cfg, * @param mask_bytes number of bytes in the mask * @param cont Callback function * @param cont_cls Closure for the callback function + * + * @return a new handle for this computation */ struct GNUNET_SCALARPRODUCT_ComputationHandle * -GNUNET_SCALARPRODUCT_request (const struct GNUNET_CONFIGURATION_Handle *cfg, +GNUNET_SCALARPRODUCT_request (const struct GNUNET_CONFIGURATION_Handle * cfg, const struct GNUNET_HashCode * key, const struct GNUNET_PeerIdentity *peer, const int32_t * elements, @@ -409,7 +420,7 @@ GNUNET_SCALARPRODUCT_request (const struct GNUNET_CONFIGURATION_Handle *cfg, const unsigned char * mask, uint32_t mask_bytes, GNUNET_SCALARPRODUCT_DatumProcessor cont, - void *cont_cls) + void * cont_cls) { struct GNUNET_SCALARPRODUCT_ComputationHandle *h; struct GNUNET_SCALARPRODUCT_client_request *msg; @@ -431,7 +442,7 @@ GNUNET_SCALARPRODUCT_request (const struct GNUNET_CONFIGURATION_Handle *cfg, return NULL; } h->stats = GNUNET_STATISTICS_create ("scalarproduct-api", cfg); - if (!h->th) + if (!h->stats) { LOG (GNUNET_ERROR_TYPE_ERROR, _ ("Failed to send a message to the statistics service\n")); @@ -440,20 +451,20 @@ GNUNET_SCALARPRODUCT_request (const struct GNUNET_CONFIGURATION_Handle *cfg, return NULL; } - size = sizeof (struct GNUNET_SCALARPRODUCT_client_request) +element_count * sizeof (int32_t) + mask_bytes; + size = sizeof (struct GNUNET_SCALARPRODUCT_client_request) + element_count * sizeof (int32_t) + mask_bytes; h->cont_datum = cont; h->cont_cls = cont_cls; - h->response_proc = &process_status_message; + h->response_proc = &process_result_message; h->cfg = cfg; - h->msg = GNUNET_malloc (size); memcpy (&h->key, key, sizeof (struct GNUNET_HashCode)); - msg = (struct GNUNET_SCALARPRODUCT_client_request*) h->msg; + msg = (struct GNUNET_SCALARPRODUCT_client_request*) GNUNET_malloc (size); + h->msg = msg; msg->header.size = htons (size); msg->header.type = htons (GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_TO_ALICE); - msg->element_count = htons (element_count); - msg->mask_length = htons (mask_bytes); + msg->element_count = htonl (element_count); + msg->mask_length = htonl (mask_bytes); vector = (int32_t*) & msg[1]; // copy each element over to the message @@ -484,9 +495,10 @@ GNUNET_SCALARPRODUCT_request (const struct GNUNET_CONFIGURATION_Handle *cfg, /** - * Disconnect from the scalarproduct service. - * - * @param h a computation handle to cancel + * Cancel an ongoing computation or revoke our collaboration offer. + * Closes the connection to the service + * + * @param h computation handle to terminate */ void GNUNET_SCALARPRODUCT_cancel (struct GNUNET_SCALARPRODUCT_ComputationHandle * h) @@ -498,18 +510,18 @@ GNUNET_SCALARPRODUCT_cancel (struct GNUNET_SCALARPRODUCT_ComputationHandle * h) if (qe == h) { GNUNET_CONTAINER_DLL_remove (head, tail, qe); - if (NULL == qe->th) + if (NULL != qe->th) GNUNET_CLIENT_notify_transmit_ready_cancel (qe->th); GNUNET_CLIENT_disconnect (qe->client); GNUNET_STATISTICS_destroy (qe->stats, GNUNET_YES); - GNUNET_free (qe->msg); + GNUNET_free_non_null (qe->msg); GNUNET_free (qe); break; } } } /** - * Cancel ALL our ongoing scalar product computations and collaboration offers. + * Cancel ALL ongoing computation or revoke our collaboration offer. * Closes ALL connections to the service */ void @@ -521,13 +533,13 @@ GNUNET_SCALARPRODUCT_disconnect () for (qe = head; head != NULL; qe = head) { GNUNET_CONTAINER_DLL_remove (head, tail, qe); - if (NULL == qe->th) + if (NULL != qe->th) GNUNET_CLIENT_notify_transmit_ready_cancel (qe->th); GNUNET_CLIENT_disconnect (qe->client); GNUNET_STATISTICS_destroy (qe->stats, GNUNET_YES); - GNUNET_free (qe->msg); + GNUNET_free_non_null (qe->msg); GNUNET_free (qe); } } -/* end of ext_api.c */ +/* end of scalarproduct_api.c */