+
+/* Implementation of a simple breadth-first search algorithm.
+ Running time: O(E)
+*/
+
+void sssp_bfs(void)
+{
+ avl_node_t *node, *from, *next, *to;
+ edge_t *e;
+ node_t *n, *check;
+ int nodes = 0;
+ int visited = 0;
+ avl_tree_t *todo_tree;
+
+ syslog(LOG_DEBUG, _("Running BFS algorithm:"));
+
+ todo_tree = avl_alloc_tree(NULL, NULL);
+
+ /* Clear visited status on nodes */
+
+ for(node = node_tree->head; node; node = node->next)
+ {
+ n = (node_t *)node->data;
+ n->status.visited = 0;
+ nodes++;
+ }
+
+ /* Begin with myself */
+
+ myself->status.visited = 1;
+ myself->nexthop = myself;
+ myself->via = myself;
+ node = avl_alloc_node();
+ node->data = myself;
+ avl_insert_top(todo_tree, node);
+ visited++;
+
+ /* Loop while todo_tree is filled */
+
+ while(todo_tree->head)
+ {
+ for(from = todo_tree->head; from; from = next)
+ {
+ next = from->next;
+ n = (node_t *)from->data;
+
+ for(to = n->edge_tree->head; to; to = to->next)
+ {
+ e = (edge_t *)to->data;
+
+ if(e->from == n)
+ check = e->to;
+ else
+ check = e->from;
+
+ if(!check->status.visited)
+ {
+ check->status.visited = 1;
+ check->nexthop = (n->nexthop == myself)?n:n->nexthop;
+ check->via = check; /* FIXME: only if !(e->options & INDIRECT), otherwise use n->via */
+ avl_insert_before(todo_tree, todo_tree->head, to);
+ visited++;
+ }
+ }
+
+ avl_delete_node(todo_tree, from);
+ }
+ }
+
+ syslog(LOG_DEBUG, _("Done."));
+
+ if(visited != nodes)
+ {
+ syslog(LOG_ERR, _("Implementation of BFS algorithm is screwed: %d nodes, visited %d"), nodes, visited);
+ }
+}