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