+static void
+do_connect_core (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ int c_p;
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Connecting to all CORE services\n");
+ for (c_p = 0; c_p < c_master_peers; c_p++)
+ {
+ bp_master[c_p].core_op = GNUNET_TESTBED_service_connect (NULL,
+ bp_master[c_p].peer, "core",
+ core_connect_completion_cb, NULL,
+ &core_connect_adapter,
+ &core_disconnect_adapter,
+ &bp_master[c_p]);
+
+ }
+
+ for (c_p = 0; c_p < c_slave_peers; c_p++)
+ {
+ bp_slaves[c_p].core_op = GNUNET_TESTBED_service_connect (NULL,
+ bp_slaves[c_p].peer, "core",
+ core_connect_completion_cb, NULL,
+ &core_connect_adapter,
+ &core_disconnect_adapter,
+ &bp_slaves[c_p]);
+ }
+}
+
+
+
+/**
+ * Called to open a connection to the peer's ATS performance
+ *
+ * @param cls peer context
+ * @param cfg configuration of the peer to connect to; will be available until
+ * GNUNET_TESTBED_operation_done() is called on the operation returned
+ * from GNUNET_TESTBED_service_connect()
+ * @return service handle to return in 'op_result', NULL on error
+ */
+static void *
+ats_perf_connect_adapter (void *cls,
+ const struct GNUNET_CONFIGURATION_Handle *cfg)
+{
+ struct BenchmarkPeer *peer = cls;
+
+ peer->p_handle = GNUNET_ATS_performance_init (cfg, &ats_performance_info_cb, peer);
+ if (NULL == peer->p_handle)
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to create ATS performance handle \n");
+ return peer->p_handle;
+}
+
+
+/**
+ * Called to disconnect from peer's statistics service
+ *
+ * @param cls peer context
+ * @param op_result service handle returned from the connect adapter
+ */
+static void
+ats_perf_disconnect_adapter (void *cls, void *op_result)
+{
+ struct BenchmarkPeer *peer = cls;
+
+ GNUNET_ATS_performance_done(peer->p_handle);
+ peer->p_handle = NULL;
+}
+
+
+/**
+ * Callback to be called when a service connect operation is completed
+ *
+ * @param cls the callback closure from functions generating an operation
+ * @param op the operation that has been finished
+ * @param ca_result the service handle returned from GNUNET_TESTBED_ConnectAdapter()
+ * @param emsg error message in case the operation has failed; will be NULL if
+ * operation has executed successfully.
+ */
+static void
+ats_connect_completion_cb (void *cls,
+ struct GNUNET_TESTBED_Operation *op,
+ void *ca_result,
+ const char *emsg )
+{
+ static int op_done = 0;
+ if ((NULL != emsg) || (NULL == ca_result))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ _("Initialization failed, shutdown\n"));
+ GNUNET_break (0);
+ if (GNUNET_SCHEDULER_NO_TASK != shutdown_task)
+ GNUNET_SCHEDULER_cancel(shutdown_task);
+ shutdown_task = GNUNET_SCHEDULER_add_now (do_shutdown, NULL);
+ return;
+ }
+
+ op_done ++;
+ if (op_done == (c_slave_peers + c_master_peers))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Connected to all ATS services\n");
+ state.connected_ATS_service = GNUNET_YES;
+ GNUNET_SCHEDULER_add_now (&do_connect_core, NULL);
+ }
+}
+
+static void
+do_connect_ats (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ int c_p;
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Connecting to all ATS services %u\n", c_slave_peers);
+ for (c_p = 0; c_p < c_master_peers; c_p++)
+ {
+ bp_master[c_p].ats_perf_op = GNUNET_TESTBED_service_connect (NULL,
+ bp_master[c_p].peer, "ats",
+ ats_connect_completion_cb, NULL,
+ &ats_perf_connect_adapter,
+ &ats_perf_disconnect_adapter,
+ &bp_master[c_p]);
+
+ }
+
+ for (c_p = 0; c_p < c_slave_peers; c_p++)
+ {
+ bp_slaves[c_p].ats_perf_op = GNUNET_TESTBED_service_connect (NULL,
+ bp_slaves[c_p].peer, "ats",
+ ats_connect_completion_cb, NULL,
+ &ats_perf_connect_adapter,
+ &ats_perf_disconnect_adapter,
+ &bp_slaves[c_p]);
+ }
+
+}
+