summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2010-09-01 12:55:38 -0700
committerBen Pfaff <blp@nicira.com>2010-09-01 12:55:50 -0700
commit68efcbec41b0acfd8bb7579a5d38afd71b6daf7c (patch)
tree2cfaa4c9688064bd29a01fdb8c588690e80427cd
parentf79cb67e689566cfbf3071e0ac0e29923ada5a97 (diff)
downloadopenvswitch-68efcbec41b0acfd8bb7579a5d38afd71b6daf7c.tar.gz
ofpbuf: Add ofpbuf_new_with_headroom(), ofpbuf_clone_with_headroom().
These new functions simplify an increasingly common usage pattern. Suggested-by: Jesse Gross <jesse@nicira.com>
-rw-r--r--lib/dpif-linux.c3
-rw-r--r--lib/dpif-netdev.c3
-rw-r--r--lib/ofpbuf.c20
-rw-r--r--lib/ofpbuf.h3
-rw-r--r--ofproto/pktbuf.c4
5 files changed, 27 insertions, 6 deletions
diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c
index 52d73c6bb..2c688e3af 100644
--- a/lib/dpif-linux.c
+++ b/lib/dpif-linux.c
@@ -478,8 +478,7 @@ dpif_linux_recv(struct dpif *dpif_, struct ofpbuf **bufp)
int retval;
int error;
- buf = ofpbuf_new(65536 + DPIF_RECV_MSG_PADDING);
- ofpbuf_reserve(buf, DPIF_RECV_MSG_PADDING);
+ buf = ofpbuf_new_with_headroom(65536, DPIF_RECV_MSG_PADDING);
retval = read(dpif->fd, ofpbuf_tail(buf), ofpbuf_tailroom(buf));
if (retval < 0) {
error = errno;
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 08a721340..323f36411 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -1262,8 +1262,7 @@ dp_netdev_output_control(struct dp_netdev *dp, const struct ofpbuf *packet,
}
msg_size = sizeof *header + packet->size;
- msg = ofpbuf_new(msg_size + DPIF_RECV_MSG_PADDING);
- ofpbuf_reserve(msg, DPIF_RECV_MSG_PADDING);
+ msg = ofpbuf_new_with_headroom(msg_size, DPIF_RECV_MSG_PADDING);
header = ofpbuf_put_uninit(msg, sizeof *header);
header->type = queue_no;
header->length = msg_size;
diff --git a/lib/ofpbuf.c b/lib/ofpbuf.c
index 5693eefda..bf5567251 100644
--- a/lib/ofpbuf.c
+++ b/lib/ofpbuf.c
@@ -75,12 +75,32 @@ ofpbuf_new(size_t size)
return b;
}
+/* Creates and returns a new ofpbuf with an initial capacity of 'size +
+ * headroom' bytes, reserving the first 'headroom' bytes as headroom. */
+struct ofpbuf *
+ofpbuf_new_with_headroom(size_t size, size_t headroom)
+{
+ struct ofpbuf *b = ofpbuf_new(size + headroom);
+ ofpbuf_reserve(b, headroom);
+ return b;
+}
+
struct ofpbuf *
ofpbuf_clone(const struct ofpbuf *buffer)
{
return ofpbuf_clone_data(buffer->data, buffer->size);
}
+/* Creates and returns a new ofpbuf whose data are copied from 'buffer'. The
+ * returned ofpbuf will additionally have 'headroom' bytes of headroom. */
+struct ofpbuf *
+ofpbuf_clone_with_headroom(const struct ofpbuf *buffer, size_t headroom)
+{
+ struct ofpbuf *b = ofpbuf_new_with_headroom(buffer->size, headroom);
+ ofpbuf_put(b, buffer->data, buffer->size);
+ return b;
+}
+
struct ofpbuf *
ofpbuf_clone_data(const void *data, size_t size)
{
diff --git a/lib/ofpbuf.h b/lib/ofpbuf.h
index 736b8f5e5..5e20aab0b 100644
--- a/lib/ofpbuf.h
+++ b/lib/ofpbuf.h
@@ -48,7 +48,10 @@ void ofpbuf_uninit(struct ofpbuf *);
void ofpbuf_reinit(struct ofpbuf *, size_t);
struct ofpbuf *ofpbuf_new(size_t);
+struct ofpbuf *ofpbuf_new_with_headroom(size_t, size_t headroom);
struct ofpbuf *ofpbuf_clone(const struct ofpbuf *);
+struct ofpbuf *ofpbuf_clone_with_headroom(const struct ofpbuf *,
+ size_t headroom);
struct ofpbuf *ofpbuf_clone_data(const void *, size_t);
void ofpbuf_delete(struct ofpbuf *);
diff --git a/ofproto/pktbuf.c b/ofproto/pktbuf.c
index 67adb5606..aa9029542 100644
--- a/ofproto/pktbuf.c
+++ b/ofproto/pktbuf.c
@@ -112,8 +112,8 @@ pktbuf_save(struct pktbuf *pb, struct ofpbuf *buffer, uint16_t in_port)
if (++p->cookie >= COOKIE_MAX) {
p->cookie = 0;
}
- p->buffer = ofpbuf_new(sizeof(struct ofp_packet_in) + buffer->size);
- ofpbuf_reserve(p->buffer, sizeof(struct ofp_packet_in));
+ p->buffer = ofpbuf_new_with_headroom(buffer->size,
+ sizeof(struct ofp_packet_in));
ofpbuf_put(p->buffer, buffer->data, buffer->size);
p->timeout = time_msec() + OVERWRITE_MSECS;
p->in_port = in_port;