X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fofpbuf.h;h=dd72cde02ab3f69734adcfd3814919965fce2cd1;hb=d1aa0b94d842f99900217e4afad9ea237c93b019;hp=b30cbdb2cf73032a5dd13d25ba415dac808c626d;hpb=38876d31f2283eaf71f4c8acab4b2dad538019ef;p=cascardo%2Fovs.git diff --git a/lib/ofpbuf.h b/lib/ofpbuf.h index b30cbdb2c..dd72cde02 100644 --- a/lib/ofpbuf.h +++ b/lib/ofpbuf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2015, 2016 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -64,7 +64,26 @@ struct ofpbuf { enum ofpbuf_source source; /* Source of memory allocated as 'base'. */ }; -void ofpbuf_use(struct ofpbuf *, void *, size_t); +/* An initializer for a struct ofpbuf that will be initially empty and + * uses the space in STUB (which should be an array) as a stub. + * + * Usage example: + * + * uint64_t stub[1024 / 8]; // 1 kB stub properly aligned for 64-bit data. + * struct ofpbuf ofpbuf = OFPBUF_STUB_INITIALIZER(stub); + */ +#define OFPBUF_STUB_INITIALIZER(STUB) { \ + .base = (STUB), \ + .data = (STUB), \ + .size = 0, \ + .allocated = sizeof (STUB), \ + .header = NULL, \ + .msg = NULL, \ + .list_node = OVS_LIST_POISON, \ + .source = OFPBUF_STUB, \ + } + +void ofpbuf_use_ds(struct ofpbuf *, const struct ds *); void ofpbuf_use_stack(struct ofpbuf *, void *, size_t); void ofpbuf_use_stub(struct ofpbuf *, void *, size_t); void ofpbuf_use_const(struct ofpbuf *, const void *, size_t); @@ -101,6 +120,7 @@ void *ofpbuf_push(struct ofpbuf *b, const void *, size_t); static inline size_t ofpbuf_headroom(const struct ofpbuf *); static inline size_t ofpbuf_tailroom(const struct ofpbuf *); +static inline size_t ofpbuf_msgsize(const struct ofpbuf *); void ofpbuf_prealloc_headroom(struct ofpbuf *, size_t); void ofpbuf_prealloc_tailroom(struct ofpbuf *, size_t); void ofpbuf_trim(struct ofpbuf *); @@ -174,6 +194,22 @@ static inline size_t ofpbuf_tailroom(const struct ofpbuf *b) return (char*)ofpbuf_end(b) - (char*)ofpbuf_tail(b); } +/* Returns the number of bytes from 'b->header' to 'b->msg', that is, the + * length of 'b''s header. */ +static inline size_t +ofpbuf_headersize(const struct ofpbuf *b) +{ + return (char *)b->msg - (char *)b->header; +} + +/* Returns the number of bytes from 'b->msg' to 'b->data + b->size', that is, + * the length of the used space in 'b' starting from 'msg'. */ +static inline size_t +ofpbuf_msgsize(const struct ofpbuf *b) +{ + return (char *)ofpbuf_tail(b) - (char *)b->msg; +} + /* Clears any data from 'b'. */ static inline void ofpbuf_clear(struct ofpbuf *b) {