X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fofpbuf.h;h=442c90c9134f1224625bbeed7a7aa58ccdc4feef;hb=9b45d7f5d;hp=bd668c1e3f08f8030f810a3ee88260d8da607feb;hpb=78090f6300df053914954794301e44a2df1f6d57;p=sliver-openvswitch.git diff --git a/lib/ofpbuf.h b/lib/ofpbuf.h index bd668c1e3..442c90c91 100644 --- a/lib/ofpbuf.h +++ b/lib/ofpbuf.h @@ -18,17 +18,26 @@ #define OFPBUF_H 1 #include +#include #include "list.h" +#include "util.h" #ifdef __cplusplus extern "C" { #endif +enum ofpbuf_source { + OFPBUF_MALLOC, /* Obtained via malloc(). */ + OFPBUF_STACK, /* Stack space or static buffer. */ + OFPBUF_CONST /* Must not be expanded. */ +}; + /* Buffer for holding arbitrary data. An ofpbuf is automatically reallocated * as necessary if it grows too large for the available memory. */ struct ofpbuf { - void *base; /* First byte of area malloc()'d area. */ + void *base; /* First byte of allocated space. */ size_t allocated; /* Number of bytes allocated. */ + enum ofpbuf_source source; /* Source of memory allocated as 'base'. */ void *data; /* First byte actually in use. */ size_t size; /* Number of bytes in use. */ @@ -42,7 +51,12 @@ struct ofpbuf { void *private_p; /* Private pointer for use by owner. */ }; +/* Declares NAME as a SIZE-byte array aligned properly for storing any kind of + * data. For use with ofpbuf_use_stack(). */ +#define OFPBUF_STACK_BUFFER(NAME, SIZE) uint64_t NAME[DIV_ROUND_UP(SIZE, 8)] + void ofpbuf_use(struct ofpbuf *, void *, size_t); +void ofpbuf_use_stack(struct ofpbuf *, void *, size_t); void ofpbuf_use_const(struct ofpbuf *, const void *, size_t); void ofpbuf_init(struct ofpbuf *, size_t); @@ -55,6 +69,8 @@ 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); +struct ofpbuf *ofpbuf_clone_data_with_headroom(const void *, size_t, + size_t headroom); void ofpbuf_delete(struct ofpbuf *); void *ofpbuf_at(const struct ofpbuf *, size_t offset, size_t size);