]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: "Intern" communities in route maps
authorMichael Lambert <lambert@psc.edu>
Sat, 24 Jul 2010 16:44:07 +0000 (12:44 -0400)
committerPaul Jakma <paul@quagga.net>
Mon, 21 Mar 2011 17:30:52 +0000 (17:30 +0000)
* bgp_community.[ch]: (community_lookup) New helper function to look
  up a community list in the hash table.

* bgp_routemap.c: A new community structure was being allocated for
  every BGP update which matched a route map which set a community.
  This behavior led to rapid growth in the memory consumed by bgpd.
  Adding the communities to the hash table addresses the memory
  growth, but may introduce a problem in modifying or deleting the
  'set community' statement in the route map.

bgpd/bgp_community.c
bgpd/bgp_community.h
bgpd/bgp_routemap.c

index ae1d7a15579e541dea02c8546dc4d821fb5470e8..68383adfd5718baf5fa653566b0734f748b3abae 100644 (file)
@@ -292,6 +292,13 @@ community_com2str  (struct community *com)
   return str;
 }
 
+/* Find an 'intern'ed community structure */
+struct community *
+community_lookup (struct community *com)
+{
+   return (struct community *) hash_lookup (comhash, com);
+}
+
 /* Intern communities attribute.  */
 struct community *
 community_intern (struct community *com)
index bc1e56eff1e1592c45b935875efd94cc23800519..78cbfe2b6f4c9636cb5876593a481db3c8a23263 100644 (file)
@@ -70,5 +70,6 @@ extern int community_include (struct community *, u_int32_t);
 extern void community_del_val (struct community *, u_int32_t *);
 extern unsigned long community_count (void);
 extern struct hash *community_hash (void);
+extern struct community *community_lookup (struct community *);
 
 #endif /* _QUAGGA_BGP_COMMUNITY_H */
index 81ff48dbd6cb5278568b371a95c6292c4926d4f9..2b05e89822b00941f1a9e39b4ebaf580dbb7995e 100644 (file)
@@ -1297,7 +1297,7 @@ route_set_community (void *rule, struct prefix *prefix,
        new = community_dup (rcs->com);
       
       /* will be interned by caller if required */
-      attr->community = new;
+      attr->community = community_intern (new);
 
       attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES);
     }
@@ -1311,6 +1311,7 @@ route_set_community_compile (const char *arg)
 {
   struct rmap_com_set *rcs;
   struct community *com = NULL;
+  struct community *comint;
   char *sp;
   int additive = 0;
   int none = 0;
@@ -1337,8 +1338,9 @@ route_set_community_compile (const char *arg)
        return NULL;
     }
   
+  comint = community_intern (com);
   rcs = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct rmap_com_set));
-  rcs->com = com;
+  rcs->com = comint;
   rcs->additive = additive;
   rcs->none = none;
   
@@ -1401,7 +1403,7 @@ route_set_community_delete (void *rule, struct prefix *prefix,
            }
          else
            {
-             binfo->attr->community = new;
+             binfo->attr->community = community_intern (new);
              binfo->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES);
            }
        }