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