summaryrefslogtreecommitdiffstats
path: root/ospf6d/ospf6_spf.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospf6d/ospf6_spf.c')
-rw-r--r--ospf6d/ospf6_spf.c45
1 files changed, 17 insertions, 28 deletions
diff --git a/ospf6d/ospf6_spf.c b/ospf6d/ospf6_spf.c
index 767f5255..25b86007 100644
--- a/ospf6d/ospf6_spf.c
+++ b/ospf6d/ospf6_spf.c
@@ -14,9 +14,9 @@
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with GNU Zebra; see the file COPYING. If not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * along with GNU Zebra; see the file COPYING. If not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
*/
/* Shortest Path First calculation for OSPFv3 */
@@ -50,7 +50,9 @@ ospf6_vertex_cmp (void *a, void *b)
struct ospf6_vertex *vb = (struct ospf6_vertex *) b;
/* ascending order */
- return (va->cost - vb->cost);
+ if (va->cost != vb->cost)
+ return (va->cost - vb->cost);
+ return (va->hops - vb->hops);
}
static int
@@ -280,8 +282,8 @@ ospf6_spf_install (struct ospf6_vertex *v,
{
struct ospf6_route *route;
int i, j;
- struct ospf6_vertex *prev, *w;
- struct listnode *node, *nnode;
+ struct ospf6_vertex *prev; //, *w;
+//struct listnode *node, *nnode;
if (IS_OSPF6_DEBUG_SPF (PROCESS))
zlog_debug ("SPF install %s hops %d cost %d",
@@ -320,22 +322,8 @@ ospf6_spf_install (struct ospf6_vertex *v,
}
prev = (struct ospf6_vertex *) route->route_option;
- if (prev->hops > v->hops)
- {
- for (ALL_LIST_ELEMENTS (prev->child_list, node, nnode, w))
- {
- assert (w->parent == prev);
- w->parent = v;
- listnode_add_sort (v->child_list, w);
- }
- listnode_delete (prev->parent->child_list, prev);
- listnode_add_sort (v->parent->child_list, v);
-
- ospf6_vertex_delete (prev);
- route->route_option = v;
- }
- else
- ospf6_vertex_delete (v);
+ assert (prev->hops <= v->hops);
+ ospf6_vertex_delete (v);
return -1;
}
@@ -404,18 +392,19 @@ ospf6_spf_calculation (u_int32_t router_id,
caddr_t lsdesc;
struct ospf6_lsa *lsa;
- /* initialize */
- candidate_list = pqueue_create ();
- candidate_list->cmp = ospf6_vertex_cmp;
-
- ospf6_spf_table_finish (result_table);
-
/* Install the calculating router itself as the root of the SPF tree */
/* construct root vertex */
lsa = ospf6_lsdb_lookup (htons (OSPF6_LSTYPE_ROUTER), htonl (0),
router_id, oa->lsdb);
if (lsa == NULL)
return;
+
+ /* initialize */
+ candidate_list = pqueue_create ();
+ candidate_list->cmp = ospf6_vertex_cmp;
+
+ ospf6_spf_table_finish (result_table);
+
root = ospf6_vertex_create (lsa);
root->area = oa;
root->cost = 0;