summaryrefslogtreecommitdiffstats
path: root/ospfd/ospf_interface.c
diff options
context:
space:
mode:
authorpaul <paul>2005-10-18 04:20:33 +0000
committerpaul <paul>2005-10-18 04:20:33 +0000
commit285a8ea700cd00d3638859222f213406a68f62f8 (patch)
tree1b4dcf82b1c74df4e344f9169efc4fa99ff21f5f /ospfd/ospf_interface.c
parentd11015bfc636fc2ebf90da79365c8b3e39f4c30c (diff)
downloadquagga-285a8ea700cd00d3638859222f213406a68f62f8.tar.bz2
quagga-285a8ea700cd00d3638859222f213406a68f62f8.tar.xz
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.
Diffstat (limited to 'ospfd/ospf_interface.c')
-rw-r--r--ospfd/ospf_interface.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c
index 9d31b7a3..fe32268f 100644
--- a/ospfd/ospf_interface.c
+++ b/ospfd/ospf_interface.c
@@ -999,7 +999,7 @@ ospf_vl_set_params (struct ospf_vl_data *vl_data, struct vertex *v)
int changed = 0;
struct ospf_interface *voi;
struct listnode *node;
- struct vertex_nexthop *nh;
+ struct vertex_parent *vp = NULL;
int i;
struct router_lsa *rl;
@@ -1012,9 +1012,9 @@ ospf_vl_set_params (struct ospf_vl_data *vl_data, struct vertex *v)
changed = 1;
}
- for (ALL_LIST_ELEMENTS_RO (v->nexthop, node, nh))
+ for (ALL_LIST_ELEMENTS_RO (v->parents, node, vp))
{
- vl_data->out_oi = (struct ospf_interface *) nh->oi;
+ vl_data->out_oi = vp->nexthop->oi;
if (!IPV4_ADDR_SAME(&voi->address->u.prefix4,
&vl_data->out_oi->address->u.prefix4))
@@ -1031,12 +1031,12 @@ ospf_vl_set_params (struct ospf_vl_data *vl_data, struct vertex *v)
/* use SPF determined backlink index in struct vertex
* for virtual link destination address
*/
- if (v->backlink >= 0)
+ if (vp && vp->backlink >= 0)
{
if (!IPV4_ADDR_SAME (&vl_data->peer_addr,
- &rl->link[v->backlink].link_data))
+ &rl->link[vp->backlink].link_data))
changed = 1;
- vl_data->peer_addr = rl->link[v->backlink].link_data;
+ vl_data->peer_addr = rl->link[vp->backlink].link_data;
}
else
{