]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: use on stack struct attr_extra in bgp_update_receive()
authorJorge Boncompte [DTI2] <jorge@dti2.net>
Mon, 7 May 2012 16:53:03 +0000 (16:53 +0000)
committerDavid Lamparter <equinox@opensourcerouting.org>
Tue, 22 May 2012 18:25:49 +0000 (20:25 +0200)
Reduce memory heap fragmentation and pressure on the memory allocator.

Signed-off-by: Jorge Boncompte [DTI2] <jorge@dti2.net>
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
bgpd/bgp_packet.c

index 95ed8046ed582e567850f90bacd19fcb2ac63ef1..cfa0b57cb0f9a156d701f10ede4ace68c74a9b5d 100644 (file)
@@ -1519,6 +1519,7 @@ bgp_update_receive (struct peer *peer, bgp_size_t size)
   u_char *end;
   struct stream *s;
   struct attr attr;
+  struct attr_extra extra;
   bgp_size_t attribute_len;
   bgp_size_t update_len;
   bgp_size_t withdraw_len;
@@ -1538,10 +1539,12 @@ bgp_update_receive (struct peer *peer, bgp_size_t size)
 
   /* Set initial values. */
   memset (&attr, 0, sizeof (struct attr));
+  memset (&extra, 0, sizeof (struct attr_extra));
   memset (&update, 0, sizeof (struct bgp_nlri));
   memset (&withdraw, 0, sizeof (struct bgp_nlri));
   memset (&mp_update, 0, sizeof (struct bgp_nlri));
   memset (&mp_withdraw, 0, sizeof (struct bgp_nlri));
+  attr.extra = &extra;
 
   s = peer->ibuf;
   end = stream_pnt (s) + size;
@@ -1669,8 +1672,6 @@ bgp_update_receive (struct peer *peer, bgp_size_t size)
       if (ret < 0)
         {
           bgp_attr_unintern_sub (&attr);
-          if (attr.extra)
-            bgp_attr_extra_free (&attr);
          return -1;
        }
 
@@ -1697,8 +1698,6 @@ bgp_update_receive (struct peer *peer, bgp_size_t size)
          if (ret < 0)
            {
              bgp_attr_unintern_sub (&attr);
-              if (attr.extra)
-                bgp_attr_extra_free (&attr);
              return -1;
             }
 
@@ -1845,9 +1844,7 @@ bgp_update_receive (struct peer *peer, bgp_size_t size)
   /* Everything is done.  We unintern temporary structures which
      interned in bgp_attr_parse(). */
   bgp_attr_unintern_sub (&attr);
-  if (attr.extra)
-    bgp_attr_extra_free (&attr);
-  
+
   /* If peering is stopped due to some reason, do not generate BGP
      event.  */
   if (peer->status != Established)