[ovs-dev] [PATCH v2 05/12] ofpbuf: New function ofpbuf_insert().

Ben Pfaff blp at ovn.org
Sun Jun 18 23:29:34 UTC 2017


This will receive its first users in an upcoming commit.

Signed-off-by: Ben Pfaff <blp at ovn.org>
---
 include/openvswitch/ofpbuf.h |  1 +
 lib/ofpbuf.c                 | 18 ++++++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/include/openvswitch/ofpbuf.h b/include/openvswitch/ofpbuf.h
index bc25bb8a1780..6142f4a588e1 100644
--- a/include/openvswitch/ofpbuf.h
+++ b/include/openvswitch/ofpbuf.h
@@ -141,6 +141,7 @@ void ofpbuf_reserve(struct ofpbuf *, size_t);
 void *ofpbuf_push_uninit(struct ofpbuf *b, size_t);
 void *ofpbuf_push_zeros(struct ofpbuf *, size_t);
 void *ofpbuf_push(struct ofpbuf *b, const void *, size_t);
+void ofpbuf_insert(struct ofpbuf *b, size_t offset, const void *data, size_t);
 
 static inline size_t ofpbuf_headroom(const struct ofpbuf *);
 static inline size_t ofpbuf_tailroom(const struct ofpbuf *);
diff --git a/lib/ofpbuf.c b/lib/ofpbuf.c
index f4a9040646ef..9c0623688f16 100644
--- a/lib/ofpbuf.c
+++ b/lib/ofpbuf.c
@@ -461,6 +461,24 @@ ofpbuf_push(struct ofpbuf *b, const void *p, size_t size)
     return dst;
 }
 
+/* Inserts the 'n' bytes of 'data' into 'b' starting at the given 'offset',
+ * moving data forward as necessary to make room.
+ *
+ * 'data' must not point inside 'b'. */
+void
+ofpbuf_insert(struct ofpbuf *b, size_t offset, const void *data, size_t n)
+{
+    if (offset < b->size) {
+        ofpbuf_put_uninit(b, n);
+        memmove((char *) b->data + offset + n, (char *) b->data + offset,
+                b->size - offset);
+        memcpy((char *) b->data + offset, data, n);
+    } else {
+        ovs_assert(offset == b->size);
+        ofpbuf_put(b, data, n);
+    }
+}
+
 /* Returns the data in 'b' as a block of malloc()'d memory and frees the buffer
  * within 'b'.  (If 'b' itself was dynamically allocated, e.g. with
  * ofpbuf_new(), then it should still be freed with, e.g., ofpbuf_delete().) */
-- 
2.10.2



More information about the dev mailing list