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);
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_size - Get the currently allocated size of a wpabuf buffer
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Currently allocated size of the buffer
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline size_t wpabuf_size(const struct wpabuf *buf)
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return buf->size;
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_len - Get the current length of a wpabuf buffer data
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Currently used length of the buffer
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline size_t wpabuf_len(const struct wpabuf *buf)
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return buf->used;
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_tailroom - Get size of available tail room in the end of the buffer
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Tail room (in bytes) of available space in the end of the buffer
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline size_t wpabuf_tailroom(const struct wpabuf *buf)
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return buf->size - buf->used;
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_head - Get pointer to the head of the buffer data
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the head of the buffer data
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline const void * wpabuf_head(const struct wpabuf *buf)
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return buf->buf;
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline const u8 * wpabuf_head_u8(const struct wpabuf *buf)
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpabuf_head(buf);
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpabuf_mhead - Get modifiable pointer to the head of the buffer data
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: wpabuf buffer
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the head of the buffer data
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void * wpabuf_mhead(struct wpabuf *buf)
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return buf->buf;
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{
15361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	buf->buf = (u8 *) data;
15461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	buf->flags = WPABUF_FLAG_EXT_DATA;
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf->size = buf->used = len;
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpabuf_put_str(struct wpabuf *dst, const char *str)
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpabuf_put_data(dst, str, os_strlen(str));
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* WPABUF_H */
164