From: Sree Harsha Totakura Date: Sun, 22 Jul 2012 18:34:25 +0000 (+0000) Subject: -get peer config & info X-Git-Tag: initial-import-from-subversion-38251~12387 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=8ee0404fc1a3ef3fc75ba3b558f46f90dded4cfa;p=oweals%2Fgnunet.git -get peer config & info --- diff --git a/src/testbed/gnunet-service-testbed.c b/src/testbed/gnunet-service-testbed.c index f58757596..a9a1f1147 100644 --- a/src/testbed/gnunet-service-testbed.c +++ b/src/testbed/gnunet-service-testbed.c @@ -29,8 +29,9 @@ #include "gnunet_server_lib.h" #include -#include "testbed.h" #include "gnunet_testbed_service.h" +#include "testbed.h" +#include "testbed_api.h" #include "testbed_api_hosts.h" #include "gnunet_testing_lib-new.h" @@ -1388,6 +1389,55 @@ handle_peer_stop (void *cls, } +/** + * Handler for GNUNET_MESSAGE_TYPE_TESTBED_GETPEERCONFIG messages + * + * @param cls NULL + * @param client identification of the client + * @param message the actual message + */ +static void +handle_peer_get_config (void *cls, + struct GNUNET_SERVER_Client *client, + const struct GNUNET_MessageHeader *message) +{ + const struct GNUNET_TESTBED_PeerGetConfigurationMessage *msg; + struct GNUNET_TESTBED_PeerConfigurationInformationMessage *reply; + char *config; + char *xconfig; + size_t c_size; + size_t xc_size; + uint32_t peer_id; + uint16_t msize; + + msg = (const struct GNUNET_TESTBED_PeerGetConfigurationMessage *) message; + peer_id = ntohl (msg->peer_id); + if ((peer_id >= peer_list_size) || (NULL == peer_list[peer_id])) + { + /* FIXME: return FAILURE message */ + GNUNET_break (0); + GNUNET_SERVER_receive_done (client, GNUNET_OK); + } + config = GNUNET_CONFIGURATION_serialize (peer_list[peer_id]->cfg, + &c_size); + xc_size = GNUNET_TESTBED_compress_config_ (config, c_size, &xconfig); + GNUNET_free (config); + msize = xc_size + sizeof (struct + GNUNET_TESTBED_PeerConfigurationInformationMessage); + reply = GNUNET_realloc (xconfig, msize); + (void) memmove (&reply[1], reply, xc_size); + reply->header.size = htons (msize); + reply->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_PEERCONFIG); + reply->peer_id = msg->peer_id; + reply->operation_id = msg->operation_id; + GNUNET_TESTING_peer_get_identity (peer_list[peer_id]->peer, + &reply->peer_identity); + reply->config_size = htons ((uint16_t) c_size); + queue_message (client, &reply->header); + GNUNET_SERVER_receive_done (client, GNUNET_OK); +} + + /** * Iterator over hash map entries. * @@ -1557,7 +1607,9 @@ testbed_run (void *cls, {&handle_peer_start, NULL, GNUNET_MESSAGE_TYPE_TESTBED_STARTPEER, sizeof (struct GNUNET_TESTBED_PeerStartMessage)}, {&handle_peer_stop, NULL, GNUNET_MESSAGE_TYPE_TESTBED_STOPPEER, - sizeof (struct GNUNET_TESTBED_PeerStopMessage)}, + sizeof (struct GNUNET_TESTBED_PeerStopMessage)}, + {&handle_peer_get_config, NULL, GNUNET_MESSAGE_TYPE_TESTBED_GETPEERCONFIG, + sizeof (struct GNUNET_TESTBED_PeerGetConfigurationMessage)}, {NULL} }; diff --git a/src/testbed/testbed.h b/src/testbed/testbed.h index a2bb77e3d..47a3df5db 100644 --- a/src/testbed/testbed.h +++ b/src/testbed/testbed.h @@ -581,9 +581,9 @@ struct GNUNET_TESTBED_PeerConfigurationInformationMessage struct GNUNET_MessageHeader header; /** - * Peer number of the peer that was created. + * The id of the peer relevant to this information */ - uint32_t peer_number GNUNET_PACKED; + uint32_t peer_id GNUNET_PACKED; /** * Operation ID of the operation that created this event. @@ -593,7 +593,12 @@ struct GNUNET_TESTBED_PeerConfigurationInformationMessage /** * Identity of the peer. */ - struct GNUNET_PeerIdentity peer_id; + struct GNUNET_PeerIdentity peer_identity; + + /** + * The size of configuration when uncompressed + */ + uint16_t config_size; /* followed by gzip-compressed configuration of the peer */ diff --git a/src/testbed/testbed_api.h b/src/testbed/testbed_api.h index e83e21b52..fcfb5008c 100644 --- a/src/testbed/testbed_api.h +++ b/src/testbed/testbed_api.h @@ -51,7 +51,12 @@ enum OperationType /** * Peer destroy operation */ - OP_PEER_DESTROY + OP_PEER_DESTROY, + + /** + * Get peer information operation + */ + OP_PEER_INFO }; diff --git a/src/testbed/testbed_api_peers.c b/src/testbed/testbed_api_peers.c index 2abf4ade1..a1a8a76a3 100644 --- a/src/testbed/testbed_api_peers.c +++ b/src/testbed/testbed_api_peers.c @@ -225,7 +225,7 @@ GNUNET_TESTBED_peer_stop (struct GNUNET_TESTBED_Peer *peer) GNUNET_CONTAINER_DLL_insert_tail (peer->controller->op_head, peer->controller->op_tail, op); GNUNET_TESTBED_queue_message_ (peer->controller, &msg->header); - return NULL; + return op; } @@ -240,9 +240,25 @@ struct GNUNET_TESTBED_Operation * GNUNET_TESTBED_peer_get_information (struct GNUNET_TESTBED_Peer *peer, enum GNUNET_TESTBED_PeerInformationType pit) { - // FIXME: handle locally or delegate... - GNUNET_break (0); - return NULL; + struct GNUNET_TESTBED_PeerGetConfigurationMessage *msg; + struct GNUNET_TESTBED_Operation *op; + + GNUNET_assert (GNUNET_TESTBED_PIT_GENERIC != pit); + op = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_Operation)); + op->type = OP_PEER_INFO; + op->operation_id = peer->controller->operation_counter++; + op->data = peer; + msg = GNUNET_malloc (sizeof (struct + GNUNET_TESTBED_PeerGetConfigurationMessage)); + msg->header.size = htons + (sizeof (struct GNUNET_TESTBED_PeerGetConfigurationMessage)); + msg->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_GETPEERCONFIG); + msg->peer_id = htonl (peer->unique_id); + msg->operation_id = GNUNET_htonll (op->operation_id); + GNUNET_CONTAINER_DLL_insert_tail (peer->controller->op_head, + peer->controller->op_tail, op); + GNUNET_TESTBED_queue_message_ (peer->controller, &msg->header); + return op; }