diff options
| author | Donatas Abraitis <donatas.abraitis@gmail.com> | 2022-01-26 21:40:29 +0200 | 
|---|---|---|
| committer | Donatas Abraitis <donatas.abraitis@gmail.com> | 2022-01-26 21:52:40 +0200 | 
| commit | 2703b7db19cebad82772d5210132dab412b855c3 (patch) | |
| tree | 77735d8cdaa6ba148eaac599d7d4e4bc0a18e909 | |
| parent | 457fb2c846a30cac6e4c79dcc53796b5bf101991 (diff) | |
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>
| -rw-r--r-- | bgpd/bgp_attr.c | 12 | ||||
| -rw-r--r-- | bgpd/bgp_attr.h | 25 | ||||
| -rw-r--r-- | bgpd/bgp_memory.c | 1 | ||||
| -rw-r--r-- | bgpd/bgp_memory.h | 1 | 
4 files changed, 35 insertions, 4 deletions
diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 632cae8c7d..23119f5599 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -95,6 +95,16 @@ static const struct message attr_flag_str[] = {  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)  {  	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)  { +	bgp_attr_extra_free(attr);  	XFREE(MTYPE_ATTR, attr);  } @@ -1184,6 +1195,7 @@ void bgp_attr_unintern(struct attr **pattr)  	if (attr->refcnt == 0) {  		ret = hash_release(attrhash, attr);  		assert(ret != NULL); +		bgp_attr_extra_free(attr);  		XFREE(MTYPE_ATTR, attr);  		*pattr = NULL;  	} diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index 3573c2ae03..5bef6860ef 100644 --- a/bgpd/bgp_attr.h +++ b/bgpd/bgp_attr.h @@ -159,6 +159,11 @@ struct bgp_attr_srv6_l3vpn {  	uint8_t transposition_offset;  }; +struct attr_extra { +	/* Extended Communities attribute. */ +	struct ecommunity *ipv6_ecommunity; +}; +  /* BGP core attribute structure. */  struct attr {  	/* AS Path structure */ @@ -199,8 +204,8 @@ struct attr {  	/* Extended Communities attribute. */  	struct ecommunity *ecommunity; -	/* Extended Communities attribute. */ -	struct ecommunity *ipv6_ecommunity; +	/* Extra attributes, non IPv4/IPv6 AFI related */ +	struct attr_extra *extra;  	/* Large Communities attribute. */  	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,  						   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,  					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 *  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,  						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) diff --git a/bgpd/bgp_memory.c b/bgpd/bgp_memory.c index ffb1ec162b..7fbadab694 100644 --- a/bgpd/bgp_memory.c +++ b/bgpd/bgp_memory.c @@ -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_PACKET, "BGP packet");  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_SEG, "BGP aspath seg");  DEFINE_MTYPE(BGPD, AS_SEG_DATA, "BGP aspath segment data"); diff --git a/bgpd/bgp_memory.h b/bgpd/bgp_memory.h index 63e7b40ef7..ffab8a1bcc 100644 --- a/bgpd/bgp_memory.h +++ b/bgpd/bgp_memory.h @@ -39,6 +39,7 @@ DECLARE_MTYPE(BGP_UPDGRP);  DECLARE_MTYPE(BGP_UPD_SUBGRP);  DECLARE_MTYPE(BGP_PACKET);  DECLARE_MTYPE(ATTR); +DECLARE_MTYPE(ATTR_EXTRA);  DECLARE_MTYPE(AS_PATH);  DECLARE_MTYPE(AS_SEG);  DECLARE_MTYPE(AS_SEG_DATA);  | 
