mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-04 02:46:34 +00:00
bgpd: kill bgp_attr_refcount()
This attempt at optimization has cost us more than a week's worth of time on several people hunting down the subtle bug that it was missing an increment on attr->lcommunity. This is absolutely not worth the maintenance cost. Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
parent
96099b4030
commit
7c87afac92
@ -771,45 +771,6 @@ struct attr *bgp_attr_intern(struct attr *attr)
|
||||
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)
|
||||
{
|
||||
|
@ -241,7 +241,6 @@ extern void bgp_attr_dup(struct attr *, struct attr *);
|
||||
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 *);
|
||||
|
@ -1185,7 +1185,7 @@ static void update_subgroup_copy_adj_out(struct update_subgroup *source,
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user