/*
- * 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.
* When parsing, the 'data' will move past these, as data is being
* pulled from the OpenFlow message.
*
+ * Caution: buffer manipulation of 'struct ofpbuf' must always update
+ * the 'header' and 'msg' pointers.
+ *
+ *
* Actions: When encoding OVS action lists, the 'header' is used
* as a pointer to the beginning of the current action (see ofpact_put()).
*
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);
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)
{