static void bgp_info_extra_free(struct bgp_info_extra **extra)
{
- if (extra && *extra) {
- if ((*extra)->damp_info)
- bgp_damp_info_free((*extra)->damp_info, 0);
+ struct bgp_info_extra *e;
- (*extra)->damp_info = NULL;
+ if (!extra || !*extra)
+ return;
+
+ e = *extra;
+ if (e->damp_info)
+ bgp_damp_info_free(e->damp_info, 0);
- XFREE(MTYPE_BGP_ROUTE_EXTRA, *extra);
+ e->damp_info = NULL;
+ if (e->parent) {
+ struct bgp_info *bi = (struct bgp_info *)e->parent;
- *extra = NULL;
+ if (bi->net)
+ bgp_unlock_node((struct bgp_node *)bi->net);
+ bi->net = NULL;
+ bgp_info_unlock(e->parent);
+ e->parent = NULL;
}
+
+ if (e->bgp_orig)
+ bgp_unlock(e->bgp_orig);
+ XFREE(MTYPE_BGP_ROUTE_EXTRA, *extra);
+
+ *extra = NULL;
}
/* Get bgp_info extra information for the given bgp_info, lazy allocated
/* Free bgp route information. */
static void bgp_info_free(struct bgp_info *binfo)
{
- /* unlink reference to parent, if any. */
- if (binfo->extra) {
- if (binfo->extra->parent) {
- bgp_unlock_node(
- (struct bgp_node *)((struct bgp_info *)binfo
- ->extra->parent)
- ->net);
- bgp_info_unlock(
- (struct bgp_info *)binfo->extra->parent);
- binfo->extra->parent = NULL;
- }
-
- if (binfo->extra->bgp_orig)
- bgp_unlock(binfo->extra->bgp_orig);
- }
-
if (binfo->attr)
bgp_attr_unintern(&binfo->attr);