/* TODO cancel core transmit ready in case it was active */
}
tree_destroy(t->tree);
+ if (NULL != t->dht_get_type)
+ GNUNET_DHT_get_stop(t->dht_get_type);
+ t->dht_get_type = NULL;
GNUNET_free (t);
return r;
}
/************************ MAIN FUNCTIONS ****************************/
/******************************************************************************/
+/**
+ * Iterator over hash map entries.
+ *
+ * @param cls closure
+ * @param key current key code
+ * @param value value in the hash map
+ * @return GNUNET_YES if we should continue to
+ * iterate,
+ * GNUNET_NO if not.
+ */
+int
+shutdown_tunnel (void *cls, const GNUNET_HashCode * key, void *value)
+{
+ struct MeshTunnel *t = value;
+ tunnel_destroy(t);
+ return GNUNET_YES;
+}
+
/**
* Task run during shutdown.
*
GNUNET_CORE_disconnect (core_handle);
core_handle = NULL;
}
+ GNUNET_CONTAINER_multihashmap_iterate(tunnels, &shutdown_tunnel, NULL);
if (dht_handle != NULL)
{
GNUNET_DHT_disconnect (dht_handle);
static char *data_filename;
-struct GNUNET_TESTING_Daemon *d1;
+static struct GNUNET_TESTING_Daemon *d1;
-struct GNUNET_TESTING_Daemon *d2;
+static struct GNUNET_TESTING_Daemon *d2;
-struct GNUNET_MESH_Handle *h1;
+static struct GNUNET_MESH_Handle *h1;
-struct GNUNET_MESH_Handle *h2;
+static struct GNUNET_MESH_Handle *h2;
-struct GNUNET_MESH_Tunnel *t;
+static struct GNUNET_MESH_Tunnel *t;
+
+static uint16_t mesh_peers[16];
/**
* Check whether peers successfully shut down.
}
+/**
+ * Prototype of a callback function indicating that two peers
+ * are currently connected.
+ *
+ * @param cls closure
+ * @param first peer id for first daemon
+ * @param second peer id for the second daemon
+ * @param distance distance between the connected peers
+ * @param emsg error message (NULL on success)
+ */
+void
+topo_cb (void *cls,
+ const struct GNUNET_PeerIdentity* first,
+ const struct GNUNET_PeerIdentity* second,
+ const char *emsg)
+{
+ GNUNET_PEER_Id p1;
+ GNUNET_PEER_Id p2;
+ struct GNUNET_PeerIdentity id;
+
+ GNUNET_PEER_resolve(1, &id);
+ p1 = GNUNET_PEER_search(first);
+ if (p1 == 1)
+ {
+ p2 = GNUNET_PEER_search(second);
+ GNUNET_assert(p2 < num_peers);
+ if (0 == p2) return;
+ mesh_peers[p2]++;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "test: %s IS a neighbor\n",
+ GNUNET_i2s(second));
+ return;
+ }
+ p1 = GNUNET_PEER_search(second);
+ if (p1 == 1)
+ {
+ p2 = GNUNET_PEER_search(first);
+ GNUNET_assert(p2 < num_peers);
+ if (0 == p2) return;
+ mesh_peers[p2]++;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "test: %s IS a neighbor\n",
+ GNUNET_i2s(first));
+ return;
+ }
+}
+
/**
* connect_mesh_service: connect to the mesh service of one of the peers
*
connect_mesh_service (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
GNUNET_MESH_ApplicationType app;
+ unsigned int i;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: connect_mesh_service\n");
- d1 = GNUNET_TESTING_daemon_get (pg, 1);
- d2 = GNUNET_TESTING_daemon_get (pg, 3);
+ for (i = 1; i < num_peers; i++)
+ if (mesh_peers[i] == 0)
+ break;
+ GNUNET_assert (i < num_peers);
+ d2 = GNUNET_TESTING_daemon_get (pg, i);
app = (GNUNET_MESH_ApplicationType) 0;
#if VERBOSE
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: connecting to mesh service of peer %s\n",
- GNUNET_i2s (&d1->id));
+ "test: connecting to mesh service of peer %s (%u)\n",
+ GNUNET_i2s (&d1->id),
+ mesh_peers[0]);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: connecting to mesh service of peer %s\n",
- GNUNET_i2s (&d2->id));
+ "test: connecting to mesh service of peer %s (%u)\n",
+ GNUNET_i2s (&d2->id),
+ i);
#endif
h1 = GNUNET_MESH_connect (d1->cfg,
10,
{
char *buf;
int buf_len;
+ unsigned int i;
if (emsg != NULL)
{
GNUNET_free (buf);
}
peers_running = GNUNET_TESTING_daemons_running (pg);
+ for (i = 0; i < num_peers; i++)
+ {
+ d1 = GNUNET_TESTING_daemon_get (pg, i);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "test: %u: %s\n",
+ GNUNET_PEER_intern(&d1->id),
+ GNUNET_i2s (&d1->id));
+ mesh_peers[i] = 0;
+ }
+ GNUNET_TESTING_get_topology(pg, &topo_cb, NULL);
GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply(
GNUNET_TIME_UNIT_SECONDS,
- 2),
+ 4),
&connect_mesh_service,
NULL);
disconnect_task =