18dbcf02cSchristos /* 28dbcf02cSchristos * Dynamic data buffer 3e604d861Schristos * Copyright (c) 2007-2012, Jouni Malinen <j@w1.fi> 48dbcf02cSchristos * 5e604d861Schristos * This software may be distributed under the terms of the BSD license. 6e604d861Schristos * See README for more details. 78dbcf02cSchristos */ 88dbcf02cSchristos 98dbcf02cSchristos #ifndef WPABUF_H 108dbcf02cSchristos #define WPABUF_H 118dbcf02cSchristos 12e604d861Schristos /* wpabuf::buf is a pointer to external data */ 13e604d861Schristos #define WPABUF_FLAG_EXT_DATA BIT(0) 14e604d861Schristos 158dbcf02cSchristos /* 168dbcf02cSchristos * Internal data structure for wpabuf. Please do not touch this directly from 178dbcf02cSchristos * elsewhere. This is only defined in header file to allow inline functions 188dbcf02cSchristos * from this file to access data. 198dbcf02cSchristos */ 208dbcf02cSchristos struct wpabuf { 218dbcf02cSchristos size_t size; /* total size of the allocated buffer */ 228dbcf02cSchristos size_t used; /* length of data in the buffer */ 23e604d861Schristos u8 *buf; /* pointer to the head of the buffer */ 24e604d861Schristos unsigned int flags; 258dbcf02cSchristos /* optionally followed by the allocated buffer */ 268dbcf02cSchristos }; 278dbcf02cSchristos 288dbcf02cSchristos 298dbcf02cSchristos int wpabuf_resize(struct wpabuf **buf, size_t add_len); 308dbcf02cSchristos struct wpabuf * wpabuf_alloc(size_t len); 318dbcf02cSchristos struct wpabuf * wpabuf_alloc_ext_data(u8 *data, size_t len); 328dbcf02cSchristos struct wpabuf * wpabuf_alloc_copy(const void *data, size_t len); 338dbcf02cSchristos struct wpabuf * wpabuf_dup(const struct wpabuf *src); 348dbcf02cSchristos void wpabuf_free(struct wpabuf *buf); 35bb610346Schristos void wpabuf_clear_free(struct wpabuf *buf); 368dbcf02cSchristos void * wpabuf_put(struct wpabuf *buf, size_t len); 378dbcf02cSchristos struct wpabuf * wpabuf_concat(struct wpabuf *a, struct wpabuf *b); 388dbcf02cSchristos struct wpabuf * wpabuf_zeropad(struct wpabuf *buf, size_t len); 398dbcf02cSchristos void wpabuf_printf(struct wpabuf *buf, char *fmt, ...) PRINTF_FORMAT(2, 3); 4036ebd06eSchristos struct wpabuf * wpabuf_parse_bin(const char *buf); 418dbcf02cSchristos 428dbcf02cSchristos 438dbcf02cSchristos /** 448dbcf02cSchristos * wpabuf_size - Get the currently allocated size of a wpabuf buffer 458dbcf02cSchristos * @buf: wpabuf buffer 468dbcf02cSchristos * Returns: Currently allocated size of the buffer 478dbcf02cSchristos */ 488dbcf02cSchristos static inline size_t wpabuf_size(const struct wpabuf *buf) 498dbcf02cSchristos { 508dbcf02cSchristos return buf->size; 518dbcf02cSchristos } 528dbcf02cSchristos 538dbcf02cSchristos /** 548dbcf02cSchristos * wpabuf_len - Get the current length of a wpabuf buffer data 558dbcf02cSchristos * @buf: wpabuf buffer 568dbcf02cSchristos * Returns: Currently used length of the buffer 578dbcf02cSchristos */ 588dbcf02cSchristos static inline size_t wpabuf_len(const struct wpabuf *buf) 598dbcf02cSchristos { 608dbcf02cSchristos return buf->used; 618dbcf02cSchristos } 628dbcf02cSchristos 638dbcf02cSchristos /** 648dbcf02cSchristos * wpabuf_tailroom - Get size of available tail room in the end of the buffer 658dbcf02cSchristos * @buf: wpabuf buffer 668dbcf02cSchristos * Returns: Tail room (in bytes) of available space in the end of the buffer 678dbcf02cSchristos */ 688dbcf02cSchristos static inline size_t wpabuf_tailroom(const struct wpabuf *buf) 698dbcf02cSchristos { 708dbcf02cSchristos return buf->size - buf->used; 718dbcf02cSchristos } 728dbcf02cSchristos 738dbcf02cSchristos /** 74*bb618362Schristos * wpabuf_cmp - Check if two buffers contain the same data 75*bb618362Schristos * @a: wpabuf buffer 76*bb618362Schristos * @b: wpabuf buffer 77*bb618362Schristos * Returns: 0 if the two buffers contain the same data and non-zero otherwise 78*bb618362Schristos */ 79*bb618362Schristos static inline int wpabuf_cmp(const struct wpabuf *a, const struct wpabuf *b) 80*bb618362Schristos { 81*bb618362Schristos if (!a && !b) 82*bb618362Schristos return 0; 83*bb618362Schristos if (a && b && wpabuf_size(a) == wpabuf_size(b)) 84*bb618362Schristos return os_memcmp(a->buf, b->buf, wpabuf_size(a)); 85*bb618362Schristos return -1; 86*bb618362Schristos } 87*bb618362Schristos 88*bb618362Schristos /** 898dbcf02cSchristos * wpabuf_head - Get pointer to the head of the buffer data 908dbcf02cSchristos * @buf: wpabuf buffer 918dbcf02cSchristos * Returns: Pointer to the head of the buffer data 928dbcf02cSchristos */ 938dbcf02cSchristos static inline const void * wpabuf_head(const struct wpabuf *buf) 948dbcf02cSchristos { 95e604d861Schristos return buf->buf; 968dbcf02cSchristos } 978dbcf02cSchristos 988dbcf02cSchristos static inline const u8 * wpabuf_head_u8(const struct wpabuf *buf) 998dbcf02cSchristos { 10036ebd06eSchristos return (const u8 *) wpabuf_head(buf); 1018dbcf02cSchristos } 1028dbcf02cSchristos 1038dbcf02cSchristos /** 1048dbcf02cSchristos * wpabuf_mhead - Get modifiable pointer to the head of the buffer data 1058dbcf02cSchristos * @buf: wpabuf buffer 1068dbcf02cSchristos * Returns: Pointer to the head of the buffer data 1078dbcf02cSchristos */ 1088dbcf02cSchristos static inline void * wpabuf_mhead(struct wpabuf *buf) 1098dbcf02cSchristos { 110e604d861Schristos return buf->buf; 1118dbcf02cSchristos } 1128dbcf02cSchristos 1138dbcf02cSchristos static inline u8 * wpabuf_mhead_u8(struct wpabuf *buf) 1148dbcf02cSchristos { 11536ebd06eSchristos return (u8 *) wpabuf_mhead(buf); 1168dbcf02cSchristos } 1178dbcf02cSchristos 1188dbcf02cSchristos static inline void wpabuf_put_u8(struct wpabuf *buf, u8 data) 1198dbcf02cSchristos { 12036ebd06eSchristos u8 *pos = (u8 *) wpabuf_put(buf, 1); 1218dbcf02cSchristos *pos = data; 1228dbcf02cSchristos } 1238dbcf02cSchristos 1248dbcf02cSchristos static inline void wpabuf_put_le16(struct wpabuf *buf, u16 data) 1258dbcf02cSchristos { 12636ebd06eSchristos u8 *pos = (u8 *) wpabuf_put(buf, 2); 1278dbcf02cSchristos WPA_PUT_LE16(pos, data); 1288dbcf02cSchristos } 1298dbcf02cSchristos 130*bb618362Schristos static inline void wpabuf_put_le24(struct wpabuf *buf, u32 data) 131*bb618362Schristos { 132*bb618362Schristos u8 *pos = (u8 *) wpabuf_put(buf, 3); 133*bb618362Schristos WPA_PUT_LE24(pos, data); 134*bb618362Schristos } 135*bb618362Schristos 136111b9fd8Schristos static inline void wpabuf_put_le32(struct wpabuf *buf, u32 data) 137111b9fd8Schristos { 13836ebd06eSchristos u8 *pos = (u8 *) wpabuf_put(buf, 4); 139111b9fd8Schristos WPA_PUT_LE32(pos, data); 140111b9fd8Schristos } 141111b9fd8Schristos 142*bb618362Schristos static inline void wpabuf_put_le64(struct wpabuf *buf, u64 data) 143*bb618362Schristos { 144*bb618362Schristos u8 *pos = (u8 *) wpabuf_put(buf, 8); 145*bb618362Schristos WPA_PUT_LE64(pos, data); 146*bb618362Schristos } 147*bb618362Schristos 1488dbcf02cSchristos static inline void wpabuf_put_be16(struct wpabuf *buf, u16 data) 1498dbcf02cSchristos { 15036ebd06eSchristos u8 *pos = (u8 *) wpabuf_put(buf, 2); 1518dbcf02cSchristos WPA_PUT_BE16(pos, data); 1528dbcf02cSchristos } 1538dbcf02cSchristos 1548dbcf02cSchristos static inline void wpabuf_put_be24(struct wpabuf *buf, u32 data) 1558dbcf02cSchristos { 15636ebd06eSchristos u8 *pos = (u8 *) wpabuf_put(buf, 3); 1578dbcf02cSchristos WPA_PUT_BE24(pos, data); 1588dbcf02cSchristos } 1598dbcf02cSchristos 1608dbcf02cSchristos static inline void wpabuf_put_be32(struct wpabuf *buf, u32 data) 1618dbcf02cSchristos { 16236ebd06eSchristos u8 *pos = (u8 *) wpabuf_put(buf, 4); 1638dbcf02cSchristos WPA_PUT_BE32(pos, data); 1648dbcf02cSchristos } 1658dbcf02cSchristos 166*bb618362Schristos static inline void wpabuf_put_be64(struct wpabuf *buf, u64 data) 167*bb618362Schristos { 168*bb618362Schristos u8 *pos = (u8 *) wpabuf_put(buf, 8); 169*bb618362Schristos WPA_PUT_BE64(pos, data); 170*bb618362Schristos } 171*bb618362Schristos 1728dbcf02cSchristos static inline void wpabuf_put_data(struct wpabuf *buf, const void *data, 1738dbcf02cSchristos size_t len) 1748dbcf02cSchristos { 1758dbcf02cSchristos if (data) 1768dbcf02cSchristos os_memcpy(wpabuf_put(buf, len), data, len); 1778dbcf02cSchristos } 1788dbcf02cSchristos 1798dbcf02cSchristos static inline void wpabuf_put_buf(struct wpabuf *dst, 1808dbcf02cSchristos const struct wpabuf *src) 1818dbcf02cSchristos { 1828dbcf02cSchristos wpabuf_put_data(dst, wpabuf_head(src), wpabuf_len(src)); 1838dbcf02cSchristos } 1848dbcf02cSchristos 1858dbcf02cSchristos static inline void wpabuf_set(struct wpabuf *buf, const void *data, size_t len) 1868dbcf02cSchristos { 187e604d861Schristos buf->buf = (u8 *) data; 188e604d861Schristos buf->flags = WPABUF_FLAG_EXT_DATA; 1898dbcf02cSchristos buf->size = buf->used = len; 1908dbcf02cSchristos } 1918dbcf02cSchristos 1928dbcf02cSchristos static inline void wpabuf_put_str(struct wpabuf *dst, const char *str) 1938dbcf02cSchristos { 1948dbcf02cSchristos wpabuf_put_data(dst, str, os_strlen(str)); 1958dbcf02cSchristos } 1968dbcf02cSchristos 1978dbcf02cSchristos #endif /* WPABUF_H */ 198