/*
This file is part of GNUnet
- (C) 2008--2013 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2008--2013 GNUnet e.V.
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
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.
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
*/
/**
{
struct ExpireOperationEntry *entry;
- entry = GNUNET_malloc (sizeof (struct ExpireOperationEntry));
+ entry = GNUNET_new (struct ExpireOperationEntry);
entry->op = op;
- GNUNET_CONTAINER_DLL_insert_tail (exop_head, exop_tail, entry);
+ GNUNET_CONTAINER_DLL_insert_tail (exop_head, exop_tail, entry);
}
{
struct SearchContext *sc = cls;
struct OperationContext *opc = value;
-
+
GNUNET_assert (NULL != opc);
GNUNET_assert (NULL == sc->opc);
if (opc->id != sc->id)
sc.id = id;
sc.opc = NULL;
GNUNET_assert (NULL != c->opc_map);
- if (GNUNET_SYSERR !=
+ if (GNUNET_SYSERR !=
GNUNET_CONTAINER_multihashmap32_get_multiple (c->opc_map, (uint32_t) id,
&opc_search_iterator, &sc))
return NULL;
if (NULL == c->opc_map)
c->opc_map = GNUNET_CONTAINER_multihashmap32_create (256);
GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multihashmap32_put (c->opc_map,
+ GNUNET_CONTAINER_multihashmap32_put (c->opc_map,
(uint32_t) opc->id, opc,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
}
* given controller
*
* @param c the controller
- * @param opc the operation context to remove
+ * @param opc the operation context to remove
*/
void
GNUNET_TESTBED_remove_opc_ (const struct GNUNET_TESTBED_Controller *c,
GNUNET_CONTAINER_multihashmap32_remove (c->opc_map,
(uint32_t) opc->id,
opc));
+ if ( (0 == GNUNET_CONTAINER_multihashmap32_size (c->opc_map))
+ && (NULL != c->opcq_empty_cb) )
+ c->opcq_empty_cb (c->opcq_empty_cls);
}
/**
- * Handler for GNUNET_MESSAGE_TYPE_TESTBED_ADDHOSTCONFIRM message from
+ * Handler for #GNUNET_MESSAGE_TYPE_TESTBED_ADD_HOST_SUCCESS 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
+ * @return #GNUNET_YES if we can continue receiving from service; #GNUNET_NO if
* not
*/
static int
}
GNUNET_TESTBED_remove_opc_ (opc->c, opc);
opc->state = OPC_STATE_FINISHED;
- exop_insert (event.op);
+ exop_insert (event.op);
if (0 != (c->event_mask & (1L << GNUNET_TESTBED_ET_OPERATION_FINISHED)))
{
if (NULL != c->cc)
/**
- * Handler for GNUNET_MESSAGE_TYPE_TESTBED_PEERCREATESUCCESS message from
+ * Handler for #GNUNET_MESSAGE_TYPE_TESTBED_CREATE_PEER_SUCCESS message from
* controller (testbed service)
*
* @param c the controller handle
* @param msg message received
- * @return GNUNET_YES if we can continue receiving from service; GNUNET_NO if
+ * @return #GNUNET_YES if we can continue receiving from service; #GNUNET_NO if
* not
*/
static int
GNUNET_assert (NULL != data->peer);
peer = data->peer;
GNUNET_assert (peer->unique_id == ntohl (msg->peer_id));
- peer->state = PS_CREATED;
+ peer->state = TESTBED_PS_CREATED;
GNUNET_TESTBED_peer_register_ (peer);
cb = data->cb;
cls = data->cls;
/**
- * Handler for GNUNET_MESSAGE_TYPE_TESTBED_PEEREVENT message from
+ * Handler for #GNUNET_MESSAGE_TYPE_TESTBED_PEER_EVENT 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
+ * @return #GNUNET_YES if we can continue receiving from service; #GNUNET_NO if
* not
*/
static int
switch (event.type)
{
case GNUNET_TESTBED_ET_PEER_START:
- peer->state = PS_STARTED;
+ peer->state = TESTBED_PS_STARTED;
event.details.peer_start.host = peer->host;
event.details.peer_start.peer = peer;
break;
case GNUNET_TESTBED_ET_PEER_STOP:
- peer->state = PS_STOPPED;
+ peer->state = TESTBED_PS_STOPPED;
event.details.peer_stop.peer = peer;
break;
default:
if (0 != (mask & c->event_mask))
{
if (NULL != c->cc)
- c->cc (c->cc_cls, &event);
+ c->cc (c->cc_cls, &event);
if (GNUNET_NO == exop_check (event.op))
return GNUNET_YES;
}
/**
- * Handler for GNUNET_MESSAGE_TYPE_TESTBED_PEERCONEVENT message from
+ * Handler for #GNUNET_MESSAGE_TYPE_TESTBED_PEER_CONNECT_EVENT 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
+ * @return #GNUNET_YES if we can continue receiving from service; #GNUNET_NO if
* not
*/
static int
c->cc (c->cc_cls, &event);
if (GNUNET_NO == exop_check (event.op))
return GNUNET_YES;
- }
+ }
if (NULL != cb)
cb (cb_cls, opc->op, NULL);
/* You could have marked the operation as done by now */
/**
- * Handler for GNUNET_MESSAGE_TYPE_TESTBED_PEERCONFIG message from
+ * Handler for #GNUNET_MESSAGE_TYPE_TESTBED_PEER_INFORMATION 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
+ * @return #GNUNET_YES if we can continue receiving from service; #GNUNET_NO if
* not
*/
static int
peer = data->peer;
GNUNET_assert (NULL != peer);
GNUNET_assert (ntohl (msg->peer_id) == peer->unique_id);
- pinfo = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_PeerInformation));
- pinfo->pit = data->pit;
+ pinfo = GNUNET_new (struct GNUNET_TESTBED_PeerInformation);
+ pinfo->pit = data->pit;
cb = data->cb;
cb_cls = data->cb_cls;
GNUNET_assert (NULL != cb);
GNUNET_free (data);
- opc->data = NULL;
+ opc->data = NULL;
switch (pinfo->pit)
{
case GNUNET_TESTBED_PIT_IDENTITY:
- pinfo->result.id = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
+ pinfo->result.id = GNUNET_new (struct GNUNET_PeerIdentity);
(void) memcpy (pinfo->result.id, &msg->peer_identity,
sizeof (struct GNUNET_PeerIdentity));
break;
break;
}
opc->data = pinfo;
- GNUNET_TESTBED_remove_opc_ (opc->c, opc);
+ GNUNET_TESTBED_remove_opc_ (opc->c, opc);
opc->state = OPC_STATE_FINISHED;
cb (cb_cls, opc->op, pinfo, NULL);
/* We dont check whether the operation is marked as done here as the
/**
- * Handler for GNUNET_MESSAGE_TYPE_TESTBED_OPERATIONFAILEVENT message from
+ * Handler for #GNUNET_MESSAGE_TYPE_TESTBED_OPERATION_FAIL_EVENT 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
+ * @return #GNUNET_YES if we can continue receiving from service; #GNUNET_NO if
* not
*/
static int
struct OverlayConnectData *data;
data = opc->data;
- data->failed = GNUNET_YES;
+ GNUNET_TESTBED_operation_mark_failed (opc->op);
if (NULL != data->cb)
data->cb (data->cb_cls, opc->op, emsg);
}
case OP_FORWARDED:
GNUNET_assert (0);
case OP_LINK_CONTROLLERS: /* No secondary callback */
- break;
+ break;
case OP_SHUTDOWN_PEERS:
{
struct ShutdownPeersData *data;
/**
- * Handler for GNUNET_MESSAGE_TYPE_TESTBED_SLAVECONFIG message from controller
+ * Handler for #GNUNET_MESSAGE_TYPE_TESTBED_SLAVE_CONFIGURATION 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
+ * @return #GNUNET_YES if we can continue receiving from service; #GNUNET_NO if
* not
*/
static int
/**
- * Handler for GNUNET_MESSAGE_TYPE_TESTBED_SLAVECONFIG message from controller
+ * Handler for #GNUNET_MESSAGE_TYPE_TESTBED_LINK_CONTROLLERS_RESULT 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
+ * @return #GNUNET_YES if we can continue receiving from service; #GNUNET_NO if
* not
*/
static int
msg);
break;
case GNUNET_MESSAGE_TYPE_TESTBED_LINK_CONTROLLERS_RESULT:
- status =
+ status =
handle_link_controllers_result (c,
(const struct
GNUNET_TESTBED_ControllerLinkResponse
*) msg);
break;
+ case GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS:
+ status =
+ GNUNET_TESTBED_handle_barrier_status_ (c,
+ (const struct
+ GNUNET_TESTBED_BarrierStatusMsg *)
+ msg);
+ break;
default:
GNUNET_assert (0);
}
size = ntohs (msg->size);
GNUNET_assert ((GNUNET_MESSAGE_TYPE_TESTBED_INIT <= type) &&
(GNUNET_MESSAGE_TYPE_TESTBED_MAX > type));
- mq_entry = GNUNET_malloc (sizeof (struct MessageQueue));
+ mq_entry = GNUNET_new (struct MessageQueue);
mq_entry->msg = msg;
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Queueing message of type %u, size %u for sending\n", type,
struct GNUNET_MessageHeader *dup_msg;
uint16_t msize;
- data = GNUNET_malloc (sizeof (struct ForwardedOperationData));
+ data = GNUNET_new (struct ForwardedOperationData);
data->cc = cc;
data->cc_cls = cc_cls;
- opc = GNUNET_malloc (sizeof (struct OperationContext));
+ opc = GNUNET_new (struct OperationContext);
opc->c = controller;
opc->type = OP_FORWARDED;
opc->data = data;
switch (opc->state)
{
case OPC_STATE_INIT:
- GNUNET_free (data->msg);
+ GNUNET_free (data->msg);
break;
case OPC_STATE_STARTED:
GNUNET_TESTBED_remove_opc_ (opc->c, opc);
GNUNET_break (0);
return NULL;
}
- controller = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_Controller));
+ controller = GNUNET_new (struct GNUNET_TESTBED_Controller);
controller->cc = cc;
controller->cc_cls = cc_cls;
controller->event_mask = event_mask;
GNUNET_TESTBED_mark_host_registered_at_ (host, controller);
controller->host = host;
controller->opq_parallel_operations =
- GNUNET_TESTBED_operation_queue_create_ ((unsigned int)
- max_parallel_operations);
+ GNUNET_TESTBED_operation_queue_create_ (OPERATION_QUEUE_TYPE_FIXED,
+ (unsigned int) max_parallel_operations);
controller->opq_parallel_service_connections =
- GNUNET_TESTBED_operation_queue_create_ ((unsigned int)
+ GNUNET_TESTBED_operation_queue_create_ (OPERATION_QUEUE_TYPE_FIXED,
+ (unsigned int)
max_parallel_service_connections);
controller->opq_parallel_topology_config_operations =
- GNUNET_TESTBED_operation_queue_create_ ((unsigned int)
+ GNUNET_TESTBED_operation_queue_create_ (OPERATION_QUEUE_TYPE_FIXED,
+ (unsigned int)
max_parallel_topology_config_operations);
controller_hostname = GNUNET_TESTBED_host_get_hostname (host);
if (NULL == controller_hostname)
GNUNET_assert (NULL != opc);
GNUNET_break (0);
- GNUNET_assert (GNUNET_YES ==
+ GNUNET_assert (GNUNET_YES ==
GNUNET_CONTAINER_multihashmap32_remove (map, key, value));
GNUNET_free (opc);
return GNUNET_YES;
* @param c handle to controller to stop
*/
void
-GNUNET_TESTBED_controller_disconnect (struct GNUNET_TESTBED_Controller
- *c)
+GNUNET_TESTBED_controller_disconnect (struct GNUNET_TESTBED_Controller *c)
{
struct MessageQueue *mq_entry;
char *xconfig;
size_t size_;
size_t xsize_;
-
+
config = GNUNET_CONFIGURATION_serialize (cfg, &size_);
xsize_ = GNUNET_TESTBED_compress_config_ (config, size_, &xconfig);
GNUNET_free (config);
uint32_t slave_host_id;
uint32_t delegated_host_id;
uint16_t msg_size;
-
+
GNUNET_assert (GNUNET_YES ==
GNUNET_TESTBED_is_host_registered_ (delegated_host, master));
slave_host_id =
msg->delegated_host_id = htonl (delegated_host_id);
msg->slave_host_id = htonl (slave_host_id);
msg->is_subordinate = (GNUNET_YES == is_subordinate) ? 1 : 0;
- data = GNUNET_malloc (sizeof (struct ControllerLinkData));
+ data = GNUNET_new (struct ControllerLinkData);
data->msg = msg;
data->host_id = delegated_host_id;
- opc = GNUNET_malloc (sizeof (struct OperationContext));
+ opc = GNUNET_new (struct OperationContext);
opc->c = master;
opc->data = data;
opc->type = OP_LINK_CONTROLLERS;
struct OperationContext *opc;
struct GetSlaveConfigData *data;
- data = GNUNET_malloc (sizeof (struct GetSlaveConfigData));
+ data = GNUNET_new (struct GetSlaveConfigData);
data->slave_id = slave_host_id;
- opc = GNUNET_malloc (sizeof (struct OperationContext));
+ opc = GNUNET_new (struct OperationContext);
opc->state = OPC_STATE_INIT;
opc->c = master;
opc->id = GNUNET_TESTBED_get_next_op_id (master);
/**
- * Signal that the information from an operation has been fully
- * processed. This function MUST be called for each event
- * of type 'operation_finished' to fully remove the operation
- * from the operation queue. After calling this function, the
- * 'op_result' becomes invalid (!).
+ * This function is used to signal that the event information (struct
+ * GNUNET_TESTBED_EventInformation) from an operation has been fully processed
+ * i.e. if the event callback is ever called for this operation. If the event
+ * callback for this operation has not yet been called, calling this function
+ * cancels the operation, frees its resources and ensures the no event is
+ * generated with respect to this operation. Note that however cancelling an
+ * operation does NOT guarantee that the operation will be fully undone (or that
+ * nothing ever happened).
*
- * @param operation operation to signal completion for
+ * This function MUST be called for every operation to fully remove the
+ * operation from the operation queue. After calling this function, if
+ * operation is completed and its event information is of type
+ * GNUNET_TESTBED_ET_OPERATION_FINISHED, the 'op_result' becomes invalid (!).
+
+ * If the operation is generated from GNUNET_TESTBED_service_connect() then
+ * calling this function on such as operation calls the disconnect adapter if
+ * the connect adapter was ever called.
+ *
+ * @param operation operation to signal completion or cancellation
*/
void
GNUNET_TESTBED_operation_done (struct GNUNET_TESTBED_Operation *operation)
/**
* Generates configuration by uncompressing configuration in given message. The
* given message should be of the following types:
- * GNUNET_MESSAGE_TYPE_TESTBED_PEER_INFORMATION,
- * GNUNET_MESSAGE_TYPE_TESTBED_SLAVE_CONFIGURATION,
- * GNUNET_MESSAGE_TYPE_TESTBED_ADD_HOST,
- * GNUNET_MESSAGE_TYPE_TESTBED_LINK_CONTROLLERS,
- * GNUNET_MESSAGE_TYPE_TESTBED_LINK_CONTROLLERS_RESULT,
+ * #GNUNET_MESSAGE_TYPE_TESTBED_PEER_INFORMATION,
+ * #GNUNET_MESSAGE_TYPE_TESTBED_SLAVE_CONFIGURATION,
+ * #GNUNET_MESSAGE_TYPE_TESTBED_ADD_HOST,
+ * #GNUNET_MESSAGE_TYPE_TESTBED_LINK_CONTROLLERS,
+ * #GNUNET_MESSAGE_TYPE_TESTBED_LINK_CONTROLLERS_RESULT,
*
* @param msg the message containing compressed configuration
* @return handle to the parsed configuration; NULL upon error while parsing the message
{
const struct GNUNET_TESTBED_AddHostMessage *imsg;
uint16_t osize;
-
+
imsg = (const struct GNUNET_TESTBED_AddHostMessage *) msg;
data_len = (uLong) ntohs (imsg->config_size);
osize = sizeof (struct GNUNET_TESTBED_AddHostMessage) +
- ntohs (imsg->username_length) + ntohs (imsg->hostname_length);
+ ntohs (imsg->username_length) + ntohs (imsg->hostname_length);
xdata_len = ntohs (imsg->header.size) - osize;
xdata = (const Bytef *) ((const void *) imsg + osize);
}
case GNUNET_MESSAGE_TYPE_TESTBED_LINK_CONTROLLERS_RESULT:
{
const struct GNUNET_TESTBED_ControllerLinkResponse *imsg;
-
+
imsg = (const struct GNUNET_TESTBED_ControllerLinkResponse *) msg;
data_len = ntohs (imsg->config_size);
- xdata_len = ntohs (imsg->header.size) -
+ xdata_len = ntohs (imsg->header.size) -
sizeof (const struct GNUNET_TESTBED_ControllerLinkResponse);
xdata = (const Bytef *) &imsg[1];
}
struct GNUNET_TESTBED_ShutdownPeersMessage *msg;
opc->state = OPC_STATE_STARTED;
- msg = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_ShutdownPeersMessage));
- msg->header.size =
+ msg = GNUNET_new (struct GNUNET_TESTBED_ShutdownPeersMessage);
+ msg->header.size =
htons (sizeof (struct GNUNET_TESTBED_ShutdownPeersMessage));
msg->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_SHUTDOWN_PEERS);
msg->operation_id = GNUNET_htonll (opc->id);
if (0 != GNUNET_CONTAINER_multihashmap32_size (c->opc_map))
return NULL;
- data = GNUNET_malloc (sizeof (struct ShutdownPeersData));
+ data = GNUNET_new (struct ShutdownPeersData);
data->cb = cb;
data->cb_cls = cb_cls;
- opc = GNUNET_malloc (sizeof (struct OperationContext));
+ opc = GNUNET_new (struct OperationContext);
opc->c = c;
opc->op_cls = op_cls;
opc->data = data;
opc->id = GNUNET_TESTBED_get_next_op_id (c);
opc->type = OP_SHUTDOWN_PEERS;
- opc->state = OPC_STATE_INIT;
+ opc->state = OPC_STATE_INIT;
opc->op = GNUNET_TESTBED_operation_create_ (opc, &opstart_shutdown_peers,
&oprelease_shutdown_peers);
GNUNET_TESTBED_operation_queue_insert_ (opc->c->opq_parallel_operations,
}
+/**
+ * Return the index of the peer inside of the total peer array,
+ * aka. the peer's "unique ID".
+ *
+ * @param peer Peer handle.
+ *
+ * @return The peer's unique ID.
+ */
+uint32_t
+GNUNET_TESTBED_get_index (const struct GNUNET_TESTBED_Peer *peer)
+{
+ return peer->unique_id;
+}
+
/* end of testbed_api.c */