From 07e73e085f1d124230fc97883eb01dd8f37f0d78 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 23 Jun 2017 16:47:52 +0000 Subject: [PATCH] ofpbuf: New function ofpbuf_insert(). This will receive its first users in an upcoming commit. Signed-off-by: Ben Pfaff --- 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 bc25bb8a178..6142f4a588e 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 f4a9040646e..9c0623688f1 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().) */