18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Dynamic data buffer 361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Copyright (c) 2007-2012, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license. 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details. 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef WPABUF_H 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define WPABUF_H 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/* wpabuf::buf is a pointer to external data */ 1361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#define WPABUF_FLAG_EXT_DATA BIT(0) 1461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Internal data structure for wpabuf. Please do not touch this directly from 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * elsewhere. This is only defined in header file to allow inline functions 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * from this file to access data. 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf { 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t size; /* total size of the allocated buffer */ 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t used; /* length of data in the buffer */ 2361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt u8 *buf; /* pointer to the head of the buffer */ 2461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt unsigned int flags; 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* optionally followed by the allocated buffer */ 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpabuf_resize(struct wpabuf **buf, size_t add_len); 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * wpabuf_alloc(size_t len); 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * wpabuf_alloc_ext_data(u8 *data, size_t len); 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * wpabuf_alloc_copy(const void *data, size_t len); 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * wpabuf_dup(const struct wpabuf *src); 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpabuf_free(struct wpabuf *buf); 35746bde5f922dfd627d25111da4313395bc4ed6afDmitry Shmidtvoid wpabuf_clear_free(struct wpabuf *buf); 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid * wpabuf_put(struct wpabuf *buf, size_t len); 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * wpabuf_concat(struct wpabuf *a, struct wpabuf *b); 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * wpabuf_zeropad(struct wpabuf *buf, size_t len); 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpabuf_printf(struct wpabuf *buf, char *fmt, ...) PRINTF_FORMAT(2, 3); 40849734c8d1847920ed7042463f7480b1e0c1dfeaDmitry Shmidtstruct wpabuf * wpabuf_parse_bin(const char *buf); 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_size - Get the currently allocated size of a wpabuf buffer 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Currently allocated size of the buffer 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline size_t wpabuf_size(const struct wpabuf *buf) 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return buf->size; 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_len - Get the current length of a wpabuf buffer data 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Currently used length of the buffer 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline size_t wpabuf_len(const struct wpabuf *buf) 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return buf->used; 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_tailroom - Get size of available tail room in the end of the buffer 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Tail room (in bytes) of available space in the end of the buffer 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline size_t wpabuf_tailroom(const struct wpabuf *buf) 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return buf->size - buf->used; 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_head - Get pointer to the head of the buffer data 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the head of the buffer data 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline const void * wpabuf_head(const struct wpabuf *buf) 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return buf->buf; 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline const u8 * wpabuf_head_u8(const struct wpabuf *buf) 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 85b97e428f8acf1ecb93f38f8d0063d2f2fd0bc36eDmitry Shmidt return (const u8 *) wpabuf_head(buf); 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_mhead - Get modifiable pointer to the head of the buffer data 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the head of the buffer data 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void * wpabuf_mhead(struct wpabuf *buf) 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return buf->buf; 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline u8 * wpabuf_mhead_u8(struct wpabuf *buf) 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 100b97e428f8acf1ecb93f38f8d0063d2f2fd0bc36eDmitry Shmidt return (u8 *) wpabuf_mhead(buf); 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_u8(struct wpabuf *buf, u8 data) 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 105b97e428f8acf1ecb93f38f8d0063d2f2fd0bc36eDmitry Shmidt u8 *pos = (u8 *) wpabuf_put(buf, 1); 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = data; 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_le16(struct wpabuf *buf, u16 data) 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 111b97e428f8acf1ecb93f38f8d0063d2f2fd0bc36eDmitry Shmidt u8 *pos = (u8 *) wpabuf_put(buf, 2); 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_PUT_LE16(pos, data); 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_le32(struct wpabuf *buf, u32 data) 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 117b97e428f8acf1ecb93f38f8d0063d2f2fd0bc36eDmitry Shmidt u8 *pos = (u8 *) wpabuf_put(buf, 4); 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_PUT_LE32(pos, data); 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_be16(struct wpabuf *buf, u16 data) 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 123b97e428f8acf1ecb93f38f8d0063d2f2fd0bc36eDmitry Shmidt u8 *pos = (u8 *) wpabuf_put(buf, 2); 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_PUT_BE16(pos, data); 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_be24(struct wpabuf *buf, u32 data) 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 129b97e428f8acf1ecb93f38f8d0063d2f2fd0bc36eDmitry Shmidt u8 *pos = (u8 *) wpabuf_put(buf, 3); 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_PUT_BE24(pos, data); 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_be32(struct wpabuf *buf, u32 data) 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 135b97e428f8acf1ecb93f38f8d0063d2f2fd0bc36eDmitry Shmidt u8 *pos = (u8 *) wpabuf_put(buf, 4); 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_PUT_BE32(pos, data); 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_data(struct wpabuf *buf, const void *data, 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len) 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (data) 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(wpabuf_put(buf, len), data, len); 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_buf(struct wpabuf *dst, 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpabuf *src) 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_data(dst, wpabuf_head(src), wpabuf_len(src)); 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_set(struct wpabuf *buf, const void *data, size_t len) 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt buf->buf = (u8 *) data; 15561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt buf->flags = WPABUF_FLAG_EXT_DATA; 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf->size = buf->used = len; 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_str(struct wpabuf *dst, const char *str) 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_data(dst, str, os_strlen(str)); 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* WPABUF_H */ 165