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); 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid * wpabuf_put(struct wpabuf *buf, size_t len); 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * wpabuf_concat(struct wpabuf *a, struct wpabuf *b); 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * wpabuf_zeropad(struct wpabuf *buf, size_t len); 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpabuf_printf(struct wpabuf *buf, char *fmt, ...) PRINTF_FORMAT(2, 3); 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_size - Get the currently allocated size of a wpabuf buffer 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Currently allocated size of the buffer 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline size_t wpabuf_size(const struct wpabuf *buf) 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return buf->size; 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_len - Get the current length of a wpabuf buffer data 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Currently used length of the buffer 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline size_t wpabuf_len(const struct wpabuf *buf) 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return buf->used; 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_tailroom - Get size of available tail room in the end of the buffer 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Tail room (in bytes) of available space in the end of the buffer 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline size_t wpabuf_tailroom(const struct wpabuf *buf) 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return buf->size - buf->used; 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_head - Get pointer to the head of the buffer data 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the head of the buffer data 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline const void * wpabuf_head(const struct wpabuf *buf) 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return buf->buf; 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline const u8 * wpabuf_head_u8(const struct wpabuf *buf) 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpabuf_head(buf); 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_mhead - Get modifiable pointer to the head of the buffer data 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the head of the buffer data 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void * wpabuf_mhead(struct wpabuf *buf) 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return buf->buf; 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline u8 * wpabuf_mhead_u8(struct wpabuf *buf) 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpabuf_mhead(buf); 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_u8(struct wpabuf *buf, u8 data) 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *pos = wpabuf_put(buf, 1); 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = data; 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_le16(struct wpabuf *buf, u16 data) 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *pos = wpabuf_put(buf, 2); 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_PUT_LE16(pos, data); 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_le32(struct wpabuf *buf, u32 data) 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *pos = wpabuf_put(buf, 4); 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_PUT_LE32(pos, data); 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_be16(struct wpabuf *buf, u16 data) 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *pos = wpabuf_put(buf, 2); 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_PUT_BE16(pos, data); 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_be24(struct wpabuf *buf, u32 data) 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *pos = wpabuf_put(buf, 3); 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_PUT_BE24(pos, data); 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_be32(struct wpabuf *buf, u32 data) 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *pos = wpabuf_put(buf, 4); 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_PUT_BE32(pos, data); 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_data(struct wpabuf *buf, const void *data, 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len) 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (data) 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(wpabuf_put(buf, len), data, len); 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_buf(struct wpabuf *dst, 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpabuf *src) 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_data(dst, wpabuf_head(src), wpabuf_len(src)); 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_set(struct wpabuf *buf, const void *data, size_t len) 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt buf->buf = (u8 *) data; 15361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt buf->flags = WPABUF_FLAG_EXT_DATA; 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf->size = buf->used = len; 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_str(struct wpabuf *dst, const char *str) 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_data(dst, str, os_strlen(str)); 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* WPABUF_H */ 163