"Cannot determine the ip of master controller: %s\n", STRERROR (errno));
GNUNET_assert (0);
}
+ LOG_DEBUG ("Master Controller IP: %s\n", master_context->master_ip);
master_context->system =
GNUNET_TESTING_system_create ("testbed", master_context->master_ip);
host = GNUNET_TESTBED_host_create_with_id (master_context->host_id,
msg = (const struct GNUNET_TESTBED_PeerStartMessage *) message;
peer_id = ntohl (msg->peer_id);
if ((peer_id >= peer_list_size)
- || (NULL == peer_list[peer_id])
- || (GNUNET_OK != GNUNET_TESTING_peer_start (peer_list[peer_id]->peer)))
+ || (NULL == peer_list[peer_id]))
{
GNUNET_break (0);
/* FIXME: reply with failure message or forward to slave controller */
static void
controller_cb(void *cls, const struct GNUNET_TESTBED_EventInformation *event)
{
- GNUNET_assert (GNUNET_TESTBED_ET_OPERATION_FINISHED == event->type);
- GNUNET_assert (event->details.operation_finished.operation == operation);
- GNUNET_assert (NULL == event->details.operation_finished.op_cls);
- GNUNET_assert (NULL == event->details.operation_finished.emsg);
- GNUNET_assert (GNUNET_TESTBED_PIT_GENERIC ==
- event->details.operation_finished.pit);
- GNUNET_assert (NULL == event->details.operation_finished.op_result.generic);
- result = GNUNET_YES;
- GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
+ switch (event->type)
+ {
+ case GNUNET_TESTBED_ET_OPERATION_FINISHED:
+ GNUNET_assert (event->details.operation_finished.operation == operation);
+ GNUNET_assert (NULL == event->details.operation_finished.op_cls);
+ GNUNET_assert (NULL == event->details.operation_finished.emsg);
+ GNUNET_assert (GNUNET_TESTBED_PIT_GENERIC ==
+ event->details.operation_finished.pit);
+ GNUNET_assert (NULL == event->details.operation_finished.op_result.generic);
+ break;
+ case GNUNET_TESTBED_ET_PEER_START:
+ GNUNET_assert (event->details.peer_start.host == host);
+ GNUNET_assert (event->details.peer_start.peer == peer);
+ operation = GNUNET_TESTBED_peer_stop (peer);
+ break;
+ case GNUNET_TESTBED_ET_PEER_STOP:
+ GNUNET_assert (event->details.peer_stop.peer == peer);
+ result = GNUNET_YES;
+ GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
+ break;
+ default:
+ GNUNET_assert (0); /* We should never reach this state */
+ }
}
GNUNET_assert (NULL != peer);
GNUNET_assert (NULL != peer_ptr);
*peer_ptr = peer;
- operation = GNUNET_TESTBED_peer_destroy (peer);
+ operation = GNUNET_TESTBED_peer_start (peer);
GNUNET_assert (NULL != operation);
}
break;
default:
GNUNET_break (0);
- }
+ }
+ GNUNET_CONTAINER_DLL_remove (c->op_head, c->op_tail, op);
+ GNUNET_free (op);
if (NULL != event)
{
if (NULL != c->cc)
c->cc (c->cc_cls, event);
GNUNET_free (event);
}
- GNUNET_CONTAINER_DLL_remove (c->op_head, c->op_tail, op);
- GNUNET_free (op);
return GNUNET_YES;
}
}
+/**
+ * Handler for GNUNET_MESSAGE_TYPE_TESTBED_PEEREVENT message from
+ * controller (testbed service)
+ *
+ * @param c the controller handler
+ * @param msg message received
+ * @return GNUNET_YES if we can continue receiving from service; GNUNET_NO if
+ * not
+ */
+static int
+handle_peer_event (struct GNUNET_TESTBED_Controller *c,
+ const struct GNUNET_TESTBED_PeerEventMessage *msg)
+{
+ struct GNUNET_TESTBED_Operation *op;
+ struct GNUNET_TESTBED_Peer *peer;
+ struct GNUNET_TESTBED_EventInformation event;
+ uint64_t op_id;
+
+ GNUNET_assert (sizeof (struct GNUNET_TESTBED_PeerEventMessage)
+ == ntohs (msg->header.size));
+ op_id = GNUNET_ntohll (msg->operation_id);
+ for (op = c->op_head; NULL != op; op = op->next)
+ {
+ if (op->operation_id == op_id)
+ break;
+ }
+ if (NULL == op)
+ {
+ LOG_DEBUG ("Operation not found\n");
+ return GNUNET_YES;
+ }
+ GNUNET_assert ((OP_PEER_START == op->type) || (OP_PEER_STOP == op->type));
+ peer = op->data;
+ GNUNET_assert (NULL != peer);
+ event.type = (enum GNUNET_TESTBED_EventType) ntohl (msg->event_type);
+ switch (event.type)
+ {
+ case GNUNET_TESTBED_ET_PEER_START:
+ event.details.peer_start.host = peer->host;
+ event.details.peer_start.peer = peer;
+ break;
+ case GNUNET_TESTBED_ET_PEER_STOP:
+ event.details.peer_stop.peer = peer;
+ break;
+ default:
+ GNUNET_assert (0); /* We should never reach this state */
+ }
+ GNUNET_CONTAINER_DLL_remove (c->op_head, c->op_tail, op);
+ GNUNET_free (op);
+ if (0 != ((GNUNET_TESTBED_ET_PEER_START | GNUNET_TESTBED_ET_PEER_STOP)
+ & c->event_mask))
+ {
+ if (NULL != c->cc)
+ c->cc (c->cc_cls, &event);
+ }
+ return GNUNET_YES;
+}
+
+
/**
* Handler for messages from controller (testbed service)
*
handle_peer_create_success
(c, (const struct GNUNET_TESTBED_PeerCreateSuccessEventMessage *)msg);
break;
+ case GNUNET_MESSAGE_TYPE_TESTBED_PEEREVENT:
+ status =
+ handle_peer_event (c, (const struct GNUNET_TESTBED_PeerEventMessage *) msg);
+ break;
default:
GNUNET_break (0);
}
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;
}