18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Dynamic data buffer 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2007-2009, 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 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Internal data structure for wpabuf. Please do not touch this directly from 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * elsewhere. This is only defined in header file to allow inline functions 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * from this file to access data. 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf { 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t size; /* total size of the allocated buffer */ 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t used; /* length of data in the buffer */ 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ext_data; /* pointer to external data; NULL if data follows 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * struct wpabuf */ 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* optionally followed by the allocated buffer */ 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpabuf_resize(struct wpabuf **buf, size_t add_len); 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * wpabuf_alloc(size_t len); 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * wpabuf_alloc_ext_data(u8 *data, size_t len); 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * wpabuf_alloc_copy(const void *data, size_t len); 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * wpabuf_dup(const struct wpabuf *src); 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpabuf_free(struct wpabuf *buf); 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid * wpabuf_put(struct wpabuf *buf, size_t len); 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * wpabuf_concat(struct wpabuf *a, struct wpabuf *b); 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * wpabuf_zeropad(struct wpabuf *buf, size_t len); 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpabuf_printf(struct wpabuf *buf, char *fmt, ...) PRINTF_FORMAT(2, 3); 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_size - Get the currently allocated size of a wpabuf buffer 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Currently allocated size of the buffer 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline size_t wpabuf_size(const struct wpabuf *buf) 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return buf->size; 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_len - Get the current length of a wpabuf buffer data 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Currently used length of the buffer 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline size_t wpabuf_len(const struct wpabuf *buf) 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return buf->used; 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_tailroom - Get size of available tail room in the end of the buffer 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Tail room (in bytes) of available space in the end of the buffer 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline size_t wpabuf_tailroom(const struct wpabuf *buf) 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return buf->size - buf->used; 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_head - Get pointer to the head of the buffer data 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the head of the buffer data 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline const void * wpabuf_head(const struct wpabuf *buf) 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf->ext_data) 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return buf->ext_data; 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return buf + 1; 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline const u8 * wpabuf_head_u8(const struct wpabuf *buf) 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpabuf_head(buf); 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_mhead - Get modifiable pointer to the head of the buffer data 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the head of the buffer data 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void * wpabuf_mhead(struct wpabuf *buf) 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf->ext_data) 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return buf->ext_data; 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return buf + 1; 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline u8 * wpabuf_mhead_u8(struct wpabuf *buf) 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpabuf_mhead(buf); 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_u8(struct wpabuf *buf, u8 data) 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *pos = wpabuf_put(buf, 1); 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = data; 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_le16(struct wpabuf *buf, u16 data) 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *pos = wpabuf_put(buf, 2); 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_PUT_LE16(pos, data); 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_le32(struct wpabuf *buf, u32 data) 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *pos = wpabuf_put(buf, 4); 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_PUT_LE32(pos, data); 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_be16(struct wpabuf *buf, u16 data) 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *pos = wpabuf_put(buf, 2); 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_PUT_BE16(pos, data); 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_be24(struct wpabuf *buf, u32 data) 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *pos = wpabuf_put(buf, 3); 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_PUT_BE24(pos, data); 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_be32(struct wpabuf *buf, u32 data) 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *pos = wpabuf_put(buf, 4); 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_PUT_BE32(pos, data); 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_data(struct wpabuf *buf, const void *data, 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len) 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (data) 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(wpabuf_put(buf, len), data, len); 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_buf(struct wpabuf *dst, 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpabuf *src) 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_data(dst, wpabuf_head(src), wpabuf_len(src)); 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_set(struct wpabuf *buf, const void *data, size_t len) 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf->ext_data = (u8 *) 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