X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fofpbuf.h;h=442c90c9134f1224625bbeed7a7aa58ccdc4feef;hb=f9ef1c31cfcd2d9ded66588a11c59e29e5aaa2ca;hp=7d106d888d551e38c26dead9e84019e3cf61d213;hpb=b3907fbc6c74ddad7507d0f7abb1f5a2528cd2be;p=openvswitch diff --git a/lib/ofpbuf.h b/lib/ofpbuf.h index 7d106d88..442c90c9 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,13 @@ 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); void ofpbuf_uninit(struct ofpbuf *); @@ -54,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); @@ -64,6 +81,7 @@ void *ofpbuf_end(const struct ofpbuf *); void *ofpbuf_put_uninit(struct ofpbuf *, size_t); void *ofpbuf_put_zeros(struct ofpbuf *, size_t); void *ofpbuf_put(struct ofpbuf *, const void *, size_t); +char *ofpbuf_put_hex(struct ofpbuf *, const char *s, size_t *n); void ofpbuf_reserve(struct ofpbuf *, size_t); void *ofpbuf_push_uninit(struct ofpbuf *b, size_t); void *ofpbuf_push_zeros(struct ofpbuf *, size_t);