Skip to content

Commit

Permalink
ofpbuf: New function ofpbuf_insert().
Browse files Browse the repository at this point in the history
This will receive its first users in an upcoming commit.

Signed-off-by: Ben Pfaff <[email protected]>
  • Loading branch information
blp committed Jun 27, 2017
1 parent de8f705 commit 07e73e0
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 0 deletions.
1 change: 1 addition & 0 deletions include/openvswitch/ofpbuf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 *);
Expand Down
18 changes: 18 additions & 0 deletions lib/ofpbuf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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().) */
Expand Down

0 comments on commit 07e73e0

Please sign in to comment.