2005-10-18 Paul Jakma <paul.jakma@sun.com>
* (general) SPF memory management cleanup and fix for rare
double-free bug.
* ospf_spf.h: (struct vertex_parent) New struct to hold parent
specific data, eg the backlink and the parent vertex pointer,
and point to the appropriate general struct vertex_nexthop.
(struct vertex_nexthop) remove parent vertex pointer, so
this struct can be shared across vertices.
(struct vertex) rename list child to list children. Remove
list of nexthops, replace with list of vertex_parents.
* ospf_spf.c: (update_stat) trivial, remove cast from void *.
(vertex_nexthop_new) remove init of parent - field is gone
from struct vertex_nexthop.
(ospf_canonical_nexthops_free) Remove the canonical
vertex_nexthop memory objects. These are the vertex_nexthops
attached to the first level of router vertices from the root.
(vertex_parent_new) new function, create a vertex_parent.
(vertex_parent_free) ditto, but free it.
(ospf_vertex_new) Update to match changes to struct vertex.
(ospf_vertex_free) Recursively free a struct vertex and its
children. The parent list is used as a reference count.
vertex_nexthops must be free seperately, if required.
(ospf_vertex_dump) update to match struct vertex changes.
Print out backlink of parents too.
(ospf_vertex_add_parent) ditto.
(ospf_lsa_has_link) update comment.
(ospf_nexthop_add_unique) removed, not needed anymore.
(ospf_nexthop_merge) ditto.
(ospf_spf_consider_nexthop) renamed to ospf_spf_add_parent.
Simplified to just create vertex_parent and add it.
(ospf_spf_flush_parents) new function, flush out the parent
list.
(ospf_nexthop_calculation) Take the relevant route_lsa_link
as an argument, which simplifies things and removes the need
for the hack in ospf_nexthop_add_unique - ospf_spf_next
already knew exactly which link the cost calculated was for.
Update to match struct vertex changes too.
(ospf_spf_next) Don't create a vertex for W unnecessarily, if
it's there's a vertex already created for W, use it, and
hence there's no need to free it either.
Update some manipulation/comparisons of distance to match.
Flush the parent list if a lower cost path is found.
(ospf_spf_route_free) unused, removed.
(ospf_spf_dump) match the struct vertex changes, and dump the
ifname if possible.
(ospf_spf_calculate) At end of SPF, free the canonical nexthops
and call ospf_vertex_free on the root vertex to free the
entire tree.
* ospf_interface.c: (ospf_vl_set_params) match struct vertex
changes.
* ospf_route.c: (ospf_intra_route_add) ditto
(ospf_route_copy_nexthops_from_vertex) ditto
* memtypes.c: (memory_list_ospf) Add MTYPE_OSPF_VERTEX_PARENT.
diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog
index c56f01b..299de23 100644
--- a/ospfd/ChangeLog
+++ b/ospfd/ChangeLog
@@ -1,3 +1,57 @@
+2005-10-18 Paul Jakma <paul.jakma@sun.com>
+
+ * (general) SPF memory management cleanup and fix for rare
+ double-free bug.
+ * ospf_spf.h: (struct vertex_parent) New struct to hold parent
+ specific data, eg the backlink and the parent vertex pointer,
+ and point to the appropriate general struct vertex_nexthop.
+ (struct vertex_nexthop) remove parent vertex pointer, so
+ this struct can be shared across vertices.
+ (struct vertex) rename list child to list children. Remove
+ list of nexthops, replace with list of vertex_parents.
+ * ospf_spf.c: (update_stat) trivial, remove cast from void *.
+ (vertex_nexthop_new) remove init of parent - field is gone
+ from struct vertex_nexthop.
+ (ospf_canonical_nexthops_free) Remove the canonical
+ vertex_nexthop memory objects. These are the vertex_nexthops
+ attached to the first level of router vertices from the root.
+ (vertex_parent_new) new function, create a vertex_parent.
+ (vertex_parent_free) ditto, but free it.
+ (ospf_vertex_new) Update to match changes to struct vertex.
+ (ospf_vertex_free) Recursively free a struct vertex and its
+ children. The parent list is used as a reference count.
+ vertex_nexthops must be free seperately, if required.
+ (ospf_vertex_dump) update to match struct vertex changes.
+ Print out backlink of parents too.
+ (ospf_vertex_add_parent) ditto.
+ (ospf_lsa_has_link) update comment.
+ (ospf_nexthop_add_unique) removed, not needed anymore.
+ (ospf_nexthop_merge) ditto.
+ (ospf_spf_consider_nexthop) renamed to ospf_spf_add_parent.
+ Simplified to just create vertex_parent and add it.
+ (ospf_spf_flush_parents) new function, flush out the parent
+ list.
+ (ospf_nexthop_calculation) Take the relevant route_lsa_link
+ as an argument, which simplifies things and removes the need
+ for the hack in ospf_nexthop_add_unique - ospf_spf_next
+ already knew exactly which link the cost calculated was for.
+ Update to match struct vertex changes too.
+ (ospf_spf_next) Don't create a vertex for W unnecessarily, if
+ it's there's a vertex already created for W, use it, and
+ hence there's no need to free it either.
+ Update some manipulation/comparisons of distance to match.
+ Flush the parent list if a lower cost path is found.
+ (ospf_spf_route_free) unused, removed.
+ (ospf_spf_dump) match the struct vertex changes, and dump the
+ ifname if possible.
+ (ospf_spf_calculate) At end of SPF, free the canonical nexthops
+ and call ospf_vertex_free on the root vertex to free the
+ entire tree.
+ * ospf_interface.c: (ospf_vl_set_params) match struct vertex
+ changes.
+ * ospf_route.c: (ospf_intra_route_add) ditto
+ (ospf_route_copy_nexthops_from_vertex) ditto
+
2005-10-11 Paul Jakma <paul.jakma@sun.com>
* ospf_api.c: sign warnings.