diff options
author | paul <paul> | 2003-06-06 23:23:36 +0000 |
---|---|---|
committer | paul <paul> | 2003-06-06 23:23:36 +0000 |
commit | bf9392c6e932080156e70c0436977fd5dbcdb0cd (patch) | |
tree | 06ba8c7108ffcc36b3fc93b10ceeaf2ef1f41f01 /ospfd/ospf_spf.c | |
parent | 79cb216984c0f93e80e01e9fed6022ad27a25825 (diff) |
2003-06-7 kamatchi soundaram <kamatchi@tdd.sj.nec.com>
* (ospf_spf.c): Fix consideration of costs for PtP nexthops in
ospf_nexthop_calculation().
Diffstat (limited to 'ospfd/ospf_spf.c')
-rw-r--r-- | ospfd/ospf_spf.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/ospfd/ospf_spf.c b/ospfd/ospf_spf.c index 33616d83..5d873fbb 100644 --- a/ospfd/ospf_spf.c +++ b/ospfd/ospf_spf.c @@ -340,6 +340,37 @@ ospf_get_next_link (struct vertex *v, struct vertex *w, return NULL; } +/* Consider supplied next-hop for inclusion to the supplied list + * of next-hops, adjust list as neccessary + */ +void +ospf_spf_consider_nexthop (struct list *nexthops, struct vertex_nexthop *newhop) +{ + struct listnode *nnode; + struct vertex_nexthop *hop; + + LIST_LOOP (nexthops, hop, nnode) + { + assert (hop->oi); + /* weed out hops with higher cost than the newhop */ + if (hop->oi->output_cost > newhop->oi->output_cost) + { + /* delete the existing nexthop */ + listnode_delete (nexthops, hop); + vertex_nexthop_free (hop); + } + else if ( hop->oi->output_cost < newhop->oi->output_cost) + { + return; + } + } + + /* new hop is <= existing hops, add it */ + listnode_add (nexthops, newhop); + + return; +} + /* Calculate nexthop from root to vertex W. */ void ospf_nexthop_calculation (struct ospf_area *area, @@ -407,7 +438,7 @@ ospf_nexthop_calculation (struct ospf_area *area, nh = vertex_nexthop_new (v); nh->oi = oi; nh->router = l2->link_data; - listnode_add (w->nexthop, nh); + ospf_spf_consider_nexthop (w->nexthop, nh); } } } |