From: Ben Pfaff Date: Wed, 1 Sep 2010 19:55:38 +0000 (-0700) Subject: ofpbuf: Add ofpbuf_new_with_headroom(), ofpbuf_clone_with_headroom(). X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=68efcbec41b0acfd8bb7579a5d38afd71b6daf7c;p=openvswitch ofpbuf: Add ofpbuf_new_with_headroom(), ofpbuf_clone_with_headroom(). These new functions simplify an increasingly common usage pattern. Suggested-by: Jesse Gross --- diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c index 52d73c6b..2c688e3a 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 08a72134..323f3641 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 5693eefd..bf556725 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 736b8f5e..5e20aab0 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 67adb560..aa902954 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;