From: Bart Polot Date: Fri, 13 May 2011 01:05:22 +0000 (+0000) Subject: Finished basic connect/disconnect test X-Git-Tag: initial-import-from-subversion-38251~18479 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=d8c0c8836e4c00318f48ef71b0d1647851f51b9c;p=oweals%2Fgnunet.git Finished basic connect/disconnect test --- diff --git a/src/mesh/gnunet-service-mesh.c b/src/mesh/gnunet-service-mesh.c index 2080a375f..77e09e88c 100644 --- a/src/mesh/gnunet-service-mesh.c +++ b/src/mesh/gnunet-service-mesh.c @@ -294,11 +294,17 @@ struct MeshClient */ struct GNUNET_SERVER_Client *handle; + /** + * Applications that this client has claimed to provide + */ + GNUNET_MESH_ApplicationType *apps; + unsigned int app_counter; + /** * Messages that this client has declared interest in */ - GNUNET_MESH_ApplicationType *messages_subscribed; - unsigned int subscription_counter; + uint16_t *types; + unsigned int type_counter; }; @@ -681,12 +687,13 @@ handle_client_disconnect (void *cls, struct GNUNET_SERVER_Client *client) while (NULL != c) { if (c->handle == client) { GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, - "MESH: cleaning client structures\n"); + "MESH: matching client found, cleaning\n"); GNUNET_CONTAINER_DLL_remove (clients_head, clients_tail, c); while (NULL != (t = c->tunnels_head)) { destroy_tunnel(c, t); } - GNUNET_free (c->messages_subscribed); + if(0 != c->app_counter) GNUNET_free (c->apps); + if(0 != c->type_counter) GNUNET_free (c->types); next = c->next; GNUNET_free (c); c = next; @@ -710,14 +717,23 @@ handle_local_new_client (void *cls, struct GNUNET_SERVER_Client *client, const struct GNUNET_MessageHeader *message) { - struct MeshClient *c; - unsigned int payload_size; + struct GNUNET_MESH_ClientConnect *cc_msg; + struct MeshClient *c; + unsigned int payload_size; + uint16_t types; + uint16_t apps; GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "MESH: new client connected\n"); /* Check data sanity */ - payload_size = ntohs(message->size) - sizeof(struct GNUNET_MessageHeader); - if (0 != payload_size % sizeof(GNUNET_MESH_ApplicationType)) { + payload_size = ntohs(message->size) + - sizeof(struct GNUNET_MESH_ClientConnect); + cc_msg = (struct GNUNET_MESH_ClientConnect *) message; + types = ntohs(cc_msg->types); + apps = ntohs(cc_msg->applications); + if (payload_size != + types * sizeof(uint16_t) + apps * sizeof(GNUNET_MESH_ApplicationType)) + { GNUNET_break(0); GNUNET_SERVER_receive_done(client, GNUNET_SYSERR); return; @@ -726,15 +742,22 @@ handle_local_new_client (void *cls, /* Create new client structure */ c = GNUNET_malloc(sizeof(struct MeshClient)); c->handle = client; - if (payload_size != 0) { - c->messages_subscribed = GNUNET_malloc(payload_size); - memcpy(c->messages_subscribed, &message[1], payload_size); - } else { - c->messages_subscribed = NULL; + if (types != 0) { + c->type_counter = types; + c->types = GNUNET_malloc(types * sizeof(uint16_t)); + memcpy(c->types, &message[1], types * sizeof(uint16_t)); + } + if (apps != 0) { + c->app_counter = apps; + c->apps = GNUNET_malloc(apps * sizeof(GNUNET_MESH_ApplicationType)); + memcpy(c->apps, + &message[1] + types * sizeof(uint16_t), + apps * sizeof(GNUNET_MESH_ApplicationType)); } - c->subscription_counter = payload_size/sizeof(GNUNET_MESH_ApplicationType); GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, - "MESH: client has %u subscriptions\n", c->subscription_counter); + "MESH: client has %u+%u subscriptions\n", + c->type_counter, + c->app_counter); /* Insert new client in DLL */ GNUNET_CONTAINER_DLL_insert (clients_head, clients_tail, c); diff --git a/src/mesh/mesh.h b/src/mesh/mesh.h index d317e8054..88106ca9a 100644 --- a/src/mesh/mesh.h +++ b/src/mesh/mesh.h @@ -78,6 +78,8 @@ struct GNUNET_MESH_ClientConnect { struct GNUNET_MessageHeader header; uint16_t types GNUNET_PACKED; uint16_t applications GNUNET_PACKED; + /* uint16_t list_types[types] */ + /* uint16_t list_apps[applications] */ }; diff --git a/src/mesh/test_mesh.conf b/src/mesh/test_mesh.conf index 49da05129..bd8f199c8 100644 --- a/src/mesh/test_mesh.conf +++ b/src/mesh/test_mesh.conf @@ -5,7 +5,7 @@ AUTOSTART = NO AUTOSTART = NO [mesh] -DEBUG = YES +DEBUG = NO AUTOSTART = YES ACCEPT_FROM = 127.0.0.1; HOSTNAME = localhost diff --git a/src/mesh/test_mesh_api.c b/src/mesh/test_mesh_api.c index 6c3bd60a9..4c4bf9c4c 100644 --- a/src/mesh/test_mesh_api.c +++ b/src/mesh/test_mesh_api.c @@ -1,20 +1,47 @@ +/* + This file is part of GNUnet. + (C) 2011 Christian Grothoff (and other contributing authors) + + 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +/** + * @file mesh/test_mesh_api.c + * @brief test mesh api: dummy test of callbacks + * @author Bartlomiej Polot + */ + #include "platform.h" #include "gnunet_util_lib.h" #include "gnunet_dht_service.h" #include "gnunet_mesh_service_new.h" -static struct GNUNET_MESH_MessageHandler handlers[] = { - {NULL, 0, 0} -}; - -static struct GNUNET_OS_Process *arm_pid; - -static struct GNUNET_MESH_Handle *mesh; +static struct GNUNET_MESH_MessageHandler handlers[] = {{NULL, 0, 0}}; +static struct GNUNET_OS_Process *arm_pid; +static struct GNUNET_MESH_Handle *mesh; +static int result; +GNUNET_SCHEDULER_TaskIdentifier abort_task; +GNUNET_SCHEDULER_TaskIdentifier test_task; static void -do_shutdown (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) +do_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { + if (0 != abort_task) { + GNUNET_SCHEDULER_cancel(abort_task); + } if (NULL != mesh) { GNUNET_MESH_disconnect (mesh); } @@ -25,50 +52,67 @@ do_shutdown (void *cls, GNUNET_OS_process_close (arm_pid); } - static void -error_shutdown (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) +do_abort (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { - if (NULL != mesh) { - GNUNET_MESH_disconnect (mesh); + if (0 != test_task) { + GNUNET_SCHEDULER_cancel(test_task); } - if (0 != GNUNET_OS_process_kill (arm_pid, SIGTERM)) { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill"); - } - GNUNET_assert (GNUNET_OK == GNUNET_OS_process_wait (arm_pid)); - GNUNET_OS_process_close (arm_pid); + result = GNUNET_SYSERR; + abort_task = 0; + do_shutdown(cls, tc); } static void -run (void *cls, - char *const *args, - const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { +test (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + struct GNUNET_CONFIGURATION_Handle *cfg = cls; GNUNET_MESH_ApplicationType app; - arm_pid = GNUNET_OS_start_process (NULL, NULL, - "gnunet-service-arm", - "gnunet-service-arm", - "-L", "DEBUG", - "-c", "test_mesh.conf", - NULL); + test_task = 0; app = 0; mesh = GNUNET_MESH_connect(cfg, NULL, NULL, handlers, &app); if(NULL == mesh) { GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Couldn't connect to mesh :(\n"); + return; } else { GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "YAY! CONNECTED TO MESH :D\n"); } - /* do real test work here */ GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply( - GNUNET_TIME_UNIT_SECONDS, 5), - &do_shutdown, - NULL); + GNUNET_TIME_UNIT_SECONDS, 1), + &do_shutdown, + NULL); +} + + +static void +run (void *cls, + char *const *args, + const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + arm_pid = GNUNET_OS_start_process (NULL, NULL, + "gnunet-service-arm", + "gnunet-service-arm", + "-L", "DEBUG", + "-c", "test_mesh.conf", + NULL); + + abort_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply( + GNUNET_TIME_UNIT_SECONDS, 5), + &do_abort, + NULL); + test_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply( + GNUNET_TIME_UNIT_SECONDS, 1), + &test, + (void *)cfg); + } -int main (int argc, char *argv[]) { +int +main (int argc, char *argv[]) +{ int ret; char *const argv2[] = {"test-mesh-api", "-c", "test_mesh.conf", @@ -82,9 +126,15 @@ int main (int argc, char *argv[]) { ret = GNUNET_PROGRAM_run ((sizeof (argv2) / sizeof (char *)) - 1, argv2, "test-mesh-api", "nohelp", options, &run, NULL); - if (ret != GNUNET_OK) { + + if ( GNUNET_OK != ret ) { + GNUNET_log(GNUNET_ERROR_TYPE_WARNING, + "test-mesh-api': run failed with error code %d\n", ret); + return 1; + } + if ( GNUNET_SYSERR == result ) { GNUNET_log(GNUNET_ERROR_TYPE_WARNING, - "test-mesh-api': Failed with error code %d\n", ret); + "test-mesh-api': test failed\n"); return 1; } return 0;