X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fmesh%2Fmesh_tunnel_tree.h;h=84fd0acb22521e07cbe6f03671970274e697e354;hb=2ccf509cc0cfb052df901c871fdf523d7063333f;hp=82a1d1d1bd6cc045d49c2493fd9ced4509d439a5;hpb=2e9731ebda48bf2549aed64ca9cdfea5b298f9d7;p=oweals%2Fgnunet.git diff --git a/src/mesh/mesh_tunnel_tree.h b/src/mesh/mesh_tunnel_tree.h index 82a1d1d1b..84fd0acb2 100644 --- a/src/mesh/mesh_tunnel_tree.h +++ b/src/mesh/mesh_tunnel_tree.h @@ -19,7 +19,7 @@ */ /** - * @file mesh/mesh_tree_tree.h + * @file mesh/mesh_tunnel_tree.h * @brief Tunnel tree handling functions * @author Bartlomiej Polot */ @@ -58,93 +58,13 @@ struct MeshPeerPath /** * Node of path tree for a tunnel */ -struct MeshTunnelTreeNode -{ - /** - * Tunnel this node belongs to (and therefore tree) - */ - struct MeshTunnel *t; - - /** - * Peer this node describes - */ - GNUNET_PEER_Id peer; - - /** - * Parent node in the tree - */ - struct MeshTunnelTreeNode *parent; - - /** - * DLL of siblings - */ - struct MeshTunnelTreeNode *next; - - /** - * DLL of siblings - */ - struct MeshTunnelTreeNode *prev; - - /** - * DLL of children - */ - struct MeshTunnelTreeNode *children_head; - - /** - * DLL of children - */ - struct MeshTunnelTreeNode *children_tail; - - /** - * Status of the peer in the tunnel - */ - enum MeshPeerState status; -}; +struct MeshTunnelTreeNode; /** * Tree to reach all peers in the tunnel */ -struct MeshTunnelTree -{ - /** - * How often to refresh the path - */ - struct GNUNET_TIME_Relative refresh; - - /** - * Tunnel this path belongs to - */ - struct MeshTunnel *t; - - /** - * Root node of peer tree - */ - struct MeshTunnelTreeNode *root; - - /** - * Node that represents our position in the tree (for non local tunnels) - */ - struct MeshTunnelTreeNode *me; - - /** - * DLL of disconneted nodes - */ - struct MeshTunnelTreeNode *disconnected_head; - - /** - * DLL of disconneted nodes - */ - struct MeshTunnelTreeNode *disconnected_tail; - - /** - * Cache of all peers and the first hop to them. - * Indexed by PeerIdentity, contains a pointer to the PeerIdentity - * of 1st hop. - */ - struct GNUNET_CONTAINER_MultiHashMap *first_hops; - -}; +struct MeshTunnelTree; /******************************************************************************/ @@ -152,9 +72,9 @@ struct MeshTunnelTree /******************************************************************************/ /** - * Create a new path + * Create a new path. * - * @param lenght How many hops will the path have. + * @param length How many hops will the path have. * * @return A newly allocated path with a peer array of the specified length. */ @@ -163,61 +83,33 @@ path_new (unsigned int length); /** - * Invert the path + * Invert the path. * - * @param p the path to invert + * @param path The path to invert. */ void -path_invert (struct MeshPeerPath *p); +path_invert (struct MeshPeerPath *path); /** * Duplicate a path, incrementing short peer's rc. * - * @param p The path to duplicate. + * @param path The path to duplicate. */ struct MeshPeerPath * path_duplicate (struct MeshPeerPath *path); /** - * Find the first peer whom to send a packet to go down this path - * - * @param t The tunnel tree to use - * @param peer The peerinfo of the peer we are trying to reach - * - * @return peerinfo of the peer who is the first hop in the tunnel - * NULL on error - */ -struct GNUNET_PeerIdentity * -path_get_first_hop (struct MeshTunnelTree *t, - GNUNET_PEER_Id peer); - - -/** - * Get the length of a path - * - * @param p The path to measure, with the local peer at any point of it - * - * @return Number of hops to reach destination - * UINT_MAX in case the peer is not in the path - */ -unsigned int -path_get_length (struct MeshPeerPath *p); - - -/** - * Get the cost of the path relative to the already built tunnel tree + * Get the length of a path. * - * @param t The tunnel tree to which compare - * @param path The individual path to reach a peer + * @param path The path to measure, with the local peer at any point of it. * - * @return Number of hops to reach destination, UINT_MAX in case the peer is not - * in the path + * @return Number of hops to reach destination. + * UINT_MAX in case the peer is not in the path. */ unsigned int -path_get_cost (struct MeshTunnelTree *t, - struct MeshPeerPath *path); +path_get_length (struct MeshPeerPath *path); /** @@ -236,47 +128,105 @@ path_destroy (struct MeshPeerPath *p); /** * Method called whenever a node has been marked as disconnected. * - * @param node peer identity the tunnel stopped working with + * @param cls Closure. + * @param peer_id short ID of peer that is no longer reachable. */ -typedef void (*MeshNodeDisconnectCB) (const struct MeshTunnelTreeNode * node); +typedef void (*MeshTreeCallback) (void *cls, GNUNET_PEER_Id peer_id); /** * Create a new tunnel tree associated to a tunnel * - * @param t Tunnel this tree will represent * @param peer A short peer id of the root of the tree * * @return A newly allocated and initialized tunnel tree */ struct MeshTunnelTree * -tree_new (struct MeshTunnel *t, GNUNET_PEER_Id peer); +tree_new (GNUNET_PEER_Id peer); + + +/** + * Set the status of a node. + * + * @param tree Tree. + * @param peer A short peer id of the node. + * @param status New status to set. + */ +void +tree_set_status (struct MeshTunnelTree *tree, GNUNET_PEER_Id peer, + enum MeshPeerState status); + + +/** + * Get the status of a node. + * + * @param tree Tree whose local id we want to now. + * @param peer A short peer id of the node. + * + * @return Short peer id of local peer. + */ +enum MeshPeerState +tree_get_status (struct MeshTunnelTree *tree, GNUNET_PEER_Id peer); /** - * Recursively find the given peer in the tree. + * Get the id of the predecessor of the local node. * - * @param parent Parent node where to start looking. - * @param peer Short ID of peer to find. + * @param tree Tree whose local id we want to now. + * + * @return Short peer id of local peer. + */ +GNUNET_PEER_Id +tree_get_predecessor (struct MeshTunnelTree *tree); + + +/** + * Find the first peer whom to send a packet to go down this path + * + * @param t The tunnel tree to use + * @param peer The peerinfo of the peer we are trying to reach + * + * @return peerinfo of the peer who is the first hop in the tunnel + * NULL on error + */ +struct GNUNET_PeerIdentity * +tree_get_first_hop (struct MeshTunnelTree *t, GNUNET_PEER_Id peer); + + +/** + * Find the given peer in the tree. + * + * @param tree Tree where to look for the peer. + * @param peer_id Peer to find. * * @return Pointer to the node of the peer. NULL if not found. */ struct MeshTunnelTreeNode * -tree_find_peer (struct MeshTunnelTreeNode *parent, - GNUNET_PEER_Id peer); +tree_find_peer (struct MeshTunnelTree *tree, GNUNET_PEER_Id peer_id); + + +/** + * Iterate over all children of the local node. + * + * @param tree Tree to use. Must have "me" set. + * @param cb Callback to call over each child. + * @param cls Closure. + */ +void +tree_iterate_children (struct MeshTunnelTree *tree, MeshTreeCallback cb, + void *cls); /** * Recusively update the info about what is the first hop to reach the node * - * @param tree Tree this nodes belongs to - * @param parent Node to be start updating + * @param tree Tree this nodes belongs to. + * @param parent_id Short ID from node form which to start updating. * @param hop If known, ID of the first hop. * If not known, NULL to find out and pass on children. */ void -tree_update_first_hops (struct MeshTunnelTree *tree, - struct MeshTunnelTreeNode *parent, +tree_update_first_hops (struct MeshTunnelTree *tree, GNUNET_PEER_Id parent_id, struct GNUNET_PeerIdentity *hop); /** @@ -285,17 +235,17 @@ tree_update_first_hops (struct MeshTunnelTree *tree, * a new path to it or destroy it explicitly, taking care of it's child nodes. * * @param t Tunnel tree where to delete the path from. - * @param peer Destination peer whose path we want to remove. + * @param peer_id Short ID of the destination peer whose path we want to remove. * @param cb Callback to use to notify about which peers are going to be * disconnected. + * @param cbcls Closure for cb. * * @return pointer to the pathless node. * NULL when not found */ struct MeshTunnelTreeNode * -tree_del_path (struct MeshTunnelTree *t, - GNUNET_PEER_Id peer, - MeshNodeDisconnectCB cb); +tree_del_path (struct MeshTunnelTree *t, GNUNET_PEER_Id peer_id, + MeshTreeCallback cb, void *cbcls); /** @@ -309,8 +259,7 @@ tree_del_path (struct MeshTunnelTree *t, * Path must be destroyed afterwards. */ struct MeshPeerPath * -tree_get_path_to_peer(struct MeshTunnelTree *t, - GNUNET_PEER_Id peer); +tree_get_path_to_peer (struct MeshTunnelTree *t, GNUNET_PEER_Id peer); /** @@ -318,15 +267,15 @@ tree_get_path_to_peer(struct MeshTunnelTree *t, * * @param t Tunnel where to add the new path. * @param p Path to be integrated. - * @param cb Callback to use to notify about peers temporarily disconnecting + * @param cb Callback to use to notify about peers temporarily disconnecting. + * @param cbcls Closure for cb. * * @return GNUNET_OK in case of success. * GNUNET_SYSERR in case of error. */ int -tree_add_path (struct MeshTunnelTree *t, - const struct MeshPeerPath *p, - MeshNodeDisconnectCB cb); +tree_add_path (struct MeshTunnelTree *t, const struct MeshPeerPath *p, + MeshTreeCallback cb, void *cbcls); /** @@ -337,14 +286,45 @@ tree_add_path (struct MeshTunnelTree *t, * @param p1 Short id of one of the peers (order unimportant) * @param p2 Short id of one of the peers (order unimportant) * @param cb Function to call for every peer that is marked as disconnected. + * @param cbcls Closure for cb. * * @return Short ID of the first disconnected peer in the tree. */ GNUNET_PEER_Id -tree_notify_connection_broken (struct MeshTunnelTree *t, - GNUNET_PEER_Id p1, - GNUNET_PEER_Id p2, - MeshNodeDisconnectCB cb); +tree_notify_connection_broken (struct MeshTunnelTree *t, GNUNET_PEER_Id p1, + GNUNET_PEER_Id p2, MeshTreeCallback cb, + void *cbcls); + + +/** + * Deletes a peer from a tunnel, liberating all unused resources on the path to + * it. It shouldn't have children, if it has they will be destroyed as well. + * If the tree is not local and no longer has any paths, the root node will be + * destroyed and marked as NULL. + * + * @param t Tunnel tree to use. + * @param peer Short ID of the peer to remove from the tunnel tree. + * @param cb Callback to notify client of disconnected peers. + * @param cbcls Closure for cb. + * + * @return GNUNET_YES if the tunnel still has nodes + */ +int +tree_del_peer (struct MeshTunnelTree *t, GNUNET_PEER_Id peer, + MeshTreeCallback cb, void *cbcls); + + +/** + * Get the cost of the path relative to the already built tunnel tree + * + * @param t The tunnel tree to which compare + * @param path The individual path to reach a peer + * + * @return Number of hops to reach destination, UINT_MAX in case the peer is not + * in the path + */ +unsigned int +tree_get_path_cost (struct MeshTunnelTree *t, struct MeshPeerPath *path); /** @@ -353,7 +333,7 @@ tree_notify_connection_broken (struct MeshTunnelTree *t, * @param t The tree */ void -tree_debug(struct MeshTunnelTree *t); +tree_debug (struct MeshTunnelTree *t); /**