]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Move out ipv6_ecommunity struct from attr to attr_extra
authorDonatas Abraitis <donatas.abraitis@gmail.com>
Wed, 26 Jan 2022 19:40:29 +0000 (21:40 +0200)
committerDonatas Abraitis <donatas.abraitis@gmail.com>
Wed, 26 Jan 2022 19:52:40 +0000 (21:52 +0200)
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>
bgpd/bgp_attr.c
bgpd/bgp_attr.h
bgpd/bgp_memory.c
bgpd/bgp_memory.h

index 632cae8c7d0261ce92515ee031a61d8c7ee6d3fd..23119f5599a420e46ca03ca4da5527c580632c52 100644 (file)
@@ -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;
        }
index 3573c2ae03c0b6305dbe958e19d07f97ef63019f..5bef6860ef986ef9c6a774e936c43bcd33a9068b 100644 (file)
@@ -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)
index ffb1ec162b5d480f8b953e199a81aabdef20d1c2..7fbadab69462ef1b8ede628575257c6db2c2425d 100644 (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_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");
index 63e7b40ef786456dd7faf9182cbdd4e2e9b6437f..ffab8a1bccc3b25da0e70bf4872e666fbce3cb9b 100644 (file)
@@ -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);