bgpd: Move out ipv6_ecommunity struct from attr to attr_extra

This is the initial work to move all non IPv4/IPv6 AFI related
attributes/structs to attr->extra to avoid unnecesarry allocations.

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
This commit is contained in:
Donatas Abraitis 2022-01-26 21:40:29 +02:00
parent 457fb2c846
commit 2703b7db19
4 changed files with 35 additions and 4 deletions

View File

@ -95,6 +95,16 @@ static const struct message attr_flag_str[] = {
static struct hash *cluster_hash; static struct hash *cluster_hash;
struct attr_extra *bgp_attr_extra_alloc(void)
{
return XCALLOC(MTYPE_ATTR_EXTRA, sizeof(struct attr_extra));
}
void bgp_attr_extra_free(struct attr *attr)
{
XFREE(MTYPE_ATTR_EXTRA, attr->extra);
}
static void *cluster_hash_alloc(void *p) static void *cluster_hash_alloc(void *p)
{ {
const struct cluster_list *val = (const struct cluster_list *)p; const struct cluster_list *val = (const struct cluster_list *)p;
@ -778,6 +788,7 @@ static void attrhash_init(void)
*/ */
static void attr_vfree(void *attr) static void attr_vfree(void *attr)
{ {
bgp_attr_extra_free(attr);
XFREE(MTYPE_ATTR, attr); XFREE(MTYPE_ATTR, attr);
} }
@ -1184,6 +1195,7 @@ void bgp_attr_unintern(struct attr **pattr)
if (attr->refcnt == 0) { if (attr->refcnt == 0) {
ret = hash_release(attrhash, attr); ret = hash_release(attrhash, attr);
assert(ret != NULL); assert(ret != NULL);
bgp_attr_extra_free(attr);
XFREE(MTYPE_ATTR, attr); XFREE(MTYPE_ATTR, attr);
*pattr = NULL; *pattr = NULL;
} }

View File

@ -159,6 +159,11 @@ struct bgp_attr_srv6_l3vpn {
uint8_t transposition_offset; uint8_t transposition_offset;
}; };
struct attr_extra {
/* Extended Communities attribute. */
struct ecommunity *ipv6_ecommunity;
};
/* BGP core attribute structure. */ /* BGP core attribute structure. */
struct attr { struct attr {
/* AS Path structure */ /* AS Path structure */
@ -199,8 +204,8 @@ struct attr {
/* Extended Communities attribute. */ /* Extended Communities attribute. */
struct ecommunity *ecommunity; struct ecommunity *ecommunity;
/* Extended Communities attribute. */ /* Extra attributes, non IPv4/IPv6 AFI related */
struct ecommunity *ipv6_ecommunity; struct attr_extra *extra;
/* Large Communities attribute. */ /* Large Communities attribute. */
struct lcommunity *lcommunity; struct lcommunity *lcommunity;
@ -472,6 +477,8 @@ extern void bgp_packet_mpunreach_end(struct stream *s, size_t attrlen_pnt);
extern bgp_attr_parse_ret_t bgp_attr_nexthop_valid(struct peer *peer, extern bgp_attr_parse_ret_t bgp_attr_nexthop_valid(struct peer *peer,
struct attr *attr); struct attr *attr);
extern struct attr_extra *bgp_attr_extra_alloc(void);
extern void bgp_attr_extra_free(struct attr *attr);
static inline int bgp_rmap_nhop_changed(uint32_t out_rmap_flags, static inline int bgp_rmap_nhop_changed(uint32_t out_rmap_flags,
uint32_t in_rmap_flags) uint32_t in_rmap_flags)
@ -508,13 +515,23 @@ static inline void bgp_attr_set_pmsi_tnl_type(struct attr *attr,
static inline struct ecommunity * static inline struct ecommunity *
bgp_attr_get_ipv6_ecommunity(const struct attr *attr) bgp_attr_get_ipv6_ecommunity(const struct attr *attr)
{ {
return attr->ipv6_ecommunity; if (attr->extra)
return attr->extra->ipv6_ecommunity;
return NULL;
} }
static inline void bgp_attr_set_ipv6_ecommunity(struct attr *attr, static inline void bgp_attr_set_ipv6_ecommunity(struct attr *attr,
struct ecommunity *ipv6_ecomm) struct ecommunity *ipv6_ecomm)
{ {
attr->ipv6_ecommunity = ipv6_ecomm; if (!attr->extra) {
if (!ipv6_ecomm)
return;
attr->extra = bgp_attr_extra_alloc();
}
attr->extra->ipv6_ecommunity = ipv6_ecomm;
} }
static inline struct transit *bgp_attr_get_transit(const struct attr *attr) static inline struct transit *bgp_attr_get_transit(const struct attr *attr)

View File

@ -43,6 +43,7 @@ DEFINE_MTYPE(BGPD, BGP_UPDGRP, "BGP update group");
DEFINE_MTYPE(BGPD, BGP_UPD_SUBGRP, "BGP update subgroup"); DEFINE_MTYPE(BGPD, BGP_UPD_SUBGRP, "BGP update subgroup");
DEFINE_MTYPE(BGPD, BGP_PACKET, "BGP packet"); DEFINE_MTYPE(BGPD, BGP_PACKET, "BGP packet");
DEFINE_MTYPE(BGPD, ATTR, "BGP attribute"); DEFINE_MTYPE(BGPD, ATTR, "BGP attribute");
DEFINE_MTYPE(BGPD, ATTR_EXTRA, "BGP extra attribute");
DEFINE_MTYPE(BGPD, AS_PATH, "BGP aspath"); DEFINE_MTYPE(BGPD, AS_PATH, "BGP aspath");
DEFINE_MTYPE(BGPD, AS_SEG, "BGP aspath seg"); DEFINE_MTYPE(BGPD, AS_SEG, "BGP aspath seg");
DEFINE_MTYPE(BGPD, AS_SEG_DATA, "BGP aspath segment data"); DEFINE_MTYPE(BGPD, AS_SEG_DATA, "BGP aspath segment data");

View File

@ -39,6 +39,7 @@ DECLARE_MTYPE(BGP_UPDGRP);
DECLARE_MTYPE(BGP_UPD_SUBGRP); DECLARE_MTYPE(BGP_UPD_SUBGRP);
DECLARE_MTYPE(BGP_PACKET); DECLARE_MTYPE(BGP_PACKET);
DECLARE_MTYPE(ATTR); DECLARE_MTYPE(ATTR);
DECLARE_MTYPE(ATTR_EXTRA);
DECLARE_MTYPE(AS_PATH); DECLARE_MTYPE(AS_PATH);
DECLARE_MTYPE(AS_SEG); DECLARE_MTYPE(AS_SEG);
DECLARE_MTYPE(AS_SEG_DATA); DECLARE_MTYPE(AS_SEG_DATA);