/*
- * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2015 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.
enum ofpbuf_source source; /* Source of memory allocated as 'base'. */
};
-/* 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.
+/* 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. This is the initializer
+ * form of ofpbuf_use_stub().
*
* Usage example:
*
.source = OFPBUF_STUB, \
}
-void ofpbuf_use(struct ofpbuf *, void *, size_t);
+/* An initializer for a struct ofpbuf whose data starts at DATA and continues
+ * for SIZE bytes. This is appropriate for an ofpbuf that will be used to
+ * inspect existing data, without moving it around or reallocating it, and
+ * generally without modifying it at all. This is the initializer form of
+ * ofpbuf_use_const().
+ */
+static inline struct ofpbuf
+ofpbuf_const_initializer(const void *data, size_t size)
+{
+ return (struct ofpbuf) {
+ .base = CONST_CAST(void *, data),
+ .data = CONST_CAST(void *, data),
+ .size = size,
+ .allocated = size,
+ .header = NULL,
+ .msg = NULL,
+ .list_node = OVS_LIST_POISON,
+ .source = OFPBUF_STACK,
+ };
+}
+
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);
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 *);
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)
{