This will receive its first users in an upcoming commit. Signed-off-by: Ben Pfaff <b...@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 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev