New function ofpbuf_trim(), for freeing up wasted space in ofpbufs.
authorBen Pfaff <blp@nicira.com>
Thu, 19 Mar 2009 17:39:32 +0000 (10:39 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 19 Mar 2009 18:18:53 +0000 (11:18 -0700)
The dpif code will start allocating 64 kB buffers in the next commit,
since sometimes we get packets that big under virtualization.  But we
need to trim them down if we're going to store them for any time, so
we need a function to do it.

lib/ofpbuf.c
lib/ofpbuf.h

index ab469dbf9a24a46a040082031839c75521f4d9ab..a2d2cb2624453e5330b94fa31427ba77fe35b53f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008 The Board of Trustees of The Leland Stanford
+/* Copyright (c) 2008, 2009 The Board of Trustees of The Leland Stanford
  * Junior University
  * 
  * We are making the OpenFlow specification and associated documentation
@@ -168,6 +168,19 @@ ofpbuf_prealloc_headroom(struct ofpbuf *b, size_t size)
     assert(size <= ofpbuf_headroom(b));
 }
 
+/* Trims the size of 'b' to fit its actual content. */
+void
+ofpbuf_trim(struct ofpbuf *b)
+{
+    /* XXX These could be supported, but the current client doesn't care. */
+    assert(b->data == b->base);
+    assert(b->l2 == NULL && b->l3 == NULL && b->l4 == NULL && b->l7 == NULL);
+    if (b->allocated > b->size) {
+        b->base = b->data = xrealloc(b->base, b->size);
+        b->allocated = b->size;
+    }
+}
+
 /* Appends 'size' bytes of data to the tail end of 'b', reallocating and
  * copying its data if necessary.  Returns a pointer to the first byte of the
  * new data, which is left uninitialized. */
index f3a94c2c891530d90654931b77a7c6579d4d5884..0f8f69c64f7de6d98fc65697238aed2a932d5948 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008 The Board of Trustees of The Leland Stanford
+/* Copyright (c) 2008, 2009 The Board of Trustees of The Leland Stanford
  * Junior University
  * 
  * We are making the OpenFlow specification and associated documentation
@@ -81,6 +81,7 @@ size_t ofpbuf_headroom(struct ofpbuf *);
 size_t ofpbuf_tailroom(struct ofpbuf *);
 void ofpbuf_prealloc_headroom(struct ofpbuf *, size_t);
 void ofpbuf_prealloc_tailroom(struct ofpbuf *, size_t);
+void ofpbuf_trim(struct ofpbuf *);
 
 void ofpbuf_clear(struct ofpbuf *);
 void *ofpbuf_pull(struct ofpbuf *, size_t);