Merged the hostap_2.6 updates, and the Leap of Faith work, from the hostap_update...
[mech_eap.git] / libeap / src / utils / wpabuf.h
index 44c0510..0458e3f 100644 (file)
@@ -1,15 +1,9 @@
 /*
  * Dynamic data buffer
- * Copyright (c) 2007-2009, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2007-2012, Jouni Malinen <j@w1.fi>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
  */
 
 #ifndef WPABUF_H
@@ -19,6 +13,9 @@
 extern "C" {
 #endif
 
+/* wpabuf::buf is a pointer to external data */
+#define WPABUF_FLAG_EXT_DATA BIT(0)
+
 /*
  * Internal data structure for wpabuf. Please do not touch this directly from
  * elsewhere. This is only defined in header file to allow inline functions
@@ -27,8 +24,8 @@ extern "C" {
 struct wpabuf {
        size_t size; /* total size of the allocated buffer */
        size_t used; /* length of data in the buffer */
-       u8 *ext_data; /* pointer to external data; NULL if data follows
-                      * struct wpabuf */
+       u8 *buf; /* pointer to the head of the buffer */
+       unsigned int flags;
        /* optionally followed by the allocated buffer */
 };
 
@@ -39,10 +36,12 @@ struct wpabuf * wpabuf_alloc_ext_data(u8 *data, size_t len);
 struct wpabuf * wpabuf_alloc_copy(const void *data, size_t len);
 struct wpabuf * wpabuf_dup(const struct wpabuf *src);
 void wpabuf_free(struct wpabuf *buf);
+void wpabuf_clear_free(struct wpabuf *buf);
 void * wpabuf_put(struct wpabuf *buf, size_t len);
 struct wpabuf * wpabuf_concat(struct wpabuf *a, struct wpabuf *b);
 struct wpabuf * wpabuf_zeropad(struct wpabuf *buf, size_t len);
 void wpabuf_printf(struct wpabuf *buf, char *fmt, ...) PRINTF_FORMAT(2, 3);
+struct wpabuf * wpabuf_parse_bin(const char *buf);
 
 
 /**
@@ -82,14 +81,12 @@ static inline size_t wpabuf_tailroom(const struct wpabuf *buf)
  */
 static inline const void * wpabuf_head(const struct wpabuf *buf)
 {
-       if (buf->ext_data)
-               return buf->ext_data;
-       return buf + 1;
+       return buf->buf;
 }
 
 static inline const u8 * wpabuf_head_u8(const struct wpabuf *buf)
 {
-       return (const u8 *)wpabuf_head(buf);
+       return (const u8 *) wpabuf_head(buf);
 }
 
 /**
@@ -99,49 +96,47 @@ static inline const u8 * wpabuf_head_u8(const struct wpabuf *buf)
  */
 static inline void * wpabuf_mhead(struct wpabuf *buf)
 {
-       if (buf->ext_data)
-               return buf->ext_data;
-       return buf + 1;
+       return buf->buf;
 }
 
 static inline u8 * wpabuf_mhead_u8(struct wpabuf *buf)
 {
-       return (u8 *)wpabuf_mhead(buf);
+       return (u8 *) wpabuf_mhead(buf);
 }
 
 static inline void wpabuf_put_u8(struct wpabuf *buf, u8 data)
 {
-       u8 *pos = (u8 *)wpabuf_put(buf, 1);
+       u8 *pos = (u8 *) wpabuf_put(buf, 1);
        *pos = data;
 }
 
 static inline void wpabuf_put_le16(struct wpabuf *buf, u16 data)
 {
-       u8 *pos = (u8 *)wpabuf_put(buf, 2);
+       u8 *pos = (u8 *) wpabuf_put(buf, 2);
        WPA_PUT_LE16(pos, data);
 }
 
 static inline void wpabuf_put_le32(struct wpabuf *buf, u32 data)
 {
-       u8 *pos = (u8 *)wpabuf_put(buf, 4);
+       u8 *pos = (u8 *) wpabuf_put(buf, 4);
        WPA_PUT_LE32(pos, data);
 }
 
 static inline void wpabuf_put_be16(struct wpabuf *buf, u16 data)
 {
-       u8 *pos = (u8 *)wpabuf_put(buf, 2);
+       u8 *pos = (u8 *) wpabuf_put(buf, 2);
        WPA_PUT_BE16(pos, data);
 }
 
 static inline void wpabuf_put_be24(struct wpabuf *buf, u32 data)
 {
-       u8 *pos = (u8 *)wpabuf_put(buf, 3);
+       u8 *pos = (u8 *) wpabuf_put(buf, 3);
        WPA_PUT_BE24(pos, data);
 }
 
 static inline void wpabuf_put_be32(struct wpabuf *buf, u32 data)
 {
-       u8 *pos = (u8 *)wpabuf_put(buf, 4);
+       u8 *pos = (u8 *) wpabuf_put(buf, 4);
        WPA_PUT_BE32(pos, data);
 }
 
@@ -160,7 +155,8 @@ static inline void wpabuf_put_buf(struct wpabuf *dst,
 
 static inline void wpabuf_set(struct wpabuf *buf, const void *data, size_t len)
 {
-       buf->ext_data = (u8 *) data;
+       buf->buf = (u8 *) data;
+       buf->flags = WPABUF_FLAG_EXT_DATA;
        buf->size = buf->used = len;
 }