- GNUNET_break (0);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- LOG_DEBUG ("Received service sharing request for %s, with %d peers\n",
- service_name, ntohl (msg->num_peers));
- if (ntohl (msg->host_id) != GST_context->host_id)
- {
- route_message (ntohl (msg->host_id), message);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- ss = GNUNET_malloc (sizeof (struct SharedService));
- ss->name = strdup (service_name);
- ss->num_shared = ntohl (msg->num_peers);
- GNUNET_CRYPTO_hash (ss->name, service_name_size, &hash);
- if (GNUNET_SYSERR ==
- GNUNET_CONTAINER_multihashmap_get_multiple (ss_map, &hash,
- &ss_exists_iterator, ss))
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- "Service %s already configured as a shared service. "
- "Ignoring service sharing request \n", ss->name);
- GNUNET_free (ss->name);
- GNUNET_free (ss);
- return;
- }
- GNUNET_CONTAINER_multihashmap_put (ss_map, &hash, ss,
- GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
-}
-
-
-/**
- * Message handler for GNUNET_MESSAGE_TYPE_TESTBED_LCONTROLLERS message
- *
- * @param cls NULL
- * @param client identification of the client
- * @param message the actual message
- */
-static void
-handle_link_controllers (void *cls, struct GNUNET_SERVER_Client *client,
- const struct GNUNET_MessageHeader *message)
-{
- const struct GNUNET_TESTBED_ControllerLinkMessage *msg;
- struct GNUNET_CONFIGURATION_Handle *cfg;
- struct LCFContextQueue *lcfq;
- struct Route *route;
- struct Route *new_route;
- char *config;
- uLongf dest_size;
- size_t config_size;
- uint32_t delegated_host_id;
- uint32_t slave_host_id;
- uint16_t msize;
-
- if (NULL == GST_context)
- {
- GNUNET_break (0);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- msize = ntohs (message->size);
- if (sizeof (struct GNUNET_TESTBED_ControllerLinkMessage) >= msize)
- {
- GNUNET_break (0);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- msg = (const struct GNUNET_TESTBED_ControllerLinkMessage *) message;
- delegated_host_id = ntohl (msg->delegated_host_id);
- if (delegated_host_id == GST_context->host_id)
- {
- GNUNET_break (0);
- LOG (GNUNET_ERROR_TYPE_WARNING, "Trying to link ourselves\n");
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- if ((delegated_host_id >= GST_host_list_size) ||
- (NULL == GST_host_list[delegated_host_id]))
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- "Delegated host %u not registered with us\n", delegated_host_id);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- slave_host_id = ntohl (msg->slave_host_id);
- if ((slave_host_id >= GST_host_list_size) ||
- (NULL == GST_host_list[slave_host_id]))
- {
- LOG (GNUNET_ERROR_TYPE_WARNING, "Slave host %u not registered with us\n",
- slave_host_id);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- if (slave_host_id == delegated_host_id)
- {
- LOG (GNUNET_ERROR_TYPE_WARNING, "Slave and delegated host are same\n");
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
-
- if (slave_host_id == GST_context->host_id) /* Link from us */
- {
- struct Slave *slave;
- struct LinkControllersContext *lcc;
-
- msize -= sizeof (struct GNUNET_TESTBED_ControllerLinkMessage);
- config_size = ntohs (msg->config_size);
- if ((delegated_host_id < GST_slave_list_size) && (NULL != GST_slave_list[delegated_host_id])) /* We have already added */
- {
- LOG (GNUNET_ERROR_TYPE_WARNING, "Host %u already connected\n",
- delegated_host_id);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- config = GNUNET_malloc (config_size);
- dest_size = (uLongf) config_size;
- if (Z_OK !=
- uncompress ((Bytef *) config, &dest_size, (const Bytef *) &msg[1],
- (uLong) msize))
- {
- GNUNET_break (0); /* Compression error */
- GNUNET_free (config);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- if (config_size != dest_size)
- {
- LOG (GNUNET_ERROR_TYPE_WARNING, "Uncompressed config size mismatch\n");
- GNUNET_free (config);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- cfg = GNUNET_CONFIGURATION_create (); /* Free here or in lcfcontext */
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_deserialize (cfg, config, config_size, GNUNET_NO))
- {
- GNUNET_break (0); /* Configuration parsing error */
- GNUNET_free (config);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- GNUNET_free (config);
- if ((delegated_host_id < GST_slave_list_size) &&
- (NULL != GST_slave_list[delegated_host_id]))
- {
- GNUNET_break (0); /* Configuration parsing error */
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- slave = GNUNET_malloc (sizeof (struct Slave));
- slave->host_id = delegated_host_id;
- slave->reghost_map = GNUNET_CONTAINER_multihashmap_create (100, GNUNET_NO);
- slave_list_add (slave);
- if (1 != msg->is_subordinate)
- {
- slave->controller =
- GNUNET_TESTBED_controller_connect (cfg, GST_host_list[slave->host_id],
- event_mask, &slave_event_callback,
- slave);
- slave->cfg = cfg;
- if (NULL != slave->controller)
- send_operation_success_msg (client, GNUNET_ntohll (msg->operation_id));
- else
- GST_send_operation_fail_msg (client, GNUNET_ntohll (msg->operation_id),
- "Could not connect to delegated controller");
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- lcc = GNUNET_malloc (sizeof (struct LinkControllersContext));
- lcc->operation_id = GNUNET_ntohll (msg->operation_id);
- GNUNET_SERVER_client_keep (client);
- lcc->client = client;
- slave->lcc = lcc;
- slave->controller_proc =
- GNUNET_TESTBED_controller_start (GST_context->master_ip,
- GST_host_list[slave->host_id], cfg,
- &slave_status_callback, slave);
- GNUNET_CONFIGURATION_destroy (cfg);
- new_route = GNUNET_malloc (sizeof (struct Route));
- new_route->dest = delegated_host_id;
- new_route->thru = GST_context->host_id;
- route_list_add (new_route);
- return;
- }
-
- /* Route the request */
- if (slave_host_id >= route_list_size)
- {
- LOG (GNUNET_ERROR_TYPE_WARNING, "No route towards slave host");
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- lcfq = GNUNET_malloc (sizeof (struct LCFContextQueue));
- lcfq->lcf = GNUNET_malloc (sizeof (struct LCFContext));
- lcfq->lcf->delegated_host_id = delegated_host_id;
- lcfq->lcf->slave_host_id = slave_host_id;
- route = GST_find_dest_route (slave_host_id);
- GNUNET_assert (NULL != route); /* because we add routes carefully */
- GNUNET_assert (route->dest < GST_slave_list_size);
- GNUNET_assert (NULL != GST_slave_list[route->dest]);
- lcfq->lcf->state = INIT;
- lcfq->lcf->operation_id = GNUNET_ntohll (msg->operation_id);
- lcfq->lcf->gateway = GST_slave_list[route->dest];
- lcfq->lcf->msg = GNUNET_malloc (msize);
- (void) memcpy (lcfq->lcf->msg, msg, msize);
- GNUNET_SERVER_client_keep (client);
- lcfq->lcf->client = client;
- if (NULL == lcfq_head)
- {
- GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == lcf_proc_task_id);
- GNUNET_CONTAINER_DLL_insert_tail (lcfq_head, lcfq_tail, lcfq);
- lcf_proc_task_id = GNUNET_SCHEDULER_add_now (&lcf_proc_task, lcfq->lcf);
- }
- else
- GNUNET_CONTAINER_DLL_insert_tail (lcfq_head, lcfq_tail, lcfq);
- /* FIXME: Adding a new route should happen after the controllers are linked
- * successfully */
- if (1 != msg->is_subordinate)
- {
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- if ((delegated_host_id < route_list_size) &&
- (NULL != route_list[delegated_host_id]))
- {
- GNUNET_break_op (0); /* Are you trying to link delegated host twice
- * with is subordinate flag set to GNUNET_YES? */
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- new_route = GNUNET_malloc (sizeof (struct Route));
- new_route->dest = delegated_host_id;
- new_route->thru = route->dest;
- route_list_add (new_route);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
-}
-
-
-/**
- * The task to be executed if the forwarded peer create operation has been
- * timed out
- *
- * @param cls the FowardedOperationContext
- * @param tc the TaskContext from the scheduler
- */
-static void
-peer_create_forward_timeout (void *cls,
- const struct GNUNET_SCHEDULER_TaskContext *tc)
-{
- struct ForwardedOperationContext *fopc = cls;
-
- GNUNET_free (fopc->cls);
- GST_forwarded_operation_timeout (fopc, tc);
-}
-
-
-/**
- * Callback to be called when forwarded peer create operation is successfull. We
- * have to relay the reply msg back to the client
- *
- * @param cls ForwardedOperationContext
- * @param msg the peer create success message
- */
-static void
-peer_create_success_cb (void *cls, const struct GNUNET_MessageHeader *msg)
-{
- struct ForwardedOperationContext *fopc = cls;
- struct Peer *remote_peer;
-
- if (ntohs (msg->type) == GNUNET_MESSAGE_TYPE_TESTBED_CREATE_PEER_SUCCESS)
- {
- GNUNET_assert (NULL != fopc->cls);
- remote_peer = fopc->cls;
- peer_list_add (remote_peer);
- }
- GST_forwarded_operation_reply_relay (fopc, msg);
-}
-
-
-/**
- * Function to destroy a peer
- *
- * @param peer the peer structure to destroy
- */
-void
-GST_destroy_peer (struct Peer *peer)
-{
- GNUNET_break (0 == peer->reference_cnt);
- if (GNUNET_YES == peer->is_remote)
- {
- peer_list_remove (peer);
- GNUNET_free (peer);
- return;
- }
- if (GNUNET_YES == peer->details.local.is_running)
- {
- GNUNET_TESTING_peer_stop (peer->details.local.peer);
- peer->details.local.is_running = GNUNET_NO;
- }
- GNUNET_TESTING_peer_destroy (peer->details.local.peer);
- GNUNET_CONFIGURATION_destroy (peer->details.local.cfg);
- peer_list_remove (peer);
- GNUNET_free (peer);
-}
-
-
-/**
- * Callback to be called when forwarded peer destroy operation is successfull. We
- * have to relay the reply msg back to the client
- *
- * @param cls ForwardedOperationContext
- * @param msg the peer create success message
- */
-static void
-peer_destroy_success_cb (void *cls, const struct GNUNET_MessageHeader *msg)
-{
- struct ForwardedOperationContext *fopc = cls;
- struct Peer *remote_peer;
-
- if (GNUNET_MESSAGE_TYPE_TESTBED_GENERIC_OPERATION_SUCCESS ==
- ntohs (msg->type))
- {
- remote_peer = fopc->cls;
- GNUNET_assert (NULL != remote_peer);
- remote_peer->destroy_flag = GNUNET_YES;
- if (0 == remote_peer->reference_cnt)
- GST_destroy_peer (remote_peer);
- }
- GST_forwarded_operation_reply_relay (fopc, msg);
-}
-
-
-
-/**
- * Handler for GNUNET_MESSAGE_TYPE_TESTBED_CREATEPEER messages
- *
- * @param cls NULL
- * @param client identification of the client
- * @param message the actual message
- */
-static void
-handle_peer_create (void *cls, struct GNUNET_SERVER_Client *client,
- const struct GNUNET_MessageHeader *message)
-{
- const struct GNUNET_TESTBED_PeerCreateMessage *msg;
- struct GNUNET_TESTBED_PeerCreateSuccessEventMessage *reply;
- struct GNUNET_CONFIGURATION_Handle *cfg;
- struct ForwardedOperationContext *fo_ctxt;
- struct Route *route;
- struct Peer *peer;
- char *config;
- size_t dest_size;
- int ret;
- uint32_t config_size;
- uint32_t host_id;
- uint32_t peer_id;
- uint16_t msize;
-
-
- msize = ntohs (message->size);
- if (msize <= sizeof (struct GNUNET_TESTBED_PeerCreateMessage))
- {
- GNUNET_break (0); /* We need configuration */
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- msg = (const struct GNUNET_TESTBED_PeerCreateMessage *) message;
- host_id = ntohl (msg->host_id);
- peer_id = ntohl (msg->peer_id);
- if (UINT32_MAX == peer_id)
- {
- GST_send_operation_fail_msg (client, GNUNET_ntohll (msg->operation_id),
- "Cannot create peer with given ID");
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- if (host_id == GST_context->host_id)
- {
- char *emsg;
-
- /* We are responsible for this peer */
- msize -= sizeof (struct GNUNET_TESTBED_PeerCreateMessage);
- config_size = ntohl (msg->config_size);
- config = GNUNET_malloc (config_size);
- dest_size = config_size;
- if (Z_OK !=
- (ret =
- uncompress ((Bytef *) config, (uLongf *) & dest_size,
- (const Bytef *) &msg[1], (uLong) msize)))
- {
- GNUNET_break (0); /* uncompression error */
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- if (config_size != dest_size)
- {
- GNUNET_break (0); /* Uncompressed config size mismatch */
- GNUNET_free (config);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- cfg = GNUNET_CONFIGURATION_create ();
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_deserialize (cfg, config, config_size, GNUNET_NO))
- {
- GNUNET_break (0); /* Configuration parsing error */
- GNUNET_free (config);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- GNUNET_free (config);
- GNUNET_CONFIGURATION_set_value_number (cfg, "TESTBED", "PEERID",
- (unsigned long long) peer_id);
- peer = GNUNET_malloc (sizeof (struct Peer));
- peer->is_remote = GNUNET_NO;
- peer->details.local.cfg = cfg;
- peer->id = peer_id;
- LOG_DEBUG ("Creating peer with id: %u\n", (unsigned int) peer->id);
- peer->details.local.peer =
- GNUNET_TESTING_peer_configure (GST_context->system,
- peer->details.local.cfg, peer->id,
- NULL /* Peer id */ ,
- &emsg);
- if (NULL == peer->details.local.peer)
- {
- LOG (GNUNET_ERROR_TYPE_WARNING, "Configuring peer failed: %s\n", emsg);
- GNUNET_free (emsg);
- GNUNET_free (peer);
- GNUNET_break (0);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- peer->details.local.is_running = GNUNET_NO;
- peer_list_add (peer);
- reply =
- GNUNET_malloc (sizeof
- (struct GNUNET_TESTBED_PeerCreateSuccessEventMessage));
- reply->header.size =
- htons (sizeof (struct GNUNET_TESTBED_PeerCreateSuccessEventMessage));
- reply->header.type =
- htons (GNUNET_MESSAGE_TYPE_TESTBED_CREATE_PEER_SUCCESS);
- reply->peer_id = msg->peer_id;
- reply->operation_id = msg->operation_id;
- GST_queue_message (client, &reply->header);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
-
- /* Forward peer create request */
- route = GST_find_dest_route (host_id);
- if (NULL == route)
- {
- GNUNET_break (0);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
-
- peer = GNUNET_malloc (sizeof (struct Peer));
- peer->is_remote = GNUNET_YES;
- peer->id = peer_id;
- peer->details.remote.slave = GST_slave_list[route->dest];
- peer->details.remote.remote_host_id = host_id;
- fo_ctxt = GNUNET_malloc (sizeof (struct ForwardedOperationContext));
- GNUNET_SERVER_client_keep (client);
- fo_ctxt->client = client;
- fo_ctxt->operation_id = GNUNET_ntohll (msg->operation_id);
- fo_ctxt->cls = peer; //GST_slave_list[route->dest]->controller;
- fo_ctxt->type = OP_PEER_CREATE;
- fo_ctxt->opc =
- GNUNET_TESTBED_forward_operation_msg_ (GST_slave_list
- [route->dest]->controller,
- fo_ctxt->operation_id,
- &msg->header,
- peer_create_success_cb, fo_ctxt);
- fo_ctxt->timeout_task =
- GNUNET_SCHEDULER_add_delayed (GST_timeout, &peer_create_forward_timeout,
- fo_ctxt);
- GNUNET_CONTAINER_DLL_insert_tail (fopcq_head, fopcq_tail, fo_ctxt);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
-}
-
-
-/**
- * Message handler for GNUNET_MESSAGE_TYPE_TESTBED_DESTROYPEER messages
- *
- * @param cls NULL
- * @param client identification of the client
- * @param message the actual message
- */
-static void
-handle_peer_destroy (void *cls, struct GNUNET_SERVER_Client *client,
- const struct GNUNET_MessageHeader *message)
-{
- const struct GNUNET_TESTBED_PeerDestroyMessage *msg;
- struct ForwardedOperationContext *fopc;
- struct Peer *peer;
- uint32_t peer_id;
-
- msg = (const struct GNUNET_TESTBED_PeerDestroyMessage *) message;
- peer_id = ntohl (msg->peer_id);
- LOG_DEBUG ("Received peer destory on peer: %u and operation id: %ul\n",
- peer_id, GNUNET_ntohll (msg->operation_id));
- if ((GST_peer_list_size <= peer_id) || (NULL == GST_peer_list[peer_id]))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Asked to destroy a non existent peer with id: %u\n", peer_id);
- GST_send_operation_fail_msg (client, GNUNET_ntohll (msg->operation_id),
- "Peer doesn't exist");
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- peer = GST_peer_list[peer_id];
- if (GNUNET_YES == peer->is_remote)
- {
- /* Forward the destory message to sub controller */
- fopc = GNUNET_malloc (sizeof (struct ForwardedOperationContext));
- GNUNET_SERVER_client_keep (client);
- fopc->client = client;
- fopc->cls = peer;
- fopc->type = OP_PEER_DESTROY;
- fopc->operation_id = GNUNET_ntohll (msg->operation_id);
- fopc->opc =
- GNUNET_TESTBED_forward_operation_msg_ (peer->details.remote.
- slave->controller,
- fopc->operation_id, &msg->header,
- &peer_destroy_success_cb, fopc);
- fopc->timeout_task =
- GNUNET_SCHEDULER_add_delayed (GST_timeout, &GST_forwarded_operation_timeout,
- fopc);
- GNUNET_CONTAINER_DLL_insert_tail (fopcq_head, fopcq_tail, fopc);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- peer->destroy_flag = GNUNET_YES;
- if (0 == peer->reference_cnt)
- GST_destroy_peer (peer);
- else
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Delaying peer destroy as peer is currently in use\n");
- send_operation_success_msg (client, GNUNET_ntohll (msg->operation_id));
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
-}
-
-
-/**
- * Message handler for GNUNET_MESSAGE_TYPE_TESTBED_DESTROYPEER messages
- *
- * @param cls NULL
- * @param client identification of the client
- * @param message the actual message
- */
-static void
-handle_peer_start (void *cls, struct GNUNET_SERVER_Client *client,
- const struct GNUNET_MessageHeader *message)
-{
- const struct GNUNET_TESTBED_PeerStartMessage *msg;
- struct GNUNET_TESTBED_PeerEventMessage *reply;
- struct ForwardedOperationContext *fopc;
- struct Peer *peer;
- uint32_t peer_id;
-
- msg = (const struct GNUNET_TESTBED_PeerStartMessage *) message;
- peer_id = ntohl (msg->peer_id);
- if ((peer_id >= GST_peer_list_size) || (NULL == GST_peer_list[peer_id]))
- {
- GNUNET_break (0);
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Asked to start a non existent peer with id: %u\n", peer_id);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- peer = GST_peer_list[peer_id];
- if (GNUNET_YES == peer->is_remote)
- {
- fopc = GNUNET_malloc (sizeof (struct ForwardedOperationContext));
- GNUNET_SERVER_client_keep (client);
- fopc->client = client;
- fopc->operation_id = GNUNET_ntohll (msg->operation_id);
- fopc->type = OP_PEER_START;
- fopc->opc =
- GNUNET_TESTBED_forward_operation_msg_ (peer->details.remote.
- slave->controller,
- fopc->operation_id, &msg->header,
- &GST_forwarded_operation_reply_relay,
- fopc);
- fopc->timeout_task =
- GNUNET_SCHEDULER_add_delayed (GST_timeout, &GST_forwarded_operation_timeout,
- fopc);
- GNUNET_CONTAINER_DLL_insert_tail (fopcq_head, fopcq_tail, fopc);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- if (GNUNET_OK != GNUNET_TESTING_peer_start (peer->details.local.peer))
- {
- GST_send_operation_fail_msg (client, GNUNET_ntohll (msg->operation_id),
- "Failed to start");
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- peer->details.local.is_running = GNUNET_YES;
- reply = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_PeerEventMessage));
- reply->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_PEER_EVENT);
- reply->header.size = htons (sizeof (struct GNUNET_TESTBED_PeerEventMessage));
- reply->event_type = htonl (GNUNET_TESTBED_ET_PEER_START);
- reply->host_id = htonl (GST_context->host_id);
- reply->peer_id = msg->peer_id;
- reply->operation_id = msg->operation_id;
- GST_queue_message (client, &reply->header);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
-}
-
-
-/**
- * Message handler for GNUNET_MESSAGE_TYPE_TESTBED_DESTROYPEER messages
- *
- * @param cls NULL
- * @param client identification of the client
- * @param message the actual message
- */
-static void
-handle_peer_stop (void *cls, struct GNUNET_SERVER_Client *client,
- const struct GNUNET_MessageHeader *message)
-{
- const struct GNUNET_TESTBED_PeerStopMessage *msg;
- struct GNUNET_TESTBED_PeerEventMessage *reply;
- struct ForwardedOperationContext *fopc;
- struct Peer *peer;
- uint32_t peer_id;
-
- msg = (const struct GNUNET_TESTBED_PeerStopMessage *) message;
- peer_id = ntohl (msg->peer_id);
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Received PEER_STOP for peer %u\n", peer_id);
- if ((peer_id >= GST_peer_list_size) || (NULL == GST_peer_list[peer_id]))
- {
- GST_send_operation_fail_msg (client, GNUNET_ntohll (msg->operation_id),
- "Peer not found");
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- peer = GST_peer_list[peer_id];
- if (GNUNET_YES == peer->is_remote)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Forwarding PEER_STOP for peer %u\n",
- peer_id);
- fopc = GNUNET_malloc (sizeof (struct ForwardedOperationContext));
- GNUNET_SERVER_client_keep (client);
- fopc->client = client;
- fopc->operation_id = GNUNET_ntohll (msg->operation_id);
- fopc->type = OP_PEER_STOP;
- fopc->opc =
- GNUNET_TESTBED_forward_operation_msg_ (peer->details.remote.
- slave->controller,
- fopc->operation_id, &msg->header,
- &GST_forwarded_operation_reply_relay,
- fopc);
- fopc->timeout_task =
- GNUNET_SCHEDULER_add_delayed (GST_timeout, &GST_forwarded_operation_timeout,
- fopc);
- GNUNET_CONTAINER_DLL_insert_tail (fopcq_head, fopcq_tail, fopc);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- if (GNUNET_OK != GNUNET_TESTING_peer_kill (peer->details.local.peer))
- {
- LOG (GNUNET_ERROR_TYPE_WARNING, "Stopping peer %u failed\n", peer_id);
- GST_send_operation_fail_msg (client, GNUNET_ntohll (msg->operation_id),
- "Peer not running");
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Peer %u successfully stopped\n", peer_id);
- peer->details.local.is_running = GNUNET_NO;
- reply = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_PeerEventMessage));
- reply->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_PEER_EVENT);
- reply->header.size = htons (sizeof (struct GNUNET_TESTBED_PeerEventMessage));
- reply->event_type = htonl (GNUNET_TESTBED_ET_PEER_STOP);
- reply->host_id = htonl (GST_context->host_id);
- reply->peer_id = msg->peer_id;
- reply->operation_id = msg->operation_id;
- GST_queue_message (client, &reply->header);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- GNUNET_TESTING_peer_wait (peer->details.local.peer);
-}
-
-
-/**
- * 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;
- struct Peer *peer;
- 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 >= GST_peer_list_size) || (NULL == GST_peer_list[peer_id]))
- {
- GST_send_operation_fail_msg (client, GNUNET_ntohll (msg->operation_id),
- "Peer not found");
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- peer = GST_peer_list[peer_id];
- if (GNUNET_YES == peer->is_remote)
- {
- struct ForwardedOperationContext *fopc;
-
- LOG_DEBUG ("Forwarding PEER_GET_CONFIG for peer: %u\n", peer_id);
- fopc = GNUNET_malloc (sizeof (struct ForwardedOperationContext));
- GNUNET_SERVER_client_keep (client);
- fopc->client = client;
- fopc->operation_id = GNUNET_ntohll (msg->operation_id);
- fopc->type = OP_PEER_INFO;
- fopc->opc =
- GNUNET_TESTBED_forward_operation_msg_ (peer->details.remote.
- slave->controller,
- fopc->operation_id, &msg->header,
- &GST_forwarded_operation_reply_relay,
- fopc);
- fopc->timeout_task =
- GNUNET_SCHEDULER_add_delayed (GST_timeout, &GST_forwarded_operation_timeout,
- fopc);
- GNUNET_CONTAINER_DLL_insert_tail (fopcq_head, fopcq_tail, fopc);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- LOG_DEBUG ("Received PEER_GET_CONFIG for peer: %u\n", peer_id);
- config =
- GNUNET_CONFIGURATION_serialize (GST_peer_list[peer_id]->details.local.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_PEER_CONFIGURATION);
- reply->peer_id = msg->peer_id;
- reply->operation_id = msg->operation_id;
- GNUNET_TESTING_peer_get_identity (GST_peer_list[peer_id]->details.local.peer,
- &reply->peer_identity);
- reply->config_size = htons ((uint16_t) c_size);
- GST_queue_message (client, &reply->header);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
-}
-
-
-/**
- * Handler for GNUNET_MESSAGE_TYPE_TESTBED_GETSLAVECONFIG messages
- *
- * @param cls NULL
- * @param client identification of the client
- * @param message the actual message
- */
-static void
-handle_slave_get_config (void *cls, struct GNUNET_SERVER_Client *client,
- const struct GNUNET_MessageHeader *message)
-{
- struct GNUNET_TESTBED_SlaveGetConfigurationMessage *msg;
- struct Slave *slave;
- struct GNUNET_TESTBED_SlaveConfiguration *reply;
- char *config;
- char *xconfig;
- size_t config_size;
- size_t xconfig_size;
- size_t reply_size;
- uint64_t op_id;
- uint32_t slave_id;
-
- msg = (struct GNUNET_TESTBED_SlaveGetConfigurationMessage *) message;
- slave_id = ntohl (msg->slave_id);
- op_id = GNUNET_ntohll (msg->operation_id);
- if ((GST_slave_list_size <= slave_id) || (NULL == GST_slave_list[slave_id]))
- {
- /* FIXME: Add forwardings for this type of message here.. */
- GST_send_operation_fail_msg (client, op_id, "Slave not found");
- GNUNET_SERVER_receive_done (client, GNUNET_OK);