5d435ab10ebc883085c8ad8c572b7786bf525128
[mech_eap.git] / src / utils / wpabuf.h
1 /*
2  * Dynamic data buffer
3  * Copyright (c) 2007, Jouni Malinen <j@w1.fi>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  *
9  * Alternatively, this software may be distributed under the terms of BSD
10  * license.
11  *
12  * See README and COPYING for more details.
13  */
14
15 #ifndef WPABUF_H
16 #define WPABUF_H
17
18 /*
19  * Internal data structure for wpabuf. Please do not touch this directly from
20  * elsewhere. This is only defined in header file to allow inline functions
21  * from this file to access data.
22  */
23 struct wpabuf {
24         size_t size; /* total size of the allocated buffer */
25         size_t used; /* length of data in the buffer */
26         u8 *ext_data; /* pointer to external data; NULL if data follows
27                        * struct wpabuf */
28         /* optionally followed by the allocated buffer */
29 };
30
31
32 int wpabuf_resize(struct wpabuf **buf, size_t add_len);
33 struct wpabuf * wpabuf_alloc(size_t len);
34 struct wpabuf * wpabuf_alloc_ext_data(u8 *data, size_t len);
35 struct wpabuf * wpabuf_alloc_copy(const void *data, size_t len);
36 struct wpabuf * wpabuf_dup(const struct wpabuf *src);
37 void wpabuf_free(struct wpabuf *buf);
38 void * wpabuf_put(struct wpabuf *buf, size_t len);
39 struct wpabuf * wpabuf_concat(struct wpabuf *a, struct wpabuf *b);
40 struct wpabuf * wpabuf_zeropad(struct wpabuf *buf, size_t len);
41
42
43 /**
44  * wpabuf_size - Get the currently allocated size of a wpabuf buffer
45  * @buf: wpabuf buffer
46  * Returns: Currently allocated size of the buffer
47  */
48 static inline size_t wpabuf_size(const struct wpabuf *buf)
49 {
50         return buf->size;
51 }
52
53 /**
54  * wpabuf_len - Get the current length of a wpabuf buffer data
55  * @buf: wpabuf buffer
56  * Returns: Currently used length of the buffer
57  */
58 static inline size_t wpabuf_len(const struct wpabuf *buf)
59 {
60         return buf->used;
61 }
62
63 /**
64  * wpabuf_tailroom - Get size of available tail room in the end of the buffer
65  * @buf: wpabuf buffer
66  * Returns: Tail room (in bytes) of available space in the end of the buffer
67  */
68 static inline size_t wpabuf_tailroom(const struct wpabuf *buf)
69 {
70         return buf->size - buf->used;
71 }
72
73 /**
74  * wpabuf_head - Get pointer to the head of the buffer data
75  * @buf: wpabuf buffer
76  * Returns: Pointer to the head of the buffer data
77  */
78 static inline const void * wpabuf_head(const struct wpabuf *buf)
79 {
80         if (buf->ext_data)
81                 return buf->ext_data;
82         return buf + 1;
83 }
84
85 static inline const u8 * wpabuf_head_u8(const struct wpabuf *buf)
86 {
87         return wpabuf_head(buf);
88 }
89
90 /**
91  * wpabuf_mhead - Get modifiable pointer to the head of the buffer data
92  * @buf: wpabuf buffer
93  * Returns: Pointer to the head of the buffer data
94  */
95 static inline void * wpabuf_mhead(struct wpabuf *buf)
96 {
97         if (buf->ext_data)
98                 return buf->ext_data;
99         return buf + 1;
100 }
101
102 static inline u8 * wpabuf_mhead_u8(struct wpabuf *buf)
103 {
104         return wpabuf_mhead(buf);
105 }
106
107 static inline void wpabuf_put_u8(struct wpabuf *buf, u8 data)
108 {
109         u8 *pos = wpabuf_put(buf, 1);
110         *pos = data;
111 }
112
113 static inline void wpabuf_put_be16(struct wpabuf *buf, u16 data)
114 {
115         u8 *pos = wpabuf_put(buf, 2);
116         WPA_PUT_BE16(pos, data);
117 }
118
119 static inline void wpabuf_put_be24(struct wpabuf *buf, u32 data)
120 {
121         u8 *pos = wpabuf_put(buf, 3);
122         WPA_PUT_BE24(pos, data);
123 }
124
125 static inline void wpabuf_put_be32(struct wpabuf *buf, u32 data)
126 {
127         u8 *pos = wpabuf_put(buf, 4);
128         WPA_PUT_BE32(pos, data);
129 }
130
131 static inline void wpabuf_put_data(struct wpabuf *buf, const void *data,
132                                    size_t len)
133 {
134         if (data)
135                 os_memcpy(wpabuf_put(buf, len), data, len);
136 }
137
138 static inline void wpabuf_put_buf(struct wpabuf *dst,
139                                   const struct wpabuf *src)
140 {
141         wpabuf_put_data(dst, wpabuf_head(src), wpabuf_len(src));
142 }
143
144 static inline void wpabuf_set(struct wpabuf *buf, const void *data, size_t len)
145 {
146         buf->ext_data = (u8 *) data;
147         buf->size = buf->used = len;
148 }
149
150 #endif /* WPABUF_H */