}
p = p->next;
}
- tunnel_add_path (t->tree, best_p, ¬ify_peer_disconnected);
+ tree_add_path (t->tree, best_p, ¬ify_peer_disconnected);
if (GNUNET_SCHEDULER_NO_TASK == t->path_refresh_task)
t->path_refresh_task =
GNUNET_SCHEDULER_add_delayed (t->tree->refresh, &path_refresh, t);
p = path_build_from_dht (get_path, put_path);
path_add_to_peer (peer_info, p);
tunnel_add_peer(t, peer_info);
- p = tunnel_get_path_to_peer(t->tree, peer_info->id);
+ p = tree_get_path_to_peer(t->tree, peer_info->id);
#if MESH_DEBUG
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"MESH: new route for tunnel 0x%x found, has %u hops\n",
* @return Pointer to the node of the peer. NULL if not found.
*/
struct MeshTunnelTreeNode *
-tunnel_find_peer (struct MeshTunnelTreeNode *root, GNUNET_PEER_Id peer_id)
+tree_find_peer (struct MeshTunnelTreeNode *root, GNUNET_PEER_Id peer_id)
{
struct MeshTunnelTreeNode *n;
unsigned int i;
return root;
for (i = 0; i < root->nchildren; i++)
{
- n = tunnel_find_peer (&root->children[i], peer_id);
+ n = tree_find_peer (&root->children[i], peer_id);
if (NULL != n)
return n;
}
* @param cb Callback to use to notify about disconnected peers.
*/
void
-tunnel_mark_peers_disconnected (struct MeshTunnelTreeNode *parent,
+tree_mark_peers_disconnected (struct MeshTunnelTreeNode *parent,
MeshNodeDisconnectCB cb)
{
unsigned int i;
parent->status = MESH_PEER_RECONNECTING;
for (i = 0; i < parent->nchildren; i++)
{
- tunnel_mark_peers_disconnected (&parent->children[i], cb);
+ tree_mark_peers_disconnected (&parent->children[i], cb);
}
// struct GNUNET_MESH_PeerControl msg;
// if (NULL == parent->t->client)
* @return pointer to the pathless node, NULL on error
*/
struct MeshTunnelTreeNode *
-tunnel_del_path (struct MeshTunnelTree *t, GNUNET_PEER_Id peer_id,
+tree_del_path (struct MeshTunnelTree *t, GNUNET_PEER_Id peer_id,
MeshNodeDisconnectCB cb)
{
struct MeshTunnelTreeNode *parent;
if (peer_id == t->root->peer)
return NULL;
- node = n = tunnel_find_peer (t->me, peer_id);
+ node = n = tree_find_peer (t->me, peer_id);
if (NULL == n)
return NULL;
parent = n->parent;
parent->nchildren--;
parent->children = GNUNET_realloc (parent->children, parent->nchildren);
- tunnel_mark_peers_disconnected (node, cb);
+ tree_mark_peers_disconnected (node, cb);
return node;
}
* Path must be destroyed afterwards.
*/
struct MeshPeerPath *
-tunnel_get_path_to_peer(struct MeshTunnelTree *t, GNUNET_PEER_Id peer)
+tree_get_path_to_peer(struct MeshTunnelTree *t, GNUNET_PEER_Id peer)
{
struct MeshTunnelTreeNode *n;
struct MeshPeerPath *p;
GNUNET_PEER_Id myid = t->me->peer;
- n = tunnel_find_peer(t->me, peer);
+ n = tree_find_peer(t->me, peer);
p = GNUNET_malloc(sizeof(struct MeshPeerPath));
/* Building the path (inverted!) */
* - do not disconnect peers until new path is created & connected
*/
int
-tunnel_add_path (struct MeshTunnelTree *t, const struct MeshPeerPath *p,
+tree_add_path (struct MeshTunnelTree *t, const struct MeshPeerPath *p,
MeshNodeDisconnectCB cb)
{
struct MeshTunnelTreeNode *parent;
}
if (1 == p->length)
return GNUNET_OK;
- oldnode = tunnel_del_path (t, p->peers[p->length - 1], cb);
+ oldnode = tree_del_path (t, p->peers[p->length - 1], cb);
/* Look for the first node that is not already present in the tree
*
* Assuming that the tree is somewhat balanced, O(log n * log N).
}
return GNUNET_OK;
}
+
+
+/**
+ * Destroy the node and all children
+ *
+ * @param n Parent node to be destroyed
+ */
+void
+tree_node_destroy (struct MeshTunnelTreeNode *n)
+{
+ unsigned int i;
+
+ if (n->nchildren == 0) return;
+ for (i = 0; i < n->nchildren; i++)
+ {
+ tree_node_destroy(&n->children[i]);
+ }
+ GNUNET_free(n->children);
+}
+
+
+/**
+ * Iterator over hash map peer entries and frees all data in it.
+ * Used prior to destroying a hashmap. Makes you miss anonymous functions in C.
+ *
+ * @param cls closure
+ * @param key current key code (will no longer contain valid data!!)
+ * @param value value in the hash map (treated as void *)
+ * @return GNUNET_YES if we should continue to iterate, GNUNET_NO if not.
+ */
+static int
+iterate_free (void *cls, const GNUNET_HashCode * key, void *value)
+{
+ GNUNET_free(value);
+ return GNUNET_YES;
+}
+
+
+/**
+ * Destroy the whole tree and free all used memory and Peer_Ids
+ *
+ * @param t Tree to be destroyed
+ */
+void
+tree_destroy (struct MeshTunnelTree *t)
+{
+ tree_node_destroy(t->root);
+ GNUNET_free(t->root);
+ GNUNET_CONTAINER_multihashmap_iterate(t->first_hops, &iterate_free, NULL);
+ GNUNET_CONTAINER_multihashmap_destroy(t->first_hops);
+
+}
\ No newline at end of file
*/
/**
- * @file mesh/mesh_tunnel_tree.h
+ * @file mesh/mesh_tree_tree.h
* @brief Tunnel tree handling functions
* @author Bartlomiej Polot
*/
* @return Pointer to the node of the peer. NULL if not found.
*/
struct MeshTunnelTreeNode *
-tunnel_find_peer (struct MeshTunnelTreeNode *root, GNUNET_PEER_Id peer_id);
+tree_find_peer (struct MeshTunnelTreeNode *root, GNUNET_PEER_Id peer_id);
/**
* @param cb Callback to use to notify about disconnected peers
*/
void
-tunnel_mark_peers_disconnected (struct MeshTunnelTreeNode *parent,
+tree_mark_peers_disconnected (struct MeshTunnelTreeNode *parent,
MeshNodeDisconnectCB cb);
* @return pointer to the pathless node, NULL on error
*/
struct MeshTunnelTreeNode *
-tunnel_del_path (struct MeshTunnelTree *t, GNUNET_PEER_Id peer_id,
+tree_del_path (struct MeshTunnelTree *t, GNUNET_PEER_Id peer_id,
MeshNodeDisconnectCB cb);
* Path must be destroyed afterwards.
*/
struct MeshPeerPath *
-tunnel_get_path_to_peer(struct MeshTunnelTree *t, GNUNET_PEER_Id peer);
+tree_get_path_to_peer(struct MeshTunnelTree *t, GNUNET_PEER_Id peer);
/**
* GNUNET_SYSERR in case of error.
*/
int
-tunnel_add_path (struct MeshTunnelTree *t, const struct MeshPeerPath *p,
- MeshNodeDisconnectCB cb);
\ No newline at end of file
+tree_add_path (struct MeshTunnelTree *t, const struct MeshPeerPath *p,
+ MeshNodeDisconnectCB cb);
+
+/**
+ * Destroy the whole tree and free all used memory and Peer_Ids
+ *
+ * @param t Tree to be destroyed
+ */
+void
+tree_destroy (struct MeshTunnelTree *t);
\ No newline at end of file
{
GNUNET_free(pi[i]);
}
- if (tree->root->nchildren > 0)
- GNUNET_free(tree->root->children);
- GNUNET_free(tree->root);
- GNUNET_free(tree);
+ tree_destroy(tree);
exit(0);
}
path[0]->length = 4;
finish();
- tunnel_add_path(tree, path[0], &cb);
- path[1] = tunnel_get_path_to_peer(tree, 3);
+ tree_add_path(tree, path[0], &cb);
+ path[1] = tree_get_path_to_peer(tree, 3);
if (path[0]->length != path[1]->length ||
memcmp(path[0]->peers, path[1]->peers, path[0]->length) != 0)
{
failed++;
}
path_destroy(path[1]);
- node = tunnel_find_peer(tree->root, 3);
+ node = tree_find_peer(tree->root, 3);
if (node->peer != 3)
{
GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Retrieved peer != original\n");
}
return 0;
- node = tunnel_find_peer(tree->root, 2);
+ node = tree_find_peer(tree->root, 2);
if (node->peer != 2)
{
GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Retrieved peer != original\n");
failed++;
}
- node = tunnel_find_peer(tree->root, 1);
+ node = tree_find_peer(tree->root, 1);
if (node->peer != 1)
{
GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Retrieved peer != original\n");
}
path[0]->length--;
- tunnel_add_path(tree, path[0], &cb);
+ tree_add_path(tree, path[0], &cb);
- node = tunnel_find_peer(tree->root, 2);
+ node = tree_find_peer(tree->root, 2);
if (node->peer != 2)
{
GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Retrieved peer != original\n");
failed++;
}
- node = tunnel_find_peer(tree->root, 1);
+ node = tree_find_peer(tree->root, 1);
if (node->peer != 1)
{
GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Retrieved peer != original\n");
path[0]->length++;
path[0]->peers[3] = 4;
- tunnel_add_path(tree, path[0], &cb);
+ tree_add_path(tree, path[0], &cb);
- node = tunnel_find_peer(tree->root, 2);
+ node = tree_find_peer(tree->root, 2);
if (node->peer != 2)
{
GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Retrieved peer != original\n");
failed++;
}
- node = tunnel_find_peer(tree->root, 1);
+ node = tree_find_peer(tree->root, 1);
if (node->peer != 1)
{
GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Retrieved peer != original\n");
failed++;
}
- node = tunnel_find_peer(tree->root, 4);
+ node = tree_find_peer(tree->root, 4);
if (node->peer != 4)
{
GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Retrieved peer != original\n");
}
node->status = MESH_PEER_READY;
cb_call = 1;
- node2 = tunnel_del_path(tree, 4, &cb);
+ node2 = tree_del_path(tree, 4, &cb);
if (cb_call != 0)
{
GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "%u callbacks missed!\n", cb_call);
failed++;
}
// GNUNET_free(node2); FIXME destroy
- node = tunnel_find_peer(tree->root, 2);
+ node = tree_find_peer(tree->root, 2);
if (node->peer != 2)
{
GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Retrieved peer != original\n");
path[0]->length = 2;
path[0]->peers[1] = 3;
cb_call = 1;
- tunnel_add_path(tree, path[0], cb);
+ tree_add_path(tree, path[0], cb);
if (cb_call != 0)
{
GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "%u callbacks missed!\n", cb_call);
failed++;
}
- node = tunnel_find_peer(tree->root, 2);
+ node = tree_find_peer(tree->root, 2);
if (node->peer != 2)
{
GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Retrieved peer != original\n");
GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Retrieved peer wrong nchildren!\n");
failed++;
}
- node = tunnel_find_peer(tree->root, 3);
+ node = tree_find_peer(tree->root, 3);
if (node->peer != 3)
{
GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Retrieved peer != original\n");