diff options
author | David Lamparter <equinox@opensourcerouting.org> | 2017-09-07 14:24:00 +0200 |
---|---|---|
committer | David Lamparter <equinox@opensourcerouting.org> | 2017-09-07 14:56:08 +0200 |
commit | 7c87afac92b94cd26c1a74df0e499a7a05603aa7 (patch) | |
tree | 873c352caa3f8abec839312e6a7172a45859cbec /bgpd | |
parent | bgpd: add safety check on ATTR_FLAG_BIT (diff) | |
download | frr-7c87afac92b94cd26c1a74df0e499a7a05603aa7.tar.xz frr-7c87afac92b94cd26c1a74df0e499a7a05603aa7.zip |
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>
Diffstat (limited to 'bgpd')
-rw-r--r-- | bgpd/bgp_attr.c | 39 | ||||
-rw-r--r-- | bgpd/bgp_attr.h | 1 | ||||
-rw-r--r-- | bgpd/bgp_updgrp.c | 2 |
3 files changed, 1 insertions, 41 deletions
diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 03cf3625b..d3f129475 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -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) { diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index ea1e73652..d404c9046 100644 --- a/bgpd/bgp_attr.h +++ b/bgpd/bgp_attr.h @@ -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 *); diff --git a/bgpd/bgp_updgrp.c b/bgpd/bgp_updgrp.c index 9630afb71..05395a583 100644 --- a/bgpd/bgp_updgrp.c +++ b/bgpd/bgp_updgrp.c @@ -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; } } |