return find;
}
-/**
- * Increment the refcount on various structures that attr holds.
- * Note on usage: call _only_ when the 'attr' object has already
- * been 'intern'ed and exists in 'attrhash' table. The function
- * serves to hold a reference to that (real) object.
- * Note also that the caller can safely call bgp_attr_unintern()
- * after calling bgp_attr_refcount(). That would release the
- * reference and could result in a free() of the attr object.
- */
-struct attr *bgp_attr_refcount(struct attr *attr)
-{
- /* Intern referenced strucutre. */
- if (attr->aspath)
- attr->aspath->refcnt++;
-
- if (attr->community)
- attr->community->refcnt++;
-
- if (attr->ecommunity)
- attr->ecommunity->refcnt++;
-
- if (attr->cluster)
- attr->cluster->refcnt++;
-
- if (attr->transit)
- attr->transit->refcnt++;
-
- if (attr->encap_subtlvs)
- attr->encap_subtlvs->refcnt++;
-
-#if ENABLE_BGP_VNC
- if (attr->vnc_subtlvs)
- attr->vnc_subtlvs->refcnt++;
-#endif
-
- attr->refcnt++;
- return attr;
-}
-
/* Make network statement's attribute. */
struct attr *bgp_attr_default_set(struct attr *attr, u_char origin)
{
extern void bgp_attr_deep_dup(struct attr *, struct attr *);
extern void bgp_attr_deep_free(struct attr *);
extern struct attr *bgp_attr_intern(struct attr *attr);
-extern struct attr *bgp_attr_refcount(struct attr *attr);
extern void bgp_attr_unintern_sub(struct attr *);
extern void bgp_attr_unintern(struct attr **);
extern void bgp_attr_flush(struct attr *);
aout_copy =
bgp_adj_out_alloc(dest, aout->rn, aout->addpath_tx_id);
aout_copy->attr =
- aout->attr ? bgp_attr_refcount(aout->attr) : NULL;
+ aout->attr ? bgp_attr_intern(aout->attr) : NULL;
}
}