X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fdv%2Fgnunet-service-dv.c;h=3fbd0cc030459710be5c81784a1197997342156d;hb=633c9ed2d8392f0620dee12513f65a4cc602ea60;hp=3b79b474f9004d20aa9b708a2773f78eaa5f48ac;hpb=22be4f71e12c7f2eacafe03d94d4d1c86bc72f0a;p=oweals%2Fgnunet.git diff --git a/src/dv/gnunet-service-dv.c b/src/dv/gnunet-service-dv.c index 3b79b474f..3fbd0cc03 100644 --- a/src/dv/gnunet-service-dv.c +++ b/src/dv/gnunet-service-dv.c @@ -134,7 +134,7 @@ struct DirectNeighbor /** * Identity of the peer. */ - const struct GNUNET_PeerIdentity *peer; + struct GNUNET_PeerIdentity peer; /** * Session ID we use whenever we create a set union with @@ -323,7 +323,7 @@ static const struct GNUNET_CONFIGURATION_Handle *cfg; * Hopefully this client will never change, although if the plugin * dies and returns for some reason it may happen. */ -static struct GNUNET_SERVER_NotificationContext *nc; +static struct GNUNET_NotificationContext *nc; /** * Handle for the statistics service. @@ -410,9 +410,9 @@ send_data_to_plugin (const struct GNUNET_MessageHeader *message, received_msg->distance = htonl (distance); received_msg->sender = *origin; GNUNET_memcpy (&received_msg[1], message, ntohs (message->size)); - GNUNET_SERVER_notification_context_broadcast (nc, - &received_msg->header, - GNUNET_YES); + GNUNET_notification_context_broadcast (nc, + &received_msg->header, + GNUNET_YES); GNUNET_free (received_msg); } @@ -425,9 +425,9 @@ send_data_to_plugin (const struct GNUNET_MessageHeader *message, static void send_control_to_plugin (const struct GNUNET_MessageHeader *message) { - GNUNET_SERVER_notification_context_broadcast (nc, - message, - GNUNET_NO); + GNUNET_notification_context_broadcast (nc, + message, + GNUNET_NO); } @@ -678,7 +678,7 @@ build_set (void *cls) /* we have added all elements to the set, run the operation */ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Finished building my SET for peer `%s' with %u elements, committing\n", - GNUNET_i2s (neighbor->peer), + GNUNET_i2s (&neighbor->peer), neighbor->consensus_elements); GNUNET_SET_commit (neighbor->set_op, neighbor->my_set); @@ -701,7 +701,7 @@ build_set (void *cls) &my_identity, sizeof (my_identity))) && (0 != memcmp (&target->peer, - neighbor->peer, + &neighbor->peer, sizeof (struct GNUNET_PeerIdentity))) ) { /* Add target if it is not the neighbor or this peer */ @@ -734,26 +734,26 @@ handle_direct_connect (struct DirectNeighbor *neighbor) GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Direct connection to %s established, routing table exchange begins.\n", - GNUNET_i2s (neighbor->peer)); + GNUNET_i2s (&neighbor->peer)); GNUNET_STATISTICS_update (stats, "# peers connected (1-hop)", 1, GNUNET_NO); route = GNUNET_CONTAINER_multipeermap_get (all_routes, - neighbor->peer); + &neighbor->peer); if (NULL != route) { GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multipeermap_remove (all_routes, - neighbor->peer, + &neighbor->peer, route)); - send_disconnect_to_plugin (neighbor->peer); + send_disconnect_to_plugin (&neighbor->peer); release_route (route); GNUNET_free (route); } neighbor->direct_route = GNUNET_new (struct Route); neighbor->direct_route->next_hop = neighbor; - neighbor->direct_route->target.peer = *neighbor->peer; + neighbor->direct_route->target.peer = neighbor->peer; allocate_route (neighbor->direct_route, DIRECT_NEIGHBOR_COST); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -765,7 +765,7 @@ handle_direct_connect (struct DirectNeighbor *neighbor) GNUNET_CRYPTO_hash (&my_identity, sizeof (my_identity), &h1); - GNUNET_CRYPTO_hash (neighbor->peer, + GNUNET_CRYPTO_hash (&neighbor->peer, sizeof (struct GNUNET_PeerIdentity), &h2); GNUNET_CRYPTO_hash_xor (&h1, @@ -799,7 +799,7 @@ handle_direct_connect (struct DirectNeighbor *neighbor) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting SET listen operation with peer `%s'\n", - GNUNET_i2s(&neighbor->peer)); + GNUNET_i2s (&neighbor->peer)); neighbor->listen_handle = GNUNET_SET_listen (cfg, GNUNET_SET_OPERATION_UNION, &neighbor->real_session_id, @@ -851,10 +851,10 @@ handle_core_connect (void *cls, "Core connected to %s (distance unknown)\n", GNUNET_i2s (peer)); neighbor = GNUNET_new (struct DirectNeighbor); - neighbor->peer = peer; + neighbor->peer = *peer; GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multipeermap_put (direct_neighbors, - neighbor->peer, + &neighbor->peer, neighbor, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); neighbor->connected = GNUNET_YES; @@ -1056,19 +1056,12 @@ handle_direct_disconnect (struct DirectNeighbor *neighbor) GNUNET_CONTAINER_multipeermap_iterate (all_routes, &cull_routes, neighbor); - if (NULL != neighbor->cth) - { - GNUNET_CORE_notify_transmit_ready_cancel (neighbor->cth); - neighbor->cth = NULL; - } - if (NULL != neighbor->direct_route) { release_route (neighbor->direct_route); GNUNET_free (neighbor->direct_route); neighbor->direct_route = NULL; } - if (NULL != neighbor->neighbor_table_consensus) { GNUNET_CONTAINER_multipeermap_iterate (neighbor->neighbor_table_consensus, @@ -1189,7 +1182,7 @@ handle_ats_update (void *cls, neighbor->peer = address->peer; GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multipeermap_put (direct_neighbors, - &address->peer, + &neighbor->peer, neighbor, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); neighbor->connected = GNUNET_NO; /* not yet */ @@ -1353,16 +1346,19 @@ check_target_added (void *cls, * * @param cls the `struct DirectNeighbor` we're building the consensus with * @param element a result element, only valid if status is #GNUNET_SET_STATUS_OK + * @param current_size current set size * @param status see `enum GNUNET_SET_Status` */ static void handle_set_union_result (void *cls, const struct GNUNET_SET_Element *element, + uint64_t current_size, enum GNUNET_SET_Status status) { struct DirectNeighbor *neighbor = cls; struct DirectNeighbor *dn; struct Target *target; + const struct Target *ctarget; char *status_str; switch (status) @@ -1395,7 +1391,11 @@ handle_set_union_result (void *cls, GNUNET_break_op (0); return; } - if ( (NULL != (dn = GNUNET_CONTAINER_multipeermap_get (direct_neighbors, &((struct Target *) element->data)->peer))) && (DIRECT_NEIGHBOR_COST == dn->distance) ) + ctarget = element->data; + if ( (NULL != + (dn = GNUNET_CONTAINER_multipeermap_get (direct_neighbors, + &ctarget->peer))) && + (DIRECT_NEIGHBOR_COST == dn->distance) ) { /* this is a direct neighbor of ours, we do not care about routes to this peer */ @@ -1515,7 +1515,7 @@ listen_set_union (void *cls, return; /* why??? */ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting to create consensus with %s\n", - GNUNET_i2s (neighbor->peer)); + GNUNET_i2s (&neighbor->peer)); if (NULL != neighbor->set_op) { GNUNET_SET_operation_cancel (neighbor->set_op); @@ -1530,6 +1530,7 @@ listen_set_union (void *cls, GNUNET_SET_OPERATION_UNION); neighbor->set_op = GNUNET_SET_accept (request, GNUNET_SET_RESULT_ADDED, + (struct GNUNET_SET_Option[]) {{ 0 }}, &handle_set_union_result, neighbor); neighbor->consensus_insertion_offset = 0; @@ -1560,6 +1561,7 @@ initiate_set_union (void *cls) &neighbor->real_session_id, NULL, GNUNET_SET_RESULT_ADDED, + (struct GNUNET_SET_Option[]) {{ 0 }}, &handle_set_union_result, neighbor); neighbor->consensus_insertion_offset = 0; @@ -1581,7 +1583,7 @@ check_dv_route_message (void *cls, const struct RouteMessage *rm) { const struct GNUNET_MessageHeader *payload; - + if (ntohs (rm->header.size) < sizeof (struct RouteMessage) + sizeof (struct GNUNET_MessageHeader)) { GNUNET_break_op (0); @@ -1595,7 +1597,7 @@ check_dv_route_message (void *cls, } return GNUNET_OK; } - + /** * Core handler for DV data messages. Whatever this message @@ -1610,9 +1612,10 @@ static void handle_dv_route_message (void *cls, const struct RouteMessage *rm) { + struct DirectNeighbor *neighbor = cls; const struct GNUNET_MessageHeader *payload; struct Route *route; - struct DirectNeighbor *neighbor; + struct DirectNeighbor *nneighbor; struct DirectNeighbor *dn; struct Target *target; uint32_t distance; @@ -1623,7 +1626,7 @@ handle_dv_route_message (void *cls, distance = ntohl (rm->distance); payload = (const struct GNUNET_MessageHeader *) &rm[1]; - strncpy (prev, GNUNET_i2s (peer), 4); + strncpy (prev, GNUNET_i2s (&neighbor->peer), 4); strncpy (me, GNUNET_i2s (&my_identity), 4); strncpy (src, GNUNET_i2s (&rm->sender), 4); strncpy (dst, GNUNET_i2s (&rm->target), 4); @@ -1662,13 +1665,6 @@ handle_dv_route_message (void *cls, (distance < DEFAULT_FISHEYE_DEPTH) ) { /* don't have reverse route yet, learn it! */ - neighbor = GNUNET_CONTAINER_multipeermap_get (direct_neighbors, - peer); - if (NULL == neighbor) - { - GNUNET_break (0); - return; - } target = GNUNET_new (struct Target); target->peer = rm->sender; target->distance = htonl (distance); @@ -1708,13 +1704,6 @@ handle_dv_route_message (void *cls, "Learning sender %s at distance %u from forwarding!\n", GNUNET_i2s (&rm->sender), 1 + distance); - neighbor = GNUNET_CONTAINER_multipeermap_get (direct_neighbors, - peer); - if (NULL == neighbor) - { - GNUNET_break (0); - return; - } target = GNUNET_new (struct Target); target->peer = rm->sender; target->distance = htonl (distance); @@ -1737,9 +1726,9 @@ handle_dv_route_message (void *cls, &rm->target); if (NULL == route) { - neighbor = GNUNET_CONTAINER_multipeermap_get (direct_neighbors, + nneighbor = GNUNET_CONTAINER_multipeermap_get (direct_neighbors, &rm->target); - if (NULL == neighbor) + if (NULL == nneighbor) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "No route to %s, not routing %u bytes!\n", @@ -1753,12 +1742,12 @@ handle_dv_route_message (void *cls, } else { - neighbor = route->next_hop; + nneighbor = route->next_hop; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Forwarding message to %s\n", - GNUNET_i2s (neighbor->peer)); - forward_payload (neighbor, + GNUNET_i2s (&nneighbor->peer)); + forward_payload (nneighbor, distance + 1, &rm->sender, &rm->target, @@ -1767,36 +1756,50 @@ handle_dv_route_message (void *cls, /** - * Service server's handler for message send requests (which come - * bubbling up to us through the DV plugin). + * Check that @a msg is well-formed * - * @param cls closure - * @param client identification of the client + * @param cls identification of the client * @param message the actual message + * @return #GNUNET_OK if @a msg is well-formed */ -static void -handle_dv_send_message (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) +static int +check_dv_send_message (void *cls, + const struct GNUNET_DV_SendMessage *msg) { - struct Route *route; - const struct GNUNET_DV_SendMessage *msg; const struct GNUNET_MessageHeader *payload; - if (ntohs (message->size) < sizeof (struct GNUNET_DV_SendMessage) + sizeof (struct GNUNET_MessageHeader)) + if (ntohs (msg->header.size) < sizeof (struct GNUNET_DV_SendMessage) + + sizeof (struct GNUNET_MessageHeader)) { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; + return GNUNET_SYSERR; } - msg = (const struct GNUNET_DV_SendMessage *) message; payload = (const struct GNUNET_MessageHeader *) &msg[1]; - if (ntohs (message->size) != sizeof (struct GNUNET_DV_SendMessage) + ntohs (payload->size)) + if (ntohs (msg->header.size) != sizeof (struct GNUNET_DV_SendMessage) + ntohs (payload->size)) { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; + return GNUNET_SYSERR; } + return GNUNET_OK; +} + + +/** + * Service server's handler for message send requests (which come + * bubbling up to us through the DV plugin). + * + * @param cls identification of the client + * @param message the actual message + */ +static void +handle_dv_send_message (void *cls, + const struct GNUNET_DV_SendMessage *msg) +{ + struct GNUNET_SERVICE_Client *client = cls; + struct Route *route; + const struct GNUNET_MessageHeader *payload; + + payload = (const struct GNUNET_MessageHeader *) &msg[1]; route = GNUNET_CONTAINER_multipeermap_get (all_routes, &msg->target); if (NULL == route) @@ -1809,7 +1812,7 @@ handle_dv_send_message (void *cls, GNUNET_STATISTICS_update (stats, "# local messages discarded (no route)", 1, GNUNET_NO); - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_continue (client); return; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -1823,7 +1826,7 @@ handle_dv_send_message (void *cls, &my_identity, &msg->target, payload); - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_continue (client); } @@ -1838,7 +1841,7 @@ cleanup_neighbor (struct DirectNeighbor *neighbor) handle_direct_disconnect (neighbor); GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multipeermap_remove (direct_neighbors, - neighbor->peer, + &neighbor->peer, neighbor)); GNUNET_free (neighbor); } @@ -1937,7 +1940,7 @@ shutdown_task (void *cls) in_shutdown = GNUNET_YES; GNUNET_assert (NULL != core_api); - GNUNET_CORE_disconnecT (core_api); + GNUNET_CORE_disconnect (core_api); core_api = NULL; GNUNET_ATS_performance_done (ats); ats = NULL; @@ -1951,7 +1954,7 @@ shutdown_task (void *cls) GNUNET_CONTAINER_multipeermap_destroy (all_routes); GNUNET_STATISTICS_destroy (stats, GNUNET_NO); stats = NULL; - GNUNET_SERVER_notification_context_destroy (nc); + GNUNET_notification_context_destroy (nc); nc = NULL; for (i=0;itarget.distance); - cm.peer = route->target.peer; - - GNUNET_SERVER_notification_context_unicast (nc, - client, - &cm.header, - GNUNET_NO); + struct GNUNET_MQ_Envelope *env; + struct GNUNET_DV_ConnectMessage *cm; + + env = GNUNET_MQ_msg (cm, + GNUNET_MESSAGE_TYPE_DV_CONNECT); + cm->distance = htonl (route->target.distance); + cm->peer = route->target.peer; + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), + env); return GNUNET_OK; } @@ -2008,11 +2008,13 @@ notify_client_about_route (void *cls, */ static void handle_start (void *cls, - struct GNUNET_SERVER_Client *client, const struct GNUNET_MessageHeader *message) { - GNUNET_SERVER_notification_context_add (nc, client); - GNUNET_SERVER_receive_done (client, GNUNET_OK); + struct GNUNET_SERVICE_Client *client = cls; + + GNUNET_notification_context_add (nc, + GNUNET_SERVICE_client_get_mq (client)); + GNUNET_SERVICE_client_continue (client); GNUNET_CONTAINER_multipeermap_iterate (all_routes, ¬ify_client_about_route, client); @@ -2040,37 +2042,28 @@ core_init (void *cls, * Process dv requests. * * @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) { - GNUNET_MQ_hd_var_size (dv_route_message, - GNUNET_MESSAGE_TYPE_DV_ROUTE, - struct RouteMessage); struct GNUNET_MQ_MessageHandler core_handlers[] = { - make_dv_route_message_handler (NULL), + GNUNET_MQ_hd_var_size (dv_route_message, + GNUNET_MESSAGE_TYPE_DV_ROUTE, + struct RouteMessage, + NULL), GNUNET_MQ_handler_end () }; - static struct GNUNET_SERVER_MessageHandler plugin_handlers[] = { - {&handle_start, NULL, - GNUNET_MESSAGE_TYPE_DV_START, - sizeof (struct GNUNET_MessageHeader) }, - { &handle_dv_send_message, NULL, - GNUNET_MESSAGE_TYPE_DV_SEND, - 0}, - {NULL, NULL, 0, 0} - }; in_shutdown = GNUNET_NO; cfg = c; direct_neighbors = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_NO); all_routes = GNUNET_CONTAINER_multipeermap_create (65536, GNUNET_NO); - core_api = GNUNET_CORE_connecT (cfg, + core_api = GNUNET_CORE_connect (cfg, NULL, &core_init, &handle_core_connect, @@ -2084,39 +2077,70 @@ run (void *cls, NULL); if (NULL == ats) { - GNUNET_CORE_disconnecT (core_api); + GNUNET_CORE_disconnect (core_api); core_api = NULL; return; } - nc = GNUNET_SERVER_notification_context_create (server, - MAX_QUEUE_SIZE_PLUGIN); + nc = GNUNET_notification_context_create (MAX_QUEUE_SIZE_PLUGIN); stats = GNUNET_STATISTICS_create ("dv", cfg); - GNUNET_SERVER_add_handlers (server, - plugin_handlers); GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL); } /** - * The main function for the dv service. + * Callback called when a client connects to the service. * - * @param argc number of arguments from the command line - * @param argv command line arguments - * @return 0 ok, 1 on error + * @param cls closure for the service + * @param c the new client that connected to the service + * @param mq the message queue used to send messages to the client + * @return @a c */ -int -main (int argc, - char *const *argv) +static void * +client_connect_cb (void *cls, + struct GNUNET_SERVICE_Client *c, + struct GNUNET_MQ_Handle *mq) { - return (GNUNET_OK == - GNUNET_SERVICE_run (argc, - argv, - "dv", - GNUNET_SERVICE_OPTION_NONE, - &run, - NULL)) ? 0 : 1; + return c; } + +/** + * Callback called when a client disconnected from the service + * + * @param cls closure for the service + * @param c the client that disconnected + * @param internal_cls should be equal to @a c + */ +static void +client_disconnect_cb (void *cls, + struct GNUNET_SERVICE_Client *c, + void *internal_cls) +{ + GNUNET_assert (c == internal_cls); +} + + +/** + * Define "main" method using service macro. + */ +GNUNET_SERVICE_MAIN +("dv", + GNUNET_SERVICE_OPTION_NONE, + &run, + &client_connect_cb, + &client_disconnect_cb, + NULL, + GNUNET_MQ_hd_fixed_size (start, + GNUNET_MESSAGE_TYPE_DV_START, + struct GNUNET_MessageHeader, + NULL), + GNUNET_MQ_hd_var_size (dv_send_message, + GNUNET_MESSAGE_TYPE_DV_SEND, + struct GNUNET_DV_SendMessage, + NULL), + GNUNET_MQ_handler_end ()); + + /* end of gnunet-service-dv.c */