From: Donatas Abraitis Date: Wed, 26 Jan 2022 19:40:29 +0000 (+0200) Subject: bgpd: Move out ipv6_ecommunity struct from attr to attr_extra X-Git-Tag: pim6-testing-20220430~382^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=2703b7db19cebad82772d5210132dab412b855c3;p=matthieu%2Ffrr.git 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 --- 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);